diff --git a/Script/CastorScript.py b/Script/CastorScript.py index bd397dd52deb9506edea888e25fce39f5f3dee70..577c6cd2ddd8dc34067d92cd873049fdff4f09ba 100755 --- a/Script/CastorScript.py +++ b/Script/CastorScript.py @@ -21,6 +21,7 @@ from time import time import threading import os.path from os import environ, getenv, umask +import datetime import signal import logging, logging.handlers from utils import set_log_level,formatter @@ -193,10 +194,16 @@ def main(conf): if conf.ERSenabled: check.start() logger.info('Manager,Copy, Delete and Check Threads started') + + ##### Setup Kerberos if needed ##### + if conf.keytab: + + krb_setcache(conf.krbcache,logger) + krb_exp = krb_updatetoken(conf.keytab, conf.krbuser, logger) ##### Every DBTimeout check if connection to Oracle database is still good ##### while not exitFlag: - #signal.pause() + logger.info('Check for connection to Metadata Database') #Keep always a fresh connection @@ -215,6 +222,7 @@ def main(conf): db = checkDB(db,logger,dblogger,parser) event.wait(DBTimeout) + ##### If update signal, update configuration ##### if confFlag: conf = Conf.Conf(sys.argv[1]) @@ -233,7 +241,12 @@ def main(conf): logger.info('Configuration updated') # end if - + # Update KRB token, if needed: + if conf.keytab: + now = datetime.datetime.now() + if now >= krb_exp or (krb_exp-now).seconds < 3600: + krb_exp = krb_updatetoken(conf.keytab, conf.krbuser, logger) + #Check worker states if not (manager.isAlive() and copy.isAlive() and delete.isAlive()): logger.warning('Inconsistent worker states. Manager-->%s Copy-->%s Delete-->%s. Exiting!' \ @@ -306,6 +319,50 @@ def checkDB(db,logger,dblogger,parser): # end checkDB() +def krb_setcache(krbcachefile, logger): + try: + os.environ['KRB5CCNAME'] = krbcachefile + except TypeError as ex: + logger.warning('KRB Cache file setting failed: %s ' % str(ex)) + + +def krb_updatetoken(keytab, user, logger): + kinit = Popen(['kinit','-kt',keytab,user],#'-l','100s', + stdout = PIPE, stderr = STDOUT) + ret = kinit.wait() + + if ret: + logger.warning('kinit failed. Ret code: %d Output: %s' % \ + (ret, kinit.stdout.read())) + return None + else: + logger.debug('kinit succeeded. Output: %s' % kinit.stdout.read()) + return fetch_kbr_token_expiration(logger) + + + +def krb_tokenexpiration(logger): + + klist = Popen(['klist',], + stdout = PIPE, stderr = STDOUT) + ret = klist.wait() + + out = klist.stdout.read() + logger.debug('klist done. Return code: %d Output: %s' % (ret,out)) + + out = klist.stdout.read() + out = out.split('\n') + for idx,l in enumerate(out): + if 'Valid' in l: + ticket = out[idx+1] + break + + ticket = ticket.split() + logger.debug('Ticket expiration: %s' % ticket) + return datetime.datetime.strptime(' '.join(ticket[2:4]), \ + '%m/%d/%y %H:%M:%S') + + if __name__ == '__main__': main(conf) diff --git a/Script/Conf.py b/Script/Conf.py index 5dfe485fd4881b963cbb6ba7ac7fa6c269f9265b..ad3b8075fb630b2cb8f2815d52c53be51262cccc 100755 --- a/Script/Conf.py +++ b/Script/Conf.py @@ -127,6 +127,22 @@ class Conf: except AttributeError: pass + #Kerberos Auth + try: + self.keytab = cfg.Keytab + except AttributeError: + self.keytab = None + + try: + self.krbuser = cfg.KrbUser + except AttributeError: + self.krbuser = None + + try: + self.krbcache = cfg.KrbCache + except AttributeError: + self.krbcache = None + ########## MANAGER THREAD ##########