Example #1
0
class TestTcpServer(object):
    def __init__(self, server_addr):
        self._tcp_server = ZTcpServer(('127.0.0.1', 9876))
        self._codec = ZLengthHeadCodec(self._on_string_message)
        self._guard = Condition(Lock())
        self._connections = {}
        self._tcp_server.set_connection_callback(self._on_connection)
        self._tcp_server.set_message_callback(self._codec.on_message)
 
    def start(self):
        self._tcp_server.start()
        self._tcp_server.serve_forever()

    def set_thread_num(self, num):
        self._tcp_server.set_thread_num(num)

    def _on_connection(self, tcp_conn):
        logging.info(tcp_conn.name() + ' is ' + (tcp_conn.connected() and 'UP' or 'DOWN'))

        with self._guard:
            if tcp_conn.connected():
                self._connections[tcp_conn.name()] = tcp_conn
            else:
                self._connections.pop(tcp_conn.name())

    def _on_string_message(self, tcp_conn, message, receive_time):
        with self._guard:
            for conn_name in self._connections:
                self._codec.send(self._connections[conn_name], message)
Example #2
0
 def __init__(self, server_addr):
     self._tcp_server = ZTcpServer(('127.0.0.1', 9876))
     self._codec = ZLengthHeadCodec(self._on_string_message)
     self._guard = Condition(Lock())
     self._connections = {}
     self._tcp_server.set_connection_callback(self._on_connection)
     self._tcp_server.set_message_callback(self._codec.on_message)
Example #3
0
class Scanner(object):
    def __init__(self, event_loop, sid, server_addr):
        self._sid = sid
        self._codec = ZLengthHeadCodec(self._on_string_message)
        self._tcp_client = ZTcpClient(event_loop, server_addr)
        self._tcp_client.set_connection_callback(self._on_connection)
        self._tcp_client.set_connection_error_callback(self._on_error_connection)
        self._tcp_client.set_message_callback(self._codec.on_message)
        self._guard = Condition(Lock())
        self._connection_callback = None 
        self._connection_error_callback = None
        self._message_callback = None 

    def connect(self):
        self._tcp_client.connect()

    def disconnect(self):
        self._tcp_client.disconnect()
    
    def set_connection_callback(self, cb):
        self._connection_callback = cb

    def set_connection_error_callback(self, cb):
        self._connection_error_callback = cb

    def set_message_callback(self, cb):
        self._message_callback = cb

    def send(self, tcp_conn, msg):
        self._codec.send(tcp_conn, msg)

    def get_id(self):
        return self._sid

    def _on_connection(self, tcp_conn):
        if self._connection_callback:
            self._connection_callback(self, tcp_conn)
       
    def _on_error_connection(self, errno):
        if self._connection_error_callback:
            self._connection_error_callback(self, errno)
        else:
            logging.error('failed to connect to %s, errno=(%d)' %str(server_addr), errno)

    def _on_string_message(self, tcp_conn, message, receive_time):
        if self._message_callback:
            self._message_callback(self, tcp_conn, message, receive_time)
Example #4
0
 def __init__(self, server_addr):
     self._event_loop_thread = ZEventLoopThread()
     self._tcp_client = ZTcpClient(self._event_loop_thread.start_loop(), server_addr)
     self._codec = ZLengthHeadCodec(self._on_string_message)
     self._tcp_client.set_connection_callback(self._on_connection)
     self._tcp_client.set_message_callback(self._codec.on_message)
     self._tcp_conn = None
     self._guard = Condition(Lock())
Example #5
0
 def __init__(self, server_addr, cfg_file, scan_list_dir):
     self._cfg_parser = ConfigParser.ConfigParser()
     self._cfg_parser.read(cfg_file)
     self._construct_scan_parameters()
     self._scan_list_dir = scan_list_dir
     self._tcp_server = ZTcpServer(server_addr)
     self._codec = ZLengthHeadCodec(self._on_string_message)
     self._guard = Condition(Lock())
     self._tcp_server.set_connection_callback(self._on_connection)
     self._tcp_server.set_message_callback(self._codec.on_message)
     self._hostname = gethostname()
Example #6
0
 def __init__(self, event_loop, sid, server_addr):
     self._sid = sid
     self._codec = ZLengthHeadCodec(self._on_string_message)
     self._tcp_client = ZTcpClient(event_loop, server_addr)
     self._tcp_client.set_connection_callback(self._on_connection)
     self._tcp_client.set_connection_error_callback(self._on_error_connection)
     self._tcp_client.set_message_callback(self._codec.on_message)
     self._guard = Condition(Lock())
     self._connection_callback = None 
     self._connection_error_callback = None
     self._message_callback = None 
Example #7
0
class TestTcpClient(object):
    def __init__(self, server_addr):
        self._event_loop_thread = ZEventLoopThread()
        self._tcp_client = ZTcpClient(self._event_loop_thread.start_loop(), server_addr)
        self._codec = ZLengthHeadCodec(self._on_string_message)
        self._tcp_client.set_connection_callback(self._on_connection)
        self._tcp_client.set_message_callback(self._codec.on_message)
        self._tcp_conn = None
        self._guard = Condition(Lock())

    def connect(self):
        self._tcp_client.connect()

    def send_message_until_quit(self):
        while True:
            try:
                s = input()
                if s.find("bye") < 0:
                    self._write(s)
                else:
                    self._tcp_client.disconnect()
                    return
            except Exception as e:
                logging.error("input error %s" % (str(e)))

    def _write(self, s):
        with self._guard:
            if self._tcp_conn is not None:
                self._codec.send(self._tcp_conn, s)

    def _on_connection(self, tcp_conn):
        logging.info(tcp_conn.name() + " is " + (tcp_conn.connected() and "UP" or "DOWN"))
        with self._guard:
            if tcp_conn.connected():
                self._tcp_conn = tcp_conn
            else:
                self._tcp_conn = None

    def _on_string_message(self, tcp_conn, message, recieve_time):
        logging.info(message)
Example #8
0
class Scanner(object):
    def __init__(self, server_addr, cfg_file, scan_list_dir):
        self._cfg_parser = ConfigParser.ConfigParser()
        self._cfg_parser.read(cfg_file)
        self._construct_scan_parameters()
        self._scan_list_dir = scan_list_dir
        self._tcp_server = ZTcpServer(server_addr)
        self._codec = ZLengthHeadCodec(self._on_string_message)
        self._guard = Condition(Lock())
        self._tcp_server.set_connection_callback(self._on_connection)
        self._tcp_server.set_message_callback(self._codec.on_message)
        self._hostname = gethostname()
 
    def start(self):
        self._tcp_server.start()
        self._tcp_server.serve_forever()

    def set_thread_num(self, num):
        self._tcp_server.set_thread_num(num)

    def _on_connection(self, tcp_conn):
        logging.info('Scanner (%s) is %s' %(tcp_conn.name(), (tcp_conn.connected() and 'UP' or 'DOWN')))

    def _on_string_message(self, tcp_conn, message, receive_time):
        logging.info('receive scan job %s' %message)
        reply_msg = '%s received scan request %s'  %(self._hostname, message)
        self._codec.send(tcp_conn, reply_msg) 
        tcp_conn.shutdown() 

        root_xml = ElementTree.fromstring(message)
        assert root_xml.tag == 'job'
        if root_xml.attrib.get('name', None) == 'scan':
            self._handle_scan(root_xml.text.strip())

    def _handle_scan(self, scan_list):
        tid = current_thread().ident
        if not tid:
            randome.random(time.time())
            tid = random.randint(1, 1000000000)
        root_list_file = 'scan_list_%d_%s' %(tid, strftime('%Y%m%d-%H%M%S'))
        root_list_file = join(self._scan_list_dir, root_list_file)
        with open(root_list_file, 'w') as scan_file:
            scan_file.write(scan_list)

        scan_cmd = ['smController', '-rlist', root_list_file] + self._scan_parameters 
        logging.info('executing %s' %' '.join(scan_cmd))
        try:
            output = subprocess.Popen(scan_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
            result_msg = ''
            if output[0]:
                logging.info(output[0])
                result_msg = output[0]
    
            if output[1]:
                logging.error(output[1])
                result_msg += output[1]
        except Exception as e:
            exc_type, exc_value, exc_traceback = sys.exc_info()
            result_msg = ''.join(format_exception(exc_type, exc_value, exc_traceback))
            logging.error('Scanner._handle_scan has exception %s' %result_msg)
            #raise
    
        #self._codec.send(tcp_conn, result_msg)

    def _construct_scan_parameters(self):
        self._scan_parameters = []
        stormax_section = 'STORMAX'
        if stormax_section in self._cfg_parser.sections():
            thrd_num = self._cfg_parser.get(stormax_section, 'thread_num')
            if thrd_num:
                self._scan_parameters.extend(['-thrds', thrd_num])
            else:
                self._scan_parameters.extend(['-thrds', str(cpu_count()*4)])

            scan_cfg = self._cfg_parser.get(stormax_section, 'scan_cfg')
            if scan_cfg:
                self._scan_parameters.extend(['-scancfg', scan_cfg])

            prescan = self._cfg_parser.get(stormax_section, 'prescan')
            if prescan:
                self._scan_parameters.extend(['-prescan', prescan])

            postscan = self._cfg_parser.get(stormax_section, 'postscan')
            if postscan:
                self._scan_parameters.extend(['-postscan', postscan])

            dtldir = self._cfg_parser.get(stormax_section, 'dtldir')
            if dtldir:
                self._scan_parameters.extend(['-dtldir', dtldir])

            logdir = self._cfg_parser.get(stormax_section, 'logdir')
            if logdir:
                self._scan_parameters.extend(['-logdir', logdir])

            errdir = self._cfg_parser.get(stormax_section, 'errdir')
            if errdir:
                self._scan_parameters.extend(['-errdir', errdir])

            tmpdir = self._cfg_parser.get(stormax_section, 'tmpdir')
            if tmpdir:
                self._scan_parameters.extend(['-tmpdir', tmpdir])