From 87e88a6443ce7d4dfc260f43dead099a0e3d5e3e Mon Sep 17 00:00:00 2001 From: glondu Date: Sun, 19 Mar 2006 19:36:02 +0100 Subject: [PATCH] Suite. darcs-hash:20060319183602-68412-2d6a5d90ea6648879e95bc4f36a25250d5a561a0.gz --- gestion/ldap_crans.py | 183 ++++++++++++++++++++++-------------------- 1 file changed, 94 insertions(+), 89 deletions(-) diff --git a/gestion/ldap_crans.py b/gestion/ldap_crans.py index e8eb17ac..ff33074e 100755 --- a/gestion/ldap_crans.py +++ b/gestion/ldap_crans.py @@ -27,16 +27,16 @@ random.seed() # On initialise le g ################################################################################## ### paramètres de connaction à la base LDAP -if __name__=='ldap_crans_test' or os.environ.get('crans_ldap','')=='test': +if __name__ == 'ldap_crans_test' or os.environ.get('crans_ldap', '') == 'test': # 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 uri = ro_uri = 'ldap://egon.adm.crans.org/' - ldap_auth_dn='cn=admin,dc=crans,dc=org' - ldap_password='75bdb64f32' + ldap_auth_dn = 'cn=admin,dc=crans,dc=org' + ldap_password = '75bdb64f32' -elif user_tests.getuser()=='freerad': +elif user_tests.getuser() == 'freerad': # Freeradius n'a pas accès au secret, donc accès que en local uri = '' ro_uri = 'ldapi://%2fvar%2frun%2fldapi/' @@ -50,28 +50,30 @@ else: try: from secrets import ldap_password, ldap_auth_dn except: - sys.stdout.write(coul('Warning : impossible de lire le fichier de secret !\n','jaune')) + sys.stdout.write(coul('Warning : impossible de lire le fichier de secret !\n', 'jaune')) sys.exit(1) # uri pour les instances de crans_ldap faisant de la lecture seule - if os.path.exists('/var/run/ldapi') : + if os.path.exists('/var/run/ldapi'): ro_uri = 'ldapi://%2fvar%2frun%2fldapi/' - else : + else: ro_uri = uri ################################################################################## ### Items de la blackliste -blacklist_items = { u'bloq' : u'Bloquage total de tous les services' , +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'} + u'autodisc_p2p' : u'Autodisconnect pour P2P' } ################################################################################## ### Droits possibles -droits_possibles = [ u'Nounou', u'Apprenti', u'Modérateur', u'Câbleur', u'Déconnecteur', u'WebRadio' , u'Imprimeur', u'MultiMachines', u'Contrôleur' ] +droits_possibles = [ u'Nounou', u'Apprenti', u'Modérateur', u'Câbleur', + u'Déconnecteur', u'WebRadio', u'Imprimeur', u'MultiMachines', + u'Contrôleur' ] ################################################################################## ### Variables internes diverses @@ -81,7 +83,7 @@ ann_scol = config.ann_scol script_utilisateur = user_tests.getuser() ################################################################################## -### Fonctions utiles +### Fonctions utiles def decode(s): """ Retourne un unicode à partir de s @@ -143,10 +145,10 @@ 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') ] + return [len(val), val.encode('utf-8')] else: raise TypeError @@ -176,23 +178,23 @@ def format_mac(mac): Retourne la mac formatée. """ l, mac = preattr(mac) - mac = mac.strip().replace("-",":") + 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 mac = ":".join(map(lambda x: x.replace(' ', '0'), map(lambda x: "%02s" % x, mac.split(":")))) - mac= mac.replace(':','').lower() - if len(mac)!=12: - raise ValueError(u'Longueur de l\'adresse mac incorrecte.') + mac = mac.replace(':', '').lower() + if len(mac) != 12: + 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) - if mac=='000000000000': + 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.") # Formatage - mac="%s:%s:%s:%s:%s:%s" % ( mac[:2],mac[2:4],mac[4:6], mac[6:8], mac[8:10], mac[10:] ) + mac = "%s:%s:%s:%s:%s:%s" % (mac[:2], mac[2:4], mac[4:6], mac[6:8], mac[8:10], mac[10:]) return mac @@ -201,36 +203,36 @@ 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 Liste d'horaires de démarrages """ - self.nom=nom - self.args=args - self.start=map(int,start) + self.nom = nom + self.args = args + self.start = map(int, start) def __str__(self): starting = self.start starting.sort() - dates = ' et '.join(map(lambda t: t erreur @@ -348,8 +353,8 @@ class crans_ldap: r.append(res[0]) # Deuxième test : lock ? - ret = self.conn.search_s(self.base_lock,1,arg) - lockid = '%s-%s' % (hostname, os.getpid() ) + 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] @@ -357,7 +362,7 @@ class crans_ldap: # 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] ): + 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 continue @@ -367,7 +372,7 @@ class crans_ldap: return r - def lock(self,item,valeur): + def lock(self, item, valeur): """ Lock un item avec la valeur valeur, les items possibles peuvent être : @@ -384,18 +389,18 @@ class crans_ldap: # On le lock pas un truc vide return True - lock_dn = '%s=%s,%s' % ( item, valeur, self.base_lock ) - lockid = '%s-%s' % (hostname, os.getpid() ) - modlist = ldap.modlist.addModlist({ 'objectClass' : 'lock' , - 'lockid': lockid , - item: valeur } ) + lock_dn = '%s=%s,%s' % (item, valeur, self.base_lock) + lockid = '%s-%s' % (hostname, os.getpid()) + modlist = ldap.modlist.addModlist({ 'objectClass': 'lock', + 'lockid': lockid, + item: valeur }) try: - self.conn.add_s(lock_dn,modlist) + self.conn.add_s(lock_dn, modlist) except ldap.ALREADY_EXISTS: # Pas de chance, le lock est déja pris try: - res = self.conn.search_s(lock_dn,2,'objectClass=lock')[0] + res = self.conn.search_s(lock_dn, 2, 'objectClass=lock')[0] l = res[1]['lockid'][0] except: l = '%s-1' % hostname if l != lockid: @@ -404,7 +409,7 @@ class crans_ldap: 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 + return self.lock(item, valeur) # relock raise EnvironmentError(u'Objet (%s=%s) locké, patienter.' % (item, valeur), l) else: if not hasattr(self,'_locks'): @@ -412,13 +417,13 @@ class crans_ldap: else: self._locks.append(lock_dn) - def remove_lock(self,lockdn): + def remove_lock(self, lockdn): """ Destruction d'un lock Destruction de tous les locks si lockdn=* """ # Mettre des verifs ? - if lockdn!='*': + if lockdn != '*': self.conn.delete_s(lockdn) try: self._locks.remove(lockdn) @@ -434,7 +439,7 @@ class crans_ldap: """ Liste les locks """ return self.conn.search_s(self.base_lock,1,'objectClass=lock') - def services_to_restart(self,new=None,args=[],start=0): + 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é @@ -495,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 = [] @@ -527,9 +532,9 @@ class crans_ldap: # else rien à faire else: # Entrée non présente -> ajout - modlist = ldap.modlist.addModlist({ 'objectClass': 'service' , - 'cn': new , - 'args': args , + modlist = ldap.modlist.addModlist({ 'objectClass': 'service', + 'cn': new, + 'args': args, 'start': start } ) try: self.conn.add_s(serv_dn,modlist) @@ -883,13 +888,13 @@ class base_classes_crans(crans_ldap): """ Blacklistage de la ou de toutes la machines du propriétaire new est une liste de 4 termes: - [ debut_sanction , fin_sanction, sanction, commentaire ] + [ debut_sanction, fin_sanction, sanction, commentaire ] début et fin doivent être sous la forme donnée par date_format pour un début ou fin immédiate mettre now pour une fin indéterminée mettre '-' pour modifier une entrée donner un tuple de deux termes : - ( index dans blacklist à modifier , nouvelle liste ) + ( index dans blacklist à modifier, nouvelle liste ) l'index est celui obtenu dans la liste retournée par blacklist() """ if not self._data.has_key('blacklist'): @@ -972,7 +977,7 @@ class base_classes_crans(crans_ldap): 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 ] + [ 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'): @@ -1130,11 +1135,11 @@ class base_classes_crans(crans_ldap): else: ### Modification entrée if not self._modifiable: - raise RuntimeError(u'Objet non modifiable : %s'%str(self)) + raise RuntimeError(u'Objet non modifiable : %s' % str(self)) modlist = ldap.modlist.modifyModlist(self._init_data,self._data) try: self.conn.modify_s(self.dn,modlist) - except ldap.TYPE_OR_VALUE_EXISTS , c: + 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) @@ -1142,7 +1147,7 @@ class base_classes_crans(crans_ldap): # 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) + self.services_to_restart("blacklist_%s"%n, [], t) # Reinitialisation self._init_data = self._data.copy() @@ -1833,7 +1838,7 @@ class adherent(base_proprietaire): return True - def compte(self,login=None,uidNumber=0,hash_pass='',shell=config.login_shell): + 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) @@ -1861,27 +1866,27 @@ class adherent(base_proprietaire): 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.") - if l<2: + if l < 2: raise ValueError(u"Login trop court.") - if l>config.maxlen_login: + if l > config.maxlen_login: raise ValueError(u"Login trop long.") - if login[0]=='-': + if login[0] == '-': 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) + if os.path.exists("/var/mail/" + login): + 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) - self._data['mail']= [ login ] + self._data['mail'] = [login] if not 'compte' in self.modifs: self.modifs.setdefault('compte', None) @@ -1890,15 +1895,15 @@ class adherent(base_proprietaire): a = '%s.%s' % (self.prenom().capitalize(), self.nom().capitalize()) self.cannonical_alias(a) - self._data['objectClass'] = [ 'adherent', 'posixAccount', 'shadowAccount' ] - self._data['uid'] = [ login ] - self._data['cn'] = [ preattr(self.Nom())[1] ] + self._data['objectClass'] = ['adherent', 'posixAccount', 'shadowAccount'] + self._data['uid'] = [login] + self._data['cn'] = [preattr(self.Nom())[1]] #self._data['shadowLastChange'] = [ '12632' ] #self._data['shadowMax'] = [ '99999'] #self._data['shadowWarning'] = [ '7' ] - self._data['loginShell' ] = [ shell ] + self._data['loginShell'] = [shell] if hash_pass: - self._data['userPassword'] = [ hash_pass ] + self._data['userPassword'] = [hash_pass] if uidNumber: if self.exist('(uidNumber=%s)' % uidNumber): @@ -1913,7 +1918,7 @@ class adherent(base_proprietaire): pool_uid.append(uidNumber) break if not len(pool_uid): - raise ValueError(u'Plus d\'uid disponibles !') + raise ValueError(u"Plus d'uid disponibles !") try: self.lock('uidNumber',str(uidNumber)) @@ -1921,8 +1926,8 @@ class adherent(base_proprietaire): # 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) ] - self._data['gidNumber']=[ str(config.gid) ] + self._data['uidNumber']= [str(uidNumber)] + self._data['gidNumber'] = [str(config.gid)] self._data['homeDirectory']=[ preattr(home)[1] ] gecos = '%s %s' % tuple(map(lambda x: strip_accents(x.capitalize()), (self.prenom(), self.nom()))) @@ -2371,7 +2376,7 @@ class Machine(base_classes_crans): 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. + Si ip= attribue la permière IP libre du sous-réseau. """ if ip == None: if self._data.has_key('ipHostNumber'): @@ -2433,14 +2438,14 @@ class Machine(base_classes_crans): break if not len(pool_ip): - raise RuntimeError(u'Plus d\'IP libres dans %s.' % string.join(net, ' et ')) + 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) 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 ?