From 8f32d3786b5538f6b589471025fa96a1b796265b Mon Sep 17 00:00:00 2001 From: glondu Date: Sun, 19 Mar 2006 23:59:43 +0100 Subject: [PATCH] Suite. darcs-hash:20060319225943-68412-e2be20a732f6a7ecd8818fc79ce7568189fa70e2.gz --- gestion/ldap_crans.py | 342 +++++++++++++++++++++--------------------- 1 file changed, 171 insertions(+), 171 deletions(-) diff --git a/gestion/ldap_crans.py b/gestion/ldap_crans.py index ff33074e..b1379b1f 100755 --- a/gestion/ldap_crans.py +++ b/gestion/ldap_crans.py @@ -16,7 +16,7 @@ import ldap, ldap.modlist import config, annuaires, iptools, chgpass, user_tests, cPickle from chgpass import chgpass from affich_tools import coul, prompt -from time import sleep,localtime +from time import sleep, localtime date_format='%d/%m/%Y %H:%M' hostname = gethostname().split(".")[0] @@ -94,7 +94,7 @@ def decode(s): # 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 + return s.decode('utf-8', 'ignore') # On ignore les erreurs accents = "êëèéÉÈÀÙâäàûüôöÖÔîïÎÏ'çÇÿßæÆøØ" # Si modif ici modifier aussi la fonction def strip_accents(a): @@ -145,7 +145,7 @@ def preattr(val): val = str(val).strip() # On passe tout en utf-8 pour ne pas avoir de problèmes # d'accents dans la base - return [len(val), unicode(val,'iso-8859-1').encode('utf-8')] + return [len(val), unicode(val, 'iso-8859-1').encode('utf-8')] elif t==unicode: val = val.strip() return [len(val), val.encode('utf-8')] @@ -161,11 +161,11 @@ def is_actif(sanction): bl = sanction.split(',') try: now = time.time() - debut = time.mktime( time.strptime(bl[0],date_format) ) + debut = time.mktime( time.strptime(bl[0], date_format) ) if bl[1]=='-': fin = now + 1 else: - fin = time.mktime( time.strptime(bl[1],date_format) ) + fin = time.mktime( time.strptime(bl[1], date_format) ) return debut < now and fin > now except: return False @@ -301,7 +301,7 @@ class crans_ldap: def __del__(self): # Destruction des locks résiduels - if hasattr(self,'_locks'): + if hasattr(self, '_locks'): for lock in self._locks: self.remove_lock(lock) @@ -412,7 +412,7 @@ class crans_ldap: return self.lock(item, valeur) # relock raise EnvironmentError(u'Objet (%s=%s) locké, patienter.' % (item, valeur), l) else: - if not hasattr(self,'_locks'): + if not hasattr(self, '_locks'): self._locks = [lock_dn] else: self._locks.append(lock_dn) @@ -437,7 +437,7 @@ class crans_ldap: def list_locks(self): """ Liste les locks """ - return self.conn.search_s(self.base_lock,1,'objectClass=lock') + return self.conn.search_s(self.base_lock, 1, 'objectClass=lock') def services_to_restart(self, new=None, args=[], start=0): """ @@ -461,11 +461,11 @@ class crans_ldap: serv = {} # { service: [ arguments ] } serv_dates = {} # { service: [ dates de restart ] } services = [] - for s in self.conn.search_s(self.base_services,1,'objectClass=service'): + for s in self.conn.search_s(self.base_services, 1, 'objectClass=service'): s=s[1] - serv[s['cn'][0]] = s.get('args',[]) - serv_dates[s['cn'][0]] = s.get('start',[]) - services.append(service(s['cn'][0],s.get('args',[]),s.get('start',[]))) + serv[s['cn'][0]] = s.get('args', []) + 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 if not new: return services @@ -486,7 +486,7 @@ class crans_ldap: if time.time() - time.timezone < int(date): keep_date.append(date) if keep_date: - self.conn.modify_s(remove_dn,ldap.modlist.modifyModlist({'start': serv_dates[new[1:]]}, { 'start': keep_date })) + self.conn.modify_s(remove_dn, ldap.modlist.modifyModlist({'start': serv_dates[new[1:]]}, { 'start': keep_date })) remove_dn=None if remove_dn: @@ -525,7 +525,7 @@ class crans_ldap: if modlist: try: - self.conn.modify_s(serv_dn,modlist) + self.conn.modify_s(serv_dn, modlist) except ldap.TYPE_OR_VALUE_EXISTS: # Pas grave pass @@ -537,7 +537,7 @@ class crans_ldap: 'args': args, 'start': start } ) try: - self.conn.add_s(serv_dn,modlist) + self.conn.add_s(serv_dn, modlist) except ldap.ALREADY_EXISTS: # Existe déja => rien à faire pass @@ -799,7 +799,7 @@ class crans_ldap: if graphic: from affich_tools import anim, cprint, OK if not self.__machines: # Récolte des données - if graphic: cprint('Lecture base LDAP','gras') + if graphic: cprint('Lecture base LDAP', 'gras') # Machines de l'assoce self.__machines = crans(self.conn).machines() # Machines des invités @@ -807,7 +807,7 @@ class crans_ldap: # 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 machines',len(base)) + if graphic: a = anim('\ttri machines', len(base)) for adh in base: if graphic: a.cycle() # Adhérent ayant payé l'année en cours @@ -860,7 +860,7 @@ class base_classes_crans(crans_ldap): ex: { 'upload' : (('17/11/2004 00:00','20/11/2004 00:00'), ('...', '...')) } """ - bl_liste = self._data.get('blacklist',[]) + bl_liste = self._data.get('blacklist', []) if 'machineWifi' in self._data['objectClass'] or 'machineFixe' in self._data['objectClass']: # Il faut aussi regarder la blackliste du propriétaire @@ -884,7 +884,7 @@ class base_classes_crans(crans_ldap): sanction.split(',')[1])) return (actifs, inactifs) - def blacklist(self,new=None): + def blacklist(self, new=None): """ Blacklistage de la ou de toutes la machines du propriétaire new est une liste de 4 termes: @@ -900,7 +900,7 @@ class base_classes_crans(crans_ldap): if not self._data.has_key('blacklist'): self._data['blacklist']=[] liste = list(self._data['blacklist']) - if new==None: return map(decode,liste) + if new==None: return map(decode, liste) if type(new)==tuple: # Modif @@ -908,7 +908,7 @@ class base_classes_crans(crans_ldap): new = new[1] if new=='': liste.pop(index) - self._set('blacklist',liste) + self._set('blacklist', liste) return liste else: index = -1 @@ -921,14 +921,14 @@ class base_classes_crans(crans_ldap): new[0] = time.strftime(date_format) debut=0 else: - try: debut=int(time.mktime(time.strptime(new[0],date_format))) + try: debut=int(time.mktime(time.strptime(new[0], date_format))) except: raise ValueError(u'Date de début blacklist invalide') if new[1] == 'now': new[1] = time.strftime(date_format) fin=0 elif new[1]!='-': - try: fin=int(time.mktime(time.strptime(new[1],date_format))) + try: fin=int(time.mktime(time.strptime(new[1], date_format))) except: raise ValueError(u'Date de fin blacklist invalide') else: fin = -1 @@ -951,7 +951,7 @@ class base_classes_crans(crans_ldap): if self._data['blacklist'] != liste: self._data['blacklist']=liste self.modifs.setdefault('blacklist_' + new[2], None) - if not hasattr(self,"_blacklist_restart"): + if not hasattr(self, "_blacklist_restart"): self._blacklist_restart={} if not self._blacklist_restart.has_key(new[2]): self._blacklist_restart[new[2]] = [ debut, fin ] @@ -970,9 +970,9 @@ class base_classes_crans(crans_ldap): def historique(self): """ Retourne l'historique de l'objet """ - return map(decode,self._data.get('historique',[])) + return map(decode, self._data.get('historique', [])) - def info(self,new=None): + def info(self, new=None): """ Pour ajouter une remarque new doit être la chaîne représentant la remarque à ajouter @@ -983,7 +983,7 @@ class base_classes_crans(crans_ldap): if not self._data.has_key('info'): self._data['info']=[] liste = list(self._data['info']) - if new==None: return map(decode,liste) + if new==None: return map(decode, liste) if type(new)==list: # Modif @@ -1006,7 +1006,7 @@ class base_classes_crans(crans_ldap): else: raise TypeError - self._set('info',liste) + self._set('info', liste) return liste def _save(self): @@ -1029,7 +1029,7 @@ class base_classes_crans(crans_ldap): # Cas spécial if "solde" in self.modifs: - diff = float(self._init_data.get('solde',[0])[0]) - float(self._data.get('solde',[0])[0]) + diff = float(self._init_data.get('solde', [0])[0]) - float(self._data.get('solde', [0])[0]) if diff > 0: modif['solde'] = "debit %s Euros" % str(diff) else: @@ -1045,7 +1045,7 @@ class base_classes_crans(crans_ldap): valeur_initiale = 'N/A' else: valeur_initiale = self._init_data[champ][0] - if not self._data.get(champ,[]): + if not self._data.get(champ, []): valeur_finale = 'N/A' else: valeur_finale = self._data[champ][0] @@ -1088,7 +1088,7 @@ class base_classes_crans(crans_ldap): # On loggue try: fd = file('%s/%s_%s_%s' % ("%s/logs" % config.cimetiere, str(self.__class__).split('.')[-1], - time.strftime('%Y-%m-%d-%H:%M', timestamp), self.nom()),'wb') + time.strftime('%Y-%m-%d-%H:%M', timestamp), self.nom()), 'wb') fd.write("%s\n" % self._data) fd.close() except: @@ -1096,7 +1096,7 @@ class base_classes_crans(crans_ldap): # Suffit-t-il d'ajouter un item au dernier élément de l'historique ? try: - dern = self._data['historique'][-1].split(': ',2) + dern = self._data['historique'][-1].split(': ', 2) if dern[0] == hist: # Même date et même cableur if modif not in dern[1].split(', '): @@ -1131,28 +1131,28 @@ class base_classes_crans(crans_ldap): # Ecriture modlist = ldap.modlist.addModlist(self._data) - self.conn.add_s(self.dn,modlist) + self.conn.add_s(self.dn, modlist) else: ### 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) + modlist = ldap.modlist.modifyModlist(self._init_data, self._data) try: - self.conn.modify_s(self.dn,modlist) + 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) ### 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(): + if hasattr(self, "_blacklist_restart"): + for n, t in self._blacklist_restart.items(): self.services_to_restart("blacklist_%s"%n, [], t) # Reinitialisation self._init_data = self._data.copy() - def _delete(self,dn,comment=''): + def _delete(self, dn, comment=''): """ Sauvegarde puis destruction du dn (et des sous-dn) fourni """ # Commentaires comment = preattr(comment)[1] @@ -1161,22 +1161,22 @@ class base_classes_crans(crans_ldap): # 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') + 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 - cPickle.dump(self,fd,2) + 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 # Destruction - data = self.conn.search_s(dn,2) + data = self.conn.search_s(dn, 2) data.reverse() # Necessaire pour détruire d'abord les sous-dn for r in data: self.conn.delete_s(r[0]) try: - log = open(config.cimetiere + '/index','a') + log = open(config.cimetiere + '/index', 'a') log.write(index) log.close() except: @@ -1199,7 +1199,7 @@ class base_classes_crans(crans_ldap): class base_proprietaire(base_classes_crans): """ Méthodes de bases pour les classes adherent et club """ - def __init__(self,data=(),mode='',conn=None): + 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: @@ -1239,17 +1239,17 @@ class base_proprietaire(base_classes_crans): self._init_data={} self._modifiable = 'w' - def chsh(self,new=None): + def chsh(self, new=None): """ Retourne ou change le shell de l'adhérent """ if new == None: - try: return decode(self._data.get('loginShell',[''])[0]) + try: return decode(self._data.get('loginShell', [''])[0]) except: return '' else : new = preattr(new)[1] - self._set('loginShell',[new]) + self._set('loginShell', [new]) return new - def alias(self,new=None): + def alias(self, new=None): """ Création ou visualisation des alias mail Même sytème d'argument que la méthode info. @@ -1258,7 +1258,7 @@ class base_proprietaire(base_classes_crans): self._data['mailAlias']=[] liste = list(self._data['mailAlias']) if new==None: - return map(decode,liste) + return map(decode, liste) if type(new)==list: # Modif @@ -1267,10 +1267,10 @@ class base_proprietaire(base_classes_crans): if new=='': # Supression alias liste.pop(index) - self._set('mailAlias',liste) + self._set('mailAlias', liste) return liste else: - new = new.replace('@crans.org','') + new = new.replace('@crans.org', '') index=-1 # Tests @@ -1292,9 +1292,9 @@ class base_proprietaire(base_classes_crans): liste = liste + [ new ] # Lock de mailAlias - self.lock('mailAlias',new) + self.lock('mailAlias', new) - self._set('mailAlias',liste) + self._set('mailAlias', liste) return liste def machines(self): @@ -1324,14 +1324,14 @@ class base_proprietaire(base_classes_crans): (string ou int ou float) comment est un commentaire à rajouter dans l'historique """ - solde = float(self._data.get('solde',[0])[0]) + solde = float(self._data.get('solde', [0])[0]) if operation==None: return solde # On effectue une opération try: - new = solde + float(str(operation).replace(',','.')) + new = solde + float(str(operation).replace(',', '.')) except ValueError: raise ValueError(u"Il faut donner un nombre en argument.") @@ -1339,17 +1339,17 @@ class base_proprietaire(base_classes_crans): if new < config.impression.decouvert: raise ValueError(u"Solde minimal atteind, opération non effectuée.") - self._set('solde',[str(new)], comment) + self._set('solde', [str(new)], comment) return new - def controle(self,new=None): + def controle(self, new=None): """ Controle du tresorier New est de la forme [+-][pck] (p pour le paiement, c pour la carte, k pour la caution) Retourne une chaine contenant une combinaison de p, c, k. """ - actuel = self._data.get('controle',['']) + actuel = self._data.get('controle', ['']) if not actuel: actuel = '' else: @@ -1376,11 +1376,11 @@ class base_proprietaire(base_classes_crans): if 'controle' not in self.modifs: self.modifs.setdefault('controle', None) else: - self._set('controle',[actuel]) + self._set('controle', [actuel]) return actuel - def contourneGreylist(self,contourneGreylist=None): + def contourneGreylist(self, contourneGreylist=None): """ Retourne ou change la greylist pour le compte True : contourne le GreyListing False :ne contourne pas le greylisting """ @@ -1395,14 +1395,14 @@ class base_proprietaire(base_classes_crans): # tente de modifier la valeur if contourneGreylist == True: - self._set('contourneGreylist',['OK']) + self._set('contourneGreylist', ['OK']) elif contourneGreylist == False: - self._set('contourneGreylist',[]) + self._set('contourneGreylist', []) elif contourneGreylist != None: raise ValueError, u"contourneGreylist prend un booléen comme argument" # renvoie la valeur trouvée dans la base - return bool(self._data.get('contourneGreylist',[])) + return bool(self._data.get('contourneGreylist', [])) def home(self): """ Retourne le home de l'adhérent """ @@ -1418,28 +1418,28 @@ class base_proprietaire(base_classes_crans): return self._data['uidNumber'][0] - def paiement(self,action=None): + 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 """ - return self._an('paiement',action) + return self._an('paiement', action) - def delete(self,comment=''): + def delete(self, comment=''): """Destruction du proprietaire""" for m in self.machines(): # Destruction machines m.delete(comment) - self._delete(self.dn,comment) + self._delete(self.dn, comment) try: if self.compte(): args = self._data['uid'][0] + ',' args+= self._data['homeDirectory'][0] - self.services_to_restart('del_user',[ args ] ) + self.services_to_restart('del_user', [ args ] ) except: # Si ne peux avoir de compte pass @@ -1463,7 +1463,7 @@ class base_proprietaire(base_classes_crans): else: nouveau = 1 - if 'chbre' in self.modifs and '????' in [ self._init_data.get("chbre",[''])[0] , self._init_data.get("chbre",[''])[0] ]: + if 'chbre' in self.modifs and '????' in [ self._init_data.get("chbre", [''])[0] , self._init_data.get("chbre", [''])[0] ]: self.services_to_restart('bl_chbre_invalide') # Enregistrement @@ -1475,7 +1475,7 @@ class base_proprietaire(base_classes_crans): if self.idn !='cid' and self.etudes(1) != "Pers": # Mail de bienvenue - self.services_to_restart('mail_bienvenue',[self.mail().encode('iso-8859-15')]) + 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') @@ -1488,13 +1488,13 @@ class base_proprietaire(base_classes_crans): if 'paiement' in self.modifs or (config.bl_carte_et_definitif and test_carte): for m in self.machines(): - self.services_to_restart('macip',[m.ip()] ) + self.services_to_restart('macip', [m.ip()] ) self.services_to_restart('dns') if isinstance(m, MachineWifi): self.services_to_restart('conf_wifi_ng') self.services_to_restart('ragnarok-dhcp') else: - self.services_to_restart('switch',[self.chbre()]) + self.services_to_restart('switch', [self.chbre()]) self.services_to_restart('rouge-dhcp') # Vérification si changement de bât, ce qui obligerai un changement d'IP @@ -1528,24 +1528,24 @@ class base_proprietaire(base_classes_crans): args = self._data['homeDirectory'][0] + ',' args+= self._data['uidNumber'][0] + ',' args+= self._data['uid'][0] - self.services_to_restart('home',[ args ]) - r = prompt(u"Attribuer tout de suite un mot de passe ? [O/N]","O") + self.services_to_restart('home', [ args ]) + r = prompt(u"Attribuer tout de suite un mot de passe ? [O/N]", "O") 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]]) + self.services_to_restart('mail_modif', ['uid=%s' % self._data['uid'][0]]) # Remise à zero self.modifs = {} return ret - def _an(self,champ,action): + def _an(self, champ, action): """ Champ est un champ contenant une liste d'entiers Action est un entier représentant une année @@ -1556,7 +1556,7 @@ class base_proprietaire(base_classes_crans): trans=[] else: # On va travailler sur une liste d'entiers - trans = map(int,self._data[champ]) + trans = map(int, self._data[champ]) if action==None: return trans @@ -1592,25 +1592,25 @@ class adherent(base_proprietaire): """ Retourne prenom nom """ return "%s %s" % ( self.prenom() , self.nom() ) - def nom(self,new=None): - return self.__nom_prenom('nom',new) + def nom(self, new=None): + return self.__nom_prenom('nom', new) - def prenom(self,new=None): - return self.__nom_prenom('prenom',new) + def prenom(self, new=None): + return self.__nom_prenom('prenom', new) - def __nom_prenom(self,champ,new): + def __nom_prenom(self, champ, new): if new == None: - return decode(self._data.get(champ,[''])[0]) + return decode(self._data.get(champ, [''])[0]) l, new = preattr(new) 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'): @@ -1618,24 +1618,24 @@ class adherent(base_proprietaire): self._data['gecos'] = [ preattr(gecos)[1] + ',,,' ] return new - def tel(self,new=None): + def tel(self, new=None): if new==None: - return self._data.get('tel',[''])[0] + return self._data.get('tel', [''])[0] 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).") - self._set('tel',[new]) + self._set('tel', [new]) return new - def chbre(self,new=None): + def chbre(self, new=None): """ 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]) + return decode(self._data.get('chbre', [''])[0]) l, new = preattr(new) if l==0: @@ -1648,11 +1648,11 @@ class adherent(base_proprietaire): # if not isinstance(m, MachineWifi): # raise ValueError(u'Un adhérent en dehors du campus ne doit pas avoir de machine fixe.') - self._set('chbre',['EXT']) + self._set('chbre', ['EXT']) return 'EXT' elif new.upper() == '????': # On ne sait pas ou est l'adhérent - self._set('chbre',['????']) + self._set('chbre', ['????']) return '????' new = new.capitalize() @@ -1674,7 +1674,7 @@ class adherent(base_proprietaire): aide += c.ljust(5) a=a+1 aide += u'\n' - aide += u" " + annuaires.aide.get(bat,'') + aide += u" " + annuaires.aide.get(bat, '') raise ValueError(aide) else: @@ -1686,37 +1686,37 @@ class adherent(base_proprietaire): search = test[0].split(',')[0] if search.split('=')[0]!='aid': raise ValueError(u'Chambre déjà occupée.') - adh = self.search(search,self._modifiable)['adherent'] + adh = self.search(search, self._modifiable)['adherent'] if len(adh) != 1: 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) + self.lock('chbre', new) - self._set('chbre',[new]) + self._set('chbre', [new]) return new - def adresse(self,new=None): + 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 """ if new==None: if self.chbre() != 'EXT': # Personne sur le campus - return [u'',u'',u'',u''] + return [u'', u'', u'', u''] else: - addr = self._data.get('postalAddress', ['','','',''])[:4] + addr = self._data.get('postalAddress', ['','', '', ''])[:4] if len(addr) < 4: addr = addr + ['']*(4-len(addr)) - return map(decode,addr) + return map(decode, addr) if type(new)!=list and len(new)!=4: raise TypeError l_min = [ 2, 0, 5, 2 ] - for i in range(0,4): + for i in range(0, 4): l, new[i] = preattr(new[i]) if l < l_min[i]: raise ValueError(u"Adresse incorrecte.") @@ -1724,12 +1724,12 @@ class adherent(base_proprietaire): if not new[1]: new[1] = ' ' - self._set('postalAddress',new) + self._set('postalAddress', new) return new - def mail(self,new=None): + def mail(self, new=None): if new==None: - return decode(self._data.get('mail',[''])[0]) + return decode(self._data.get('mail', [''])[0]) l, new = preattr(new) new = new.lower() @@ -1754,12 +1754,12 @@ class adherent(base_proprietaire): raise ValueError(u"Caractère interdits dans l'adresse mail (%s)." % l) # Pour les vicieux - if sre.match('.*crans.(org|ens-cachan.fr)$',new): + if sre.match('.*crans.(org|ens-cachan.fr)$', new): raise ValueError(u"Adresse mail @crans interdite ici") # Il ne doit pas y avoir de compte self.supprimer_compte() - self._set('mail',[new]) + self._set('mail', [new]) return new @@ -1782,11 +1782,11 @@ class adherent(base_proprietaire): self._set('mail', ['']) self._data['objectClass'] = [ 'adherent' ] - for c in [ 'uid', 'cn', 'shadowLastChange', 'shadowMax', 'shadowWarning', 'loginShell', 'userPassword', 'uidNumber', 'gidNumber', 'homeDirectory', 'gecos', 'droits','mailAlias', 'cannonicalAlias' ]: + for c in [ 'uid', 'cn', 'shadowLastChange', 'shadowMax', 'shadowWarning', 'loginShell', 'userPassword', 'uidNumber', 'gidNumber', 'homeDirectory', 'gecos', 'droits', 'mailAlias', 'cannonicalAlias' ]: try: self._data.pop(c) except: pass - def etudes(self,index_or_new): + def etudes(self, index_or_new): """ Retourne l'un des 3 champs études (selon index_or_new si entier) """ @@ -1800,30 +1800,30 @@ class adherent(base_proprietaire): raise TypeError if not self._data.has_key('etudes'): - self._data['etudes']=['','',''] + self._data['etudes']=['', '', ''] # 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.") - new = ['','',''] - for i in range(0,3): + new = ['', '', ''] + for i in range(0, 3): n = preattr(index_or_new[i])[1] if n in new or n=='': raise ValueError(u"Etudes non valides.") new[i] = n - self._set('etudes',new) + self._set('etudes', new) return new - def carteEtudiant(self,action=None): + 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 """ - return self._an('carteEtudiant',action) + return self._an('carteEtudiant', action) def checkPassword(self, password): """Vérifie le mot de passe de l'adhérent""" @@ -1909,7 +1909,7 @@ class adherent(base_proprietaire): if self.exist('(uidNumber=%s)' % uidNumber): raise ValueError(u'uidNumber pris') else: - pool_uid = range(1001,9999) + pool_uid = range(1001, 9999) random.shuffle(pool_uid) while len(pool_uid) > 0: uidNumber = pool_uid.pop() # On choisit une IP @@ -1921,10 +1921,10 @@ class adherent(base_proprietaire): raise ValueError(u"Plus d'uid disponibles !") try: - self.lock('uidNumber',str(uidNumber)) + self.lock('uidNumber', str(uidNumber)) except: # Quelqu'un nous a piqué l'uid que l'on venait de choisir ! - return self.compte(login,uidNumber,hash_pass,shell) + return self.compte(login, uidNumber, hash_pass, shell) self._data['uidNumber']= [str(uidNumber)] self._data['gidNumber'] = [str(config.gid)] @@ -1935,7 +1935,7 @@ class adherent(base_proprietaire): return decode(login) - def cannonical_alias(self,new=None): + def cannonical_alias(self, new=None): """ Retourne ou défini l'alias canonique""" if new == None: try: return decode(self._data['cannonicalAlias'][0]) @@ -1948,16 +1948,16 @@ class adherent(base_proprietaire): # Attribution de l'alias, sinon on passe # Lock de cannonicalAlias - self.lock('cannonicalAlias',a) + self.lock('cannonicalAlias', a) # Attribution - self._set('cannonicalAlias',[a]) + self._set('cannonicalAlias', [a]) return a - def droits(self,droits=None): + def droits(self, droits=None): """ droits est la liste des droits à donner à l'utilisateur """ if droits==None: - return map(decode,self._data.get('droits',[])) + return map(decode, self._data.get('droits', [])) if not isadm: raise EnvironmentError(u'Il faut être administrateur pour effectuer cette opération.') @@ -1968,17 +1968,17 @@ class adherent(base_proprietaire): new = [] for droit in droits: if droit == '': continue - droit = unicode(droit.strip(),'iso-8859-15') + droit = unicode(droit.strip(), 'iso-8859-15') if droit not in droits_possibles: raise ValueError(u'Droit %s incorrect' % droit) new.append(droit.encode('utf-8')) - if new != self._data.get('droits',[]): - self._set('droits',new) + if new != self._data.get('droits', []): + self._set('droits', new) return new - def rewriteMailHeaders(self,rewrite=None): + 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 """ @@ -1989,14 +1989,14 @@ class adherent(base_proprietaire): # tente de modifier la valeur if rewrite == True: - self._set('rewriteMailHeaders',['oui']) + self._set('rewriteMailHeaders', ['oui']) elif rewrite == False: - self._set('rewriteMailHeaders',['non']) + self._set('rewriteMailHeaders', ['non']) elif rewrite!=None: raise ValueError, u"rewriteMailHeaders prend un booléen comme argument" # renvoie la valeur trouvée dans la base - return self._data.get('rewriteMailHeaders',['oui']) == ['oui'] + return self._data.get('rewriteMailHeaders', ['oui']) == ['oui'] class club(base_proprietaire): """ Classe de définition d'un club """ @@ -2004,17 +2004,17 @@ class club(base_proprietaire): filtre_idn = '(objectClass=club)' objectClass = 'club' - def Nom(self,new=None): + def Nom(self, new=None): """ Défini ou retourne le nom du club """ if new==None: - return decode(self._data.get('nom',[''])[0]) + return decode(self._data.get('nom', [''])[0]) l, new = preattr(new) new = new.capitalize() if l<2: raise ValueError(u"Nom trop court.") - self._set('nom',[new]) + self._set('nom', [new]) return new def etudes(*args): @@ -2025,13 +2025,13 @@ class club(base_proprietaire): """ Retourne le nom du club, utilisé lors de la destruction """ return strip_accents(self.Nom()) - def carteEtudiant(self,pd=None): + def carteEtudiant(self, pd=None): return [ ann_scol ] - def responsable(self,adher=None): + def responsable(self, adher=None): """ Responsable du club, adher doit être une instance de la classe adhérent """ if adher==None: - aid = decode(self._data.get('responsable',[''])[0]) + aid = decode(self._data.get('responsable', [''])[0]) if aid: return self.search('aid=%s' % aid)['adherent'][0] else: return '' @@ -2042,32 +2042,32 @@ class club(base_proprietaire): if not adher.id(): raise AttributeError(u'Adhérent invalide') - self._set('responsable',[adher.id()]) + self._set('responsable', [adher.id()]) return adher - def chbre(self,new=None): + def chbre(self, new=None): """ 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]) + return decode(self._data.get('chbre', [''])[0]) annu = annuaires.locaux_clubs() if new not in annu.keys(): - raise ValueError(u'Local invalide',annu) + raise ValueError(u'Local invalide', annu) - self._set('chbre',[new]) + self._set('chbre', [new]) return new def local(self): """ 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(),'')) + return decode(annu.get(self.chbre(), '')) - def compte(self,login=None): + def compte(self, login=None): """ Créé un compte au club sur vert""" if login==None: - return self._data.get('uid',[''])[0] + return self._data.get('uid', [''])[0] # Génération du login : club- login = login.lower() @@ -2086,17 +2086,17 @@ class club(base_proprietaire): 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) + raise ValueError(u"Login existant ou correspondant à un alias mail.", 1) - home = '/home/' + login.replace('-','/',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) + self.lock('mail', login) if not 'compte' in self.modifs: self.modifs.setdefault('compte', None) @@ -2111,7 +2111,7 @@ class club(base_proprietaire): while self.exist('(uidNumber=%s)' % uidNumber): uidNumber += 1 try: - self.lock('uidNumber',str(uidNumber)) + self.lock('uidNumber', str(uidNumber)) except: # Quelqu'un nous a piqué l'uid que l'on venait de choisir ! return self.compte(login) @@ -2219,17 +2219,17 @@ class Machine(base_classes_crans): """ if mac == None: - return decode(self._data.get('macAddress',[''])[0]) + return decode(self._data.get('macAddress', [''])[0]) mac = format_mac(mac) # 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 ? 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) @@ -2239,25 +2239,25 @@ class Machine(base_classes_crans): try: for line in open('/usr/scripts/gestion/ethercodes.dat').readlines(): if line.startswith(prefix): - vendor = line.replace(prefix,'').replace('( )','').strip() + vendor = line.replace(prefix, '').replace('( )', '').strip() break except IOError: # Le fichier existe pas, on sors raise RuntimeError(u"Fichier de fabiquants de MAC non trouvé !") if 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.",2) + 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.", 2) # Lock de la mac - self.lock('macAddress',mac) + self.lock('macAddress', mac) - self._set('macAddress',[mac]) + self._set('macAddress', [mac]) return mac def __host_alias(self, champ, new): """ Vérification de la validité d'un nom de machine """ # Supression des accents - new = strip_accents(unicode(new,'iso-8859-15')) + new = strip_accents(unicode(new, 'iso-8859-15')) l, new = preattr(new) new = new.lower() @@ -2267,7 +2267,7 @@ class Machine(base_classes_crans): raise ValueError(u"%s trop court." % champ.capitalize()) if self.proprietaire().__class__ != crans: - new = new.split('.',1)[0] + 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) @@ -2290,7 +2290,7 @@ class Machine(base_classes_crans): raise ValueError(u"%s : nom déjà pris" % champ.capitalize()) # Lock host - self.lock('host',new) + self.lock('host', new) return new @@ -2444,7 +2444,7 @@ class Machine(base_classes_crans): # 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) - if not iptools.AddrInNet(ip,net): + if not iptools.AddrInNet(ip, net): raise ValueError(u'IP invalide ou en dehors du sous-réseau alloué.', 1) # Reformatage ip = iptools.DecToQuad(iptools.QuadToDec(ip)) @@ -2453,7 +2453,7 @@ class Machine(base_classes_crans): raise ValueError(u'IP déjà prise.') # Lock ip - self.lock('ipHostNumber',ip) + self.lock('ipHostNumber', ip) self._set('ipHostNumber', [ip]) return ip @@ -2775,13 +2775,13 @@ class BorneWifi(Machine): lcanal.append(i) new = 0 for c in lcanal: - if c not in range(0,14): + if c not in range(0, 14): raise new = new + (1 << (c - 1)) except: raise ValueError(u'Canal invalide : doit être entre 0 et 13 ou une liste de canaux') - self._set('canal',[str(new)]) + self._set('canal', [str(new)]) return new def puissance(self, new=None): @@ -2826,7 +2826,7 @@ class BorneWifi(Machine): class _fake_proprio(crans_ldap): """ Définitions de base d'un propriétaire virtuel """ idn = '' - def __init__(s,conn=None): + def __init__(s, conn=None): s.conn = conn if not s.conn: s.connect() @@ -2841,10 +2841,10 @@ class _fake_proprio(crans_ldap): return [ ann_scol ] def blacklist_actif(s): return [] - def mail(self,new=None): + def mail(self, new=None): return 'roots@crans.org' def machines(s): - res = s.conn.search_s(s.dn,1,'objectClass=machine') + res = s.conn.search_s(s.dn, 1, 'objectClass=machine') m = [] for r in res: if r[1].has_key('puissance'): @@ -2855,7 +2855,7 @@ class _fake_proprio(crans_ldap): class crans(_fake_proprio): """ Classe définissant l'assoce (pour affichage de ses machines) """ - def __init__(s,conn=None): + def __init__(s, conn=None): s.conn = conn if not s.conn: s.connect() @@ -2892,7 +2892,7 @@ if __name__ == '__main__': print "Liste des locks" db = crans_ldap() for lock in db.list_locks(): - print "%s\t %s" % (lock[1]["lockid"][0],lock[0].split(',')[0]) + print "%s\t %s" % (lock[1]["lockid"][0], lock[0].split(',')[0]) elif '--purgelock' in sys.argv: print "Suppression de tous les locks" @@ -2902,7 +2902,7 @@ if __name__ == '__main__': elif '--menage' in sys.argv: print "Ménage des machines des adhérents partis..." db = crans_ldap() - machines=db.search('paiement!=%s&host=*.crans.org' % ann_scol ,'w')['machine'] + machines=db.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()