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
Exemple #3
0
    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
Exemple #5
0
    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)
Exemple #7
0
    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