You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

98 lines
3.0KB

  1. #!/usr/bin/env python
  2. import socket
  3. import sys
  4. from Crypto.Cipher import AES
  5. import base64
  6. import random
  7. import threading
  8. key="fhgjkleopmlk,hgj"
  9. enc = AES.new(key[:32])
  10. chaine = 'abcdefghijklmnopqrstuvwxyz'
  11. fichier_zone = "/etc/bind/zones/db.debugo.fr.extra"
  12. change = 0
  13. def encrypt(clear):
  14. temp = (str(clear) + (AES.block_size - len(str(clear)) % AES.block_size) * "\0")
  15. crypt = base64.b64encode(enc.encrypt(temp))
  16. return crypt
  17. def decrypt(crypt):
  18. temp = enc.decrypt(base64.b64decode(crypt))
  19. clear = temp.rstrip("\0")
  20. return clear
  21. class ClientThread(threading.Thread):
  22. def __init__(self, ip, port, clientsocket):
  23. threading.Thread.__init__(self)
  24. self.ip = ip
  25. self.port = port
  26. self.clientsocket = clientsocket
  27. def run(self):
  28. # print("Connection de %s sur le port %s" % (self.ip, self.port, ))
  29. # Random sur la chaine
  30. l = list(chaine)
  31. random.shuffle(l)
  32. random_chaine = ''.join(l)
  33. # Envoi de la chaine randomisee au client
  34. # print ("J'envoie la chaine randomise au client : %s" % (random_chaine))
  35. self.clientsocket.send(encrypt(random_chaine))
  36. # Choix d'un chiffre au hasard et d'une lettre en fonction
  37. random_indice = random.randint(1,26)
  38. random_carac = random_chaine[random_indice]
  39. self.clientsocket.send(encrypt(random_carac))
  40. # print ("Je veux l'indice du caractere : %s" % (random_carac))
  41. # print ("Le client doit donc me renvoyer : %s" % (random_indice))
  42. # Reception
  43. r = decrypt(self.clientsocket.recv(2048))
  44. # print ("Le client a envoye : %s" % (r))
  45. if int(r) == int(random_indice): # Si le client a bien repondu
  46. fichier=open(fichier_zone, 'r') # on ouvre le fichier
  47. new_line=[] # on prepare une liste vide qui va contenir les changements
  48. for line in fichier: # on lit chaque ligne
  49. item = line.split() # chaque element de la ligne est mis dans une liste
  50. if "Serial" in item: # si un des items est le mot serial
  51. item[0] = int(item[0]) + 1 # on incremente
  52. item[0] = "\t"+str(item[0]) # on rajoute la tabulation devant
  53. s = "\t"
  54. line = s.join(item)+"\n" # on reforme la ligne
  55. if "home" in item: # si un des items est le mot home
  56. if item[3] != self.ip : # Si IP differente
  57. change = 1
  58. item[3] = self.ip+"\n"
  59. s = "\t"
  60. line = s.join(item)
  61. new_line.append(line)
  62. if change == 1 :
  63. # deplacere l'ancien fichier en old
  64. # deplacer le nouveau fichier
  65. # relancer bind
  66. newfichier = open('/srv/new.txt', 'w')
  67. for nw in new_line :
  68. newfichier.write(nw)
  69. # Copie de l'ancien fichier vers un backup
  70. # Deplacer le nouveau fichier
  71. # Recharger Bind
  72. fichier.close
  73. else :
  74. error = 1
  75. tcpsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  76. tcpsock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  77. tcpsock.bind(("",79))
  78. while True:
  79. tcpsock.listen(5)
  80. # print( "En ecoute")
  81. (clientsocket, (ip, port)) = tcpsock.accept()
  82. newthread = ClientThread(ip, port, clientsocket)
  83. newthread.start()
  84. tcpsock.close()