def existe_objeto(self, objeto): paq = a_aPaq() paq.unserialize(objeto) cat = paq.category verde = paq.node_id id_archivo = paq.fileID if cat == 3: for chunk in self.chunks_almacenados: if chunk[0] == id_archivo: found = a_aPaq(3,3,verde,id_archivo) # Mando que existe a nodo verde self.secure_udp.enviar(found.serialize(), self.ip_verde, self.puerto_verde) elif cat == 2: for chunk in self.chunks_almacenados: if chunk[0] == id_archivo: found = a_aPaq(2,3,verde,id_archivo) # Aqui quiero devolver una respuesta de EXISTS al nodo azul principal self.broadcast(found.serialize(),found.tipo) # Aqui quiero mandar el EXISTS? a los azules que en teoria faltan sendAA = a_aPaq(2,2,verde,id_archivo) objetoAA = sendAA.serialize() self.broadcast(objetoAA,sendAA.tipo) print("Determinando si existe el objeto en el grafo")
def localizar_objeto(self, objeto): paq = a_aPaq() paq.unserialize(objeto) cat = paq.category verde = paq.node_id id_archivo = paq.fileID if cat == 3: for chunk in self.chunks_almacenados: if chunk[0] == id_archivo: found = a_aPaq(3,9,verde,id_archivo,self.id_nodo) #mando que resp de localizar a nodo verde self.secure_udp.enviar(found.serialize(), self.ip_verde, self.puerto_verde) elif cat == 2: for chunk in self.chunks_almacenados: if chunk[0] == id_archivo: found = a_aPaq(2,9,verde,id_archivo,self.id_nodo) #aqui quiero devolver una respuesta de LOCATE al nodo azul principal self.broadcast(found.serialize(),found.tipo) #aqui quiero mandar el LOCATE? a los azules que en teoria faltan sendAA = a_aPaq(2,8,verde,id_archivo) objetoAA = sendAA.serialize() self.broadcast(objetoAA,sendAA.tipo) print("Armando archivo CSV...")
def obtener_objeto(self, objeto): # Hay que entregarle al cliente el objeto solicitado paq = a_aPaq() paq.unserialize(objeto) cat = paq.category verde = paq.node_id id_archivo = paq.fileID if cat == 3: for chunk in self.chunks_almacenados: if chunk[0] == id_archivo: found = a_aPaq(3,7,verde,id_archivo,chunk[1],chunk[2]) #mando chunk a nodo verde self.secure_udp.enviar(found.serialize(), self.ip_verde, self.puerto_verde) elif cat == 2: for chunk in self.chunks_almacenados: if chunk[0] == id_archivo: found = a_aPaq(2,7,verde,id_archivo,chunk[1],chunk[2]) #aqui quiero devolver chunk al nodo azul principal self.broadcast(found.serialize(),found.tipo) #aqui quiero mandar el GET? a los azules que en teoria faltan sendAA = a_aPaq(2,6,verde,id_archivo) objetoAA = sendAA.serialize() self.broadcast(objetoAA,sendAA.tipo) print("Obteniendo el objeto solicitado")
def objeto_completo(self, objeto): # Verifica si el objeto es reeensamblable # TIENE que verificar todos los azules paq = a_aPaq() paq.unserialize(objeto) cat = paq.category verde = paq.node_id id_archivo = paq.fileID if cat == 3: for chunk in self.chunks_almacenados: if chunk[0] == id_archivo: found = a_aPaq(3,5,verde,id_archivo,chunk[1]) #mando resp de complete a nodo verde self.secure_udp.enviar(found.serialize(), self.ip_verde, self.puerto_verde) elif cat == 2: for chunk in self.chunks_almacenados: if chunk[0] == id_archivo: found = a_aPaq(2,5,verde,id_archivo,chunk[1]) #aqui quiero devolver una respuesta de COMPLETE al nodo azul principal self.broadcast(found.serialize(),found.tipo) #aqui quiero mandar el COMPLETE? a los azules que en teoria faltan sendAA = a_aPaq(2,4,verde,id_archivo) objetoAA = sendAA.serialize() self.broadcast(objetoAA,sendAA.tipo) print("Verificando si el objeto es reensamblable(COMPLETE)")
def daddy(self, paquete, address): # Si un vecino es parte del arbol, elijo de menor ID y le mando un mensaje tipo daddy print("Ahora este sera mi papi") inTree=True vecino = a_aPaq() vecino.unserialize(paquete) id_vecino = int (vecino.node_id) paquete= a_aPaq(2,13,self.id_nodo,) daddy = paquete.serialize() for vecino in self.lista_vecinos: if vecino[0]==id_vecino: self.mensajes_enviar.append((daddy,address)) self.lista_vecinos_arbol.append(vecino) # Anade a la lista de arbol generador
def HiloRecibidor(self): while True: payload, address = self.secure_udp.recibir() aaPaq = a_aPaq(0, 0, 0, 0, 0) aaPaq.unserialize(payload) tipo = aaPaq.tipo if (tipo == 3): # caso respuesta a EXISTS resp = "El archivo que consulto si existe" self.colaSalidaCliente.put(resp) if (tipo == 5): # caso respuesta a COMPLETE resp = "El archivo que consulto si esta completo" self.colaSalidaCliente.put(resp) if (tipo == 7): # caso respuesta a GET nombre = "temporal" resp = "El archivo que consulto se guardo como " + nombre self.colaSalidaCliente.put(resp) if (tipo == 9): # caso respuesta a LOCATE nombreNodo = "Nodo temporal" resp = "El archivo que consulto si existe en nodo " + nombreNodo self.colaSalidaCliente.put(resp)
def clonar_chunk(self, paquete_chunk,address): # Clona el paquete, guarda copia y lo pasa con Round Robin paquete = a_aPaq(0,0,0,0,0,0) paquete.unserialize(paquete_chunk) self.chunks_almacenados.append((paquete.fileID, paquete.chunkID, paquete.payload)) # Guardo en esta estructura los chunks #id de imagen,#id de chunk #chunk self.aQuienEnvio(paquete_chunk,address) print("Clonando, guardando y pasando chunck")
def recibir_hello(self, paquete): paq = a_aPaq() paq.unserialize(paquete) for i in self.lista_vecinos: if i[0] == paq.node_id: self.vecinoSaidHello[paq.node_id] = True print(self.vecinoSaidHello)
def resp_localizar_objeto(self, objeto): paq = a_aPaq() paq.unserialize(objeto) cat = paq.category verde = paq.node_id id_archivo = paq.fileID id_nodo = paq.chunkID if self.id_nodo_verde_actual == verde: found = a_aPaq(3,9,verde,id_archivo,id_nodo) self.secure_udp.enviar(found.serialize(), self.ip_verde, self.puerto_verde) else: sendAA = a_aPaq(2,9,verde,id_archivo,id_nodo) objetoAA = sendAA.serialize() self.broadcast(objetoAA,sendAA.tipo) print("Respuesta a LOCATE")
def broadcast(self, tipo, green, file_id, chuck_id, payload, addprev): # Envia a vecinos que pertenescan al Arbol paquete = a_aPaq(0,tipo,green,file_id,chuck_id,payload) paq = paquete.serialize() for vecino in self.lista_vecinos_arbol: # Itero sobre lista de vecinos arbol if vecino[1][0] != addprev[0] and vecino[1][1] != addprev[1]: address = (vecino[1][0], vecino[1][1]) self.mensajes_enviar.append((paq,address))
def newSon(self, paquete): # Si recibe un mensaje tipo daddy de un vecino que no se habia unido al arbol print("Ahora este nodo es hijo mio") vecino = a_aPaq() vecino.unserialize(paquete) id_vecino = int (vecino.node_id) for vecino in self.lista_vecinos: if vecino[0] == id_vecino: self.lista_vecinos_arbol.append(vecino) # Anade a la lista de arbol generador
def joinTree(self): # revisa si vecino es parte del arbol preguntando a sus vecinos si pertenecen print("Vecino es parte de arbol?") paquete = a_aPaq(2, 11, self.id_nodo) paq = paquete.serialize() for vecino in self.lista_vecinos: # Mando un mensaje a todos mis vecinos address=(vecino[1][0], vecino[1][1]) self.mensajes_enviar.append((paq,address))
def resp_objeto_completo(self, objeto): paq = a_aPaq() paq.unserialize(objeto) cat = paq.category verde = paq.node_id id_archivo = paq.fileID id_chunk = paq.chunkID if self.id_nodo_verde_actual == verde: found = a_aPaq(3,5,verde,id_archivo,id_chunk) #mando que existe este chunk a nodo verde self.secure_udp.enviar(found.serialize(), self.ip_verde, self.puerto_verde) else: #aqui quiero mandar la respuesta al azul que lo necesita sendAA = a_aPaq(2,5,verde,id_archivo,id_chunk) objetoAA = sendAA.serialize() self.broadcast(objetoAA,sendAA.tipo) print("Respuesta a COMPLETE")
def check_if_tree(self,paquete,address): # Reviso si pertenezco al arbol id_vecino = paquete.node_id if(self.InTree): print("Estoy en el arbol!") # Envio mensaje diciendo que si tipo ido for vecino in self.lista_vecinos: if vecino[0]==id_vecino: paquete = a_aPaq(2,12,self.id_nodo) IDO = paquete.serialize() address=(vecino[1]) self.mensajes_enviar.append((IDO,address)) else: print("No Estoy en el arbol!") # Envia mensaje diciendo que no TIPO idonot for vecino in self.lista_vecinos: if vecino[0]==id_vecino: paquete = a_aPaq(2,18, self.id_nodo) address=(vecino[1]) IDONOT = paquete.serialize() self.mensajes_enviar.append((IDONOT,address))
def borrar_chunk(self, paquete_chunk): # Borra el chunck paquete = a_aPaq(0,0,0,0,0,0) paquete.unserialize(paquete_chunk) #metodo para borrar de arreglo que tenemos for chunk in self.chunks_almacenados: if chunk[0] == paquete.fileID: if chunk[1] == paquete.chunkID: self.chunks_almacenados.remove(chunk) print("Borrando chunck")
def HiloRecibidor(colaEntrada, sock, nodeID, colaSalida): while True: payload, client_address = sock.recvfrom(1024) print("Paquete obtenido") package = a_aPaq(0, 0, 0, client_address) package.unserialize(payload) print("Mensaje de Tipo", package.tipo, "De SN=", package.sn, "Que contiene:", package.payload, "Proveniente de:", package.direccion) colaSalida.put(package)
def eliminar_objeto(self, objeto): # Elimina los chunks del grafo paquete = a_aPaq() paquete.unserialize(objeto) for chunk in self.chunks_almacenados: if chunk[0] == paquete.fileID: self.chunks_almacenados.remove(chunk) #aqui quiero mandar DELETE a todos los azules self.broadcast(objeto,10) print("Eliminando chunks del grafo")
def RecibirCliente(self): while True: payload, client_address = self.sock.recvfrom( 1035 ) # recibe 1035 bytes y la (direcciónIP, puerto) del origen paquete = struct.unpack('!BH', payload[0:3]) tipo = paquete[0] idArch = paquete[1] if (tipo == 1): # caso Depositar paqDep = struct.unpack('!100s', payload[3:]) referencia = paqDep[0].decode() arrayChunks = self.particionar(referencia) self.union(arrayChunks) tamArray = len(arrayChunks) for x in range(tamArray): paqEnv = a_aPaq(0, self.my_id, idArch, x, arrayChunks[x]) bytesP = paqEnv.serialize() self.colaSalida.put(bytesP) self.colaSalidaCliente.put( "Ya se empezaron a poner los chunks") if (tipo == 2): # caso Existe paqEnv = a_aPaq(2, self.my_id, idArch, 0, 0) bytesP = paqEnv.serialize() self.colaSalida.put(bytesP) if (tipo == 3): # caso Completo paqEnv = a_aPaq(4, self.my_id, idArch, 0, 0) bytesP = paqEnv.serialize() self.colaSalida.put(bytesP) if (tipo == 4): # caso Obtener paqEnv = a_aPaq(6, self.my_id, idArch, 0, 0) bytesP = paqEnv.serialize() self.colaSalida.put(bytesP) if (tipo == 5): # caso Localizar paqEnv = a_aPaq(8, self.my_id, idArch, 0, 0) bytesP = paqEnv.serialize() self.colaSalida.put(bytesP) if (tipo == 6): # caso Eliminar paqEnv = a_aPaq(10, self.my_id, idArch, 0, 0) bytesP = paqEnv.serialize() self.colaSalida.put(bytesP) respuesta = self.colaSalidaCliente.get() paqResp = struct.pack('!100s', respuesta.encode('ascii')) self.sock.sendto(paqResp, client_address)
def run(self): server = (self.ip, self.port) colaEntrada = queue.Queue() colaSalida = queue.Queue() package = a_aPaq(0, 1, "hola", ('10.1.137.29', 8887)) colaSalida.put(package) # listaVecinos[] # Prepara Hilo que recibe mensajes sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.bind(server) print("Escuchando: " + self.ip + ":" + str(self.port)) ##Hilos recibidor t = threading.Thread(target=HiloRecibidor, args=(colaEntrada, sock, self.nodeID, colaSalida)) t.start() print("hilo recibidor iniciado") # hilo enviador t2 = threading.Thread(target=HiloEnviador, args=(colaSalida, sock)) t2.start() print(("hilo enviador iniciado"))
def revisar_IDos_IDoNots(self): vecino_arbol = False while vecino_arbol == False: if self.graphComplete and self.everyoneSaidHi: print("TAMAÑO DE LA LISTA DE IDO: ", len(self.iDos_iDoNots), "TAMAÑO DE LA LISTA DE VECINOS: ", len(self.lista_vecinos)) if len(self.iDos_iDoNots) != len(self.lista_vecinos): print("NO han llegado suficientes mensajes!") # Me duermo 1 segundo, espero, para no preguntar tan seguido time.sleep(2) else: # Miden los mismo, tengo la respuesta de todos todos_iDoNot = True for paquete in self.iDos_iDoNots: # Son tuplas de la forma (paquete , (IP , Puerto)) tipo_paquete = paquete[0].tipo if tipo_paquete == 12: # I DO todos_iDoNot = False elif tipo_paquete == 18: #I DO NOT self.iDos_iDoNots.remove(paquete) # si es un I DO NOT, lo saco de la lista. if todos_iDoNot == True: # Borrar la lista, ninguno pertenece al arbol self.iDos_iDoNots[:] = [] # Esto borra toda la lista time.sleep(2) # Me duermo 2 segundos if not self.InTree: self.joinTree() # Vuelvo a mandar el joinTree para obtener mas iDo o iDoNot else: # Si hay alguien que pertenece al arbol print("Tengo que buscar la menor y hacerlo mi tata") menor = 999999999999 for paquete in self.iDos_iDoNots: paq_id = paquete[0].node_id if paq_id < menor: menor = paq_id daddy = a_aPaq(2, 13, self.id_nodo,) daddy = daddy.serialize() address = 0 for vecino in self.lista_vecinos: if vecino[0] == menor: address = vecino[1] self.lista_vecinos_arbol.append(vecino) self.mensajes_enviar.append((daddy, address)) self.InTree = True vecino_arbol = True
def analizar_peticiones(self): saidHi = False triedToJoinTree = False while True: if len(self.mensajes_procesar) != 0: paquete, address = self.mensajes_procesar.pop(0) # Saca el primer paquete categoria = int.from_bytes(paquete[:1], byteorder='little') if categoria == 1: # Paquete es Naranja-Azul package = n_aPaq() package = package.unserialize(paquete) tipo_paquete = package.tipo if tipo_paquete == 15: self.id_nodo = package.posGrafo self.lista_vecinos = package.listaVecinos for i in self.lista_vecinos: self.vecinoSaidHello[i] = False elif tipo_paquete == 16: if self.id_nodo == package.posGrafo: print("Recibí mi lista de vecinos: ") print(package.listaVecinos) self.lista_vecinos = package.listaVecinos # Es una tupla con una tupla: lista_vecinos[0] da el id, lista_vecinos[1] da la tupla de dirección. elif tipo_paquete == 17: self.graphComplete = True if self.id_nodo == 1: self.InTree = True elif categoria == 2 and self.graphComplete: # Paquete es azul-azul package = a_aPaq() package = package.unserialize(paquete) tipo_paquete = package.tipo # "Switch" de tipo de paquete if tipo_paquete == 0: print("Es un paquete put chunk") #definimos que hacer con el paquete self.switcher(paquete,address) elif tipo_paquete == 1: print("Es un paquete Hello") self.recibir_hello(paquete) elif tipo_paquete == 2: print("Es un paquete Exists?") self.existe_objeto(paquete) elif tipo_paquete == 3: print("Respuesta de Exists?") self.resp_existe_objeto(paquete) elif tipo_paquete == 4: print("Es un paquete Complete?") self.objeto_completo(paquete) elif tipo_paquete == 5: print("Resuesta de Complete?") self.resp_objeto_completo(paquete) elif tipo_paquete == 6: print("Es un paquete Get") self.obtener_objeto(paquete) elif tipo_paquete == 7: print("Respuesta de Get") self.resp_obtener_objeto(paquete) elif tipo_paquete == 8: print("Es un paquete Locate") self.localizar_objeto(paquete) elif tipo_paquete == 9: print("Respuesta de Locate") self.resp_localizar_objeto(paquete) elif tipo_paquete == 10: print("Es un paquete delete") self.eliminar_objeto(paquete) elif tipo_paquete == 11: print("Me preguntan si pertenesco al arbol generador") self.check_if_tree(package,address) elif tipo_paquete == 13: print("Soy padre!") self.newSon(paquete) elif tipo_paquete == 12: #IDO print("Si pertenece al Arbol") self.iDos_iDoNots.append((package, address)) elif tipo_paquete == 18: #IDONOT self.iDos_iDoNots.append((package, address)) print("No pertenece al Arbol el vecino:",address) else: print("Es un paquete que no tiene sentido con el protocolo") elif categoria == 3 and self.graphComplete: # verde-azul print("Comunicación verde-azul") self.ip_verde = address[0] self.puerto_verde = address[1] package = a_aPaq() package = package.unserialize(paquete) tipo_paquete = package.tipo self.id_nodo_verde_actual = package.greenID # "Switch" de tipo de paquete if tipo_paquete == 0: print("Es un paquete put chunk") # Definimos que hacer con el paquete self.depositar_objeto(paquete) elif tipo_paquete == 1: print("Es un paquete Hello") self.recibir_hello(paquete) elif tipo_paquete == 2: print("Es un paquete Exists?") self.existe_objeto(paquete) elif tipo_paquete == 3: print("Respuesta de Exists?") self.resp_existe_objeto(paquete) elif tipo_paquete == 4: print("Es un paquete Complete?") self.objeto_completo(paquete) elif tipo_paquete == 5: print("Resuesta de Complete?") self.resp_objeto_completo(paquete) elif tipo_paquete == 6: print("Es un paquete Get") self.obtener_objeto(paquete) elif tipo_paquete == 7: print("Respuesta de Get") self.resp_obtener_objeto(paquete) elif tipo_paquete == 8: print("Es un paquete Locate") self.localizar_objeto(paquete) elif tipo_paquete == 9: print("Respuesta de Locate") self.resp_localizar_objeto(paquete) elif tipo_paquete == 10: print("Es un paquete delete") self.eliminar_objeto(paquete) else: print("Es un paquete que no tiene sentido con el protocolo") else: # Si de casualidad llegó un paquete azul o verde antes de que la topología estuviera completa entonces lo regresa a la cola. self.mensajes_procesar.append((paquete, address)) if self.graphComplete: if not saidHi: self.mandar_hellos() saidHi = True if not self.everyoneSaidHi: contador = 0 for vecino in self.vecinoSaidHello.keys(): if self.vecinoSaidHello[vecino]: contador += 1 if contador == len(self.lista_vecinos): self.everyoneSaidHi = True if saidHi and not self.InTree and self.everyoneSaidHi and not triedToJoinTree: t6 = threading.Thread(target=self.revisar_IDos_IDoNots) t6.start() self.joinTree() triedToJoinTree = True
def guardar_chunk(self, paquete_chunk): # Guarda el chunck en disco paquete = a_aPaq(0,0,0,0,0,0) paquete.unserialize(paquete_chunk) self.chunks_almacenados.append((paquete.fileID, paquete.chunkID, paquete.payload)) print("Guardando chunck")
def mandar_hellos(self): # Metodo que envia hellos a los vecinos for vecino in self.lista_vecinos: paquete = a_aPaq(2, 1, self.id_nodo, 0, 0, 0) paq = paquete.serialize() address = (vecino[1]) self.mensajes_enviar.append((paq, address))
#!/usr/bin/env python import socket from a_aPaq import a_aPaq UDP_IP = "10.1.137.29" UDP_PORT = 8888 test = a_aPaq(0, 1, "hola", ('10.1.137.166', 8888)) #mete de un solo en cola de entrada MESSAGE = test.serialize() sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.sendto(MESSAGE, (UDP_IP, UDP_PORT))
from USL import USL from a_aPaq import a_aPaq from netifaces import interfaces, ifaddresses, AF_INET my_ip = ifaddresses(interfaces()[1])[AF_INET].pop(0)['addr'] my_port = 8888 usl = USL(my_ip, my_port, 5) usl.run() paqEnv = a_aPaq(0, 0, 0, 0, 0) print("entré a run y salí") while True: paquete, address = usl.recibir() tipoAzul = int.from_bytes(paquete[0:1], byteorder=("big")) if (tipoAzul == 0): idChunk = int.from_bytes(paquete[4:8], byteorder=("big")) print("Recibi chunk con ID = ", idChunk) if (tipoAzul == 2): paqEnv = a_aPaq(3, 193, 1, 0, 0) if (tipoAzul == 4): paqEnv = a_aPaq(5, 193, 1, 0, 0) if (tipoAzul == 6): paqEnv = a_aPaq(7, 193, 1, 0, 0) if (tipoAzul == 8): paqEnv = a_aPaq(9, 193, 1, 0, 0) if (tipoAzul != 0): mensaje = paqEnv.serialize() usl.send(mensaje, address[0], address[1])