diff --git a/gestion/config/dns.py b/gestion/config/dns.py index 8f5627a9..2193ea17 100644 --- a/gestion/config/dns.py +++ b/gestion/config/dns.py @@ -23,6 +23,9 @@ master_tv = master #: DNS slaves de la zone tv slaves_tv = slaves +#: Zone tv +zone_tv = 'tv.crans.org' + #: DNS en connexion de secours secours_relay='10.231.136.14'; diff --git a/gestion/gen_confs/bind.py b/gestion/gen_confs/bind.py index 47824e40..e4876ad1 100755 --- a/gestion/gen_confs/bind.py +++ b/gestion/gen_confs/bind.py @@ -121,7 +121,7 @@ la base LDAP DNSs_private = [] ip_master_DNS = config.dns.master - zone_multicast = 'tv.crans.org' + zone_multicast = config.dns.zone_tv ### Liste des délégations de zone # 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) def gen_tv(self): - from unidecode import unidecode + sys.path.append('/usr/scripts') + import tv.dns serial = time.time() + 1000000000 zone_reverse=netv4_to_arpa(config.NETs['multicast'][0])[0] 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' for line in sap: [nom,ip]=line.split(':') - 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 - 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 + nom=unicode(nom, 'utf-8') + nom_ascii=tv.dns.ascii(nom) + nom_punycode=tv.dns.punycode(nom) try: [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_d +='%s\tIN\tA\t%s' % (nom_ascii,ip) - if nom: - lignes_d +='%s\tIN\tA\t%s' % (nom,ip) + if nom_punycode: + lignes_d +='%s\tIN\tA\t%s' % (nom_punycode, ip) except: - pass + raise # Écriture de la zone directe file = self.DNS_DIR + 'db.' + self.zone_multicast fd = self._open_conf(file,';') @@ -562,8 +555,8 @@ if __name__ == '__main__' : c.gen_slave() if hostname == short_name(dns.DNSs[0]): 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]): - print "Serveur maᅵtre pour tv.crans.org, génération de la zone" + 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" c = dns() c.gen_tv() import subprocess diff --git a/tv/dns.py b/tv/dns.py new file mode 100644 index 00000000..ca95789c --- /dev/null +++ b/tv/dns.py @@ -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)) diff --git a/wiki/macro/TV.py b/wiki/macro/TV.py index 3331d356..d4cd9b1a 100644 --- a/wiki/macro/TV.py +++ b/wiki/macro/TV.py @@ -1,3 +1,7 @@ +import sys +sys.path.append('/usr/scripts/') +import tv.dns +sys.path.pop() Dependencies = ["Time"] @@ -28,7 +32,7 @@ def get_channel_list(): for a_line in s: try: 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 = { "name": ch_name, "url": url,