#!/usr/bin/env python import socket import sys from Crypto.Cipher import AES import base64 import random import threading from subprocess import call key="abcdefghijklmno" #(sur 16 carac. !) enc = AES.new(key[:32]) fichier_zone = "/etc/bind/zones/db.debugo.fr.extra" code = 'toto' subdomain = "xxx" 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, )) # print ("Le client a envoye : %s" % (r)) r = decrypt(self.clientsocket.recv(2048)) # Reception if r == code: # Si le client a bien repondu change = 0 fichier=open(fichier_zone, 'r') # on ouvre le fichier new_line=[] # on prepare une liste vide qui va contenir le fichier s = "\t" # Separateur pour la suite... 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 subdomain in item: # si un des items est le mot home # print item[3] # print self.ip 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) # On ajoute la ligne if change == 1 : # print "on change" newfichier = open('/etc/bind/zones/new.txt', 'w') for nw in new_line : newfichier.write(nw) newfichier.close call(["cp", "/etc/bind/zones/db.debugo.fr.extra", "/etc/bind/zones/db.debugo.fr.extra.back"]) call(["rm", "/etc/bind/zones/db.debugo.fr.extra"]) call(["mv", "/etc/bind/zones/new.txt", "/etc/bind/zones/db.debugo.fr.extra"]) call (["rndc", "reload"]) fichier.close else : error = 1 # A voir pour logger par la suite 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()