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_")
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()