ldap_crans: menage dans les locks morts

This commit is contained in:
Daniel STAN 2013-09-01 18:53:55 +02:00
parent d228a7cb6b
commit d108b733bd

View file

@ -11,6 +11,7 @@ Licence : GPLv2
from socket import gethostname from socket import gethostname
import smtplib, re, os, random, string, time, sys, pwd import smtplib, re, os, random, string, time, sys, pwd
import errno
import ldap, ldap.modlist, ldap_passwd import ldap, ldap.modlist, ldap_passwd
import netaddr import netaddr
@ -4007,6 +4008,19 @@ def crans_ldap(readonly=False):
db = CransLdap() db = CransLdap()
return db return db
def pid_exists(pid):
"""Check whether pid exists in the current process table.
Credits:
http://stackoverflow.com/questions/568271/how-to-check-if-there-exists-a-process-with-a-given-pid
"""
if pid < 0:
return False
try:
os.kill(pid, 0)
except OSError, e:
return e.errno == errno.EPERM
else:
return True
if __name__ == '__main__': if __name__ == '__main__':
import sys import sys
@ -4014,6 +4028,7 @@ if __name__ == '__main__':
usage = u"""Usage %s [ACTION] usage = u"""Usage %s [ACTION]
--lock : donne la liste des locks actifs --lock : donne la liste des locks actifs
--purgelock : supprime tous les locks de la base LDAP --purgelock : supprime tous les locks de la base LDAP
--zombielock : supprime les locks de processus plantés sur ce serveur
--menage : supprime les machines des anciens adhérents""" % sys.argv[0] --menage : supprime les machines des anciens adhérents""" % sys.argv[0]
if len(sys.argv) != 2: if len(sys.argv) != 2:
@ -4029,6 +4044,14 @@ if __name__ == '__main__':
cprint(u"Suppression de tous les locks") cprint(u"Suppression de tous les locks")
crans_ldap().remove_lock('*') crans_ldap().remove_lock('*')
elif '--zombielock' in sys.argv:
cprint(u"Suppression des locks zombies")
for (dn, attrs) in crans_ldap().list_locks():
[lockhost, pid] = attrs['lockid'][0].split('-')[0:2]
if hostname == lockhost and not pid_exists(int(pid)):
cprint(u"Suppresion de %s" % repr(attrs))
crans_ldap().remove_lock(dn)
elif '--menage' in sys.argv: elif '--menage' in sys.argv:
cprint(u"Ménage des machines des adhérents partis...") cprint(u"Ménage des machines des adhérents partis...")
machines = crans_ldap().search('paiement!=%s&host=*.crans.org' % ann_scol , 'w')['machine'] machines = crans_ldap().search('paiement!=%s&host=*.crans.org' % ann_scol , 'w')['machine']