From cc31727b602fe83d8f93da4a00d63acb36e3b33b Mon Sep 17 00:00:00 2001 From: Stephane Glondu Date: Mon, 9 Mar 2009 22:21:24 +0100 Subject: [PATCH] =?UTF-8?q?[gestion/*.py]=20R=C3=A9-encodage=20de=20certai?= =?UTF-8?q?ns=20scripts=20en=20UTF-8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ignore-this: dafa22ed56eaf0d816fd089e42672eb5 darcs-hash:20090309212124-0445d-09ac8ae4052b6f333706be1baa1c7f4d94455fd5.gz --- gestion/affich_tools.py | 50 +- gestion/ajoute_chambre.py | 40 +- gestion/annuaires.py | 22 +- gestion/arp.py | 32 +- gestion/chgpass.py | 56 +- gestion/chsh.py | 10 +- gestion/config.py | 200 +++---- gestion/config_mail.py | 36 +- gestion/email_tools.py | 12 +- gestion/gest_crans.py | 690 +++++++++++------------ gestion/hptools.py | 78 +-- gestion/iptools.py | 48 +- gestion/ldap_crans.py | 962 ++++++++++++++++----------------- gestion/ldap_passwd.py | 6 +- gestion/lock.py | 34 +- gestion/mail-all.py | 58 +- gestion/majswitch.py | 18 +- gestion/numeros_disponibles.py | 6 +- gestion/restore.py | 30 +- gestion/user_tests.py | 12 +- gestion/whos.py | 302 +++++------ 21 files changed, 1351 insertions(+), 1351 deletions(-) diff --git a/gestion/affich_tools.py b/gestion/affich_tools.py index 59858d9d..400a6b46 100755 --- a/gestion/affich_tools.py +++ b/gestion/affich_tools.py @@ -1,15 +1,15 @@ #!/usr/bin/env python -# -*- coding: iso-8859-15 -*- +# -*- coding: utf-8 -*- """ Collection de fonction/classe pour avoir un bel affichage -Copyright (C) Frédéric Pauget +Copyright (C) Frédéric Pauget Licence : GPLv2 """ import sys, re, os, tempfile -# Détermination de l'encodage +# Détermination de l'encodage encoding = None try: from locale import getpreferredencoding @@ -20,7 +20,7 @@ except: if not encoding: encoding = sys.stdin.encoding or "ISO-8859-15" -# 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 ISO-8859-15 if encoding == "ANSI_X3.4-1968": encoding = "ISO-8859-15" @@ -32,13 +32,13 @@ else: stdout_atty = sys.stdout.isatty() def dialog(backtitle,arg,dialogrc='') : - """ Affiche la boite de dialogue défine avec les arguments fournis + """ Affiche la boite de dialogue défine avec les arguments fournis (cf man dialog) - si tout se déroule bien retourne : + si tout se déroule bien retourne : [ 0, [ reponse(s) ] ] si annulatin retourne : [ 1, [] ] - si appui sur ESC demande confirmation de l'abandon et exécute sys.exit(0) + si appui sur ESC demande confirmation de l'abandon et exécute sys.exit(0) si erreur dans les arguments raise RuntimeError """ f = tempfile.NamedTemporaryFile() @@ -49,7 +49,7 @@ def dialog(backtitle,arg,dialogrc='') : # Annuler f.close() return [ 1, [] ] - # Lecture du fichier de résultat et effacement + # Lecture du fichier de résultat et effacement try: result=f.readlines() f.close() @@ -62,7 +62,7 @@ def dialog(backtitle,arg,dialogrc='') : raise RuntimeError( arg, result[1].strip() ) elif res==65280 : # Appui sur ESC - arg1 = u'--title "Annulation" --yesno "Quitter ?\nLes dernières modifications seront perdues." 6 48' + arg1 = u'--title "Annulation" --yesno "Quitter ?\nLes dernières modifications seront perdues." 6 48' print backtitle cmd = u'%s /usr/bin/dialog --backtitle "%s" %s' % (dialogrc, backtitle,arg1) res = os.system(cmd.encode('iso-8859-15','ignore') ) @@ -73,8 +73,8 @@ def dialog(backtitle,arg,dialogrc='') : def coul(txt, col=None): """ - Retourne la chaine donnée encadrée des séquences qui - vont bien pour obtenir la couleur souhaitée + Retourne la chaine donnée encadrée des séquences qui + vont bien pour obtenir la couleur souhaitée Les couleur sont celles de codecol Il est possible de changer la couleur de fond grace aux couleur f_ """ @@ -123,7 +123,7 @@ def cprint(txt, col='blanc', newline=True): def tableau(data, titre=None, largeur=None, alignement=None, format=None): """ - Retourne une chaine formatée repésentant un tableau. + Retourne une chaine formatée repésentant un tableau. data : liste de listes, chacune contenant les valeurs d'une ligne @@ -132,7 +132,7 @@ def tableau(data, titre=None, largeur=None, alignement=None, format=None): largeur : liste des largeurs des colonnes, '*' met la plus grande largeur possible. - Si None, réduit aux max chaque colonne + Si None, réduit aux max chaque colonne alignement : liste des alignements : c = centrer g = gauche @@ -149,7 +149,7 @@ def tableau(data, titre=None, largeur=None, alignement=None, format=None): elif titre : nbcols = len(titre) else : - return u'Aucune donnée' + return u'Aucune donnée' # Formats ######### @@ -195,12 +195,12 @@ def tableau(data, titre=None, largeur=None, alignement=None, format=None): # Alignement if l > largeur : - # découpage d'une chaine trop longue + # découpage d'une chaine trop longue regexp = re.compile('\x1b\[1;([0-9]|[0-9][0-9])m') new_data = u'' new_len = 0 - # On laisse la mise en forme et on coupe les caratères affichés + # On laisse la mise en forme et on coupe les caratères affichés while True : s = regexp.search(data) if s and not s.start() : @@ -208,12 +208,12 @@ def tableau(data, titre=None, largeur=None, alignement=None, format=None): new_data += data[:s.end()] data = data[s.end():] elif new_len < largeur - 1 : - # c'est un caratère normal, et il y a la place + # c'est un caratère normal, et il y a la place new_data += data[0] data = data[1:] new_len += 1 else : - # c'est un caratère normal mais on a dépassé le max + # c'est un caratère normal mais on a dépassé le max data = data[1:] if not data : return new_data + '*' @@ -237,19 +237,19 @@ def tableau(data, titre=None, largeur=None, alignement=None, format=None): if titre : # ligne de titre chaine = sep_col + sep_col.join([aligne(titre[i],'c',largeur[i]) for i in range(nbcols)]) + sep_col + u'\n' - # ligne de séparation + # ligne de séparation chaine += sep_col + u'+'.join([u'-'*largeur[i] for i in range(nbcols)]) + sep_col + u'\n' else : chaine = u'' - # Les données + # Les données ############# chaine += u'\n'.join([sep_col + sep_col.join([ligne[i] for i in range(nbcols)]) + sep_col for ligne in data]) return chaine def get_screen_size(): - """Retourne la taille de l'écran. + """Retourne la taille de l'écran. Sous la forme d'un tuble (lignes, colonnes)""" @@ -265,7 +265,7 @@ def get_screen_size(): def prompt(prompt, defaut='', couleur='gras'): u""" - Pose la question prompt en couleur (défaut gras), retourne la réponse. + Pose la question prompt en couleur (défaut gras), retourne la réponse. """ sys.stdout.write(coul(prompt, couleur).encode(encoding)) if defaut : @@ -276,12 +276,12 @@ def prompt(prompt, defaut='', couleur='gras'): return v class anim : - """ Permet de créer une animation : + """ Permet de créer une animation : truc................./ truc.................- truc.................\ truc.................| - ou une barre de progression si le nombre total d'itérations est founi. + ou une barre de progression si le nombre total d'itérations est founi. """ def __init__(self,truc,iter=0) : """ Affichage de : @@ -304,7 +304,7 @@ class anim : def cycle(self) : """ Efface la ligne courrante et affiche : truc..................? - ? caratère variant à chaque appel """ + ? caratère variant à chaque appel """ sys.stdout.write(el + self.txt) if self.iter!=0 : sys.stdout.write('[') diff --git a/gestion/ajoute_chambre.py b/gestion/ajoute_chambre.py index fcb7c4c2..5fb889e0 100755 --- a/gestion/ajoute_chambre.py +++ b/gestion/ajoute_chambre.py @@ -1,5 +1,5 @@ #! /usr/bin/env python -# -*- coding: iso-8859-15 -*- +# -*- coding: utf-8 -*- # # $Id: ajoute_chambre.py,v 1.2 2007-02-24 01:08:45 dimino Exp $ # @@ -25,7 +25,7 @@ # # # Description: -# Ajoute une chambre sur une prise libre (fait pour le batiment g à la base) +# Ajoute une chambre sur une prise libre (fait pour le batiment g à la base) # import sys, os @@ -35,14 +35,14 @@ sys.path.append('/usr/scripts/gestion') from annuaires import chbre_prises, reverse, bat_switchs from affich_tools import cprint -# C'est juste pour le déboggage +# C'est juste pour le déboggage __fichier_annuaire = "/usr/scripts/gestion/annuaires.py" def assigne_chambre(prise, chbre): - """ Assigne une chambre à une prise. + """ Assigne une chambre à une prise. -prise doit être de la forme bnnn[g/d], ou nnn[g/d], dans ce dernier cas le bâtiment est le g. +prise doit être de la forme bnnn[g/d], ou nnn[g/d], dans ce dernier cas le bâtiment est le g. """ if len(chbre) != 3 or not chbre.isdigit(): @@ -75,7 +75,7 @@ prise doit # if chambre != 'XXX': # return 'prise_utilisee' - # Ajout effectif de la chambre sur la prise donnée + # Ajout effectif de la chambre sur la prise donnée annuaire = open(__fichier_annuaire, 'r') tampon = annuaire.read() @@ -109,15 +109,15 @@ prise doit if not user: user = os.getenv('USER') or "inconnu" - # Vu que ça va être mis dans la ligne de commande éxécuter après, - # autant être parano. + # Vu que ça va être mis dans la ligne de commande éxécuter après, + # autant être parano. for c in user: if not (c.isalnum or c in [ '-', '_' ]): user = "(uid=%d)" % (os.getuid()) break os.system('cd /usr/scripts/gestion && /usr/bin/cvs commit %s \ --m "ajoute_chambre.py: chambre %s%s ajouté sur la prise %s%s par %s"' % +-m "ajoute_chambre.py: chambre %s%s ajouté sur la prise %s%s par %s"' % (__fichier_annuaire, bat, chbre, bat, prise, user)) @@ -133,18 +133,18 @@ def __aide(): """ Aide """ cprint(u"""Usage: %s [OPTIONS] -Ajoute une chambre sur une prise qui n'était pas encore utilisé. +Ajoute une chambre sur une prise qui n'était pas encore utilisé. Options: -h, --help affiche cette aide - doit être de la forme bnnn ou nnn où: -- B est le batiment (g si non spécifié) -- nnn est le numéro de la prise + doit être de la forme bnnn ou nnn où: +- B est le batiment (g si non spécifié) +- nnn est le numéro de la prise - doit être de la forme nnn + doit être de la forme nnn -Rapporter toutes anomalies à .""" % sys.argv[0].split('/')[-1].split('.')[0]) +Rapporter toutes anomalies à .""" % sys.argv[0].split('/')[-1].split('.')[0]) sys.exit(0) @@ -173,7 +173,7 @@ if __name__ == '__main__': __usage(u"Format de la chambre invalide") elif resultat == 'chambre_deja_cablee': - __usage(u"La chambre est déjà cablée") + __usage(u"La chambre est déjà cablée") elif resultat == 'batiment_inconnu': __usage(u"Le batiment n'existe pas") @@ -182,11 +182,11 @@ if __name__ == '__main__': __usage(u"La prise n'existe pas") elif resultat == 'prise_utilisee': - __usage(u"La prise est déjà utilisée") + __usage(u"La prise est déjà utilisée") elif resultat == 'prise_introuvable': - cprint(u"""La prise n'a pas été trouvé dans l'annuaire. -Vérifiez que vous avez bien mis le numéro de prise et de chambre.""") + cprint(u"""La prise n'a pas été trouvé dans l'annuaire. +Vérifiez que vous avez bien mis le numéro de prise et de chambre.""") elif resultat == 'fichier_annuaire_invalide': - cprint(u"Le fichier d'annuaire n'est pas reconnu, envoyer un mail à dimino@crans.org") + cprint(u"Le fichier d'annuaire n'est pas reconnu, envoyer un mail à dimino@crans.org") diff --git a/gestion/annuaires.py b/gestion/annuaires.py index 025a9f8d..476111c4 100755 --- a/gestion/annuaires.py +++ b/gestion/annuaires.py @@ -1,7 +1,7 @@ #!/usr/bin/python -# -*- coding: iso-8859-15 -*- +# -*- coding: utf-8 -*- -# Liste des bâtiments avec switch manageables +# Liste des bâtiments avec switch manageables bat_switchs = [ 'a' , 'b' , 'c' , 'h' , 'i' , 'j' , 'm' , 'p'] bat_manuels = [ 'o' , 'r' ] # Y en a plus aucun :) ou presque @@ -9,8 +9,8 @@ aide={ 'g' : "appart du RDC=G901" } -# Toute chambre ne commencant pas par 3 chiffres sera considéré comme un local club -# En conséquence les locaux club ne devront pas commencer par 3 chiffres. +# Toute chambre ne commencant pas par 3 chiffres sera considéré comme un local club +# En conséquence les locaux club ne devront pas commencer par 3 chiffres. #Pour le G : # le signe - indique un cable 10 Mbps @@ -52,8 +52,8 @@ chbre_prises={ 'a' : '603d':'301', '608d':'302', 'cl6':'303'}, -# Le local club du 6ème et les chambres A608d, A603d sont sur la -# prise 202 (switch au 6ème dans le local technique à coté de +# Le local club du 6ème et les chambres A608d, A603d sont sur la +# prise 202 (switch au 6ème dans le local technique à coté de # l'ascensseur 'b' : @@ -465,11 +465,11 @@ chbre_prises={ 'a' : 'XXX':'641' , 'XXX':'642' , 'XXX':'643' , 'XXX':'644' , 'XXX':'645' , 'XXX':'646', 'XXX':'647' , 'XXX':'648' , -# Ce switch n'est pas au bâtiment G comme on pourrait le croire +# Ce switch n'est pas au bâtiment G comme on pourrait le croire '999':'701' , '998':'702' , '997':'703' , '996':'704'} } -# Prises d'uplink, de machines du crans / Prises d'utilité CRANS +# Prises d'uplink, de machines du crans / Prises d'utilité CRANS uplink_prises={ 'a' : { 49 : 'uplink->backbone', 50 : 'uplink->bata-1', 149 : 'uplink->bata-0', 150 : 'uplink->bata-2', @@ -535,8 +535,8 @@ def reverse(bat) : def all_switchs(bat=None): """Retourne la liste des switchs pour un batiment. - Si bat est donné, seulement pour le bâtiment demandé, sinon pour - tous les bâtiments. bat peut être une liste aussi. Le backbone n'est + Si bat est donné, seulement pour le bâtiment demandé, sinon pour + tous les bâtiments. bat peut être une liste aussi. Le backbone n'est pas pris en compte. La convention est batx-y sauf si y=0 et on a donc simplement batx""" def cmp(x,y): @@ -568,7 +568,7 @@ def locaux_clubs() : 'Mcl0' : 'Shape', 'Mcl1' : 'Krobot', 'EXT' : 'EXT' } - # Ajout des locaux d'étage A, B et C + # Ajout des locaux d'étage A, B et C for b in 'ABC' : for i in range(2,7) : locaux_clubs['%scl%i' % ( b, i)] = '%i@%s' % (i, b) diff --git a/gestion/arp.py b/gestion/arp.py index 8a8fe5e8..3ca0ac0d 100755 --- a/gestion/arp.py +++ b/gestion/arp.py @@ -1,9 +1,9 @@ #! /usr/bin/env python -# -*- coding: iso-8859-15 -*- +# -*- coding: utf-8 -*- -# Serveur SSL qui renvoie la MAC correspondant à une IP -# Ce serveur est utilisé sur Nectaris par les bornes wifi pour faire -# les requêtes ARP. +# Serveur SSL qui renvoie la MAC correspondant à une IP +# Ce serveur est utilisé sur Nectaris par les bornes wifi pour faire +# les requêtes ARP. # Lancement : twistd -n -y arp.py --pidfile=/var/run/arp.pid # Pas de -n pour qu'il passe en fond @@ -29,18 +29,18 @@ import re class ServerContextFactory(ContextFactory): def getContext(self): - """Création d'un contexte SSL côté serveur.""" + """Création d'un contexte SSL côté serveur.""" ctx = SSL.Context(SSL.SSLv23_METHOD) ctx.use_certificate_file('/etc/ssl/certs/nectaris.pem') ctx.use_privatekey_file('/etc/ssl/private/nectaris.pem') return ctx class ARPProtocol(basic.LineReceiver): - """Protocole de communication pour récupérer une adresse MAC. + """Protocole de communication pour récupérer une adresse MAC. - Chaque lignee reçue contient une adresse IP et le serveur répond + Chaque lignee reçue contient une adresse IP et le serveur répond avec l'adresse MAC correspondante ou avec `unknown' si celle-ci - est inconnue (ou non autorisée). + est inconnue (ou non autorisée). """ def lineReceived(self, IP): self.factory.getMac(IP @@ -51,7 +51,7 @@ class ARPProtocol(basic.LineReceiver): def answerMac(self, m): """Renvoie au client la bonne adresse MAC. - `m' peut être None. + `m' peut être None. """ if m: return self.transport.write(str(m) + "\r\n") @@ -59,7 +59,7 @@ class ARPProtocol(basic.LineReceiver): return self.transport.write("unknown\r\n") class ARPFactory(protocol.ServerFactory): - """Backend du serveur. Effectue la résolution IP/MAC.""" + """Backend du serveur. Effectue la résolution IP/MAC.""" protocol = ARPProtocol def __init__(self, network='0.0.0.0/0'): @@ -70,26 +70,26 @@ class ARPFactory(protocol.ServerFactory): return defer.succeed(self._getMac(IP)) def _getMac(self, IP): - """Fonction réelle, synchrone, qui obtient l'adresse MAC.""" + """Fonction réelle, synchrone, qui obtient l'adresse MAC.""" try: if AddrInNet(IP, self.network): results = self.ldap.search('ip=%s' % IP)['machine'] if results: - # On a au moins un résultat, on retourne le premier + # On a au moins un résultat, on retourne le premier return results[0].mac().strip() else: # On a rien return None else: - # L'IP n'est pas autorisée + # L'IP n'est pas autorisée return None except ValueError: - # A priori, ce n'était pas une IP + # A priori, ce n'était pas une IP return None # Corps du programme -# On écoute sur le port 5243 et on ne répond qu'aux requêtes concernant le -# sous-réseau wifi +# On écoute sur le port 5243 et on ne répond qu'aux requêtes concernant le +# sous-réseau wifi application = service.Application('arp') factory = ARPFactory('138.231.148.0/21') # Remplacer SSL par TCP pour ne pas utiliser SSL et virer ServerContextFactory diff --git a/gestion/chgpass.py b/gestion/chgpass.py index 9a44abaa..eea5812a 100755 --- a/gestion/chgpass.py +++ b/gestion/chgpass.py @@ -1,5 +1,5 @@ #! /usr/bin/env python -# -*- coding: iso-8859-15 -*- +# -*- coding: utf-8 -*- """ Script de changement de mots de passe LDAP @@ -7,14 +7,14 @@ Script de changement de mots de passe LDAP Utilisation : * cas 1 : sans arguements par un utlisateur lambda : changement de son propre mdp - * cas 2 : avec argument par un utilisateur ayant accès - total à la base LDAP (respbats) mais PAS ROOT : - changement du mdp de l'adhérent fourni en argument, - impossibilité de modifier le mdp d'un compte privilégié - * cas 3 : lancé par root : possibilité de modifier + * cas 2 : avec argument par un utilisateur ayant accès + total à la base LDAP (respbats) mais PAS ROOT : + changement du mdp de l'adhérent fourni en argument, + impossibilité de modifier le mdp d'un compte privilégié + * cas 3 : lancé par root : possibilité de modifier tous les mots de passe LDAP -Copyright (C) Frédéric Pauget +Copyright (C) Frédéric Pauget Licence : GPLv2 """ @@ -33,17 +33,17 @@ uri = 'ldap://ldap.adm.crans.org' syslog.openlog('chgpass',syslog.LOG_PID,syslog.LOG_AUTH) def decode64(chaine): - """ Décode une chaine de caratère utf8/64 et retourne un unicode """ + """ Décode une chaine de caratère utf8/64 et retourne un unicode """ try: return base64.decodestring(chaine).decode('utf8','ignore') except: return chaine.decode('utf8','ignore') def chgpass(dn) : - cprint(u"""Le nouveau mot de passe doit comporter au minimum 6 caractères. -Il ne doit pas être basé sur un mot du dictionnaire.""", 'jaune') - print "Il est conseillé d'utiliser une combinaison de minuscules, majuscules,\nde chiffres et d'au moins un caractère spécial." - print "Le mot de passe tapé ne sera pas écrit à l'écran." + cprint(u"""Le nouveau mot de passe doit comporter au minimum 6 caractères. +Il ne doit pas être basé sur un mot du dictionnaire.""", 'jaune') + print "Il est conseillé d'utiliser une combinaison de minuscules, majuscules,\nde chiffres et d'au moins un caractère spécial." + print "Le mot de passe tapé ne sera pas écrit à l'écran." print "Taper Ctrl-D pour abandonner" try : @@ -60,17 +60,17 @@ Il ne doit pas try: mdp = mdp.encode('ascii') except UnicodeEncodeError: - cprint(u'Les accents ou caractères bizarres ne sont pas autorisés (mais #!@*&%{}| le sont !)', + cprint(u'Les accents ou caractères bizarres ne sont pas autorisés (mais #!@*&%{}| le sont !)', 'rouge') continue - ## 2bis - On évite une attaque de type injection de code shell + ## 2bis - On évite une attaque de type injection de code shell if "'" in mdp: - cprint(u'Les accents ou caractères bizarres ne sont pas autorisés (mais #!@*&%{}| le sont !)', + cprint(u'Les accents ou caractères bizarres ne sont pas autorisés (mais #!@*&%{}| le sont !)', 'rouge') continue - ## 3 - assez de caractères de types différents ? + ## 3 - assez de caractères de types différents ? chiffres = 0 majuscules = 0 minuscules = 0 @@ -94,9 +94,9 @@ Il ne doit pas test = commands.getoutput("echo '%s' | /usr/sbin/crack_testlib" % mdp) if test.split(':')[-1] != ' ok' : commentaire = { - ' it does not contain enough DIFFERENT characters': u'Il y a trop de caractères identiques.' , - ' it is based on a dictionary word': u'Le mot de passe est basé sur un mot du dictionnaire' , - ' it is too simplistic/systematic': u'Le mot de passe est trop simple/répétitif' + ' it does not contain enough DIFFERENT characters': u'Il y a trop de caractères identiques.' , + ' it is based on a dictionary word': u'Le mot de passe est basé sur un mot du dictionnaire' , + ' it is too simplistic/systematic': u'Le mot de passe est trop simple/répétitif' }.get(test.split(':')[-1],test.split(':')[-1]) cprint(commentaire, 'rouge') continue @@ -104,7 +104,7 @@ Il ne doit pas ### On redemande le mot de passe mdp1 = getpass.getpass('Retaper mot de passe : ') if mdp != mdp1 : - cprint(u'Les deux mots de passe entrés sont différents, réesayer', 'rouge') + cprint(u'Les deux mots de passe entrés sont différents, réesayer', 'rouge') continue break @@ -114,7 +114,7 @@ Il ne doit pas cprint(u'Erreur lors du changement de mot de passe', 'rouge') syslog.syslog("LDAP password changed for dn=%s" % dn) else : - cprint(u'Changement effectué avec succès', u'vert') + cprint(u'Changement effectué avec succès', u'vert') except KeyboardInterrupt : cprint(u'\nAbandon', 'rouge') @@ -125,7 +125,7 @@ Il ne doit pas pass if __name__ == '__main__' : - sys.stdout.write('\r \r') # Pour esthétique lors de l'utilisation par sudo + sys.stdout.write('\r \r') # Pour esthétique lors de l'utilisation par sudo if len(sys.argv) == 1 : # Changement de son mot de passe login = getuser() @@ -136,7 +136,7 @@ if __name__ == '__main__' : print "Changement du mot de passe du compte choisi." sys.exit(255) else : - # Changement du mot de passe par un câbleur ou une nounou + # Changement du mot de passe par un câbleur ou une nounou login = sys.argv[1] self_mode = False for c in login[:] : @@ -153,12 +153,12 @@ if __name__ == '__main__' : else : s = commands.getoutput("/usr/bin/ldapsearch -D cn=readonly,dc=crans,dc=org -y/etc/ldap/readonly -x -LLL '(&(objectClass=posixAccount)(uid=%s))' dn nom prenom droits | grep -v MultiMachines" % login).strip() if not s : - cprint(u'Login non trouvé dans la base LDAP', 'rouge') + cprint(u'Login non trouvé dans la base LDAP', 'rouge') sys.exit(3) # Ca a l'air bon if s.find('\n\n') != -1 : - # Plusieurs trouvé : pas normal + # Plusieurs trouvé : pas normal cprint(u'Erreur lors de la recherche du login : plusieurs occurences !', 'rouge') sys.exit(4) @@ -174,7 +174,7 @@ if __name__ == '__main__' : sys.exit(5) if self_mode : - # Il faut vérifier l'ancien mot de passe + # Il faut vérifier l'ancien mot de passe ldap_auth_dn = dn ldap_password = getpass.getpass('Mot de passe actuel : ') s = commands.getoutput("/usr/bin/ldapwhoami -H '%s' -x -D '%s' -w '%s'" % ( uri, ldap_auth_dn, ldap_password ) ).strip() @@ -188,7 +188,7 @@ if __name__ == '__main__' : sys.exit(8) elif len(s) > 3 and os.getuid()!=0 : - # Adhérent avec droits et on est pas root + # Adhérent avec droits et on est pas root From = 'roots@crans.org' To = 'roots@crans.org' mail = """From: Root <%s> @@ -203,7 +203,7 @@ Tentative de changement du mot de passe de %s par %s. conn = smtplib.SMTP('localhost') conn.sendmail(From, To , mail ) conn.quit() - cprint(u'Impossible de changer le mot de passe de cet adhérent : compte privilégié', 'rouge') + cprint(u'Impossible de changer le mot de passe de cet adhérent : compte privilégié', 'rouge') sys.exit(6) # Finalement ! diff --git a/gestion/chsh.py b/gestion/chsh.py index d9f50208..e6e4753e 100755 --- a/gestion/chsh.py +++ b/gestion/chsh.py @@ -1,10 +1,10 @@ #! /usr/bin/env python -# -*- coding: iso-8859-15 -*- +# -*- coding: utf-8 -*- """ Changement du shell de l'utilisateur lancant le programme DOIT ETRE LANCE PAR SUDO - Copyright (C) Frédéric Pauget + Copyright (C) Frédéric Pauget Licence : GPLv2 """ import os, sys @@ -15,18 +15,18 @@ from ldap_crans import crans_ldap db = crans_ldap() uid = os.getenv('SUDO_UID') if not uid : - print "Impossible de déterminer l'utilisateur" + print "Impossible de déterminer l'utilisateur" sys.exit(1) s = db.search('uidNumber=%s' % os.getenv('SUDO_UID'),'w') -# On vérifie que c'est pas un club +# On vérifie que c'est pas un club club = s['club'] if len(club) == 1 : print 'Pas de changement de shell pour les clubs' sys.exit(2) -# On regarde si on a des résultats dans les adhérents +# On regarde si on a des résultats dans les adhérents adh = s['adherent'] if len(adh) != 1 : print 'Erreur fatale lors de la consultation de la base LDAP' diff --git a/gestion/config.py b/gestion/config.py index 1b4519af..f1127caf 100644 --- a/gestion/config.py +++ b/gestion/config.py @@ -1,34 +1,34 @@ # -*- python -*- -# -*- coding: iso-8859-15 -*- +# -*- coding: utf-8 -*- ############################################ -## Définition du comportement des scripts ## +## Définition du comportement des scripts ## ############################################ from time import localtime # Administratif caution = 0 -#Précablage possible ? +#Précablage possible ? precab = False -# Année scolaire en cours +# Année scolaire en cours dat = localtime() if dat[1]<9 : ann_scol = dat[0]-1 else : ann_scol = dat[0] -# Bloquage si carte d'étudiants manquante pour l'année en cours +# Bloquage si carte d'étudiants manquante pour l'année en cours # Au niveau du Squid bl_carte_et_actif = True -# L'adhérent est considéré comme paiement pas ok +# L'adhérent est considéré comme paiement pas ok bl_carte_et_definitif = False # Gel des cableurs pas a jour de cotisation # Les droits ne sont pas retires mais il n'y a plus de sudo bl_vieux_cableurs = False -##Création de comptes -# Gid des comptes créés +##Création de comptes +# Gid des comptes créés gid=100 club_gid=120 # Shell @@ -37,7 +37,7 @@ club_login_shell='/usr/bin/rssh' # Longueur maximale d'un login maxlen_login=15 -## Répertoire de stockage des objets détruits +## Répertoire de stockage des objets détruits cimetiere = '/home/cimetiere' ## Adresses mac utiles @@ -47,7 +47,7 @@ mac_titanic = 'aa:73:65:63:6f:76' ## Serveur principal de bcfg2 bcfg2_main = "vert.adm.crans.org" -## Compatibilité inverse +## Compatibilité inverse cfengine_main = bcfg2_main ## Fichier de mapping lun/nom de volume iscsi @@ -58,10 +58,10 @@ class impression: """Cette classe contient toutes les variables de prix concernant l'impression""" - # Découvert autorisé (en euro) + # Découvert autorisé (en euro) decouvert = 0. - ###### Variables de prix (tout est exprimé en centimes) ###### + ###### Variables de prix (tout est exprimé en centimes) ###### # Cout imprimante : 9150,60 euros # 200.000 pages par mois, garantie 1an @@ -91,13 +91,13 @@ class impression: # 1406.50 les 3 tambours couleurs pour 40.000 passages c_tambour_coul = 3.51624 - # Une feuille à 5% = 5 unites - # Cout de 1 unité de noir + # Une feuille à 5% = 5 unites + # Cout de 1 unité de noir # 1 toner fait 125.000 unites et coute 203.32euros # 1 kit de nettoyage fait 250.000 unites et coute 63.30euros c_noir = 0.18798 - # Cout de 1 unité de couleur + # Cout de 1 unité de couleur # 1 tonner fait 125.000 unites et coute 328.90euros c_coul = 0.78936 @@ -105,7 +105,7 @@ class impression: c_agrafe = 4800. / 5000. / 3. # Prix de la facture - # 2500 feuilles rouges à 40.07 euros (pour l'instant l'encre + # 2500 feuilles rouges à 40.07 euros (pour l'instant l'encre # de la facture est gracieusement offerte) # fact = 1.6028 fact = 0 @@ -118,7 +118,7 @@ class impression: ## Pour le controle d'upload class upload: - # liste des exemptations générales + # liste des exemptations générales exempt = [ ['138.231.136.0/21', '138.231.0.0/16'], ['138.231.148.0/22', '138.231.0.0/16'] ] @@ -128,11 +128,11 @@ class upload: # limite hard hard = 700 - # envoi des mails à disconnect@ + # envoi des mails à disconnect@ disconnect_mail_soft = False disconnect_mail_hard = True - # expéditeur des mails de déconnexion + # expéditeur des mails de déconnexion expediteur = "disconnect@crans.org" # textes des mails @@ -143,33 +143,33 @@ Content-Type: text/plain; charset="iso-8859-15" Bonjour %(proprio)s, -Nous t'informons que ta (tes) machine(s) envoie(nt) une quantité -importante de données vers l'extérieur (%(upload)s Mo en 24 heures). +Nous t'informons que ta (tes) machine(s) envoie(nt) une quantité +importante de données vers l'extérieur (%(upload)s Mo en 24 heures). -*Ce message t'est envoyé à titre informatif, il ne te sanctionne pas.* +*Ce message t'est envoyé à titre informatif, il ne te sanctionne pas.* -Il signifie que tu as envoyé plus de 100 Mo au cours des dernières 24 +Il signifie que tu as envoyé plus de 100 Mo au cours des dernières 24 heures. Cela peut venir du fait que, *par exemple*, tu essaies -d'envoyer des fichiers de grosse taille à l'extérieur de la zone +d'envoyer des fichiers de grosse taille à l'extérieur de la zone crans, ou encore que tu as fait une utilisation importante de -logiciels envoyant une très grande quantité de petites données -(vidéo-conférence par exemple). Il peut y avoir d'autres raisons. +logiciels envoyant une très grande quantité de petites données +(vidéo-conférence par exemple). Il peut y avoir d'autres raisons. -Si cela continuait, et que tu dépassais la limite acceptable des 700 -Mo sur 24 heures, tu serais automatiquement déconnecté du réseau pour -une durée de 24 heures. Il t'appartient donc de surveiller cela de -plus près et de faire en sorte que tes machines n'uploadent pas de -manière excessive à l'avenir. +Si cela continuait, et que tu dépassais la limite acceptable des 700 +Mo sur 24 heures, tu serais automatiquement déconnecté du réseau pour +une durée de 24 heures. Il t'appartient donc de surveiller cela de +plus près et de faire en sorte que tes machines n'uploadent pas de +manière excessive à l'avenir. Pour plus d'informations, tu peux consulter la page: -http://wiki.crans.org/VieCrans/DéconnexionPourUpload +http://wiki.crans.org/VieCrans/DéconnexionPourUpload Si tu as des questions, contacte disconnect@crans.org -NB : L'upload consiste en l'envoi de données vers des machines n'étant -pas branchées sur le CRANS. +NB : L'upload consiste en l'envoi de données vers des machines n'étant +pas branchées sur le CRANS. -- Disconnect team""" @@ -181,23 +181,23 @@ Content-Type: text/plain; charset="iso-8859-15" Bonjour %(proprio)s, -Tu as temporairement été déconnecté du réseau en raison de l'envoi -trop important de données vers l'extérieur (%(upload)s Mo en 24h). +Tu as temporairement été déconnecté du réseau en raison de l'envoi +trop important de données vers l'extérieur (%(upload)s Mo en 24h). -Tu as toujours accés au web ainsi qu'à tes mails crans mais tous les +Tu as toujours accés au web ainsi qu'à tes mails crans mais tous les autres services te sont suspendus. Si cela devait se renouveller trop -souvent, tu serais déconnecté complétement pour une durée plus -importante. Il t'appartient donc de surveiller cela de plus près et de -faire en sorte que ta machine n'uploade plus de manière excessive à +souvent, tu serais déconnecté complétement pour une durée plus +importante. Il t'appartient donc de surveiller cela de plus près et de +faire en sorte que ta machine n'uploade plus de manière excessive à l'avenir. Pour plus d'informations, tu peux consulter la page : -http://wiki.crans.org/VieCrans/DéconnexionPourUpload +http://wiki.crans.org/VieCrans/DéconnexionPourUpload Si tu as des questions, contacte disconnect@crans.org -NB: L'upload consiste en l'envoi de données vers des machines n'étant -pas branchées sur le CRANS. +NB: L'upload consiste en l'envoi de données vers des machines n'étant +pas branchées sur le CRANS. -- Disconnect team""" @@ -211,17 +211,17 @@ Content-Type: text/plain; charset="iso-8859-15" %(proprio)s uploade actuellement %(upload)s Mo. -- -Message créé par deconnexion.py""" +Message créé par deconnexion.py""" message_disconnect_hard = u"""From: %(from)s To: %(to)s Subject: %(proprio)s a =?iso-8859-1?Q?=E9t=E9=20d=E9connect=E9?= Content-Type: text/plain; charset="iso-8859-15" -%(proprio)s a été déconnecté pour upload (%(upload)s Mo). +%(proprio)s a été déconnecté pour upload (%(upload)s Mo). -- -Message créé par deconnexion.py""" +Message créé par deconnexion.py""" message_disconnect_multi = u"""From: %(from)s To: %(to)s @@ -229,13 +229,13 @@ Subject: %(proprio)s a =?iso-8859-1?Q?=E9t=E9=20d=E9connect=E9?= %(nbdeco)d fois pour upload en un mois ! Content-Type: text/plain; charset="iso-8859-15" -L'adhérent %(proprio)s a été déconnecté %(nbdeco)d fois pour upload en un mois ! +L'adhérent %(proprio)s a été déconnecté %(nbdeco)d fois pour upload en un mois ! -Le PS a été généré et se trouve sur zamok : +Le PS a été généré et se trouve sur zamok : %(ps)s -- -Message créé par deconnexion.py""" +Message créé par deconnexion.py""" message_demenagement = u"""From: %(from)s @@ -245,9 +245,9 @@ Content-Type: text/plain; charset="iso-8859-15" Bonjour, -Il semble que tu étais inscrit dans la chambre %(chambre), mais un -autre adhérent s'y est inscrit, ce qui suppose que tu n'y es plus. -Pourrais tu nous préciser ta nouvelle chambre ou adresse stp ? +Il semble que tu étais inscrit dans la chambre %(chambre), mais un +autre adhérent s'y est inscrit, ce qui suppose que tu n'y es plus. +Pourrais tu nous préciser ta nouvelle chambre ou adresse stp ? Si tu es parti du campus, souhaites-tu garder tes machines ? -- @@ -255,7 +255,7 @@ Merci par avance, Les membres actifs du Crans""" -# Classe pour les paramètres du firewall # +# Classe pour les paramètres du firewall # ########################################## class conf_fw: mark = { 'https-radin': '0x3', @@ -263,25 +263,25 @@ class conf_fw: 'proxy' : '0x2', 'bittorrent' : '0x1' } - # Valeur du masque utilisé pour créer un arbre dans les filtres + # Valeur du masque utilisé pour créer un arbre dans les filtres mask = [24] -# Classe pour la détection des virus # +# Classe pour la détection des virus # ###################################### class virus: # Nombre de Flood Par heure flood = 100 virus = 10 -# Classe pour la détection du p2p # +# Classe pour la détection du p2p # ################################### class p2p : - # Limite de débit pour l'ensemble du p2p classifié, en octets/s + # Limite de débit pour l'ensemble du p2p classifié, en octets/s # identique en upload et download debit_max = 1000000 # = 1 Mb/s = 125 ko/s debit_adh = 12000 # = 12 Kb/s = 1500 o/s (>= MTU [1500 bytes]) - # Limite de paquets acceptés par protocole P2P en deux heures + # Limite de paquets acceptés par protocole P2P en deux heures limite = {'Bittorrent': 20, 'AppleJuice': 50, 'SoulSeek': 500, @@ -291,10 +291,10 @@ class p2p : 'KaZaa': 50, 'Ares': 50, 'GNUtella': 50 } - # Envoi des mails à disconnect@ + # Envoi des mails à disconnect@ disconnect_mail = True - # Expéditeur des mails de déconnexion + # Expéditeur des mails de déconnexion expediteur = "disconnect@crans.org" avertissement = u"""From: %(From)s @@ -302,35 +302,35 @@ To: %(To)s Subject: =?iso-8859-1?Q?D=E9tection?= de p2p sur la machine %(hostname)s Content-Type: text/plain; charset="iso-8859-15" -La machine %(hostname)s a été déconnectée pendant 24h pour +La machine %(hostname)s a été déconnectée pendant 24h pour utilisation du protocole %(protocole)s. Nombre de paquets : %(nb_paquets)s paquets depuis le %(datedebut)s. -- -Message créé par deconnexion.py""" +Message créé par deconnexion.py""" deconnexion = u"""From: %(From)s To: %(To)s Subject: Avis de =?iso-8859-15?Q?D=E9connexion?= Content-Type: text/plain; charset="iso-8859-15" Bonjour, -Nous avons détecté que ta machine, %(hostname)s utilisait le +Nous avons détecté que ta machine, %(hostname)s utilisait le *protocole* %(protocole)s. Cela signifie : - - Ou bien que tu utilises le logiciel qui a le même nom + - Ou bien que tu utilises le logiciel qui a le même nom que ce protocole, - Ou bien que tu utilises un logiciel qui utilise le protocole en question pour partager des fichiers. Or l'usage de *protocoles* de type peer to peer est interdit -sur notre réseau, conformément aux documents que tu as acceptés -en adhérant au CR@NS. +sur notre réseau, conformément aux documents que tu as acceptés +en adhérant au CR@NS. -Lorsqu'un seul des adhérents du CR@NS utilise des protocoles interdits, -il pénalise l'ensemble des adhérents de l'association. +Lorsqu'un seul des adhérents du CR@NS utilise des protocoles interdits, +il pénalise l'ensemble des adhérents de l'association. -Tu seras donc déconnecté 24h. +Tu seras donc déconnecté 24h. -- Disconnect Team""" @@ -340,29 +340,29 @@ To: %(to)s Subject: %(proprio)s a =?iso-8859-15?Q?=E9t=E9=20d=E9connect=E9?= %(nbdeco)d fois pour p2p en un an ! Content-Type: text/plain; charset="iso-8859-15" -L'adhérent %(proprio)s a été déconnecté %(nbdeco)d fois pour p2p en un an ! +L'adhérent %(proprio)s a été déconnecté %(nbdeco)d fois pour p2p en un an ! -Le PS a été généré et se trouve sur zamok : +Le PS a été généré et se trouve sur zamok : %(ps)s -- -Message créé par deconnexion.py""" +Message créé par deconnexion.py""" ############################# -## Paramètres des machines ## +## Paramètres des machines ## ############################# -## >>>>>>>>>>>>>>> La modification des paramètres suivants doit se -## >> ATTENTION >> faire avec précaution, il faut mettre la base à -## >>>>>>>>>>>>>>> jour en parralèle de ces modifs. +## >>>>>>>>>>>>>>> La modification des paramètres suivants doit se +## >> ATTENTION >> faire avec précaution, il faut mettre la base à +## >>>>>>>>>>>>>>> jour en parralèle de ces modifs. -# Sous réseaux alloués à chaque type de machine ou bâtiment -# Pour la zone wifi, il faut penser à modifier le /etc/network/interfaces +# Sous réseaux alloués à chaque type de machine ou bâtiment +# Pour la zone wifi, il faut penser à modifier le /etc/network/interfaces # de sable, zamok et komaz pour ajouter les zones en plus (et de -# faire en sorte qu'ils prennent effet immédiatement ; c'est important pour -# komaz car c'est la route par défaut mais aussi pour zamok et sable -# à cause de leur firewall et de leur patte wifi. +# faire en sorte qu'ils prennent effet immédiatement ; c'est important pour +# komaz car c'est la route par défaut mais aussi pour zamok et sable +# à cause de leur firewall et de leur patte wifi. NETs = { 'serveurs' : [ '138.231.136.0/28' ], 'adherents' : [ '138.231.137.0/24', '138.231.138.0/24', @@ -381,7 +381,7 @@ NETs = { 'serveurs' : [ '138.231.136.0/28' ], NETs_regexp = { 'all' : '^138\.231\.1(3[6789]|4[0123456789]|5[01])\.\d+$' } -# Domaines dans lesquels les machines sont placées suivant leur type +# Domaines dans lesquels les machines sont placées suivant leur type domains = { 'machineFixe': 'crans.org', 'machineCrans': 'crans.org', 'machineWifi': 'wifi.crans.org', @@ -420,24 +420,24 @@ To: %(To)s Subject: [CRANS] Bienvenue au Cr@ns ! Content-Type: text/plain; charset="iso-8859-15" -Si tu lis ce mail, c'est que ton inscription à l'association est effective ! +Si tu lis ce mail, c'est que ton inscription à l'association est effective ! Rappel : Le site web de l'association est http://www.crans.org. Par ailleurs, toutes les informations concernant l'association sont -disponibles sur le WIKI à l'adresse http://wiki.crans.org +disponibles sur le WIKI à l'adresse http://wiki.crans.org Notamment, il est important de prendre le temps de lire la page : http://wiki.crans.org/CransPratique -Elle regroupe toutes les informations nécessaires à l'utilisation des +Elle regroupe toutes les informations nécessaires à l'utilisation des ressources de l'association. -Sans lire attentivement ce document, l'accès au Web peut ne pas +Sans lire attentivement ce document, l'accès au Web peut ne pas fonctionner. ----- -L'accés aux news et au wiki sont limités à un usage interne au CRANS. -Pour y avoir accés depuis l'extérieur il faut utiliser un mot de passe: +L'accés aux news et au wiki sont limités à un usage interne au CRANS. +Pour y avoir accés depuis l'extérieur il faut utiliser un mot de passe: - Pour les news : * Utilisateur : Vivelapa * Mot de passe : ranoia! @@ -448,7 +448,7 @@ Pour y avoir acc Sur ce, bienvenue au Cr@ns ! -PS: Il t'est conseillé de conserver ce mail à toutes fin utiles +PS: Il t'est conseillé de conserver ce mail à toutes fin utiles -- Les membres actifs.""" @@ -460,14 +460,14 @@ Content-Type: text/plain; charset="iso-8859-15" Bonjour, -Tu viens d'être doté des droits %(Droit)s au Cr@ns. -Une description de ces droits et de la manière +Tu viens d'être doté des droits %(Droit)s au Cr@ns. +Une description de ces droits et de la manière de les utiliser est disponible sur la page : %(Page)s -Si tu as des questions, n'hésite pas à les poser -à d'autres câbleurs ou aux nounous. +Si tu as des questions, n'hésite pas à les poser +à d'autres câbleurs ou aux nounous. -- Les nounous""" @@ -487,10 +487,10 @@ Content-Type: text/plain; charset="iso-8859-1" Bonjour, Il semble que tu es membre actif du CRANS et que tu n'as pas -signé la charte des membres actifs. Si tu n'es pas membre actif -ou si tu as signé la charte des membres actifs, merci de nous le +signé la charte des membres actifs. Si tu n'es pas membre actif +ou si tu as signé la charte des membres actifs, merci de nous le signaler. Sinon, il faudrait signer la charte et nous la rendre -rapidement. Tu peux l'imprimer à partir du fichier suivant : +rapidement. Tu peux l'imprimer à partir du fichier suivant : https://wiki.crans.org/CransAdministratif?action=AttachFile&do=get&target=charte_ma.pdf @@ -506,11 +506,11 @@ Content-Type: text/plain; charset="iso-8859-1" Bonjour, -Les droits que tu avais sur ton compte CRANS ont été retirés -car tu ne cotises pas cette année et que tes droits ne semblent -pas être utiles pour une utilisation à distance. Si nous avons +Les droits que tu avais sur ton compte CRANS ont été retirés +car tu ne cotises pas cette année et que tes droits ne semblent +pas être utiles pour une utilisation à distance. Si nous avons commis une erreur, nous te prions de nous en excuser. Si tu -souhaites par la suite retrouver des droits, nous serons bien sûr +souhaites par la suite retrouver des droits, nous serons bien sûr heureux de te les remettre. Cordialement, diff --git a/gestion/config_mail.py b/gestion/config_mail.py index e1edc89a..c195da97 100755 --- a/gestion/config_mail.py +++ b/gestion/config_mail.py @@ -1,12 +1,12 @@ #! /usr/bin/env python -# -*- coding: iso8859-15 -*- +# -*- coding: utf-8 -*- ############################################################################### -# config_mail : gestion du .forward et .procmailrc des adhérents +# config_mail : gestion du .forward et .procmailrc des adhérents ############################################################################### # The authors of this code are -# Etienne Chové +# Etienne Chové # -# Copyright (C) 2006 Etienne Chové +# Copyright (C) 2006 Etienne Chové # All rights reserved. # # This program is free software; you can redistribute it and/or modify @@ -28,7 +28,7 @@ ## Chaines de formatage pour le procmailrc """ -Script permetant de gérer sa configuration mail +Script permetant de gérer sa configuration mail Usage : ConfigMail.py [--forward=(|)] [--spam=(accepte|marque|supprime)] Retourne : @@ -37,7 +37,7 @@ Retourne : """ procmail_warning = """################################################################ -# Ce fichier de configuration a été automatiquement généré par # +# Ce fichier de configuration a été automatiquement généré par # # l'intranet. # # # # ATTENTION : ne le modifiez que si vous savez ce que vous # @@ -51,7 +51,7 @@ procmail_mark = """# Passage des mails dans spamassassin * < 256000 | spamc -# Serveur blacklisté +# Serveur blacklisté :0 * ^X-Reject: 554 * !^X-Spam-Status: Yes @@ -100,7 +100,7 @@ def _IsMail(mail): def _Clean(texte): """ - Nettoie une chaine de caractère/liste en supprimant les lignes vides/commentés, + Nettoie une chaine de caractère/liste en supprimant les lignes vides/commentés, et retourne une liste """ if type(texte) != list: @@ -126,7 +126,7 @@ def _GetConfig(): # utilisation de procmail if fic_forward != _Clean(forward_procmail)[0]: - raise MailConfigError, 'Fichier forward non compréhensible' + raise MailConfigError, 'Fichier forward non compréhensible' ## lecture du .procmailrc fic_procmail = _Clean( open('%s/.procmailrc'%home).readlines() ) @@ -145,7 +145,7 @@ def _GetConfig(): # marquage des spams tmp = _Clean( procmail_mark ) if fic_procmail[:len(tmp)] != tmp: - raise MailConfigError, 'Fichier de procmail non compréhensible' + raise MailConfigError, 'Fichier de procmail non compréhensible' fic_procmail = fic_procmail[len(tmp):] # suppression des spams ? @@ -154,7 +154,7 @@ def _GetConfig(): elif fic_procmail == _Clean(procmail_delete_spam): return {'forward':forward, 'spam':'supprime'} else: - raise MailConfigError, 'Fichier de procmail non compréhensible' + raise MailConfigError, 'Fichier de procmail non compréhensible' def _SetConfig(forward = None, spam= None): """ Modifie la configuration de l'utilisateur courant """ @@ -165,7 +165,7 @@ def _SetConfig(forward = None, spam= None): elif spam == None: new_spam = _GetConfig()['spam'] else: - raise ValueError, 'Valeur interdite pour le paramètre spam' + raise ValueError, 'Valeur interdite pour le paramètre spam' # variable forward if forward == None: @@ -175,7 +175,7 @@ def _SetConfig(forward = None, spam= None): else: raise ValueError, 'Adresse mail invalide' - # génération des fichiers + # génération des fichiers if new_spam=='accepte': # suppression du .procmailrc try: @@ -188,14 +188,14 @@ def _SetConfig(forward = None, spam= None): else: os.remove('%s/.forward'%home) else: - # écriture du .procmailc + # écriture du .procmailc txt = procmail_warning + procmail_mark if new_spam=='supprime': txt += procmail_delete_spam if new_forward: txt += procmail_forward % new_forward open('%s/.procmailrc'%home,'w').write(txt) - # écriture du .forward + # écriture du .forward open('%s/.forward'%home,'w').write(forward_procmail) def _Sudo(uid, forward=None, spam=None): @@ -234,9 +234,9 @@ def _Sudo(uid, forward=None, spam=None): def MailConfig(uid=None, forward=None, spam=None): """ Modifie ou retourne la configuration mail de l'utilisateur - user = utilisateur à configurer, si None configure l'utilisateur courant + user = utilisateur à configurer, si None configure l'utilisateur courant forward = adresse vers laquelle rediriger les mails, chaine vide si pas de redirection - spam = action à effectuer sur les spams (accepte, supprime, marque) + spam = action à effectuer sur les spams (accepte, supprime, marque) Pour les champs forward et spam, la valeur None ne touche pas au champ. @@ -275,7 +275,7 @@ if __name__=="__main__": ## execution de MailConfig res = MailConfig(forward=forward, spam=spam) - ## affichage des résultats + ## affichage des résultats for i in res.items(): print "%s=%s" % i diff --git a/gestion/email_tools.py b/gestion/email_tools.py index 29cd166c..b6e6ea36 100755 --- a/gestion/email_tools.py +++ b/gestion/email_tools.py @@ -1,14 +1,14 @@ #! /usr/bin/env python -# -*- coding: iso-8859-15 -*- +# -*- coding: utf-8 -*- -# Copyright (C) Stéphane Glondu + ??? +# Copyright (C) Stéphane Glondu + ??? # Licence : ??? """ -Envoi de mails textes encodés et bien formatés (encodages spécifiés là il faut). +Envoi de mails textes encodés et bien formatés (encodages spécifiés là il faut). Autres outils relatifs aux mails. -format_sender et send_email adaptés depuis /usr/scripts/impression/crans_backend.py. +format_sender et send_email adaptés depuis /usr/scripts/impression/crans_backend.py. """ import re @@ -103,12 +103,12 @@ def send_email(sender, recipient, subject, body, server='localhost', cc=None, de def parse_mail_template(fichier): """ Lit fichier et renvoie le couple sujet, corps en unicode. - Les trois premières lignes de fichier doivent être : + Les trois premières lignes de fichier doivent être : Encoding: Subject: Le reste forme le corps du mail. - L'argument fichier peut être un nom de fichier, ou directement une + L'argument fichier peut être un nom de fichier, ou directement une instance de file. """ if not isinstance(fichier, file): diff --git a/gestion/gest_crans.py b/gestion/gest_crans.py index 4a539412..21b791bc 100755 --- a/gestion/gest_crans.py +++ b/gestion/gest_crans.py @@ -1,20 +1,20 @@ #! /usr/bin/env python -# -*- coding: iso-8859-15 -*- +# -*- coding: utf-8 -*- """ -Interface utilisateur du système de gestion des machines -et adhérents du crans +Interface utilisateur du système de gestion des machines +et adhérents du crans -Copyright (C) Frédéric Pauget +Copyright (C) Frédéric Pauget Licence : GPLv2 -Les fonctions set_* permettent de définir certains -paramètres liés à un adhérent ou une machine, elles posent les questions -puis apellent la méthode adpatée de la classe adhérent ou machine. -Elles prennent toute une instances de cette classe en paramètre. -Elles retournent 1 si l'action à échoué et None si OK. +Les fonctions set_* permettent de définir certains +paramètres liés à un adhérent ou une machine, elles posent les questions +puis apellent la méthode adpatée de la classe adhérent ou machine. +Elles prennent toute une instances de cette classe en paramètre. +Elles retournent 1 si l'action à échoué et None si OK. Les fonction select permettent de choisir un objet dans la base -Retournent None si pas d'objet trouvé. +Retournent None si pas d'objet trouvé. """ ### Rapport de bug automatique @@ -58,30 +58,30 @@ else: def dialog(arg): - return affich_tools.dialog(u'Gestion des adhérents et machines du Crans', arg, dialog_theme) + return affich_tools.dialog(u'Gestion des adhérents et machines du Crans', arg, dialog_theme) ######################################################################### -## Fonctions de remplissage ou modification des paramètres d'un adhérent +## Fonctions de remplissage ou modification des paramètres d'un adhérent def set_bases(adher): """ - Définition des paramètres de bases d'un adhérent : + Définition des paramètres de bases d'un adhérent : * Nom * Prenom - * Téléphone + * Téléphone * Chambre """ # Construction de la boite de dialogue - arg = u'--title "Inscription adhérent" ' + arg = u'--title "Inscription adhérent" ' arg += u'--form "" 0 0 0 ' arg += u'"Nom :" 1 1 "%s" 1 13 20 20 ' % adher.nom() - arg += u'"Prénom :" 2 1 "%s" 2 13 20 20 ' % adher.prenom() - arg += u'"Numéro de téléphone :" 3 1 "%s" 3 23 15 00 ' % adher.tel() + arg += u'"Prénom :" 2 1 "%s" 2 13 20 20 ' % adher.prenom() + arg += u'"Numéro de téléphone :" 3 1 "%s" 3 23 15 00 ' % adher.tel() arg += u'"Chambre :" 4 1 "%s" 4 11 05 00 ' % adher.chbre() - arg += u'"(bat+numéro)" 4 17 "" 0 0 0 0 ' - arg += u'"EXT pour chambre extérieure au campus" 5 1 "" 0 0 0 0 ' + arg += u'"(bat+numéro)" 4 17 "" 0 0 0 0 ' + arg += u'"EXT pour chambre extérieure au campus" 5 1 "" 0 0 0 0 ' # Affichage annul, result = dialog(arg) @@ -102,50 +102,50 @@ def set_bases(adher): # Des erreurs ? if err: - arg = u'--title "Inscription adhérent" ' + arg = u'--title "Inscription adhérent" ' arg += u'--msgbox "%s\n\n" 0 0' % err dialog(arg) # On redemande return set_bases(adher) if adher.chbre() == 'EXT': - # Il faut demander l'adresse extérieure + # Il faut demander l'adresse extérieure if set_addr_ext(adher): # Annulation return set_bases(adher) def _set_chbre(adher, chbre): - """ Attribution de la chambre chbre à l'adhérent fourni - Retourne une chaine (unicode) avec l'erreur éventuelle + """ Attribution de la chambre chbre à l'adhérent fourni + Retourne une chaine (unicode) avec l'erreur éventuelle """ if chbre == '????': - # Réservé à un usage interne + # Réservé à un usage interne return u'Chambre invalide\n' try: c = adher.chbre(chbre) except EnvironmentError, c: return c.args[0] + '\n' except ValueError, c: if len(c.args) == 2: - # La chambre est occup-Aée-b + # La chambre est occup-Aée-b squatteur = c.args[1] aff(squatteur) - arg = u'--title "Inscription adhérent" ' - arg += u'--yesno "Un adhérent (%s) occupe déjà cette chambre.\n' % squatteur.Nom() - arg += u'\nChanger la chambre de cet adhérent ?" 0 0' + arg = u'--title "Inscription adhérent" ' + arg += u'--yesno "Un adhérent (%s) occupe déjà cette chambre.\n' % squatteur.Nom() + arg += u'\nChanger la chambre de cet adhérent ?" 0 0' no, res = dialog(arg) if not no: squatteur.chbre('????') squatteur.save() - # On recommence, le géneur doit être parti. + # On recommence, le géneur doit être parti. return _set_chbre(adher, chbre) return c.args[0] + '\n' return u'' def set_addr_ext(adher): - """ Définition de l'adresse extérieure d'un adhérent - La chambre de cet adhérent doit être EXT, sinon erreur """ - arg = u'--title "Adresse extérieure de %s" ' % adher.Nom() + """ Définition de l'adresse extérieure d'un adhérent + La chambre de cet adhérent doit être EXT, sinon erreur """ + arg = u'--title "Adresse extérieure de %s" ' % adher.Nom() arg += u'--form "" 0 0 0 ' arg += u'"" 1 1 "%s" 1 1 46 50 ' % adher.adresse()[0] arg += u'"" 2 1 "%s" 2 1 46 50 ' % adher.adresse()[1] @@ -157,7 +157,7 @@ def set_addr_ext(adher): try: adher.adresse(result) except ValueError, c: - arg = u'--title "Adresse extérieure de %s" ' % adher.Nom() + arg = u'--title "Adresse extérieure de %s" ' % adher.Nom() arg += u'--msgbox "%s\n\n\n" 0 0' % c.args[0] dialog(arg) # On redemande @@ -165,9 +165,9 @@ def set_addr_ext(adher): def set_etudes(adher): """ - Définition des études en 3 questions : - * établissement - * année administrative + Définition des études en 3 questions : + * établissement + * année administrative * section/labo """ @@ -175,26 +175,26 @@ def set_etudes(adher): arg = u'--title "Etudes de %s (1/3)" ' % adher.Nom() if adher.etudes(0): arg += u'--default-item "%s" ' % adher.etudes(0) - arg += u'--menu "Choisissez l\'établissement : " 0 0 0 ' + arg += u'--menu "Choisissez l\'établissement : " 0 0 0 ' if adher.etudes(0): arg += u'"Autre" "" ' arg += u'"ENS" "" ' arg += u'"IUT Cachan" "" ' arg += u'"Maximilien Sorre" "" ' arg += u'"Gustave Eiffel" "" ' - arg += u'"P1" "Université Panthéon Sorbonne" ' - arg += u'"P2" "Université Panthéon Assas" ' - arg += u'"P3" "Université de la Sorbonne Nouvelle" ' - arg += u'"P4" "Université Paris Sorbonne" ' - arg += u'"P5" "Université René Descartes" ' - arg += u'"P6" "Université Pierre et Marie Curie" ' - arg += u'"P7" "Université Denis Diderot" ' - arg += u'"P8" "Université Vincennes Saint Denis" ' - arg += u'"P9" "Université Paris Dauphine" ' - arg += u'"P10" "Université de Nanterre" ' - arg += u'"P11" "Université de Paris Sud (Orsay)" ' - arg += u'"P12" "Université Val de Marne" ' - arg += u'"P13" "Université Paris Nord" ' + arg += u'"P1" "Université Panthéon Sorbonne" ' + arg += u'"P2" "Université Panthéon Assas" ' + arg += u'"P3" "Université de la Sorbonne Nouvelle" ' + arg += u'"P4" "Université Paris Sorbonne" ' + arg += u'"P5" "Université René Descartes" ' + arg += u'"P6" "Université Pierre et Marie Curie" ' + arg += u'"P7" "Université Denis Diderot" ' + arg += u'"P8" "Université Vincennes Saint Denis" ' + arg += u'"P9" "Université Paris Dauphine" ' + arg += u'"P10" "Université de Nanterre" ' + arg += u'"P11" "Université de Paris Sud (Orsay)" ' + arg += u'"P12" "Université Val de Marne" ' + arg += u'"P13" "Université Paris Nord" ' arg += u'"IUFM" "" ' arg += u'"Personnel ENS" "dans les appartements de l\'ENS" ' if not adher.etudes(0): @@ -205,13 +205,13 @@ def set_etudes(adher): if result[0] == 'Autre': arg = u'--title "Etudes de %s (1/3)" ' % adher.Nom() - arg += u'--inputbox "Précisez l\'établissement d\'études" 0 0 "%s"' % adher.etudes(0) + arg += u'--inputbox "Précisez l\'établissement d\'études" 0 0 "%s"' % adher.etudes(0) annul, result = dialog(arg) if annul: return 1 if result == ['']: # Pas bon arg = u'--title "Etudes (2/3)" ' - arg += u'--msgbox "Réponse invalide\n\n\n" 0 0' + arg += u'--msgbox "Réponse invalide\n\n\n" 0 0' dialog(arg) return __etudes_etab() @@ -221,28 +221,28 @@ def set_etudes(adher): arg = u'--title "Etudes de %s (2/3)" ' % adher.Nom() if etudes[0] == 'ENS': arg += u'--default-item "%s" ' % adher.etudes(1) - arg += u'--menu "Choisissez l\'année administrative" 0 0 0 ' + arg += u'--menu "Choisissez l\'année administrative" 0 0 0 ' arg += u'"1" "License" ' arg += u'"2" "Master 1" ' - arg += u'"3" "Agrégation" ' + arg += u'"3" "Agrégation" ' arg += u'"4" "Master 2" ' - arg += u'"5" "1ère année thèse" ' - arg += u'"6" "2ème année thèse" ' - arg += u'"7" "3ème année thèse" ' + arg += u'"5" "1ère année thèse" ' + arg += u'"6" "2ème année thèse" ' + arg += u'"7" "3ème année thèse" ' arg += u'"Autre" ""' annul, result = dialog(arg) if annul: return 1 elif etudes[0] in [ 'P1', 'P2', 'P3', 'P4', 'P5', 'P6', 'P7', 'P8', 'P9', 'P10', 'P11', 'P12', 'P13' ]: arg += u'--default-item "%s" ' % adher.etudes(1) - arg += u'--menu "Choisissez l\'année administrative" 0 0 0 ' - arg += u'"Deug 1" "Deug 1ère année" ' - arg += u'"Deug 2" "Deug 2ème année" ' + arg += u'--menu "Choisissez l\'année administrative" 0 0 0 ' + arg += u'"Deug 1" "Deug 1ère année" ' + arg += u'"Deug 2" "Deug 2ème année" ' arg += u'"Licence" "" ' - arg += u'"Master 1" "Master 1ère année" ' - arg += u'"Master 2" "Master 2ème année" ' - arg += u'"Thèse 1" "1ème année thèse" ' - arg += u'"Thèse 2" "2ème année thèse" ' - arg += u'"Thèse 3" "3ème année thèse" ' + arg += u'"Master 1" "Master 1ère année" ' + arg += u'"Master 2" "Master 2ème année" ' + arg += u'"Thèse 1" "1ème année thèse" ' + arg += u'"Thèse 2" "2ème année thèse" ' + arg += u'"Thèse 3" "3ème année thèse" ' arg += u'"Autre" ""' annul, result = dialog(arg) if annul: return 1 @@ -253,13 +253,13 @@ def set_etudes(adher): if result[0] == 'Autre': arg = u'--title "Etudes de %s (2/3)" ' % adher.Nom() - arg += u'--inputbox "Année adminstrative :\nET UNIQUEMENT l\'ANNEE : la section sera demandée après." 0 0 "%s"' % adher.etudes(1) + arg += u'--inputbox "Année adminstrative :\nET UNIQUEMENT l\'ANNEE : la section sera demandée après." 0 0 "%s"' % adher.etudes(1) annul, result = dialog(arg) if annul: return 1 if result == ['']: # Pas bon arg = u'--title "Etudes (2/3)" ' - arg += u'--msgbox "Réponse invalide\n\n\n" 0 0' + arg += u'--msgbox "Réponse invalide\n\n\n" 0 0' dialog(arg) return __etudes_annee() @@ -276,38 +276,38 @@ def set_etudes(adher): else: arg += u'--menu "Choisissez le laboratoire :" 0 0 0 ' if not etudes[1] in '1234': - arg += u'"CMLA" "Centre de Mathématiques et de Leurs Applications" ' + arg += u'"CMLA" "Centre de Mathématiques et de Leurs Applications" ' arg += u'"GAPP" "Groupe d\'Analyse des Politiques Publiques" ' arg += u'"IDHE" "Institutions et Dynamiques Historiques de l\'Economie" ' - arg += u'"LBPA" "Laboratoire de Biotechnologies et Pharmacologie génétique Appliquées" ' - arg += u'"LMT" "Laboratoire de Mécanique et Technologie" ' - arg += u'"LPQM" "Laboratoire de Photonique Quantique et Moléculaire" ' - arg += u'"LSV" "Laboratoire de Spécification et Vérification" ' - arg += u'"LURPA" "Laboratoire Universitaire de Recherche en Production Automatisée" ' - arg += u'"PPSM" "Laboratoire de Photophysique et Photochimie Supramoléculaires et Macromoléculaires" ' - arg += u'"SATIE" "Systèmes et Applications des Technologies de l\'Information et de l\'Energie" ' + arg += u'"LBPA" "Laboratoire de Biotechnologies et Pharmacologie génétique Appliquées" ' + arg += u'"LMT" "Laboratoire de Mécanique et Technologie" ' + arg += u'"LPQM" "Laboratoire de Photonique Quantique et Moléculaire" ' + arg += u'"LSV" "Laboratoire de Spécification et Vérification" ' + arg += u'"LURPA" "Laboratoire Universitaire de Recherche en Production Automatisée" ' + arg += u'"PPSM" "Laboratoire de Photophysique et Photochimie Supramoléculaires et Macromoléculaires" ' + arg += u'"SATIE" "Systèmes et Applications des Technologies de l\'Information et de l\'Energie" ' arg += u'"STEF" "Sciences Techniques Education Formation" ' if etudes[1] in '1234': arg += u'"A0" "Informatique" ' - arg += u'"A1" "Mathématiques" ' + arg += u'"A1" "Mathématiques" ' arg += u'"A2" "Physique fondamentale" ' arg += u'"A\'\'2" "Chimie" ' arg += u'"A3" "Biochimie" ' if etudes[1] == '1': - arg += u'"B123" "Technologie mécanique" ' - arg += u'"EEA" "Électronique, électrotechnique et automatique" ' + arg += u'"B123" "Technologie mécanique" ' + arg += u'"EEA" "Électronique, électrotechnique et automatique" ' elif etudes[1] == '2': - arg += u'"EEA" "Électronique, électrotechnique et automatique" ' - arg += u'"B1" "Mécanique" ' - arg += u'"B2" "Génie civil" ' - arg += u'"B3" "Génie mécanique" ' + arg += u'"EEA" "Électronique, électrotechnique et automatique" ' + arg += u'"B1" "Mécanique" ' + arg += u'"B2" "Génie civil" ' + arg += u'"B3" "Génie mécanique" ' else: - arg += u'"B1" "Mécanique" ' - arg += u'"B2" "Génie civil" ' - arg += u'"B3" "Génie mécanique" ' - arg += u'"A\'2" "Physique appliquée" ' - arg += u'"B4" "Génie électrique" ' - arg += u'"C" "Art et création industrielle" ' + arg += u'"B1" "Mécanique" ' + arg += u'"B2" "Génie civil" ' + arg += u'"B3" "Génie mécanique" ' + arg += u'"A\'2" "Physique appliquée" ' + arg += u'"B4" "Génie électrique" ' + arg += u'"C" "Art et création industrielle" ' arg += u'"D2" "Economie gestion" ' arg += u'"D3" "Sciences sociales" ' arg += u'"E" "Anglais" ' @@ -318,7 +318,7 @@ def set_etudes(adher): if result == ['']: # Pas bon arg = u'--title "Etudes (2/3)" ' - arg += u'--msgbox "Réponse invalide\n\n\n" 0 0' + arg += u'--msgbox "Réponse invalide\n\n\n" 0 0' dialog(arg) return __etudes_annee() elif etudes[0] == 'Personnel ENS': @@ -334,7 +334,7 @@ def set_etudes(adher): if result == ['']: # Pas bon arg = u'--title "Etudes (3/3)" ' - arg += u'--msgbox "Réponse invalide\n\n\n" 0 0' + arg += u'--msgbox "Réponse invalide\n\n\n" 0 0' dialog(arg) return __etudes_section() @@ -363,14 +363,14 @@ def set_etudes(adher): def set_mail(adher): """ - Choix d'une adresse mail crans ou extérieure. - Retourne ensuite le résultat de : + Choix d'une adresse mail crans ou extérieure. + Retourne ensuite le résultat de : * set_mail_ext si adresse ext * set_compte si compte crans """ if u'Nounou' in adher.droits() and not isadm: arg = u'--title "Adresse mail de %s" ' % adher.Nom() - arg += u'--msgbox "Vous n\'avez pas les droits necessaires pour effectuer cette opération.\n\n\n" 0 0' + arg += u'--msgbox "Vous n\'avez pas les droits necessaires pour effectuer cette opération.\n\n\n" 0 0' dialog(arg) return @@ -380,59 +380,59 @@ def set_mail(adher): while 1: arg = u'--title "Adresse mail de %s" ' % adher.Nom() - arg += u'--menu "Adresse mail de l\'adhérent :" 0 0 0 ' - arg += u'"Adresse mail extérieure" "" ' + arg += u'--menu "Adresse mail de l\'adhérent :" 0 0 0 ' + arg += u'"Adresse mail extérieure" "" ' if adher.compte(): arg += u'"Laisser le compte crans" "(login : %s)"' % adher.compte() else: - arg += u'"Créer un compte crans" "(adresse @crans.org)"' + arg += u'"Créer un compte crans" "(adresse @crans.org)"' annul, result = dialog(arg) if annul: return 1 if result[0].split()[0] == 'Laisser': break - elif result[0].split()[0] == 'Créer': + elif result[0].split()[0] == 'Créer': if not set_compte(adher): break else: if not set_mail_ext(adher): break def set_mail_ext(adher): """ - Demande l'adresse mail extérieure d'un adhérent + Demande l'adresse mail extérieure d'un adhérent """ default = adher.mail() if default.find('@') == -1: - # C'était une adresse crans + # C'était une adresse crans default = '' - arg = u'--title "Adresse mail extérieure pour %s" ' % adher.Nom() + arg = u'--title "Adresse mail extérieure pour %s" ' % adher.Nom() arg += u'--inputbox "Adresse : " 0 0 "%s"' % default annul, result = dialog(arg) if annul: return 1 try: adher.mail(result[0]) except ValueError, c: - arg = u'--title "Adresse mail extérieure de %s" ' % adher.Nom() + arg = u'--title "Adresse mail extérieure de %s" ' % adher.Nom() arg += u'--msgbox "%s\n\n\n" 0 0' % c.args[0] dialog(arg) return set_mail_ext(adher) def set_etat_civil(adher): u""" - Modifie l'état-civil (nom, prénom) d'un adhérent. + Modifie l'état-civil (nom, prénom) d'un adhérent. """ if u'Nounou' in adher.droits() and not isadm: arg = u'--title "Adresse mail de %s" ' % adher.Nom() - arg += u'--msgbox "Vous n\'avez pas les droits necessaires pour effectuer cette opération.\n\n\n" 0 0' + arg += u'--msgbox "Vous n\'avez pas les droits necessaires pour effectuer cette opération.\n\n\n" 0 0' dialog(arg) return # Construction de la boite de dialogue - arg = u'--title "État-civil de %s" ' % adher.Nom() + arg = u'--title "État-civil de %s" ' % adher.Nom() arg += u'--form "" 0 0 0 ' arg += u'"Nom :" 1 1 "%s" 1 13 20 20 ' % adher.nom() - arg += u'"Prénom :" 2 1 "%s" 2 13 20 20 ' % adher.prenom() + arg += u'"Prénom :" 2 1 "%s" 2 13 20 20 ' % adher.prenom() # Affichage annul, result = dialog(arg) @@ -448,72 +448,72 @@ def set_etat_civil(adher): # Des erreurs ? if err: - arg = u'--title "État-civil de %s" ' % adher.Nom() + arg = u'--title "État-civil de %s" ' % adher.Nom() arg += u'--msgbox "%s\n\n" 0 0' % err dialog(arg) # On redemande return set_etat_civil(adher) - # On change éventuellement le compte + # On change éventuellement le compte if adher.compte(): - # On demande au câbleur s'il faut garder le compte ou pas + # On demande au câbleur s'il faut garder le compte ou pas arg = u'--title "Modification du compte de %s" ' % adher.Nom() - arg += u'--colors --defaultno --yesno "Changer le login de l\'adhérent ?\n' + arg += u'--colors --defaultno --yesno "Changer le login de l\'adhérent ?\n' arg += u'Son login actuel est %s.\n\n' % adher.compte() - arg += u'Choisir Oui si l\'adhérent n\'a jamais utilisé son compte.\n\n' + arg += u'Choisir Oui si l\'adhérent n\'a jamais utilisé son compte.\n\n' arg += u'\Zr\Z1AVERTISSEMENT :\n' - arg += u'Le changement de login entraîne la suppression irréversible du compte, ' - arg += u'et donc de tous les fichiers, mails, etc. associés !\Z0\ZR\n\n\n" ' + arg += u'Le changement de login entraîne la suppression irréversible du compte, ' + arg += u'et donc de tous les fichiers, mails, etc. associés !\Z0\ZR\n\n\n" ' arg += u'0 0' no = not dialog(arg)[0] if no: # L'utilisateur n'utilise pas son compte, on le supprime... adher.supprimer_compte() - # ..et on le recrée (ou on met une adresse mail extérieure) + # ..et on le recrée (ou on met une adresse mail extérieure) if set_mail(adher): - # Le changement d'adresse a été annulé, on recommence tout + # Le changement d'adresse a été annulé, on recommence tout adher.restore() return set_etat_civil(adher) def set_compte(adher): """ - Créé un compte sur vert pour un adhérent. + Créé un compte sur vert pour un adhérent. """ # Message d'avertissement - arg = u'--title "Création compte crans pour %s" ' % adher.Nom() + arg = u'--title "Création compte crans pour %s" ' % adher.Nom() arg += u'--colors --yesno "\Zr\Z1AVERTISSEMENT :\Zn \n' - arg += u'L\'adhérent devra impérativement consulter l\'adresse mail associée\n\n\n\\ZnContinuer ?" ' + arg += u'L\'adhérent devra impérativement consulter l\'adresse mail associée\n\n\n\\ZnContinuer ?" ' arg += u'0 0' no, res = dialog(arg) if no: return 1 - # Il faut déterminer le login + # Il faut déterminer le login login = adher.nom() - # Première tentative + # Première tentative err = 0 try: login = adher.compte(login) except ValueError, c: try: c.args[1] - # Le compte existe => 2ème tentative (1ere lettre prénom + nom) + # Le compte existe => 2ème tentative (1ere lettre prénom + nom) login = adher.prenom()[0] +login login = login.lower() err = 2 except: err = 1 - except EnvironmentError, c: err = 1 # Locké + except EnvironmentError, c: err = 1 # Locké if err: while 1: # Mauvais login => on demande - arg = u'--title "Création d\'un compte crans pour %s" ' % adher.Nom() + arg = u'--title "Création d\'un compte crans pour %s" ' % adher.Nom() arg += u'--inputbox "Choix du login\n' - arg += u'Le login doit faire au maximum %s caractères\n' % config.maxlen_login - arg += u'Il ne doit pas être un pseudo ou prénom mais doit être relié au nom de famille\n' - arg += u'Seuls les caractères alphabétiques et le - sont autorisés" ' + arg += u'Le login doit faire au maximum %s caractères\n' % config.maxlen_login + arg += u'Il ne doit pas être un pseudo ou prénom mais doit être relié au nom de famille\n' + arg += u'Seuls les caractères alphabétiques et le - sont autorisés" ' arg += u'0 0 "%s"' % login annul, result = dialog(arg) if annul: return 1 @@ -524,29 +524,29 @@ def set_compte(adher): except EnvironmentError, c: e = c.args[0] except ValueError, c: e = c.args[0] if e: - arg = u'--title "Création compte crans pour %s" ' % adher.Nom() + arg = u'--title "Création compte crans pour %s" ' % adher.Nom() arg += u'--msgbox "%s\n\n\n" 0 0' % e dialog(arg) continue break - txt = u"Le compte ne sera créé que lors de l'enregistrement des données\n\n" - txt += u"L'adresse mail de l'adhérent est : %s@crans.org\n" % login + txt = u"Le compte ne sera créé que lors de l'enregistrement des données\n\n" + txt += u"L'adresse mail de l'adhérent est : %s@crans.org\n" % login a = adher.canonical_alias() if a: - txt += u"L'adhérent possède également l'alias : %s@crans.org" % a + txt += u"L'adhérent possède également l'alias : %s@crans.org" % a else: - txt += u"\n\Zr\Z1L'adresse mail %s.%s@crans.org étant déja prise l'adhérent ne peut pas l'utiliser.\Zn" % (adher.prenom(), adher.nom()) + txt += u"\n\Zr\Z1L'adresse mail %s.%s@crans.org étant déja prise l'adhérent ne peut pas l'utiliser.\Zn" % (adher.prenom(), adher.nom()) txt += u'\n' - arg = u'--title "Création compte crans pour %s" ' % adher.Nom() + arg = u'--title "Création compte crans pour %s" ' % adher.Nom() arg += u'--colors --msgbox "%s\n\n\n" 0 0' % txt dialog(arg) def set_droits(adher): - """ Définition des droits de l'adhérent """ + """ Définition des droits de l'adhérent """ arg = u'--title "Droits de %s" ' % adher.Nom() arg += u'--separate-output ' arg += u'--checklist "" 0 0 0 ' @@ -574,45 +574,45 @@ def set_droits(adher): def del_adher(adher): """ - Destruction adhérent + Destruction adhérent """ - quoi = u'Toutes les machines associées à cet adhérent seront détruites' + quoi = u'Toutes les machines associées à cet adhérent seront détruites' if adher.mail().find('@') == -1: - # L'adhérent a un compte + # L'adhérent a un compte machines = adher.machines() if not machines: - quoi = u'Le compte de cet adhérent sera détruit' + quoi = u'Le compte de cet adhérent sera détruit' else: # Et aussi des machines - # -> soit on détruit tout + # -> soit on détruit tout # -> soit on garde le compte mais on vire les machines - arg = u'--title "Destruction adhérent %s " ' % adher.Nom() - arg += u'--menu "Cette adhérent possède également un compte." 0 0 0 ' + arg = u'--title "Destruction adhérent %s " ' % adher.Nom() + arg += u'--menu "Cette adhérent possède également un compte." 0 0 0 ' if adher: - arg += u'"1" "Détruire seulement les machines de l\'adhérent" ' - arg += u'"2" "Détruire les machines et le compte de l\'adhérent" ' + arg += u'"1" "Détruire seulement les machines de l\'adhérent" ' + arg += u'"2" "Détruire les machines et le compte de l\'adhérent" ' annul, res = dialog(arg) if annul: return 1 if res[0] == '2': - # On détruit tout + # On détruit tout quoi += u' ainsi que son compte' else: # Destruction uniquement des machines - arg = u'--title "Destruction machines adhérent %s " --colors ' % adher.Nom() - arg += u'--inputbox "\Zr\Z1ATTENTION\Zn : la destruction est définitive\nToutes les machines associées à cet adhérent seront détruites, seul le compte sera conservé.\nCommentaire à insérer ?" 0 0' + arg = u'--title "Destruction machines adhérent %s " --colors ' % adher.Nom() + arg += u'--inputbox "\Zr\Z1ATTENTION\Zn : la destruction est définitive\nToutes les machines associées à cet adhérent seront détruites, seul le compte sera conservé.\nCommentaire à insérer ?" 0 0' annul, res = dialog(arg) if annul: return 1 for m in machines: m.delete(res[0]) adher.chbre('EXT') arg = u'--title "Destruction machines" ' - arg += u'--msgbox "Machines détruites\n\n\n" 0 0' + arg += u'--msgbox "Machines détruites\n\n\n" 0 0' dialog(arg) return while 1: - arg = u'--title "Destruction adhérent %s " --colors ' % adher.Nom() - arg += u'--inputbox "\Zr\Z1ATTENTION\Zn : la destruction est définitive\n\n%s.\n\nCommentaire à insérer ?" 0 0' % quoi + arg = u'--title "Destruction adhérent %s " --colors ' % adher.Nom() + arg += u'--inputbox "\Zr\Z1ATTENTION\Zn : la destruction est définitive\n\n%s.\n\nCommentaire à insérer ?" 0 0' % quoi annul, res = dialog(arg) if annul: return 1 if res[0]: break @@ -622,23 +622,23 @@ def del_adher(adher): if u'Nounou' in adher.droits() and not isadm: arg = u'--title "Destruction adherent" ' - arg += u'--msgbox "Vous n\'avez pas les droits necessaires pour effectuer cette opération.\n\n\n" 0 0' + arg += u'--msgbox "Vous n\'avez pas les droits necessaires pour effectuer cette opération.\n\n\n" 0 0' dialog(arg) return adher.delete(res[0]) - arg = u'--title "Destruction adhérent" ' - arg += u'--msgbox "Adhérent détruit\n\n\n" 0 0' + arg = u'--title "Destruction adhérent" ' + arg += u'--msgbox "Adhérent détruit\n\n\n" 0 0' dialog(arg) ############################################################### -## Fonctions de remplissage ou modification des paramètres club +## Fonctions de remplissage ou modification des paramètres club def set_responsable(club): """ Modifie le responsable d'un club """ arg = u'--title "Responsable du club" ' - arg += u'--msgbox "Séléctionnez l\'adhérent responsable du club\n\n\n" 0 0' + arg += u'--msgbox "Séléctionnez l\'adhérent responsable du club\n\n\n" 0 0' dialog(arg) resp = select(club, u'du responsable du club a', 'ro') if not resp: return 1 @@ -660,7 +660,7 @@ def set_imprimeurs(club): if res[0] == 'Enlever': liste = map(lambda s: db.search("aid=%s" % s)['adherent'][0], club.imprimeurs()) if len(liste) == 1: - # Une seule réponse + # Une seule réponse choix = liste[0] else: # Il faut choisir @@ -690,11 +690,11 @@ def set_imprimeurs(club): if not no: if club.imprimeurs(retirer=str(choix.id())): arg = u'--title "Enlever un imprimeur" ' - arg += u'--msgbox "Imprimeur enlevé\n\n\n" 0 0' + arg += u'--msgbox "Imprimeur enlevé\n\n\n" 0 0' dialog(arg) else: arg = u'--title "Enlever un imprimeur" ' - arg += u'--msgbox "Cet adhérent n\'est pas imprimeur du club !\n\n\n" 0 0' + arg += u'--msgbox "Cet adhérent n\'est pas imprimeur du club !\n\n\n" 0 0' dialog(arg) elif res[0] == 'Ajouter': @@ -702,11 +702,11 @@ def set_imprimeurs(club): if newimp: if club.imprimeurs(ajouter=str(newimp.id())): arg = u'--title "Ajout imprimeur" ' - arg += u'--msgbox "Imprimeur ajouté\n\n\n" 0 0' + arg += u'--msgbox "Imprimeur ajouté\n\n\n" 0 0' dialog(arg) else: arg = u'--title "Ajout imprimeur" ' - arg += u'--msgbox "Cet adhérent est déjà imprimeur !\n\n\n" 0 0' + arg += u'--msgbox "Cet adhérent est déjà imprimeur !\n\n\n" 0 0' dialog(arg) continue @@ -725,9 +725,9 @@ def set_club_nom(club): dialog(arg) def set_local(club): - """ Défini le local d'un club """ + """ Défini le local d'un club """ try: - club.chbre('&é"') # Fait une erreur + club.chbre('&é"') # Fait une erreur except ValueError, c: locaux = c.args[1] @@ -735,7 +735,7 @@ def set_local(club): arg += u'--default-item "%s" ' % club.chbre() arg += u'--menu "Choisissez le local du club :" 0 0 0 ' key = locaux.keys() - # on tri par ordre alphébétique avec 'EXT' à la fin + # on tri par ordre alphébétique avec 'EXT' à la fin key.pop(key.index('EXT')) key.sort() key.append('EXT') @@ -749,16 +749,16 @@ def set_local(club): def set_club_compte(club): """ - Créé un compte sur vert pour un club. + Créé un compte sur vert pour un club. """ while 1: - arg = u'--title "Création d\'un compte crans pour %s" ' % club.Nom() + arg = u'--title "Création d\'un compte crans pour %s" ' % club.Nom() arg += u'--inputbox "Choix du login\n' - arg += u'Le nom pour le login doit faire au maximum %s caractères\n' % config.maxlen_login + arg += u'Le nom pour le login doit faire au maximum %s caractères\n' % config.maxlen_login arg += u'Le login sur ssh sera club-\'nom du club\'\n' arg += u'Le site web du club sera accessible via l\'adresse http://clubs.ens-cachan.fr/\'nom du club\'\n' - arg += u'Seuls les caractères alphabétiques et le - sont autorisés" ' + arg += u'Seuls les caractères alphabétiques et le - sont autorisés" ' arg += u'0 0 ""' annul, result = dialog(arg) if annul: return 1 @@ -769,28 +769,28 @@ def set_club_compte(club): except EnvironmentError, c: e = c.args[0] except ValueError, c: e = c.args[0] if e: - arg = u'--title "Création compte crans pour %s" ' % club.Nom() + arg = u'--title "Création compte crans pour %s" ' % club.Nom() arg += u'--msgbox "%s\n\n\n" 0 0' % e dialog(arg) continue break - txt = u"Le compte ne sera créé que lors de l'enregistrement des données\n\n" + txt = u"Le compte ne sera créé que lors de l'enregistrement des données\n\n" txt += u"L'adresse mail du club est : %s@crans.org\n" % login txt += u'\n' - arg = u'--title "Création compte crans pour %s" ' % club.Nom() + arg = u'--title "Création compte crans pour %s" ' % club.Nom() arg += u'--colors --msgbox "%s\n\n\n" 0 0' % txt dialog(arg) ###################################################################################### -## Fonctions de remplissage ou modification des paramètres adhérent ou machine ou club +## Fonctions de remplissage ou modification des paramètres adhérent ou machine ou club ## (suivant la classe fournie) def set_rque(clas): - """Définit le commentaire (méthode info de clas)""" - return __prompt_input_menu(clas.info, u'Remarque', u"Ajouter ou modifier une remarque\nPour ajouter une remarque modifier la dernière de la liste.") + """Définit le commentaire (méthode info de clas)""" + return __prompt_input_menu(clas.info, u'Remarque', u"Ajouter ou modifier une remarque\nPour ajouter une remarque modifier la dernière de la liste.") def __prompt_input_menu(method, titre, prompt): arg = u'--title "%s" ' % titre @@ -820,7 +820,7 @@ def __prompt_input_menu(method, titre, prompt): val = result[2].strip() if val == invite: - # Rien à faire + # Rien à faire return try: @@ -839,16 +839,16 @@ def __prompt_input_menu(method, titre, prompt): return __prompt_input_menu(method, titre, prompt) def set_solde(clas): - """ Débit ou crédit d'un compte """ + """ Débit ou crédit d'un compte """ while 1: - arg = u'--title "Crédit / débit du compte de %s" ' % clas.Nom() - arg += u'--inputbox "Solde actuel : %s\n Opération à effectuer (+ pour crédits et - pour débit) ?" 0 0 "" ' % clas.solde() + arg = u'--title "Crédit / débit du compte de %s" ' % clas.Nom() + arg += u'--inputbox "Solde actuel : %s\n Opération à effectuer (+ pour crédits et - pour débit) ?" 0 0 "" ' % clas.solde() annul, res = dialog(arg) if annul: return 1 # Ajout du commentaire - arg = u'--title "Crédit / débit du compte de %s" ' % clas.Nom() - arg += u'--inputbox "Commentaire à insérer ?" 0 0' + arg = u'--title "Crédit / débit du compte de %s" ' % clas.Nom() + arg += u'--inputbox "Commentaire à insérer ?" 0 0' annul, comment = dialog(arg) if not annul: @@ -862,7 +862,7 @@ def set_solde(clas): db.services_to_restart('mail_solde', ['%s a fait %s euros pour %s [%s]' %(script_utilisateur, res[0],clas._data['uid'][0], comment)]) break except ValueError, c: - arg = u'--title "Opération impossible" ' + arg = u'--title "Opération impossible" ' arg += u'--msgbox "%s\n\n\n" 0 0' % c.args[0] dialog(arg) @@ -889,15 +889,15 @@ def confirm(clas): affich_tools.prompt(u"Appuyez sur ENTREE pour continuer") def set_blackliste(clas): - """ Édite ou ajoute un item de la blackliste """ + """ Édite ou ajoute un item de la blackliste """ bl = clas.blacklist() if not bl: - # Pas d'entrée à éditer + # Pas d'entrée à éditer index = -1 else: - arg = u'--title "Édition blackliste de %s" ' % clas.Nom() - arg += u'--menu "Choisir l\'entrée à éditer :" 0 0 0 ' - arg += u'"0" "Ajouter une nouvelle entrée" ' + arg = u'--title "Édition blackliste de %s" ' % clas.Nom() + arg += u'--menu "Choisir l\'entrée à éditer :" 0 0 0 ' + arg += u'"0" "Ajouter une nouvelle entrée" ' i = 1 for b in bl: champs = b.split('$') @@ -907,7 +907,7 @@ def set_blackliste(clas): if annul: return 1 index = int(res[0]) - 1 - # Édition + # Édition if index != -1: t = clas.blacklist()[index].split('$') if t[0] != 'now': @@ -934,12 +934,12 @@ def set_blackliste(clas): if step == 2: # Dates + commentaire arg = u'--title "Blacklistage %s" ' % clas.Nom() - arg += u'--form "Entrez les dates de début et de fin (format jj/mm/aaaa hh:mm) ainsi que le commentaire associé\n" 0 0 0 ' - arg += u'"Début : " 1 1 "%s" 1 8 16 0 ' % t[0] - arg += u'"now pour immédiatement " 1 25 "" 0 0 0 0 ' + arg += u'--form "Entrez les dates de début et de fin (format jj/mm/aaaa hh:mm) ainsi que le commentaire associé\n" 0 0 0 ' + arg += u'"Début : " 1 1 "%s" 1 8 16 0 ' % t[0] + arg += u'"now pour immédiatement " 1 25 "" 0 0 0 0 ' arg += u'"Fin : " 2 1 "%s" 2 8 16 0 ' % t[1] - arg += u'"- pour fin indéterminée" 2 25 "" 0 0 0 0 ' - arg += u'"Les jours de début et de fin sont inclus." 3 1 "" 0 0 0 0 ' + arg += u'"- pour fin indéterminée" 2 25 "" 0 0 0 0 ' + arg += u'"Les jours de début et de fin sont inclus." 3 1 "" 0 0 0 0 ' arg += u'"Sanction : %s" 4 1 "" 0 0 0 0 ' % t[2] arg += u'"Commentaire (pas de dollar) : " 5 1 "%s" 6 1 52 0 ' % t[3] annul, r = dialog(arg) @@ -951,13 +951,13 @@ def set_blackliste(clas): t[1] = r[1].strip() if len(t[1]) == 10: t[1] += ' 23:59' - # Vérification des heures + # Vérification des heures try: if t[0] != 'now': t[0] = int(mktime(strptime(t[0], '%d/%m/%Y %H:%M'))) except: arg = u'--title "Erreur" ' - arg += u'--msgbox "Heure de début incorrecte (%s)\n\n\n" 0 0' % t[0] + arg += u'--msgbox "Heure de début incorrecte (%s)\n\n\n" 0 0' % t[0] dialog(arg) step -= 1 continue @@ -1000,7 +1000,7 @@ def set_blackliste(clas): else: break ########################################################################## -## Fonction de remplissage ou modification des paramètres club ou adhérent +## Fonction de remplissage ou modification des paramètres club ou adhérent def on_off(condition): """ @@ -1013,7 +1013,7 @@ def on_off(condition): def set_type_de_connexion(adherent): """ - Définition du type de connexion: gratuite limité ou normale. + Définition du type de connexion: gratuite limité ou normale. """ if isinstance(adherent, Club): return @@ -1025,13 +1025,13 @@ def set_type_de_connexion(adherent): def set_admin(proprio): """ - Définition de l'état administratif : carte d'étudiant, paiement + Définition de l'état administratif : carte d'étudiant, paiement et caution. """ - # Le proprietaire a-t-il une section carte d'étudiant (pas les clubs) ? + # Le proprietaire a-t-il une section carte d'étudiant (pas les clubs) ? has_card = proprio.idn != 'cid' - # Initialisation des différentes checkbox + # Initialisation des différentes checkbox carte = on_off(ann_scol in proprio.carteEtudiant()) paiement = on_off(ann_scol in proprio.paiement()) precab = on_off(ann_scol + 1 in proprio.paiement()) @@ -1040,42 +1040,42 @@ def set_admin(proprio): carte_ok = on_off('c' in proprio.controle()) if has_card: charte_MA = on_off(proprio.charteMA()) - # Construction de la boîte de dialogue + # Construction de la boîte de dialogue texte = [] checklist = [] if has_card: if carte_ok == 'off' or iscontroleur: - checklist.append(u'"1" "Carte d\'étudiant %d/%d fournie" "%s"' % + checklist.append(u'"1" "Carte d\'étudiant %d/%d fournie" "%s"' % (ann_scol, ann_scol+1, carte)) else: - texte.append(u'Carte vérifiée') + texte.append(u'Carte vérifiée') if isinstance(proprio, Club) or proprio.adherentPayant(): if paiement_ok == 'off' or iscontroleur: - checklist.append(u'"2" "Cotisation %d/%d réglée et charte signée" "%s"' % + checklist.append(u'"2" "Cotisation %d/%d réglée et charte signée" "%s"' % (ann_scol, ann_scol+1, paiement)) else: - texte.append(u'Cotisation/charte vérifiées') + texte.append(u'Cotisation/charte vérifiées') else: - texte.append(u'Adhérent non payant') + texte.append(u'Adhérent non payant') - # TODO: controle pour le précâblage + # TODO: controle pour le précâblage if config.precab: - checklist.append(u'"3" "Adhésion %d/%d réglée et charte signée (précâblage)" "%s"' % + checklist.append(u'"3" "Adhésion %d/%d réglée et charte signée (précâblage)" "%s"' % (ann_scol+1, ann_scol+2, precab)) if iscontroleur: if has_card: - checklist.append(u'"4" "Carte d\'étudiant vérifiée" "%s"' % carte_ok) - checklist.append(u'"5" "Cotisation/charte/caution vérifées" "%s"' % paiement_ok) + checklist.append(u'"4" "Carte d\'étudiant vérifiée" "%s"' % carte_ok) + checklist.append(u'"5" "Cotisation/charte/caution vérifées" "%s"' % paiement_ok) if (isbureau or isadm) and has_card: checklist.append(u'"6" "Charte des MA signee" "%s"' % charte_MA) if not checklist: # Il n'y a rien de modifiable - dialog(u'--title "État administratif de %s non modifiable" --msgbox "%s\n" 0 0 ' % + dialog(u'--title "État administratif de %s non modifiable" --msgbox "%s\n" 0 0 ' % (proprio.Nom(), '\n'.join(texte))) return @@ -1101,14 +1101,14 @@ def set_admin(proprio): proprio.controle('-c') if '2\n' in result and ann_scol not in proprio.paiement(): - # On est en train de renouveller l'adhésion + # On est en train de renouveller l'adhésion # Combien a-t-il de machines ? if proprio.idn != 'cid' and len(proprio.machines_fixes()) > 1 and not proprio.droits(): # Il a plus d'une machine fixe et n'est pas membre actif arg = u'--title "Trop de machines fixes" ' - arg += u'--menu " Cet adhérent a trop de machines fixes.\n\n' - arg += u'Seuls les membres actifs peuvent posséder plusieurs\n' - arg += u'machines fixes. L\'adhérent actuel n\'est pas membre\n' + arg += u'--menu " Cet adhérent a trop de machines fixes.\n\n' + arg += u'Seuls les membres actifs peuvent posséder plusieurs\n' + arg += u'machines fixes. L\'adhérent actuel n\'est pas membre\n' arg += u'actif, il n\'est donc pas possible de lui laisser autant\n' arg += u'de machines fixes..." 0 0 0 ' arg += u'"OK" "OK, je vais lui virer des machines" ' @@ -1147,7 +1147,7 @@ def set_admin(proprio): proprio.controle('-k') ############################################################### -## Fonctions de remplissage ou modification des paramètres club +## Fonctions de remplissage ou modification des paramètres club def new_club(club): step = 1 @@ -1193,15 +1193,15 @@ def modif_club(club): arg += u'"NomClub" "Modifier le nom du club" ' arg += u'"Responsable" "Changer le responsable du club %s" ' % club.responsable().Nom() arg += u'"Imprimeurs" "Changer la liste des imprimeurs" ' - arg += u'"Administratif" "Précâblage" ' + arg += u'"Administratif" "Précâblage" ' arg += u'"Local" "Modifier le local du club" ' - arg += u'"Compte" "Créer un compte crans." ' + arg += u'"Compte" "Créer un compte crans." ' if club.compte(): - arg += u'"Alias" "Créer ou supprimer un alias mail" ' + arg += u'"Alias" "Créer ou supprimer un alias mail" ' if isdeconnecteur: arg += u'"Blackliste" "Modifier la blackliste du club" ' if isimprimeur: - arg += u'"Solde" "Effectuer un débit/crédit pour ce club" ' + arg += u'"Solde" "Effectuer un débit/crédit pour ce club" ' arg += u'"Remarque" "Ajouter ou modifer un commentaire" ' annul, res = dialog(arg) @@ -1251,10 +1251,10 @@ def select_club(clas): def del_club(club): """ Destruction club """ - quoi = 'Toutes les machines associées à cet adhérent seront détruites' + quoi = 'Toutes les machines associées à cet adhérent seront détruites' while 1: arg = u'--title "Destruction club " --colors ' - arg += u'--inputbox "\Zr\Z1ATTENTION\Zn : la destruction est définitive\n\nToutes les machines de ce club seront également détruites.\n\nCommentaire à insérer ?" 0 0' + arg += u'--inputbox "\Zr\Z1ATTENTION\Zn : la destruction est définitive\n\nToutes les machines de ce club seront également détruites.\n\nCommentaire à insérer ?" 0 0' annul, res = dialog(arg) if annul: return 1 if res[0]: break @@ -1264,15 +1264,15 @@ def del_club(club): club.delete(res[0]) arg = u'--title "Destruction club" ' - arg += u'--msgbox "Club détruit\n\n\n" 0 0' + arg += u'--msgbox "Club détruit\n\n\n" 0 0' dialog(arg) ################################################################## -## Fonctions de remplissage ou modification des paramètres machine +## Fonctions de remplissage ou modification des paramètres machine def set_wifi(machine): """ - Définition des paramètres spécifiques d'une borne wifi : + Définition des paramètres spécifiques d'une borne wifi : * Canaux * Puissance * Position GPS @@ -1280,7 +1280,7 @@ def set_wifi(machine): * hotspot """ if not isadm: - #ça ne devrait jamais arriver mais on n'est jamais trop prudent + #ça ne devrait jamais arriver mais on n'est jamais trop prudent arg = u'--title "Erreur" ' arg += u'--msgbox "Vous n\'avez pas les droits de modification de cette machine.\n\n" 0 0' dialog(arg) @@ -1290,7 +1290,7 @@ def set_wifi(machine): nom = machine.nom() # Construction de la boite de dialogue - arg = u'--title "Paramètres spécifiques wifi de "%s"" ' % (nom) + arg = u'--title "Paramètres spécifiques wifi de "%s"" ' % (nom) arg += u'--form "" 0 0 0 ' # Borne wifi arg += u'"Canaux :" 1 1 "%s" 1 14 10 0 ' % machine.canal(None, False) @@ -1334,13 +1334,13 @@ def set_wifi(machine): err += "Les valeurs possibles pour le parametre hotspot\n sont \"oui\" ou \"non\"\n" try: - #On vérifie toutes les variables avant de sauvegarder + #On vérifie toutes les variables avant de sauvegarder for nvram in result[5].split(','): - if len(nvram.strip()): #On évite les variables vides + if len(nvram.strip()): #On évite les variables vides if not '=' in nvram: raise ValueError("Une variable nvram doit etre de la forme : 'variable=valeur'\n") for nvram in result[5].split(','): - if len(nvram.strip()): #On évite les variables vides + if len(nvram.strip()): #On évite les variables vides variable = nvram.split('=')[0].strip() valeur = nvram.split('=')[1].strip() if valeur.lower() == "none": @@ -1349,7 +1349,7 @@ def set_wifi(machine): except ValueError, c: err += c.args[0] + '\n' # Des erreurs ? if err: - arg = u'--title "Paramètres machine wifi" ' + arg = u'--title "Paramètres machine wifi" ' arg += u'--msgbox "%s\n\n" 0 0' % err dialog(arg) # On redemande @@ -1360,7 +1360,7 @@ def set_wifi(machine): def set_machine(machine): """ - Définition des paramètres d'une machine : + Définition des paramètres d'une machine : * Nom de machine * Adresse MAC * IP @@ -1380,7 +1380,7 @@ def set_machine(machine): l = 17 # Construction de la boite de dialogue - arg = u'--title "Paramètres machine" ' + arg = u'--title "Paramètres machine" ' arg += u'--form "" 0 0 0 ' arg += u'"Nom de machine :" 1 1 "%s" 1 18 %i 0 ' % (nom, l) arg += u'"Adresse mac :" 2 1 "%s" 2 15 17 0 ' % machine.mac() @@ -1394,7 +1394,7 @@ def set_machine(machine): arg += u'"Prise :" 8 1 "%s" 8 9 5 0 ' % machine.prise() else: - p = u'Pour ajouter une remarque modifier la dernière de la liste.' + p = u'Pour ajouter une remarque modifier la dernière de la liste.' # Affichage annul, result = dialog(arg) @@ -1411,7 +1411,7 @@ def set_machine(machine): if len(c.args)>1 and c.args[1] == 1 and isadm: # Mac en double arg = u'--title "Adresse MAC" ' - arg += u'--yesno "L\'adresse MAC existe déja, continuer ? \n" 0 0' + arg += u'--yesno "L\'adresse MAC existe déja, continuer ? \n" 0 0' no, res = dialog(arg) if no: return set_machine(machine) @@ -1422,7 +1422,7 @@ def set_machine(machine): elif len(c.args)>1 and c.args[1] == 3 and isadm: # Mac douteuse arg = u'--title "Adresse MAC" ' - arg += u'--yesno "L\'adresse MAC ne correspond à aucun constructeur, continuer ? \n" 0 0' + arg += u'--yesno "L\'adresse MAC ne correspond à aucun constructeur, continuer ? \n" 0 0' no, res = dialog(arg) if no: return set_machine(machine) @@ -1437,7 +1437,7 @@ def set_machine(machine): try: machine.ip(result[2]) except ValueError, c: err += c.args[0] + '\n' except EnvironmentError, c: err += c.__str__() + '\n' - except RuntimeError, c: err += c.args[0] + '\n' # Plus d'IP libres, peut-être à traiter differement ? + except RuntimeError, c: err += c.args[0] + '\n' # Plus d'IP libres, peut-être à traiter differement ? if isadm: try: @@ -1453,7 +1453,7 @@ def set_machine(machine): # Des erreurs ? if err: - arg = u'--title "Paramètres machine" ' + arg = u'--title "Paramètres machine" ' arg += u'--msgbox "%s\n\n" 0 0' % err dialog(arg) # On redemande @@ -1463,13 +1463,13 @@ def set_machine(machine): return set_machine(machine) def set_machine_exemption(machine): - """Définit les réseau exemptés de comptage d'upload pour la machine""" - if __prompt_input_menu(machine.exempt, u'Exemption', u"Ajouter ou modifier un réseau/une ip vers lequel on ne compte pas l'upload (format x.y.z.t[/m])\nPour ajouter un réseau modifier la fin de la liste.") or confirm(machine): + """Définit les réseau exemptés de comptage d'upload pour la machine""" + if __prompt_input_menu(machine.exempt, u'Exemption', u"Ajouter ou modifier un réseau/une ip vers lequel on ne compte pas l'upload (format x.y.z.t[/m])\nPour ajouter un réseau modifier la fin de la liste.") or confirm(machine): machine.restore() return 1 def set_machine_alias(machine): - """Définit la liste des alias d'une machine""" + """Définit la liste des alias d'une machine""" if __prompt_input_menu(machine.alias, 'Alias machine', "Entrez ou modifier un alias machine.\nPour ajouter un alias modifier le dernier de la liste.") or confirm(machine): machine.restore() return 1 @@ -1480,7 +1480,7 @@ def del_machine(machine): """ while 1: arg = u'--title "Destruction machine %s" --colors ' % machine.nom() - arg += u'--inputbox "\Zr\Z1ATTENTION\Zn : la destruction est définitive\nCommentaire à insérer ?" 0 0' + arg += u'--inputbox "\Zr\Z1ATTENTION\Zn : la destruction est définitive\nCommentaire à insérer ?" 0 0' annul, res = dialog(arg) if annul: return 1 if res[0]: break @@ -1492,12 +1492,12 @@ def del_machine(machine): machine.delete(res[0]) except EnvironmentError, c: arg = u'--title "Destruction machine" ' - arg += u'--msgbox "ERREUR n°%s\n\n\n" 0 0' % c.args[0] + arg += u'--msgbox "ERREUR n°%s\n\n\n" 0 0' % c.args[0] dialog(arg) return 1 arg = u'--title "Destruction machine" ' - arg += u'--msgbox "Machine détruite\n\n\n" 0 0' + arg += u'--msgbox "Machine détruite\n\n\n" 0 0' dialog(arg) @@ -1506,7 +1506,7 @@ def del_machine(machine): def new_adher(adher): """ - Définition des propriétés d'un adhérent + Définition des propriétés d'un adhérent 4 etapes : * set_bases * set_etudes @@ -1532,7 +1532,7 @@ def new_adher(adher): if not confirm(adher): break - arg = u'--title "Inscription Mailing liste de communication ENS" --yesno "\nInscrire l\'adhérent à la mailing liste de communication de l\'ENS ?\n\n\n" 0 0' + arg = u'--title "Inscription Mailing liste de communication ENS" --yesno "\nInscrire l\'adhérent à la mailing liste de communication de l\'ENS ?\n\n\n" 0 0' no, res = dialog(arg) if not no: mail = adher.mail() @@ -1541,47 +1541,47 @@ def new_adher(adher): def modif_adher(adher): """ - Modification de l'adhérent fourni (instance de adhérent) + Modification de l'adhérent fourni (instance de adhérent) Retourne 1 si annulation. """ - # Préliminaire : si la chambre est inconnue on force la question + # Préliminaire : si la chambre est inconnue on force la question if adher.chbre() == '????': res= ['Chambre'] arg = u'--title "Modification de %s" ' % adher.Nom() - arg += u'--msgbox "ERREUR : la chambre de cet adhérent est inconnue !\n\n\n" 0 0' + arg += u'--msgbox "ERREUR : la chambre de cet adhérent est inconnue !\n\n\n" 0 0' dialog(arg) else: payant = not isinstance(adher, Club) and adher.adherentPayant() arg = u'--title "Modification de %s" ' % adher.Nom() arg += u'--menu "Que souhaitez vous modifier ?" 0 0 0 ' - arg += u'"Administratif" "Précâblage, carte d\'étudiant, études" ' + arg += u'"Administratif" "Précâblage, carte d\'étudiant, études" ' if not payant: arg += u'"Connexion" "Changer de type de connexion(gratuit->payant)" ' if adher.compte(): changement_compte = u", compte sur zamok" else: changement_compte = u"" - arg += u'"État-civil" "Nom, prénom%s" ' % changement_compte + arg += u'"État-civil" "Nom, prénom%s" ' % changement_compte if adher.chbre() == 'EXT': - arg += u'"Adresse" "Déménagement" ' + arg += u'"Adresse" "Déménagement" ' else: - arg += u'"Chambre" "Déménagement" ' - arg += u'"Etudes" "Changement d\'année ou de filière" ' - arg += u'"Téléphone" "Changement de numéro de téléphone" ' + arg += u'"Chambre" "Déménagement" ' + arg += u'"Etudes" "Changement d\'année ou de filière" ' + arg += u'"Téléphone" "Changement de numéro de téléphone" ' if payant: - arg += u'"Mail" "Créer un compte ou changer l\'adresse mail de contact" ' - arg += u'"Alias" "Créer ou supprimer un alias mail" ' + arg += u'"Mail" "Créer un compte ou changer l\'adresse mail de contact" ' + arg += u'"Alias" "Créer ou supprimer un alias mail" ' arg += u'"Remarque" "Ajouter ou modifer un commentaire" ' if isadm: if 'cransAccount' in adher._data['objectClass']: - arg += u'"Droits" "Modifier les droits alloués à cet adhérent" ' + arg += u'"Droits" "Modifier les droits alloués à cet adhérent" ' if 'posixAccount' in adher._data['objectClass']: arg += u'"Shell" "Changer le shell de cet utilisateur" ' if isbureau and 'Nounou' not in adher.droits(): - arg += u'"Droits" "Modifier les droits alloués à cet adhérent" ' + arg += u'"Droits" "Modifier les droits alloués à cet adhérent" ' if isdeconnecteur: - arg += u'"Blackliste" "Modifier la blackliste de cet adhérent" ' + arg += u'"Blackliste" "Modifier la blackliste de cet adhérent" ' if isimprimeur: - arg += u'"Solde" "Effectuer un débit/crédit pour cet adhérent" ' + arg += u'"Solde" "Effectuer un débit/crédit pour cet adhérent" ' annul, res = dialog(arg) @@ -1589,7 +1589,7 @@ def modif_adher(adher): if res[0] == 'Etudes': set_etudes(adher) - elif res[0] == 'État-civil': + elif res[0] == 'État-civil': set_etat_civil(adher) elif res[0] == 'Administratif': if not set_admin(adher): @@ -1605,18 +1605,18 @@ def modif_adher(adher): elif res[0] == 'Charte des MA' : set_charte_MA(adher) elif res[0] == 'Connexion': - if dlg.yesno(u"Passer à un compte payant ?") == 0: - # On attribue une ip à toute les machines + if dlg.yesno(u"Passer à un compte payant ?") == 0: + # On attribue une ip à toute les machines for m in adher.machines(): m.ip("") adher.adherentPayant(True) elif res[0] == 'Adresse' or res[0] == 'Chambre': - arg = u'--title "Déménagement de %s" ' % adher.Nom() + arg = u'--title "Déménagement de %s" ' % adher.Nom() arg += u'--menu "Question :" 0 0 0 ' - arg += u'"1" "Déménagement sur le campus ? " ' - arg += u'"2" "Déménagement à l\'extérieur en conservant les machines ?" ' - arg += u'"3" "Départ du campus en conservant son compte ?" ' - arg += u'"4" "Départ du campus en supprimant son compte ?" ' + arg += u'"1" "Déménagement sur le campus ? " ' + arg += u'"2" "Déménagement à l\'extérieur en conservant les machines ?" ' + arg += u'"3" "Départ du campus en conservant son compte ?" ' + arg += u'"4" "Départ du campus en supprimant son compte ?" ' annul, result = dialog(arg) if annul: return 1 if result[0] == '2': @@ -1625,8 +1625,8 @@ def modif_adher(adher): return modif_adher(adher) adher.chbre('EXT') elif result[0] == '3': - arg = u'--title "Départ de %s" ' % adher.Nom() - arg += u'--yesno "Le départ d\'un adhérent provoque la destruction de ses machines.\n' + arg = u'--title "Départ de %s" ' % adher.Nom() + arg += u'--yesno "Le départ d\'un adhérent provoque la destruction de ses machines.\n' arg += u'\nDoit-on continuer ?" 0 0' no, res = dialog(arg) if no: return modif_adher(adher) @@ -1636,11 +1636,11 @@ def modif_adher(adher): elif result[0] == '4': if u'Nounou' in adher.droits() and not isadm: arg = u'--title "Destruction adherent" ' - arg += u'--msgbox "Vous n\'avez pas les droits necessaires pour effectuer cette opération.\n\n\n" 0 0' + arg += u'--msgbox "Vous n\'avez pas les droits necessaires pour effectuer cette opération.\n\n\n" 0 0' dialog(arg) return modif_adher(adher) - arg = u'--title "Départ de %s" ' % adher.Nom() - arg += u'--yesno "Le départ du campus de %s va provoquer la destruction de son compte.\n' % adher.Nom() + arg = u'--title "Départ de %s" ' % adher.Nom() + arg += u'--yesno "Le départ du campus de %s va provoquer la destruction de son compte.\n' % adher.Nom() arg += u'\nDoit-on continuer ?" 0 0' no, res = dialog(arg) if no: return modif_adher(adher) @@ -1651,29 +1651,29 @@ def modif_adher(adher): else: while 1: - arg = u'--title "Déménagement de %s" ' % adher.Nom() + arg = u'--title "Déménagement de %s" ' % adher.Nom() arg += u'--inputbox "Chambre ?" 0 0 ' annul, res = dialog(arg) if annul: return modif_adher(adher) e = _set_chbre(adher, res[0]) if res[0] == 'EXT': - # Il faut demander l'adresse extérieure + # Il faut demander l'adresse extérieure if set_addr_ext(adher): # Annulation continue if e: - arg = u'--title "Déménagement de %s" ' % adher.Nom() + arg = u'--title "Déménagement de %s" ' % adher.Nom() arg += u'--msgbox "%s\n\n\n" 0 0' % e dialog(arg) else: break - elif res[0] == 'Téléphone': + elif res[0] == 'Téléphone': while 1: - arg = u'--title "Changement numéro de téléphone de de %s" ' % adher.Nom() - arg += u'--inputbox "Nouveau numéro ?" 0 0 "%s" ' % adher.tel() + arg = u'--title "Changement numéro de téléphone de de %s" ' % adher.Nom() + arg += u'--inputbox "Nouveau numéro ?" 0 0 "%s" ' % adher.tel() annul, res = dialog(arg) if annul: return modif_adher(adher) @@ -1681,7 +1681,7 @@ def modif_adher(adher): adher.tel(res[0].replace(' ', '')) break except ValueError, c: - arg = u'--title "Changement numéro de téléphone de de %s" ' % adher.Nom() + arg = u'--title "Changement numéro de téléphone de de %s" ' % adher.Nom() arg += u'--msgbox "%s\n\n\n" 0 0' % c.args[0] dialog(arg) @@ -1732,12 +1732,12 @@ def modif_machine(machine): arg += u'--menu "Que souhaitez vous modifier ?" 0 0 0 ' arg += u'"Informations" "Modifier le nom de machine, l\'IP, adresse MAC" ' arg += u'"Blackliste" "Modifier la blacklist de la machine" ' - arg += u'"Alias" "Créer ou supprimer un alias de la machine" ' + arg += u'"Alias" "Créer ou supprimer un alias de la machine" ' arg += u'"Exemptions" "Modifier la liste d\'exemption d\'upload de la machine" ' arg += u'"Remarques" "Ajouter ou supprimer une remarque de la machine" ' if isinstance(machine, BorneWifi) and isadm: # Borne wifi - arg += u'"Wifi" "Modifier les paramètres spécifiques aux bornes wifi" ' + arg += u'"Wifi" "Modifier les paramètres spécifiques aux bornes wifi" ' @@ -1763,15 +1763,15 @@ def modif_machine(machine): ######################################################################## -## Fonction de sélection (adhérent ou machine) +## Fonction de sélection (adhérent ou machine) def select(clas, quoi, mde=''): """ - Interface de choix d'un adhérent, d'une machine ou d'un club + Interface de choix d'un adhérent, d'une machine ou d'un club Retourne une instance de la classe choisie. - quoi est la chaine utilisée pour la demande (%sid=?) - exemples : quoi = 'adhérent a' => Votre choix ? adhérent aid=: - il faut que le dernier caractère de quoi soit a pour adhérent ou m pour machine + quoi est la chaine utilisée pour la demande (%sid=?) + exemples : quoi = 'adhérent a' => Votre choix ? adhérent aid=: + il faut que le dernier caractère de quoi soit a pour adhérent ou m pour machine Retourne None si annulation. si m = ro ouvre l'objet en mode read-only @@ -1787,10 +1787,10 @@ def select(clas, quoi, mde=''): s = map(f, s) arg = u'--title "Recherche %s" ' % ' '.join(quoi.split()[:-1]) arg += u'--help-button ' - arg += u'--form "Entrez vos paramètres de recherche" 0 0 0 ' + arg += u'--form "Entrez vos paramètres de recherche" 0 0 0 ' arg += u'"Nom :" 1 1 "%s" 1 13 20 20 ' % s[0] arg += u'"Prenom :" 2 1 "%s" 2 13 20 20 ' % s[1] - arg += u'"Téléphone :" 3 1 "%s" 3 13 10 00 ' % s[2] + arg += u'"Téléphone :" 3 1 "%s" 3 13 10 00 ' % s[2] arg += u'"Chambre :" 4 1 "%s" 4 13 05 00 ' % s[3] arg += u'"aid :" 5 1 "%s" 5 13 5 5 ' % s[4] arg += u'"Login / mail :" 6 1 "%s" 6 16 30 00 ' % s[5] @@ -1799,7 +1799,7 @@ def select(clas, quoi, mde=''): arg += u'"Mac :" 3 37 "%s" 3 43 17 17 ' % s[7] arg += u'"IP :" 4 37 "%s" 4 43 15 15 ' % s[8] arg += u'"mid :" 5 37 "%s" 5 43 5 5 ' % s[9] - arg += u'"Les champs vides sont ignorés." 7 1 "" 0 0 0 0' + arg += u'"Les champs vides sont ignorés." 7 1 "" 0 0 0 0' annul, result = dialog(arg) if annul: return @@ -1817,13 +1817,13 @@ def select(clas, quoi, mde=''): if not i: i= u'*' s.append(i) - ### Contruction de la chaîne de recherche + ### Contruction de la chaîne de recherche filtre_adher = u'nom=%s&prenom=%s&tel=%s&chbre=%s&aid=%s&mail=%s&' % tuple(s[:6]) filtre_machine = u'host=%s&macAddress=%s&ipHostNumber=%s&mid=%s&' % tuple(s[6:]) filtre= '' if filtre_adher.count('=*&') != 6: - # Au moins une condition adhérent + # Au moins une condition adhérent filtre += filtre_adher[:-1] if filtre_machine.count('=*&') != 4: # Au moins une condition machine @@ -1844,7 +1844,7 @@ def select(clas, quoi, mde=''): res = clas.search(filtre, 'w') except ValueError: arg = u'--title "Recherche" ' - arg += u'--msgbox "Caractère interdit.\n\n\n" 0 0' + arg += u'--msgbox "Caractère interdit.\n\n\n" 0 0' dialog(arg) continue @@ -1852,7 +1852,7 @@ def select(clas, quoi, mde=''): if quoi[-1] == 'a': valid = res['adherent'] if not valid and res['machine']: - # On va récupérer les adhérents correspondants aux machines trouvés + # On va récupérer les adhérents correspondants aux machines trouvés deja= [] for m in res['machine']: a = m.proprietaire() @@ -1862,7 +1862,7 @@ def select(clas, quoi, mde=''): elif quoi[-1] == 'm': valid = res['machine'] if not valid and res['adherent']: - # On va récupérer les machines des adhérents trouvés + # On va récupérer les machines des adhérents trouvés for a in res['adherent']: for m in a.machines(): valid.append(m) @@ -1871,20 +1871,20 @@ def select(clas, quoi, mde=''): if not valid or (len(valid) == 1 and quoi[-1] == 'a' and valid[0].__class__ == AssociationCrans): arg = u'--title "Recherche" ' - arg += u'--msgbox "Aucun résultat.\n\n\n" 0 0' + arg += u'--msgbox "Aucun résultat.\n\n\n" 0 0' dialog(arg) # Retour au formulaire continue if len(valid) == 1: - # Une seule réponse + # Une seule réponse choix = valid[0] else: # Il faut choisir while 1: os.system('clear') choix = None - print "Plusieurs réponses correspondant à votre requête ont été trouvées :" + print "Plusieurs réponses correspondant à votre requête ont été trouvées :" aff(valid) i = affich_tools.prompt(u'Votre choix ? (0 pour annuler) %sid =' % quoi) if i == '0': break @@ -1899,32 +1899,32 @@ def select(clas, quoi, mde=''): if choix: break if not choix: - # Retour à l'interface de recherche + # Retour à l'interface de recherche continue os.system('clear') - print "Sélection : " + print "Sélection : " aff(choix) while 1: - r = affich_tools.prompt(u'Confirmer sélection ? [O/N]') + r = affich_tools.prompt(u'Confirmer sélection ? [O/N]') if r == 'O' or r == 'o': break elif r == 'N' or r == 'n': # Annulation du choix choix = None break - print 'Répondre O ou N' - # Retour à la confirmation + print 'Répondre O ou N' + # Retour à la confirmation if choix: if mde != 'ro' and not choix._modifiable: arg = u'--title "Recherche" ' - arg += u'--msgbox "Objet sélectionné locké, attendre.\n\n\n" 0 0' + arg += u'--msgbox "Objet sélectionné locké, attendre.\n\n\n" 0 0' dialog(arg) return return choix - # Sinon retour interface de sélection + # Sinon retour interface de sélection def menu_principal(): """ @@ -1934,7 +1934,7 @@ def menu_principal(): # que signifient toutes ces initiales ? # (a)jouter, (m)odifier, (d)eleter # (M)achine, (A)dherent, (C)lub, K=crans, (B)orne - # (c)ourant = déja selectionné + # (c)ourant = déja selectionné proprio = None becane = None @@ -1951,28 +1951,28 @@ def menu_principal(): if proprio: if proprio.__class__ != AssociationCrans: arg += u' "Modifier l\'inscription de %s" "" ' % proprio.Nom() - arg += u'"aMc" "Ajouter une machine à %s" "" ' % proprio.Nom() + arg += u'"aMc" "Ajouter une machine à %s" "" ' % proprio.Nom() if becane: arg += u'"mMc" "Modifier la machine %s" "Modification du nom, de l\'IP, de la MAC, des alias, des exemptions..." ' % becane.nom().split('.')[0] if proprio or becane: arg += u'"" "---------------------------------------" "" ' - arg += u'"aA" "Inscrire un nouvel adhérent" "" ' - arg += u'"mA" "Modifier l\'inscription d\'un adhérent" "Changer la chambre, la remarque, la section, la carte d\'étudiant ou précâbler." ' - arg += u'"aMA" "Ajouter une machine à un adhérent" "" ' - arg += u'"dA" "Détruire un adhérent" "Suppression de l\'adhérent ainsi que de ses machines" ' + arg += u'"aA" "Inscrire un nouvel adhérent" "" ' + arg += u'"mA" "Modifier l\'inscription d\'un adhérent" "Changer la chambre, la remarque, la section, la carte d\'étudiant ou précâbler." ' + arg += u'"aMA" "Ajouter une machine à un adhérent" "" ' + arg += u'"dA" "Détruire un adhérent" "Suppression de l\'adhérent ainsi que de ses machines" ' arg += u'"" "---------------------------------------" "" ' arg += u'"mM" "Modifier une machine existante" "Changer le nom ou la MAC d\'une machine." ' - arg += u'"dM" "Détruire une machine" "" ' + arg += u'"dM" "Détruire une machine" "" ' arg += u'"" "---------------------------------------" "" ' arg += u'"aC" "Inscrire un nouveau club" "" ' arg += u'"mC" "Modifier un club" "" ' - arg += u'"aMC" "Ajouter une machine à un club" "" ' - arg += u'"dC" "Détruire un club" "Suppression du club ainsi que de ses machines" ' + arg += u'"aMC" "Ajouter une machine à un club" "" ' + arg += u'"dC" "Détruire un club" "Suppression du club ainsi que de ses machines" ' if isadm: arg += u'"" "---------------------------------------" "" ' if isadm: - arg += u'"aKM" "Ajouter une machine à l\'association" "" ' + arg += u'"aKM" "Ajouter une machine à l\'association" "" ' arg += u'"aKB" "Ajouter une borne wifi" "" ' annul, result = dialog(arg) if annul: break @@ -1980,9 +1980,9 @@ def menu_principal(): if result[0][:4] == 'HELP': arg = u'--title Aide ' arg += u'--msgbox "Interface utilisable au clavier ou a la souris pour les terminaux le supportant.\n' - arg += u'Pour revenir à une question précédente utiliser le bouton annuler ou Ctrl +C.\n' - arg += u'Pour quitter sans enregister les dernières modifications utilisez ESC.\n\n' - arg += u'Pour toute remarque ou problème : fred@crans.org\n\n\n" 0 0' + arg += u'Pour revenir à une question précédente utiliser le bouton annuler ou Ctrl +C.\n' + arg += u'Pour quitter sans enregister les dernières modifications utilisez ESC.\n\n' + arg += u'Pour toute remarque ou problème : fred@crans.org\n\n\n" 0 0' dialog(arg) continue @@ -1990,7 +1990,7 @@ def menu_principal(): if not choix: continue if choix == 'aA': - # Inscription nouvel adhérent + # Inscription nouvel adhérent proprio = Adherent() if new_adher(proprio): del proprio @@ -1998,26 +1998,26 @@ def menu_principal(): else: choix = 'aMc' # ajout d'une machine elif choix == 'mA': - # Modif adhérent - proprio = select(db, u'adhérent à modifier a') + # Modif adhérent + proprio = select(db, u'adhérent à modifier a') if not proprio: continue choix = 'mAc' elif choix == 'aMA': - # Ajout machine, adhérent à choisir - proprio = select(db, u'adhérent auquel ajouter une machine a') + # Ajout machine, adhérent à choisir + proprio = select(db, u'adhérent auquel ajouter une machine a') if not proprio: continue choix= 'aMc' elif choix == 'aMC': - # Ajout machine, club à choisir + # Ajout machine, club à choisir proprio = select_club(db) if not proprio: continue choix= 'aMc' elif choix == 'mM': - # Modif machine, machine à choisir - becane = select(db, u'machine à modifier m') + # Modif machine, machine à choisir + becane = select(db, u'machine à modifier m') if not becane: continue choix= 'mMc' @@ -2035,8 +2035,8 @@ def menu_principal(): choix= 'mCc' elif choix == 'dA': - # Destruction adhérent - proprio = select(db, u'adhérent à détruire a') + # Destruction adhérent + proprio = select(db, u'adhérent à détruire a') if not proprio: continue if del_adher(proprio): continue del(proprio) ; proprio= None @@ -2044,7 +2044,7 @@ def menu_principal(): elif choix == 'dM': # Destruction machine - becane = select(db, u'machine à détruire m') + becane = select(db, u'machine à détruire m') if not becane: continue if del_machine(becane): continue del(becane) ; becane= None @@ -2072,21 +2072,21 @@ def menu_principal(): ############################################## if choix == 'aMc': - # Ajout d'une machine à l'adhérent/au club courant + # Ajout d'une machine à l'adhérent/au club courant - # On ne peut avoir de machine fixe si on n'a pas payé + # On ne peut avoir de machine fixe si on n'a pas payé # la caution caution_ok = 'k' in proprio.controle() # On ne peut avoir une machine fixe que si on a pas - # déjà une machine fixe, sauf si on est membre actif - # (expérimental) + # déjà une machine fixe, sauf si on est membre actif + # (expérimental) if not isinstance(proprio, Club) and not proprio.adherentPayant(): - # Les gens qui ne paient pas n'ont le droit qu'à une + # Les gens qui ne paient pas n'ont le droit qu'à une # seule machine fixe if proprio.machines_fixes(): - dlg.msgbox(u"Le type de compte de cet adhérent ne lui permet pas d'avoir de machine suplémentaire") + dlg.msgbox(u"Le type de compte de cet adhérent ne lui permet pas d'avoir de machine suplémentaire") continue else: choix = "Fixe" @@ -2102,8 +2102,8 @@ def menu_principal(): # Plus de machine fixe possible... arg = u'--title "Nouvelle machine" ' arg += u'--menu " Non membre actif\n\n' - arg += u'Seuls les membres actifs peuvent posséder plusieurs\n' - arg += u'machines fixes. L\'adhérent actuel n\'est pas membre\n' + arg += u'Seuls les membres actifs peuvent posséder plusieurs\n' + arg += u'machines fixes. L\'adhérent actuel n\'est pas membre\n' arg += u'actif, il n\'est donc possible que de lui ajouter une\n' arg += u'machine wifi..." 0 0 0 ' arg += u'"OK" "OK, on lui rajoute une machine wifi" ' @@ -2131,10 +2131,10 @@ def menu_principal(): if choix == 'mAc': - # Modif propriétaire courant + # Modif propriétaire courant del(becane) becane= None - # On supprime la machine car des modifs du propriétaire (bat) ne seraient + # On supprime la machine car des modifs du propriétaire (bat) ne seraient # alors pas vu par l'instance actuelle de machine if modif_adher(proprio): # Annulation des modifs @@ -2199,11 +2199,11 @@ if __name__ == '__main__': except SystemExit, c: if c.__str__() == '254': os.system('reset') - print "Votre session d'édition à été tuée." + print "Votre session d'édition à été tuée." exit = c except: if not debug: os.system('clear') - print """Une erreur fatale s'est produite durant l'exécution.""" + print """Une erreur fatale s'est produite durant l'exécution.""" # Report de bug import traceback @@ -2217,7 +2217,7 @@ if __name__ == '__main__': traceback = s.getvalue() try: if not debug and To: - # Paramètres pour le mail + # Paramètres pour le mail From = script_utilisateur + '@crans.org' entete_mail = """From: %s @@ -2230,15 +2230,15 @@ Subject: Bugreport %s conn = SMTP(smtpserv) conn.sendmail(From, To, entete_mail + traceback) conn.quit() - sys.stderr.write("Un rapport de bug à été automatiquement envoyé.\n") + sys.stderr.write("Un rapport de bug à été automatiquement envoyé.\n") else: - print "Merci de faire parvenir un rapport de bug à nounou" + print "Merci de faire parvenir un rapport de bug à nounou" except: sys.stderr.write("Impossible d'envoyer le rapport de bug.\n") if debug: print '-'*40 - print 'Détails techniques :' + print 'Détails techniques :' sys.stderr.write(traceback) print '-'*40 exit = 1 @@ -2255,17 +2255,17 @@ Subject: Bugreport %s if serv: mn = int(strftime('%M')) # Restart toutes les 10 min : 03, 13, 23, 33, 43, 53 - t = (13 - mn % 10) % 10 + 1 # Certaines machines le font -Aà 4-b + t = (13 - mn % 10) % 10 + 1 # Certaines machines le font -Aà 4-b if t == 0: t = 10 - print "Les modifications apportées à la base seront prises en compte dans %i min environ." % t + print "Les modifications apportées à la base seront prises en compte dans %i min environ." % t if debug: - print "Les services suivants seront redémarrés: " + print "Les services suivants seront redémarrés: " for s in serv: print '\t%s' % s if debug: print '-*- Fin -*-' - # Rétablissement du Ctrl-C + # Rétablissement du Ctrl-C signal.signal(signal.SIGINT, signal.SIG_DFL) sys.exit(exit) diff --git a/gestion/hptools.py b/gestion/hptools.py index 601caf75..0afb35fa 100755 --- a/gestion/hptools.py +++ b/gestion/hptools.py @@ -1,13 +1,13 @@ #!/usr/bin/env python -# -*- coding: iso-8859-15 -*- +# -*- coding: utf-8 -*- """ Fichier de base d'interface avec les switchs manageables. -Donne la classe switch qui permet d'effectuer les opérations -élémentaires sur les switchs manageable HP 26xx. +Donne la classe switch qui permet d'effectuer les opérations +élémentaires sur les switchs manageable HP 26xx. -Frédéric PAUGET +Frédéric PAUGET """ from time import sleep from popen2 import popen3 @@ -28,13 +28,13 @@ try: from secrets import config_snmp_secrete, reconf_snmp except: # Si a pas le droit de lire config_snmp_secrete - # on va tenter de tout faire en snmpv1 et communauté public + # on va tenter de tout faire en snmpv1 et communauté public def config_snmp_secrete(snmp,switch) : snmp = snmp(switch,version='1',community='public') return snmp.get, snmp.set, snmp.walk ############################################################################################# -### Définitions de classes utiles +### Définitions de classes utiles # Quelques exceptions class ConnectionTimout(Exception) : @@ -50,7 +50,7 @@ class ConversationError(Exception) : import pexpect class ssh : - """ Ouverture d'une connexion ssh, envoi de commandes et récupération du résultat """ + """ Ouverture d'une connexion ssh, envoi de commandes et récupération du résultat """ def __init__(self,host) : @@ -77,13 +77,13 @@ class ssh : self.ssh.close() def send_cmd(self,cmd,timeout=15): - """ Envoi une commande, attend le prompt et retourne la réponse """ + """ Envoi une commande, attend le prompt et retourne la réponse """ # Envoi de la commande self.ssh.sendline(cmd) self.__sshout = '' try: - # Attente de la réponse + # Attente de la réponse while 1: index = self.ssh.expect([' \[y/n\]\? ', '%s\(config\)# ' % self.switch, @@ -92,7 +92,7 @@ class ssh : self.__sshout = self.__sshout + self.ssh.before if index == 0: - # On répond oui + # On répond oui self.ssh.send("y") elif index == 1: # On est revenu au prompt @@ -112,13 +112,13 @@ class ssh : class snmp : """ Classe de communication SNMP """ def __init__(self,host,version=None,community=None,authentication_protocol=None, authentication_pass=None, username=None, privacy_pass=None) : - """ host doit être la machine sur laquelle se connecter - version est la verion du protocole snmp à utiliser : 1, 2c ou 3 - le reste des données doit être ou non fourni suivant la version + """ host doit être la machine sur laquelle se connecter + version est la verion du protocole snmp à utiliser : 1, 2c ou 3 + le reste des données doit être ou non fourni suivant la version - pour v1 et v2c seule la communauté est prise en compte - pour v3 authentication_protocol, authentication_pass et username sont requis si accès en authNoPriv - si privacy_pass est fourni accès en authPriv + pour v1 et v2c seule la communauté est prise en compte + pour v3 authentication_protocol, authentication_pass et username sont requis si accès en authNoPriv + si privacy_pass est fourni accès en authPriv """ self.host = host self.version = version @@ -150,11 +150,11 @@ class snmp : return r def get(self,oid) : - """ Retourne le résultat correspondant à l'oid demandé """ + """ Retourne le résultat correspondant à l'oid demandé """ return self.__exec('snmpget -O vq %s %s ' % ( self.options, oid ) ) def get_string(self,oid) : - """ Retourne le resultat convertit en String correspondant à l'oid demandé. Fonctionne avec les types de depart String, Integer, Hex-String. Raise ValueError sinon. """ + """ Retourne le resultat convertit en String correspondant à l'oid demandé. Fonctionne avec les types de depart String, Integer, Hex-String. Raise ValueError sinon. """ s= self.__exec('snmpget -O v %s %s ' % ( self.options, oid ) ) if s=="\"\"": return "" @@ -170,14 +170,14 @@ class snmp : raise ValueError('Type inconnu') def set(self,oid,typ,val) : - """ Change la valeur le l'oid donné. + """ Change la valeur le l'oid donné. type est le type de la valeur - val est la valeur à écrire + val est la valeur à écrire """ return self.__exec('snmpset -O vq %s %s %s %s' % (self.options, oid, typ, val ) ) def walk(self,base_oid) : - """ Retourne le résultat de snmpwalk + """ Retourne le résultat de snmpwalk le retour est un dictionnaire { oid : valeur } """ lignes = self.__exec('snmpwalk -O q %s %s' % (self.options, base_oid ) ).split('\n') @@ -204,7 +204,7 @@ class hpswitch : __conn_ssh = None def __init__(self,switch) : - """ Switch doit être le nom du switch """ + """ Switch doit être le nom du switch """ if self.__debug : self.__logDest.write("HP DEBUG : __init__(switch=%s)\n" % switch ) self.switch = switch.lower() @@ -219,20 +219,20 @@ class hpswitch : return self.__conn_ssh.send_cmd(cmd,timout) def show_prise_mac(self,prise='') : - """ Retourne le(s) adresse(s) MAC présentes sur la prise.""" + """ Retourne le(s) adresse(s) MAC présentes sur la prise.""" if not prise : prise = self.prise if self.__debug : self.__logDest.write("HP DEBUG : show_prise_mac(prise=%s)\n" % prise) try: data = self.walk('STATISTICS-MIB::hpSwitchPortFdbAddress.%d' % int(prise)) return map(lambda x:findall('".*"',":".join(x.lower().split(' ')))[0][1:-2],data.values()) except ValueError: - # Pas de MAC trouvée + # Pas de MAC trouvée return [] def where_is_mac(self, mac) : - """Retrouve la prise correspondant à une adresse MAC donnée""" + """Retrouve la prise correspondant à une adresse MAC donnée""" if self.__debug : self.__logDest.write("HP DEBUG : where_is_mac(mac=%s)\n" % mac) - # On va transformer l'adresse MAC cherchée pour la mettre au format 0A 0A 0A 0A 0A 0A + # On va transformer l'adresse MAC cherchée pour la mettre au format 0A 0A 0A 0A 0A 0A mac = mac.upper() mac = filter(lambda x: x in "0123456789ABCDEF", mac) # 0A0A0A0A0A0A mac = "%s %s %s %s %s %s" % (mac[0:2], mac[2:4], mac[4:6], @@ -246,7 +246,7 @@ class hpswitch : if onemac[1:-2] == mac: return int(onesnmp.split(".")[1]) - # On a rien trouvé + # On a rien trouvé return None def __scp(self,destination,fichier) : @@ -272,8 +272,8 @@ class hpswitch : self.scp('ssh/mgr_keys',file) def multicast(self,ip='') : - """ Donne la liste des ports du swich inscrits au flux multicast donné - Si aucun flux donné teste tous les flux multicast possibles. + """ Donne la liste des ports du swich inscrits au flux multicast donné + Si aucun flux donné teste tous les flux multicast possibles. Retourne un dictionnaire : { adresse du flux : [ ports inscrits ] } """ @@ -311,7 +311,7 @@ class hpswitch : return self.set('IF-MIB::ifAdminStatus.%d' % int(prise), 'i', 1) def disable(self,prise=0) : - """ Désactive une prise """ + """ Désactive une prise """ if not prise : prise = self.prise if self.__debug : self.__logDest.write("HP DEBUG : disable(prise=%s)\n" % prise) return self.set('IF-MIB::ifAdminStatus.%d' % int(prise), 'i', 2) @@ -323,15 +323,15 @@ class hpswitch : nb = 0 for oid,etat in self.walk(oid).items() : if etat == 'up' and int(oid.split('.')[1])<51 : - # Le <51 est ici pour éviter de compter les ports fictifs + # Le <51 est ici pour éviter de compter les ports fictifs nb += 1 return nb prise = prise.replace('-','') return self.get(oid + '.' + prise) == 'up' def is_enable(self,prise=0) : - """ Retoune True ou False suivant si la prise est activée ou non - Si prise=all retourne le nombre de prises activées sur le switch """ + """ Retoune True ou False suivant si la prise est activée ou non + Si prise=all retourne le nombre de prises activées sur le switch """ if prise != 'all': prise = int(prise) return self.__is('IF-MIB::ifAdminStatus',prise) @@ -342,7 +342,7 @@ class hpswitch : return self.__is('IF-MIB::ifOperStatus',prise) def nom(self,nom=None,prise=0) : - """ Retourne ou attribue le nom à la prise fournie """ + """ Retourne ou attribue le nom à la prise fournie """ if not prise : prise = self.prise oid = 'IF-MIB::ifAlias.%d' % int(prise) if nom==None : @@ -377,7 +377,7 @@ class hpswitch : self.set(oid,'i',code) def vlans(self, prise = None): - """Récupère les vlans activés sur la prise 'prise'""" + """Récupère les vlans activés sur la prise 'prise'""" if not prise: prise = self.prise prise = int(prise) @@ -461,7 +461,7 @@ if __name__ == '__main__' : for opt, val in options : if opt == '-h' or opt=='--help' : print "Usage : %s [[-c commande1] -c commande2...] [-U firmware] [--snmp] regex " - print "Envoi les commandes données au switchs matchant la regex" + print "Envoi les commandes données au switchs matchant la regex" print "si aucune commande est founie lit l'entree standart" print "L'envoi de firmware ne fait pas rebooter le switch" print "L'option --snmp ajoute les commandes de reconfiguration snmp" @@ -486,7 +486,7 @@ if __name__ == '__main__' : switchs.append(sw) if not switchs : - print "Aucun switch trouvé" + print "Aucun switch trouvé" print "Note : il faut une _regex_ (!= wilcards au sens du shell)" sys.exit(3) @@ -499,7 +499,7 @@ if __name__ == '__main__' : print try: - raw_input("Appuyer sur entrée pour continuer") + raw_input("Appuyer sur entrée pour continuer") except EOFError: # On lisait depuis un pipe print '\r'+' '*33+'\r' @@ -507,7 +507,7 @@ if __name__ == '__main__' : for sw in switchs : print sw try: - # Au cas ou le switch ne répondrai pas + # Au cas ou le switch ne répondrai pas s = hpswitch(sw) if firmware : s.upgrade(firmware) diff --git a/gestion/iptools.py b/gestion/iptools.py index b451378b..f8dac5e8 100755 --- a/gestion/iptools.py +++ b/gestion/iptools.py @@ -1,21 +1,21 @@ #! /usr/bin/env python -# -*- coding: iso-8859-15 -*- +# -*- coding: utf-8 -*- """ Manipulation d'IPv4 -Copyright (C) Frédéric Pauget +Copyright (C) Frédéric Pauget Licence : GPLv2 """ import re from config import NETs_regexp -# Pour accélérer QuadToDec... +# Pour accélérer QuadToDec... __QuadToDecDone = {} def QuadToDec(ip) : """ - Retourne la représentation décimale d'une ip + Retourne la représentation décimale d'une ip ip est de la forme xxx.xxx.xxx.xxx """ if ip in __QuadToDecDone: @@ -31,12 +31,12 @@ def QuadToDec(ip) : __QuadToDecDone[ip] = ip_dec return ip_dec -# Pour accélérer DecToQuad +# Pour accélérer DecToQuad __DecToQuadDone = {} def DecToQuad(ip_dec) : """ - Retourne la représentation habituelle d'une ip (xxx.xxx.xxx.xxx) + Retourne la représentation habituelle d'une ip (xxx.xxx.xxx.xxx) ip_dec est l'IP en base 10 """ if ip_dec in __DecToQuadDone: @@ -56,14 +56,14 @@ __paramDone = {} def param(net, raw=False) : """ - net est un résau fourni sous la forme xxx.xxx.xxx.xxx/yy - si donnée valide retourne un dictionnaire : + net est un résau fourni sous la forme xxx.xxx.xxx.xxx/yy + si donnée valide retourne un dictionnaire : { 'network' : xxx.xxx.xxx.xxx , 'netmask' : yyy.yyy.yyy.yyy , 'broadcast' : zzz.zzz.zzz.zzz } sinon retourne {} - Si raw = False, alors, on ne convertit pas les résultats sous forme pointée. + Si raw = False, alors, on ne convertit pas les résultats sous forme pointée. Ils restent sous forme d'un entier. """ if raw and net in __paramDone: @@ -96,9 +96,9 @@ def AddrInNet(ip,net) : """ ip est de la forme xxx.xxx.xxx.xxx net est de la forme xxx.xxx.xxx.xxx/yy - net peut être une liste de chaînes ci-dessus - Retourne True si l'ip est dans un des réseaux. - Note : retourne False si l'IP est une adresse de réseau ou broadcast + net peut être une liste de chaînes ci-dessus + Retourne True si l'ip est dans un des réseaux. + Note : retourne False si l'IP est une adresse de réseau ou broadcast """ if type(net)==str : net = [ net ] @@ -113,7 +113,7 @@ def AddrInNet(ip,net) : return r def AddrInNets(ip,nets) : - """ Vérifie si l'ip est au moins dans un des réseaux + """ Vérifie si l'ip est au moins dans un des réseaux de la liste nets (voir AddrInNet) """ for net in nets : if AddrInNet(ip,net) : @@ -121,7 +121,7 @@ def AddrInNets(ip,nets) : return False def is_crans(ip): - """ Vérifie que l'ip est dans le réseau CRANS + """ Vérifie que l'ip est dans le réseau CRANS """ # Pour prove le temps du point rencontre if ip == '138.231.136.19' : @@ -131,7 +131,7 @@ def is_crans(ip): return False def netmask(mask, dec=True) : - """ On génère le sous réseau /bits + """ On génère le sous réseau /bits """ non_dec_netmask = (1L<<(32-mask)) - 1 dec_netmask = (1L<<32) - 1 - non_dec_netmask @@ -148,25 +148,25 @@ def IpSubnet(ip, mask) : return subnet def NetSubnets(net, subnet_mask) : - """ On construit une liste des sous réseaux /subnet_mask - compris dans le sous réseau /mask comprenant l'ip ip + """ On construit une liste des sous réseaux /subnet_mask + compris dans le sous réseau /mask comprenant l'ip ip """ subnets = [] - # On récupère une ip du réseau indiqué + # On récupère une ip du réseau indiqué ip = net.split('/')[0] - # On récupère la valeur du masque + # On récupère la valeur du masque mask = int(net.split('/')[1]) - # On transforme les valeurs d'entrées en valeurs décimales - # On définit la valeur du sous réseau initial + # On transforme les valeurs d'entrées en valeurs décimales + # On définit la valeur du sous réseau initial dec_netmask = netmask(mask) dec_ip = QuadToDec(ip) dec_subnet_netmask = netmask(subnet_mask) - # On calcule la première ip du sous réseau indiqué + # On calcule la première ip du sous réseau indiqué start_ip = dec_ip & dec_netmask seq_ip = start_ip - # On fait une itération sur toutes les ip du sous réseau + # On fait une itération sur toutes les ip du sous réseau while (seq_ip & dec_netmask) == start_ip: - # On récupère le sous réseau de la taille demandée + # On récupère le sous réseau de la taille demandée subnet = DecToQuad(seq_ip & dec_subnet_netmask) + "/%s" % subnet_mask if not subnets.count(subnet) : subnets.append(subnet) diff --git a/gestion/ldap_crans.py b/gestion/ldap_crans.py index ae1dbdd9..99b193c0 100755 --- a/gestion/ldap_crans.py +++ b/gestion/ldap_crans.py @@ -1,11 +1,11 @@ #! /usr/bin/env python -# -*- coding: iso-8859-15 -*- +# -*- coding: utf-8 -*- """ -Définitions des classes de base du système de gestion des machines -et adhérents du crans +Définitions des classes de base du système de gestion des machines +et adhérents du crans -Copyright (C) Frédéric Pauget +Copyright (C) Frédéric Pauget Licence : GPLv2 """ @@ -23,18 +23,18 @@ from numeros_disponibles import lister_ip_dispo date_format = '%d/%m/%Y %H:%M' hostname = gethostname().split(".")[0] smtpserv = "rouge.crans.org" -random.seed() # On initialise le générateur aléatoire +random.seed() # On initialise le générateur aléatoire ################################################################################## -### paramètres de connexion à la base LDAP +### paramètres de connexion à la base LDAP cur_user = os.getenv('SUDO_USER') or pwd.getpwuid(os.getuid())[0] if __name__ == 'ldap_crans_test' or os.environ.get('crans_ldap', '') == 'test': if hostname != "egon": raise ImportError, coul("La base de test n'est accessible que depuis egon !", "rouge") - # Utilisation de la base de données de test (tests, séminaire...) + # Utilisation de la base de données de test (tests, séminaire...) # Il faut au choix : # - faire un import crans_ldap_test # ou - crans_ldap=test /le/script @@ -43,7 +43,7 @@ if __name__ == 'ldap_crans_test' or os.environ.get('crans_ldap', '') == 'test': ldap_password = '75bdb64f32' elif cur_user == 'freerad': - # Freeradius n'a pas accès au secret, donc accès que en local + # Freeradius n'a pas accès au secret, donc accès que en local uri = '' ro_uri = 'ldapi://%2fvar%2frun%2fslapd%2fldapi/' ldap_auth_dn = ldap_password = '' @@ -70,9 +70,9 @@ else: ### Items de la blackliste blacklist_items = { u'bloq': u'Bloquage total de tous les services', u'virus': u'Bloquage sur squid', - u'upload': u"Bloquage total de l'accès à l'extérieur", + u'upload': u"Bloquage total de l'accès à l'extérieur", u'warez': u'Bloquage sur squid', - u'p2p': u"Bloquage total de l'accès à l'extérieur", + u'p2p': u"Bloquage total de l'accès à l'extérieur", u'autodisc_upload': u'Autodisconnect pour upload', u'autodisc_p2p': u'Autodisconnect pour P2P' } @@ -103,31 +103,31 @@ script_utilisateur = cur_user ### Fonctions utiles def decode(s): """ - Retourne un unicode à partir de s - s doit être en utf-8 + Retourne un unicode à partir de s + s doit être en utf-8 """ if type(s) is unicode: - # Si s est déjà un unicode, on ne décode pas + # Si s est déjà un unicode, on ne décode pas return s else: return s.decode('utf-8', 'ignore') # On ignore les erreurs -accents = "êëèéÉÈÀÙâäàûüôöÖÔîïÎÏ'çÇÿßæÆøØ" # Si modif ici modifier aussi la fonction +accents = "êëèéÉÈÀÙâäàûüôöÖÔîïÎÃ'çÇÿßæÆøØ" # Si modif ici modifier aussi la fonction def strip_accents(a): - """ Supression des accents de la chaîne fournie """ - a = a.replace(u'ê','e').replace(u'ë','e').replace(u'è','e').replace(u'é','e').replace(u'É','e').replace(u'È','e') - a = a.replace(u'â','a').replace(u'ä','a').replace(u'à','a').replace(u'À','a') - a = a.replace(u'û','u').replace(u'ü','u').replace(u'ù','u').replace(u'Ù','u') - a = a.replace(u'ô','o').replace(u'ö','o').replace(u'Ö','o').replace(u'Ô','o') - a = a.replace(u'î','i').replace(u'ï','i').replace(u'Ï','i').replace(u'Î','i') - a = a.replace(' ','_').replace(u"'",'').replace(u'ç','c').replace(u'Ç','c') - a = a.replace(u'ÿ','y').replace(u'ß','ss').replace(u'æ','ae').replace(u'Æ','ae').replace(u'ø','o').replace(u'Ø','o') + """ Supression des accents de la chaîne fournie """ + a = a.replace(u'ê','e').replace(u'ë','e').replace(u'è','e').replace(u'é','e').replace(u'É','e').replace(u'È','e') + a = a.replace(u'â','a').replace(u'ä','a').replace(u'à','a').replace(u'À','a') + a = a.replace(u'û','u').replace(u'ü','u').replace(u'ù','u').replace(u'Ù','u') + a = a.replace(u'ô','o').replace(u'ö','o').replace(u'Ö','o').replace(u'Ô','o') + a = a.replace(u'î','i').replace(u'ï','i').replace(u'Ã','i').replace(u'ÃŽ','i') + a = a.replace(' ','_').replace(u"'",'').replace(u'ç','c').replace(u'Ç','c') + a = a.replace(u'ÿ','y').replace(u'ß','ss').replace(u'æ','ae').replace(u'Æ','ae').replace(u'ø','o').replace(u'Ø','o') return a def mailexist(mail): """ - Vérifie si une adresse mail existe ou non grace à la commande vrfy + Vérifie si une adresse mail existe ou non grace à la commande vrfy du serveur mail """ @@ -147,8 +147,8 @@ def preattr(val): """ val est : * un entier - * une chaîne - * une liste avec un seul entier ou une seule cha-Aîne-b + * une chaîne + * une liste avec un seul entier ou une seule cha-Aîne-b Retourne [ len(str(val).strip), str(val).strip en utf-8 ] """ @@ -160,7 +160,7 @@ def preattr(val): elif t == str or t == int: val = str(val).strip() - # On passe tout en utf-8 pour ne pas avoir de problèmes + # 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')] elif t == unicode: @@ -172,7 +172,7 @@ def preattr(val): def is_actif(sanction): """ - Retourne True ou False suivant si la sanction fournie (chaîne + Retourne True ou False suivant si la sanction fournie (chaîne venant de blacklist) est active ou non """ bl = sanction.split('$') @@ -189,14 +189,14 @@ def format_mac(mac): """ Formatage des adresses mac Transforme une adresse pour obtenir la forme xx:xx:xx:xx:xx:xx - Le séparateur original peut être :, - ou rien - Retourne la mac formatée. + Le séparateur original peut être :, - ou rien + Retourne la mac formatée. """ l, mac = preattr(mac) mac = mac.strip().replace("-", ":") if mac.count(":") == 5: # On a une adresse de la forme 0:01:02:18:d1:90 - # On va compléter s'il manque des 0 + # On va compléter s'il manque des 0 mac = ":".join(map(lambda x: x.replace(' ', '0'), map(lambda x: "%02s" % x, mac.split(":")))) mac = mac.replace(':', '').lower() @@ -204,9 +204,9 @@ def format_mac(mac): raise ValueError(u"Longueur de l'adresse mac incorrecte.") for c in mac[:]: if c not in string.hexdigits: - raise ValueError(u"Caractère interdit '%s' dans l'adresse mac." % c) + raise ValueError(u"Caractère interdit '%s' dans l'adresse mac." % c) if mac == '000000000000': - raise ValueError(u"MAC nulle interdite\nIl doit être possible de modifier l'adresse de la carte.") + raise ValueError(u"MAC nulle interdite\nIl doit être possible de modifier l'adresse de la carte.") # Formatage mac = "%s:%s:%s:%s:%s:%s" % (mac[:2], mac[2:4], mac[4:6], mac[6:8], mac[8:10], mac[10:]) @@ -214,15 +214,15 @@ def format_mac(mac): return mac ################################################################################## -### Définition des classes +### Définition des classes class Service: - """ Définit un service à redémarrer """ + """ Définit un service à redémarrer """ def __init__(self, nom, args=[], start=[]): """ Nom du service Liste des arguments - Liste d'horaires de démarrages + Liste d'horaires de démarrages """ self.nom = nom @@ -236,7 +236,7 @@ class Service: "maintenant" or time.strftime(date_format, time.localtime(t)), self.start)) - dates = " à partir d%s %s" % (dates.startswith("maintenant") and "e" or "u", + dates = " à partir d%s %s" % (dates.startswith("maintenant") and "e" or "u", dates) return ("%s(%s)%s" % (self.nom, ','.join(self.args), @@ -244,7 +244,7 @@ class Service: class CransLdap: """ - Classe de connexion à la base LDAP du crans. + Classe de connexion à la base LDAP du crans. """ conn = None base_dn = 'ou=data,dc=crans,dc=org' @@ -253,7 +253,7 @@ class CransLdap: ### Configuration de la recheche # Dictionnaire de transformation des champs - trans = { 'prénom': 'prenom', + trans = { 'prénom': 'prenom', 'chambre': 'chbre', 'login': 'mail', 'hostname': 'host', @@ -262,7 +262,7 @@ class CransLdap: 'telephone': 'tel', 'position': 'positionBorne' } - # Les différentes classes LDAP de machines + # Les différentes classes LDAP de machines ldap_machines_classes = ['machineFixe', 'machineWifi', 'machineCrans', 'borneWifi'] # Champs de recherche pour la recherche automatique @@ -306,7 +306,7 @@ class CransLdap: for i in auto_search_champs.keys(): search_champs[i] = auto_search_champs[i] + non_auto_search_champs[i] - # Profondeur des différentes recherches (scope) + # Profondeur des différentes recherches (scope) scope = { 'adherent': 1, 'club': 1, 'machineFixe': 2, @@ -319,7 +319,7 @@ class CransLdap: self.connect(readonly) def __del__(self): - # Destruction des locks résiduels + # Destruction des locks résiduels if hasattr(self, '_locks'): for lock in self._locks: self.remove_lock(lock) @@ -346,24 +346,24 @@ class CransLdap: def exist(self, arg): """ - Vérifie l'existence d'une entrée dans la base et que cette - entrée n'appartient pas à l'objet en cours. + Vérifie l'existence d'une entrée dans la base et que cette + entrée n'appartient pas à l'objet en cours. - La méthode prend en compte les locks. + La méthode prend en compte les locks. - arg doit être une expression de recherche ldap + arg doit être une expression de recherche ldap Si il y a existence, on retourne la liste des dn correspondants Sinon retourne une liste vide - Exemple : exist('chbre=Z345') vérifie si il y a un adhérent en Z345 + Exemple : exist('chbre=Z345') vérifie si il y a un adhérent en Z345 """ r = [] - # Premier test: dans les objets déjà inscrits + # Premier test: dans les objets déjà inscrits ret = self.conn.search_s(self.base_dn, 2, arg) for res in ret: - # C'est peut être l'objet courant + # C'est peut être l'objet courant try: # Si ce n'est pas une classe fille avec l'attribut dn => erreur if res[0] == self.dn: continue @@ -371,14 +371,14 @@ class CransLdap: pass r.append(res[0]) - # Deuxième test : lock ? + # Deuxième test : lock ? ret = self.conn.search_s(self.base_lock, 1, arg) lockid = '%s-%s' % (hostname, os.getpid()) for res in ret: # Lock encore actif ? l = res[1]['lockid'][0] if l == lockid: continue - # C'est locké par un autre process que le notre + # C'est locké par un autre process que le notre # il tourne encore ? try: if l.split('-')[0] == hostname and os.system('ps %s > /dev/null 2>&1' % l.split('-')[1]): @@ -394,7 +394,7 @@ class CransLdap: def lock(self, item, valeur): """ Lock un item avec la valeur valeur, les items possibles - peuvent être : + peuvent être : aid $ chbre $ mail $ mailAlias $ canonicalAlias $ mid $ macAddress $ host $ hostAlias $ ipHostNumber @@ -417,19 +417,19 @@ class CransLdap: try: self.conn.add_s(lock_dn, modlist) except ldap.ALREADY_EXISTS: - # Pas de chance, le lock est déja pris + # Pas de chance, le lock est déja pris try: res = self.conn.search_s(lock_dn, 2, 'objectClass=lock')[0] l = res[1]['lockid'][0] except: l = '%s-1' % hostname if l != lockid: - # C'est locké par un autre process que le notre + # C'est locké par un autre process que le notre # il tourne encore ? if l.split('-')[0] == hostname and os.system('ps %s > /dev/null 2>&1' % l.split('-')[1] ): # Il ne tourne plus self.remove_lock(res[0]) # delock return self.lock(item, valeur) # relock - raise EnvironmentError(u'Objet (%s=%s) locké, patienter.' % (item, valeur), l) + raise EnvironmentError(u'Objet (%s=%s) locké, patienter.' % (item, valeur), l) else: if not hasattr(self, '_locks'): self._locks = [lock_dn] @@ -441,7 +441,7 @@ class CransLdap: Destruction d'un lock Destruction de tous les locks si lockdn=* """ - # Ne tente de dertuire le lock que si l'on est connecté à la base + # Ne tente de dertuire le lock que si l'on est connecté à la base if self.conn: # Mettre des verifs ? if lockdn != '*': @@ -462,13 +462,13 @@ class CransLdap: def services_to_restart(self, new=None, args=[], start=0): """ - start indique la date (en secondes depuis epoch) à partir du - moment où cette action sera effectuée. + start indique la date (en secondes depuis epoch) à partir du + moment où cette action sera effectuée. - Si new = None retourne la liste des services à redémarrer. + Si new = None retourne la liste des services à redémarrer. Si new est fourni, mais ne commence pas par '-', on ajoute - le service à la liste avec les arguments args (args doit être + le service à la liste avec les arguments args (args doit être une liste). Si new commence par '-', on supprime le service si son start @@ -478,7 +478,7 @@ class CransLdap: """ if new: new = preattr(new)[1] - # Quels services sont déjà à redémarrer ? + # Quels services sont déjà à redémarrer ? serv = {} # { service: [ arguments ] } serv_dates = {} # { service: [ dates de restart ] } services = [] @@ -488,19 +488,19 @@ class CransLdap: serv_dates[s['cn'][0]] = s.get('start', []) services.append(Service(s['cn'][0], s.get('args', []), s.get('start', []))) - # Retourne la liste des services à redémarrer + # Retourne la liste des services à redémarrer if not new: return services # Effacement d'un service if new[0] == '-': if new[1] == '-': - # Double -- on enlève quelque soit la date + # Double -- on enlève quelque soit la date remove_dn = 'cn=%s,%s' % (new[2:], self.base_services) else: - # On enlève uniquement si la date est passée + # On enlève uniquement si la date est passée remove_dn = 'cn=%s,%s' % (new[1:], self.base_services) if not serv.has_key(new[1:]): - # Existe pas => rien à faire + # Existe pas => rien à faire return keep_date = [] for date in serv_dates[new[1:]]: @@ -514,7 +514,7 @@ class CransLdap: # Suppression try: self.conn.delete_s(remove_dn) except: pass - # Si n'existe pas => Erreur mais le résultat est là. + # Si n'existe pas => Erreur mais le résultat est là. return serv_dn = 'cn=%s,%s' % (new, self.base_services) @@ -552,9 +552,9 @@ class CransLdap: except ldap.TYPE_OR_VALUE_EXISTS: # Pas grave pass - # else rien à faire + # else rien à faire else: - # Entrée non présente -> ajout + # Entrée non présente -> ajout modlist = ldap.modlist.addModlist({ 'objectClass': 'service', 'cn': new, 'args': args, @@ -562,33 +562,33 @@ class CransLdap: try: self.conn.add_s(serv_dn, modlist) except ldap.ALREADY_EXISTS: - # Existe déja => rien à faire + # Existe déja => rien à faire pass def make(self, entry, mode=''): """ - Crée le bon objet à partir de entry. - mode a la même signification que dans search. + Crée le bon objet à partir de entry. + mode a la même signification que dans search. """ - # On récupère la bonne classe + # On récupère la bonne classe nom_classe = (entry[1].get('objectClass') or ['none'])[0] nom_classe = nom_classe[0].upper() + nom_classe[1:] try: classe = eval(nom_classe) - # On crée l'objet + # On crée l'objet return classe(entry, mode, self.conn) except: - raise ValueError(u"Impossible de créer l'objet %s" % nom_classe) + raise ValueError(u"Impossible de créer l'objet %s" % nom_classe) def search(self, expression, mode=''): """ - Recherche dans la base LDAP, expression est une chaîne : + Recherche dans la base LDAP, expression est une chaîne : * soit une expression : champ1=expr1&champ2=expr2&champ3!=expr3... * soit un seul terme, dans ce cas cherche sur les champs de auto_search_champs - Si mode='w', les instances crées seront en mode d'écriture + Si mode='w', les instances crées seront en mode d'écriture """ if os.getuid() != 0: @@ -602,12 +602,12 @@ class CransLdap: elif type(expression) == unicode: expression = expression.encode('utf-8') else: - raise TypeError(u'Chaîne attendue') + raise TypeError(u'Chaîne attendue') if not expression: return [] - # On échappe les caractères spéciaux + # On échappe les caractères spéciaux expression = expression.replace('\\', '\\\\').replace('(', '\\(').replace(')', '\\)') # Il faut un filtre par type d'objet de la base @@ -621,7 +621,7 @@ class CransLdap: """ Retourne une chaine pour recherche dans la base LDAP du style (champ=expr) en adaptant les valeurs de expr au champ. - Si neg = True, retourne le négatif : (!(champ=expr)) + Si neg = True, retourne le négatif : (!(champ=expr)) """ el = '' if champ in ['host', 'hostAlias']: @@ -638,16 +638,16 @@ class CransLdap: except: pass elif champ == 'paiement' and expr == 'ok': - # Paiement donnant droit à une connexion maintenant ? - # (il doit avoir payé pour l'année en cours ou pour - # l'année précédente si on est en septembre + # Paiement donnant droit à une connexion maintenant ? + # (il doit avoir payé pour l'année en cours ou pour + # l'année précédente si on est en septembre # - # Dans tous les cas, pour un adhérent, le paiement est - # considéré non ok s'il n'a pas fourni sa carte d'etudiant + # Dans tous les cas, pour un adhérent, le paiement est + # considéré non ok s'il n'a pas fourni sa carte d'etudiant # alors que l'on est desormais en periode de bloquage - # définifif (cf config.py). + # définifif (cf config.py). if time.localtime()[1] in (8,9): - # Pour septembre paiement année précédente ok + # Pour septembre paiement année précédente ok el = "(|(paiement=%d)(paiement=%d))" % (ann_scol, ann_scol-1) else: el = "(paiement=%s)" % ann_scol @@ -657,7 +657,7 @@ class CransLdap: elif champ[1:] == 'blacklist': el = '(blacklist=%s)' % expr else: - # Cas général + # Cas général el = '(%s=%s)' % (champ, expr) if neg: el = '(!%s)' % el return el @@ -669,9 +669,9 @@ class CransLdap: # Initialisation filtre = {} filtre_seul = {} - # filtre_seul[i] est True si la requête porte sur un champ + # filtre_seul[i] est True si la requête porte sur un champ # qui n'est pas dans toutes les machines, mais dans i - ignore_filtre =[] # liste des filtres à ignorer + ignore_filtre =[] # liste des filtres à ignorer for i in filtres: filtre[i] = '' filtre_seul[i] = False @@ -684,7 +684,7 @@ class CransLdap: try: champ, expr = cond.strip().split('=') if champ[-1] == '!': - # Négation pour ce champ + # Négation pour ce champ champ = champ[:-1] neg = True except: @@ -716,22 +716,22 @@ class CransLdap: raise ValueError(u'Champ de recherche inconnu (%s)' % champ) ## Recherche avec chacun des filtres - r = {} # contiendra les réponses par filtre + r = {} # contiendra les réponses par filtre - # On efface les bons filtres si la requête porte sur des - # champs spéciaux + # On efface les bons filtres si la requête porte sur des + # champs spéciaux ok = False for i in self.ldap_machines_classes: ok = ok or filtre_seul[i] if ok: - # Il y a au moins un champ spécial + # Il y a au moins un champ spécial for i in self.ldap_machines_classes: if not filtre_seul[i]: filtre[i] = '' for i in filtres: if i in ignore_filtre or filtre[i] == '': - # Filtre vide ou à ignorer + # Filtre vide ou à ignorer filtre[i] = '' r[i] = None else: @@ -739,7 +739,7 @@ class CransLdap: filtre[i] = '(&(objectClass=%s)%s)' % (i, filtre[i]) r[i] = self.conn.search_s(self.base_dn, self.scope[i], filtre[i]) - ## On a alors une liste de résultats + ## On a alors une liste de résultats ## r = {categorie1: [(result1), (result2), ...], ...} # Traitement @@ -755,10 +755,10 @@ class CransLdap: for res in r[i]: result[i].append(self.make(res, mode)) - # On croise maintenant les résultats machine et propriétaire + # On croise maintenant les résultats machine et propriétaire # Traitement des machines - mach_adh = [] # liste de dn d'adhérents et de clubs + mach_adh = [] # liste de dn d'adhérents et de clubs for res in r['machineFixe'] + r['machineWifi']: dn = ','.join(res[0].split(',')[-4:]) if dn[:3] != 'aid' and dn[:3] != 'cid': @@ -767,7 +767,7 @@ class CransLdap: mach_adh.append(dn) # Croisement - bons_dn = [] # liste des dn d'adhérents qui correspondent aux critères + bons_dn = [] # liste des dn d'adhérents qui correspondent aux critères for i in 'adherent', 'club': if r[i] == None: continue @@ -808,7 +808,7 @@ class CransLdap: for r in self.conn.search_s(self.base_dn, self.scope[i], filtre): result[i].append(self.make(r, mode)) - # Backward-compatibilité + # Backward-compatibilité result['machine'] = [] for i in self.ldap_machines_classes: result['machine'] += result[i] @@ -835,25 +835,25 @@ class CransLdap: __machines = () def all_machines(self, graphic=False): """ - Renvoie toutes les machines autorisées. + Renvoie toutes les machines autorisées. - Cela affiche des trucs et des bidules si graphic est à True. + Cela affiche des trucs et des bidules si graphic est à True. """ if graphic: from affich_tools import anim, cprint, OK if not self.__machines: - # Récolte des données + # Récolte des données if graphic: cprint(u'Lecture base LDAP', 'gras') # Machines de l'assoce self.__machines = AssociationCrans(self.conn).machines() - # Machines des adhérents et clubs de l'année en cours + # Machines des adhérents et clubs de l'année en cours base = self.search('paiement=ok') base = base['adherent'] + base['club'] if graphic: a = anim('\tTri des machines', len(base)) for adh in base: if graphic: a.cycle() - # Adhérent ayant payé l'année en cours + # Adhérent ayant payé l'année en cours if 'bloq' in adh.blacklist_actif(): - # Adhérent ignoré + # Adhérent ignoré continue self.__machines += adh.machines() if graphic: a.reinit() @@ -864,15 +864,15 @@ class CransLdap: ############################################################################# class BaseClasseCrans(CransLdap): - """ Méthodes de base des classes machines, et BaseProprietaire """ + """ Méthodes de base des classes machines, et BaseProprietaire """ def __eq__(self, autre): - """ Test d'égalité de deux instances de club/adhérent/machine, - retourne True s'il s'agit du même club/adhérent/machine, False sinon """ + """ Test d'égalité de deux instances de club/adhérent/machine, + retourne True s'il s'agit du même club/adhérent/machine, False sinon """ return self.__class__ == autre.__class__ and self.id() == autre.id() def id(self): - """ Retourne la valeur de l'attribu caractéristique de la classe (aid,mid,cid)""" + """ Retourne la valeur de l'attribu caractéristique de la classe (aid,mid,cid)""" try: s = self.dn.split(',')[0].split('=') if s[0] == self.idn: @@ -886,7 +886,7 @@ class BaseClasseCrans(CransLdap): def blacklist_actif(self): """ - Vérifie si l'instance courante est blacklistée. + Vérifie si l'instance courante est blacklistée. Retourne les sanctions en cours (liste). Retourne une liste vide si aucune sanction en cours. """ @@ -894,20 +894,20 @@ class BaseClasseCrans(CransLdap): def blacklist_all(self): """ - Vérifie si l'instance courante est blacklistée ou a été - blacklistée. Retourne les sanctions en cours sous la forme + Vérifie si l'instance courante est blacklistée ou a été + blacklistée. Retourne les sanctions en cours sous la forme d'un couple de deux dictionnaires (l'un pour les sanctions actives, l'autre pour les inactive), chacun ayant comme clef la sanction et comme valeur une liste de couple de dates (en secondes depuis epoch) correspondant aux - différentes périodes de sanctions. + différentes périodes de sanctions. ex: {'upload': [(1143336210, 1143509010), ...]} """ bl_liste = self._data.get('blacklist', []) if isinstance(self, Machine): - # Il faut aussi regarder la blackliste du propriétaire + # Il faut aussi regarder la blackliste du propriétaire p = self.proprietaire() bl_liste += p.blacklist() @@ -925,17 +925,17 @@ class BaseClasseCrans(CransLdap): def blacklist(self, new=None): """ - Blacklistage de la ou de toutes la machines du propriétaire + Blacklistage de la ou de toutes la machines du propriétaire * new est une liste de 4 termes : [debut_sanction, fin_sanction, sanction, commentaire] - * début et fin sont le nombre de secondes depuis epoch - * pour un début ou fin immédiate mettre now - * pour une fin indéterminée mettre '-' - Les données sont stockées dans la base sous la forme : + * début et fin sont le nombre de secondes depuis epoch + * pour un début ou fin immédiate mettre now + * pour une fin indéterminée mettre '-' + Les données sont stockées dans la base sous la forme : debut$fin$sanction$commentaire - Pour modifier une entrée donner un tuple de deux termes : - (index dans blacklist à modifier, nouvelle liste), - l'index étant celui dans la liste retournée par blacklist(). + Pour modifier une entrée donner un tuple de deux termes : + (index dans blacklist à modifier, nouvelle liste), + l'index étant celui dans la liste retournée par blacklist(). """ liste = self._data.setdefault('blacklist', [])[:] if new == None: @@ -960,7 +960,7 @@ class BaseClasseCrans(CransLdap): debut = new[0] = int(time.time()) else: try: debut = new[0] = int(new[0]) - except: raise ValueError(u'Date de début blacklist invalide') + except: raise ValueError(u'Date de début blacklist invalide') if new[1] == 'now': fin = new[1] = int(time.time()) @@ -971,11 +971,11 @@ class BaseClasseCrans(CransLdap): except: raise ValueError(u'Date de fin blacklist invalide') if debut == fin: - raise ValueError(u'Dates de début et de fin identiques') + raise ValueError(u'Dates de début et de fin identiques') elif fin != -1 and debut > fin: - raise ValueError(u'Date de fin avant date de début') + raise ValueError(u'Date de fin avant date de début') - # On dépasse la fin de sanction d'1min pour être sûr qu'elle est périmée. + # On dépasse la fin de sanction d'1min pour être sûr qu'elle est périmée. fin = fin + 60 new_c = '$'.join(map(str, new)) @@ -1000,7 +1000,7 @@ class BaseClasseCrans(CransLdap): return liste def restore(self): - """ Restore les données à l'état initial (ou pas) """ + """ Restore les données à l'état initial (ou pas) """ self._data = self._init_data.copy() self.modifs = {} @@ -1010,11 +1010,11 @@ class BaseClasseCrans(CransLdap): def info(self, new=None): """ - Pour ajouter une remarque new doit être la chaîne - représentant la remarque à ajouter - Pour modifier new doit être une liste de la forme: - [ index de la remarque à modifier, nouvelle remarque ] - l'index est celui obtenu dans la liste retournée par info() + Pour ajouter une remarque new doit être la chaîne + représentant la remarque à ajouter + Pour modifier new doit être une liste de la forme: + [ index de la remarque à modifier, nouvelle remarque ] + l'index est celui obtenu dans la liste retournée par info() """ if not self._data.has_key('info'): self._data['info'] = [] @@ -1032,12 +1032,12 @@ class BaseClasseCrans(CransLdap): # Modif remarque liste[index] = new elif type(new) == str: - # Remarque supplémentaire + # Remarque supplémentaire l, new = preattr(new) if not new: # On ajoute pas de remarque vide return liste - # Ajout à la liste + # Ajout à la liste liste = liste + [new] else: raise TypeError @@ -1048,25 +1048,25 @@ class BaseClasseCrans(CransLdap): def _save(self): """ Sauvegarde dans la base LDAP """ if not self.modifs: - # Rien à faire + # Rien à faire return [] if not self.dn: - # Enregistrement à placer en tête de base + # Enregistrement à placer en tête de base self.dn = self.base_dn # Construction de l'historique if not self._init_data: if self.idn=='fid': - modif = preattr('création')[1] + modif = preattr('création')[1] else: modif = 'inscription' else: - ### ON NE TOUCHE PAS A SELF.MODIFS, IL EST UTILISÉ PLUS LOIN !!!!!!! + ### ON NE TOUCHE PAS A SELF.MODIFS, IL EST UTILISÉ PLUS LOIN !!!!!!! # Dictionnaire local des modifs modif = {} - # Cas spécial + # Cas spécial if "solde" in self.modifs: diff = float(self._init_data.get('solde', [0])[0]) - float(self._data.get('solde', [0])[0]) if diff > 0: @@ -1074,8 +1074,8 @@ class BaseClasseCrans(CransLdap): else: modif['solde'] = "credit %s Euros" % str(-diff) - # Formate les entrées de l'historique de la forme champ (ancien -> nouveau) - # On suppose que le champ apparaît forcément dans l'enregistrement + # Formate les entrées de l'historique de la forme champ (ancien -> nouveau) + # On suppose que le champ apparaît forcément dans l'enregistrement for champ in ['chbre', 'nom', 'prenom', 'mail', 'tel', 'rewriteMailHeaders', 'contourneGreylist', 'puissance', 'canal', 'prise', 'responsable', @@ -1094,7 +1094,7 @@ class BaseClasseCrans(CransLdap): valeur_initiale, valeur_finale) - # Formate les entrées de l'historique de la forme champ+diff-diff + # Formate les entrées de l'historique de la forme champ+diff-diff for champ in ['droits', 'controle', 'paiement', 'carteEtudiant', 'mailAlias', 'hostAlias', 'exempt', 'nvram', 'portTCPin', 'portTCPout', 'portUDPin', 'portUDPout', @@ -1103,15 +1103,15 @@ class BaseClasseCrans(CransLdap): if champ == 'controle': # Ce n'est pas pareil que self._init_data.get('controle', ['']) # qui peut renvoyer une liste vide (petite erreur de choix - # dans la première implémentation de controle) + # dans la première implémentation de controle) ancien = (self._init_data.get('controle') or [''])[0] nouveau = (self._data.get('controle') or [''])[0] else: - # Là, on bosse directement sur les listes renvoyées par get + # Là, on bosse directement sur les listes renvoyées par get ancien = self._init_data.get(champ, []) nouveau = self._data.get(champ, []) - # On établit le diff + # On établit le diff diff = ''.join([ '+%s' % decode(d) for d in nouveau if d not in ancien ]) diff += ''.join([ '-%s' % decode(d) for d in ancien if d not in nouveau ]) modif[champ] = champ + diff @@ -1132,7 +1132,7 @@ class BaseClasseCrans(CransLdap): hist = "%s, %s" % ( time.strftime(date_format, timestamp), script_utilisateur ) if self.modifs.has_key('derniereConnexion'): - # On nettoie l'historique pour ne garder que la dernière modification + # On nettoie l'historique pour ne garder que la dernière modification # (celle en cours) self._data['historique'] = [x for x in self._data['historique'] @@ -1147,18 +1147,18 @@ class BaseClasseCrans(CransLdap): except: pass - # Suffit-t-il d'ajouter un item au dernier élément de l'historique ? + # Suffit-t-il d'ajouter un item au dernier élément de l'historique ? try: if modif: dern = self._data['historique'][-1].split(': ', 2) if dern[0] == hist: - # Même date et même cableur + # Même date et même cableur if modif not in dern[1].split(', '): - # Qqch de plus de modifié + # Qqch de plus de modifié self._data['historique'][-1] = self._data['historique'][-1] + ', ' +modif else: - # Nouvelle entrée - # NE PAS UTILISER L'OPERATEUR += ICI sinon self._init_data aussi modififié + # Nouvelle entrée + # NE PAS UTILISER L'OPERATEUR += ICI sinon self._init_data aussi modififié self._data['historique'] = self._data['historique'] + [ preattr("%s : %s" % ( hist, modif ))[1] ] except: # Nouvelle inscription @@ -1166,10 +1166,10 @@ class BaseClasseCrans(CransLdap): if not self._init_data: ### Nouvel enregistrement - # L'enregistrement peut échouer en cas de choix de dn concurrents + # L'enregistrement peut échouer en cas de choix de dn concurrents # (il n'y a pas de lock sur les dn) for i in range(0, 5): # 5 tentatives - # Génération du dn + # Génération du dn res = self.conn.search_s(self.base_dn, 2, self.filtre_idn) vidn = 1 vidns = [] @@ -1180,7 +1180,7 @@ class BaseClasseCrans(CransLdap): if r[:4] != '%s=' % self.idn: continue vidns.append(int(r[4:])) if self.idn=='fid': - # Pour une facture on prend un nouveau numéro + # Pour une facture on prend un nouveau numéro vidn = max([0]+vidns)+1 else: # Sinon on prend le premier libre @@ -1203,7 +1203,7 @@ class BaseClasseCrans(CransLdap): raise else: - ### Modification entrée + ### Modification entrée if not self._modifiable: raise RuntimeError(u'Objet non modifiable : %s' % str(self)) modlist = ldap.modlist.modifyModlist(self._init_data, self._data) @@ -1211,10 +1211,10 @@ class BaseClasseCrans(CransLdap): self.conn.modify_s(self.dn, modlist) except ldap.TYPE_OR_VALUE_EXISTS, c: champ = c.args[0]['info'].split(':')[0] - raise RuntimeError(u'Entrée en double dans le champ %s' % champ) + raise RuntimeError(u'Entrée en double dans le champ %s' % champ) - ### Génération de la liste de services à redémarrer - # Quasiement tout est traité dans les classes filles. + ### Génération de la liste de services à redémarrer + # Quasiement tout est traité dans les classes filles. if hasattr(self, "_blacklist_restart"): for n, t in self._blacklist_restart.items(): self.services_to_restart("blacklist_%s"%n, [], t) @@ -1232,16 +1232,16 @@ class BaseClasseCrans(CransLdap): # Sauvegarde t = str(self.__class__).split('.')[-1] fd = open('%s/%s/%s_%s' % (config.cimetiere, t, time.strftime('%Y-%m-%d-%H:%M'), self.nom()), 'wb') - self.conn = None # Fermeture des connexions à la base sinon cPickle ne marchera pas + self.conn = None # Fermeture des connexions à la base sinon cPickle ne marchera pas cPickle.dump(self, fd, 2) fd.close() index = u"%s, %s : %s %s # %s\n" % (time.strftime(date_format), script_utilisateur, t, self.Nom() , decode(comment)) - self.connect() # Reconnexion à la base + self.connect() # Reconnexion à la base # Destruction data = self.conn.search_s(dn, 2) - data.reverse() # Necessaire pour détruire d'abord les sous-dn + data.reverse() # Necessaire pour détruire d'abord les sous-dn for r in data: self.conn.delete_s(r[0]) @@ -1254,13 +1254,13 @@ class BaseClasseCrans(CransLdap): def _set(self, champ, val, comment=None): """ - Met à jour les données de _data et modifie modifs si besoin. + Met à jour les données de _data et modifie modifs si besoin. Si val=[] ou None, supprime le champ. """ - # On convertit éventuellement en utf-8 avant - # On n'utilise pas preattr pour éviter de tout casser... mais - # il faudra à l'avenir que _set reçoive toujours en unicode - # et éviter l'utilisation de preattr autant que possible + # On convertit éventuellement en utf-8 avant + # On n'utilise pas preattr pour éviter de tout casser... mais + # il faudra à l'avenir que _set reçoive toujours en unicode + # et éviter l'utilisation de preattr autant que possible def convert(x): if type(x) is unicode: return x.encode('utf-8') else: return x @@ -1275,27 +1275,27 @@ class BaseClasseCrans(CransLdap): if self.modifs.get(champ) == None or comment == None: self.modifs[champ] = comment else: - # Ici, self.modifs[champ] et comment devraient être tous deux - # des chaînes de caractères + # Ici, self.modifs[champ] et comment devraient être tous deux + # des chaînes de caractères self.modifs[champ] += ', ' + comment ############################################################################# class BaseProprietaire(BaseClasseCrans): - """ Méthodes de bases pour les classes Adherent et Club """ + """ Méthodes de bases pour les classes Adherent et Club """ def __init__(self, data=(), mode='', conn=None): """ - Si data est fourni initialise l'adhérent avec les valeurs données - Format de data : tuple comme retourné par une recherche dans la base ldap: - ( dn, { donnée }) - Si mode='w' : le propriétaire pourra être modifié - Attention, si mode ='w' mais si l'objet est déja locké il n'y a pas d'erreur - vérifier l'obtetion du lock grace à la valeur de _modifiable (si =w c'est bon) - Il est inutile de préciser le mode pour un nouveau proprietaire + Si data est fourni initialise l'adhérent avec les valeurs données + Format de data : tuple comme retourné par une recherche dans la base ldap: + ( dn, { donnée }) + Si mode='w' : le propriétaire pourra être modifié + Attention, si mode ='w' mais si l'objet est déja locké il n'y a pas d'erreur + vérifier l'obtetion du lock grace à la valeur de _modifiable (si =w c'est bon) + Il est inutile de préciser le mode pour un nouveau proprietaire - conn est une instance de la classe de connexion à la base LDAP + conn est une instance de la classe de connexion à la base LDAP """ self.conn = conn if not self.conn: @@ -1319,14 +1319,14 @@ class BaseProprietaire(BaseClasseCrans): self._init_data = data[1].copy() self._data = data[1] else: - # Propriétaire vide - self.dn = '' # Génération du reste au moment de l'écriture + # Propriétaire vide + self.dn = '' # Génération du reste au moment de l'écriture self._data = { 'objectClass': [ self.objectClass ] } self._init_data = {} self._modifiable = 'w' def chsh(self, new=None): - """ Retourne ou change le shell de l'adhérent """ + """ Retourne ou change le shell de l'adhérent """ if new == None: try: return decode(self._data.get('loginShell', [''])[0]) except: return '' @@ -1337,8 +1337,8 @@ class BaseProprietaire(BaseClasseCrans): def alias(self, new=None): """ - Création ou visualisation des alias mail - Même sytème d'argument que la méthode info. + Création ou visualisation des alias mail + Même sytème d'argument que la méthode info. """ if not self._data.has_key('mailAlias'): self._data['mailAlias'] = [] @@ -1366,11 +1366,11 @@ class BaseProprietaire(BaseClasseCrans): raise ValueError(u"Alias trop court.") for c in new[:]: if not c in (string.letters + string.digits + '-_.'): - raise ValueError(u"Alias : seuls les caractères alphanumériques, le -, le _ et le . sont autorisés." ) + raise ValueError(u"Alias : seuls les caractères alphanumériques, le -, le _ et le . sont autorisés." ) if new[0] not in string.letters: - raise ValueError(u"Le premier caractère de l'alias doit être alphabétique.") + raise ValueError(u"Le premier caractère de l'alias doit être alphabétique.") if mailexist(new): - raise ValueError(u"Alias existant ou correspondand à un compte.") + raise ValueError(u"Alias existant ou correspondand à un compte.") if index != -1: liste[index] = new @@ -1415,11 +1415,11 @@ class BaseProprietaire(BaseClasseCrans): new = validate(new) liste[index] = new elif type(new) == str: - # Alias supplémentaire + # Alias supplémentaire if not new: # On n'ajoute pas d'alias vide return liste - # Ajout à la liste + # Ajout à la liste new = validate(new) liste.append(new) else: @@ -1432,9 +1432,9 @@ class BaseProprietaire(BaseClasseCrans): return liste def machines(self): - """ Retourne les machines (instances) appartenant à la classe """ - # Le champ id n'est pas initialisé lorsque le proprio est en cours - # de création + """ Retourne les machines (instances) appartenant à la classe """ + # Le champ id n'est pas initialisé lorsque le proprio est en cours + # de création if self.id(): res = [] for r in self.conn.search_s('%s=%s,%s' % (self.idn, self.id(), self.base_dn), 1, Machine.filtre_idn): @@ -1444,7 +1444,7 @@ class BaseProprietaire(BaseClasseCrans): return [] def machines_fixes(self): - """ Retourne les machines fixes appartenant à l'instance """ + """ Retourne les machines fixes appartenant à l'instance """ if self.id(): res = [] for r in self.conn.search_s('%s=%s,%s' % (self.idn, self.id(), self.base_dn), 1, 'objectClass=machineFixe'): @@ -1454,7 +1454,7 @@ class BaseProprietaire(BaseClasseCrans): return [] def machines_wifi(self): - """ Retourne les machines wifi appartenant à l'instance """ + """ Retourne les machines wifi appartenant à l'instance """ if self.id(): res = [] for r in self.conn.search_s('%s=%s,%s' % (self.idn, self.id(), self.base_dn), 1, 'objectClass=machineWifi'): @@ -1464,9 +1464,9 @@ class BaseProprietaire(BaseClasseCrans): return [] def factures(self): - """ Retourne les factures (instances) appartenant à la classe """ - # Le champ id n'est pas initialisé lorsque le proprio est en cours - # de création + """ Retourne les factures (instances) appartenant à la classe """ + # Le champ id n'est pas initialisé lorsque le proprio est en cours + # de création if self.id(): res = [] for r in self.conn.search_s('%s=%s,%s' % (self.idn, self.id(), self.base_dn), 1, Facture.filtre_idn): @@ -1476,25 +1476,25 @@ class BaseProprietaire(BaseClasseCrans): return [] def solde(self, operation=None, comment=None): - """ Retourne ou modifie le solde d'un propriétaire - operation doit être un nombre positif ou négatif + """ Retourne ou modifie le solde d'un propriétaire + operation doit être un nombre positif ou négatif (string ou int ou float) - comment est un commentaire à rajouter dans l'historique + comment est un commentaire à rajouter dans l'historique """ solde = float(self._data.get('solde', [0])[0]) if operation == None: return solde - # On effectue une opération + # On effectue une opération try: new = solde + float(str(operation).replace(',', '.')) except ValueError: raise ValueError(u"Il faut donner un nombre en argument.") - # découvert accepté + # découvert accepté if new < config.impression.decouvert: - raise ValueError(u"Solde minimal atteint, opération non effectuée.") + raise ValueError(u"Solde minimal atteint, opération non effectuée.") self._set('solde', [str(new)], comment) return new @@ -1525,7 +1525,7 @@ class BaseProprietaire(BaseClasseCrans): actuel = actuel.replace(c, '') if actuel == '': - # La base LDAP n'accepte pas les chaînes vides. + # La base LDAP n'accepte pas les chaînes vides. # On supprime directement le champ controle if self._data.has_key('controle'): if self._data.pop('controle') != []: @@ -1542,7 +1542,7 @@ class BaseProprietaire(BaseClasseCrans): Retourne ou change la greylist pour le compte * True : contourne le GreyListing * False : ne contourne pas le greylisting - Au niveau de la base, on considère la présence ou l'absence + Au niveau de la base, on considère la présence ou l'absence d'un champ contourneGreylist=OK. """ @@ -1550,9 +1550,9 @@ class BaseProprietaire(BaseClasseCrans): # OK : contourne la greyliste # cf. man 5 access - # si l'adhérent n'a pas de compte, on lève une exception + # si l'adhérent n'a pas de compte, on lève une exception if not self.compte(): - raise NotImplementedError, u"L'adhérent n'a pas de compte" + raise NotImplementedError, u"L'adhérent n'a pas de compte" # tente de modifier la valeur if contourneGreylist == True: @@ -1560,9 +1560,9 @@ class BaseProprietaire(BaseClasseCrans): elif contourneGreylist == False: self._set('contourneGreylist', []) elif contourneGreylist != None: - raise ValueError, u"contourneGreylist prend un booléen comme argument" + raise ValueError, u"contourneGreylist prend un booléen comme argument" - # renvoie la valeur trouvée dans la base + # renvoie la valeur trouvée dans la base return bool(self._data.get('contourneGreylist', [])) def verifyPasswd(self, passwd): @@ -1571,49 +1571,49 @@ class BaseProprietaire(BaseClasseCrans): ou False si le mot de passe n'est pas bon. """ if not self.compte(): - raise NotImplementedError, u"L'adhérent n'a pas de compte" + raise NotImplementedError, u"L'adhérent n'a pas de compte" return ldap_passwd.checkpwd(passwd, self._data['userPassword'][0]) def changePasswd(self, passwd): """ - Modifie le mot de passe de l'adhérent + Modifie le mot de passe de l'adhérent """ if not self.compte(): - raise NotImplementedError, u"L'adhérent n'a pas de compte" + raise NotImplementedError, u"L'adhérent n'a pas de compte" self._set('userPassword', [ldap_passwd.mkpasswd(passwd)]) def forward(self, new = None): """ - Modifie ou retourne l'adresse de forward de l'adhérent + Modifie ou retourne l'adresse de forward de l'adhérent NB : il faut avoir un sudo sur /usr/scripts/gestion/mail_config.py sinon cette metode ne fonctionnera pas """ if not self.compte(): - raise NotImplementedError, u"L'adhérent n'a pas de compte" + raise NotImplementedError, u"L'adhérent n'a pas de compte" return config_mail.MailConfig(uid=self._data['uid'][0], forward = new)['forward'] def spam(self, new = None): """ - Modifie ou retourne le traitement des spams de l'adhérent - new doit être 'accepte', 'marque' ou 'supprime' + Modifie ou retourne le traitement des spams de l'adhérent + new doit être 'accepte', 'marque' ou 'supprime' NB : il faut avoir un sudo sur /usr/scripts/gestion/mail_config.py sinon cette metode ne fonctionnera pas """ if not self.compte(): - raise NotImplementedError, u"L'adhérent n'a pas de compte" + raise NotImplementedError, u"L'adhérent n'a pas de compte" return config_mail.MailConfig(uid=self._data['uid'][0], spam = new)['spam'] def home(self): - """ Retourne le home de l'adhérent """ + """ Retourne le home de l'adhérent """ if not self.compte(): - raise NotImplementedError, u"L'adhérent na pas de compte" + raise NotImplementedError, u"L'adhérent na pas de compte" return self._data['homeDirectory'][0] def uidNumber(self, new=None): - """ Retourne ou change l'uidNumber de l'adhérent """ + """ Retourne ou change l'uidNumber de l'adhérent """ if not self.compte(): - raise NotImplementedError, u"L'adhérent na pas de compte" + raise NotImplementedError, u"L'adhérent na pas de compte" if new == None: return self._data['uidNumber'][0] else: @@ -1623,9 +1623,9 @@ class BaseProprietaire(BaseClasseCrans): def paiement(self, action=None): """ - Action est un entier représentant une année - si positif ajoute l'année à la liste - si négatif le supprime + Action est un entier représentant une année + si positif ajoute l'année à la liste + si négatif le supprime """ return self._an('paiement', action) @@ -1653,11 +1653,11 @@ class BaseProprietaire(BaseClasseCrans): def save(self): """ - Enregistre l'adhérent ou le club courant dans la base LDAP - Ajoute le mail de bienvenue à la liste des services à redémarrer - Retourne une chaîne indiquant les opération effectuées. + Enregistre l'adhérent ou le club courant dans la base LDAP + Ajoute le mail de bienvenue à la liste des services à redémarrer + Retourne une chaîne indiquant les opération effectuées. """ - # Note: un peu trop de fonctions pour un club mais ce n'est pas génant + # Note: un peu trop de fonctions pour un club mais ce n'est pas génant ret = '' if self._init_data: @@ -1673,14 +1673,14 @@ class BaseProprietaire(BaseClasseCrans): # Message de sortie if nouveau: - ret += coul(u"%s inscrit avec succès." % self.Nom(), 'vert') + ret += coul(u"%s inscrit avec succès." % self.Nom(), 'vert') if self.idn !='cid': # Mail de bienvenue self.services_to_restart('mail_bienvenue', [self.mail().encode('iso-8859-15')]) else: - ret += coul(u"Modification %s effectuée avec succès." % self.Nom(), 'vert') + ret += coul(u"Modification %s effectuée avec succès." % self.Nom(), 'vert') # Changements administratifs test_carte = 'carteEtudiant' in self.modifs @@ -1699,7 +1699,7 @@ class BaseProprietaire(BaseClasseCrans): else: self.services_to_restart('rouge-dhcp') - # Vérification si changement de bât, ce qui obligerai un changement d'IP + # Vérification si changement de bât, ce qui obligerai un changement d'IP if 'adherentPayant' in self.modifs or 'chbre' in self.modifs and self.chbre() != '????': # Verif si machines avec bonnes ip err = 0 @@ -1722,11 +1722,11 @@ class BaseProprietaire(BaseClasseCrans): ret += coul(u'ERREUR : %s' % c.args[0], rouge) err = 1 - if err: ret += '\nEssayer de corriger les erreurs machines en éditant celles-ci.\n' + if err: ret += '\nEssayer de corriger les erreurs machines en éditant celles-ci.\n' - # Faut-il créer un compte sur vert ? + # Faut-il créer un compte sur vert ? if 'compte' in self.modifs: - ret += u'\nUn compte a été créé :\n login : %s\n' % self.compte() + ret += u'\nUn compte a été créé :\n login : %s\n' % self.compte() args = self._data['homeDirectory'][0] + ',' args+= self._data['uidNumber'][0] + ',' args+= self._data['uid'][0] @@ -1735,14 +1735,14 @@ class BaseProprietaire(BaseClasseCrans): if r == 'O' or r == 'o': chgpass(self.dn) else: - ret += coul(u' Il faudra penser à attribuer un mot de passe\n', 'jaune') + ret += coul(u' Il faudra penser à attribuer un mot de passe\n', 'jaune') # Modif des droits ? if 'droits' in self.modifs: self.services_to_restart('droits') self.services_to_restart('mail_modif', ['uid=%s' % self._data['uid'][0]]) - # Remise à zero + # Remise à zero self.modifs = {} return ret @@ -1750,9 +1750,9 @@ class BaseProprietaire(BaseClasseCrans): def _an(self, champ, action): """ Champ est un champ contenant une liste d'entiers - Action est un entier représentant une année - si positif ajoute l'année à la liste - si négatif le supprime + Action est un entier représentant une année + si positif ajoute l'année à la liste + si négatif le supprime """ if not self._data.has_key(champ): trans = [] @@ -1783,12 +1783,12 @@ class BaseProprietaire(BaseClasseCrans): ############################################################################# class Adherent(BaseProprietaire): - """ Classe de définition d'un adhérent """ + """ Classe de définition d'un adhérent """ objectClass = 'adherent' idn = 'aid' filtre_idn = '(objectClass=adherent)' - ### Méthodes Nom utilisée lors de l'affichage des propriétés + ### Méthodes Nom utilisée lors de l'affichage des propriétés ### (commune avec les classes AssociationCrans et Club) def Nom(self): """ Retourne prenom nom """ @@ -1808,11 +1808,11 @@ class Adherent(BaseProprietaire): new = new.capitalize() for c in new[:]: if c not in (string.letters + '- ' + preattr(accents)[1] ): - raise ValueError(u"Seuls les caractères alphabétiques, l'espace et le - sont permis dans %s." % champ.replace(u'e', u'é') ) + raise ValueError(u"Seuls les caractères alphabétiques, l'espace et le - sont permis dans %s." % champ.replace(u'e', u'é') ) if l<2: - raise ValueError(u"%s trop court." % champ.capitalize().replace(u'e', u'é')) + raise ValueError(u"%s trop court." % champ.capitalize().replace(u'e', u'é')) if new[0] not in string.letters: - raise ValueError(u"Le premier caractère du %s doit être une lettre" % champ.replace(u'e', u'é') ) + raise ValueError(u"Le premier caractère du %s doit être une lettre" % champ.replace(u'e', u'é') ) self._set(champ, [new]) if self._data.has_key('gecos'): @@ -1827,14 +1827,14 @@ class Adherent(BaseProprietaire): if new != 'inconnu': l, new = preattr(new) if not new.isdigit() or l<6 or l>15: - raise ValueError(u"Numéro de téléphone incorrect (il doit comporter uniquement des chiffres).") + raise ValueError(u"Numéro de téléphone incorrect (il doit comporter uniquement des chiffres).") self._set('tel', [new]) return new def chbre(self, new=None): """ - Défini la chambre d'un adhérent, EXT pour personne extérieure au campus + Défini la chambre d'un adhérent, EXT pour personne extérieure au campus """ if new == None: return decode(self._data.get('chbre', [''])[0]) @@ -1848,12 +1848,12 @@ class Adherent(BaseProprietaire): # Machine fixe ? # for m in self.machines(): # if not isinstance(m, MachineWifi): - # raise ValueError(u'Un adhérent en dehors du campus ne doit pas avoir de machine fixe.') + # raise ValueError(u'Un adhérent en dehors du campus ne doit pas avoir de machine fixe.') self._set('chbre', ['EXT']) return 'EXT' elif new.upper() == '????': - # On ne sait pas ou est l'adhérent + # On ne sait pas ou est l'adhérent self._set('chbre', ['????']) return '????' @@ -1880,19 +1880,19 @@ class Adherent(BaseProprietaire): raise ValueError(aide) else: - raise ValueError(u'Bâtiment inconnu.') + raise ValueError(u'Bâtiment inconnu.') - # La chambre est valide, est-elle déja occupée ? + # La chambre est valide, est-elle déja occupée ? test = self.exist('chbre=%s' % new) if test: search = test[0].split(',')[0] if search.split('=')[0] != 'aid': - raise ValueError(u'Chambre déjà occupée.') + raise ValueError(u'Chambre déjà occupée.') adh = self.search(search, self._modifiable)['adherent'] if len(adh) != 1: - raise ValueError(u'Chambre déjà occupée.') + raise ValueError(u'Chambre déjà occupée.') else: - raise ValueError(u'Chambre déjà occupée.', adh[0]) + raise ValueError(u'Chambre déjà occupée.', adh[0]) # Lock de la chambre self.lock('chbre', new) @@ -1902,8 +1902,8 @@ class Adherent(BaseProprietaire): return new def adresse(self, new=None): - """ Défini l'adresse pour les personnes extérieures (dont la chambre = EXT) - L'adresse est une liste de 4 éléments : numero, rue, code postal, ville + """ Défini l'adresse pour les personnes extérieures (dont la chambre = EXT) + L'adresse est une liste de 4 éléments : numero, rue, code postal, ville """ if new == None: if self.chbre() != 'EXT': @@ -1944,17 +1944,17 @@ class Adherent(BaseProprietaire): # Les tests : # exactement un @ - # 2 ou 3 caractères après le . final + # 2 ou 3 caractères après le . final # @ pas en premier ni juste avant le dernier . if new.count('@') != 1 \ or not ( l-b == 4 or l-b == 3) \ or a<1 or b-a<2: raise ValueError(u"Adresse mail incorrecte.") - # Pas de caractèrs bizarres + # Pas de caractèrs bizarres for l in new[:]: if not l in (string.lowercase + string.digits + '-_.@'): - raise ValueError(u"Caractère interdits dans l'adresse mail (%s)." % l) + raise ValueError(u"Caractère interdits dans l'adresse mail (%s)." % l) # Pour les vicieux if re.match('.*crans.(org|ens-cachan.fr)$', new): @@ -1964,7 +1964,7 @@ class Adherent(BaseProprietaire): self.supprimer_compte() self._set('mail', [new]) - # L'adresse est supposée valide avant l'envoi du mail de bienvenue + # L'adresse est supposée valide avant l'envoi du mail de bienvenue self.mail_invalide(False) # on renvoie le mail de bienvenue @@ -1973,12 +1973,12 @@ class Adherent(BaseProprietaire): return new def email(self, new=None): - """ Retourne l'adresse mail, ajoute le @crans.org si nécessaire """ - # pour la compatibilité entre les fonctions + """ Retourne l'adresse mail, ajoute le @crans.org si nécessaire """ + # pour la compatibilité entre les fonctions if new: self.mail(new) - # ajout du @crans.org si nécessaire + # ajout du @crans.org si nécessaire mail = self.mail() if not '@' in mail: mail += '@crans.org' @@ -1987,7 +1987,7 @@ class Adherent(BaseProprietaire): def mail_invalide(self, valeur=None): """ L'adresse est invalide. - Au niveau de la base, on considère l'absence ou la présence + Au niveau de la base, on considère l'absence ou la présence de mailInvalide=TRUE. """ @@ -1997,9 +1997,9 @@ class Adherent(BaseProprietaire): elif valeur == False: self._set('mailInvalide', []) elif valeur != None: - raise ValueError, u"mail_invalide prend un booléen comme argument" + raise ValueError, u"mail_invalide prend un booléen comme argument" - # renvoie la valeur trouvée dans la base + # renvoie la valeur trouvée dans la base return bool(self._data.get('mailInvalide', [])) def charteMA(self, valeur=None): @@ -2013,14 +2013,14 @@ class Adherent(BaseProprietaire): elif valeur == False: self._set('charteMA', []) elif valeur != None: - raise ValueError, u"charteMA prend un booléen comme argument" + raise ValueError, u"charteMA prend un booléen comme argument" - # renvoie la valeur trouvée dans la base + # renvoie la valeur trouvée dans la base return bool(self._data.get('charteMA', [])) def adherentPayant(self, valeur = None): """ - L'adhérent paie sa cotisation (a droit au WiFi, à un compte Crans, ... True par défaut + L'adhérent paie sa cotisation (a droit au WiFi, à un compte Crans, ... True par défaut """ if isinstance(valeur, bool): @@ -2030,14 +2030,14 @@ class Adherent(BaseProprietaire): set_to = ['FALSE'] self._set('adherentPayant', set_to) elif valeur is not None: - raise ValueError, u"adherentPayant prend un booléen comme argument" + raise ValueError, u"adherentPayant prend un booléen comme argument" # bool d'une liste non vide est true, on inverse donc (la base ne peut contenir que FALSE) return not bool(self._data.get('adherentPayant', [])) def supprimer_compte(self): """ - Supprime le compte sur zamok. Penser à définir l'adresse mail après. + Supprime le compte sur zamok. Penser à définir l'adresse mail après. """ self._set('mail', ['']) self._data['objectClass'] = ['adherent'] @@ -2053,7 +2053,7 @@ class Adherent(BaseProprietaire): def etudes(self, index_or_new): """ - Retourne l'un des 3 champs études (selon index_or_new si entier) + Retourne l'un des 3 champs études (selon index_or_new si entier) """ if type(index_or_new) == int: if self._data.has_key('etudes'): @@ -2067,9 +2067,9 @@ class Adherent(BaseProprietaire): if not self._data.has_key('etudes'): self._data['etudes'] = ['', '', ''] - # Pas grand chose à faire à part vérifier que ce sont bien des chaines + # Pas grand chose à faire à part vérifier que ce sont bien des chaines if len(index_or_new) != 3: - raise ValueError(u"Format études non valides.") + raise ValueError(u"Format études non valides.") new = ['', '', ''] for i in range(0, 3): @@ -2084,14 +2084,14 @@ class Adherent(BaseProprietaire): def carteEtudiant(self, action=None): """ - Action est un entier représentant une année - si positif ajoute l'année à la liste - si négatif le supprime + Action est un entier représentant une année + si positif ajoute l'année à la liste + si négatif le supprime """ return self._an('carteEtudiant', action) def checkPassword(self, password): - """Vérifie le mot de passe de l'adhérent""" + """Vérifie le mot de passe de l'adhérent""" anon = ldap.initialize(uri) try: r = anon.simple_bind(self.dn, password) @@ -2105,9 +2105,9 @@ class Adherent(BaseProprietaire): def compte(self, login=None, uidNumber=0, hash_pass='', shell=config.login_shell): """ - Création d'un compte à un adhérent - (la création se fait après l'écriture dans la base par la méthode save) - Si login = None, retourne le compte de l'adhérent + Création d'un compte à un adhérent + (la création se fait après l'écriture dans la base par la méthode save) + Si login = None, retourne le compte de l'adhérent """ if not login: if self.mail().find('@') != -1: @@ -2122,34 +2122,34 @@ class Adherent(BaseProprietaire): login = login.lower() if login and not self.adherentPayant(): - raise ValueError(u"L'adhérent ne paie pas de cotisation, il n'a pas droit à un compte.") + raise ValueError(u"L'adhérent ne paie pas de cotisation, il n'a pas droit à un compte.") if 'posixAccount' in self._data['objectClass']: if login != self._data['uid']: - # A déja un compte - raise ValueError(u"L'adhérent à déjà un compte. Login : %s" % self._data['uid'][0]) + # A déja un compte + raise ValueError(u"L'adhérent à déjà un compte. Login : %s" % self._data['uid'][0]) else: return login for c in login[:]: if not c in (string.letters + '-'): - raise ValueError(u"Seuls les caractères alphabétiques non accentués et le - sont autorisés dans le login.") + raise ValueError(u"Seuls les caractères alphabétiques non accentués et le - sont autorisés dans le login.") if l < 2: raise ValueError(u"Login trop court.") if l > config.maxlen_login: raise ValueError(u"Login trop long.") if login[0] == '-': - raise ValueError(u"- interdit en première position.") + raise ValueError(u"- interdit en première position.") if mailexist(login): - raise ValueError(u"Login existant ou correspondant à un alias mail.", 1) + raise ValueError(u"Login existant ou correspondant à un alias mail.", 1) home = '/home/' + login if os.path.exists(home): - raise ValueError(u'Création du compte impossible : home existant', 1) + raise ValueError(u'Création du compte impossible : home existant', 1) if os.path.exists("/var/mail/" + login): - raise ValueError(u'Création du compte impossible : /var/mail/%s existant' % login, 1) + raise ValueError(u'Création du compte impossible : /var/mail/%s existant' % login, 1) # Lock du mail self.lock('mail', login) @@ -2158,7 +2158,7 @@ class Adherent(BaseProprietaire): if not 'compte' in self.modifs: self.modifs.setdefault('compte', None) - # Création de l'alias canonique + # Création de l'alias canonique if self.nom() and self.prenom(): a = '%s.%s' % (self.prenom().capitalize(), self.nom().capitalize()) if self.canonical_alias(a) == None: @@ -2183,7 +2183,7 @@ class Adherent(BaseProprietaire): while len(pool_uid) > 0: uidNumber = pool_uid.pop() # On choisit une IP if not self.exist('(uidNumber=%s)'): - # On a trouvé un uid libre + # On a trouvé un uid libre pool_uid.append(uidNumber) break if not len(pool_uid): @@ -2192,7 +2192,7 @@ class Adherent(BaseProprietaire): try: self.lock('uidNumber', str(uidNumber)) except: - # Quelqu'un nous a piqué l'uid que l'on venait de choisir ! + # Quelqu'un nous a piqué l'uid que l'on venait de choisir ! return self.compte(login, uidNumber, hash_pass, shell) self._data['uidNumber']= [str(uidNumber)] @@ -2205,7 +2205,7 @@ class Adherent(BaseProprietaire): return decode(login) def canonical_alias(self, new=None): - """ Retourne ou défini l'alias canonique""" + """ Retourne ou défini l'alias canonique""" if new == None: try: return decode(self._data['canonicalAlias'][0]) except: return '' @@ -2224,9 +2224,9 @@ class Adherent(BaseProprietaire): return a def droits(self, droits=None): - """ droits est la liste des droits à donner à l'utilisateur """ - """ ATTENTION : il y a une autre fonction droits_lights derrière celle-çi, - pensez à faire vos modifs sur les deux """ + """ droits est la liste des droits à donner à l'utilisateur """ + """ ATTENTION : il y a une autre fonction droits_lights derrière celle-çi, + pensez à faire vos modifs sur les deux """ if droits != None and 'cransAccount' not in self._data.get('objectClass', []): raise EnvironmentError(u'Il faut avoir un compte pour avoir des droits.') @@ -2236,7 +2236,7 @@ class Adherent(BaseProprietaire): from user_tests import isadm if not isadm(): - raise EnvironmentError(u'Il faut être administrateur pour effectuer cette opération.') + raise EnvironmentError(u'Il faut être administrateur pour effectuer cette opération.') if type(droits) != list: raise TypeError(u'Une liste est attendue') @@ -2314,16 +2314,16 @@ class Adherent(BaseProprietaire): def rewriteMailHeaders(self, rewrite=None): """ - Réécriture des entêtes mail avec l'alias canonique - * True : réécrit les en-têtes - * False : ne réécrit pas les en-têtes - Au niveau de la base, on considère l'absence ou la présence + Réécriture des entêtes mail avec l'alias canonique + * True : réécrit les en-têtes + * False : ne réécrit pas les en-têtes + Au niveau de la base, on considère l'absence ou la présence de rewriteMailHeaders=TRUE. """ - # si l'adhérent n'a pas de compte, on lève une exception + # si l'adhérent n'a pas de compte, on lève une exception if not self.compte(): - raise NotImplementedError, u"L'adhérent n'a pas de compte" + raise NotImplementedError, u"L'adhérent n'a pas de compte" # tente de modifier la valeur if rewrite == True: @@ -2331,26 +2331,26 @@ class Adherent(BaseProprietaire): elif rewrite == False: self._set('rewriteMailHeaders', []) elif rewrite != None: - raise ValueError, u"rewriteMailHeaders prend un booléen comme argument" + raise ValueError, u"rewriteMailHeaders prend un booléen comme argument" - # renvoie la valeur trouvée dans la base + # renvoie la valeur trouvée dans la base return bool(self._data.get('rewriteMailHeaders', [])) def derniereConnexion(self, new=False): """ - Date de dernière connexion. Le format est le nombre de secondes - écoulées depuis Epoch. Si new est donné, met à jour la valeur si - elle est plus récente. + Date de dernière connexion. Le format est le nombre de secondes + écoulées depuis Epoch. Si new est donné, met à jour la valeur si + elle est plus récente. """ - # si l'adhérent n'a pas de compte, on lève une exception + # si l'adhérent n'a pas de compte, on lève une exception if not self.compte(): - raise NotImplementedError, u"L'adhérent n'a pas de compte" + raise NotImplementedError, u"L'adhérent n'a pas de compte" current = int(self._data.get('derniereConnexion', ['0'])[0]) if new: - # lève une exception si l'argument n'est pas valide + # lève une exception si l'argument n'est pas valide new = int(new) if new > current: self._set('derniereConnexion', [str(new)]) @@ -2360,13 +2360,13 @@ class Adherent(BaseProprietaire): def dateInscription(self): """Renvoie la date d'inscription.""" - # En théorie, c'est la date de la première entrée dans l'historique + # En théorie, c'est la date de la première entrée dans l'historique if self.historique(): h = self.historique()[0] h = h[:h.find(",")] return time.mktime(time.strptime(h, date_format)) else: - # Lors de l'inscription d'un nouvel adhérent, celui-ci n'a pas + # Lors de l'inscription d'un nouvel adhérent, celui-ci n'a pas # encore d'historique. On retourne alors la date en cours. return time.time() @@ -2375,13 +2375,13 @@ class Adherent(BaseProprietaire): class Club(BaseProprietaire): - """ Classe de définition d'un club """ + """ Classe de définition d'un club """ idn = 'cid' filtre_idn = '(objectClass=club)' objectClass = 'club' def Nom(self, new=None): - """ Défini ou retourne le nom du club """ + """ Défini ou retourne le nom du club """ if new == None: return decode(self._data.get('nom', [''])[0]) @@ -2398,14 +2398,14 @@ class Club(BaseProprietaire): return u'N/A' def nom(self): - """ Retourne le nom du club, utilisé lors de la destruction """ + """ Retourne le nom du club, utilisé lors de la destruction """ return strip_accents(self.Nom()) def carteEtudiant(self, pd=None): return [ ann_scol ] def responsable(self, adher=None): - """ Responsable du club, adher doit être une instance de la classe adhérent """ + """ Responsable du club, adher doit être une instance de la classe adhérent """ if adher == None: aid = decode(self._data.get('responsable', [''])[0]) if aid: @@ -2416,7 +2416,7 @@ class Club(BaseProprietaire): raise ValueError if not adher.id(): - raise AttributeError(u'Adhérent invalide') + raise AttributeError(u'Adhérent invalide') self._set('responsable', [adher.id()]) return adher @@ -2446,8 +2446,8 @@ class Club(BaseProprietaire): return liste def chbre(self, new=None): - """ Défini le local du club - new doit être une des clefs de l'annuaire locaux_clubs""" + """ Défini le local du club + new doit être une des clefs de l'annuaire locaux_clubs""" if new == None: return decode(self._data.get('chbre', [''])[0]) @@ -2459,17 +2459,17 @@ class Club(BaseProprietaire): return new def local(self): - """ Retourne le local à partir de la chambre enregistrée et + """ Retourne le local à partir de la chambre enregistrée et de la conversion avec l'annuaire locaux_clubs """ annu = annuaires.locaux_clubs() return decode(annu.get(self.chbre(), '')) def compte(self, login=None): - """ Créé un compte au club sur vert""" + """ Créé un compte au club sur vert""" if login == None: return self._data.get('uid', [''])[0] - # Génération du login : club- + # Génération du login : club- login = login.lower() if not login.startswith('club-'): login = 'club-' + login @@ -2479,21 +2479,21 @@ class Club(BaseProprietaire): if 'posixAccount' in self._data['objectClass']: if login != self._data['uid']: - # A déja un compte - raise ValueError(u"Le club à déjà un compte. Login : %s" % self._data['uid'][0]) + # A déja un compte + raise ValueError(u"Le club à déjà un compte. Login : %s" % self._data['uid'][0]) else: return login if mailexist(login) and not os.system('/usr/sbin/list_lists | grep -qi %s' % login): - # la 2ème vérif est pour vérifier que ce n'est pas la ML du club - raise ValueError(u"Login existant ou correspondant à un alias mail.", 1) + # la 2ème vérif est pour vérifier que ce n'est pas la ML du club + raise ValueError(u"Login existant ou correspondant à un alias mail.", 1) home = '/home/' + login.replace('-', '/', 1) if os.path.exists(home): - raise ValueError(u'Création du compte impossible : home existant', 1) + raise ValueError(u'Création du compte impossible : home existant', 1) if os.path.exists("/var/mail/"+login): - raise ValueError(u'Création du compte impossible : /var/mail/%s existant'%login, 1) + raise ValueError(u'Création du compte impossible : /var/mail/%s existant'%login, 1) # Lock du mail self.lock('mail', login) @@ -2506,14 +2506,14 @@ class Club(BaseProprietaire): self._data['cn'] = [ preattr(self.Nom())[1] ] self._data['loginShell' ] = [ config.club_login_shell ] - # Détermination de l'uid + # Détermination de l'uid uidNumber = 1000 while self.exist('(uidNumber=%s)' % uidNumber): uidNumber += 1 try: self.lock('uidNumber', str(uidNumber)) except: - # Quelqu'un nous a piqué l'uid que l'on venait de choisir ! + # Quelqu'un nous a piqué l'uid que l'on venait de choisir ! return self.compte(login) self._data['uidNumber']= [ str(uidNumber) ] @@ -2527,7 +2527,7 @@ class Club(BaseProprietaire): return self.responsable().email() class Machine(BaseClasseCrans): - """ Classe de définition d'une machine """ + """ Classe de définition d'une machine """ idn = 'mid' filtre_idn = '(|(objectClass=machineFixe)(objectClass=machineWifi)' filtre_idn += '(objectClass=machineCrans)(objectClass=borneWifi))' @@ -2535,20 +2535,20 @@ class Machine(BaseClasseCrans): def __init__(self, parent_or_tuple, mode='', conn=None): """ parent_or_tuple est : - * soit une instance d'une classe pouvant posséder une machine + * soit une instance d'une classe pouvant posséder une machine (Adherent, Club ou AssociationCrans), la nouvelle machine lui - sera alors associée. - * soit directement le tuple définissant une machine (tel que - retourné par les fonctions de recherche ldap) + sera alors associée. + * soit directement le tuple définissant une machine (tel que + retourné par les fonctions de recherche ldap) - Pour l'édition d'une machine, mode devra être égal à 'w' - Attention, si mode='w' mais si l'objet est déja locké il n'y a - pas d'erreur, vérifier l'obtention du lock grâce à la valeur de + Pour l'édition d'une machine, mode devra être égal à 'w' + Attention, si mode='w' mais si l'objet est déja locké il n'y a + pas d'erreur, vérifier l'obtention du lock grâce à la valeur de _modifiable (si ='w' c'est bon) - conn est une instance de la classe de connexion à la base LDAP + conn est une instance de la classe de connexion à la base LDAP """ - # Définition de l'objectClass LDAP à partir du nom de la classe Python + # Définition de l'objectClass LDAP à partir du nom de la classe Python self.objectClass = str(self.__class__).split('.')[-1] self.objectClass = self.objectClass[0].lower() + self.objectClass[1:] @@ -2560,7 +2560,7 @@ class Machine(BaseClasseCrans): self.modifs = {} t = parent_or_tuple.__class__ if t == tuple: - # Initialisation avec données fournies + # Initialisation avec données fournies self.dn = parent_or_tuple[0] if mode == 'w': try: @@ -2574,7 +2574,7 @@ class Machine(BaseClasseCrans): self._init_data = parent_or_tuple[1].copy() self._data = parent_or_tuple[1] - # Propriéraire inconnu mais ce n'est pas grave + # Propriéraire inconnu mais ce n'est pas grave self.__proprietaire = None elif t in [Adherent, Club, AssociationCrans] and mode != 'w': @@ -2587,10 +2587,10 @@ class Machine(BaseClasseCrans): chbre = self.__proprietaire.chbre() # if chbre == 'EXT' and mode == 'fixe': - # raise ValueError(u'Il faut une chambre pour pouvoir posséder une machine fixe') + # raise ValueError(u'Il faut une chambre pour pouvoir posséder une machine fixe') if chbre == '????': - raise ValueError(u'ERREUR: la chambre du propriétaire est inconnue') + raise ValueError(u'ERREUR: la chambre du propriétaire est inconnue') else: raise TypeError(u'Arguments invalides') @@ -2601,12 +2601,12 @@ class Machine(BaseClasseCrans): def mac(self, mac=None, multi_ok=0): """ - Défini ou retourne l'adresse mac de la machine + Défini ou retourne l'adresse mac de la machine Adresse valide si: - 12 caractères hexa avec - ou : comme séparateurs + 12 caractères hexa avec - ou : comme séparateurs non nulle Stoque l'adresse sous la forme xx:xx:xx:xx:xx:xx - Si multi_ok = 1 permet d'avoir plusieur fois la même mac sur le réseau + Si multi_ok = 1 permet d'avoir plusieur fois la même mac sur le réseau """ if mac == None: @@ -2614,13 +2614,13 @@ class Machine(BaseClasseCrans): mac = format_mac(mac) - # La mac serait-elle déjà connue ? + # La mac serait-elle déjà connue ? if not multi_ok and self.exist('macAddress=%s' % mac): - raise ValueError(u'Mac déja utilisée sur le réseau.', 1) + raise ValueError(u'Mac déja utilisée sur le réseau.', 1) - # La MAC serait-elle une MAC à la con ? + # La MAC serait-elle une MAC à la con ? if mac == "00:04:4b:80:80:03": - raise ValueError(u"Il s'agit de l'unique adresse MAC achetée par nVidia pour ses cartes réseau. Il faut changer cette adresse.", 2) + raise ValueError(u"Il s'agit de l'unique adresse MAC achetée par nVidia pour ses cartes réseau. Il faut changer cette adresse.", 2) elif mac[0:11] == "44:45:53:54": raise ValueError(u"Il s'agit de l'adresse MAC d'une interface PPP.", 2) @@ -2634,10 +2634,10 @@ class Machine(BaseClasseCrans): break except IOError: # Le fichier existe pas, on sors - raise RuntimeError(u"Fichier de fabriquants de MAC non trouvé !") + raise RuntimeError(u"Fichier de fabriquants de MAC non trouvé !") if not multi_ok and not vendor: - raise ValueError(u"Le constructeur correspondant à cette adresse MAC ne peut être trouvé.\nL'adresse MAC correspond peut-être à un pont réseau, désactivez ce pont réseau.\nContactez nounou si la MAC est bien celle d'une carte.", 3) + raise ValueError(u"Le constructeur correspondant à cette adresse MAC ne peut être trouvé.\nL'adresse MAC correspond peut-être à un pont réseau, désactivez ce pont réseau.\nContactez nounou si la MAC est bien celle d'une carte.", 3) # Lock de la mac self.lock('macAddress', mac) @@ -2646,7 +2646,7 @@ class Machine(BaseClasseCrans): return mac def __host_alias(self, champ, new): - """ Vérification de la validité d'un nom de machine """ + """ Vérification de la validité d'un nom de machine """ # Supression des accents new = strip_accents(unicode(new, 'iso-8859-15')) @@ -2661,27 +2661,27 @@ class Machine(BaseClasseCrans): new = new.split('.', 1)[0] for c in new[:]: if not c in (string.letters + string.digits + '-'): - raise ValueError(u"Seuls les caractères alphabétiques minuscules et les - sont autorisés pour %s" % champ) + raise ValueError(u"Seuls les caractères alphabétiques minuscules et les - sont autorisés pour %s" % champ) if l>17: raise ValueError(u"%s trop long." % champ.capitalize()) if not new[0].isalpha(): - raise ValueError(u"Le premier caractère du champ %s doit être alphabétique" % champ) + raise ValueError(u"Le premier caractère du champ %s doit être alphabétique" % champ) if new.endswith('-'): - raise ValueError(u"Le dernier caractère du champ %s ne peut être un tiret" % champ) + raise ValueError(u"Le dernier caractère du champ %s ne peut être un tiret" % champ) # Ajout du domaine si necessaire if new.find('.') == -1: try: new += '.' + config.domains[self.objectClass] except: - raise RuntimeError(u"%s : domaine non trouvé pour %s" % (champ.capitalize(), self.__class__)) + raise RuntimeError(u"%s : domaine non trouvé pour %s" % (champ.capitalize(), self.__class__)) - # Pas déja pris ? + # Pas déja pris ? if self.exist('(|(host=%s)(hostAlias=%s))' % (new, new)): - raise ValueError(u"%s : nom déjà pris" % champ.capitalize()) + raise ValueError(u"%s : nom déjà pris" % champ.capitalize()) # Lock host self.lock('host', new) @@ -2690,9 +2690,9 @@ class Machine(BaseClasseCrans): def nom(self, new=None): """ - Défini ou retourne le nom de machine. - Un nom de machine valide ne comporte que des caractères - alphabétiques minuscules et le - + Défini ou retourne le nom de machine. + Un nom de machine valide ne comporte que des caractères + alphabétiques minuscules et le - """ if new == None: return decode(self._data.get('host', [''])[0]) @@ -2702,8 +2702,8 @@ class Machine(BaseClasseCrans): return new.split('.')[0] def prise(self, new=None): - """ Retourne ou défini la prise associée à la machine - La définition n'est possible que si la machine est + """ Retourne ou défini la prise associée à la machine + La définition n'est possible que si la machine est une machine de l'assoce. Si la prise est inconne retourne N/A """ @@ -2733,8 +2733,8 @@ class Machine(BaseClasseCrans): def alias(self, new=None): """ - Création ou visualisation des alias d'une machine. - Même sytème d'argument que la méthode info. + Création ou visualisation des alias d'une machine. + Même sytème d'argument que la méthode info. """ if not self._data.has_key('hostAlias'): self._data['hostAlias'] = [] @@ -2766,10 +2766,10 @@ class Machine(BaseClasseCrans): def ip(self, ip=None): """ - Défini ou retourne l'IP de la machine. - Les IP sont stoquées sous forme xxx.xxx.xxx.xxx et doivent être fournies ainsi. - Si l'IP n'est pas définie retourne . - Si ip= attribue la permière IP libre du sous-réseau. + Défini ou retourne l'IP de la machine. + Les IP sont stoquées sous forme xxx.xxx.xxx.xxx et doivent être fournies ainsi. + Si l'IP n'est pas définie retourne . + Si ip= attribue la permière IP libre du sous-réseau. """ if ip == None: if self._data.has_key('ipHostNumber'): @@ -2781,7 +2781,7 @@ class Machine(BaseClasseCrans): l, ip = preattr(ip) - # Dans quel réseau la machine doit-elle être placée ? + # Dans quel réseau la machine doit-elle être placée ? if isinstance(self, MachineWifi): net = config.NETs['wifi-adh'] pool_ip = lister_ip_dispo('wifi-adh') @@ -2802,7 +2802,7 @@ class Machine(BaseClasseCrans): net = config.NETs['adherents'] pool_ip = lister_ip_dispo('adherents') except: - raise RuntimeError(u'Impossible de trouver le réseau où placer la machine.') + raise RuntimeError(u'Impossible de trouver le réseau où placer la machine.') else: net = config.NETs["gratuit"] pool_ip = lister_ip_dispo("gratuit") @@ -2813,7 +2813,7 @@ class Machine(BaseClasseCrans): while len(pool_ip) > 0: ip = pool_ip.pop() # On choisit une IP if not self.exist('ipHostNumber=%s' % ip): - # On a trouvé la première ip libre + # On a trouvé la première ip libre pool_ip.append(ip) break @@ -2821,16 +2821,16 @@ class Machine(BaseClasseCrans): raise RuntimeError(u"Plus d'IP libres dans %s." % string.join(net, ' et ')) else: - # L'ip est elle dans le bon sous-réseau ? + # L'ip est elle dans le bon sous-réseau ? # (accessoirement teste si l'IP est valide et ne correspond pas - # à l'adresse de broadcast ou de réseau) + # à l'adresse de broadcast ou de réseau) if not iptools.AddrInNet(ip, net): - raise ValueError(u'IP invalide ou en dehors du sous-réseau alloué.', 1) + raise ValueError(u'IP invalide ou en dehors du sous-réseau alloué.', 1) # Reformatage ip = iptools.DecToQuad(iptools.QuadToDec(ip)) - # L'ip est-elle déja allouée ? + # L'ip est-elle déja allouée ? if self.exist('ipHostNumber=%s' % ip): - raise ValueError(u'IP déjà prise.') + raise ValueError(u'IP déjà prise.') # Lock ip self.lock('ipHostNumber', ip) @@ -2840,13 +2840,13 @@ class Machine(BaseClasseCrans): def exempt(self, new=None): """ - Liste des réseaux vers lesquels on ne compte pas l'upload - Cette liste est transférée dans la base postgres de komaz - Pour ajouter un réseau new doit être la chaîne - représentant le réseau à ajouter - Pour modifier new doit être une liste de la forme : - [ index du nouveau réseau , nouveau réseau ] - l'index est celui obtenu dans la liste retournée par exempt() + Liste des réseaux vers lesquels on ne compte pas l'upload + Cette liste est transférée dans la base postgres de komaz + Pour ajouter un réseau new doit être la chaîne + représentant le réseau à ajouter + Pour modifier new doit être une liste de la forme : + [ index du nouveau réseau , nouveau réseau ] + l'index est celui obtenu dans la liste retournée par exempt() """ if not self._data.has_key('exempt'): self._data['exempt'] = [] @@ -2858,18 +2858,18 @@ class Machine(BaseClasseCrans): index = new[0] l, new = preattr(new[1]) if not new: - # Supression réseau + # Supression réseau liste.pop(index) else: # Modif remarque liste[index] = new elif type(new) == str: - # Réseau supplémentaire + # Réseau supplémentaire l, new = preattr(new) if not new: - # On ajoute pas de réseau vide + # On ajoute pas de réseau vide return liste - # Ajout à la liste + # Ajout à la liste liste = liste + [new] else: raise TypeError @@ -2879,7 +2879,7 @@ class Machine(BaseClasseCrans): def proprietaire(self): """ - retroune le propriétaire de la machine (classe Adherent, Club ou AssociationCrans) + retroune le propriétaire de la machine (classe Adherent, Club ou AssociationCrans) """ if not self.__proprietaire: res = self.conn.search_s(','.join(self.dn.split(',')[1:]), 0) @@ -2895,15 +2895,15 @@ class Machine(BaseClasseCrans): def save(self): """ Enregistre la machine courante dans la base LDAP - Retourne une chaîne indiquant les opération effectuées. + Retourne une chaîne indiquant les opération effectuées. """ from user_tests import isadm if self.proprietaire().__class__ == AssociationCrans and not (isadm() or user_tests.getuser() == 'www-data'): - raise EnvironmentError(u'Il faut être administrateur pour effectuer cette opération.') + raise EnvironmentError(u'Il faut être administrateur pour effectuer cette opération.') ret = '' - # Besoin de redémarrer les firewalls ? + # Besoin de redémarrer les firewalls ? if 'ipHostNumber' in self.modifs or 'macAddress' in self.modifs: reconf_ip = self._init_data.get('ipHostNumber', []) reconf_ip += self._data.get('ipHostNumber', []) @@ -2916,8 +2916,8 @@ class Machine(BaseClasseCrans): # Enregistrement self._save() - # Si le proprio ne paie pas de cotisation, il n'y a pas de services à - # redémarrer (config automatique pour le vlan inscriptions) + # Si le proprio ne paie pas de cotisation, il n'y a pas de services à + # redémarrer (config automatique pour le vlan inscriptions) if not isinstance(self.proprietaire(), Adherent) or self.proprietaire().adherentPayant(): # Clef IPsec @@ -2951,13 +2951,13 @@ class Machine(BaseClasseCrans): and ('ipHostNumber' in self.modifs or 'host' in self.modifs or 'macAddress' in self.modifs): self.services_to_restart('conf_wifi_ng') - # Regénération blackliste nécessaire ? + # Regénération blackliste nécessaire ? bl = self.blacklist_actif() if bl and ('ipHostNumber' in self.modifs or 'host' in self.modifs): for s in bl: self.services_to_restart(s, [self.ip()]) - # Regénération de l'autostatus et mail de changmement ? + # Regénération de l'autostatus et mail de changmement ? if self.proprietaire().__class__ == AssociationCrans: self.services_to_restart('autostatus') self.services_to_restart('mail_modif', ['ip=%s' % self.ip()]) @@ -2973,11 +2973,11 @@ class Machine(BaseClasseCrans): if 'ipHostNumber' in self.modifs: self.services_to_restart('surveillance_machines') - # Remise à zéro + # Remise à zéro self.modifs = {} # Message de sortie - ret += coul(u"Machine %s enregistrée avec succès." % self._data['host'][0], 'vert') + ret += coul(u"Machine %s enregistrée avec succès." % self._data['host'][0], 'vert') return ret @@ -2985,14 +2985,14 @@ class Machine(BaseClasseCrans): """ Destruction de la machines """ from user_tests import isadm if self.proprietaire().__class__ == AssociationCrans and not isadm(): - raise EnvironmentError(u'Il faut être administrateur pour effectuer cette opération.') + raise EnvironmentError(u'Il faut être administrateur pour effectuer cette opération.') self.proprio = self.__proprietaire.Nom() # On met dans un coin le nom du proprio - self.__proprietaire = None # On oublie le propriétaire + self.__proprietaire = None # On oublie le propriétaire self._delete(self.dn, comment) - # Services à redémarrer + # Services à redémarrer if isinstance(self, MachineWifi): self.services_to_restart('conf_wifi_ng') self.services_to_restart('ragnarok-dhcp') @@ -3008,34 +3008,34 @@ class Machine(BaseClasseCrans): self.services_to_restart('classify', [self.ip()]) def portTCPin(self, ports=None): - """ Ports TCP ouverts depuis l'extérieur pour la machine """ + """ Ports TCP ouverts depuis l'extérieur pour la machine """ return self.__port(ports, 'portTCPin') def portTCPout(self, ports=None): - """ Ports TCP ouverts vers l'extérieur pour la machine """ + """ Ports TCP ouverts vers l'extérieur pour la machine """ return self.__port(ports, 'portTCPout') def portUDPin(self, ports=None): - """ Ports UDP ouverts vers l'extérieur pour la machine """ + """ Ports UDP ouverts vers l'extérieur pour la machine """ return self.__port(ports, 'portUDPin') def portUDPout(self, ports=None): - """ Ports UDP ouverts vers l'extérieur pour la machine """ + """ Ports UDP ouverts vers l'extérieur pour la machine """ return self.__port(ports, 'portUDPout') def __port(self, ports, champ): if ports == None: return self._data.get(champ, []) - # Les ports doivent être de la forme [port][:[port]]. On met - # la spécification sous une forme qui donne un tri intéressant + # Les ports doivent être de la forme [port][:[port]]. On met + # la spécification sous une forme qui donne un tri intéressant def parse(x): try: liste = x.split(':') assert(len(liste) == 1 or len(liste) == 2) return map(lambda x: x and int(x) or '', liste) except: - raise ValueError(u'Spécification de ports incorrecte : %s' % x) + raise ValueError(u'Spécification de ports incorrecte : %s' % x) ports = map(parse, ports) ports.sort() @@ -3046,14 +3046,14 @@ class Machine(BaseClasseCrans): return hash(self.nom()) class MachineFixe(Machine): - """ Classe de définition d'une machine fixe """ + """ Classe de définition d'une machine fixe """ def __init__(self, parent_or_tuple, typ='fixe', conn=None): Machine.__init__(self, parent_or_tuple, typ, conn) class MachineWifi(Machine): - """ Classe de définition d'une machine wifi """ + """ Classe de définition d'une machine wifi """ def __init__(self, parent_or_tuple, typ='wifi', conn=None): Machine.__init__(self, parent_or_tuple, typ, conn) @@ -3063,14 +3063,14 @@ class MachineWifi(Machine): def ipsec(self, clef=None): """ - Affichage (clef=None), génération (clef=True) ou définition de la clef IPsec - de la machine. Si clef différent de True et None: prend la clef fournie. + Affichage (clef=None), génération (clef=True) ou définition de la clef IPsec + de la machine. Si clef différent de True et None: prend la clef fournie. """ if clef == None: return decode(self._data.get('ipsec', [''])[0]) if clef == True: - # Génération + # Génération clef = '' for i in range(22): clef += random.choice(filter(lambda x: x != 'l' and x != 'o', string.lowercase) + @@ -3082,7 +3082,7 @@ class MachineWifi(Machine): class MachineCrans(Machine): - """ Classe de définition d'une machine du Crans """ + """ Classe de définition d'une machine du Crans """ def __init__(self, parent_or_tuple, typ='fixe', conn=None): Machine.__init__(self, parent_or_tuple, typ, conn) @@ -3095,16 +3095,16 @@ class MachineCrans(Machine): try: new = int(new) except: - raise ValueError(u'Le nombre de prises doit être un entier') + raise ValueError(u'Le nombre de prises doit être un entier') if new not in [26, 50]: - raise ValueError(u'Le nombre de prises doit être 26 ou 50') + raise ValueError(u'Le nombre de prises doit être 26 ou 50') self._set('nombrePrises', [str(new)]) return new class BorneWifi(Machine): - """ Classe de définition d'une borne wifi """ + """ Classe de définition d'une borne wifi """ def __init__(self, parent_or_tuple, typ='borne', conn=None): Machine.__init__(self, parent_or_tuple, typ, conn) @@ -3121,9 +3121,9 @@ class BorneWifi(Machine): return ":".join(mac) def hotspot(self, new=None): - """ Cette borne est-elle partagée avec l'ENS ? """ + """ Cette borne est-elle partagée avec l'ENS ? """ if new == None: - # Le schéma nous assure que ce champ existe toujours + # Le schéma nous assure que ce champ existe toujours return self._data['hotspot'][0] == "TRUE" else: if new: @@ -3140,7 +3140,7 @@ class BorneWifi(Machine): else: canaux = int(canaux) if canaux < 14: - # Compatibilité ascendante + # Compatibilité ascendante return str(canaux) lcanal1 = [] for i in range(1, 14): @@ -3169,7 +3169,7 @@ class BorneWifi(Machine): new = int(new) if new < 0 or new > 13: raise except: - # Nouveau système, il doit s'agir d'une liste de canaux + # Nouveau système, il doit s'agir d'une liste de canaux try: lcanal3 = str(new).split(",") lcanal = [] @@ -3186,7 +3186,7 @@ class BorneWifi(Machine): raise new = new + (1 << (c - 1)) except: - raise ValueError(u'Canal invalide : doit être entre 0 et 13 ou une liste de canaux') + raise ValueError(u'Canal invalide : doit être entre 0 et 13 ou une liste de canaux') self._set('canal', [str(new)]) return new @@ -3200,7 +3200,7 @@ class BorneWifi(Machine): new = int(new) if new < -99 or new > 99: raise except: - raise ValueError(u'Puissance invalide : doit être entre -99 et 99') + raise ValueError(u'Puissance invalide : doit être entre -99 et 99') self._set('puissance', [str(new)]) return new @@ -3208,11 +3208,11 @@ class BorneWifi(Machine): def position(self, new=False): """ Attribution ou visualisation de la position d'une borne wifi. - Renvoie un couple de coordonnées (en strings) si elles existent, - None sinon. new doit être un couple de coordonnées (en strings), - None (pour enlever les coordonnées) ou False (retourne les valeurs + Renvoie un couple de coordonnées (en strings) si elles existent, + None sinon. new doit être un couple de coordonnées (en strings), + None (pour enlever les coordonnées) ou False (retourne les valeurs actuelles). - On utilise des strings plutôt que des floats à cause de la précision. + On utilise des strings plutôt que des floats à cause de la précision. """ if new == False: valeur = self._data.get('positionBorne', [''])[0] @@ -3231,12 +3231,12 @@ class BorneWifi(Machine): def nvram(self, champ=None, new=False): """ - Définit et renvoie un champ nvram d'une borne wifi. + Définit et renvoie un champ nvram d'une borne wifi. Si champ=None, renvoie sous forme de liste key=value tous - les champs. On peut aussi définir tous les champs en + les champs. On peut aussi définir tous les champs en passant dans new la liste. - Sinon, définit et renvoie la valeur du champ indiqué. - Le champ est juste retourné, supprimé ou modifié selon + Sinon, définit et renvoie la valeur du champ indiqué. + Le champ est juste retourné, supprimé ou modifié selon que new vaut False, None ou autre chose. """ current = self._data.get('nvram', [])[:] @@ -3277,7 +3277,7 @@ class BorneWifi(Machine): return new class Facture(BaseClasseCrans): - """ Classe de définition d'une facture """ + """ Classe de définition d'une facture """ objectClass = 'facture' idn = 'fid' filtre_idn = '(objectClass=facture)' @@ -3285,17 +3285,17 @@ class Facture(BaseClasseCrans): def __init__(self, parent_or_tuple, mode='', conn=None): """ parent_or_tuple est : - * soit une instance d'une classe pouvant posséder une facture - (Adherent, Club), la nouvelle facture lui sera alors associée. - * soit directement le tuple définissant une facture (tel que - retourné par les fonctions de recherche ldap) + * soit une instance d'une classe pouvant posséder une facture + (Adherent, Club), la nouvelle facture lui sera alors associée. + * soit directement le tuple définissant une facture (tel que + retourné par les fonctions de recherche ldap) - Pour l'édition d'une facture, mode devra être égal à 'w' - Attention, si mode='w' mais si l'objet est déja locké il n'y a - pas d'erreur, vérifier l'obtention du lock grâce à la valeur de + Pour l'édition d'une facture, mode devra être égal à 'w' + Attention, si mode='w' mais si l'objet est déja locké il n'y a + pas d'erreur, vérifier l'obtention du lock grâce à la valeur de _modifiable (si ='w' c'est bon) - conn est une instance de la classe de connexion à la base LDAP + conn est une instance de la classe de connexion à la base LDAP """ # Initialisation de la connexion @@ -3306,7 +3306,7 @@ class Facture(BaseClasseCrans): self.modifs = {} t = parent_or_tuple.__class__ if t == tuple: - # Initialisation avec données fournies + # Initialisation avec données fournies self.dn = parent_or_tuple[0] if mode == 'w': try: @@ -3320,7 +3320,7 @@ class Facture(BaseClasseCrans): self._init_data = parent_or_tuple[1].copy() self._data = parent_or_tuple[1] - # Propriéraire inconnu mais ce n'est pas grave + # Propriéraire inconnu mais ce n'est pas grave self.__proprietaire = None elif t in [Adherent, Club] and mode != 'w': @@ -3335,28 +3335,28 @@ class Facture(BaseClasseCrans): raise TypeError(u'Arguments invalides') def numero(self): - """ Retourne le numéro de facture """ + """ Retourne le numéro de facture """ fid = self._data.get('fid',[None])[0] if fid == None: raise NotImplementedError, u'Il faut enregistrer une facture pour connaitre son numero' return fid def nom(self): - """ Utilisé pour la fonction delete() """ + """ Utilisé pour la fonction delete() """ return "Facture%s" % self.numero() Nom = nom def proprietaire(self): """ - retroune le propriétaire de la facture (classe Adherent ou Club) + retroune le propriétaire de la facture (classe Adherent ou Club) """ # si la facture est en mode w mais pas le proprio, on tente de prendre # le proprio en w if self.__proprietaire and self.__proprietaire._modifiable != self._modifiable: self.__proprietaire = None - # récupère le proprio si ce n'est pas encore fait + # récupère le proprio si ce n'est pas encore fait if not self.__proprietaire: res = self.conn.search_s(','.join(self.dn.split(',')[1:]), 0) if 'adherent' in res[0][1]['objectClass']: @@ -3364,26 +3364,26 @@ class Facture(BaseClasseCrans): elif 'club' in res[0][1]['objectClass']: self.__proprietaire = Club(res[0], self._modifiable, self.conn) else: - raise ValueError, u'Propriétaire inconnu' + raise ValueError, u'Propriétaire inconnu' return self.__proprietaire def modePaiement(self, new=None): """ - Définit ou retourne le mode de paiement. - Le mode de paiement doit être une chaine de caractère + Définit ou retourne le mode de paiement. + Le mode de paiement doit être une chaine de caractère """ # modification du mode de paiement if new != None: if self.recuPaiement(): - raise ValueError, u'Facture déja payée' + raise ValueError, u'Facture déja payée' if not self._modifiable: raise NotImplementedError, "La facture n'est pas modifiable" if new not in ['liquide','cheque','paypal']: - raise ValueError, u'Mode de paiement non accepté' + raise ValueError, u'Mode de paiement non accepté' self._set('modePaiement', [new]) @@ -3391,30 +3391,30 @@ class Facture(BaseClasseCrans): def recuPaiement(self, new=None): """ - Définit ou retourne qui a recu le paiement + Définit ou retourne qui a recu le paiement """ - # on vérifie que la facture n'est pas déja payéee + # on vérifie que la facture n'est pas déja payéee if new and self._data.get('recuPaiement', []): - raise ValueError, u'Facture déja payée' + raise ValueError, u'Facture déja payée' # modification de la valeur if new != None: - # on vérifie que la facture est modifiable + # on vérifie que la facture est modifiable if not self._modifiable and new: raise NotImplementedError, "La facture n'est pas modifiable" - # on crédite les articles, si c'est pas possible, la metode + # on crédite les articles, si c'est pas possible, la metode # levera une exeption self._crediter() - # ajout des frais à la liste d'articles + # ajout des frais à la liste d'articles self.ajoute(self._frais()) # modifie la base ldap self._set("recuPaiement",[new]) - # renvoie la valeur trouvée dans la base + # renvoie la valeur trouvée dans la base return self._data.get("recuPaiement",[None])[0] def _del_recu_paiement(self): @@ -3423,23 +3423,23 @@ class Facture(BaseClasseCrans): def _crediter(self): """ - Credite les articles à son propriétaire + Credite les articles à son propriétaire """ - # si la facture n'existe pas encore, on la sauve pour générer un numéro + # si la facture n'existe pas encore, on la sauve pour générer un numéro if not self._data.has_key('fid'): self.save() - # on vérifie que le propriétaire est modifiable + # on vérifie que le propriétaire est modifiable if not self.proprietaire()._modifiable: - raise SystemError, u"Impossible de créditer les articles, le proprietaire n'est pas modifiable" + raise SystemError, u"Impossible de créditer les articles, le proprietaire n'est pas modifiable" - # on crédite les articles + # on crédite les articles for art in self._articles(): # solde impression if art["code"] == "SOLDE": proprio = self.proprietaire() - proprio.solde(operation=art['nombre']*art["pu"], comment="Facture n°%s : %s" % (self.numero(),art['designation'])) + proprio.solde(operation=art['nombre']*art["pu"], comment="Facture n°%s : %s" % (self.numero(),art['designation'])) proprio.save() def _frais(self): @@ -3449,7 +3449,7 @@ class Facture(BaseClasseCrans): arts = [] - # aucun frais pour une facture payée, ils sont intégrés aux articles + # aucun frais pour une facture payée, ils sont intégrés aux articles if self.recuPaiement(): return [] @@ -3465,7 +3465,7 @@ class Facture(BaseClasseCrans): # arrondissage-tronquage s = float(int(s*100)/100.0) - # ajoute à la liste d'articles de frais + # ajoute à la liste d'articles de frais arts.append( {'code':'FRAIS','designation':'Frais de tansaction PayPal','nombre':1,'pu':round(s,2)} ) return arts @@ -3490,12 +3490,12 @@ class Facture(BaseClasseCrans): return arts def ajoute(self, ajoute): - """ Ajoute un/des article(s) à la facture + """ Ajoute un/des article(s) à la facture ajoute est un article ou une liste d'articles """ - # on ne eut pas modifier une facture payée + # on ne eut pas modifier une facture payée if self.recuPaiement(): - raise ValueError, u'On ne peut pas modifier une facture payée' + raise ValueError, u'On ne peut pas modifier une facture payée' # charge la liste des articles arts = self._articles() @@ -3506,7 +3506,7 @@ class Facture(BaseClasseCrans): if type(ajoute)==list: for art in ajoute: if int(art['nombre']) != float(art['nombre']): - raise ValueError, u'nombre doit être un entier' + raise ValueError, u'nombre doit être un entier' if float(int(art['pu']*100)/100.0) != art['pu']: raise ValueError, u'pu ne doit pas avoir plus de 2 chiffres apres la virgule' art['nombre'] = int(art['nombre']) @@ -3518,12 +3518,12 @@ class Facture(BaseClasseCrans): self._articles(arts) def supprime(self, supprime): - """ Supprime un/des article(s) à la facture + """ Supprime un/des article(s) à la facture arts est un article ou une liste d'articles """ - # on ne eut pas modifier une facture payée + # on ne eut pas modifier une facture payée if self.recuPaiement(): - raise ValueError, u'On ne peut pas modifier une facture payée' + raise ValueError, u'On ne peut pas modifier une facture payée' # charge la liste des articles arts = self._articles() @@ -3589,14 +3589,14 @@ class Facture(BaseClasseCrans): def save(self): """ Enregistre la facture dans la base LDAP - Retourne une chaîne indiquant les opération effectuées. + Retourne une chaîne indiquant les opération effectuées. """ # Enregistrement self._save() - # Remise à zéro + # Remise à zéro self.modifs = {} # Message de sortie - return coul(u"Facture n°%s enregistrée avec succès." % self.numero(), 'vert') + return coul(u"Facture n°%s enregistrée avec succès." % self.numero(), 'vert') def delete(self, comment=''): """ Suppression de la facture """ @@ -3604,7 +3604,7 @@ class Facture(BaseClasseCrans): self._delete(self.dn, comment) class _FakeProprio(CransLdap): - """ Définitions de base d'un propriétaire virtuel """ + """ Définitions de base d'un propriétaire virtuel """ idn = '' def __init__(self, conn=None): self.conn = conn @@ -3631,7 +3631,7 @@ class _FakeProprio(CransLdap): return m class AssociationCrans(_FakeProprio): - """ Classe définissant l'assoce (pour affichage de ses machines) """ + """ Classe définissant l'assoce (pour affichage de ses machines) """ def __init__(self, conn=None): _FakeProprio.__init__(self, conn) def Nom(self): @@ -3659,7 +3659,7 @@ if __name__ == '__main__': usage = """Usage %s [ACTION] --lock : donne la liste des locks actifs --purgelock : supprime tous les locks de la base LDAP - --menage : supprime les machines des anciens adhérents"""%sys.argv[0] + --menage : supprime les machines des anciens adhérents"""%sys.argv[0] if len(sys.argv) != 2: print usage @@ -3675,12 +3675,12 @@ if __name__ == '__main__': crans_ldap().remove_lock('*') elif '--menage' in sys.argv: - print "Ménage des machines des adhérents partis..." + print "Ménage des machines des adhérents partis..." machines = crans_ldap().search('paiement!=%s&host=*.crans.org' % ann_scol , 'w')['machine'] print "Destruction de %i machines" % len(machines) for m in machines: print 'Destruction de %s' % m.nom() - m.delete('Ménage') + m.delete('Ménage') else: print usage diff --git a/gestion/ldap_passwd.py b/gestion/ldap_passwd.py index 07cf4f20..039f81f8 100644 --- a/gestion/ldap_passwd.py +++ b/gestion/ldap_passwd.py @@ -1,14 +1,14 @@ -# -*- coding: iso8859-15 -*- +# -*- coding: utf-8 -*- ############################################################################### # ldap_passwd.py : manipulation des mots de passes LDAP # $Id: ldap_passwd.py,v 1.7 2006-05-04 17:46:58 chove Exp $ ############################################################################### # The authors of this code are # Bjorn Ove Grotan -# Etienne Chové +# Etienne Chové # # Copyright (C) 2005 Bjorn Ove Grotan -# Copyright (C) 2006 Etienne Chové +# Copyright (C) 2006 Etienne Chové # All rights reserved. # # This program is free software; you can redistribute it and/or modify diff --git a/gestion/lock.py b/gestion/lock.py index b37f1641..20779d99 100755 --- a/gestion/lock.py +++ b/gestion/lock.py @@ -1,9 +1,9 @@ #!/usr/bin/env python -# -*- coding: iso-8859-15 -*- +# -*- coding: utf-8 -*- """ Gestion de lock -Copyright (C) Frédéric Pauget +Copyright (C) Frédéric Pauget Licence : GPLv2 """ @@ -14,10 +14,10 @@ from fcntl import lockf, LOCK_EX, LOCK_NB, LOCK_UN import errno, random def wait_lock(lock_name, lock_comment='', d=None, retry=0.2): - """Attend la disponibilité d'un lock en utilisant le framework Twisted. + """Attend la disponibilité d'un lock en utilisant le framework Twisted. Si d est de type Deferred, on est en mode asynchrone. - retry permet de réessayer dans `retry' secondes. + retry permet de réessayer dans `retry' secondes. """ from twisted.internet import reactor, defer try: @@ -30,7 +30,7 @@ def wait_lock(lock_name, lock_comment='', d=None, retry=0.2): import traceback traceback.print_exc() # On a sans doute pas le lock et c'est pas moi qui me tape - # à debugguer les trucs à Fred. + # à debugguer les trucs à Fred. raise AssertionError # On a le lock @@ -51,8 +51,8 @@ def wait_lock(lock_name, lock_comment='', d=None, retry=0.2): return d def make_lock(lock_name, lock_comment='',nowait=0, quiet=False) : - """ Création d'un lock - si nowait=1 fait un sys.exit(254) quand un ancien lock actif est rencontré + """ Création d'un lock + si nowait=1 fait un sys.exit(254) quand un ancien lock actif est rencontré """ return lock_dir = '/var/lock/gestion' @@ -62,7 +62,7 @@ def make_lock(lock_name, lock_comment='',nowait=0, quiet=False) : pass lock_file = "%s/%s" % (lock_dir, lock_name) - # On créé une zone d'exclusion + # On créé une zone d'exclusion lock_fd_dl=open("%s-dotlock" % lock_file, "w") # On demande un verrou exclusif try: @@ -75,12 +75,12 @@ def make_lock(lock_name, lock_comment='',nowait=0, quiet=False) : # On va plutot lever une exception raise AssertionError('In critical section') else: - sys.stderr.write('\tpropriétaire : inconnu\n\tpid : inconnu\n\tdémarré depuis inconnu\n') + sys.stderr.write('\tpropriétaire : inconnu\n\tpid : inconnu\n\tdémarré depuis inconnu\n') sys.exit(254) else: - # La procédure de lock est deja en cours d'execution, on essaie un peu plus tard + # La procédure de lock est deja en cours d'execution, on essaie un peu plus tard time.sleep(0.5) - # On enleve le verrou système + # On enleve le verrou système lockf(lock_fd_dl, LOCK_UN) lock_fd_dl.close() return make_lock(lock_name, lock_comment) @@ -124,7 +124,7 @@ def make_lock(lock_name, lock_comment='',nowait=0, quiet=False) : data[-1]=txt if not quiet: - sys.stderr.write('\tpropriétaire : %s\n\tpid : %s\n\tdémarré depuis %s\n' % tuple(data) ) + sys.stderr.write('\tpropriétaire : %s\n\tpid : %s\n\tdémarré depuis %s\n' % tuple(data) ) sys.exit(254) else: # On va plutot lever une exception @@ -136,7 +136,7 @@ def make_lock(lock_name, lock_comment='',nowait=0, quiet=False) : time.sleep(1) a.cycle() sys.stdout.write('\r') - # On enleve le verrou système + # On enleve le verrou système lockf(lock_fd_dl, LOCK_UN) lock_fd_dl.close() return make_lock(lock_name, lock_comment) @@ -150,7 +150,7 @@ def make_lock(lock_name, lock_comment='',nowait=0, quiet=False) : lock_fd.write("%s\n%s\n%s" % (os.getpid(), utilisateur, lock_comment) ) lock_fd.close() - # On enleve le verrou système + # On enleve le verrou système lockf(lock_fd_dl, LOCK_UN) lock_fd_dl.close() @@ -158,7 +158,7 @@ def make_lock(lock_name, lock_comment='',nowait=0, quiet=False) : def remove_lock( lock_name ) : """ Destruction du lock """ return - # On créé une zone d'exclusion + # On créé une zone d'exclusion lock_dir = '/var/lock/gestion' lock_file = "%s/%s" % (lock_dir, lock_name) @@ -169,7 +169,7 @@ def remove_lock( lock_name ) : except IOError, e: if e.errno not in [errno.EACCES, errno.EAGAIN]: raise - # Déjà locké + # Déjà locké time.sleep(0.5) return remove_lock(lock_name) try : @@ -180,6 +180,6 @@ def remove_lock( lock_name ) : except : pass - # On enleve le verrou système + # On enleve le verrou système lockf(lock_fd_dl, LOCK_UN) lock_fd_dl.close() diff --git a/gestion/mail-all.py b/gestion/mail-all.py index a11a66c7..293c8c91 100755 --- a/gestion/mail-all.py +++ b/gestion/mail-all.py @@ -1,8 +1,8 @@ #! /usr/bin/env python -# -*- encoding: iso-8859-15 -*- -# Envoi d'un mail donné à certains adherents +# -*- encoding: utf-8 -*- +# Envoi d'un mail donné à certains adherents # Premier parametre : critere de recherche -# Second parametre, fichier à envoyer +# Second parametre, fichier à envoyer import smtplib import sys,os @@ -32,7 +32,7 @@ def reconf_postfix(): limit="no" for line in lines: if line == LIMIT_CONF: - nlines+=u"## mail_all.py a commenté la ligne suivante" + nlines+=u"## mail_all.py a commenté la ligne suivante" nlines+="# smtpd_client_message_rate_limit = 10\n" limit="yes" else: @@ -43,14 +43,14 @@ def reconf_postfix(): sys.exit(1) if limit == "yes": - # Si oui, on demande à l'utilisateur si on y touche + # Si oui, on demande à l'utilisateur si on y touche negatif = ["N", "n", ""] positif = ["O", "o", "Y", "y"] poursuivre = "x" while not (poursuivre in negatif + positif): - poursuivre = raw_input("Il y a trop de destinataires, il faut réécrire la conf de postfix [o/N] ") + poursuivre = raw_input("Il y a trop de destinataires, il faut réécrire la conf de postfix [o/N] ") if poursuivre in negatif: print "Ok, on ne touche pas au fichier..." @@ -58,14 +58,14 @@ def reconf_postfix(): assert (poursuivre in positif) - # On réécrit la conf + # On réécrit la conf try: nconf_fd = open (POSTFIX_CONF, "w") - print u"Réécriture de la configuration de postfix" + print u"Réécriture de la configuration de postfix" nconf_fd.writelines(nlines) nconf_fd.close () except IOError: - print u"Je n'arrive pas à réécrire la conf de postfix, es-tu root ?" + print u"Je n'arrive pas à réécrire la conf de postfix, es-tu root ?" sys.exit(1) reload_postfix() @@ -76,50 +76,50 @@ if __name__ == "__main__": if len(sys.argv) != 3: print """Usage: -Ce script permet d'envoyer un mail à toute une catégorie d'adhérents. +Ce script permet d'envoyer un mail à toute une catégorie d'adhérents. -Le premier paramètre est le critère de recherche : - paiement=ok pour les adhérents en règle - paiement=ok&paiement!=2004 pour ceux qui n'ont pas encore payé pour cette année +Le premier paramètre est le critère de recherche : + paiement=ok pour les adhérents en règle + paiement=ok&paiement!=2004 pour ceux qui n'ont pas encore payé pour cette année chbre=????&paiement=ok pour ceux dont la chambre est inconnue - paiement=ok&carteEtudiant!=2004 pour ceux qui n'ont pas de carte d'étudiant + paiement=ok&carteEtudiant!=2004 pour ceux qui n'ont pas de carte d'étudiant -Le second paramètre est un fichier texte qui contient le message à envoyer. Il -doit également contenir les entêtes, à l'exception du destinataire qui sera rajouté +Le second paramètre est un fichier texte qui contient le message à envoyer. Il +doit également contenir les entêtes, à l'exception du destinataire qui sera rajouté par le script. - /!\ Ce script ne demande aucune confirmation, il faut veiller à - vérifier avec who que l'on cible bien les utilisateurs que l'on - veut. Et si on veut vérifier que le mail a une bonne tête on se - l'envoie d'abord en mettant login=machin comme critère de + /!\ Ce script ne demande aucune confirmation, il faut veiller à + vérifier avec who que l'on cible bien les utilisateurs que l'on + veut. Et si on veut vérifier que le mail a une bonne tête on se + l'envoie d'abord en mettant login=machin comme critère de recherche. /!\ Ce script a pour but de spammer, et spammer c'est mal. Il faut - donc contourner les limitations qui ont été mises en place au - Cr@ns. Si plus de 10 mails doivent être envoyés, il faut le faire + donc contourner les limitations qui ont été mises en place au + Cr@ns. Si plus de 10 mails doivent être envoyés, il faut le faire depuis rouge, et ce en root. """ sys.exit(0) - # On en est là + # On en est là # On ouvre la base et on cherche adherents = ldap_crans.crans_ldap().search(sys.argv[1])['adherent'] card= len(adherents) - print "%d adhérent(s) a/ont été trouvé(s)..." % card + print "%d adhérent(s) a/ont été trouvé(s)..." % card time.sleep(3) # On dort un peu, ctrl-c welcome limit="no" if card >= 10: (limit, backup_conf) = reconf_postfix() - # Il faudra quoiqu'il arrive rétablir la conf de postfix + # Il faudra quoiqu'il arrive rétablir la conf de postfix # try capture-t-il les SIGTERM ?! try: try: texte = "".join(file(sys.argv[2], "r").readlines()) except IOError: - print "Impossible d'ouvrir le fichier à envoyer, merci, au revoir." + print "Impossible d'ouvrir le fichier à envoyer, merci, au revoir." sys.exit(1) echecs = [] @@ -129,14 +129,14 @@ par le script. mail = adherent.mail().encode("iso-8859-15", "ignore") if "@" not in mail: mail = mail + "@crans.org" - print "Envoi du mail à %s <%s>..." % (adherent.Nom().encode("iso-8859-15","ignore"), mail) + print "Envoi du mail à %s <%s>..." % (adherent.Nom().encode("iso-8859-15","ignore"), mail) try: recipient = format_sender(u'"%s" <%s>\n' % (adherent.Nom(), mail)) s.sendmail('bulk+%s@crans.org' % mail.replace("@",'-at-'), (mail,), "To: %s\n%s" % (recipient, texte)) except: - print "Erreur lors de l'envoi à %s <%s>..." % (adherent.Nom().encode("iso-8859-15","ignore"), mail) + print "Erreur lors de l'envoi à %s <%s>..." % (adherent.Nom().encode("iso-8859-15","ignore"), mail) echecs.append(mail) else: # Tout va bien @@ -148,7 +148,7 @@ par le script. s.close() - # On rétablit la conf de postfix + # On rétablit la conf de postfix finally: if limit == "yes": try: diff --git a/gestion/majswitch.py b/gestion/majswitch.py index d4545983..15fba375 100755 --- a/gestion/majswitch.py +++ b/gestion/majswitch.py @@ -1,5 +1,5 @@ #!/usr/bin/env python -# -*- coding: iso-8859-15 -*- +# -*- coding: utf-8 -*- """ Script de mise a jour des firmwares de switchs @@ -17,7 +17,7 @@ import os if sys.argv[1] == '-h' or sys.argv[1]=='--help' : print "Usage : %s regex " % sys.argv[0] - print "Envoi les commandes données au switchs matchant la regex" + print "Envoi les commandes données au switchs matchant la regex" sys.exit(0) ip_tftp=sys.argv[1] @@ -40,16 +40,16 @@ print switchs print "---------------" if not switchs : - print "Aucun switch trouvé" + print "Aucun switch trouvé" print "Note : il faut une _regex_ (!= wilcards au sens du shell)" sys.exit(1) if not ip_tftp : - print "Pas de serveur tftp donné" + print "Pas de serveur tftp donné" sys.exit(1) if not file_tftp : - print "Pas de fichier donné" + print "Pas de fichier donné" sys.exit(1) # On fait les tests uniquement sur batv-3 @@ -127,7 +127,7 @@ for bestiole in switchs : i=i+1 sleep(1) if i==300 : - print "Le switch n'a tjs pas rebooté" + print "Le switch n'a tjs pas rebooté" echecs.append(bestiole) aie=1 break @@ -136,8 +136,8 @@ for bestiole in switchs : print "---------------" continue - print "Reboot commencé" - print "Attente de réponse au ping" + print "Reboot commencé" + print "Attente de réponse au ping" i=0 aie=0 @@ -154,7 +154,7 @@ for bestiole in switchs : print "---------------" continue - print "Le switch répond au ping" + print "Le switch répond au ping" print "Connexion ssh" diff --git a/gestion/numeros_disponibles.py b/gestion/numeros_disponibles.py index 6a2b00ef..ded2ee57 100755 --- a/gestion/numeros_disponibles.py +++ b/gestion/numeros_disponibles.py @@ -1,5 +1,5 @@ #! /usr/bin/env python -# -*- coding: iso-8859-15 -*- +# -*- coding: utf-8 -*- """ Mise a jour periodique des listes d'ip et d'id disponibles. @@ -42,7 +42,7 @@ def lister_ip_utilisees(): def update_ip(plage, occupees): net = NETs[plage] - pool_ip = [] # Pool d'IP à tester + pool_ip = [] # Pool d'IP à tester for ne in net: ip = ne.split('/')[0] ip = ip.split('.') @@ -58,7 +58,7 @@ def update_ip(plage, occupees): if n[2] == 255: break ip = "%d.%d.%d.%d" % tuple(n) if not AddrInNet(ip, ne): - # On est allé trop loin + # On est allé trop loin break pool_ip.append(ip) diff --git a/gestion/restore.py b/gestion/restore.py index 86ec0b97..697a3382 100755 --- a/gestion/restore.py +++ b/gestion/restore.py @@ -1,10 +1,10 @@ #! /usr/bin/env python -# -*- coding: iso-8859-15 -*- +# -*- coding: utf-8 -*- """ -Restauration d'un objet précédement détruit dans la base. +Restauration d'un objet précédement détruit dans la base. -Copyright (C) Frédéric Pauget +Copyright (C) Frédéric Pauget Licence : GPLv2 """ @@ -17,21 +17,21 @@ from gest_crans import modif_adher, set_machine, modif_club from ldap_crans import mailexist def load(file) : - """ Charge l'objet (adhérent, machine ou club contenu dans le fichier fourni """ + """ Charge l'objet (adhérent, machine ou club contenu dans le fichier fourni """ try : fd=open(file,'rb') except : - print "Impossible d'ouvrir le fichier demandé." + print "Impossible d'ouvrir le fichier demandé." sys.exit(1) obj = cPickle.load(fd) try : - # Si machine vérif si le proprio est encore dans la base + # Si machine vérif si le proprio est encore dans la base test_proprio = obj.proprietaire() if test_proprio.Nom() != obj.proprio : raise - # Propriétaire encore dans la base => on récupère les infos de la base + # Propriétaire encore dans la base => on récupère les infos de la base del obj.proprio except : pass @@ -47,7 +47,7 @@ def load(file) : if '-h' in sys.argv or '--help' in sys.argv or len(sys.argv) != 2 : print "%s " % sys.argv[0].split('/')[-1].split('.')[0] - print "Restauration ou visualisation d'un objet précédement détruit dans la base." + print "Restauration ou visualisation d'un objet précédement détruit dans la base." print "Les fichiers de sauvegarde sont dans %s" % config.cimetiere sys.exit(255) @@ -56,17 +56,17 @@ aff(obj) def restore_adher(adh) : if adh.compte() and mailexist(adh.compte()) : - print "AVERTISSEMENT : le login %s à déja été réattribué." % adh.compte() - print " il faudra recréer un compte avec un login différent" + print "AVERTISSEMENT : le login %s à déja été réattribué." % adh.compte() + print " il faudra recréer un compte avec un login différent" prompt(u'Appuyez sur ENTREE pour continuer') adh._data['mail'] = [] modif_adher(adh) def restore_machine(machine) : try : - obj.proprio # crash si l'adhérent est encore dans la base - # L'adhérent est plus dans la base - t = prompt(u"Ratacher la machine à un [C]lub ou un [A]dhérent ?") + obj.proprio # crash si l'adhérent est encore dans la base + # L'adhérent est plus dans la base + t = prompt(u"Ratacher la machine à un [C]lub ou un [A]dhérent ?") t = t.lower() if t in 'ac' : i = prompt(u"Entrez l'%sid auquel ratacher la machine : %sid =" % (t,t) ) @@ -79,11 +79,11 @@ def restore_club(club) : modif_club(club) # Restauration ? -q = prompt(u'Restaurer cette entrée ? [O/N]') +q = prompt(u'Restaurer cette entrée ? [O/N]') if q not in 'oO' : sys.exit(0) -obj.connect() # Reconnection à la base LDAP +obj.connect() # Reconnection à la base LDAP if obj.idn == 'aid' : restore_adher(obj) elif obj.idn == 'mid' : diff --git a/gestion/user_tests.py b/gestion/user_tests.py index 0c72e55c..d3d18633 100755 --- a/gestion/user_tests.py +++ b/gestion/user_tests.py @@ -1,9 +1,9 @@ #!/usr/bin/env python -# -*- coding: iso-8859-15 -*- +# -*- coding: utf-8 -*- """ Fonctions de tests sur l'utilisateur -Copyright (C) Frédéric Pauget +Copyright (C) Frédéric Pauget Licence : GPLv2 """ @@ -18,7 +18,7 @@ def getuser() : def groups(login='') : """ Retourne la liste des droits qu'a l'utilisateur fourni, si aucun - utilisateur n'est fourni prend l'utilisateur loggué """ + utilisateur n'est fourni prend l'utilisateur loggué """ if login == '': login = getuser() @@ -43,15 +43,15 @@ def groups(login='') : def isadm(login='') : """ Retourne True si l'utilisateur est dans le groupe 4 (adm) - Si login='', prend l'utilisateur loggué """ + Si login='', prend l'utilisateur loggué """ return u'Nounou' in groups(login) or '0' in groups(login) def isdeconnecteur(login='') : """ Retourne True si l'utilisateur est dans le groupe 611 (bureau) - Si login='', prend l'utilisateur loggué """ + Si login='', prend l'utilisateur loggué """ return isadm(login) or u'Bureau' in groups(login) def iscableur(login=''): """ Retourne True si l'utilisateur est dans le groupe 604 (respbat) - Si login='', prend l'utilisateur loggué """ + Si login='', prend l'utilisateur loggué """ return isadm(login) or u'Cableur' in groups(login) diff --git a/gestion/whos.py b/gestion/whos.py index 0c0735c9..13f2864d 100755 --- a/gestion/whos.py +++ b/gestion/whos.py @@ -1,19 +1,19 @@ #! /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 -u"""Ce script permet de recherche et d'afficher le détail d'une machine ou -d'un adhérent. +u"""Ce script permet de recherche et d'afficher le détail d'une machine ou +d'un adhérent. Usage: %(prog)s [options] -La chaine de recherche peut être : - * soit un terme unique, dans ce cas la recherche sera effectuée sur les +La chaine de recherche peut être : + * soit un terme unique, dans ce cas la recherche sera effectuée sur les champs en bleu ci-dessous. - * soit du type "champ1=valeur1&champ2!=valeur2 ...", les résultats seront -alors limités aux entrées correspondantes à tous les critères. + * soit du type "champ1=valeur1&champ2!=valeur2 ...", les résultats seront +alors limités aux entrées correspondantes à tous les critères. Les champs de recherche possibles sont : %(champs_rech)s @@ -22,19 +22,19 @@ Recherche sur prise possible (utiliser uniquement ce champ dans ce cas). Les options de recherches sont : * limitations sur l'affichage : - -a ou --adherent : limitation de l'affichage aux adhérents + -a ou --adherent : limitation de l'affichage aux adhérents -m ou --machine : limitation de l'affichage aux machines -c ou --club : limitation de l'affichage aux clubs -b ou --bornes : limitation de l'affichage aux bornes wifi --crans : recherche uniquement les machines du crans * options d'affichage : -t ou --tech : affichages des infos techniques des machines -à la place des infos administratives dans les résumés. +à la place des infos administratives dans les résumés. -i ou --ipsec : montre la clef ipsec des machines wifi - -l ou --limit= : limite du nombre de résultats pour utiliser -le mode d'affichage condensé au lieu du mode détaillé (défaut %(limit_aff_details)i) + -l ou --limit= : limite du nombre de résultats pour utiliser +le mode d'affichage condensé au lieu du mode détaillé (défaut %(limit_aff_details)i) -L ou --limit-historique= : limitation du nombre de lignes -d'historique affichées (défaut %(limit_aff_historique)i) +d'historique affichées (défaut %(limit_aff_historique)i) """ try: @@ -63,14 +63,14 @@ aff_ipsec = 0 def aff(qqch,mtech=0) : """ Affichage de qqch. - qqch peut être une liste d'instances des classes adhérent ou machine + qqch peut être une liste d'instances des classes adhérent ou machine (un seul type dans la liste) dans ce cas : - * si la longueur de la liste est inférieure à limit_aff_details - affiche les propriétés détaillées de chaque élément. - * sinon résume dans un tabeau des principales propriétés - si qqch est une instance seul la traité comme une liste à une élément + * si la longueur de la liste est inférieure à limit_aff_details + affiche les propriétés détaillées de chaque élément. + * sinon résume dans un tabeau des principales propriétés + si qqch est une instance seul la traité comme une liste à une élément Si mtech = 1 affiches les infomations techniques des machines plutot - qu'administratives dans le tableau des propriétés + qu'administratives dans le tableau des propriétés """ if type(qqch) != list : qqch = [ qqch ] @@ -99,26 +99,26 @@ def aff(qqch,mtech=0) : elif t == 'cid': cprint(club_details(c).strip()) - # affiche le nombre de résultats + # affiche le nombre de résultats if len(qqch) > 1: cprint(u"Total: %d" % len(qqch)) def adhers_brief(adhers) : """ - Formatage sous forme de tableau des infos sur la liste d'adhérent fournie : + Formatage sous forme de tableau des infos sur la liste d'adhérent fournie : * aid - * prénom nom + * prénom nom * chambre * machines """ data = [] - # Copie locale triée par (nom, prenom) + # Copie locale triée par (nom, prenom) adhers = adhers[:] adhers.sort(lambda x, y: cmp((x.nom(), x.prenom()), (y.nom(), y.prenom()))) for a in adhers: - ## État administratif + ## État administratif ok = u'\x1b[1;32mo\x1b[1;0m' ook = u'\x1b[1;32mO\x1b[1;0m' nok = u'\x1b[1;31mn\x1b[1;0m' @@ -129,17 +129,17 @@ def adhers_brief(adhers) : elif isinstance(a,Adherent) and not a.adherentPayant(): paid = coul('G', 'bleu') else: paid = nok - # Précablage + # Précablage if ann_scol+1 in a.paiement() : paid = coul(paid,'f_vert') - # Carte d'étudiant + # Carte d'étudiant if ann_scol in a.carteEtudiant(): if 'c' in a.controle(): carte = ook else: carte = ok else : carte = nok machines = '' - # Récupération des machines + # Récupération des machines if len(adhers) <= limit_aff_machines: for machine in a.machines() : nom = machine.nom().split('.')[0] @@ -150,7 +150,7 @@ def adhers_brief(adhers) : else : machines = coul(nom,k) else: machines = None - # Données + # Données if len(adhers) <= limit_aff_machines: data.append([a.id(), a.Nom(), a.chbre(), paid, carte, machines]) else: @@ -158,41 +158,41 @@ def adhers_brief(adhers) : if len(adhers) <= limit_aff_machines: return u"Machines en rouge = machines avec limitation de services\n" + \ - u"P : paiement année en cours, le fond vert indique le précâblage (G bleu = inscription gratuite)\n" + \ - u"C : carte d'étudiant année en cours\n" + \ + u"P : paiement année en cours, le fond vert indique le précâblage (G bleu = inscription gratuite)\n" + \ + u"C : carte d'étudiant année en cours\n" + \ tableau(data, - titre = [u'aid', u'Prénom Nom', u'Chbre', u'P', u'C', u'Machines'], + titre = [u'aid', u'Prénom Nom', u'Chbre', u'P', u'C', u'Machines'], largeur = [5, 30, 5, 1, 1, '*'], alignement = ['d', 'c', 'g', 'c', 'c', 'c']) else: return u"Machines en rouge = machines avec limitation de services\n" + \ - u"P : paiement année en cours, le fond vert indique le précâblage (G bleu = inscription gratuite)\n" + \ - u"C : carte d'étudiant année en cours\n" + \ + u"P : paiement année en cours, le fond vert indique le précâblage (G bleu = inscription gratuite)\n" + \ + u"C : carte d'étudiant année en cours\n" + \ tableau(data, - titre = [u'aid', u'Prénom Nom', u'Chbre', u'P', u'C'], + titre = [u'aid', u'Prénom Nom', u'Chbre', u'P', u'C'], largeur = [5, '*', 5, 1, 1], alignement = ['d', 'c', 'g', 'c', 'c']) def machines_brief(machines) : """ - Formatage sous forme d'un tableau des propriétés de la liste de machine : + Formatage sous forme d'un tableau des propriétés de la liste de machine : * mid * type (fixe ou wifi, born) * nom * adresse IP * adresse MAC - * si blacklistée + * si blacklistée """ data = [] - # Copie locale triée par nom + # Copie locale triée par nom machines = machines[:] machines.sort(lambda x, y: cmp(x.nom(), y.nom())) for m in machines : t, bl = __bases_machines(m) - # Propriétaire + # Propriétaire a = m.proprietaire() p = a.Nom() @@ -203,12 +203,12 @@ def machines_brief(machines) : else: p = coul(p,'rouge') - # Données + # Données data.append([m.id() , t, m.nom().split('.')[0], p, a.chbre(), bl]) - return u"Le propriétaire en rouge signale un problème administratif, en bleu une inscription gratuite\n" + \ + return u"Le propriétaire en rouge signale un problème administratif, en bleu une inscription gratuite\n" + \ tableau(data, - titre = [u'mid', u'Type', u'Nom de machine', u'Propriétaire', u'Chbre', u'Limitation'], + titre = [u'mid', u'Type', u'Nom de machine', u'Propriétaire', u'Chbre', u'Limitation'], largeur = [5, 4, 18, '*', 5, 10], alignement = ['d', 'c', 'c', 'c', 'g', 'c']) @@ -222,12 +222,12 @@ def clubs_brief(clubs) : """ data = [] - # Copie locale triée par Nom + # Copie locale triée par Nom clubs = clubs[:] clubs.sort(lambda x, y: cmp(x.Nom(), y.Nom())) for c in clubs : - ## État administratif + ## État administratif ok = u'\x1b[1;32mo\x1b[1;0m' ook = u'\x1b[1;32mO\x1b[1;0m' nok = u'\x1b[1;31mn\x1b[1;0m' @@ -237,11 +237,11 @@ def clubs_brief(clubs) : else: paid = ok else : paid = nok - # Précablage + # Précablage if ann_scol+1 in c.paiement() : paid = coul(paid,'f_vert') machines = '' - # Récupération des machines + # Récupération des machines for machine in c.machines() : nom = machine.nom().split('.')[0] if machine.blacklist_actif() : k = 'rouge' @@ -252,11 +252,11 @@ def clubs_brief(clubs) : # Responsable resp = c.responsable().Nom() - # Données + # Données data.append([c.id() , c.Nom(), c.local(), paid, resp, machines]) return u"Machines en rouge = machines avec limitation de services\n" + \ - u"P : signature charte année en cours, le fond vert indique le précâblage\n" + \ + u"P : signature charte année en cours, le fond vert indique le précâblage\n" + \ tableau(data, titre = [u'cid', u'Nom ', u'Local', u'P', u'Responsable', u'Machines'], largeur = [5, '*', 6, 1, 21, 15], @@ -265,24 +265,24 @@ def clubs_brief(clubs) : def list_machines(machines) : """ - Formatage sous forme d'un tableau des propriétés de la liste de machine : + Formatage sous forme d'un tableau des propriétés de la liste de machine : * mid * type (fixe ou wifi) * nom * adresse IP * adresse MAC - * si blacklistée + * si blacklistée """ data = [] - # Copie locale triée par nom + # Copie locale triée par nom machines = machines[:] machines.sort(lambda x, y: cmp(x.nom(), y.nom())) for m in machines : t, bl = __bases_machines(m) - # Données + # Données data.append([m.id(), t, m.nom().split('.')[0], m.ip(), m.mac(), bl]) return tableau(data, @@ -292,19 +292,19 @@ def list_machines(machines) : def list_bornes(bornes) : """ - Formatage sous forme d'un tableau des propriétés de la liste de bornes wifi : + Formatage sous forme d'un tableau des propriétés de la liste de bornes wifi : * mid * nom * adresse IP * adresse MAC - * État + * État * puissance * canal - * lieu (la première remarque en fait) + * lieu (la première remarque en fait) """ data = [] - # Copie locale triée par nom + # Copie locale triée par nom bornes = bornes[:] bornes.sort(lambda x, y: cmp(x.nom(), y.nom())) @@ -314,7 +314,7 @@ def list_bornes(bornes) : t, bl = __bases_machines(b) if t != 'born' : continue - # Données + # Données try : l = [x for x in b.info() if not x[0]=='<'][0] if len(l) > 11 : @@ -334,7 +334,7 @@ def list_bornes(bornes) : data.append([b.id(), b.nom().split('.')[0], b.ip(), b.mac(), etat, b.canal(), puiss, b.prise(), l]) - return u"Can=canaux, P=puissance, E=état\n" + \ + return u"Can=canaux, P=puissance, E=état\n" + \ tableau(data, titre = [u'mid', u'Nom', u'Adresse IP', u'Adresse MAC', u'E', u'Can', u'P', u'Pris', u'Lieu'], largeur = [5, 13, 15, 17, 1, 5, 3, 4, '*'], @@ -342,7 +342,7 @@ def list_bornes(bornes) : def adher_details(adher) : """ - Affichage du détail des propriétés d'un adhérent + Affichage du détail des propriétés d'un adhérent """ f=u'' # Aid @@ -370,12 +370,12 @@ def adher_details(adher) : if not adher.contourneGreylist(): GL = u' (%s)'%coul(u'GreyList','gris') if adher.rewriteMailHeaders(): - RMH = u' (%s)'%coul(u'réécriture en-têtes mail','gris') + RMH = u' (%s)'%coul(u'réécriture en-têtes mail','gris') alias = u', '.join([adher.canonical_alias()] + adher.alias()) if alias: if alias[0] == u',': - # Canonical étéait vide + # Canonical étéait vide alias = alias[2:] f += coul(u'Alias : ','gras') + alias f += GL @@ -390,9 +390,9 @@ def adher_details(adher) : if forward: f += coul(u'Redirection : ', 'gras') + forward except IOError, e: - # Pas de .forward, ou .forward privé... on laisse tomber + # Pas de .forward, ou .forward privé... on laisse tomber pass - f += coul(u'Dernière connexion : ', 'gras') + f += coul(u'Dernière connexion : ', 'gras') timestamp = adher.derniereConnexion() if timestamp == 0: f += coul(u'Jamais', 'rouge') @@ -401,24 +401,24 @@ def adher_details(adher) : time()-timestamp > 32*24*3600 and 'rouge' or '') f += u"\n" - # État administratif + # État administratif f += coul("Date d'inscription : ", "gras") f += strftime('%d/%m/%Y %H:%M', localtime(adher.dateInscription())) - f += coul(u'\nÉtat administratif : ','gras') + f += coul(u'\nÉtat administratif : ','gras') jour=1 if ann_scol not in adher.carteEtudiant() : - f += coul(u"manque carte d'étudiant",'violet') + f += coul(u"manque carte d'étudiant",'violet') jour = 0 if ann_scol not in adher.paiement() : if not jour : f += ' et ' if isinstance(adher, Adherent) and not adher.adherentPayant(): f += coul(u"inscription gratuite", 'bleu') else: - f += coul(u"cotisation %s/%d non réglée"% (ann_scol, ann_scol+1 ),'violet') + f += coul(u"cotisation %s/%d non réglée"% (ann_scol, ann_scol+1 ),'violet') jour = 0 if jour : - f += coul(u"à jour",'vert') + f += coul(u"à jour",'vert') f += '\n' # Telephone @@ -428,12 +428,12 @@ def adher_details(adher) : tel = u'%s %s %s %s %s' % ( tel[:2], tel[2:4], tel[4:6], tel[6:8], tel[8:] ) except : pass - f += coul(u'Numéro de téléphone : ','gras') + "%s\n" % tel.ljust(12) + f += coul(u'Numéro de téléphone : ','gras') + "%s\n" % tel.ljust(12) # Adresse chbre = adher.chbre() if chbre == 'EXT' : - # Adhérent extérieur + # Adhérent extérieur addr = adher.adresse() if addr[0] : f += coul(u'Adresse : ','gras') @@ -443,7 +443,7 @@ def adher_details(adher) : elif chbre == '????' : f += coul(u'Chambre invalide\n','violet') else : - # Chambre + prise (d'après annuaire) + # Chambre + prise (d'après annuaire) etat, vlans = prise_etat(adher.chbre()) f += coul(u'Chambre : ','gras') + u"%s " % chbre f += u'(%s)' % etat @@ -453,12 +453,12 @@ def adher_details(adher) : f += coul(u'VLAN : ','gras') + u'%s' % vlans f += u'\n' - # Études + # Études if adher.etudes(1).isdigit() : - f += coul(u'Études : ','gras')+ "%s %s%s\n" % \ + f += coul(u'Études : ','gras')+ "%s %s%s\n" % \ ( adher.etudes(0), adher.etudes(1), adher.etudes(2) ) elif adher.etudes(0) : - f += coul(u'Études : ','gras')+ "%s %s %s\n" % \ + f += coul(u'Études : ','gras')+ "%s %s %s\n" % \ ( adher.etudes(0), adher.etudes(1), adher.etudes(2) ) # Solde @@ -476,15 +476,15 @@ def adher_details(adher) : if d : f += coul(u"Droits sur les serveurs : ",'gras') + ', '.join(d) if adher.droitsGeles(): - f += coul(u" (droits gelés car pas cotisé cette année)",'bleu') + f += coul(u" (droits gelés car pas cotisé cette année)",'bleu') f += u'\n' # Paiement if adher.paiement() : if len(adher.paiement()) == 1 : - f += coul(u'Cotisation payée pour l\'année scolaire :','gras') + f += coul(u'Cotisation payée pour l\'année scolaire :','gras') else : - f += coul(u'Cotisation payée pour les années scolaires :','gras') + f += coul(u'Cotisation payée pour les années scolaires :','gras') g = u'' for an in adher.paiement() : g += u" %i-%i" % ( an, an+1 ) if len(g) > 35 : f += '\n\t' @@ -492,12 +492,12 @@ def adher_details(adher) : if 'p' in adher.controle(): f += coul(u' (OK)', 'vert') f += u'\n' - # Cartes d'étudiant fournie + # Cartes d'étudiant fournie if adher.carteEtudiant() : if len(adher.carteEtudiant()) == 1 : - f += coul(u"Carte d'étudiant fournie pour l'année scolaire :",'gras') + f += coul(u"Carte d'étudiant fournie pour l'année scolaire :",'gras') else : - f += coul(u"Carte d'étudiant fournie pour les années scolaires :",'gras') + f += coul(u"Carte d'étudiant fournie pour les années scolaires :",'gras') g = u'' for an in adher.carteEtudiant() : g += u" %i-%i" % ( an, an+1 ) if len(g) > 25 : f += '\n\t' @@ -521,7 +521,7 @@ def adher_details(adher) : clients_ipsec = None def ipsec_ok(machine) : - """Indique si une machine est correctement authentifiée""" + """Indique si une machine est correctement authentifiée""" prefix="" if hostname != "ragnarok": if not os.path.isfile("/usr/scripts/gestion/clef-encap"): @@ -535,7 +535,7 @@ def ipsec_ok(machine) : def machine_details(machine) : """ - Formatage du détail des propriétés d'une machine + Formatage du détail des propriétés d'une machine """ f = '' f+= coul(u'mid=%s ' % machine.id(),'bleu') @@ -557,10 +557,10 @@ def machine_details(machine) : f+= coul(u'IP : ','gras') + "%s\t\t" %machine.ip() f+= coul(u'MAC : ','gras') + "%s\n" %machine.mac() - # Propriétaire - f+= coul(u'Propriétaire : ','gras') + # Propriétaire + f+= coul(u'Propriétaire : ','gras') try : - f += machine.proprio + coul(' (adhérent détruit)', 'jaune') + f += machine.proprio + coul(' (adhérent détruit)', 'jaune') a = AssociationCrans() except : a = machine.proprietaire() @@ -579,10 +579,10 @@ def machine_details(machine) : f += coul(u'Nombre de prises : ', 'gras') f += "%d\n" % n - # Adhérent blacklisté ? + # Adhérent blacklisté ? bl = a.blacklist_actif() if bl : - f += coul(u'Restrictions sur adhérent : ','gras') + f += coul(u'Restrictions sur adhérent : ','gras') f += coul(u', '.join(bl),'rouge') f += '\n' @@ -592,8 +592,8 @@ def machine_details(machine) : f += machine.hotspot() and 'oui' or 'non' position = machine.position() if position: - f += coul(u'\t\t\tCoordonnées : ', 'gras') - f += u'%s°N, %s°E\n' % position + f += coul(u'\t\t\tCoordonnées : ', 'gras') + f += u'%s°N, %s°E\n' % position else: f += '\n' @@ -608,7 +608,7 @@ def machine_details(machine) : f += coul(u'Puissance : ','gras') + u"%4.d" % int(machine.puissance()) f += coul(u'\tCanaux : ', 'gras') + machine.canal() - f += coul(u'\tÉtat : ', 'gras') + f += coul(u'\tÉtat : ', 'gras') if borne_etat(machine.nom()): f += coul(u'borne active', 'vert') f += '\n' @@ -621,7 +621,7 @@ def machine_details(machine) : if clients and base: f += coul(u'Clients : \n','gras') for (client, rssi) in clients: - # On va chercher le nom correspondant à l'adresse MAC + # On va chercher le nom correspondant à l'adresse MAC res = base.search("mac=%s" % client)['machine'] authentification="" if not res: @@ -630,7 +630,7 @@ def machine_details(machine) : else: client_nom = ", ".join(["%s [%s]" % (x.nom().split(".")[0], x.proprietaire().Nom()) for x in res]) - # On va regarder si le client est authentifié + # On va regarder si le client est authentifié auth_ok = ipsec_ok(x) if auth_ok != None: if auth_ok: @@ -649,7 +649,7 @@ def machine_details(machine) : coul("%d" % rssi, coul_rssi), authentification) else: - f += coul(u'borne éteinte','rouge') + f += coul(u'borne éteinte','rouge') f += '\n' if machine.nvram(): f += coul(u'NVRAM : ', 'gras') @@ -659,7 +659,7 @@ def machine_details(machine) : f += coul(u'Clef IPsec : ','gras') + machine.ipsec() f += '\n' - # Ports spéciaux + # Ports spéciaux if machine.portTCPin(): f += coul(u'Ports TCP ouvert ext->machine : ','gras') + ' '.join(machine.portTCPin()) + '\n' if machine.portTCPout(): @@ -671,7 +671,7 @@ def machine_details(machine) : # Exemption d'upload if machine.exempt() : - f += coul(u'Upload exempté vers : ','gras') + ', '.join(machine.exempt()) + '\n' + f += coul(u'Upload exempté vers : ','gras') + ', '.join(machine.exempt()) + '\n' f += _blacklist(machine) f += _info(machine) @@ -681,7 +681,7 @@ def machine_details(machine) : def club_details(club) : """ - Affichage du détail des propriétés d'un club + Affichage du détail des propriétés d'un club """ f='' # Cid @@ -697,16 +697,16 @@ def club_details(club) : f += (coul(u'Imprimeurs : ', 'gras') + "%s\n" % ', '.join(map(lambda x: club.search("aid=%s" % x)['adherent'][0].Nom(), club.imprimeurs()))) - # État administratif - f += coul(u'État administratif : ','gras') + # État administratif + f += coul(u'État administratif : ','gras') jour=1 if ann_scol not in club.paiement() : if not jour : f += ' et ' - f += coul(u"charte %s/%d non signée"% (ann_scol, ann_scol+1 ),'violet') + f += coul(u"charte %s/%d non signée"% (ann_scol, ann_scol+1 ),'violet') jour = 0 if jour : - f += coul(u"à jour",'vert') + f += coul(u"à jour",'vert') f += '\n' # Chambre + prise @@ -721,7 +721,7 @@ def club_details(club) : # Paiement if club.paiement() : - f += coul(u'Charte signée pour les années scolaires :','gras') + f += coul(u'Charte signée pour les années scolaires :','gras') g = '' for an in club.paiement() : g += " %i-%i" % ( an, an+1 ) if len(g) > 35 : f += '\n\t' @@ -762,7 +762,7 @@ def club_details(club) : return f ########################################### -# Fonctions annexes de formatage de données +# Fonctions annexes de formatage de données def _blacklist(clas): """ Formatage blackliste de la classe fournie """ @@ -776,7 +776,7 @@ def _blacklist(clas): event = event.split('$') dates = strftime('%d/%m/%Y %H:%M', localtime(int(event[0]))) if event[1] == '-': - dates = u'à partir du %s' % dates + dates = u'à partir du %s' % dates else: dates = u'du %s au ' % dates dates += strftime('%d/%m/%Y %H:%M', localtime(int(event[1]))) @@ -836,14 +836,14 @@ def __bases_machines(m) : elif isinstance(m, BorneWifi): t = 'born' else : t='fixe' - # Déconnectée ? + # Déconnectée ? b = m.blacklist_actif() if not b : bl = '-' elif len(b) == 1 : bl = coul(b[0],'rouge') else : - bl = coul(u'cf détails','rouge') + bl = coul(u'cf détails','rouge') return t , bl @@ -859,14 +859,14 @@ def borne_etat(borne) : return False def borne_clients_canal(borne) : - """Renvoie la liste des adresses MAC associées à la borne ainsi que le canal. + """Renvoie la liste des adresses MAC associées à la borne ainsi que le canal. Chaque adresse MAC est en fait contenue dans un couple comprenant - l'adresse MAC et le RSSI du client associé. + l'adresse MAC et le RSSI du client associé. - On en profite pour renvoyer également le canal en cours de la - borne. On fait cela dans la même fonction car cela évite de faire - deux connexions ssh (ce qui est fort coûteux). + On en profite pour renvoyer également le canal en cours de la + borne. On fait cela dans la même fonction car cela évite de faire + deux connexions ssh (ce qui est fort coûteux). Au final, on renvoie un dictionnaire - mac-rssi: une liste de couples (MAC, RSSI) @@ -894,18 +894,18 @@ def borne_clients_canal(borne) : return {"canal": canal, "mac-rssi": macs} def prise_etat(chbre) : - """ Retoune un doublet contenant l'état de la prise associée à la chbre et les VLANs actives""" + """ Retoune un doublet contenant l'état de la prise associée à la chbre et les VLANs actives""" f = u'' vlans = u'' try: - # On met aussi l'état + # On met aussi l'état from hptools import sw_chbre, ConversationError prise = sw_chbre(chbre) vlans += ', '.join(prise.vlans()) f += u'prise %s' % prise.prise_brute rows, cols = get_screen_size() if prise.is_up() : - f += u', ' + coul(u'machine branchée','vert') + f += u', ' + coul(u'machine branchée','vert') reste_cols = cols - 45 if prise.eth_mode().find('10Mbits')!=-1 : f+= u', ' + coul(u'prise en 10Mbps','jaune') @@ -914,15 +914,15 @@ def prise_etat(chbre) : macs = prise.show_prise_mac() if len(macs) == 0: if reste_cols < 20 : - # Faut aller à la ligne + # Faut aller à la ligne f += u'\n ' - f += coul(u'aucune MAC détectée', 'jaune') + f += coul(u'aucune MAC détectée', 'jaune') else: if len(macs) == 1 and reste_cols > 25 : # Une seule mac et on a assez de place f += u"MAC: %s" % macs[0] else : - # On va à la ligne + # On va à la ligne # Combien d'adresses MAC peut-on mettre par ligne ? # Une adresse MAC =~ 20 caracteres cols -= 17 # On met 15espaces devant chaque ligne @@ -936,9 +936,9 @@ def prise_etat(chbre) : f += u"%s" % macs.pop() count += 1 elif not prise.is_enable() : - f+= u', ' + coul(u'prise désactivée','rouge') + f+= u', ' + coul(u'prise désactivée','rouge') else : - f+= u', activée, lien non détecté' + f+= u', activée, lien non détecté' except ConversationError, r: # Switch non manageable ou down f += ', ' @@ -956,7 +956,7 @@ def prise_etat(chbre) : return f, vlans ############################################################################## -## Partie dévolue au système de recherche +## Partie dévolue au système de recherche def __usage_brief(err='') : """ Message d'erreur """ @@ -1004,7 +1004,7 @@ def __usage() : accu = champ longueur = len(champ) - # Dernière ligne + # Dernière ligne liste.append(accu) cprint(__doc__ % { 'prog': sys.argv[0].split('/')[-1].split('.')[0], @@ -1015,11 +1015,11 @@ def __usage() : def __recherche() : """ - Recherche et affichage des résultats à partir des options founies (sys.argv) + Recherche et affichage des résultats à partir des options founies (sys.argv) """ global aff_ipsec, limit_aff_details, limit_aff_historique, debug - # Récupération des options + # Récupération des options if len(sys.argv) == 1 : # Pas d'option fournie __usage_brief() @@ -1045,37 +1045,37 @@ def __recherche() : # Mode debug debug = 1 elif opt == '-l' or opt =='--limit': - # Passage mode condensé, mode détaillé + # Passage mode condensé, mode détaillé try : limit_aff_details = int(val) except : - __usage_brief(u'Valeur du paramètre %s incorecte (doit être un entier positif)' % opt) + __usage_brief(u'Valeur du paramètre %s incorecte (doit être un entier positif)' % opt) elif opt == '-L' or opt =='--limit-historique': # Limitation du nombre de lignes d'historique try : limit_aff_historique = int(val) except : - __usage_brief(u'Valeur du paramètre %s incorecte (doit être un entier positif)' % opt) + __usage_brief(u'Valeur du paramètre %s incorecte (doit être un entier positif)' % opt) elif opt in [ '-a', '--adherent' ] : only_adh = 1 - cprint(u"Affichage limité aux adhérents.") + cprint(u"Affichage limité aux adhérents.") elif opt in [ '-m', '--machine' ] : only_mac = 1 - cprint(u"Affichage limité aux machines.") + cprint(u"Affichage limité aux machines.") elif opt in [ '-c', '--club' ] : only_club = 1 - cprint(u"Affichage limité aux clubs.") + cprint(u"Affichage limité aux clubs.") elif opt == '--crans' : only_crans = 1 mtech = 1 - cprint(u"Affichage limité aux machines du crans.") + cprint(u"Affichage limité aux machines du crans.") elif opt in [ '-b', '--bornes' ] : only_bornes = 1 - cprint(u"Affichage limité aux bornes wifi.") + cprint(u"Affichage limité aux bornes wifi.") # On va tenter de limiter un peu la recherche if not arg : - # Recherche initiale sans critère + # Recherche initiale sans critère arg = [ 'canal=*&host=*.crans.org'] elif arg[0].find('=')!=-1 : - # Recherche avec critères + # Recherche avec critères arg += [ '&canal=*' ] elif opt in [ '-t', '--tech' ] : # Format affichage des machines @@ -1085,13 +1085,13 @@ def __recherche() : aff_ipsec = 1 if only_adh + only_mac + only_club + only_bornes > 1 : - __usage_brief(u'Options utilisées incompatibles') + __usage_brief(u'Options utilisées incompatibles') arg = ' '.join(arg) # Cas particulier de recherche sur prise if arg.count('=') == 1 and arg.split('=')[0] == 'prise' : prise = arg.split('=')[1] - # Récupération de la chambre + # Récupération de la chambre try: from annuaires import reverse chbre = reverse(prise[0].lower())[prise[1:]] @@ -1103,7 +1103,7 @@ def __recherche() : if chbre: if len(chbre) != 1 : - cprint(u"Prise correspondante à plusieurs chambres %s" % ' '.join(chbre)) + cprint(u"Prise correspondante à plusieurs chambres %s" % ' '.join(chbre)) return # On fait la recherche sur la chambre chbre= prise[0] + chbre[0] @@ -1122,21 +1122,21 @@ def __recherche() : except ValueError, c : __usage_brief(c.args[0]) - # Traitement du résultat + # Traitement du résultat if not res['adherent'] and not res['machine'] and not res['club']: - # Pas de résultat dans la base + # Pas de résultat dans la base # Recherche sur chambre ? if arg.count('=') == 1 and arg.split('=')[0] == 'chbre' : # Affichage des infos de la chambre chbre = arg.split('=')[1] - cprint(u"Chambre %s inoccupée ou invalide (%s)" % (chbre,prise_etat(chbre)[0])) + cprint(u"Chambre %s inoccupée ou invalide (%s)" % (chbre,prise_etat(chbre)[0])) else : - cprint(u"Aucun résultat trouvé.") + cprint(u"Aucun résultat trouvé.") sys.exit(3) - # L'affichage souhaité a été précisé ? + # L'affichage souhaité a été précisé ? elif only_bornes : if not res['machine'] : - cprint(u'Aucun résultat à afficher') + cprint(u'Aucun résultat à afficher') sys.exit(4) else : if len(res['machine']) > limit_aff_details : @@ -1154,11 +1154,11 @@ def __recherche() : traite.append(a.id()) to_aff.append(m.proprietaire()) if not(to_aff) : - cprint(u'Aucun résultat à afficher') + cprint(u'Aucun résultat à afficher') sys.exit(4) aff(to_aff) elif res['club'] : - cprint(u'Aucun résultat à afficher') + cprint(u'Aucun résultat à afficher') sys.exit(4) elif only_mac : if res['machine'] : aff(res['machine'],mtech) @@ -1179,22 +1179,22 @@ def __recherche() : traite.append(a.id()) to_aff.append(m.proprietaire()) if not(to_aff) : - cprint(u'Aucun résultat à afficher') + cprint(u'Aucun résultat à afficher') sys.exit(4) aff(to_aff) elif res['adherent'] : - cprint(u'Aucun résultat à afficher') + cprint(u'Aucun résultat à afficher') sys.exit(4) # Non : on affiche tout. else : if res['adherent'] : - cprint(u"Résultats trouvés parmi les adhérents :", 'cyan') + cprint(u"Résultats trouvés parmi les adhérents :", 'cyan') aff(res['adherent']) if res['machine'] : - cprint(u"Résultats trouvés parmi les machines :", 'cyan') + cprint(u"Résultats trouvés parmi les machines :", 'cyan') aff(res['machine'],mtech) if res['club']: - cprint(u"Résultats trouvés parmi les clubs :", 'cyan') + cprint(u"Résultats trouvés parmi les clubs :", 'cyan') aff(res['club']) if __name__ == '__main__' : @@ -1214,12 +1214,12 @@ if __name__ == '__main__' : # Fin sys.exit(c) except : - cprint(u"""Une erreur fatale s'est produite durant l'exécution. -Pour l'amélioration de ce programme merci de prévenir nounou en spécifiant la -marche à suivre pour reproduire cette erreur.""") + cprint(u"""Une erreur fatale s'est produite durant l'exécution. +Pour l'amélioration de ce programme merci de prévenir nounou en spécifiant la +marche à suivre pour reproduire cette erreur.""") if debug : cprint('-'*40) - cprint(u'Détails techniques :') + cprint(u'Détails techniques :') import traceback # On veut le traceback sur la sortie standard sys.stderr = sys.stdout