|
- #!/usr/bin/env python
-
-
- import socket
- import sys
- from Crypto.Cipher import AES
- import base64
- import random
- import threading
-
- key="fhgjkleopmlk,hgj"
- enc = AES.new(key[:32])
- chaine = 'abcdefghijklmnopqrstuvwxyz'
- fichier_zone = "/etc/bind/zones/db.debugo.fr.extra"
- change = 0
-
- def encrypt(clear):
- temp = (str(clear) + (AES.block_size - len(str(clear)) % AES.block_size) * "\0")
- crypt = base64.b64encode(enc.encrypt(temp))
- return crypt
-
- def decrypt(crypt):
- temp = enc.decrypt(base64.b64decode(crypt))
- clear = temp.rstrip("\0")
- return clear
-
- class ClientThread(threading.Thread):
- def __init__(self, ip, port, clientsocket):
- threading.Thread.__init__(self)
- self.ip = ip
- self.port = port
- self.clientsocket = clientsocket
-
- def run(self):
- # print("Connection de %s sur le port %s" % (self.ip, self.port, ))
- # Random sur la chaine
- l = list(chaine)
- random.shuffle(l)
- random_chaine = ''.join(l)
- # Envoi de la chaine randomisee au client
- # print ("J'envoie la chaine randomise au client : %s" % (random_chaine))
- self.clientsocket.send(encrypt(random_chaine))
- # Choix d'un chiffre au hasard et d'une lettre en fonction
- random_indice = random.randint(1,26)
- random_carac = random_chaine[random_indice]
- self.clientsocket.send(encrypt(random_carac))
- # print ("Je veux l'indice du caractere : %s" % (random_carac))
- # print ("Le client doit donc me renvoyer : %s" % (random_indice))
- # Reception
- r = decrypt(self.clientsocket.recv(2048))
- # print ("Le client a envoye : %s" % (r))
- if int(r) == int(random_indice): # Si le client a bien repondu
- fichier=open(fichier_zone, 'r') # on ouvre le fichier
- new_line=[] # on prepare une liste vide qui va contenir les changements
- for line in fichier: # on lit chaque ligne
- item = line.split() # chaque element de la ligne est mis dans une liste
- if "Serial" in item: # si un des items est le mot serial
- item[0] = int(item[0]) + 1 # on incremente
- item[0] = "\t"+str(item[0]) # on rajoute la tabulation devant
- s = "\t"
- line = s.join(item)+"\n" # on reforme la ligne
- if "home" in item: # si un des items est le mot home
- if item[3] != self.ip : # Si IP differente
- change = 1
- item[3] = self.ip+"\n"
- s = "\t"
- line = s.join(item)
- new_line.append(line)
- if change == 1 :
- # deplacere l'ancien fichier en old
- # deplacer le nouveau fichier
- # relancer bind
- newfichier = open('/srv/new.txt', 'w')
- for nw in new_line :
- newfichier.write(nw)
- # Copie de l'ancien fichier vers un backup
-
- # Deplacer le nouveau fichier
-
- # Recharger Bind
-
- fichier.close
- else :
- error = 1
-
- tcpsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- tcpsock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
- tcpsock.bind(("",79))
-
- while True:
- tcpsock.listen(5)
- # print( "En ecoute")
- (clientsocket, (ip, port)) = tcpsock.accept()
- newthread = ClientThread(ip, port, clientsocket)
- newthread.start()
-
- tcpsock.close()
|