|
- #!/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()
|