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")
Пример #16
0
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)
Пример #19
0
    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))
Пример #24
0
#!/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])