Exemple #1
0
 def __init__(self, apipath):
     super(QkDaemon, self).__init__()
     signal.signal(signal.SIGINT, self._handle_signal)
     signal.signal(signal.SIGTERM, self._handle_signal)
     self._conn_factory = ConnFactory()
     self._api = QkDaemonAPI(apipath, self)
     self._tcp_server_thread = None
     self._tcp_server = TCPServer(TCPServer.ModeSerial)
     self._tcp_server.set_callback("handle_api", self._handle_api)
     self._api_requests_queue = Queue.Queue()
     self._api_requests_thread = threading.Thread(target=self._api_handler)
     self._api_requests_thread.setDaemon(True)
     self.use_prefix("qk_")
Exemple #2
0
class QkDaemon(pigeon.server.PigeonServer):

    def __init__(self, apipath):
        super(QkDaemon, self).__init__()
        signal.signal(signal.SIGINT, self._handle_signal)
        signal.signal(signal.SIGTERM, self._handle_signal)
        self._conn_factory = ConnFactory()
        self._api = QkDaemonAPI(apipath, self)
        self._tcp_server_thread = None
        self._tcp_server = TCPServer(TCPServer.ModeSerial)
        self._tcp_server.set_callback("handle_api", self._handle_api)
        self._api_requests_queue = Queue.Queue()
        self._api_requests_thread = threading.Thread(target=self._api_handler)
        self._api_requests_thread.setDaemon(True)
        self.use_prefix("qk_")

    def api(self):
        return self._api

    def _handle_signal(self, sig, frame):
        #TODO stop all servers
        #IOLoop.current().add_callback(IOLoop.current().stop)
        pass

    def run(self, cli=False):
        self._api_requests_thread.start()
        super(QkDaemon, self).run(cli)
        self._api_requests_thread.join()

    def _api_handler(self):
        while self._request_to_quit is False:
            req = self._api_requests_queue.get()
            req_keys = req.keys()
            if "method" in req_keys and \
               "uri" in req_keys and \
               "params" in req_keys:
                self._api.run(req["method"], req["uri"], req["params"])

    def _handle_api(self, method, uri, params={}):
        req = {
            "method": method,
            "uri": uri,
            "params": params
        }
        print("REQUEST: %s" % req)
        self._api_requests_queue.put(req)

    def _handle_packet_received_from_conn(self, pkt):
        pkt_str = json.dumps(pkt)
        self.log.debug("Send packet to clients: %s" % pkt_str)
        self._tcp_server.send_to_all(pkt_str + "\r\n")


    def find_conn(self, conn_id):
        return self._conn_factory.find(conn_id)

    def start_tcp_server(self, port):
        if self._tcp_server.is_alive():
            self.log.error("TCP server is already running")
        else:
            self._tcp_server.bind("localhost", port)

    def stop_tcp_server(self):
        if self._tcp_server.is_alive():
            self._tcp_server.close()

    def qk_test(self):
        print "THIS IS A TEST"
        self._handle_api("set", "/qk/conns/0/cmds/search")

    def qk_api(self, method, uri, params):
        self._api.run(method, uri, json.loads(params))

    def qk_add_conn(self, type, params={}):
        conn = self._conn_factory.create(type, params)
        if conn:
            conn.set_callback("packet_received", self._handle_packet_received_from_conn)
            self.log.info("Connection added: %s" % conn)
        else:
            self.log.error("Failed to add connection")
        return conn


    def qk_remove_conn(self, conn_id):
        conn = self.find_conn(conn_id)
        if conn:
            self._conn_factory.destroy(conn)
        else:
            self.log.error("Failed to find connection with id=%d" % conn_id)

    def qk_list_conn(self):
        conns = self._conn_factory.conns()
        if conns:
            for conn in conns:
                self.log.info("%s" % conn)
        else:
            self.log.info("Connections list is empty")

    def qk_quit(self):
        super(QkDaemon, self).pgn_quit()
        self._api_requests_queue.put({"dum": "my"})
        self._api_requests_thread.join()
        self.stop_tcp_server()