server.py 2.6KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  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. from subprocess import call
  9. key="abcdefghijklmno" #(sur 16 carac. !)
  10. enc = AES.new(key[:32])
  11. fichier_zone = "/etc/bind/zones/db.debugo.fr.extra"
  12. code = 'toto'
  13. subdomain = "xxx"
  14. def encrypt(clear):
  15. temp = (str(clear) + (AES.block_size - len(str(clear)) % AES.block_size) * "\0")
  16. crypt = base64.b64encode(enc.encrypt(temp))
  17. return crypt
  18. def decrypt(crypt):
  19. temp = enc.decrypt(base64.b64decode(crypt))
  20. clear = temp.rstrip("\0")
  21. return clear
  22. class ClientThread(threading.Thread):
  23. def __init__(self, ip, port, clientsocket):
  24. threading.Thread.__init__(self)
  25. self.ip = ip
  26. self.port = port
  27. self.clientsocket = clientsocket
  28. def run(self):
  29. # print("Connection de %s sur le port %s" % (self.ip, self.port, ))
  30. # print ("Le client a envoye : %s" % (r))
  31. r = decrypt(self.clientsocket.recv(2048)) # Reception
  32. if r == code: # Si le client a bien repondu
  33. change = 0
  34. fichier=open(fichier_zone, 'r') # on ouvre le fichier
  35. new_line=[] # on prepare une liste vide qui va contenir le fichier
  36. s = "\t" # Separateur pour la suite...
  37. for line in fichier: # on lit chaque ligne
  38. item = line.split() # chaque element de la ligne est mis dans une liste
  39. if "Serial" in item: # si un des items est le mot serial
  40. item[0] = int(item[0]) + 1 # on incremente
  41. item[0] = "\t"+str(item[0]) # on rajoute la tabulation devant
  42. #s = "\t"
  43. line = s.join(item)+"\n" # on reforme la ligne
  44. if subdomain in item: # si un des items est le mot home
  45. # print item[3]
  46. # print self.ip
  47. if item[3] != self.ip : # Si IP differente
  48. change = 1
  49. item[3] = self.ip+"\n"
  50. #s = "\t"
  51. line = s.join(item)
  52. new_line.append(line) # On ajoute la ligne
  53. if change == 1 :
  54. # print "on change"
  55. newfichier = open('/etc/bind/zones/new.txt', 'w')
  56. for nw in new_line :
  57. newfichier.write(nw)
  58. newfichier.close
  59. call(["cp", "/etc/bind/zones/db.debugo.fr.extra", "/etc/bind/zones/db.debugo.fr.extra.back"])
  60. call(["rm", "/etc/bind/zones/db.debugo.fr.extra"])
  61. call(["mv", "/etc/bind/zones/new.txt", "/etc/bind/zones/db.debugo.fr.extra"])
  62. call (["rndc", "reload"])
  63. fichier.close
  64. else :
  65. error = 1
  66. # A voir pour logger par la suite
  67. tcpsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  68. tcpsock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  69. tcpsock.bind(("",79))
  70. while True:
  71. tcpsock.listen(5)
  72. # print( "En ecoute")
  73. (clientsocket, (ip, port)) = tcpsock.accept()
  74. newthread = ClientThread(ip, port, clientsocket)
  75. newthread.start()
  76. tcpsock.close()