Example #1
0
    def receive_leader(self, msg):
        current_time = self.get_time()
        received_time = float(msg[u'time'])
        self.logger.add_level()
        self.logger.log(u'Hora recebida: {0}'.format(received_time))
        self.logger.log(u'Líder recebido: {0}'.format(pretty_address(msg[u'leader'])))
        self.logger.log(u'Original recebido: {0}'.format(pretty_address(msg[u'original'])))
        self.logger.remove_level()
        
        original = msg[u'original']
        if original == self.this:
            self.logger.log(u'Propagação voltou com tempos iguais. Usando líder do anel')
            self.leader = msg[u'leader']
            self.info_print()
            return

        if received_time - current_time >= self.tolerance:
            self.logger.log(u'Tempo recebido maior do que tempo atual. Atualizando líder')
            self.leader = msg[u'leader']
            self.delta_time += received_time - current_time
            self.propagate_leader(msg[u'original'])
        elif abs(received_time - current_time) <= self.tolerance:
            self.propagate_leader(msg[u'original'])
        else:
            self.logger.log(u'Este é o novo líder do anél. Propagando informação')
            self.propagate_leader(self.this)
        self.info_print()
Example #2
0
    def receive_disconnect_leader_prop(self, msg):
        self.logger.add_level()
        self.logger.log(u'Novo Líder recebido: {0}'.format(pretty_address(msg[u'new_leader'])))
        self.logger.log(u'Original recebido: {0}'.format(pretty_address(msg[u'original'])))
        self.logger.remove_level()

        original = msg[u'original']
        if original == self.this:
            self.logger.log(u'Líder antigo removido de todo anél. Verificando líder novo')
            return self.propagate_leader(original)
        self.logger.log(u'Líder antigo desconectou do anél. Utilizando sucessor')
        self.leader = msg[u'new_leader']
        self.propagate_leader_disconnect(msg[u'original'])
        self.info_print()
Example #3
0
    def add_peer(self, client, address):
        peer = (address[0], self.current_port)
        self.current_port += 1

        if self.peers:
            client.send(json.dumps((peer, self.peers[0])))
        else:
            client.send(json.dumps((peer, peer)))
        self.logger.log(u'Peer adicionado: {0}'.format(pretty_address(peer)))

        if len(self.peers) > 0:
            self.logger.log(u'Enviando endereço do peer {0} para o peer {1}'.format(pretty_address(peer), pretty_address(self.peers[-1])))
            self.send_next_address(self.peers[-1], peer)

        self.peers.append(peer)
        self.logger.log(u'{0} peer(s)'.format(len(self.peers)))
Example #4
0
 def loop(self):
     while self.running:
         client, address = self.server.accept()
         self.logger.log(u'Peer conectado no endereço {0}'.format(pretty_address(address)))
         msg = json.loads(client.recv(1024))
         if msg[u'op'] == u'add':
             self.add_peer(client, address)
         elif msg[u'op'] == u'remove':
             self.remove_peer(tuple(msg[u'peer']))
         client.close()
Example #5
0
 def loop(self):
     while self.running:
         client, address = self.server.accept()
         self.logger.log(u'Peer conectado no endereço %s' % pretty_address(address))
         self.logger.add_level()
         msg = json.loads(client.recv(1024))
         self.logger.log(u'Operação "{0}"'.format(msg[u'op']))
         self.listeners[msg[u'op']](msg)
         client.close()
         self.logger.log(u'Peer desconectado')
         self.logger.remove_level()
Example #6
0
 def remove_peer(self, peer):
     self.logger.log(u'Removendo peer: {0}'.format(peer))
     if len(self.peers) > 1:
         index = self.peers.index(peer)
         previous_peer = self.peers[index - 1]
         next_peer = self.peers[(index + 1) % len(self.peers)]
         self.logger.log(u'Enviando endereço do peer {0} para o peer {1}'.format(pretty_address(next_peer), pretty_address(previous_peer)))
         self.send_next_address(previous_peer, next_peer)
         self.peers.pop(index)
     else:
         self.peers = []
     self.logger.log(u'{0} peer(s)'.format(len(self.peers)))
Example #7
0
 def close(self):
     self.logger.ident = 0
     if CLOSE_PEERS:
         self.logger.log(u'Fechando Peers')
         for peer in self.peers:
             self.logger.log(u'Fechando peer: {0}'.format(pretty_address(peer)))
             client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
             client.connect(peer)
             client.send(json.dumps({u'op': u'close'}))
             client.close()
     
     self.logger.log(u'Fechando Tracker')
     self.running = False
     self.server.close()
Example #8
0
    def __init__(self, tracker_ip='127.0.0.1', tracker_port=DEFAULT_TRACKER_PORT):
        self.this = None
        self.next = None
        self.tracker_ip = tracker_ip
        self.tracker_port = tracker_port
        self.logger = Logger()

        with Client((self.tracker_ip, self.tracker_port), name=u'Tracker', logger=self.logger) as client:
            client.send(json.dumps({u'op': u'add'}))
            self.this, self.next = json.loads(client.recv(1024))
                
        self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        self.server.bind((SOCKET_LISTENER_IP, self.this[1]))
        self.server.listen(5)
        
        self.listeners = {
            u'close': self.receive_close,
            u'next': self.receive_next,
        }

        self.running = True
        self.logger.log(u'Servidor do Peer aberto em {0}'.format(pretty_address((socket.gethostbyname(socket.gethostname()), self.this[1]))))
        self.logger.add_level()
Example #9
0
 def info_print(self):
     self.logger.log(u'Endereço: {0}'.format(pretty_address(self.this)))
     self.logger.log(u'Próximo: {0}'.format(pretty_address(self.next)))
Example #10
0
 def info_print(self):
     TrackerPeer.info_print(self)
     self.logger.log(u'Líder: {0}'.format(pretty_address(self.leader)))
     self.logger.log(u'Hora: {0}'.format(self.get_time()))