def creerFichier(): # Fonction qui va s'executer via la maintenance assez régulièrement # Elle regarde dans le dossier ADDFILES si il y a des files # Si oui, elle les copie dans le dossier HOSTEDFILES, les renomme de type SHA256.extention # Elle envoie vers la fonction contenue dans BDD.py qui va ajouter les files à la base de données # Et pour finir, elle supprime les files ajoutés de façon à ce que le dossier ADDFILES soit vide. repertoire = "ADDFILES" # Vérifier si le dossier ADDFILES existe, sinon le créer try: os.makedirs("ADDFILES") except OSError: if not os.path.isdir("ADDFILES"): raise # Vérifier si le dossier HOSTEDFILES existe, sinon le créer try: os.makedirs("HOSTEDFILES") except OSError: if not os.path.isdir("HOSTEDFILES"): raise dirs = os.listdir(repertoire) # This would print all the files and directories for file in dirs: file = repertoire + "/" + file if os.path.isfile(file): # L'élément est un file, c'est bon (et pas un dossier) try: with open(file, "rb") as fluxLecture: contenu = fluxLecture.read() fluxLecture.close() except UnicodeDecodeError: logs.addLogs("ERROR : The file is not supported : " + str(file)) os.remove(file) else: shaFichier = hashlib.sha256(str(contenu).encode()).hexdigest() osef, extention = os.path.splitext(file) filename = shaFichier + extention fileDir = "HOSTEDFILES/" + filename fluxEcriture = open(fileDir, "wb") fluxEcriture.write(contenu) fluxEcriture.close() os.remove(file) # L'ajouter à la BDD BDD.ajouterEntree("Fichiers", filename) logs.addLogs( "INFO : A new hosted file has been added successfully : " + filename) # On transmet à quelques noeuds l'information tableau = BDD.aleatoire("Noeuds", "IP", 15, "Parser") if isinstance(tableau, list) and len(tableau) == 15: # On envoi la request à chaque noeud sélectionné for peerIP in tableau: connNoeud = autresFonctions.connectionClient(peerIP) if str(connNoeud) != "=cmd ERROR": logs.addLogs( "INFO : Connection with peer etablished") request = "=cmd newFileNetwork name " + filename + " ip " + str( config.readConfFile("MyIP")) + str( config.readConfFile("defaultPort")) request = request.encode() connNoeud.send(request) rcvCmd = connNoeud.recv(1024) connNoeud.close() if rcvCmd == "=cmd noParser": # Il faut changer le paramètre du noeud, il n'est pas parseur mais simple BDD.supprEntree("Noeuds", peerIP) BDD.ajouterEntree("Noeuds", peerIP) elif rcvCmd != "=cmd fileAdded": # Une erreur s'est produite logs.addLogs( "ERROR : The request was not recognized in creerFichier() : " + str(rcvCmd)) else: logs.addLogs( "ERROR : An error occured in creerFichier() : " + str(connNoeud)) else: # Une erreur s'est produite logs.addLogs( "ERROR : There is not enough IP in creerFichier() : " + str(tableau))
if (str(config.readConfFile("Parser")) == "True"): # Le noeud est un parseur, on lance la fonction. ThrdParser = Parser() ThrdParser.start() if (str(config.readConfFile("DNS")) == "True"): # Le noeud est un DNS, on lance la fonction. ThrdDNS = ServDNS() ThrdDNS.start() if (str(config.readConfFile("VPN")) == "True"): # Le noeud est un VPN, on lance la fonction. ThrdVPN = ServVPN() ThrdVPN.start() #ThrdBrd = Bridge() #ThrdBrd.start() # On indique notre présence à quelques parseurs tableau = BDD.aleatoire("Noeuds", "IP", 15, "Parser") if isinstance(tableau, list) and tableau: # On envoi la request à chaque noeud sélectionné for peerIP in tableau: peerIP = peerIP[0] connNoeud = autresFonctions.connectionClient(peerIP) if str(connNoeud) != "=cmd ERROR": logs.addLogs("INFO : Connection with peer etablished") request = "=cmd newPeerNetwork ip " + str( config.readConfFile("MyIP")) + str( config.readConfFile("defaultPort")) request = request.encode() connNoeud.send(request) rcvCmd = connNoeud.recv(1024) connNoeud.close() if rcvCmd == "=cmd noParser":
def searchFile(fileName): # Fonction qui a pour but de chercher sur le réseau un file # Il faut d'abord chercher dans la BDD, et si il n'y est pas on cherche plus spécifiquement # IPpeerPort est la variable qui contient l'IP Port du noeud qui possède le file BDD.verifExistBDD() IPpeerPort = "" conn = sqlite3.connect('WTP.db') cursor = conn.cursor() # On va chercher dans les files hébergés try: cursor.execute("""SELECT id FROM Fichiers WHERE Nom = ?""", (fileName, )) except Exception as e: logs.addLogs("ERROR : Problem with database (searchFile()):" + str(e)) rows = cursor.fetchall() for row in rows: boucle += 1 # Le file est hébergé par le noeud qui le cherche ipPortIci = "127.0.0.1:" + str(config.readConfFile("defaultPort")) IPpeerPort = ipPortIci # Si le file n'a pas été trouvé # Il faut chercher dans les files connus externes try: cursor.execute("""SELECT IP FROM FichiersExt WHERE Nom = ?""", (fileName, )) except Exception as e: logs.addLogs("ERROR : Problem with database (searchFile()):" + str(e)) else: rows = cursor.fetchall() for row in rows: # Le file est hébergé par un noeud connu IPpeerPort = str(row) if IPpeerPort == "": # Il faut demander aux noeuds que l'on connait tblNoeuds = BDD.aleatoire("Noeuds", "IP", 10) # On a 10 noeuds dans le tableau # Maintenant, il faut vérifier que au moins la moitiée des noeuds choisis aléatoirement # sont des noeuds "simple", puis mettre les noeuds "simple" au début du tableau tableauNoeudsSimple = [] tableauSuperNoeuds = [] for noeud in tblNoeuds: # On verifie chaque noeud fonctionNoeud = chercherInfo("Noeuds", noeud) if fonctionNoeud == "simple": tableauNoeudsSimple.append(noeud) if fonctionNoeud == "supernoeud" or fonctionNoeud == "DNS": tableauSuperNoeuds.append(noeud) if len(tableauNoeudsSimple) < 6: # Il n'y a pas assez de noeuds simples dans la liste, # Il faut aller en rechercher logs.addLogs("WARNING : Not enough simple peers") # On ajoute les super noeuds après les noeuds simples tblNoeuds = tableauNoeudsSimple + tableauSuperNoeuds for noeudActuel in tblNoeuds: # À chaque noeud on demande si il a le file ou s'il connait un noeud qui l'a # Maintenant on se connecte au noeud error = 0 connexion_avec_serveur = autresFonctions.connectionClient( noeudActuel) if str(connexion_avec_serveur) == "=cmd ERROR": error += 1 else: sendCmd = b"" sendCmd = "=cmd rechercherFichier nom " + fileName sendCmd = sendCmd.encode() connexion_avec_serveur.send(sendCmd) rcvCmd = connexion_avec_serveur.recv(1024) rcvCmd = rcvCmd.decode() connexion_avec_serveur.close() if rcvCmd != "0": IPpeerPort = rcvCmd break return IPpeerPort # Peut retourner "" si il ne trouve pas d'hébergeur