From 5bf2e284f9124bf6f527a53a195156d9aa82d301 Mon Sep 17 00:00:00 2001 From: glondu Date: Tue, 21 Mar 2006 02:21:53 +0100 Subject: [PATCH] Correction canonicalAlias, ajout cransAccount, esthtisme. darcs-hash:20060321012153-68412-185e90e71297e14e330197c2cf365e9495893b31.gz --- gestion/ldap_crans.py | 180 +++++++++++++++++++++--------------------- 1 file changed, 90 insertions(+), 90 deletions(-) diff --git a/gestion/ldap_crans.py b/gestion/ldap_crans.py index b6b33247..3a92a757 100755 --- a/gestion/ldap_crans.py +++ b/gestion/ldap_crans.py @@ -18,7 +18,7 @@ from chgpass import chgpass from affich_tools import coul, prompt from time import sleep, localtime -date_format='%d/%m/%Y %H:%M' +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 @@ -115,7 +115,7 @@ def mailexist(mail): """ try: - s=smtplib.SMTP(smtpserv) + s = smtplib.SMTP(smtpserv) r = s.vrfy(mail) s.close() except: @@ -138,15 +138,15 @@ def preattr(val): t = type(val) - if t==list and len(val)==1: + if t == list and len(val) == 1: return preattr(val[0]) - elif t==str or t==int: + elif t == str or t == int: 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')] - elif t==unicode: + elif t == unicode: val = val.strip() return [len(val), val.encode('utf-8')] else: @@ -162,7 +162,7 @@ def is_actif(sanction): try: now = time.time() debut = time.mktime( time.strptime(bl[0], date_format) ) - if bl[1]=='-': + if bl[1] == '-': fin = now + 1 else: fin = time.mktime( time.strptime(bl[1], date_format) ) @@ -203,7 +203,7 @@ def format_mac(mac): class service: """ Définit un service à redémarrer """ - def __init__(self, nom, args=[], start=[]): + def __init__(self, nom, args = [], start = []): """ Nom du service Liste des arguments @@ -256,7 +256,7 @@ class crans_ldap: auto_search_champs = { \ 'adherent': \ - ['nom', 'prenom', 'tel', 'mail', 'chbre', 'mailAlias', 'cannonicalAlias' ], + ['nom', 'prenom', 'tel', 'mail', 'chbre', 'mailAlias', 'canonicalAlias' ], 'club': ['nom', 'chbre'], 'machineFixe': auto_search_machines_champs, 'machineWifi': auto_search_machines_champs, @@ -377,7 +377,7 @@ class crans_ldap: Lock un item avec la valeur valeur, les items possibles peuvent être : - aid $ chbre $ mail $ mailAlias $ cannonicalAlias $ + aid $ chbre $ mail $ mailAlias $ canonicalAlias $ mid $ macAddress $ host $ hostAlias $ ipHostNumber Retourne le dn du lock @@ -462,7 +462,7 @@ class crans_ldap: serv_dates = {} # { service: [ dates de restart ] } services = [] for s in self.conn.search_s(self.base_services, 1, 'objectClass=service'): - s=s[1] + 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', []))) @@ -474,20 +474,20 @@ class crans_ldap: if new[0] == '-': if new[1] == '-': # Double -- on enlève quelque soit la date - remove_dn='cn=%s,%s' % ( new[2:], self.base_services ) + remove_dn = 'cn=%s,%s' % ( new[2:], self.base_services ) else: # On enlève uniquement si la date est passée - remove_dn='cn=%s,%s' % ( new[1:], self.base_services ) + remove_dn = 'cn=%s,%s' % ( new[1:], self.base_services ) if not serv.has_key(new[1:]): # Existe pas => rien à faire return - keep_date=[] + keep_date = [] for date in serv_dates[new[1:]]: 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 })) - remove_dn=None + remove_dn = None if remove_dn: # Suppression @@ -500,9 +500,9 @@ class crans_ldap: # Petite fonction à appliquer aux arguments if type(args) == str: args = [ args ] - args=map(lambda x:preattr(x)[1], args) + args = map(lambda x:preattr(x)[1], args) if type(start) == int: start = [ start ] - start=map(lambda x:preattr(x)[1], start) + start = map(lambda x:preattr(x)[1], start) if new in serv.keys(): modlist = [] @@ -828,7 +828,7 @@ class base_classes_crans(crans_ldap): 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 """ - return self.__class__==autre.__class__ and self.id()==autre.id() + 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)""" @@ -898,15 +898,15 @@ class base_classes_crans(crans_ldap): l'index est celui obtenu dans la liste retournée par blacklist() """ if not self._data.has_key('blacklist'): - self._data['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: + if type(new) == tuple: # Modif index = new[0] new = new[1] - if new=='': + if new == '': liste.pop(index) self._set('blacklist', liste) return liste @@ -919,16 +919,16 @@ class base_classes_crans(crans_ldap): # Verif que les dates sont OK if new[0] == 'now': new[0] = time.strftime(date_format) - debut=0 + 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 + 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 @@ -938,7 +938,7 @@ class base_classes_crans(crans_ldap): # On prend en compte le fuseau horaire et on dépasse la fin # de sanction d'1min pour être sur quelle périmé. - fin=fin+60-time.timezone + fin = fin+60-time.timezone new_c = ','.join(new) new_c = preattr(new_c)[1] @@ -949,10 +949,10 @@ class base_classes_crans(crans_ldap): liste = liste + [ new_c ] if self._data['blacklist'] != liste: - self._data['blacklist']=liste + self._data['blacklist'] = liste self.modifs.setdefault('blacklist_' + new[2], None) if not hasattr(self, "_blacklist_restart"): - self._blacklist_restart={} + self._blacklist_restart = {} if not self._blacklist_restart.has_key(new[2]): self._blacklist_restart[new[2]] = [ debut, fin ] else: @@ -981,11 +981,11 @@ class base_classes_crans(crans_ldap): l'index est celui obtenu dans la liste retournée par info() """ if not self._data.has_key('info'): - self._data['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: + if type(new) == list: # Modif index = new[0] l, new = preattr(new[1]) @@ -994,15 +994,15 @@ class base_classes_crans(crans_ldap): liste.pop(index) else: # Modif remarque - liste[index]=new - elif type(new)==str: + liste[index] = new + elif type(new) == str: # Remarque supplémentaire l, new = preattr(new) if not new: # On ajoute pas de remarque vide return liste # Ajout à la liste - liste = liste + [ new ] + liste = liste + [new] else: raise TypeError @@ -1114,11 +1114,11 @@ class base_classes_crans(crans_ldap): ### Nouvel enregistrement # Génération du dn res = self.conn.search_s(self.base_dn, 2, self.filtre_idn) - vidn=1 - vidns=[] + vidn = 1 + vidns = [] # Liste des dn pris for r in res: - # r=( dn, {} ) + # r = ( dn, {} ) r = r[0].split(',')[0] if r[:4] != '%s=' % self.idn: continue vidns.append(int(r[4:])) @@ -1126,7 +1126,7 @@ class base_classes_crans(crans_ldap): while vidn in vidns: vidn += 1 - self.dn='%s=%s,%s' % (self.idn, vidn, self.dn) + self.dn = '%s=%s,%s' % (self.idn, vidn, self.dn) self._data[self.idn]= [ '%d' % vidn ] # Ecriture @@ -1186,7 +1186,7 @@ class base_classes_crans(crans_ldap): """ Met à jour les données de data et modifie modifs si besoin """ if (not self._data.has_key(champ) and val != []) \ or (self._data.has_key(champ) and self._data[champ]!=val): - self._data[champ]=val + self._data[champ] = val if self.modifs.get(champ) == None or comment == None: self.modifs[champ] = comment else: @@ -1220,7 +1220,7 @@ class base_proprietaire(base_classes_crans): self.modifs = {} if data: - self.dn=data[0] + self.dn = data[0] if mode == 'w': try: self.lock(self.idn, self.id()) @@ -1234,9 +1234,9 @@ class base_proprietaire(base_classes_crans): self._data = data[1] else: # Propriétaire vide - self.dn='' # Génération du reste au moment de l'écriture - self._data={ 'objectClass': [ self.objectClass ] } - self._init_data={} + 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): @@ -1255,23 +1255,23 @@ class base_proprietaire(base_classes_crans): Même sytème d'argument que la méthode info. """ if not self._data.has_key('mailAlias'): - self._data['mailAlias']=[] + self._data['mailAlias'] = [] liste = list(self._data['mailAlias']) - if new==None: + if new == None: return map(decode, liste) - if type(new)==list: + if type(new) == list: # Modif index = new[0] new = new[1] - if new=='': + if new == '': # Supression alias liste.pop(index) self._set('mailAlias', liste) return liste else: new = new.replace('@crans.org', '') - index=-1 + index = -1 # Tests l, new = preattr(new) @@ -1287,7 +1287,7 @@ class base_proprietaire(base_classes_crans): raise ValueError(u"Alias existant ou correspondand à un compte.") if index!=-1: - liste[index]=new + liste[index] = new else: liste = liste + [ new ] @@ -1326,7 +1326,7 @@ class base_proprietaire(base_classes_crans): """ solde = float(self._data.get('solde', [0])[0]) - if operation==None: + if operation == None: return solde # On effectue une opération @@ -1355,7 +1355,7 @@ class base_proprietaire(base_classes_crans): else: actuel = actuel[0] - if new==None: + if new == None: return actuel if not sre.match(r'^[+-][pck]$', new): @@ -1530,7 +1530,7 @@ class base_proprietaire(base_classes_crans): 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") - if r=='O' or r=='o': + if r == 'O' or r == 'o': chgpass(self.dn) else: ret += coul(u' Il faudra penser à attribuer un mot de passe\n', 'jaune') @@ -1553,12 +1553,12 @@ class base_proprietaire(base_classes_crans): si négatif le supprime """ if not self._data.has_key(champ): - trans=[] + trans = [] else: # On va travailler sur une liste d'entiers trans = map(int, self._data[champ]) - if action==None: + if action == None: return trans if type(action)!=int: raise TypeError @@ -1619,7 +1619,7 @@ class adherent(base_proprietaire): return new def tel(self, new=None): - if new==None: + if new == None: return self._data.get('tel', [''])[0] if new != 'inconnu': @@ -1634,11 +1634,11 @@ class adherent(base_proprietaire): """ Défini la chambre d'un adhérent, EXT pour personne extérieure au campus """ - if new==None: + if new == None: return decode(self._data.get('chbre', [''])[0]) l, new = preattr(new) - if l==0: + if l == 0: raise ValueError(u"Chambre incorrecte.") if new.upper() == 'EXT': @@ -1664,7 +1664,7 @@ class adherent(base_proprietaire): if new[1:] not in chbres or len(new)<4 or not new[1:4].isdigit(): chbres.sort() aide = u"Chambre inconnue dans le batiment, les chambres valides sont :" - a=0 + a = 0 for c in chbres: if len(c)>=3 and not c[:3].isdigit(): # C'est un local club @@ -1672,7 +1672,7 @@ class adherent(base_proprietaire): if int(a/14)>int((a-1)/14): aide += '\n ' if c[0]!='X': aide += c.ljust(5) - a=a+1 + a = a+1 aide += u'\n' aide += u" " + annuaires.aide.get(bat, '') raise ValueError(aide) @@ -1702,7 +1702,7 @@ class adherent(base_proprietaire): """ 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 new == None: if self.chbre() != 'EXT': # Personne sur le campus return [u'', u'', u'', u''] @@ -1728,23 +1728,23 @@ class adherent(base_proprietaire): return new def mail(self, new=None): - if new==None: + if new == None: return decode(self._data.get('mail', [''])[0]) l, new = preattr(new) new = new.lower() #Emplacement de l'@ - a=new.find('@') + a = new.find('@') #Emplacement du . final - b=new.rfind('.') + b = new.rfind('.') # Les tests : # exactement un @ # 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 not ( l-b == 4 or l-b == 3) \ or a<1 or b-a<2: raise ValueError(u"Adresse mail incorrecte.") @@ -1782,7 +1782,7 @@ 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', 'canonicalAlias' ]: try: self._data.pop(c) except: pass @@ -1790,7 +1790,7 @@ class adherent(base_proprietaire): """ Retourne l'un des 3 champs études (selon index_or_new si entier) """ - if type(index_or_new)==int: + if type(index_or_new) == int: if self._data.has_key('etudes'): return decode(self._data['etudes'][index_or_new]) else: @@ -1800,7 +1800,7 @@ 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: @@ -1809,7 +1809,7 @@ class adherent(base_proprietaire): new = ['', '', ''] for i in range(0, 3): n = preattr(index_or_new[i])[1] - if n in new or n=='': + if n in new or n == '': raise ValueError(u"Etudes non valides.") new[i] = n @@ -1890,12 +1890,12 @@ class adherent(base_proprietaire): if not 'compte' in self.modifs: self.modifs.setdefault('compte', None) - # Création de l'alias cannonique + # Création de l'alias canonique if self.nom() and self.prenom(): a = '%s.%s' % (self.prenom().capitalize(), self.nom().capitalize()) - self.cannonical_alias(a) + self.canonical_alias(a) - self._data['objectClass'] = ['adherent', 'posixAccount', 'shadowAccount'] + self._data['objectClass'] = ['adherent', 'cransAccount', 'posixAccount', 'shadowAccount'] self._data['uid'] = [login] self._data['cn'] = [preattr(self.Nom())[1]] #self._data['shadowLastChange'] = [ '12632' ] @@ -1929,16 +1929,16 @@ class adherent(base_proprietaire): self._data['uidNumber']= [str(uidNumber)] self._data['gidNumber'] = [str(config.gid)] - self._data['homeDirectory']=[ preattr(home)[1] ] + self._data['homeDirectory'] = [ preattr(home)[1] ] gecos = '%s %s' % tuple(map(lambda x: strip_accents(x.capitalize()), (self.prenom(), self.nom()))) self._data['gecos'] = [ preattr(gecos)[1] + ',,,' ] return decode(login) - def cannonical_alias(self, new=None): + def canonical_alias(self, new=None): """ Retourne ou défini l'alias canonique""" if new == None: - try: return decode(self._data['cannonicalAlias'][0]) + try: return decode(self._data['canonicalAlias'][0]) except: return '' else : a = strip_accents(new) @@ -1947,16 +1947,16 @@ class adherent(base_proprietaire): if not mailexist(a): # Attribution de l'alias, sinon on passe - # Lock de cannonicalAlias - self.lock('cannonicalAlias', a) + # Lock de canonicalAlias + self.lock('canonicalAlias', a) # Attribution - self._set('cannonicalAlias', [a]) + self._set('canonicalAlias', [a]) return a def droits(self, droits=None): """ droits est la liste des droits à donner à l'utilisateur """ - if droits==None: + if droits == None: return map(decode, self._data.get('droits', [])) if not isadm: @@ -2006,7 +2006,7 @@ class club(base_proprietaire): def Nom(self, new=None): """ Défini ou retourne le nom du club """ - if new==None: + if new == None: return decode(self._data.get('nom', [''])[0]) l, new = preattr(new) @@ -2030,7 +2030,7 @@ class club(base_proprietaire): def responsable(self, adher=None): """ Responsable du club, adher doit être une instance de la classe adhérent """ - if adher==None: + if adher == None: aid = decode(self._data.get('responsable', [''])[0]) if aid: return self.search('aid=%s' % aid)['adherent'][0] @@ -2048,7 +2048,7 @@ class club(base_proprietaire): 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: + if new == None: return decode(self._data.get('chbre', [''])[0]) annu = annuaires.locaux_clubs() @@ -2066,7 +2066,7 @@ class club(base_proprietaire): def compte(self, login=None): """ Créé un compte au club sur vert""" - if login==None: + if login == None: return self._data.get('uid', [''])[0] # Génération du login : club- @@ -2101,7 +2101,7 @@ class club(base_proprietaire): if not 'compte' in self.modifs: self.modifs.setdefault('compte', None) - self._data['objectClass'] = [ 'club', 'posixAccount', 'shadowAccount' ] + self._data['objectClass'] = ['club', 'cransAccount', 'posixAccount', 'shadowAccount'] self._data['uid'] = [ login ] self._data['cn'] = [ preattr(self.Nom())[1] ] self._data['loginShell' ] = [ config.club_login_shell ] @@ -2117,8 +2117,8 @@ class club(base_proprietaire): return self.compte(login) self._data['uidNumber']= [ str(uidNumber) ] - self._data['gidNumber']=[ str(config.club_gid) ] - self._data['homeDirectory']=[ preattr(home)[1] ] + self._data['gidNumber'] = [ str(config.club_gid) ] + self._data['homeDirectory'] = [ preattr(home)[1] ] return decode(login) @@ -2185,8 +2185,8 @@ class Machine(base_classes_crans): # Machine vide self.__proprietaire = parent_or_tuple self.dn = parent_or_tuple.dn - self._data={ 'objectClass': [ self.objectClass ] } - self._init_data={} + self._data = { 'objectClass': [ self.objectClass ] } + self._init_data = {} self.__typ = typ self._modifiable = 'w' @@ -2325,7 +2325,7 @@ class Machine(base_classes_crans): return 'N/A' # Attribution de la prise - new=preattr(new)[1] + new = preattr(new)[1] if new == 'N/A': if self._data.has_key('prise'): self._set('prise', []) @@ -2836,7 +2836,7 @@ class BorneWifi(Machine): if champ == None: if type(new) is list: - self.set('nvram', new) + self._set('nvram', new) return new else: return current @@ -2949,7 +2949,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()