[scripts] Going to utf-8

This commit is contained in:
Pierre-Elliott Bécue 2013-05-04 19:19:36 +02:00
parent c4a19a88ed
commit a1bf0a4547
54 changed files with 676 additions and 573 deletions

View file

@ -18,11 +18,11 @@ except:
pass
if not encoding:
encoding = sys.stdin.encoding or "ISO-8859-15"
encoding = sys.stdin.encoding or 'UTF-8'
# Si aucune locale n'est définie, on se met en ISO-8859-15
# Si aucune locale n'est définie, on se met en...
if encoding == "ANSI_X3.4-1968":
encoding = "ISO-8859-15"
encoding = 'UTF-8'
if 'TERM' in os.environ and os.environ['TERM'] != 'unknown':
el = subprocess.Popen('tput cr ; tput el', shell=True, stdout=subprocess.PIPE).stdout.read()
@ -115,7 +115,7 @@ def to_unicode(txt, enc=encoding):
return txt.decode("UTF-8")
except:
# Sinon c'est surement de l'iso
return txt.decode("ISO8859-15")
return txt.decode("UTF-8")
def to_encoding(txt, enc=encoding):
return to_unicode(txt).encode(enc, 'ignore')

View file

@ -6,7 +6,7 @@
#: Envoyé à la ML disconnect@ en cas de déconnexion pour p2p
avertissement = u"""From: %(From)s
To: %(To)s
Subject: =?iso-8859-1?Q?D=E9tection?= de p2p sur la machine %(hostname)s
Subject: =?utf-8?q?D=C3=A9tection?= de p2p sur la machine %(hostname)s
Content-Type: text/plain; charset="utf-8"
La machine %(hostname)s a été déconnectée pendant 24h pour
@ -20,7 +20,7 @@ Message créé par deconnexion.py"""
#: Envoyé à l'adhérent en cas de déconnexion pour p2p
deconnexion = u"""From: %(From)s
To: %(To)s
Subject: Avis de =?iso-8859-15?Q?D=E9connexion?=
Subject: Avis de =?utf-8?q?D=C3=A9connexion?=
Content-Type: text/plain; charset="utf-8"
Bonjour,
@ -81,7 +81,7 @@ Disconnect Team"""
#: Envoyé à la ML disconnect@ en cas de déconnexion pour p2p plusieurs fois
message_disconnect_multi = u"""From: %(from)s
To: %(to)s
Subject: %(proprio)s a =?iso-8859-15?Q?=E9t=E9=20d=E9connect=E9?= %(nbdeco)d fois pour p2p en un an !
Subject: %(proprio)s a =?utf-8?q?=C3=A9t=C3=A9_d=C3=A9connect=C3=A9?= %(nbdeco)d fois pour p2p en un an !
Content-Type: text/plain; charset="utf-8"
L'adhérent %(proprio)s a été déconnecté %(nbdeco)d fois pour p2p en un an !
@ -90,4 +90,4 @@ Le PS a été généré et se trouve sur zamok :
%(ps)s
--\u0020
Message créé par deconnexion.py"""
Message créé par deconnexion.py"""

View file

@ -124,7 +124,7 @@ Message créé par deconnexion.py"""
#: Envoyé à la ML disconnect@ en cas de dépassement de la limite hard
message_disconnect_hard = u"""From: %(from)s
To: %(to)s
Subject: %(proprio)s a =?iso-8859-1?Q?=E9t=E9=20brid=E9?=
Subject: %(proprio)s a =?utf-8?q?=C3=A9t=C3=A9_brid=C3=A9?=
Content-Type: text/plain; charset="utf-8"
%(proprio)s (%(id)s) a été limité en débit montant du fait d'un
@ -141,7 +141,7 @@ Message créé par deconnexion.py"""
#: Envoyé à la ML disconnect@ en cas de dépassement de la limite hard plusieurs fois
message_disconnect_multi = u"""From: %(from)s
To: %(to)s
Subject: %(proprio)s a =?iso-8859-1?Q?=E9t=E9=20brid=E9?=
Subject: %(proprio)s a =?utf-8?q?=C3=A9t=C3=A9_brid=C3=A9?=
%(nbdeco)d fois pour upload en un mois !
Content-Type: text/plain; charset="utf-8"

View file

@ -14,7 +14,7 @@ format_sender et send_email adaptés depuis /usr/scripts/impression/crans_backen
import re
def format_sender(sender, header_charset='ISO-8859-15'):
def format_sender(sender, header_charset='utf-8'):
"""
Check and format sender for header.
"""
@ -42,8 +42,8 @@ def send_email(sender, recipient, subject, body, server='localhost', cc=None, de
Only the real name part of sender and recipient addresses may contain
non-ASCII characters. The email will be properly MIME encoded.
The charset of the email will be the first one out of US-ASCII, ISO-8859-15
and UTF-8 that can represent all the characters occurring in the email.
The charset of the email will be the first one out of US-ASCII or UTF-8
that can represent all the characters occurring in the email.
Argument server maybe a string, indicating the name of the SMTP server, or
directly an instance of smtplib.SMTP.
@ -57,10 +57,10 @@ def send_email(sender, recipient, subject, body, server='localhost', cc=None, de
# Header class is smart enough to try US-ASCII, then the charset we
# provide, then fall back to UTF-8.
header_charset = 'ISO-8859-15'
header_charset = 'UTF-8'
# We must choose the body charset manually
for body_charset in 'US-ASCII', 'ISO-8859-15', 'UTF-8':
for body_charset in 'US-ASCII', 'UTF-8':
try:
body.encode(body_charset)
except UnicodeError:

30
gestion/gen_confs/__init__.py Executable file → Normal file
View 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()

View file

@ -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:

View file

@ -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."

View file

@ -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

View file

@ -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 = ''

View file

@ -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)

View file

@ -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
View 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()))

View file

@ -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' ] :

View file

@ -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

View file

@ -51,7 +51,7 @@ droits = db.search("uid=%s" % script_utilisateur)['adherent'][0].droits()
isimprimeur = u"Imprimeur" in droits
iscontroleur = u'Tresorier' in droits
isbureau = u'Bureau' in droits
encoding = sys.stdin.encoding or 'ISO-8859-15'
encoding = sys.stdin.encoding or 'UTF-8'
if u'Nounou' in droits:
if os.path.exists(os.path.expanduser('~/.dialogrc')):
@ -1892,7 +1892,7 @@ def select(clas, quoi, mde=''):
s= ['', '', '', '', '', '', '', '', '', '']
def f(a):
try:
return unicode(a, 'iso-8859-15')
return unicode(a, 'utf-8')
except:
return a
while 1:

View file

@ -182,7 +182,7 @@ def preattr(val):
val = str(val).strip()
# On passe tout en utf-8 pour ne pas avoir de problèmes
# d'accents dans la base
return [len(val), unicode(val, 'iso-8859-1').encode('utf-8')]
return [len(val), val]
elif isinstance(val, unicode):
val = val.strip()
return [len(val), val.encode('utf-8')]
@ -690,8 +690,7 @@ class CransLdap:
closelog()
if type(expression) == str:
# Transformation de l'expression en utf-8
expression = unicode(expression, 'iso-8859-15').encode('utf-8')
pass
elif type(expression) == unicode:
expression = expression.encode('utf-8')
else:
@ -1889,7 +1888,7 @@ class BaseProprietaire(BaseClasseCrans):
if self.idn !='cid':
# Mail de bienvenue
self.services_to_restart('mail_bienvenue', [self.mail().encode('iso-8859-15')], start = time.time() + 660)
self.services_to_restart('mail_bienvenue', [self.mail().encode('utf-8')], start = time.time() + 660)
else:
ret += coul(u"Modification %s effectuée avec succès." % self.Nom(), 'vert')
@ -2178,7 +2177,7 @@ class Adherent(BaseProprietaire):
self.mail_invalide(False)
# on renvoie le mail de bienvenue
self.services_to_restart('mail_bienvenue', [new.encode('iso-8859-15')])
self.services_to_restart('mail_bienvenue', [new.encode('utf-8')])
return new
@ -2876,7 +2875,7 @@ Contactez nounou si la MAC est bien celle d'une carte.""", 3)
def __host_alias(self, champ, new):
""" Vérification de la validité d'un nom de machine """
# Supression des accents
new = strip_accents(unicode(new, 'iso-8859-15'))
new = strip_accents(unicode(new, 'utf-8'))
l, new = preattr(new)
new = new.lower()

View file

@ -1,5 +1,5 @@
#! /usr/bin/env python
# -*- coding: iso-8859-15 -*-
# -*- coding: utf-8 -*-
import sys

View file

@ -72,7 +72,7 @@ par le script.
s = smtplib.SMTP()
s.connect('smtp.crans.org')
for adherent in adherents:
mail = adherent.mail().encode("iso-8859-15", "ignore")
mail = adherent.mail().encode("utf-8", "ignore")
if "@" not in mail:
mail = mail + "@crans.org"
cprint(u"Envoi du mail à %s <%s>..." % (adherent.Nom(), mail))

View file

@ -1,5 +1,5 @@
#! /usr/bin/env python
# -*- coding: iso-8859-15 -*-
# -*- coding: utf-8 -*-
import sys
sys.path.append('/usr/scripts/gestion')

View file

@ -1,5 +1,5 @@
#! /usr/bin/env python
# -*- coding: iso-8859-15 -*-
# -*- coding: utf-8 -*-
import sys
sys.path.append('/usr/scripts/gestion')
@ -15,7 +15,7 @@ for m in machines :
# texte pour la machine
txt = u''
txt += u'Propriétaire : %s\n' % m.proprietaire().Nom()
txt += u'Propriétaire : %s\n' % m.proprietaire().Nom()
txt += u'Machine : %s\n' % m.nom()
txt += u'destination : %s\n' % ', '.join(m.exempt())

View file

@ -1,5 +1,5 @@
#! /usr/bin/env python
# -*- coding: iso-8859-15 -*-
# -*- coding: utf-8 -*-
import sys
sys.path.append('/usr/scripts/gestion')
@ -13,7 +13,7 @@ done = []
txts = []
for m in machines :
# on vérifie qu'on l'a pas encore traité
# on vérifie qu'on l'a pas encore traité
if m.ip() in done :
continue
if m.proprietaire().__class__ == AssociationCrans :
@ -22,7 +22,7 @@ for m in machines :
# texte pour la machine
txt = u''
txt += u'Propriétaire : %s\n' % m.proprietaire().Nom()
txt += u'Propriétaire : %s\n' % m.proprietaire().Nom()
txt += u'Machine : %s\n' % m.nom()
if m.portTCPin() :
txt += u'ports TCP in : %s\n' % ' '.join(m.portTCPin())

View file

@ -1,5 +1,5 @@
#! /usr/bin/env python
# -*- coding: iso-8859-15 -*-
# -*- coding: utf-8 -*-
import sys
from commands import getoutput

View file

@ -1,5 +1,5 @@
#! /usr/bin/env python
# -*- coding: iso-8859-15 -*-
# -*- coding: utf-8 -*-
import sys
sys.path.append('/usr/scripts/gestion')
@ -15,7 +15,7 @@ for a in adherents :
if a.solde() == 0 :
continue
# texte pour l'adhérent
# texte pour l'adhérent
txt = u''
txt += u'Nom : %s\n' % a.Nom()
txt += u'Solde : %s\n' % a.solde()

View file

@ -1,5 +1,5 @@
#! /usr/bin/env python
# -*- coding: iso-8859-15 -*-
# -*- coding: utf-8 -*-
import sys
sys.path.append('/usr/scripts/gestion')
@ -12,11 +12,11 @@ def titre (bat) :
if bat == 'P' :
return 'Pavillon des jardins'
elif bat == '?' :
return 'Autres (extérieurs et chambres invalides)'
return 'Autres (extérieurs et chambres invalides)'
else :
return 'Bâtiment %s' % bat
return 'Bâtiment %s' % bat
# création de la liste vide
# création de la liste vide
###########################
liste = {}
@ -26,7 +26,7 @@ for bat in bats + '?' :
# remplissage de la liste
#########################
# les extérieurs
# les extérieurs
adhs = db.search( 'paiement=ok&etudes!=Pers' )['adherent']
for adh in adhs :
bat = adh.chbre()[0]
@ -34,7 +34,7 @@ for adh in adhs :
bat = '?'
liste[bat].append( u'%s %s' % ( adh.nom(), adh.prenom() ) )
# création du fichier tex
# création du fichier tex
#########################
print """\\documentclass[a4paper,11pt]{article}
@ -61,7 +61,7 @@ for bat in bats + '?' :
\\hline
\\endhead""" % {'bat' : titre(bat) }
# ajout des adhérents
# ajout des adhérents
liste[bat].sort()
for adh in liste[bat] :
print (u'%s& \\\\\n\\hline' % adh).encode('iso 8859-15')

View file

@ -1,5 +1,5 @@
#! /usr/bin/env python
# -*- coding: iso-8859-15 -*-
# -*- coding: utf-8 -*-
import sys
sys.path.append('/usr/scripts/gestion')
@ -10,21 +10,21 @@ from affich_tools import coul
import threading
from os import getuid
# il faut être root
# il faut être root
if getuid() :
print 'Il faut être root !'
print 'Il faut être root !'
sys.exit(1)
# connexion à la base de données
# connexion à la base de données
db = crans_ldap()
# décompostion des arguments
# décompostion des arguments
try :
mac = ":".join([i.zfill(2) for i in sys.argv[1].split(":")]).upper()
except :
mac = None
# dit si une mac a déja été traitée
# dit si une mac a déja été traitée
mac_done=[]
def done (mac) :
global mac_done
@ -34,7 +34,7 @@ def done (mac) :
mac_done.append(mac)
return False
# liste des résultats
# liste des résultats
results = []
# classe d'interrogation des bornes

View file

@ -1,5 +1,5 @@
#! /usr/bin/env python
# -*- coding: iso-8859-15 -*-
# -*- coding: utf-8 -*-
import sys, re
from time import sleep
@ -37,11 +37,11 @@ class interroge_switch (threading.Thread) :
if (prise != None):
nom=sw.nom(None,prise)
if self.affiche_uplinks or "uplink" not in nom:
self.reponse = ("%-10s => prise %-2s : %s" % (self.switch.encode('iso-8859-15').replace('.adm.crans.org',''), str(prise), nom))
self.reponse = ("%-10s => prise %-2s : %s" % (self.switch.encode('utf-8').replace('.adm.crans.org',''), str(prise), nom))
# Retourne les infos sur la machine (l'équivalent d'un whos, mais renvoie la
# chaîne de caractères)
# Retourne les infos sur la machine (l'équivalent d'un whos, mais renvoie la
# chaîne de caractères)
def info_machine(mac):
s = []
db = crans_ldap()
@ -52,7 +52,7 @@ def info_machine(mac):
r = re.sub('\x1b\[1;([0-9]|[0-9][0-9])m', '', r)
s.append(r)
if len(machines) == 0:
s.append(u"Recherche LDAP de la MAC %s : aucune machine trouvée\n" % mac)
s.append(u"Recherche LDAP de la MAC %s : aucune machine trouvée\n" % mac)
return u"\n".join(s)
@ -66,7 +66,7 @@ def trace_machine(mac, affiche_uplinks=False):
for t in tableau:
t.join()
resultat = u'Traçage de %s...\n' % mac
resultat = u'Traçage de %s...\n' % mac
tracage = u''
for t in tableau:

View file

@ -1,5 +1,5 @@
#! /usr/bin/env python
# -*- encoding: iso-8859-15 -*-
# -*- encoding: utf-8 -*-
# Stats sur les historiques
@ -13,22 +13,22 @@ import re
from time import mktime, strptime
def plat(chose):
"""Applatit une liste de liste. Hautement récursif."""
"""Applatit une liste de liste. Hautement récursif."""
if type(chose) != ListType:
return [chose]
return sum(map(lambda x: plat(x), chose), [])
def hist():
"""Récupère l'historique dans une base SQLite dont la connexion est returnée."""
# On récupèr les adhérents
"""Récupère l'historique dans une base SQLite dont la connexion est returnée."""
# On récupèr les adhérents
adherents = crans_ldap().search("nom=*")['adherent']
# Et les historiques rattachés à eux et à leurs machines
# Et les historiques rattachés à eux et à leurs machines
historiques = map(lambda x: [x.historique(), map(lambda y: y.historique(), x.machines())],
adherents)
historiques = plat(historiques)
# On va maintenant coller les historiques dans une structure plus
# sympa, style une base SQL que l'on garde en mémoire
# sympa, style une base SQL que l'on garde en mémoire
con = sqlite.connect("historiques")
cur = con.cursor()
cur.execute("CREATE TABLE historique (date INTEGER, nom TEXT, action TEXT)")

View file

@ -0,0 +1,5 @@
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#
# High level interface between XEN
# and XEN user