Example #1
0
class Octopasty(object):
    def __init__(self, config_filename):
        self.config = read_config(config_filename)
        self.servers = self.config.get("amis")
        self.connect_tentatives = dict()
        self.amis = dict()
        self.clients = dict()
        self.in_queue = Queue()
        self.out_queue = Queue()
        self.flow = dict()
        self.listener = None

    # AMI side
    def connect_server(self, server):
        parameters = self.servers.get(server)
        client = AMIClient(self, server, parameters)
        client.start()

    def connect_servers(self):
        now = datetime.now()
        connected_servers = self.connected_servers
        for server in self.servers:
            if server not in connected_servers:
                last_try = self.connect_tentatives.get(server)
                if last_try is None or now - last_try > _1S:
                    self.connect_tentatives[server] = now
                    self.connect_server(server)

    def _get_connected_servers(self):
        return [ami.server for ami in filter(lambda _ami: _ami.connected, self.amis.values())]

    connected_servers = property(_get_connected_servers)

    def _get_ami_sockets(self):
        return [ami.socket for ami in filter(lambda _ami: _ami.connected, self.amis.values())]

    ami_sockets = property(_get_ami_sockets)

    # Client side
    def listen_clients(self):
        self.listener = MainListener(self)
        self.listener.start()

    def _get_connected_clients(self):
        return [client.id for client in filter(lambda _client: _client.connected, self.clients.values())]

    connected_clients = property(_get_connected_clients)

    def _get_client_sockets(self):
        return [client.socket for client in filter(lambda _client: _client.connected, self.clients.values())]

    client_sockets = property(_get_client_sockets)

    def _get_peers(self):
        return list(self.clients.values()) + list(self.amis.values())

    peers = property(_get_peers)

    def find_peer_from_socket(self, s):
        for peer in self.peers:
            if peer.socket == s:
                return peer
        return None

    def get_peer(self, name):
        return self.amis.get(name) or self.clients.get(name) or None

    def idle(self):
        if len(self.connected_servers) == 0 and len(self.connected_clients) == 0:
            sleep(1)

    def loop(self):
        looping = True
        self.listen_clients()
        while looping:
            try:
                self.connect_servers()
                self.idle()
                readall(self)
                squirm(self)
                burials(self)
                sendall(self)
            except KeyboardInterrupt:
                for ami in self.amis.values():
                    tmp_debug("NETWORK", "Disconecting from %s" % ami.uid)
                    ami.disconnect()
                    ami.join()
                for client in self.clients.values():
                    tmp_debug("NETWORK", "Disconecting %s" % client.uid)
                    client.disconnect()
                    client.join()
                looping = False
        self.listener.stop()
        self.listener.join()