#!/usr/bin/env python3
#
# Copyright 2015-2017 by Jan Vales <jan@jvales.net> (Someone <someone@somenet.org>)
# send me your changes. credit author(s). do not publish. share alike.
# to be done: find a suitable licence text.
#

import psycopg2
import psycopg2.extras
import sys
import time
import signal
import socket
import threading
import pprint
import traceback

import ictf

team = None
dbconnstring = "host=127.0.0.1 port=5432 dbname=flagbot user=flagbot password=flagbotpw"

def login(force = False):
    global team
    if force == True or team is None:
        team = ictf.iCTF().login('ctf@w0y.at','ZmtphWHFUDwRWk6m')
        print("login(): logged in.")

def getTargets():
    print("getTargets() starting...")
    try:
        login(True)
        global team

        service_list = team.get_service_list()
    #dbconn = psycopg2.connect(dbconnstring)
    #cur = dbconn.cursor()
    #cur.execute("DELETE FROM flag_ids")
    #dbconn.commit()

        for service in service_list:
            try:
                print("getTargets() getting for:"+str(service['service_name']))
                targets = team.get_targets(service['service_id'])
                print("getTargets() got "+str(len(targets['targets']))+" targets.")
                for target in targets['targets']:
                    try:
                        dbconn = psycopg2.connect(dbconnstring)
                        cur = dbconn.cursor()
                        cur.execute("INSERT INTO flag_ids (service, team, host, port, flag_id) VALUES (%s, %s, %s, %s, %s)",
                                    (service['service_name'], target['team_name'], target['hostname'], target['port'], target['flag_id']))
                        dbconn.commit()
                    except psycopg2.IntegrityError as e:
                        pass

                    except psycopg2.DatabaseError as e:
                        print('getTargets() Error %s' % e)
                        traceback.print_exc(file=sys.stdout)

            except Exception as e:
                print('getTargets() Error %s' % e)
                traceback.print_exc(file=sys.stdout)

    except Exception as e:
        print('getTargets() Error %s' % e)
        traceback.print_exc(file=sys.stdout)


    time.sleep(10.0)
    gettargetth = threading.Timer(0.5, getTargets)
    gettargetth.start()
    print("getTargets(): ended")

def main():
    print("*** starting ...")
    getTargets()

if __name__ == "__main__":
    def signal_handler(signal, frame):
        print('SIG received. exitting!')
        sys.exit(0)
    signal.signal(signal.SIGINT, signal_handler)
    main()

