[bind.py] Possibilité de déclarer des zones signé par opendnssec.

Ignore-this: 68a00379301354ac38bc7e1a6a2d370b

darcs-hash:20130110235501-3a55a-66368702a1203be2e123d99709ebdbf3d2cc430e.gz
This commit is contained in:
Valentin Samir 2013-01-11 00:55:01 +01:00
parent d05bebea62
commit 73bd82682e

View file

@ -6,7 +6,7 @@
Copyright (C) Frédéric Pauget
Licence : GPLv2
"""
import time, sys
import time, sys, re
sys.path.append('/usr/scripts/gestion')
from socket import gethostname
from gen_confs import gen_config
@ -40,6 +40,7 @@ la base LDAP
### Fichiers à écrire
# Répertoire d'écriture des fichiers de zone
DNS_DIR = '/etc/bind/generated/' # Avec un / à la fin
DNSSEC_DIR = '/etc/bind/signed/' # Avec un / à la fin
# Fichier de définition des zones pour le maître
DNS_CONF = DNS_DIR + 'zones_crans'
@ -50,8 +51,11 @@ la base LDAP
## En cas de modification de ces zones penser à regéner le fichier de
## zone des esclaves (sur le serveur principal de bcfg2 : python /usr/scripts/gestion/gen_confs/bind.py puis lancer bcfg2 sur les miroirs)
# Résolution directe
zones_direct = [ 'crans.org', 'crans.ens-cachan.fr', 'wifi.crans.org', 'ferme.crans.org' , 'clubs.ens-cachan.fr', 'adm.crans.org' ]
zones_direct = [ 'crans.org', 'crans.ens-cachan.fr', 'wifi.crans.org', 'ferme.crans.org' , 'clubs.ens-cachan.fr', 'adm.crans.org','crans.eu','wifi.crans.eu' ]
zones_dnssec = ['crans.eu','wifi.crans.eu','v6.crans.eu','wifi.v6.crans.eu']
zones_v4_to_v6 = {
'wifi.crans.eu': 'wifi.v6.crans.eu',
'crans.eu': 'v6.crans.eu',
'crans.org': 'v6.crans.org',
'wifi.crans.org': 'wifi.v6.crans.org',
'adm.crans.org': 'adm.v6.crans.org',
@ -60,6 +64,7 @@ la base LDAP
# Résolution inverse
zones_reverse = config.NETs["all"] + config.NETs["adm"] + config.NETs["personnel-ens"]
zones_v6_to_net = {
'crans.eu': config.prefix["fil"][0],
'crans.org': config.prefix["fil"][0],
'wifi.crans.org': config.prefix["wifi"][0],
'adm.crans.org': config.prefix["adm"][0],
@ -76,18 +81,27 @@ la base LDAP
### 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 noms des serveurs on met l'IP sans point ou le nom avec un point
DELEG = { 'tv.crans.org' : ['charybde.crans.org.' , 'freebox.crans.org.', 'sable.crans.org.' , 'mdr.crans.org.'] }
DELEG = {
'tv.crans.org' : ['charybde.crans.org.' , 'freebox.crans.org.', 'sable.crans.org.' , 'mdr.crans.org.'] ,
}
### Serveurs de mail
# format : [ priorité serveur , .... ]
MXs = ['10 redisdead.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-client._tcp.crans.org. 86400 IN SRV 5 0 5222 xmpp.crans.org.',
'_sip._udp.crans.org. 86400 IN SRV 5 0 5060 asterisk.crans.org.',
'_sip._tcp.crans.org. 86400 IN SRV 5 0 5060 asterisk.crans.org.',
'_sips._tcp.crans.org. 86400 IN SRV 5 0 5061 asterisk.crans.org.',
]
# DS à publier dans zone parentes : { parent : [ zone. TTL IN DS key_id algo_id 1 hash ] }
# ex : { 'crans.eu' : ['wifi.crans.eu. 86400 IN DS 33131 8 1 3B573B0E2712D8A8B1B0C3'] }
# /!\ Il faut faire attention au rollback des keys, il faudrait faire quelque chose d'automatique avec opendnssec
DS = {}
### Entète des fichiers de zone
zone_entete="""
@ -124,7 +138,12 @@ zone "%(NOM_zone)s" {
# Si =0, ralera seulement contre les machines ne pouvant être classées
verbose = 1
restart_cmd = '/etc/init.d/bind9 reload'
hostname = short_name(gethostname())
if hostname == short_name(DNSs[0]):
restart_cmd = '/usr/sbin/ods-signer sign --all && /etc/init.d/bind9 reload'
else:
restart_cmd = '/etc/init.d/bind9 reload'
######################################FIN PARTIE DE CONFIGURATION
def __str__(self) :
@ -184,8 +203,12 @@ zone "%(NOM_zone)s" {
# Ecriture
fd = self._open_conf(self.DNS_CONF_BCFG2,'//')
for zone in zones :
if zone in self.zones_dnssec:
path=self.DNSSEC_DIR + 'db.' + zone
else:
path=self.DNS_DIR + 'db.' + zone
fd.write(self.zone_template_slave % { 'NOM_zone' : zone,
'FICHIER_zone' : self.DNS_DIR + 'db.' + zone,
'FICHIER_zone' : path,
'ip_master_DNS': self.ip_master_DNS})
fd.close()
@ -235,6 +258,12 @@ zone "%(NOM_zone)s" {
direct['crans.org'] += s + '\n'
direct['crans.org'] += '\n'
### Ajout d'eventuel champs DS pour les délégation dnssec
for zone,ds in self.DS:
for s in ds:
direct[zone] += s + '\n'
direct[zone] += '\n'
### Tri des machines
self.anim.iter=len(self.machines)
for machine in self.machines :
@ -349,10 +378,21 @@ zone "%(NOM_zone)s" {
for serv in self.DELEG[deleg]:
direct[zone] = direct[zone] + "%s\tIN\tNS\t%s\n" % ( nom, serv )
### aliasing pour crans.eu
direct['crans.eu']=re.sub('crans.org','crans.eu',direct['crans.org'])
direct['wifi.crans.eu']=re.sub('crans.org','crans.eu',direct['wifi.crans.org'])
direct[self.zones_v4_to_v6['crans.eu']]=re.sub('crans.org','crans.eu',direct[self.zones_v4_to_v6['crans.org']])
direct[self.zones_v4_to_v6['wifi.crans.eu']]=re.sub('crans.org','crans.eu',direct[self.zones_v4_to_v6['wifi.crans.org']])
### Ecriture des fichiers de zone et préparation du fichier de définition
f = ''
for zone, lignes in direct.items() + reverse.items() :
file = self.DNS_DIR + 'db.' + zone
if zone in self.zones_dnssec:
path = self.DNSSEC_DIR + 'db.' + zone
else:
path = self.DNS_DIR + 'db.' + zone
file = self.DNS_DIR + 'db.' + zone
fd = self._open_conf(file,';')
fd.write(self.zone_entete % \
{ 'zone' : zone, 'serveur_autoritaire' : self.DNSs[0] , 'serial' : serial } )
@ -361,10 +401,10 @@ zone "%(NOM_zone)s" {
fd.write(lignes)
fd.close()
if short_name(gethostname()) in map(short_name, dns.DNSs[1:]):
f += self.zone_template_slave % {'NOM_zone': zone, 'FICHIER_zone': file,
f += self.zone_template_slave % {'NOM_zone': zone, 'FICHIER_zone': path,
'ip_master_DNS': self.ip_master_DNS}
else:
f += self.zone_template % { 'NOM_zone' : zone, 'FICHIER_zone' : file }
f += self.zone_template % { 'NOM_zone' : zone, 'FICHIER_zone' : path }
### Ecriture fichier de définition
fd = self._open_conf(self.DNS_CONF,'//')