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()
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()
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)))
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()
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()
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)))
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()
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()
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)))
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()))