[tv, dns] Mutualisation des noms de domaines

This commit is contained in:
Valentin Samir 2013-09-05 20:03:31 +02:00
parent 13995bfe92
commit 9131575122
4 changed files with 68 additions and 19 deletions

View file

@ -23,6 +23,9 @@ master_tv = master
#: DNS slaves de la zone tv #: DNS slaves de la zone tv
slaves_tv = slaves slaves_tv = slaves
#: Zone tv
zone_tv = 'tv.crans.org'
#: DNS en connexion de secours #: DNS en connexion de secours
secours_relay='10.231.136.14'; secours_relay='10.231.136.14';

View file

@ -121,7 +121,7 @@ la base LDAP
DNSs_private = [] DNSs_private = []
ip_master_DNS = config.dns.master ip_master_DNS = config.dns.master
zone_multicast = 'tv.crans.org' zone_multicast = config.dns.zone_tv
### 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
@ -235,7 +235,8 @@ zone "%(NOM_zone)s" {
return all(ord(c) < 128 for c in s) return all(ord(c) < 128 for c in s)
def gen_tv(self): def gen_tv(self):
from unidecode import unidecode sys.path.append('/usr/scripts')
import tv.dns
serial = time.time() + 1000000000 serial = time.time() + 1000000000
zone_reverse=netv4_to_arpa(config.NETs['multicast'][0])[0] zone_reverse=netv4_to_arpa(config.NETs['multicast'][0])[0]
sap=open('/usr/scripts/var/tv/sap.txt').readlines() sap=open('/usr/scripts/var/tv/sap.txt').readlines()
@ -250,25 +251,17 @@ zone "%(NOM_zone)s" {
lignes_d +='@\tIN\tA\t%s\n' % '138.231.136.88' lignes_d +='@\tIN\tA\t%s\n' % '138.231.136.88'
for line in sap: for line in sap:
[nom,ip]=line.split(':') [nom,ip]=line.split(':')
nom=re.sub('TNT([0-9]*) ','',nom) # on enlève les TNT## des noms nom=unicode(nom, 'utf-8')
nom=nom.replace('TNT%2lcn ','') # on enlève les TNT## des noms nom_ascii=tv.dns.ascii(nom)
nom=nom.replace('&','and') # on enlève les TNT## des noms nom_punycode=tv.dns.punycode(nom)
nom=re.sub(' +([^ ])','-\g<1>',nom) # on remplaces les espaces intérieur par un tiret
nom=re.sub('[ .():,"\'+<>]','',nom) # on enlève tous les caractères illégaux
nom=unicode(nom.lower(), 'utf-8')
nom_ascii=unidecode(nom)
if not self.is_ascii(nom):
nom="xn--%s" % nom.encode('punycode')
else:
nom=None
try: try:
[ip1,ip2,ip3,ip4]=ip.strip().split('.') [ip1,ip2,ip3,ip4]=ip.strip().split('.')
lignes_r += '%s.%s.%s\tIN\tPTR\t%s.%s.\n' % (ip4,ip3,ip2,nom_ascii,self.zone_multicast) lignes_r += '%s.%s.%s\tIN\tPTR\t%s.%s.\n' % (ip4,ip3,ip2,nom_ascii,self.zone_multicast)
lignes_d +='%s\tIN\tA\t%s' % (nom_ascii,ip) lignes_d +='%s\tIN\tA\t%s' % (nom_ascii,ip)
if nom: if nom_punycode:
lignes_d +='%s\tIN\tA\t%s' % (nom,ip) lignes_d +='%s\tIN\tA\t%s' % (nom_punycode, ip)
except: except:
pass raise
# Écriture de la zone directe # Écriture de la zone directe
file = self.DNS_DIR + 'db.' + self.zone_multicast file = self.DNS_DIR + 'db.' + self.zone_multicast
fd = self._open_conf(file,';') fd = self._open_conf(file,';')
@ -562,8 +555,8 @@ if __name__ == '__main__' :
c.gen_slave() c.gen_slave()
if hostname == short_name(dns.DNSs[0]): if hostname == short_name(dns.DNSs[0]):
print "Ce serveur est également serveur maitre, mais la reconfiguration du DNS maitre se fait par generate." print "Ce serveur est également serveur maitre, mais la reconfiguration du DNS maitre se fait par generate."
elif hostname == short_name(dns.DELEG['tv.crans.org'][0][0:-1]): elif hostname == short_name(dns.DELEG[config.dns.zone_tv][0][0:-1]):
print "Serveur maᅵtre pour tv.crans.org, génération de la zone" print "Serveur maître pour tv.crans.org, génération de la zone"
c = dns() c = dns()
c.gen_tv() c.gen_tv()
import subprocess import subprocess

49
tv/dns.py Normal file
View file

@ -0,0 +1,49 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
sys.path.append('/usr/scripts')
import re
from unidecode import unidecode
from gestion.config import dns
def is_ascii(s):
return all(ord(c) < 128 for c in s)
def _sanitize(nom):
nom=re.sub('TNT([0-9]*) ','',nom) # on enlève les TNT## des noms
nom=nom.replace('TNT%2lcn ','') # on enlève les TNT## des noms
nom=nom.replace('&','and') # on enlève les TNT## des noms
nom=re.sub(' +([^ ])','-\g<1>',nom) # on remplaces les espaces intérieur par un tiret
nom=re.sub('[ .():,"\'+<>]','',nom) # on enlève tous les caractères illégaux
return nom.lower()
def _fqdn(bool):
if bool:
return ".%s" % dns.zone_tv
else:
return ""
def _check_unicode(nom):
if not isinstance(nom, unicode):
raise UnicodeError("%r should by an unicode string" % nom)
def punycode(nom, fqdn=False):
_check_unicode(nom)
if is_ascii(nom):
return None
else:
return "xn--%s%s" % (_sanitize(nom).encode('punycode'), _fqdn(fqdn))
def ascii(nom, fqdn=False):
_check_unicode(nom)
return "%s%s" % (unidecode(_sanitize(nom)), _fqdn(fqdn))
def idn(nom, fqdn=False, charset='utf-8'):
_check_unicode(nom)
if charset:
return "%s%s" % (_sanitize(nom).encode(charset), _fqdn(fqdn))
else:
return u"%s%s" % (_sanitize(nom), _fqdn(fqdn))

View file

@ -1,3 +1,7 @@
import sys
sys.path.append('/usr/scripts/')
import tv.dns
sys.path.pop()
Dependencies = ["Time"] Dependencies = ["Time"]
@ -28,7 +32,7 @@ def get_channel_list():
for a_line in s: for a_line in s:
try: try:
ch_name, ch_ip = a_line.split(":") ch_name, ch_ip = a_line.split(":")
url = "udp://@%s:1234" % ch_ip url = unicode("udp://@%s:1234" % tv.dns.idn(unicode(ch_name, 'utf-8'), True), 'utf-8')
d = { d = {
"name": ch_name, "name": ch_name,
"url": url, "url": url,