Correction canonicalAlias, ajout cransAccount, esthtisme.

darcs-hash:20060321012153-68412-185e90e71297e14e330197c2cf365e9495893b31.gz
This commit is contained in:
glondu 2006-03-21 02:21:53 +01:00
parent 62d23e9bde
commit 5bf2e284f9

View file

@ -18,7 +18,7 @@ from chgpass import chgpass
from affich_tools import coul, prompt from affich_tools import coul, prompt
from time import sleep, localtime from time import sleep, localtime
date_format='%d/%m/%Y %H:%M' date_format = '%d/%m/%Y %H:%M'
hostname = gethostname().split(".")[0] hostname = gethostname().split(".")[0]
smtpserv = "rouge.crans.org" smtpserv = "rouge.crans.org"
random.seed() # On initialise le générateur aléatoire random.seed() # On initialise le générateur aléatoire
@ -115,7 +115,7 @@ def mailexist(mail):
""" """
try: try:
s=smtplib.SMTP(smtpserv) s = smtplib.SMTP(smtpserv)
r = s.vrfy(mail) r = s.vrfy(mail)
s.close() s.close()
except: except:
@ -138,15 +138,15 @@ def preattr(val):
t = type(val) t = type(val)
if t==list and len(val)==1: if t == list and len(val) == 1:
return preattr(val[0]) return preattr(val[0])
elif t==str or t==int: elif t == str or t == int:
val = str(val).strip() 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 # 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: elif t == unicode:
val = val.strip() val = val.strip()
return [len(val), val.encode('utf-8')] return [len(val), val.encode('utf-8')]
else: else:
@ -162,7 +162,7 @@ def is_actif(sanction):
try: try:
now = time.time() now = time.time()
debut = time.mktime( time.strptime(bl[0], date_format) ) debut = time.mktime( time.strptime(bl[0], date_format) )
if bl[1]=='-': if bl[1] == '-':
fin = now + 1 fin = now + 1
else: else:
fin = time.mktime( time.strptime(bl[1], date_format) ) fin = time.mktime( time.strptime(bl[1], date_format) )
@ -203,7 +203,7 @@ def format_mac(mac):
class service: class service:
""" Définit un service à redémarrer """ """ Définit un service à redémarrer """
def __init__(self, nom, args=[], start=[]): def __init__(self, nom, args = [], start = []):
""" """
Nom du service Nom du service
Liste des arguments Liste des arguments
@ -256,7 +256,7 @@ class crans_ldap:
auto_search_champs = { \ auto_search_champs = { \
'adherent': \ 'adherent': \
['nom', 'prenom', 'tel', 'mail', 'chbre', 'mailAlias', 'cannonicalAlias' ], ['nom', 'prenom', 'tel', 'mail', 'chbre', 'mailAlias', 'canonicalAlias' ],
'club': ['nom', 'chbre'], 'club': ['nom', 'chbre'],
'machineFixe': auto_search_machines_champs, 'machineFixe': auto_search_machines_champs,
'machineWifi': 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 Lock un item avec la valeur valeur, les items possibles
peuvent être : peuvent être :
aid $ chbre $ mail $ mailAlias $ cannonicalAlias $ aid $ chbre $ mail $ mailAlias $ canonicalAlias $
mid $ macAddress $ host $ hostAlias $ ipHostNumber mid $ macAddress $ host $ hostAlias $ ipHostNumber
Retourne le dn du lock Retourne le dn du lock
@ -462,7 +462,7 @@ class crans_ldap:
serv_dates = {} # { service: [ dates de restart ] } serv_dates = {} # { service: [ dates de restart ] }
services = [] 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] s = s[1]
serv[s['cn'][0]] = s.get('args', []) serv[s['cn'][0]] = s.get('args', [])
serv_dates[s['cn'][0]] = s.get('start', []) serv_dates[s['cn'][0]] = s.get('start', [])
services.append(service(s['cn'][0], s.get('args', []), 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[0] == '-':
if new[1] == '-': 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 ) remove_dn = 'cn=%s,%s' % ( new[2:], self.base_services )
else: 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 ) remove_dn = 'cn=%s,%s' % ( new[1:], self.base_services )
if not serv.has_key(new[1:]): if not serv.has_key(new[1:]):
# Existe pas => rien à faire # Existe pas => rien à faire
return return
keep_date=[] keep_date = []
for date in serv_dates[new[1:]]: for date in serv_dates[new[1:]]:
if time.time() - time.timezone < int(date): if time.time() - time.timezone < int(date):
keep_date.append(date) keep_date.append(date)
if keep_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 remove_dn = None
if remove_dn: if remove_dn:
# Suppression # Suppression
@ -500,9 +500,9 @@ class crans_ldap:
# Petite fonction à appliquer aux arguments # Petite fonction à appliquer aux arguments
if type(args) == str: args = [ args ] 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 ] 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(): if new in serv.keys():
modlist = [] modlist = []
@ -828,7 +828,7 @@ class base_classes_crans(crans_ldap):
def __eq__(self, autre): def __eq__(self, autre):
""" Test d'égalité de deux instances de club/adhérent/machine, """ 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 """ 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): 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)"""
@ -898,15 +898,15 @@ class base_classes_crans(crans_ldap):
l'index est celui obtenu dans la liste retournée par blacklist() l'index est celui obtenu dans la liste retournée par blacklist()
""" """
if not self._data.has_key('blacklist'): if not self._data.has_key('blacklist'):
self._data['blacklist']=[] self._data['blacklist'] = []
liste = list(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 # Modif
index = new[0] index = new[0]
new = new[1] new = new[1]
if new=='': if new == '':
liste.pop(index) liste.pop(index)
self._set('blacklist', liste) self._set('blacklist', liste)
return liste return liste
@ -919,16 +919,16 @@ class base_classes_crans(crans_ldap):
# Verif que les dates sont OK # Verif que les dates sont OK
if new[0] == 'now': if new[0] == 'now':
new[0] = time.strftime(date_format) new[0] = time.strftime(date_format)
debut=0 debut = 0
else: 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') except: raise ValueError(u'Date de début blacklist invalide')
if new[1] == 'now': if new[1] == 'now':
new[1] = time.strftime(date_format) new[1] = time.strftime(date_format)
fin=0 fin = 0
elif new[1]!='-': 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') except: raise ValueError(u'Date de fin blacklist invalide')
else: else:
fin = -1 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 # On prend en compte le fuseau horaire et on dépasse la fin
# de sanction d'1min pour être sur quelle périmé. # 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 = ','.join(new)
new_c = preattr(new_c)[1] new_c = preattr(new_c)[1]
@ -949,10 +949,10 @@ class base_classes_crans(crans_ldap):
liste = liste + [ new_c ] liste = liste + [ new_c ]
if self._data['blacklist'] != liste: if self._data['blacklist'] != liste:
self._data['blacklist']=liste self._data['blacklist'] = liste
self.modifs.setdefault('blacklist_' + new[2], None) self.modifs.setdefault('blacklist_' + new[2], None)
if not hasattr(self, "_blacklist_restart"): if not hasattr(self, "_blacklist_restart"):
self._blacklist_restart={} self._blacklist_restart = {}
if not self._blacklist_restart.has_key(new[2]): if not self._blacklist_restart.has_key(new[2]):
self._blacklist_restart[new[2]] = [ debut, fin ] self._blacklist_restart[new[2]] = [ debut, fin ]
else: else:
@ -981,11 +981,11 @@ class base_classes_crans(crans_ldap):
l'index est celui obtenu dans la liste retournée par info() l'index est celui obtenu dans la liste retournée par info()
""" """
if not self._data.has_key('info'): if not self._data.has_key('info'):
self._data['info']=[] self._data['info'] = []
liste = list(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 # Modif
index = new[0] index = new[0]
l, new = preattr(new[1]) l, new = preattr(new[1])
@ -994,15 +994,15 @@ class base_classes_crans(crans_ldap):
liste.pop(index) liste.pop(index)
else: else:
# Modif remarque # Modif remarque
liste[index]=new liste[index] = new
elif type(new)==str: elif type(new) == str:
# Remarque supplémentaire # Remarque supplémentaire
l, new = preattr(new) l, new = preattr(new)
if not new: if not new:
# On ajoute pas de remarque vide # On ajoute pas de remarque vide
return liste return liste
# Ajout à la liste # Ajout à la liste
liste = liste + [ new ] liste = liste + [new]
else: else:
raise TypeError raise TypeError
@ -1114,11 +1114,11 @@ class base_classes_crans(crans_ldap):
### Nouvel enregistrement ### Nouvel enregistrement
# Génération du dn # Génération du dn
res = self.conn.search_s(self.base_dn, 2, self.filtre_idn) res = self.conn.search_s(self.base_dn, 2, self.filtre_idn)
vidn=1 vidn = 1
vidns=[] vidns = []
# Liste des dn pris # Liste des dn pris
for r in res: for r in res:
# r=( dn, {} ) # r = ( dn, {} )
r = r[0].split(',')[0] r = r[0].split(',')[0]
if r[:4] != '%s=' % self.idn: continue if r[:4] != '%s=' % self.idn: continue
vidns.append(int(r[4:])) vidns.append(int(r[4:]))
@ -1126,7 +1126,7 @@ class base_classes_crans(crans_ldap):
while vidn in vidns: while vidn in vidns:
vidn += 1 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 ] self._data[self.idn]= [ '%d' % vidn ]
# Ecriture # Ecriture
@ -1186,7 +1186,7 @@ class base_classes_crans(crans_ldap):
""" Met à jour les données de data et modifie modifs si besoin """ """ Met à jour les données de data et modifie modifs si besoin """
if (not self._data.has_key(champ) and val != []) \ if (not self._data.has_key(champ) and val != []) \
or (self._data.has_key(champ) and self._data[champ]!=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: if self.modifs.get(champ) == None or comment == None:
self.modifs[champ] = comment self.modifs[champ] = comment
else: else:
@ -1220,7 +1220,7 @@ class base_proprietaire(base_classes_crans):
self.modifs = {} self.modifs = {}
if data: if data:
self.dn=data[0] self.dn = data[0]
if mode == 'w': if mode == 'w':
try: try:
self.lock(self.idn, self.id()) self.lock(self.idn, self.id())
@ -1234,9 +1234,9 @@ class base_proprietaire(base_classes_crans):
self._data = data[1] self._data = data[1]
else: else:
# Propriétaire vide # Propriétaire vide
self.dn='' # Génération du reste au moment de l'écriture self.dn = '' # Génération du reste au moment de l'écriture
self._data={ 'objectClass': [ self.objectClass ] } self._data = { 'objectClass': [ self.objectClass ] }
self._init_data={} self._init_data = {}
self._modifiable = 'w' self._modifiable = 'w'
def chsh(self, new=None): 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. Même sytème d'argument que la méthode info.
""" """
if not self._data.has_key('mailAlias'): if not self._data.has_key('mailAlias'):
self._data['mailAlias']=[] self._data['mailAlias'] = []
liste = list(self._data['mailAlias']) liste = list(self._data['mailAlias'])
if new==None: if new == None:
return map(decode, liste) return map(decode, liste)
if type(new)==list: if type(new) == list:
# Modif # Modif
index = new[0] index = new[0]
new = new[1] new = new[1]
if new=='': if new == '':
# Supression alias # Supression alias
liste.pop(index) liste.pop(index)
self._set('mailAlias', liste) self._set('mailAlias', liste)
return liste return liste
else: else:
new = new.replace('@crans.org', '') new = new.replace('@crans.org', '')
index=-1 index = -1
# Tests # Tests
l, new = preattr(new) l, new = preattr(new)
@ -1287,7 +1287,7 @@ class base_proprietaire(base_classes_crans):
raise ValueError(u"Alias existant ou correspondand à un compte.") raise ValueError(u"Alias existant ou correspondand à un compte.")
if index!=-1: if index!=-1:
liste[index]=new liste[index] = new
else: else:
liste = liste + [ new ] liste = liste + [ new ]
@ -1326,7 +1326,7 @@ class base_proprietaire(base_classes_crans):
""" """
solde = float(self._data.get('solde', [0])[0]) solde = float(self._data.get('solde', [0])[0])
if operation==None: if operation == None:
return solde return solde
# On effectue une opération # On effectue une opération
@ -1355,7 +1355,7 @@ class base_proprietaire(base_classes_crans):
else: else:
actuel = actuel[0] actuel = actuel[0]
if new==None: if new == None:
return actuel return actuel
if not sre.match(r'^[+-][pck]$', new): if not sre.match(r'^[+-][pck]$', new):
@ -1530,7 +1530,7 @@ class base_proprietaire(base_classes_crans):
args+= self._data['uid'][0] args+= self._data['uid'][0]
self.services_to_restart('home', [ args ]) self.services_to_restart('home', [ args ])
r = prompt(u"Attribuer tout de suite un mot de passe ? [O/N]", "O") 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) chgpass(self.dn)
else: 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')
@ -1553,12 +1553,12 @@ class base_proprietaire(base_classes_crans):
si négatif le supprime si négatif le supprime
""" """
if not self._data.has_key(champ): if not self._data.has_key(champ):
trans=[] trans = []
else: else:
# On va travailler sur une liste d'entiers # On va travailler sur une liste d'entiers
trans = map(int, self._data[champ]) trans = map(int, self._data[champ])
if action==None: if action == None:
return trans return trans
if type(action)!=int: raise TypeError if type(action)!=int: raise TypeError
@ -1619,7 +1619,7 @@ class adherent(base_proprietaire):
return new return new
def tel(self, new=None): def tel(self, new=None):
if new==None: if new == None:
return self._data.get('tel', [''])[0] return self._data.get('tel', [''])[0]
if new != 'inconnu': 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 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]) return decode(self._data.get('chbre', [''])[0])
l, new = preattr(new) l, new = preattr(new)
if l==0: if l == 0:
raise ValueError(u"Chambre incorrecte.") raise ValueError(u"Chambre incorrecte.")
if new.upper() == 'EXT': 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(): if new[1:] not in chbres or len(new)<4 or not new[1:4].isdigit():
chbres.sort() chbres.sort()
aide = u"Chambre inconnue dans le batiment, les chambres valides sont :" aide = u"Chambre inconnue dans le batiment, les chambres valides sont :"
a=0 a = 0
for c in chbres: for c in chbres:
if len(c)>=3 and not c[:3].isdigit(): if len(c)>=3 and not c[:3].isdigit():
# C'est un local club # C'est un local club
@ -1672,7 +1672,7 @@ class adherent(base_proprietaire):
if int(a/14)>int((a-1)/14): aide += '\n ' if int(a/14)>int((a-1)/14): aide += '\n '
if c[0]!='X': if c[0]!='X':
aide += c.ljust(5) aide += c.ljust(5)
a=a+1 a = a+1
aide += u'\n' aide += u'\n'
aide += u" " + annuaires.aide.get(bat, '') aide += u" " + annuaires.aide.get(bat, '')
raise ValueError(aide) raise ValueError(aide)
@ -1702,7 +1702,7 @@ class adherent(base_proprietaire):
""" Défini l'adresse pour les personnes extérieures (dont la chambre = EXT) """ 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 L'adresse est une liste de 4 éléments : numero, rue, code postal, ville
""" """
if new==None: if new == None:
if self.chbre() != 'EXT': if self.chbre() != 'EXT':
# Personne sur le campus # Personne sur le campus
return [u'', u'', u'', u''] return [u'', u'', u'', u'']
@ -1728,23 +1728,23 @@ class adherent(base_proprietaire):
return new return new
def mail(self, new=None): def mail(self, new=None):
if new==None: if new == None:
return decode(self._data.get('mail', [''])[0]) return decode(self._data.get('mail', [''])[0])
l, new = preattr(new) l, new = preattr(new)
new = new.lower() new = new.lower()
#Emplacement de l'@ #Emplacement de l'@
a=new.find('@') a = new.find('@')
#Emplacement du . final #Emplacement du . final
b=new.rfind('.') b = new.rfind('.')
# Les tests : # Les tests :
# exactement un @ # 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 . # @ pas en premier ni juste avant le dernier .
if new.count('@')!=1 \ 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: or a<1 or b-a<2:
raise ValueError(u"Adresse mail incorrecte.") raise ValueError(u"Adresse mail incorrecte.")
@ -1782,7 +1782,7 @@ class adherent(base_proprietaire):
self._set('mail', ['']) self._set('mail', [''])
self._data['objectClass'] = [ 'adherent' ] 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) try: self._data.pop(c)
except: pass except: pass
@ -1790,7 +1790,7 @@ class adherent(base_proprietaire):
""" """
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 type(index_or_new) == int:
if self._data.has_key('etudes'): if self._data.has_key('etudes'):
return decode(self._data['etudes'][index_or_new]) return decode(self._data['etudes'][index_or_new])
else: else:
@ -1800,7 +1800,7 @@ class adherent(base_proprietaire):
raise TypeError raise TypeError
if not self._data.has_key('etudes'): 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 # Pas grand chose à faire à part vérifier que ce sont bien des chaines
if len(index_or_new)!=3: if len(index_or_new)!=3:
@ -1809,7 +1809,7 @@ class adherent(base_proprietaire):
new = ['', '', ''] new = ['', '', '']
for i in range(0, 3): for i in range(0, 3):
n = preattr(index_or_new[i])[1] 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.") raise ValueError(u"Etudes non valides.")
new[i] = n new[i] = n
@ -1890,12 +1890,12 @@ class adherent(base_proprietaire):
if not 'compte' in self.modifs: if not 'compte' in self.modifs:
self.modifs.setdefault('compte', None) self.modifs.setdefault('compte', None)
# Création de l'alias cannonique # Création de l'alias canonique
if self.nom() and self.prenom(): if self.nom() and self.prenom():
a = '%s.%s' % (self.prenom().capitalize(), self.nom().capitalize()) 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['uid'] = [login]
self._data['cn'] = [preattr(self.Nom())[1]] self._data['cn'] = [preattr(self.Nom())[1]]
#self._data['shadowLastChange'] = [ '12632' ] #self._data['shadowLastChange'] = [ '12632' ]
@ -1929,16 +1929,16 @@ class adherent(base_proprietaire):
self._data['uidNumber']= [str(uidNumber)] self._data['uidNumber']= [str(uidNumber)]
self._data['gidNumber'] = [str(config.gid)] 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()))) gecos = '%s %s' % tuple(map(lambda x: strip_accents(x.capitalize()), (self.prenom(), self.nom())))
self._data['gecos'] = [ preattr(gecos)[1] + ',,,' ] self._data['gecos'] = [ preattr(gecos)[1] + ',,,' ]
return decode(login) return decode(login)
def cannonical_alias(self, new=None): def canonical_alias(self, new=None):
""" Retourne ou défini l'alias canonique""" """ Retourne ou défini l'alias canonique"""
if new == None: if new == None:
try: return decode(self._data['cannonicalAlias'][0]) try: return decode(self._data['canonicalAlias'][0])
except: return '' except: return ''
else : else :
a = strip_accents(new) a = strip_accents(new)
@ -1947,16 +1947,16 @@ class adherent(base_proprietaire):
if not mailexist(a): if not mailexist(a):
# Attribution de l'alias, sinon on passe # Attribution de l'alias, sinon on passe
# Lock de cannonicalAlias # Lock de canonicalAlias
self.lock('cannonicalAlias', a) self.lock('canonicalAlias', a)
# Attribution # Attribution
self._set('cannonicalAlias', [a]) self._set('canonicalAlias', [a])
return a return a
def droits(self, droits=None): def droits(self, droits=None):
""" droits est la liste des droits à donner à l'utilisateur """ """ droits est la liste des droits à donner à l'utilisateur """
if droits==None: if droits == None:
return map(decode, self._data.get('droits', [])) return map(decode, self._data.get('droits', []))
if not isadm: if not isadm:
@ -2006,7 +2006,7 @@ class club(base_proprietaire):
def Nom(self, new=None): def Nom(self, new=None):
""" Défini ou retourne le nom du club """ """ Défini ou retourne le nom du club """
if new==None: if new == None:
return decode(self._data.get('nom', [''])[0]) return decode(self._data.get('nom', [''])[0])
l, new = preattr(new) l, new = preattr(new)
@ -2030,7 +2030,7 @@ class club(base_proprietaire):
def responsable(self, adher=None): 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: if adher == None:
aid = decode(self._data.get('responsable', [''])[0]) aid = decode(self._data.get('responsable', [''])[0])
if aid: if aid:
return self.search('aid=%s' % aid)['adherent'][0] return self.search('aid=%s' % aid)['adherent'][0]
@ -2048,7 +2048,7 @@ class club(base_proprietaire):
def chbre(self, new=None): def chbre(self, new=None):
""" Défini le local du club """ Défini le local du club
new doit être une des clefs de l'annuaire locaux_clubs""" new doit être une des clefs de l'annuaire locaux_clubs"""
if new==None: if new == None:
return decode(self._data.get('chbre', [''])[0]) return decode(self._data.get('chbre', [''])[0])
annu = annuaires.locaux_clubs() annu = annuaires.locaux_clubs()
@ -2066,7 +2066,7 @@ class club(base_proprietaire):
def compte(self, login=None): def compte(self, login=None):
""" Créé un compte au club sur vert""" """ Créé un compte au club sur vert"""
if login==None: if login == None:
return self._data.get('uid', [''])[0] return self._data.get('uid', [''])[0]
# Génération du login : club-<login fourni> # Génération du login : club-<login fourni>
@ -2101,7 +2101,7 @@ class club(base_proprietaire):
if not 'compte' in self.modifs: if not 'compte' in self.modifs:
self.modifs.setdefault('compte', None) self.modifs.setdefault('compte', None)
self._data['objectClass'] = [ 'club', 'posixAccount', 'shadowAccount' ] self._data['objectClass'] = ['club', 'cransAccount', 'posixAccount', 'shadowAccount']
self._data['uid'] = [ login ] self._data['uid'] = [ login ]
self._data['cn'] = [ preattr(self.Nom())[1] ] self._data['cn'] = [ preattr(self.Nom())[1] ]
self._data['loginShell' ] = [ config.club_login_shell ] self._data['loginShell' ] = [ config.club_login_shell ]
@ -2117,8 +2117,8 @@ class club(base_proprietaire):
return self.compte(login) return self.compte(login)
self._data['uidNumber']= [ str(uidNumber) ] self._data['uidNumber']= [ str(uidNumber) ]
self._data['gidNumber']=[ str(config.club_gid) ] self._data['gidNumber'] = [ str(config.club_gid) ]
self._data['homeDirectory']=[ preattr(home)[1] ] self._data['homeDirectory'] = [ preattr(home)[1] ]
return decode(login) return decode(login)
@ -2185,8 +2185,8 @@ class Machine(base_classes_crans):
# Machine vide # Machine vide
self.__proprietaire = parent_or_tuple self.__proprietaire = parent_or_tuple
self.dn = parent_or_tuple.dn self.dn = parent_or_tuple.dn
self._data={ 'objectClass': [ self.objectClass ] } self._data = { 'objectClass': [ self.objectClass ] }
self._init_data={} self._init_data = {}
self.__typ = typ self.__typ = typ
self._modifiable = 'w' self._modifiable = 'w'
@ -2325,7 +2325,7 @@ class Machine(base_classes_crans):
return 'N/A' return 'N/A'
# Attribution de la prise # Attribution de la prise
new=preattr(new)[1] new = preattr(new)[1]
if new == 'N/A': if new == 'N/A':
if self._data.has_key('prise'): if self._data.has_key('prise'):
self._set('prise', []) self._set('prise', [])
@ -2836,7 +2836,7 @@ class BorneWifi(Machine):
if champ == None: if champ == None:
if type(new) is list: if type(new) is list:
self.set('nvram', new) self._set('nvram', new)
return new return new
else: else:
return current return current
@ -2949,7 +2949,7 @@ if __name__ == '__main__':
elif '--menage' in sys.argv: elif '--menage' in sys.argv:
print "Ménage des machines des adhérents partis..." print "Ménage des machines des adhérents partis..."
db = crans_ldap() 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) print "Destruction de %i machines" % len(machines)
for m in machines: for m in machines:
print 'Destruction de %s' % m.nom() print 'Destruction de %s' % m.nom()