[gen_confs/bind.py] suppression des trailing whitespaces

Ignore-this: d949a371de6c74856513bbd0eb66077

darcs-hash:20090325150835-bd074-8172df6956d1066c38d75be76b8b0f23416f5ba1.gz
This commit is contained in:
Antoine Durand-Gasselin 2009-03-25 16:08:35 +01:00
parent 1f2319b3e6
commit 225050344f

View file

@ -1,7 +1,7 @@
#! /usr/bin/env python #! /usr/bin/env python
# -*- coding: iso-8859-15 -*- # -*- coding: iso-8859-15 -*-
""" Génération de la configuration pour bind9 """ Génération de la configuration pour bind9
Copyright (C) Frédéric Pauget Copyright (C) Frédéric Pauget
Licence : GPLv2 Licence : GPLv2
@ -12,12 +12,12 @@ from gen_confs import gen_config
from iptools import AddrInNet, AddrInNets from iptools import AddrInNet, AddrInNets
class dns(gen_config) : class dns(gen_config) :
""" """
Génération des fichiers de configuration de bind9 : Génération des fichiers de configuration de bind9 :
* fichier DNS_CONF qui contient les définitions de zone conformément * fichier DNS_CONF qui contient les définitions de zone conformément
à zone_template. Ce fichier doit être inclus à partir de la config statique à zone_template. Ce fichier doit être inclus à partir de la config statique
de bind de bind
* les fichiers de zones, ce sont eux qui contiennent les données du * les fichiers de zones, ce sont eux qui contiennent les données du
dns, ils ont appellés par le fichier DNS_CONF et sont générés dans DNS_DIR dns, ils ont appellés par le fichier DNS_CONF et sont générés dans DNS_DIR
Leur entète est générée à partir de zone_entete. Leur entète est générée à partir de zone_entete.
@ -26,7 +26,7 @@ zones_direct et les adresses de zones_reverse. Les donn
la base LDAP la base LDAP
""" """
######################################PARTIE DE CONFIGURATION ######################################PARTIE DE CONFIGURATION
### Fichiers à écrire ### Fichiers à écrire
# Répertoire d'écriture des fichiers de zone # Répertoire d'écriture des fichiers de zone
DNS_DIR = '/etc/bind/generated/' # Avec un / à la fin DNS_DIR = '/etc/bind/generated/' # Avec un / à la fin
@ -49,32 +49,32 @@ la base LDAP
DNSs = [ 'rouge.crans.org' , 'sila.crans.org' , 'freebox.crans.org' , 'ovh.crans.org' , 'sable.crans.org' ] DNSs = [ 'rouge.crans.org' , 'sila.crans.org' , 'freebox.crans.org' , 'ovh.crans.org' , 'sable.crans.org' ]
DNSs_private = ['vert.adm.crans.org'] DNSs_private = ['vert.adm.crans.org']
ip_master_DNS = "10.231.136.3" ip_master_DNS = "10.231.136.3"
### Liste des délégations de zone ### Liste des délégations de zone
# Pour les demandes de ces zones, le DNS dira d'aller voir les serveurs listés ici # Pour les demandes de ces zones, le DNS dira d'aller voir les serveurs listés ici
# Pour les noms des serveurs on met l'IP sans point ou le nom avec un point # Pour les noms des serveurs on met l'IP sans point ou le nom avec un point
DELEG = { 'tv.crans.org' : ['rouge.crans.org.' , 'sila.crans.org.' , 'freebox.crans.org.', 'sable.crans.org' , 'mdr.crans.org.'] } DELEG = { 'tv.crans.org' : ['rouge.crans.org.' , 'sila.crans.org.' , 'freebox.crans.org.', 'sable.crans.org' , 'mdr.crans.org.'] }
### Serveurs de mail ### Serveurs de mail
# format : [ priorité serveur , .... ] # format : [ priorité serveur , .... ]
MXs = ['10 rouge.crans.org', '20 ovh.crans.org', '20 freebox.crans.org'] MXs = ['10 rouge.crans.org', '20 ovh.crans.org', '20 freebox.crans.org']
SRVs = ['_jabber._tcp.crans.org. 86400 IN SRV 5 0 5269 xmpp.crans.org.', SRVs = ['_jabber._tcp.crans.org. 86400 IN SRV 5 0 5269 xmpp.crans.org.',
'_xmpp-server._tcp.crans.org. 86400 IN SRV 5 0 5269 xmpp.crans.org.', '_xmpp-server._tcp.crans.org. 86400 IN SRV 5 0 5269 xmpp.crans.org.',
'_xmpp-client._tcp.crans.org. 86400 IN SRV 5 0 5222 xmpp.crans.org.'] '_xmpp-client._tcp.crans.org. 86400 IN SRV 5 0 5222 xmpp.crans.org.']
### Entète des fichiers de zone ### Entète des fichiers de zone
zone_entete=""" zone_entete="""
$ORIGIN %(zone)s. $ORIGIN %(zone)s.
$TTL 86400 $TTL 86400
@\tIN\tSOA rouge.crans.org. root.crans.org. ( @\tIN\tSOA rouge.crans.org. root.crans.org. (
%(serial)i ; numero de serie %(serial)i ; numero de serie
21600 ; refresh (s) 21600 ; refresh (s)
3600 ; retry (s) 3600 ; retry (s)
1209600 ; expire (s) 1209600 ; expire (s)
86400 ; TTL (s) 86400 ; TTL (s)
) )
""" """
# Syntaxe utilisée dans le fichier DNS_CONF pour définir une zone sur le maître # Syntaxe utilisée dans le fichier DNS_CONF pour définir une zone sur le maître
zone_template=""" zone_template="""
zone "%(NOM_zone)s" { zone "%(NOM_zone)s" {
@ -96,17 +96,17 @@ zone "%(NOM_zone)s" {
# Si =1, comme ci-dessus, mais ne ralera pas pour freebox # Si =1, comme ci-dessus, mais ne ralera pas pour freebox
# Si =0, ralera seulement contre les machines ne pouvant être classées # Si =0, ralera seulement contre les machines ne pouvant être classées
verbose = 1 verbose = 1
restart_cmd = '/etc/init.d/bind9 reload' restart_cmd = '/etc/init.d/bind9 reload'
######################################FIN PARTIE DE CONFIGURATION ######################################FIN PARTIE DE CONFIGURATION
def __str__(self) : def __str__(self) :
return "DNS" return "DNS"
def gen_slave(self) : def gen_slave(self) :
""" Génération du fichier de config de zone pour les esclaves """ """ Génération du fichier de config de zone pour les esclaves """
zones = self.zones_direct zones = self.zones_direct
# Ajout des zones reverse # Ajout des zones reverse
for net in self.zones_reverse : for net in self.zones_reverse :
n = map(int,net.split('/')[0].split('.')[:3]) n = map(int,net.split('/')[0].split('.')[:3])
@ -118,35 +118,35 @@ zone "%(NOM_zone)s" {
zones.append("%d.%d.%d.in-addr.arpa" % tuple(n)) zones.append("%d.%d.%d.in-addr.arpa" % tuple(n))
n.reverse() n.reverse()
n[2] += 1 n[2] += 1
# Ecriture # Ecriture
fd = self._open_conf(self.DNS_CONF_BCFG2,'//') fd = self._open_conf(self.DNS_CONF_BCFG2,'//')
for zone in zones : for zone in zones :
fd.write(self.zone_template_slave % { 'NOM_zone' : zone, fd.write(self.zone_template_slave % { 'NOM_zone' : zone,
'FICHIER_zone' : self.DNS_DIR + 'db.' + zone, 'FICHIER_zone' : self.DNS_DIR + 'db.' + zone,
'ip_master_DNS': self.ip_master_DNS}) 'ip_master_DNS': self.ip_master_DNS})
fd.close() fd.close()
def _gen(self) : def _gen(self) :
### Génération du numéro de série ### 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 # Le + 1000.... s'explique pas l'idée précédente et peu pratique d'avoir
# le numéro de série du type AAAAMMJJNN (année, mois, jour, incrément par jour) # le numéro de série du type AAAAMMJJNN (année, mois, jour, incrément par jour)
serial = time.time() + 1000000000 serial = time.time() + 1000000000
### DNS ### DNS
DNS='; DNS de la zone par ordre de priorité\n' DNS='; DNS de la zone par ordre de priorité\n'
for d in self.DNSs : for d in self.DNSs :
DNS += '@\tIN\tNS %s.\n' % d DNS += '@\tIN\tNS %s.\n' % d
DNS += '\n' DNS += '\n'
### Serveurs de mail ### Serveurs de mail
MX='; Serveurs de mails\n' MX='; Serveurs de mails\n'
for m in self.MXs : for m in self.MXs :
MX += '%(zone)s.\t' # Sera remplacé par le nom de zone plus tard MX += '%(zone)s.\t' # Sera remplacé par le nom de zone plus tard
MX += 'IN\tMX\t%s.\n' % m MX += 'IN\tMX\t%s.\n' % m
MX += '\n' MX += '\n'
direct = {} # format : { zone : [ lignes correspondantes] } direct = {} # format : { zone : [ lignes correspondantes] }
reverse = {} reverse = {}
warnings = '' warnings = ''
@ -166,7 +166,7 @@ zone "%(NOM_zone)s" {
direct['crans.ens-cachan.fr'] ='; Parametres SPF\n' direct['crans.ens-cachan.fr'] ='; Parametres SPF\n'
direct['crans.ens-cachan.fr'] +='crans.ens-cachan.fr.\tIN\tTXT\t"v=spf1 a:crans.org mx ?all"\n\n' direct['crans.ens-cachan.fr'] +='crans.ens-cachan.fr.\tIN\tTXT\t"v=spf1 a:crans.org mx ?all"\n\n'
### Ajout d'eventuels champs SRV ### Ajout d'eventuels champs SRV
direct['crans.org'] +='; Champs SRV\n' direct['crans.org'] +='; Champs SRV\n'
for s in self.SRVs: for s in self.SRVs:
@ -174,18 +174,18 @@ zone "%(NOM_zone)s" {
direct['crans.org'] += '\n' direct['crans.org'] += '\n'
### Tri des machines ### Tri des machines
self.anim.iter=len(self.machines) self.anim.iter=len(self.machines)
for machine in self.machines : for machine in self.machines :
self.anim.cycle() self.anim.cycle()
# Calculs préliminaires # Calculs préliminaires
try : try :
nom , zone = machine.nom().split('.',1) nom , zone = machine.nom().split('.',1)
zone = zone.encode('iso-8859-1') zone = zone.encode('iso-8859-1')
except : except :
warnings += u'Machine ignorée (mid=%s) : format nom incorrect (%s)\n' % ( machine.id().encode('iso-8859-1'), machine.nom().encode('iso-8859-1') ) warnings += u'Machine ignorée (mid=%s) : format nom incorrect (%s)\n' % ( machine.id().encode('iso-8859-1'), machine.nom().encode('iso-8859-1') )
continue continue
# Le direct # Le direct
if zone in self.zones_direct : if zone in self.zones_direct :
ligne = "%s\tIN\tA\t%s\n" % ( nom, machine.ip() ) ligne = "%s\tIN\tA\t%s\n" % ( nom, machine.ip() )
@ -193,7 +193,7 @@ zone "%(NOM_zone)s" {
except : direct[zone] = ligne except : direct[zone] = ligne
elif self.verbose and machine.nom() != "ftp.federez.net": elif self.verbose and machine.nom() != "ftp.federez.net":
warnings += u'Résolution directe ignorée (mid=%s) : zone non autoritaire (%s)\n' % ( machine.id().encode('iso-8859-1'), zone.encode('iso-8859-1') ) warnings += u'Résolution directe ignorée (mid=%s) : zone non autoritaire (%s)\n' % ( machine.id().encode('iso-8859-1'), zone.encode('iso-8859-1') )
# Le direct avec alias # Le direct avec alias
for alias in machine.alias() : for alias in machine.alias() :
# Cas particulier : nom de l'alias = nom de la zone # Cas particulier : nom de l'alias = nom de la zone
@ -204,7 +204,7 @@ zone "%(NOM_zone)s" {
try : direct[alias] += ligne try : direct[alias] += ligne
except : direct[alias] = ligne except : direct[alias] = ligne
continue continue
# Bon format ? # Bon format ?
alias_l = alias.split('.') alias_l = alias.split('.')
ok = 0 ok = 0
@ -224,7 +224,7 @@ zone "%(NOM_zone)s" {
ligne = "%s\tIN\tCNAME\t%s.\n" % ( nom, machine.nom() ) ligne = "%s\tIN\tCNAME\t%s.\n" % ( nom, machine.nom() )
try : direct[zone] += ligne try : direct[zone] += ligne
except : direct[zone] = ligne except : direct[zone] = ligne
# Le reverse # Le reverse
if AddrInNets(machine.ip(), self.zones_reverse) : if AddrInNets(machine.ip(), self.zones_reverse) :
base_ip = machine.ip().split('.') base_ip = machine.ip().split('.')
@ -236,12 +236,12 @@ zone "%(NOM_zone)s" {
except : reverse[zone] = ligne except : reverse[zone] = ligne
elif self.verbose >= 2 or machine.nom() not in ('freebox.crans.org', 'ovh.crans.org'): elif self.verbose >= 2 or machine.nom() not in ('freebox.crans.org', 'ovh.crans.org'):
warnings += u'Résolution inverse ignorée (mid=%s) : ip sur zone non autoritaire (%s)\n' % ( machine.id().encode('iso-8859-1'), machine.ip().encode('iso-8859-1') ) warnings += u'Résolution inverse ignorée (mid=%s) : ip sur zone non autoritaire (%s)\n' % ( machine.id().encode('iso-8859-1'), machine.ip().encode('iso-8859-1') )
### Ajouts pour les fichiers de résolution directs ### Ajouts pour les fichiers de résolution directs
for zone in direct.keys() : for zone in direct.keys() :
# MXs # MXs
direct[zone] = MX % { 'zone' : zone } + direct[zone] direct[zone] = MX % { 'zone' : zone } + direct[zone]
### Ajout des délégations de zones ### Ajout des délégations de zones
for deleg in self.DELEG.keys(): for deleg in self.DELEG.keys():
@ -251,7 +251,7 @@ zone "%(NOM_zone)s" {
continue continue
for serv in self.DELEG[deleg]: for serv in self.DELEG[deleg]:
direct[zone] = direct[zone] + "%s\tIN\tNS\t%s\n" % ( nom, serv ) direct[zone] = direct[zone] + "%s\tIN\tNS\t%s\n" % ( nom, serv )
### Ecriture des fichiers de zone et préparation du fichier de définition ### Ecriture des fichiers de zone et préparation du fichier de définition
f = '' f = ''
for zone, lignes in direct.items() + reverse.items() : for zone, lignes in direct.items() + reverse.items() :
@ -264,15 +264,15 @@ zone "%(NOM_zone)s" {
fd.write(lignes) fd.write(lignes)
fd.close() fd.close()
f += self.zone_template % { 'NOM_zone' : zone, 'FICHIER_zone' : file } f += self.zone_template % { 'NOM_zone' : zone, 'FICHIER_zone' : file }
### Ecriture fichier de définition ### Ecriture fichier de définition
fd = self._open_conf(self.DNS_CONF,'//') fd = self._open_conf(self.DNS_CONF,'//')
fd.write(f) fd.write(f)
fd.close() fd.close()
return warnings return warnings
if __name__ == '__main__' : if __name__ == '__main__' :
from socket import gethostname from socket import gethostname
from config import bcfg2_main from config import bcfg2_main
@ -290,6 +290,6 @@ if __name__ == '__main__' :
elif hostname in map(lambda fullhostname : short_name(fullhostname),dns.DNSs[1:]+dns.DNSs_private): elif hostname in map(lambda fullhostname : short_name(fullhostname),dns.DNSs[1:]+dns.DNSs_private):
print "Ce serveur est esclave! Lancez ce script sur %s, puis lancez bcfg2 ici" % bcfg2_main print "Ce serveur est esclave! Lancez ce script sur %s, puis lancez bcfg2 ici" % bcfg2_main
else: else:
print "Ce serveur ne correspond à rien pour la configuration DNS." print "Ce serveur ne correspond à rien pour la configuration DNS."