Import initial !
darcs-hash:20040831131446-d1718-0734aa73d3b8481b3b4b861e447e85128e488e8a.gz
This commit is contained in:
parent
c9083dfd86
commit
6626a44f15
20 changed files with 6494 additions and 0 deletions
186
gestion/gen_confs/bind.py
Executable file
186
gestion/gen_confs/bind.py
Executable file
|
@ -0,0 +1,186 @@
|
|||
#! /usr/bin/env python
|
||||
# -*- coding: iso-8859-15 -*-
|
||||
|
||||
""" Génération de la configuration pour bind9
|
||||
|
||||
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
|
||||
from gen_confs import gen_config
|
||||
|
||||
class dns(gen_config) :
|
||||
"""
|
||||
Génération des fichiers de configuration de bind9 :
|
||||
* fichier DNS_CONF qui contient les définitions de zone conformément
|
||||
à zone_template. Ce fichier doit être inclus à partir de la config statique
|
||||
de bind
|
||||
* 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
|
||||
Leur entète est générée à partir de zone_entete.
|
||||
|
||||
Les fichiers générés placent bind comme autoritaire sur les noms de
|
||||
zones_direct et les adresses de zones_reverse. Les données proviennent de
|
||||
la base LDAP
|
||||
"""
|
||||
######################################PARTIE DE CONFIGURATION
|
||||
|
||||
### 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
|
||||
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' ]
|
||||
# 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
|
||||
|
||||
### Liste DNS
|
||||
# Le premier est doit être le maitre
|
||||
DNSs = [ 'zamok.crans.org' , 'sila.crans.org' , 'freebox.crans.org' ]
|
||||
|
||||
### Serveurs de mail
|
||||
# format : [ priorité serveur , .... ]
|
||||
MXs = ['10 zamok.crans.org', '20 freebox.crans.org' ]
|
||||
|
||||
### Entète des fichiers de zone
|
||||
zone_entete="""
|
||||
$ORIGIN %(zone)s.
|
||||
$TTL 86400
|
||||
@\tIN\tSOA zamok.crans.org. root.crans.org. (
|
||||
%(serial)i ; numero de serie
|
||||
21600 ; refresh (s)
|
||||
3600 ; retry (s)
|
||||
1209600 ; expire (s)
|
||||
86400 ; TTL (s)
|
||||
)
|
||||
"""
|
||||
|
||||
# Syntaxe utilisée dans le fichier DNS_CONF pour définir une zone
|
||||
zone_template="""
|
||||
zone "%(NOM_zone)s" {
|
||||
type master;
|
||||
file "%(FICHIER_zone)s";
|
||||
};
|
||||
"""
|
||||
|
||||
### Verbosité
|
||||
# Si =1 ralera (chaine warnings) si machines hors zone trouvée
|
||||
# Si =0 ralera seulement contre les machines ne pouvant être classées
|
||||
verbose = 1
|
||||
|
||||
restart_cmd = '/etc/init.d/bind9 reload'
|
||||
######################################FIN PARTIE DE CONFIGURATION
|
||||
|
||||
def __str__(self) :
|
||||
return "DNS"
|
||||
|
||||
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
|
||||
# le numéro de série du type AAAAMMJJNN (année, mois, jour, incrément par jour)
|
||||
serial = time.time() + 1000000000
|
||||
|
||||
### DNS
|
||||
DNS='; DNS de la zone par ordre de priorité\n'
|
||||
for d in self.DNSs :
|
||||
DNS += '@\tIN\tNS %s.\n' % d
|
||||
DNS += '\n'
|
||||
|
||||
### Serveurs de mail
|
||||
MX='; Serveurs de mails\n'
|
||||
for m in self.MXs :
|
||||
MX += '%(zone)s.\t' # Sera remplacé par le nom de zone plus tard
|
||||
MX += 'IN\tMX\t%s.\n' % m
|
||||
MX += '\n'
|
||||
|
||||
### Tri des machines
|
||||
direct = {} # format : { zone : [ lignes correspondantes] }
|
||||
reverse = {}
|
||||
warnings = ''
|
||||
|
||||
self.anim.iter=len(self.machines)
|
||||
for machine in self.machines :
|
||||
self.anim.cycle()
|
||||
|
||||
# Calculs préliminaires
|
||||
try :
|
||||
nom , zone = machine.nom().split('.',1)
|
||||
zone = zone.encode('iso-8859-1')
|
||||
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') )
|
||||
continue
|
||||
|
||||
# Le direct
|
||||
if zone in self.zones_direct :
|
||||
ligne = "%s\tIN\tA\t%s\n" % ( nom, machine.ip() )
|
||||
try : direct[zone] += ligne
|
||||
except : direct[zone] = ligne
|
||||
elif self.verbose :
|
||||
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
|
||||
for alias in machine.alias() :
|
||||
# Bon format ?
|
||||
alias_l = alias.split('.')
|
||||
ok = 0
|
||||
for i in range(len(alias_l)) :
|
||||
zone_essai = '.'.join(alias_l[i:])
|
||||
if zone_essai in self.zones_direct :
|
||||
# On est autoritaire sur cette zone
|
||||
# On place donc l'alias dans le fichier de cette zone
|
||||
zone = zone_essai
|
||||
nom = '.'.join(alias_l[:i])
|
||||
ok = 1
|
||||
break
|
||||
if not ok :
|
||||
warnings += u'Alias ignoré (mid=%s) : %s\n' % ( machine.id().encode('iso-8859-1'), alias.encode('iso-8859-1') )
|
||||
continue
|
||||
zone = zone.encode('iso-8859-1')
|
||||
ligne = "%s\tIN\tCNAME\t%s.\n" % ( nom, machine.nom() )
|
||||
try : direct[zone] += ligne
|
||||
except : direct[zone] = ligne
|
||||
# Le reverse
|
||||
if self.zones_reverse.match(machine.ip()) :
|
||||
base_ip = machine.ip().split('.')
|
||||
base_ip.reverse()
|
||||
zone = "%s.%s.%s.in-addr.arpa" % tuple(base_ip[1:])
|
||||
zone = zone.encode('iso-8859-1')
|
||||
ligne = '%s\tIN\tPTR\t%s.\n' % (base_ip[0],machine.nom())
|
||||
try : reverse[zone] += ligne
|
||||
except : reverse[zone] = ligne
|
||||
elif self.verbose :
|
||||
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
|
||||
for zone in direct.keys() :
|
||||
# MXs
|
||||
direct[zone] = MX % { 'zone' : zone } + direct[zone]
|
||||
|
||||
### 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
|
||||
fd = self._open_conf(file,';')
|
||||
fd.write(self.zone_entete % \
|
||||
{ 'zone' : zone, 'serveur_autoritaire' : self.DNSs[0] , 'serial' : serial } )
|
||||
fd.write('\n')
|
||||
fd.write(DNS)
|
||||
fd.write(lignes)
|
||||
fd.close()
|
||||
f += self.zone_template % { 'NOM_zone' : zone, 'FICHIER_zone' : file }
|
||||
|
||||
### Ecriture fichier de définition
|
||||
fd = self._open_conf(self.DNS_CONF,'//')
|
||||
fd.write(f)
|
||||
fd.close()
|
||||
|
||||
return warnings
|
Loading…
Add table
Add a link
Reference in a new issue