Ejemplo n.º 1
0
    def __init__(self):
        self.logger = logging.getLogger('group_leader')

        self.peers = set()
        self.music = mpd.music.get_hashes()

        address = network.parse_address(network.get_group_address())

        self.logger.info('starting group leader server on {}'.format(address))

        super().__init__(address, GroupLeaderHandler)
        self.thread = threading.Thread(target=self.serve_forever, daemon=True)
        self.thread.start()
Ejemplo n.º 2
0
    def __init__(self, leader):
        self.logger = logging.getLogger('group_peer')

        self.leader = leader
        self.music = mpd.music.get_hashes()
        self.peers = set()
        self.join_pending = True

        # start server for group messages
        address = network.get_group_address()
        self.logger.info('starting peer server on {}'.format(address))

        super().__init__(network.parse_address(address), GroupPeerHandler)
        self.thread = threading.Thread(target=self.serve_forever, daemon=True)
        self.thread.start()

        # try to contact group leader with GroupJoin
        self.logger.debug('contacting leader at {}'.format(leader))
        self.send_leader(proto.GroupJoin(network.get_group_port()))
Ejemplo n.º 3
0
        def group_ping():
            if data.ping_id in self.state['group_pings']:
                # We've seen this ping, do nothing
                self.logger.debug('known ping -> ignore')
            else:
                # We've not seen this ping, flood
                self.state['group_pings'][data.ping_id] = peer
                data.ttl -= 1
                for p in self.state['neighbours']:
                    if p != peer:
                        p.send(data)

                if self.state['group']:
                    # We're in a group, so we should answer
                    self.logger.debug('reply with group pong to {}'.format(
                        peer.address))
                    music = self.state['group'].music
                    if isinstance(self.state['group'], GroupLeader):
                        m = proto.GroupPong(data.ping_id,
                                            network.get_group_address(), music)
                    elif isinstance(self.state['group'], GroupPeer):
                        m = proto.GroupPong(data.ping_id,
                                            self.state['group'].leader, music)
                    peer.send(m)
Ejemplo n.º 4
0
 def remove_peer(self, a, p):
     peer = '{}:{}'.format(a, p)
     self.peers.remove(peer)
     m = proto.GroupInfo(network.get_group_address(), self.peers)
     self.send_all(m)
Ejemplo n.º 5
0
 def update_peers(self, ps):
     self.peers = ps - {network.get_group_address()}
     self.logger.debug('updating peers: {}'.format(self.peers))