Possibilit de mettre des dates de restart.

darcs-hash:20051001225453-41617-f1ffb18f1035dd0c69cd16fd594380cf945c749b.gz
This commit is contained in:
pauget 2005-10-02 00:54:53 +02:00
parent c5cbab958c
commit 201e09064a

View file

@ -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 :