diff --git a/Script/eosstorage.py b/Script/eosstorage.py index 17e27d4456587734ebbe378a859ab16dde6aeb1c..58eae7403daa0f00f09cf3d5c3e95ab019b1c90c 100644 --- a/Script/eosstorage.py +++ b/Script/eosstorage.py @@ -4,38 +4,124 @@ __version__='$Revision$' from subprocess import * import castorstorage import sys +import os.path +import datetime -def sizechecksum(filename, stager, pool, logger=None): - if logger: - logInfo = {'file':logger.findCaller()[0], - 'line':logger.findCaller()[1]} - logger.debug('Fetching checksum from eos for: ' - + filename, extra = logInfo) +def init(conf): + keytabfile = conf['keytab'] + eos = eosstorage(keytabfile) + globals()['_eos'] = eos + globals()['sizechecksum'] = eos._sizechecksum + globals()['remove'] = eos._remove + globals()['backgroundcopy'] = eos._backgroundcopy + +def _authcheck(method): + def wrapped(self, *args, **kwargs): + diff = self.expiration - datetime.datetime.now() + if diff.seconds < 3600: + self._updateauth() + + return method(self,*args, **kwargs) + + return wrapped + + +class eosstorage(object): + + def __init__(self, keytab): + self.keytabfile = keytab + #keytabfile --> <username>.keytab + self.user = os.path.splitext(os.path.basename(self.keytabfile))[0] + self.expiration = None + self._updateauth() + - cmd=['xrdcp', 'root://%s//proc/user/' % stager, - '-', - '-OSmgm.cmd=fileinfo&mgm.path=%s&mgm.file.info.option=--checksum-m' % filename, - '-np'] - - xrd = Popen(cmd, stdout = PIPE, stderr = STDOUT) - ret = xrd.wait() - out = xrd.stdout.read() + def _updateauth(self): + #kinit -kt /where/ever/<user>.keytab <user> + kinit = Popen(['kinit','-kt',self.keytabfile, self.user],#'-l','100s', + stdout = PIPE, stderr = STDOUT) + ret = kinit.wait() + + if ret: + print 'kinit failed. Ret code: %d Output: %s' % \ + (ret, kinit.stdout.read()) + sys.exit(1) + + self._fetchexpiration() + + + def _fetchexpiration(self): + klist = Popen(['klist',], + stdout = PIPE, stderr = STDOUT) + ret = klist.wait() + + out = klist.stdout.read() + out = out.split('\n') + for idx,l in enumerate(out): + if 'Valid' in l: + ticket = out[idx+1] + + ticket = ticket.split() + self.expiration = datetime.datetime.strptime(' '.join(ticket[2:4]), \ + '%m/%d/%y %H:%M:%S') + + @_authcheck + def _sizechecksum(self, filename, stager, pool, logger=None): + + if logger: + logInfo = {'file':logger.findCaller()[0], + 'line':logger.findCaller()[1]} + logger.debug('Fetching checksum from eos for: ' + + filename, extra = logInfo) + + + cmd=['xrdcp', 'root://%s//proc/user/' % stager, + '-', + '-OSmgm.cmd=fileinfo&mgm.path=%s&mgm.file.info.option=--checksum-m' % filename, + '-np'] + + xrd = Popen(cmd, stdout = PIPE, stderr = STDOUT) + ret = xrd.wait() + out = xrd.stdout.read() - if not ret: - splitted = out.split(' ') + if not ret: + splitted = out.split(' ') - size = int(splitted[1].split('=')[1]) - checksum = splitted[10].split('=')[1][:8] - else: - checksum=size=None + size = int(splitted[1].split('=')[1]) + checksum = splitted[10].split('=')[1][:8] + else: + checksum=size=None + if logger: + logger.warning('Adler32 checksum or size not found for ' + + filename + ': ' + + out, extra=logInfo) + + return size,checksum + + @_authcheck + def _remove(self, dstfile, stager, pool, logger=None): + + xrd = Popen(['xrd',stager,'rm',dstfile], stdout = PIPE, + stderr = STDOUT)#, env=castorstorage._castorenv(stager,pool)) + ret = xrd.wait() + if logger: - logger.warning('Adler32 checksum or size not found for ' - + filename + ': ' - + out, extra=logInfo) + logInfo = {'file':logger.findCaller()[0],'line':logger.findCaller()[1]} + logger.debug(xrd.stdout.read(),extra = logInfo) + + return ret + + + @_authcheck + def _backgroundcopy(self, srcfile, dstfile, stager, pool, logger=None): - return size,checksum + dstfile = 'root://%s/%s' % (stager, dstfile) + cmd = ['xrdcp', '-f', srcfile, dstfile,'-ODsvcClass=%s' % pool] + xrdcp = Popen(cmd, stdout = PIPE, stderr = STDOUT) + + return xrdcp, xrdcp.pid def mkdir(directory, stager, pool, logger=None): @@ -50,28 +136,6 @@ def migrated(filename, stager, pool, logger=None): sys.exit(1) -def remove(dstfile, stager, pool, logger=None): - - xrd = Popen(['xrd',stager,'rm',dstfile], stdout = PIPE, - stderr = STDOUT)#, env=castorstorage._castorenv(stager,pool)) - ret = xrd.wait() - - if logger: - logInfo = {'file':logger.findCaller()[0],'line':logger.findCaller()[1]} - logger.debug(xrd.stdout.read(),extra = logInfo) - - return ret - - -def backgroundcopy(srcfile, dstfile, stager, pool, logger=None): - - dstfile = 'root://%s/%s' % (stager, dstfile) - cmd = ['xrdcp', '-f', srcfile, dstfile,'-ODsvcClass=%s' % pool] - xrdcp = Popen(cmd, stdout = PIPE, stderr = STDOUT) - - return xrdcp, xrdcp.pid - - copystate = castorstorage.copystate copystdout = castorstorage.copystdout