diff --git a/gestion/gen_confs/bind.py b/gestion/gen_confs/bind.py index 143d7a30..7f60e97a 100755 --- a/gestion/gen_confs/bind.py +++ b/gestion/gen_confs/bind.py @@ -6,14 +6,10 @@ Copyright (C) Frédéric Pauget Licence : GPLv2 """ - -# TODO : - # verif si SOA zamok.crans.org bon partout - # verif si liste NS identiques partout ok - # traitement warnings - -import time, sre +import time, sys +sys.path.append('/usr/scripts/gestion') from gen_confs import gen_config +from iptools import AddrInNet, AddrInNets class dns(gen_config) : """ @@ -34,14 +30,14 @@ la base LDAP ### Fichiers à écrire # Répertoire d'écriture des fichiers de zone DNS_DIR='/etc/bind/generated/' # Avec un / à la fin - # Fichier de définition des zones + # Fichier de définition des zones pour le maître DNS_CONF=DNS_DIR + 'zones_crans' ### Sur quelles zones on a autorité ? # Résolution directe zones_direct = [ 'crans.org' , 'crans.ens-cachan.fr', 'wifi.crans.org' , 'ferme.crans.org' ] - # Résolution inverse (regexp pour définir les débuts des IP correspondantes) - zones_reverse = sre.compile('^138\.231\.1(3[6-9]|4[0-9]|5[01])') # 138.231.136.0 à 138.231.151.255 + # Résolution inverse + zones_reverse = [ '138.231.136.0/21', '138.231.148.0/22' ] ### Liste DNS # Le premier est doit être le maitre @@ -64,14 +60,22 @@ $TTL 86400 ) """ - # Syntaxe utilisée dans le fichier DNS_CONF pour définir une zone + # Syntaxe utilisée dans le fichier DNS_CONF pour définir une zone sur le maître zone_template=""" zone "%(NOM_zone)s" { type master; file "%(FICHIER_zone)s"; }; """ - + # Syntaxe utilisée dans le fichier DNS_CONF pour définir une zone sur le maître + zone_template_slave=""" +zone "%(NOM_zone)s" { + type slave; + file "%(FICHIER_zone)s"; + masters { 138.231.136.6; }; +}; +""" + ### Verbosité # Si =1 ralera (chaine warnings) si machines hors zone trouvée # Si =0 ralera seulement contre les machines ne pouvant être classées @@ -83,6 +87,33 @@ zone "%(NOM_zone)s" { def __str__(self) : return "DNS" + def gen_slave(self) : + """ Génération du fichier de config de zone pour les esclaves """ + zones = self.zones_direct + + # Ajout des zones reverse + for net in self.zones_reverse : + print net + n = map(int,net.split('/')[0].split('.')[:3]) + print n + while 1 : + n[2] += 1 + print n + if not AddrInNet("%d.%d.%d.1" % tuple(n),net): + break + else : + n.reverse() + zones.append("%d.%d.%d.in-addr.arpa" % tuple(n)) + n.reverse() + + # Ecriture + fd = self._open_conf(self.DNS_CONF,'//') + for zone in zones : + fd.write(self.zone_template_slave % { 'NOM_zone' : zone, + 'FICHIER_zone' : self.DNS_DIR + 'db.' + zone }) + + fd.close() + def _gen(self) : ### Génération du numéro de série # Le + 1000.... s'explique pas l'idée précédente et peu pratique d'avoir @@ -149,7 +180,7 @@ zone "%(NOM_zone)s" { try : direct[zone] += ligne except : direct[zone] = ligne # Le reverse - if self.zones_reverse.match(machine.ip()) : + if AddrInNets(machine.ip(), self.zones_reverse) : base_ip = machine.ip().split('.') base_ip.reverse() zone = "%s.%s.%s.in-addr.arpa" % tuple(base_ip[1:]) @@ -184,3 +215,13 @@ zone "%(NOM_zone)s" { fd.close() return warnings + + +if __name__ == '__main__' : + from socket import gethostname + if gethostname().split(".")[0] == 'zamok' : + print "Ce serveur est maître !, utiliser generate." + else : + print "Reconfiguration de bind en esclave (penser à le relancer)." + c = dns() + c.gen_slave()