class NetworkServer: def __init__(self, config): self.network = Network(config) self.network.trigger_callback = self.trigger_callback self.network.start() self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) self.daemon_port = config.get('daemon_port', DAEMON_PORT) self.socket.bind(('', self.daemon_port)) self.socket.listen(5) self.socket.settimeout(1) self.running = False # daemon terminates after period of inactivity self.timeout = config.get('daemon_timeout', 5*60) self.lock = threading.RLock() # each GUI is a client of the daemon self.clients = [] # daemon needs to know which client subscribed to which address def stop(self): with self.lock: self.running = False def add_client(self, client): for key in ['status','banner','updated','servers','interfaces']: value = self.get_status_value(key) client.queue.put({'method':'network.status', 'params':[key, value]}) with self.lock: self.clients.append(client) def remove_client(self, client): with self.lock: self.clients.remove(client) print_error("client quit:", len(self.clients)) def get_status_value(self, key): if key == 'status': value = self.network.connection_status elif key == 'banner': value = self.network.banner elif key == 'updated': value = (self.network.get_local_height(), self.network.get_server_height()) elif key == 'servers': value = self.network.get_servers() elif key == 'interfaces': value = self.network.get_interfaces() return value def trigger_callback(self, key): value = self.get_status_value(key) print_error("daemon trigger callback", key, len(self.clients)) for client in self.clients: client.queue.put({'method':'network.status', 'params':[key, value]}) def main_loop(self): self.running = True t = time.time() while self.running: try: connection, address = self.socket.accept() except socket.timeout: if not self.clients: if time.time() - t > self.timeout: print_error("Daemon timeout") break else: t = time.time() continue t = time.time() client = ClientThread(self, self.network, connection) client.start() print_error("Daemon exiting")