Possibilit de mettre des dates de restart.
darcs-hash:20051001225453-41617-f1ffb18f1035dd0c69cd16fd594380cf945c749b.gz
This commit is contained in:
parent
c5cbab958c
commit
201e09064a
1 changed files with 77 additions and 18 deletions
|
@ -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)
|
||||
|
||||
# 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',[])
|
||||
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
|
||||
|
||||
# Quels services sont déjà à redémarrer ?
|
||||
serv = {} # { service : [ arguments ] }
|
||||
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_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 })
|
||||
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 :
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue