diff --git a/gestion/gen_confs/bind2.py b/gestion/gen_confs/bind2.py index afccac3b..b85b20aa 100755 --- a/gestion/gen_confs/bind2.py +++ b/gestion/gen_confs/bind2.py @@ -15,6 +15,16 @@ from socket import gethostname from gestion import config import config.dns +disclamer = """//**************************************************************// +// Ce fichier est genere par les scripts de gen_confs // +// Les donnees proviennent de la base LDAP et de la conf // +// presente au debut du script. Il peut être propagé via bcfg2. // +// // +// NE PAS EDITER // +// // +//**************************************************************// +""" + def short_name(fullhostname): return fullhostname.split(".")[0] @@ -108,18 +118,7 @@ class ZoneBase(object): def __repr__(self): return "<%s %s>" % (self.__class__.__name__, self.zone_name) def __str__(self): - ret=""";*********************************************************** -; Ce fichier est genere par les scripts de gen_confs -; Les donnees proviennent de la base LDAP et de la conf -; presente au debut du script. -; -; NE PAS EDITER -; -;*********************************************************** - -$ORIGIN %s. -$TTL %s -""" % (self.zone_name, self.ttl) + ret="%s\n$ORIGIN %s.\n$TTL %s\n" % (disclamer.replace('//', ';'), self.zone_name, self.ttl) for rr in self._rrlist: ret+="%s\n" % rr return ret @@ -151,25 +150,31 @@ class ZoneClone(ZoneBase): if rr._name in ['', '@']: self.add(rr) if rr._name in ["%s." % self.zone_clone.zone_name]: - self.add(ResourceRecord(rr._type, "%s." % "%s.", rr._value)) + self.add(ResourceRecord(rr._type, "%s." % self.zone_name, rr._value)) class Zone(ZoneBase): - def __init__(self, zone_name, ttl, soa, ns_list, ipv6=True, ipv4=True, bl_zone=[]): + def __init__(self, zone_name, ttl, soa, ns_list, ipv6=True, ipv4=True, other_zones=[]): super(Zone, self).__init__(zone_name) self.ttl = ttl self.ipv4 = ipv4 self.ipv6 = ipv6 - self.bl_zone = bl_zone + self.other_zones = other_zones + self.subzones = [z for z in self.other_zones if z != self.zone_name and z.endswith(self.zone_name)] self.add(soa) for ns in ns_list: self.add(NS('@', '%s.' % ns)) + def name_in_subzone(self, hostname): + for zone in self.subzones: + if str(hostname).endswith(".%s" % zone): + return True + return False def get_name(self, hostname): # le hostname fini bien par la zone courante, et il n'appartient pas à une sous-zone - if str(hostname) == self.zone_name or str(hostname).endswith(".%s" % self.zone_name) and not reduce(lambda x,y: x or y, [str(hostname).endswith(".%s" % z) for z in self.bl_zone if z != self.zone_name and z.endswith(self.zone_name)] + [False]): + if str(hostname) == self.zone_name or str(hostname).endswith(".%s" % self.zone_name) and not self.name_in_subzone(hostname): ret=str(hostname)[0:- len(self.zone_name) -1] if ret == "": return "@" @@ -230,7 +235,7 @@ class Zone(ZoneBase): if machine['host']: for alias in machine.get('hostAlias', []): - if str(alias) in self.bl_zone and str(alias) != self.zone_name: + if str(alias) in self.other_zones and str(alias) != self.zone_name: continue alias = self.get_name(alias) if alias is None: continue @@ -387,7 +392,7 @@ class dns(gen_config) : def gen_zones_ldap(self, ttl, ns_list, serial, zones={}, zones_ldap=config.dns.zones_ldap): for zone in zones_ldap: - zones[zone]=Zone(zone, ttl, self.gen_soa(ns_list, serial, ttl), ns_list, bl_zone=config.dns.zones_direct) + zones[zone]=Zone(zone, ttl, self.gen_soa(ns_list, serial, ttl), ns_list, other_zones=config.dns.zones_direct) return zones def gen_zones_reverse(self, ttl, ns_list, serial, zones={}, @@ -466,6 +471,7 @@ zone "%(zone_name)s" { """ zones = self.gen_zones(self.TTL, self.serial, config.dns.DNSs) with open(self.DNS_CONF, 'w') as f: + f.write(disclamer) for zone in zones.values(): zone.write(self.DNS_DIR + 'db.' + zone.zone_name) if zone.zone_name in config.dns.zones_dnssec: @@ -484,6 +490,7 @@ zone "%(zone_name)s" { """ zones = self.gen_zones(self.TTL, self.serial, config.dns.DNSs, populate=False) with open(self.DNS_CONF_BCFG2, 'w') as f: + f.write(disclamer) for zone in zones.values(): if zone.zone_name in config.dns.zones_dnssec: zone_path = self.DNSSEC_DIR + 'db.' + zone.zone_name