From 201e09064a8c9c267b49054664ff9e6eb9158999 Mon Sep 17 00:00:00 2001 From: pauget Date: Sun, 2 Oct 2005 00:54:53 +0200 Subject: [PATCH] Possibilit de mettre des dates de restart. darcs-hash:20051001225453-41617-f1ffb18f1035dd0c69cd16fd594380cf945c749b.gz --- gestion/ldap_crans.py | 95 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 77 insertions(+), 18 deletions(-) diff --git a/gestion/ldap_crans.py b/gestion/ldap_crans.py index 2dbd68a6..62e1809a 100755 --- a/gestion/ldap_crans.py +++ b/gestion/ldap_crans.py @@ -176,6 +176,21 @@ def format_mac(mac) : ################################################################################## ### Définition des classes +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) + + def __str__(self) : + 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 : """ Classe de connexion à la base LDAP du crans. @@ -378,42 +393,84 @@ 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=[]) : + def services_to_restart(self,new=None,args=[],start=0) : """ Si new = None retourne la liste des services à redémarrer - Si new est founi et ne comence pas par - ajoute le service à la liste + Si new est fourni et ne commence pas par - ajoute le service à la liste avec les arguments args (args doit être une liste). - Si new est founi et ne comence par - supprime le service de la liste + 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. """ if new : new = preattr(new)[1] - if new and new[0] == '-' : - serv_dn = 'cn=%s,%s' % ( new[1:], self.base_services ) - try : self.conn.delete_s(serv_dn) - except : pass - # Si n'existe pas => Erreur mais le résultat est la. - return - + # Quels services sont déjà à redémarrer ? serv = {} # { service : [ arguments ] } + 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',[]) - - if not new : return serv + 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 + # 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 - def tr(arg) : - return preattr(arg)[1] - args=map(tr,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 new in serv.keys() : + modlist = [] + new_args = [] + # 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 }) + 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 : self.conn.modify_s(serv_dn,modlist) except ldap.TYPE_OR_VALUE_EXISTS : @@ -421,9 +478,11 @@ class crans_ldap : pass # else rien à faire else : + # Entrée non présente -> ajout modlist = ldap.modlist.addModlist({ 'objectClass' : 'service' , 'cn' : new , - 'args' : args } ) + 'args' : args , + 'start' : start } ) try : self.conn.add_s(serv_dn,modlist) except ldap.ALREADY_EXISTS :