[scripts] Going to utf-8
This commit is contained in:
parent
c4a19a88ed
commit
a1bf0a4547
54 changed files with 676 additions and 573 deletions
30
gestion/gen_confs/__init__.py
Executable file → Normal file
30
gestion/gen_confs/__init__.py
Executable file → Normal file
|
@ -1,9 +1,9 @@
|
|||
#! /usr/bin/env python
|
||||
# -*- coding: iso-8859-15 -*-
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
""" Package pour la génération des fichiers de conf
|
||||
""" Package pour la génération des fichiers de conf
|
||||
|
||||
Copyright (C) Frédéric Pauget
|
||||
Copyright (C) Frédéric Pauget
|
||||
Licence : GPLv2
|
||||
"""
|
||||
|
||||
|
@ -18,11 +18,11 @@ import config
|
|||
from tempfile import NamedTemporaryFile
|
||||
|
||||
class gen_config :
|
||||
""" Base pour toutes les classes de génération de fichiers de conf """
|
||||
""" Base pour toutes les classes de génération de fichiers de conf """
|
||||
base = None
|
||||
debug = 0
|
||||
_locked = 0
|
||||
__restore={} # pour restorer la config d'origine en cas d'erreur de génération
|
||||
__restore={} # pour restorer la config d'origine en cas d'erreur de génération
|
||||
|
||||
def lockname(self):
|
||||
"""Nom du lock"""
|
||||
|
@ -39,7 +39,7 @@ class gen_config :
|
|||
if self._locked : remove_lock(self.lockname())
|
||||
|
||||
def __del__(self) :
|
||||
# Au cas où...
|
||||
# Au cas où...
|
||||
self.unlock()
|
||||
|
||||
def _restore(self) :
|
||||
|
@ -54,12 +54,12 @@ class gen_config :
|
|||
os.system('cp -f %s %s' % ( f.name, nom ) )
|
||||
|
||||
def _open_conf(self,nom,comment=None) :
|
||||
""" Créé un fichier
|
||||
si comment est fourni, insère une entète qui utilisera le caractère
|
||||
""" Créé un fichier
|
||||
si comment est fourni, insère une entète qui utilisera le caractère
|
||||
de commentaire fourni
|
||||
|
||||
copie l'ancien fichier dans un fichier temporaire pour permettre
|
||||
la restauration en cas d'échec de la configuration
|
||||
la restauration en cas d'échec de la configuration
|
||||
|
||||
Retourne le descripteur du fichier """
|
||||
|
||||
|
@ -89,15 +89,15 @@ class gen_config :
|
|||
return fd
|
||||
|
||||
def gen_conf(self) :
|
||||
""" Génération des fichiers de conf, retourne False si erreur """
|
||||
""" Génération des fichiers de conf, retourne False si erreur """
|
||||
self.lock()
|
||||
self.anim = anim('\tgénération fichiers')
|
||||
self.anim = anim('\tgénération fichiers')
|
||||
try :
|
||||
warn = self._gen()
|
||||
if warn :
|
||||
self.anim.reinit()
|
||||
print WARNING
|
||||
if self.debug : sys.stderr.write(warn.encode("ISO-8859-15"))
|
||||
if self.debug : sys.stderr.write(warn.encode("UTF-8"))
|
||||
else :
|
||||
self.anim.reinit()
|
||||
print OK
|
||||
|
@ -110,7 +110,7 @@ class gen_config :
|
|||
return False
|
||||
|
||||
def restart(self) :
|
||||
""" Redémarrage du service concerné """
|
||||
""" Redémarrage du service concerné """
|
||||
if not self.restart_cmd : return
|
||||
self.lock()
|
||||
self.anim = anim('\trestart')
|
||||
|
@ -127,8 +127,8 @@ class gen_config :
|
|||
self.unlock()
|
||||
|
||||
def reconfigure(self) :
|
||||
""" Génère les fichiers puis redémarre le service
|
||||
si la génération c'est bien passée """
|
||||
""" Génère les fichiers puis redémarre le service
|
||||
si la génération c'est bien passée """
|
||||
cprint(u'Reconfiguration %s :' % self.__str__(), 'gras')
|
||||
if self.gen_conf() :
|
||||
return self.restart()
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#! /usr/bin/env python
|
||||
# -*- coding: iso-8859-15 -*-
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Copyright (C) Frédéric Pauget
|
||||
# Copyright (C) Frédéric Pauget
|
||||
# Licence : GPLv2
|
||||
|
||||
import smtplib, sys, commands, shutil, os, traceback
|
||||
|
@ -18,7 +18,7 @@ try:
|
|||
from Mailman.UserDesc import UserDesc
|
||||
from Mailman.Errors import MMAlreadyAMember
|
||||
except:
|
||||
# Machine sans mailman, les ML ne seront pas reconfigurées
|
||||
# Machine sans mailman, les ML ne seront pas reconfigurées
|
||||
pass
|
||||
|
||||
|
||||
|
@ -101,7 +101,7 @@ class home:
|
|||
self.args = args
|
||||
|
||||
def reconfigure(self):
|
||||
cprint(u'Création home', 'gras')
|
||||
cprint(u'Création home', 'gras')
|
||||
for args in self.args:
|
||||
anim('\t' + args)
|
||||
try:
|
||||
|
@ -116,11 +116,11 @@ class home:
|
|||
os.mkdir(home, 0755)
|
||||
os.chown(home, int(uid), config.gid)
|
||||
elif os.path.isdir(home):
|
||||
# Il y un répertoire existant
|
||||
# Il y un répertoire existant
|
||||
# Bon UID ?
|
||||
stat = os.stat(home)
|
||||
if stat[4] != int(uid) or stat[5] != config.gid:
|
||||
# Le home n'est pas pas à la bonne personne
|
||||
# Le home n'est pas pas à la bonne personne
|
||||
raise OSError('home existant')
|
||||
|
||||
### Quota
|
||||
|
@ -226,7 +226,7 @@ class ML_ens:
|
|||
try:
|
||||
mlist.ApprovedAddMember(UserDesc(mail))
|
||||
except MMAlreadyAMember:
|
||||
cprint(u"DÉJÀ INSCRIT", "jaune")
|
||||
cprint(u"DÉJÀ INSCRIT", "jaune")
|
||||
except:
|
||||
print ERREUR
|
||||
if self.debug:
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
#! /usr/bin/env python
|
||||
# -*- coding: iso-8859-15 -*-
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
""" 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
|
||||
"""
|
||||
import time, sys, re, hashlib, base64, os
|
||||
|
@ -56,36 +56,36 @@ def netv6_to_arpa(net):
|
|||
|
||||
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
|
||||
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 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
|
||||
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
|
||||
DNSSEC_DIR = '/etc/bind/signed/' # Avec un / à la fin
|
||||
# Fichier de définition des zones pour le maître
|
||||
### 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'
|
||||
|
||||
# Fichier de définition des zones pour les esclaves géré par BCfg2
|
||||
# Fichier de définition des zones pour les esclaves géré par BCfg2
|
||||
DNS_CONF_BCFG2 = "/var/lib/bcfg2/Cfg/etc/bind/generated/zones_crans/zones_crans"
|
||||
|
||||
### Sur quelles zones on a autorité ?
|
||||
## En cas de modification de ces zones penser à regéner le fichier de
|
||||
### Sur quelles zones on a autorité ?
|
||||
## 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
|
||||
# Résolution directe
|
||||
zones_direct = config.dns.zones_direct
|
||||
# Zones signée par opendnssec sur le serveur maitre
|
||||
# Zones signée par opendnssec sur le serveur maitre
|
||||
zones_dnssec = config.dns.zones_dnssec
|
||||
# Zones alias pour les enregistrement A AAAA CNAME TXT et SSHFP
|
||||
zone_alias = config.dns.zone_alias
|
||||
|
@ -97,7 +97,7 @@ la base LDAP
|
|||
'adm.crans.org': 'adm.v6.crans.org',
|
||||
'ferme.crans.org': 'ferme.v6.crans.org',
|
||||
}
|
||||
# Résolution inverse
|
||||
# Résolution inverse
|
||||
zones_reverse = config.dns.zones_reverse
|
||||
zones_v6_to_net = {
|
||||
'crans.eu': config.prefix["fil"][0],
|
||||
|
@ -105,26 +105,26 @@ la base LDAP
|
|||
'wifi.crans.org': config.prefix["wifi"][0],
|
||||
'adm.crans.org': config.prefix["adm"][0],
|
||||
'ferme.crans.org': config.prefix["fil"][0],
|
||||
# Hack pour générer un fichier de zone vide
|
||||
# Hack pour générer un fichier de zone vide
|
||||
'##HACK##': config.prefix["subnet"][0],
|
||||
}
|
||||
### Liste DNS
|
||||
# Le premier doit être le maitre
|
||||
# Le premier doit être le maitre
|
||||
DNSs = ['sable.crans.org', 'freebox.crans.org', 'ovh.crans.org']
|
||||
DNSs_private = []
|
||||
ip_master_DNS = config.dns.master
|
||||
|
||||
zone_multicast = 'tv.crans.org'
|
||||
|
||||
### Liste des délégations de zone
|
||||
# Pour les demandes de ces zones, le DNS dira d'aller voir les serveurs listés ici
|
||||
### 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 = {
|
||||
zone_multicast : [ 'sable.crans.org.' , 'mdr.crans.org.', 'freebox.crans.org.', 'ovh.crans.org.'] ,
|
||||
}
|
||||
|
||||
### Serveurs de mail
|
||||
# format : [ priorité serveur , .... ]
|
||||
# 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.',
|
||||
|
@ -135,7 +135,7 @@ la base LDAP
|
|||
'_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 ] }
|
||||
# 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 = {
|
||||
|
@ -161,7 +161,7 @@ la base LDAP
|
|||
}
|
||||
|
||||
|
||||
### Entète des fichiers de zone
|
||||
### Entète des fichiers de zone
|
||||
zone_entete="""
|
||||
$ORIGIN %(zone)s.
|
||||
$TTL 3600
|
||||
|
@ -174,14 +174,14 @@ $TTL 3600
|
|||
)
|
||||
"""
|
||||
|
||||
# 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 "%(NOM_zone)s" {
|
||||
type master;
|
||||
file "%(FICHIER_zone)s";
|
||||
};
|
||||
"""
|
||||
# Syntaxe utilisée dans le fichier DNS_CONF_BCFG2 pour définir une zone sur un esclave
|
||||
# Syntaxe utilisée dans le fichier DNS_CONF_BCFG2 pour définir une zone sur un esclave
|
||||
zone_template_slave="""
|
||||
zone "%(NOM_zone)s" {
|
||||
type slave;
|
||||
|
@ -190,10 +190,10 @@ zone "%(NOM_zone)s" {
|
|||
};
|
||||
"""
|
||||
|
||||
### Verbosité
|
||||
# Si =2, ralera (chaine warnings) si machines hors zone trouvée
|
||||
### Verbosité
|
||||
# Si =2, ralera (chaine warnings) si machines hors zone trouvée
|
||||
# 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
|
||||
|
||||
hostname = short_name(gethostname())
|
||||
|
@ -208,8 +208,8 @@ zone "%(NOM_zone)s" {
|
|||
return "DNS"
|
||||
|
||||
def reverse(self, net, ip):
|
||||
"""Renvoie la zone DNS inverse correspondant au réseau et à
|
||||
l'adresse donnés, ainsi que le nombre d'éléments de l'ip a
|
||||
"""Renvoie la zone DNS inverse correspondant au réseau et à
|
||||
l'adresse donnés, ainsi que le nombre d'éléments de l'ip a
|
||||
mettre dans le fichier de zone."""
|
||||
n = netaddr.IPNetwork(net)
|
||||
a = netaddr.IPAddress(ip)
|
||||
|
@ -228,7 +228,7 @@ zone "%(NOM_zone)s" {
|
|||
zone_reverse=netv4_to_arpa(config.NETs['multicast'][0])[0]
|
||||
sap=open('/tmp/chaines_recup_sap.txt').readlines()
|
||||
|
||||
DNS='; DNS de la zone par ordre de priorité\n'
|
||||
DNS='; DNS de la zone par ordre de priorité\n'
|
||||
for d in self.DELEG[self.zone_multicast] :
|
||||
DNS += '@\tIN\tNS %s\n' % d
|
||||
DNS += '\n'
|
||||
|
@ -238,9 +238,9 @@ zone "%(NOM_zone)s" {
|
|||
lignes_d +='@\tIN\tA\t%s\n' % '138.231.136.243'
|
||||
for line in sap:
|
||||
[nom,ip]=line.split(':')
|
||||
nom=re.sub('TNT([0-9]*) ','',nom) # 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=re.sub('TNT([0-9]*) ','',nom) # 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=nom.lower()
|
||||
try:
|
||||
[ip1,ip2,ip3,ip4]=ip.strip().split('.')
|
||||
|
@ -248,7 +248,7 @@ zone "%(NOM_zone)s" {
|
|||
lignes_d +='%s\tIN\tA\t%s' % (nom,ip)
|
||||
except:
|
||||
pass
|
||||
# Écriture de la zone directe
|
||||
# Écriture de la zone directe
|
||||
file = self.DNS_DIR + 'db.' + self.zone_multicast
|
||||
fd = self._open_conf(file,';')
|
||||
fd.write(self.zone_entete % \
|
||||
|
@ -258,7 +258,7 @@ zone "%(NOM_zone)s" {
|
|||
fd.write(lignes_d)
|
||||
fd.close()
|
||||
|
||||
# Écriture du reverse
|
||||
# Écriture du reverse
|
||||
file = self.DNS_DIR + 'db.' + zone_reverse
|
||||
fd = self._open_conf(file,';')
|
||||
fd.write(self.zone_entete % \
|
||||
|
@ -270,7 +270,7 @@ zone "%(NOM_zone)s" {
|
|||
|
||||
|
||||
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.extend(self.zones_v4_to_v6.values())
|
||||
|
||||
|
@ -297,13 +297,13 @@ zone "%(NOM_zone)s" {
|
|||
fd.close()
|
||||
|
||||
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)
|
||||
### 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'
|
||||
DNS='; DNS de la zone par ordre de priorité\n'
|
||||
for d in self.DNSs :
|
||||
DNS += '@\tIN\tNS %s.\n' % d
|
||||
DNS += '\n'
|
||||
|
@ -311,7 +311,7 @@ zone "%(NOM_zone)s" {
|
|||
### 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 += '%(zone)s.\t' # Sera remplacé par le nom de zone plus tard
|
||||
MX += 'IN\tMX\t%s.\n' % m
|
||||
MX += '\n'
|
||||
|
||||
|
@ -345,12 +345,12 @@ zone "%(NOM_zone)s" {
|
|||
self.anim.iter=len(self.machines)
|
||||
for machine in self.machines :
|
||||
self.anim.cycle()
|
||||
# Calculs préliminaires
|
||||
# Calculs préliminaires
|
||||
try :
|
||||
nom , zone = machine.nom().split('.',1)
|
||||
zone = zone.encode('iso-8859-1')
|
||||
zone = zone.encode('utf-8')
|
||||
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('utf-8'), machine.nom().encode('utf-8') )
|
||||
continue
|
||||
|
||||
# Le direct
|
||||
|
@ -359,7 +359,7 @@ zone "%(NOM_zone)s" {
|
|||
# Si la machine est une borne wifi, on ajoute la position
|
||||
if isinstance(machine,ldap_crans.BorneWifi) and machine.position():
|
||||
ligne +="%s\tIN\tTXT\t\"LOC %s,%s \"\n" % (nom,machine.position()[0],machine.position()[1])
|
||||
# Si la machine à des clefs ssh, on ajoute les champs SSFP correspondant
|
||||
# Si la machine à des clefs ssh, on ajoute les champs SSFP correspondant
|
||||
for sshkey in machine.sshFingerprint():
|
||||
try:
|
||||
[algo_txt,key]=sshkey.split()[:2]
|
||||
|
@ -378,7 +378,7 @@ zone "%(NOM_zone)s" {
|
|||
for alias in self.zone_alias[zone]:
|
||||
direct[alias] = direct.get(alias, "") + ligne
|
||||
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('utf-8'), zone.encode('utf-8') )
|
||||
|
||||
# IPv6
|
||||
if zone in self.zones_v4_to_v6:
|
||||
|
@ -406,23 +406,23 @@ zone "%(NOM_zone)s" {
|
|||
|
||||
# Le direct avec alias
|
||||
for alias in machine.alias() :
|
||||
alias = alias.encode('iso-8859-1')
|
||||
alias = alias.encode('utf-8')
|
||||
# Cas particulier : nom de l'alias = nom de la zone
|
||||
if alias in self.zones_direct :
|
||||
ligne = "@\tIN\tA\t%s\n" % machine.ip()
|
||||
ligne = ligne.encode('iso-8859-1')
|
||||
ligne = ligne.encode('utf-8')
|
||||
direct[alias] = direct.get(alias, "") + ligne
|
||||
if alias in self.zone_alias:
|
||||
for alias2 in self.zone_alias[alias]: direct[alias2] = direct.get(alias2, "") + ligne
|
||||
if machine.dnsIpv6():
|
||||
ligne = "@\tIN\tAAAA\t%s\n" % machine.ipv6()
|
||||
ligne = ligne.encode('iso-8859-1')
|
||||
ligne = ligne.encode('utf-8')
|
||||
direct[alias]= direct.get(alias, "") + ligne
|
||||
if alias in self.zone_alias:
|
||||
for alias2 in self.zone_alias[alias]: direct[alias2] = direct.get(alias2, "") + ligne
|
||||
if alias in self.zones_v4_to_v6:
|
||||
ligne = "@\tIN\tAAAA\t%s\n" % machine.ipv6()
|
||||
ligne = ligne.encode('iso-8859-1')
|
||||
ligne = ligne.encode('utf-8')
|
||||
zone6 = self.zones_v4_to_v6[alias]
|
||||
direct[zone6] = direct.get(zone6, '') + ligne
|
||||
if alias in self.zone_alias:
|
||||
|
@ -445,9 +445,9 @@ zone "%(NOM_zone)s" {
|
|||
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') )
|
||||
warnings += u'Alias ignoré (mid=%s) : %s\n' % ( machine.id().encode('utf-8'), alias.encode('utf-8') )
|
||||
continue
|
||||
zone = zone.encode('iso-8859-1')
|
||||
zone = zone.encode('utf-8')
|
||||
ligne = "%s\tIN\tCNAME\t%s.\n" % ( nom, machine.nom() )
|
||||
direct[zone] = direct.get(zone, '') + ligne
|
||||
if zone in self.zones_v4_to_v6:
|
||||
|
@ -468,40 +468,40 @@ zone "%(NOM_zone)s" {
|
|||
base_ip = ip.split('.')
|
||||
base_ip.reverse()
|
||||
zone, length = self.reverse(net, ip)
|
||||
zone = zone.encode('iso-8859-1')
|
||||
zone = zone.encode('utf-8')
|
||||
ligne = '%s\tIN\tPTR\t%s.\n' % ('.'.join(base_ip[:length]), machine.nom())
|
||||
try : reverse[zone] += ligne
|
||||
except : reverse[zone] = ligne
|
||||
elif self.verbose >= 2 or machine.nom() not in ('freebox.crans.org', 'ovh.crans.org', 'kokarde.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('utf-8'), machine.ip().encode('utf-8') )
|
||||
|
||||
### Ajouts pour les fichiers de résolution directs
|
||||
### Ajouts pour les fichiers de résolution directs
|
||||
for zone in direct.keys() :
|
||||
# MXs
|
||||
direct[zone] = MX % { 'zone' : zone } + direct[zone]
|
||||
|
||||
### XXX: création de la zone inverse pour le /48 IPv6 complet du Cr@ns
|
||||
### XXX: création de la zone inverse pour le /48 IPv6 complet du Cr@ns
|
||||
full_net_v6 = self.zones_v6_to_net["##HACK##"]
|
||||
zone_rev, length = self.reverse(full_net_v6, netaddr.IPNetwork(full_net_v6).first)
|
||||
reverse[zone_rev] = reverse.get(zone_rev, "")
|
||||
|
||||
### Ajout des délégations de zones
|
||||
### Ajout des délégations de zones
|
||||
for deleg in self.DELEG.keys():
|
||||
nom, zone = deleg.split('.',1)
|
||||
if not zone in direct.keys():
|
||||
warnings += u'Délégation ignorée %s : on ne génère pas la zone parent\n' % deleg
|
||||
warnings += u'Délégation ignorée %s : on ne génère pas la zone parent\n' % deleg
|
||||
continue
|
||||
for serv in self.DELEG[deleg]:
|
||||
direct[zone] = direct[zone] + "%s\tIN\tNS\t%s\n" % ( nom, serv )
|
||||
|
||||
|
||||
### Ajout d'eventuel champs DS pour les délégation dnssec
|
||||
### Ajout d'eventuel champs DS pour les délégation dnssec
|
||||
for zone,ds in self.DS.items():
|
||||
for s in ds:
|
||||
direct[zone] += s + '\n'
|
||||
direct[zone] += '\n'
|
||||
|
||||
### 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 = ''
|
||||
for zone, lignes in direct.items() + reverse.items() :
|
||||
if zone in self.zones_dnssec:
|
||||
|
@ -523,7 +523,7 @@ zone "%(NOM_zone)s" {
|
|||
else:
|
||||
f += self.zone_template % { 'NOM_zone' : zone, 'FICHIER_zone' : path }
|
||||
|
||||
### Ecriture fichier de définition
|
||||
### Ecriture fichier de définition
|
||||
fd = self._open_conf(self.DNS_CONF,'//')
|
||||
fd.write(f)
|
||||
fd.close()
|
||||
|
@ -535,13 +535,13 @@ if __name__ == '__main__' :
|
|||
from config import bcfg2_main
|
||||
hostname = short_name(gethostname())
|
||||
if hostname == short_name(bcfg2_main):
|
||||
print "Reconfiguration du fichier de BCfg2 pour configurer le bind d'un serveur en esclave (pensez à lancer bcfg2 sur les esclaves)."
|
||||
print "Reconfiguration du fichier de BCfg2 pour configurer le bind d'un serveur en esclave (pensez à lancer bcfg2 sur les esclaves)."
|
||||
c = dns()
|
||||
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."
|
||||
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"
|
||||
print "Serveur maᅵtre pour tv.crans.org, génération de la zone"
|
||||
c = dns()
|
||||
c.gen_tv()
|
||||
import subprocess
|
||||
|
@ -551,10 +551,10 @@ if __name__ == '__main__' :
|
|||
print ret[0].strip()
|
||||
print ret[1].strip()
|
||||
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.DNSs[0]):
|
||||
print "Ce serveur est maître ! Utilisez generate."
|
||||
print "Ce serveur est maître ! Utilisez generate."
|
||||
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
|
||||
else:
|
||||
print "Ce serveur ne correspond à rien pour la configuration DNS."
|
||||
print "Ce serveur ne correspond à rien pour la configuration DNS."
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
#! /usr/bin/env python
|
||||
# -*- coding: iso-8859-15 -*-
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
""" Génération de la configuration pour le dhcp
|
||||
""" Génération de la configuration pour le dhcp
|
||||
|
||||
Copyright (C) Frédéric Pauget
|
||||
Copyright (C) Frédéric Pauget
|
||||
Licence : GPLv2
|
||||
"""
|
||||
|
||||
|
@ -12,22 +12,22 @@ from gen_confs import gen_config
|
|||
from ldap_crans import hostname
|
||||
|
||||
class dhcp(gen_config) :
|
||||
""" Génération du fichier de configuration pour dhcpd (DHCPD_CONF)
|
||||
Le fichier comporte une partie par réseau servi, chaque réseau
|
||||
servi doit être une clef du dictionnaire reseaux, la valeur correspondante
|
||||
est une chaine décrivant les options spécifiques à ce réseau.
|
||||
""" Génération du fichier de configuration pour dhcpd (DHCPD_CONF)
|
||||
Le fichier comporte une partie par réseau servi, chaque réseau
|
||||
servi doit être une clef du dictionnaire reseaux, la valeur correspondante
|
||||
est une chaine décrivant les options spécifiques à ce réseau.
|
||||
Les options communes sont celles de base_dhcp.
|
||||
|
||||
Chaque machines possède ensuite une entrée de la forme de host_template
|
||||
Chaque machines possède ensuite une entrée de la forme de host_template
|
||||
"""
|
||||
######################################PARTIE DE CONFIGURATION
|
||||
# Fichier à écire
|
||||
# Fichier à écire
|
||||
if hostname == 'ragnarok' :
|
||||
DHCPD_CONF='/etc/dhcpd.conf'
|
||||
else :
|
||||
DHCPD_CONF = '/etc/dhcp3/dhcpd.conf'
|
||||
|
||||
# Hotspot ENS plus utilisé...
|
||||
# Hotspot ENS plus utilisé...
|
||||
# elif hostname == 'ragnarok' :
|
||||
# On rajoute les IP dynamiques
|
||||
# base_conf = """
|
||||
|
@ -47,7 +47,7 @@ class dhcp(gen_config) :
|
|||
#"""
|
||||
|
||||
elif hostname == 'sable':
|
||||
# Options communes à toutes les réseaux servis
|
||||
# Options communes à toutes les réseaux servis
|
||||
base_conf="""
|
||||
# VLan accueil
|
||||
subnet 10.51.0.0 netmask 255.255.0.0 {
|
||||
|
@ -68,7 +68,7 @@ subnet 10.52.0.0 netmask 255.255.0.0 {
|
|||
else :
|
||||
base_conf = ''
|
||||
|
||||
# Réseaux servis avec leurs options spécifiques
|
||||
# Réseaux servis avec leurs options spécifiques
|
||||
# if hostname == 'zamok':
|
||||
# reseaux = { '138.231.136.0/21' :
|
||||
#"""option routers 138.231.136.4;
|
||||
|
@ -110,7 +110,7 @@ subnet 10.52.0.0 netmask 255.255.0.0 {
|
|||
option routers 10.42.0.1;
|
||||
option domain-name-servers 10.42.0.1;""" }
|
||||
|
||||
# Options communes à toutes les réseaux servis
|
||||
# Options communes à toutes les réseaux servis
|
||||
base_dhcp="""
|
||||
subnet %(network)s netmask %(netmask)s {
|
||||
default-lease-time 86400;
|
||||
|
@ -153,9 +153,9 @@ subnet %(network)s netmask %(netmask)s {
|
|||
}
|
||||
"""
|
||||
|
||||
### Verbosité
|
||||
# Si =1 ralera (chaine warnings) si machines hors zone trouvée
|
||||
# Si =0 ralera seulement si réseau vide
|
||||
### Verbosité
|
||||
# Si =1 ralera (chaine warnings) si machines hors zone trouvée
|
||||
# Si =0 ralera seulement si réseau vide
|
||||
verbose = 1
|
||||
|
||||
# if hostname == 'zamok':
|
||||
|
@ -195,7 +195,7 @@ subnet %(network)s netmask %(netmask)s {
|
|||
fd.write(self.base_conf)
|
||||
for net, options in self.reseaux.items() :
|
||||
if not hosts.has_key(net) :
|
||||
warnings += u'Réseau %s ignoré : aucune machine à servir\n' % net
|
||||
warnings += u'Réseau %s ignoré : aucune machine à servir\n' % net
|
||||
continue
|
||||
d = param(net)
|
||||
d['OPTIONS_RESEAU'] = options
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
#! /usr/bin/env python
|
||||
# -*- coding: iso-8859-15 -*-
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
""" Génération de la configuration pour le dhcp
|
||||
""" Génération de la configuration pour le dhcp
|
||||
|
||||
Copyright (C) Frédéric Pauget
|
||||
Copyright (C) Frédéric Pauget
|
||||
Licence : GPLv2
|
||||
"""
|
||||
import os
|
||||
|
@ -63,15 +63,15 @@ class dydhcp:
|
|||
conn.close()
|
||||
|
||||
class dhcp(gen_config) :
|
||||
""" Génération du fichier de déclaration des hosts.
|
||||
Chaque réseau servi doit être une clef du dictionnaire reseaux,
|
||||
""" Génération du fichier de déclaration des hosts.
|
||||
Chaque réseau servi doit être une clef du dictionnaire reseaux,
|
||||
la valeur correspondante est une chaine contenant le nom du fichier
|
||||
associé à ce réseau.
|
||||
associé à ce réseau.
|
||||
|
||||
Chaque machine possède ensuite une entrée de la forme de host_template.
|
||||
Chaque machine possède ensuite une entrée de la forme de host_template.
|
||||
"""
|
||||
######################################PARTIE DE CONFIGURATION
|
||||
# Fichier à écire
|
||||
# Fichier à écire
|
||||
if hostname == 'sable':
|
||||
restart_cmd = '/etc/init.d/isc-dhcp-server restart'
|
||||
reseaux = { '138.231.136.0/21' : '/etc/dhcp3/generated/adherents.liste',
|
||||
|
@ -114,9 +114,9 @@ class dhcp(gen_config) :
|
|||
}
|
||||
"""
|
||||
|
||||
### Verbosité
|
||||
# Si =1 ralera (chaine warnings) si machines hors zone trouvée
|
||||
# Si =0 ralera seulement si réseau vide
|
||||
### Verbosité
|
||||
# Si =1 ralera (chaine warnings) si machines hors zone trouvée
|
||||
# Si =0 ralera seulement si réseau vide
|
||||
verbose = 1
|
||||
|
||||
######################################FIN PARTIE DE CONFIGURATION
|
||||
|
@ -145,7 +145,7 @@ class dhcp(gen_config) :
|
|||
|
||||
|
||||
def _gen(self) :
|
||||
"""Construction de la liste des machines appartenant à un réseau
|
||||
"""Construction de la liste des machines appartenant à un réseau
|
||||
"""
|
||||
|
||||
warnings = ''
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#! /usr/bin/env python
|
||||
# -*- coding: iso-8859-15 -*-
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Copyright (C) Frédéric Pauget
|
||||
# Copyright (C) Frédéric Pauget
|
||||
# Licence : GPLv2
|
||||
|
||||
#"""Ce script permet de lancer la reconfiguration des divers services
|
||||
|
@ -9,8 +9,8 @@
|
|||
#Usage: %(prog)s options
|
||||
#Les options possibles sont :
|
||||
#\t%(options)s
|
||||
#Les options avec = doivent être suivies d'un argument. Plusieurs
|
||||
#arguments peuvent être founis pour une même option, les séparer par &
|
||||
#Les options avec = doivent être suivies d'un argument. Plusieurs
|
||||
#arguments peuvent être founis pour une même option, les séparer par &
|
||||
#"""
|
||||
|
||||
import sys, signal, os, getopt
|
||||
|
@ -68,19 +68,19 @@ class base_reconfigure:
|
|||
|
||||
def __init__(self, to_do=None):
|
||||
|
||||
# On vérifie que l'on est root
|
||||
# On vérifie que l'on est root
|
||||
if os.getuid() != 0:
|
||||
sys.stderr.write("Il faut être root\n")
|
||||
sys.stderr.write("Il faut être root\n")
|
||||
sys.exit(1)
|
||||
|
||||
if not to_do:
|
||||
if debug:
|
||||
print 'Lecture des services à redémarrer dans la base LDAP...'
|
||||
print 'Lecture des services à redémarrer dans la base LDAP...'
|
||||
auto = True
|
||||
to_do = {}
|
||||
# Création de la liste de ce qu'il y a à faire
|
||||
# Création de la liste de ce qu'il y a à faire
|
||||
for serv in db.services_to_restart():
|
||||
# Services spéciaux portant sur plusieurs machines
|
||||
# Services spéciaux portant sur plusieurs machines
|
||||
to_add = self.__service_develop.get(serv.nom, [])
|
||||
if to_add:
|
||||
for nom in to_add:
|
||||
|
@ -97,13 +97,13 @@ class base_reconfigure:
|
|||
else:
|
||||
auto = False
|
||||
if debug:
|
||||
print 'Services à redémarrer imposés (non lecture de la base LDAP)'
|
||||
print 'Services à redémarrer imposés (non lecture de la base LDAP)'
|
||||
|
||||
for serv, args in to_do.items():
|
||||
# Au cas où le service porte sur plusieurs machines
|
||||
# Au cas où le service porte sur plusieurs machines
|
||||
service = serv.replace('%s-' % hostname, '')
|
||||
if hasattr(self, service):
|
||||
# Le service est à reconfigurer sur cette machine
|
||||
# Le service est à reconfigurer sur cette machine
|
||||
db.services_to_restart('-%s' % serv)
|
||||
try:
|
||||
m = getattr(self, service)
|
||||
|
@ -125,17 +125,17 @@ class base_reconfigure:
|
|||
if debug:
|
||||
reste = db.services_to_restart()
|
||||
if reste:
|
||||
print "Reste à faire :"
|
||||
print "Reste à faire :"
|
||||
for s in reste:
|
||||
try:
|
||||
print '\t%s' % s
|
||||
except UnicodeDecodeError:
|
||||
print '\t%s: non imprimable' % s.nom
|
||||
else:
|
||||
print "Plus rien à faire"
|
||||
print "Plus rien à faire"
|
||||
|
||||
def _machines(self):
|
||||
""" Retourne les machines de la base étant 'à jour' """
|
||||
""" Retourne les machines de la base étant 'à jour' """
|
||||
return db.all_machines(graphic=True)
|
||||
|
||||
def _do(self, service, machines=None):
|
||||
|
@ -180,8 +180,8 @@ class redisdead(base_reconfigure):
|
|||
|
||||
def mail_modif(self, trucs):
|
||||
"""
|
||||
trucs est une liste de recherches à effectuer dans la base
|
||||
l'affichage des résultats formera le corps du mail
|
||||
trucs est une liste de recherches à effectuer dans la base
|
||||
l'affichage des résultats formera le corps du mail
|
||||
"""
|
||||
from supervison import mail
|
||||
self._do(mail(trucs))
|
||||
|
@ -238,7 +238,7 @@ class zbee(base_reconfigure):
|
|||
|
||||
class komaz(base_reconfigure):
|
||||
|
||||
# Mimétisme de ma part -- xhub
|
||||
# Mimétisme de ma part -- xhub
|
||||
def __fw6(self):
|
||||
if not hasattr(self, '__real_fw6'):
|
||||
from firewall6 import Update
|
||||
|
@ -312,7 +312,7 @@ if __name__ == '__main__':
|
|||
classe = eval(hostname)
|
||||
|
||||
args_autorises = ['quiet', 'remove=', 'add=', 'list', 'help', 'reconnect']
|
||||
# Ajout aussi des arguments spécifiques à la machine
|
||||
# Ajout aussi des arguments spécifiques à la machine
|
||||
for nom in dir(classe):
|
||||
if nom[0] != '_':
|
||||
if len(getargspec(getattr(classe, nom))[0]) > 1:
|
||||
|
@ -330,7 +330,7 @@ if __name__ == '__main__':
|
|||
sys.stderr.write('%s\n' % msg)
|
||||
sys.exit(255)
|
||||
|
||||
debug = 1 # défaut
|
||||
debug = 1 # défaut
|
||||
to_do = {}
|
||||
|
||||
for opt, val in options:
|
||||
|
@ -344,7 +344,7 @@ if __name__ == '__main__':
|
|||
sys.exit(0)
|
||||
|
||||
elif opt == '--list':
|
||||
print 'Services à redémarrer :'
|
||||
print 'Services à redémarrer :'
|
||||
for s in db.services_to_restart():
|
||||
try:
|
||||
print '\t%s' % s
|
||||
|
@ -353,7 +353,7 @@ if __name__ == '__main__':
|
|||
sys.exit(0)
|
||||
|
||||
elif opt == '--reconnect':
|
||||
# Personnes à reconnecter
|
||||
# Personnes à reconnecter
|
||||
print 'Recherche des personnes en fin de sanction...'
|
||||
c = db.search('blacklist=*')
|
||||
services = []
|
||||
|
@ -369,7 +369,7 @@ if __name__ == '__main__':
|
|||
sys.exit(0)
|
||||
|
||||
elif opt == '--add':
|
||||
# Ajout d'un item dans les services à redémarrer
|
||||
# Ajout d'un item dans les services à redémarrer
|
||||
for serv in val.split('&'):
|
||||
if serv.find(',') != -1:
|
||||
serv, arg = serv.split(',', 1)
|
||||
|
@ -390,5 +390,5 @@ if __name__ == '__main__':
|
|||
to_do[opt[2:]] = val.split('&')
|
||||
|
||||
|
||||
# On fait ce qu'il y a à faire
|
||||
# On fait ce qu'il y a à faire
|
||||
classe(to_do)
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
#! /usr/bin/env python
|
||||
# -*- coding: iso-8859-15 -*-
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Licence : GPLv2
|
||||
|
||||
|
@ -13,8 +13,8 @@ from email.mime.text import MIMEText
|
|||
|
||||
class mail:
|
||||
"""
|
||||
Envoie un mail à toutes les personnes de la liste 'To', avec les
|
||||
informations détaillées des objets contenus dans 'objets'
|
||||
Envoie un mail à toutes les personnes de la liste 'To', avec les
|
||||
informations détaillées des objets contenus dans 'objets'
|
||||
(instances des classes Adherent, Machine ou Club) """
|
||||
|
||||
From = 'roots@crans.org'
|
||||
|
@ -25,14 +25,14 @@ class mail:
|
|||
To: %(To)s
|
||||
Subject: %(Subject)s
|
||||
Mime-Version: 1.0
|
||||
Content-Type: text/plain; charset="iso-8859-1"
|
||||
Content-Type: text/plain; charset="utf-8"
|
||||
Content-Disposition: inline
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
|
||||
%(Text)s"""
|
||||
|
||||
# Avec les caractères d'échappement qui vont bien pour la couleur ?
|
||||
# Avec les caractères d'échappement qui vont bien pour la couleur ?
|
||||
couleur = False
|
||||
|
||||
def __init__(self,recherches) :
|
||||
|
@ -96,7 +96,7 @@ Subject: %(Subject)s
|
|||
|
||||
%(Text)s"""
|
||||
|
||||
# Avec les caractères d'échappement qui vont bien pour la couleur ?
|
||||
# Avec les caractères d'échappement qui vont bien pour la couleur ?
|
||||
couleur = False
|
||||
|
||||
def __init__(self,modifs) :
|
||||
|
|
12
gestion/gen_confs/surveillance.py
Normal file → Executable file
12
gestion/gen_confs/surveillance.py
Normal file → Executable file
|
@ -1,11 +1,11 @@
|
|||
#! /usr/bin/env python
|
||||
# -*- coding: iso-8859-15 -*-
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
"""
|
||||
Classe de synchronisation entre la base ldap et
|
||||
la base postgresql pour la liste des exemptions
|
||||
et la liste des machines.
|
||||
Utilisé par generate.py
|
||||
Utilisé par generate.py
|
||||
"""
|
||||
|
||||
# importation des fonctions et classes
|
||||
|
@ -18,7 +18,7 @@ import psycopg2
|
|||
|
||||
db = crans_ldap()
|
||||
|
||||
# Génération des la tables d'exemptions
|
||||
# Génération des la tables d'exemptions
|
||||
#######################################
|
||||
|
||||
class exemptions(gen_config) :
|
||||
|
@ -49,7 +49,7 @@ class exemptions(gen_config) :
|
|||
|
||||
pgsql.commit()
|
||||
|
||||
# Génération des la liste des machines
|
||||
# Génération des la liste des machines
|
||||
######################################
|
||||
|
||||
class machines(gen_config) :
|
||||
|
@ -70,7 +70,7 @@ class machines(gen_config) :
|
|||
# machines = self.machines
|
||||
# machines = db.search('ip=*')['machine']
|
||||
|
||||
# connexion à la base postgresql
|
||||
# connexion à la base postgresql
|
||||
import psycopg2
|
||||
pgsql = psycopg2.connect(database='filtrage', user='crans')
|
||||
curseur = pgsql.cursor()
|
||||
|
@ -82,7 +82,7 @@ class machines(gen_config) :
|
|||
ipv6_vu[ipv6] = True
|
||||
return ret
|
||||
|
||||
# ajout des entrée
|
||||
# ajout des entrée
|
||||
for m in machines:
|
||||
if m.proprietaire().__class__ == Club:
|
||||
curseur.execute("INSERT INTO machines (ip, type, id) VALUES (inet'%s','club',%s);"%(m.ip(),m.proprietaire().id()))
|
||||
|
|
|
@ -500,7 +500,7 @@ aaa port-access mac-based %(prise)s unauth-vid 1
|
|||
return ','.join(result)
|
||||
|
||||
# Saut de ligne parasite
|
||||
params['INTERFACES_CONF'] = params['INTERFACES_CONF'][:-1].encode('iso-8859-15')
|
||||
params['INTERFACES_CONF'] = params['INTERFACES_CONF'][:-1].encode('utf-8')
|
||||
|
||||
# Conversion des listes
|
||||
for key in [ 'uplinks', 'non_uplinks' ] :
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
#! /usr/bin/env python
|
||||
# -*- coding: iso-8859-15 -*-
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
import time, commands
|
||||
from gen_confs import gen_config, ERREUR, OK, anim
|
||||
|
@ -9,11 +9,11 @@ sys.path.append('/usr/scripts/gestion')
|
|||
from ldap_crans import crans_ldap, BorneWifi
|
||||
|
||||
class conf_wifi_ng(gen_config) :
|
||||
""" Génération de la configuration de isakmpd dans ISAKMPD_CONF
|
||||
Le fichier est constitué en 5 parties :
|
||||
1) Configuration générale insérée telle quelle
|
||||
""" Génération de la configuration de isakmpd dans ISAKMPD_CONF
|
||||
Le fichier est constitué en 5 parties :
|
||||
1) Configuration générale insérée telle quelle
|
||||
2) Phase 1 : une ligne par host suivant template
|
||||
3) Phase 2 : une entrée par machine
|
||||
3) Phase 2 : une entrée par machine
|
||||
4) Bloc par machine suivant template
|
||||
5) Ajout de net_crans
|
||||
|
||||
|
@ -21,8 +21,8 @@ class conf_wifi_ng(gen_config) :
|
|||
"""
|
||||
######################################PARTIE DE CONFIGURATION
|
||||
|
||||
# Fichiers à écrire
|
||||
# Répertoire d'écriture des fichiers de zone
|
||||
# Fichiers à écrire
|
||||
# Répertoire d'écriture des fichiers de zone
|
||||
ISAKMPD_CONF='/etc/isakmpd/isakmpd.conf'
|
||||
# Correspondance MAC/IP
|
||||
MACIP='/etc/wifi/wifi-update-ng/common/etc/macip'
|
||||
|
@ -57,7 +57,7 @@ class conf_wifi_ng(gen_config) :
|
|||
self.anim=anim('\tfin reconfigurations')
|
||||
|
||||
def gen_bornes(self, bornes):
|
||||
"""Génération de la configuration des bornes"""
|
||||
"""Génération de la configuration des bornes"""
|
||||
|
||||
TARGET = "/var/www/wifi-update"
|
||||
WORK = "%s/work" % TARGET
|
||||
|
@ -68,20 +68,20 @@ class conf_wifi_ng(gen_config) :
|
|||
if self._bornes and borne.nom().split(".")[0] not in self._bornes:
|
||||
continue
|
||||
self.anim=anim('\treconfiguration de %s' % borne.nom())
|
||||
# Il s'agit de faire l'union du répertoire common et du
|
||||
# répertoire propre (s'il existe) ou alors du répertoire default
|
||||
# On supprime le répertoire de travail
|
||||
# Il s'agit de faire l'union du répertoire common et du
|
||||
# répertoire propre (s'il existe) ou alors du répertoire default
|
||||
# On supprime le répertoire de travail
|
||||
if os.path.isdir(WORK):
|
||||
shutil.rmtree(WORK)
|
||||
# On copie COMMON
|
||||
shutil.copytree(COMMON, WORK)
|
||||
# Est-ce qu'un répertoire spécifique existe ?
|
||||
# Est-ce qu'un répertoire spécifique existe ?
|
||||
top = os.path.join(ROOT, borne.nom())
|
||||
if not os.path.isdir(top):
|
||||
top = DEFAULT
|
||||
# On en copie aussi le contenu
|
||||
for root, dirs, files in os.walk(top, topdown=True):
|
||||
# On créé les répertoires
|
||||
# On créé les répertoires
|
||||
for name in dirs:
|
||||
try:
|
||||
os.mkdir(os.path.join("%s%s" % (WORK, root[len(top):]),
|
||||
|
@ -93,7 +93,7 @@ class conf_wifi_ng(gen_config) :
|
|||
shutil.copy(os.path.join(root, name),
|
||||
os.path.join("%s%s" % (WORK, root[len(top):]),
|
||||
name))
|
||||
# On créé/complète le fichier /etc/nvram.updates
|
||||
# On créé/complète le fichier /etc/nvram.updates
|
||||
if isinstance(borne, BorneWifi) and borne.nom() != "non-configure.wifi.crans.org":
|
||||
fd = file(os.path.join(WORK, "etc", "nvram.updates"), "a")
|
||||
data = { 'HOST': borne.nom().split('.')[0],
|
||||
|
@ -113,7 +113,7 @@ NVRAM_wl0_radio=%(ON)d
|
|||
NVRAM_crans_hotspot=%(HOTSPOT)d
|
||||
|
||||
""" % data)
|
||||
# On complète par les variables de la NVRAM
|
||||
# On complète par les variables de la NVRAM
|
||||
for info in borne.nvram():
|
||||
fd.write('variables="${variables} %s"\n' % info.split("=")[0])
|
||||
fd.write("NVRAM_%s\n" % info)
|
||||
|
@ -122,15 +122,15 @@ NVRAM_crans_hotspot=%(HOTSPOT)d
|
|||
# On fait du menage
|
||||
os.system("find %s -name CVS -type d -exec rm -rf {} \\; 2> /dev/null" % WORK)
|
||||
os.system("find %s -name '*~' -type f -exec rm -f {} \\;" % WORK)
|
||||
# Ensuite, on créé le tar
|
||||
# Ensuite, on créé le tar
|
||||
os.system("tar zcf %s/%s.tmp.tar.gz -C %s ." % (TARGET, borne.nom(), WORK))
|
||||
# Et on le renomme (on espère que c'est atomique)
|
||||
# Et on le renomme (on espère que c'est atomique)
|
||||
os.rename("%s/%s.tmp.tar.gz" % (TARGET, borne.nom()),
|
||||
"%s/%s.tar.gz" % (TARGET, borne.nom()))
|
||||
print OK
|
||||
|
||||
def gen_macip(self, clients, bornes):
|
||||
"""Génération de la correspondance MAC/IP"""
|
||||
"""Génération de la correspondance MAC/IP"""
|
||||
self.anim=anim('\r\tFichier MAC/IP',len(clients + bornes))
|
||||
fd = file(self.MACIP, "w")
|
||||
for machine in clients + bornes:
|
||||
|
@ -141,9 +141,9 @@ NVRAM_crans_hotspot=%(HOTSPOT)d
|
|||
print OK
|
||||
|
||||
def gen_isakmpd(self, clients):
|
||||
"""Génération du fichier pour isakmpd"""
|
||||
"""Génération du fichier pour isakmpd"""
|
||||
|
||||
# Config générale de ISAKMPd
|
||||
# Config générale de ISAKMPd
|
||||
general="""
|
||||
[General]
|
||||
Listen-on= 138.231.148.1
|
||||
|
@ -202,7 +202,7 @@ Remote-ID= Net-%(HOST)s
|
|||
ID-type= IPV4_ADDR
|
||||
Address= %(IP)s
|
||||
"""
|
||||
# Dernière partie du fichier
|
||||
# Dernière partie du fichier
|
||||
net_crans="""
|
||||
[Net-crans]
|
||||
ID-type= IPV4_ADDR_SUBNET
|
||||
|
@ -226,7 +226,7 @@ Netmask= 0.0.0.0
|
|||
|
||||
# Phase 2
|
||||
if blocs != '' :
|
||||
# Ce n'est pas la première machine, il faut insérer un séparateur
|
||||
# Ce n'est pas la première machine, il faut insérer un séparateur
|
||||
phase2 += phase2_sep
|
||||
phase2 += phase2_template % data
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue