def lost(self, err = None): if err: log.critical("Connection to %s:%s lost: %s" % (settings.HUB_HOST, settings.HUB_PORT, err)) else: log.critical("Connection to %s:%s lost" % (settings.HUB_HOST, settings.HUB_PORT)) signals.emit('connection:lost') self.disconnect() return self.connect()
def pool(self): try: if self.socket and self.connected: self.data = self.recv() if not self.data: self.lost() return None self.data = self.data.rstrip('\n') signals.emit('connection:data_received', self, self.data) else: if self.connected or self.connected == None: log.notice("Not connected. Connecting. Autoreconnect every 5 second") self.connect() except socket.error as err: return self.lost(err) return self.data
def parse(self, conn, message): if not message: return False try: msg = json.loads(message) except ValueError: return conn.sendresp(self.reply(500, "This doesn't looks like JSON data...")) if 'action' not in msg and 'info' not in msg: return False if 'action' in msg: ret = self._exec_function(conn, msg) if ret == False: conn.sendresp(self.reply(500)) else: conn.sendresp(ret) elif 'info' in msg: # handle info in it's special way signals.emit('data:on_info', conn.remote_addr(), msg['info'])
def connect(self): try: if self.connected == False: sleep(1) ConnectionSocket.__init__(self) self.socket.connect((self.host, self.port)) self.connected = True log.info("Connected to %s:%s" % (self.host, self.port)) signals.emit('connection:connected', self) except socket.error as err: if self.connected == False: log.critical("Can't connect to %s:%s: %s" % (self.host, self.port, err[1])) elif self.connected or self.connected == None: log.critical("Can't connect to %s:%s: %s" % (self.host, self.port, err[1])) self.connected = False return self.connected
def parse(self, conn, message): if not message: return False try: msg = json.loads(message) except ValueError: return conn.sendresp( self.reply(500, "This doesn't looks like JSON data...")) if 'action' not in msg and 'info' not in msg: return False if 'action' in msg: ret = self._exec_function(conn, msg) if ret == False: conn.sendresp(self.reply(500)) else: conn.sendresp(ret) elif 'info' in msg: # handle info in it's special way signals.emit('data:on_info', conn.remote_addr(), msg['info'])
def disconnect(self): self.connected = False self.close() signals.emit('connection:disconnected', False)
def pool(self): readable, writable, exception = select.select( self.connection_inputs, self.connection_outputs, self.connection_inputs, ) for s in readable: if s is self.socket: """Incoming connection""" new_connection, new_address = s.accept() address = "%s:%s" % new_address log.info("Client %s connected" % (address)) s.setblocking(False) self.connection_inputs.append(new_connection) self.connections[address] = ConnectionSocket( use_socket=new_connection) self.message_queues[new_connection] = Queue.Queue() signals.emit('connection:connected', self.connections[address]) else: """Current connection""" try: address = "%s:%s" % s.getpeername() except socket.error: try: self.connection_outputs.remove(s) except ValueError: pass data = self.connections[address].recv() if data: self.message_queues[s].put(data) if s not in self.connection_outputs: self.connection_outputs.append(s) signals.emit('connection:data_received', self.connections[address], data) else: log.info("Client %s disconnected" % address) signals.emit('connection:disconnected', address) if s in self.connection_outputs: self.connection_outputs.remove(s) writable.remove(s) self.connection_inputs.remove( self.connections[address].socket) self.connections[address].socket.close() del self.message_queues[s] del self.connections[address] for s in writable: try: next_msg = self.message_queues[s].get_nowait() except Queue.Empty: address = "%s:%s" % s.getpeername() self.connection_outputs.remove(s) else: try: address = "%s:%s" % s.getpeername() except socket.error: self.connection_outputs.remove(s) for s in exception: address = "%s:%s" % connection.socket.getpeername() log.critical("Handling exceptional condition for %s!" % address) self.connection_inputs.remove(s) if s in self.connection_outputs: self.connection_outputs.remove(s) self.connections[address].socket.close() del self.connections[address] return True
def pool(self): readable, writable, exception = select.select( self.connection_inputs, self.connection_outputs, self.connection_inputs, ) for s in readable: if s is self.socket: """Incoming connection""" new_connection, new_address = s.accept() address = "%s:%s" % new_address log.info("Client %s connected" % (address)) s.setblocking(False) self.connection_inputs.append(new_connection) self.connections[address] = ConnectionSocket(use_socket=new_connection) self.message_queues[new_connection] = Queue.Queue() signals.emit('connection:connected', self.connections[address]) else: """Current connection""" try: address = "%s:%s" % s.getpeername() except socket.error: try: self.connection_outputs.remove(s) except ValueError: pass data = self.connections[address].recv() if data: self.message_queues[s].put(data) if s not in self.connection_outputs: self.connection_outputs.append(s) signals.emit('connection:data_received', self.connections[address], data) else: log.info("Client %s disconnected" % address) signals.emit('connection:disconnected', address) if s in self.connection_outputs: self.connection_outputs.remove(s) writable.remove(s) self.connection_inputs.remove(self.connections[address].socket) self.connections[address].socket.close() del self.message_queues[s] del self.connections[address] for s in writable: try: next_msg = self.message_queues[s].get_nowait() except Queue.Empty: address = "%s:%s" % s.getpeername() self.connection_outputs.remove(s) else: try: address = "%s:%s" % s.getpeername() except socket.error: self.connection_outputs.remove(s) for s in exception: address = "%s:%s" % connection.socket.getpeername() log.critical("Handling exceptional condition for %s!" % address) self.connection_inputs.remove(s) if s in self.connection_outputs: self.connection_outputs.remove(s) self.connections[address].socket.close() del self.connections[address] return True