diff --git a/gestion/ldap_crans.py b/gestion/ldap_crans.py index 79769195..6cffa3bf 100755 --- a/gestion/ldap_crans.py +++ b/gestion/ldap_crans.py @@ -179,16 +179,16 @@ def format_mac(mac) : class service : """ Défini un service à redémarrer """ def __init__(self,nom,args=[],start=[]) : - """ nom du service - liste des arguments - liste d'horaires de démarages """ - self.nom=nom - self.args=args - self.start=map(int,start) - + """ nom du service + liste des arguments + liste d'horaires de démarages """ + self.nom=nom + self.args=args + self.start=map(int,start) + def __str__(self) : - return "%s(%s) à partir du %s" % (self.nom, \ - ','.join(self.args), \ + return "%s(%s) à partir du %s" % (self.nom, \ + ','.join(self.args), \ ' et '.join(map(lambda t:time.strftime(date_format,time.gmtime(t)), self.start))) class crans_ldap : @@ -228,9 +228,9 @@ class crans_ldap : def __del__(self) : # Destruction des locks résiduels - if hasattr(self,'_locks') : - for lock in self._locks : - self.remove_lock(lock) + if hasattr(self,'_locks') : + for lock in self._locks : + self.remove_lock(lock) def connect(self): """ Initialisation des connexion vers le serveur LDAP """ @@ -353,6 +353,13 @@ class crans_ldap : try : self.conn.add_s(lock_dn,modlist) + # Pourquoi des locks à la con restent ? + # On écrit les locks dans un fichier à des fins de debug + try: + open('/usr/scripts/gestion/ldap_locks','a').write("%s\t %s\n"%(modlist[1][1], modlist[2])) + except: + # on ne va pas cracher le script à cause du debug ! + pass except ldap.ALREADY_EXISTS : # Pas de chance, le lock est déja pris try : @@ -362,16 +369,16 @@ class crans_ldap : if l != lockid : # C'est locké par un autre process que le notre # il tourne encore ? - if l.split('-')[0] == hostname and os.system('ps %s > /dev/null 2>&1' % l.split('-')[1] ) : - # Il ne tourne plus - self.remove_lock(res[0]) # delock - return self.lock(item,valeur) # relock + if l.split('-')[0] == hostname and os.system('ps %s > /dev/null 2>&1' % l.split('-')[1] ) : + # Il ne tourne plus + self.remove_lock(res[0]) # delock + return self.lock(item,valeur) # relock raise EnvironmentError(u'Objet (%s=%s) locké, patienter.' % (item, valeur), l) - else : - if not hasattr(self,'_locks') : - self._locks = [lock_dn] - else : - self._locks.append(lock_dn) + else : + if not hasattr(self,'_locks') : + self._locks = [lock_dn] + else : + self._locks.append(lock_dn) def remove_lock(self,lockdn) : """ Destruction d'un lock @@ -379,11 +386,11 @@ class crans_ldap : # Mettre des verifs ? if lockdn!='*' : self.conn.delete_s(lockdn) - try: - self._locks.remove(lockdn) - except: - # Pas grave si ca foire, le lock n'y est plus - pass + try: + self._locks.remove(lockdn) + except: + # Pas grave si ca foire, le lock n'y est plus + pass else : locks = self.list_locks() for l in locks : @@ -397,78 +404,78 @@ class crans_ldap : """ Si new = None retourne la liste des services à redémarrer Si new est fourni et ne commence pas par - ajoute le service à la liste avec les arguments args (args doit être une liste). - start indique la date (secondes depuis epoch) à partir du moment ou - cette action doit être effectué + start indique la date (secondes depuis epoch) à partir du moment ou + cette action doit être effectué Si new commence par - supprime le service si son start est plus vieux que maintenant - Si new commence par -- supprime dans condition. + Si new commence par -- supprime dans condition. """ - if new : new = preattr(new)[1] - + if new : new = preattr(new)[1] + # Quels services sont déjà à redémarrer ? serv = {} # { service : [ arguments ] } - serv_dates = {} # { service : [ dates de restart ] } - services = [] + serv_dates = {} # { service : [ dates de restart ] } + services = [] 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',[]))) - - # Retourne la liste des services à redémarrer - if not new : return services + serv_dates[s['cn'][0]] = s.get('start',[]) + services.append(service(s['cn'][0],s.get('args',[]),s.get('start',[]))) - # Effacement d'un service - if new[0] == '-' : - if new[1] == '-' : - # Double -- on enlève quelque soit la date - remove_dn='cn=%s,%s' % ( new[2:], self.base_services ) - else : - # On enlève uniquement si la date est passée - remove_dn='cn=%s,%s' % ( new[1:], self.base_services ) - if not serv.has_key(new[1:]) : - # Existe pas => rien à faire - return - keep_date=[] - for date in serv_dates[new[1:]] : - if time.time() < 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 - - if remove_dn : - # Supression - try : self.conn.delete_s(remove_dn) - except : pass - # Si n'existe pas => Erreur mais le résultat est la. - return + # Retourne la liste des services à redémarrer + if not new : return services + + # Effacement d'un service + if new[0] == '-' : + if new[1] == '-' : + # Double -- on enlève quelque soit la date + 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 ) + if not serv.has_key(new[1:]) : + # Existe pas => rien à faire + return + keep_date=[] + for date in serv_dates[new[1:]] : + if time.time() < 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 + + if remove_dn : + # Supression + try : self.conn.delete_s(remove_dn) + except : pass + # Si n'existe pas => Erreur mais le résultat est la. + return serv_dn = 'cn=%s,%s' % ( new, self.base_services ) # 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) - if type(start) == int : start = [ start ] - start=map(lambda x:preattr(x)[1] ,start) - + if type(start) == int : start = [ start ] + start=map(lambda x:preattr(x)[1] ,start) + if new in serv.keys() : - modlist = [] - + modlist = [] + new_args = [] - # Nouveaux arguments ? + # Nouveaux arguments ? for arg in args : if arg not in serv[new] : new_args.append(arg) - if new_args : - modlist += ldap.modlist.modifyModlist({ 'args' : serv[new]}, { 'args' : serv[new] + new_args }) - - new_date = [] - # Nouvelle date ? - for date in start : - if date not in serv_dates[new] : - new_date.append(date) - if new_date : - modlist += ldap.modlist.modifyModlist({'start' : serv_dates[new]}, { 'start' : serv_dates[new] + new_date }) + if new_args : + modlist += ldap.modlist.modifyModlist({ 'args' : serv[new]}, { 'args' : serv[new] + new_args }) + + new_date = [] + # Nouvelle date ? + for date in start : + if date not in serv_dates[new] : + new_date.append(date) + if new_date : + modlist += ldap.modlist.modifyModlist({'start' : serv_dates[new]}, { 'start' : serv_dates[new] + new_date }) if modlist : try : @@ -478,11 +485,11 @@ class crans_ldap : pass # else rien à faire else : - # Entrée non présente -> ajout + # Entrée non présente -> ajout modlist = ldap.modlist.addModlist({ 'objectClass' : 'service' , 'cn' : new , 'args' : args , - 'start' : start } ) + 'start' : start } ) try : self.conn.add_s(serv_dn,modlist) except ldap.ALREADY_EXISTS : @@ -527,8 +534,8 @@ class crans_ldap : el = '(%s=%s*)' % ( champ, expr) elif champ == 'macAddress' : # Formatage adresse mac - try: el = '(macAddress=%s)' % format_mac(expr) - except : pass + try: el = '(macAddress=%s)' % format_mac(expr) + except : pass elif champ == 'paiement' and expr == 'ok' : # Paiement donnant droit à une connexion maintenant ? # il doit avoir payé pour @@ -614,14 +621,14 @@ class crans_ldap : if not r['machine'] and not r['adherent'] and not r['club'] : # Pas de réponses return result - elif len(conds) == 1 : - # Filtre sur un seul champ - # => on retourne tout - for i in filtres : - if not r[i] : continue - for res in r[i] : - result[i].append(globals()[i](res,mode,self.conn)) - elif not r['adherent'] and not r['club'] : + elif len(conds) == 1 : + # Filtre sur un seul champ + # => on retourne tout + for i in filtres : + if not r[i] : continue + for res in r[i] : + result[i].append(globals()[i](res,mode,self.conn)) + elif not r['adherent'] and not r['club'] : # Il n'y avait seulement un filtre machine # => on retourne uniquement les machines trouvées for m in r['machine'] : @@ -804,23 +811,23 @@ 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))) except : raise ValueError(u'Date de début blacklist invalide') - if new[1] == 'now' : + if new[1] == 'now' : new[1] = time.strftime(date_format) - fin=0 - elif new[1]!='-' : + fin=0 + elif new[1]!='-' : try : fin=int(time.mktime(time.strptime(new[1],date_format))) except : raise ValueError(u'Date de fin blacklist invalide') - else : - fin = -1 + else : + fin = -1 - if debut == fin : - raise ValueError(u'Dates de début et fin identiques') - + if debut == fin : + raise ValueError(u'Dates de début et fin identiques') + new_c = ','.join(new) new_c = preattr(new_c)[1] @@ -832,16 +839,16 @@ class base_classes_crans(crans_ldap) : if self._data['blacklist'] != liste : self._data['blacklist']=liste self.modifs.append('blacklist_' + new[2]) - 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 ] - else : - if debut not in self.__blacklist_restart[new[2]] : - self.__blacklist_restart[new[2]].append(debut) - if fin!=-1 and fin not in self.__blacklist_restart[new[2]] : - self.__blacklist_restart[new[2]].append(fin) - + 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 ] + else : + if debut not in self.__blacklist_restart[new[2]] : + self.__blacklist_restart[new[2]].append(debut) + if fin!=-1 and fin not in self.__blacklist_restart[new[2]] : + self.__blacklist_restart[new[2]].append(fin) + return liste def restore(self) : @@ -916,13 +923,13 @@ class base_classes_crans(crans_ldap) : modif = modif.replace("solde", "debit %s Euros" % str(diff) ) else : modif = modif.replace("solde", "credit %s Euros" % str(-diff) ) - - if 'droits' in self.modifs: - anciens_droits = self._init_data.get('droits',[]) - nouveaux_droits = self._data.get('droits',[]) - droits_ajoutes = ''.join( [ '+%s' % decode(d) for d in nouveaux_droits if d not in anciens_droits ] ) - droits_enleves = ''.join( [ '-%s' % decode(d) for d in anciens_droits if d not in nouveaux_droits ] ) - modif = modif.replace("droits", "droits : " + droits_ajoutes + droits_enleves ) + + if 'droits' in self.modifs: + anciens_droits = self._init_data.get('droits',[]) + nouveaux_droits = self._data.get('droits',[]) + droits_ajoutes = ''.join( [ '+%s' % decode(d) for d in nouveaux_droits if d not in anciens_droits ] ) + droits_enleves = ''.join( [ '-%s' % decode(d) for d in anciens_droits if d not in nouveaux_droits ] ) + modif = modif.replace("droits", "droits : " + droits_ajoutes + droits_enleves ) timestamp = localtime() hist = "%s, %s" % ( time.strftime(date_format, timestamp), script_utilisateur ) @@ -987,9 +994,9 @@ class base_classes_crans(crans_ldap) : ### Génération de la liste de services à redémarrer # Quasiement tout est traité dans les classes filles. - if hasattr(self,"__blacklist_restart") : - for n,t in self.__blacklist_restart.items() : - self.services_to_restart("blacklist_%s"%n,[],t) + 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() @@ -2173,8 +2180,8 @@ class machine(base_classes_crans) : def exempt(self,new=None) : """ - Liste des réseaux vers lesquels on ne compte pas l'upload - Cette liste est transférée dans la base postgres de komaz + Liste des réseaux vers lesquels on ne compte pas l'upload + Cette liste est transférée dans la base postgres de komaz Pour ajouter un réseau new doit être la chaîne représentant le réseau à ajouter Pour modifier new doit être une liste de la forme : @@ -2375,7 +2382,7 @@ class machine(base_classes_crans) : self.services_to_restart('conf_wifi_ng') # Reconfiguration clients wifi ? - if self.__typ in ('wifi','borne') and ( 'ipHostNumber' in self.modifs or 'host' in self.modifs or 'macAddress' in self.modifs ) : + if self.__typ in ('wifi','borne') and ( 'ipHostNumber' in self.modifs or 'host' in self.modifs or 'macAddress' in self.modifs ) : self.services_to_restart('conf_wifi_ng') # Regénération blackliste nécessaire ? @@ -2389,10 +2396,10 @@ class machine(base_classes_crans) : self.services_to_restart('autostatus') self.services_to_restart('mail_modif',['ip=%s' % self.ip()]) - # Synchronisation avec la base pgsql pour les exemptions - if 'exempt' in self.modifs or 'ipHostNumber' in self.modifs : - self.services_to_restart('exemptions') - + # Synchronisation avec la base pgsql pour les exemptions + if 'exempt' in self.modifs or 'ipHostNumber' in self.modifs : + self.services_to_restart('exemptions') + # Remise à zéro self.modifs=[] @@ -2500,13 +2507,13 @@ if __name__ == '__main__' : import sys if 'lock' in sys.argv : db = crans_ldap() - print db.list_locks() + for lock in db.list_locks() : + print "%s\t %s" % (lock[1]["lockid"][0],lock[0].split(',')[0]) if 'purgelock' in sys.argv : db = crans_ldap() db.remove_lock('*') - if 'menage' in sys.argv : print "Ménage des machines des adhérents partis..." db = crans_ldap()