diff --git a/src/python/dm/__init__.py b/src/python/dm/__init__.py index 39a6cd5e53fb558096cefc7153879295f49223bb..68b3c89b95ddad4a98f17804af4d831d695f6aa1 100644 --- a/src/python/dm/__init__.py +++ b/src/python/dm/__init__.py @@ -1 +1 @@ -__version__ = "0.8 (2016.01.25)" +__version__ = "0.8 (2016.01.26)" diff --git a/src/python/dm/common/processing/plugins/gridftpFileTransferPlugin.py b/src/python/dm/common/processing/plugins/gridftpFileTransferPlugin.py index 89ebabc3b1a14da1b8cb8c7113530387653c5dda..860293487d420b55715f221ed080b5de51353761 100755 --- a/src/python/dm/common/processing/plugins/gridftpFileTransferPlugin.py +++ b/src/python/dm/common/processing/plugins/gridftpFileTransferPlugin.py @@ -42,6 +42,7 @@ class GridftpFileTransferPlugin(FileTransferPlugin): storageHost = uploadInfo['storageHost'] storageDirectory = uploadInfo['storageDirectory'] dataDirectory = uploadInfo['dataDirectory'] + self.logger.debug('Upload info: %s', uploadInfo) #(scheme, host, port, dirPath) = FtpUtility.parseFtpUrl(storageUrl, defaultPort=self.DEFAULT_PORT) ftpUtility = FtpUtility(storageHost, self.DEFAULT_PORT) storageFilePathsDict = ftpUtility.getFiles(storageDirectory, {}) @@ -83,9 +84,11 @@ class GridftpFileTransferPlugin(FileTransferPlugin): srcUrl = self.getSrcUrl(filePath, dataDirectory) # Calculate checksum + (scheme, host, port, dirPath) = FtpUtility.parseFtpUrl(dataDirectory, defaultPort=self.DEFAULT_PORT) + ftpUtility = FtpUtility(host, port) + ftpUtility.statFile(filePath, fileInfo) if self.localMd5Sum: - FileUtility.statFile(filePath, fileInfo) - FileUtility.getMd5Sum(filePath, fileInfo) + ftpUtility.getMd5Sum(filePath, fileInfo) # Transfer file self.logger.debug('Starting transfer: %s' % fileInfo) @@ -108,9 +111,9 @@ class GridftpFileTransferPlugin(FileTransferPlugin): self.logger.debug('Checksum test passed for file %s' % filePath) # Remove file - if self.deleteOriginal: - self.logger.debug('Deleting file %s' % filePath) - OsUtility.removeFile(srcUrl) + #if self.deleteOriginal: + # self.logger.debug('Deleting file %s' % filePath) + # OsUtility.removeFile(srcUrl) ####################################################################### # Testing. diff --git a/src/python/dm/common/processing/plugins/mongoDbFileCatalogPlugin.py b/src/python/dm/common/processing/plugins/mongoDbFileCatalogPlugin.py index fe5e35758031745408d645658a6cd86a8a4ad20b..00850c81430b7b822ebb25758b5a15f53c4a1b4e 100755 --- a/src/python/dm/common/processing/plugins/mongoDbFileCatalogPlugin.py +++ b/src/python/dm/common/processing/plugins/mongoDbFileCatalogPlugin.py @@ -29,7 +29,7 @@ class MongoDbFileCatalogPlugin(FileProcessor): # Prepare catalogging entry fileInfo2 = {} - for key in ['md5Sum', 'fileSize', 'fileCreationTime', 'fileCreationTimeStamp']: + for key in ['md5Sum', 'fileSize', 'fileCreationTime', 'fileCreationTimeStamp', 'fileModificationTime', 'fileModificationTimeStamp']: if fileInfo.has_key(key): fileInfo2[key] = fileInfo.get(key, '') fileLocations = fileInfo.get('fileLocations', []) diff --git a/src/python/dm/common/processing/plugins/rsyncFileTransferPlugin.py b/src/python/dm/common/processing/plugins/rsyncFileTransferPlugin.py index f4d1b8a0219224b217c0cbffe7e651522b9543b7..aa5c4d31bcbae30c5b27040fcaf8c77aeb8cab8c 100755 --- a/src/python/dm/common/processing/plugins/rsyncFileTransferPlugin.py +++ b/src/python/dm/common/processing/plugins/rsyncFileTransferPlugin.py @@ -54,6 +54,7 @@ class RsyncFileTransferPlugin(FileTransferPlugin): srcUrl = self.getSrcUrl(filePath, dataDirectory) # Calculate checksum + FileUtility.statFile(filePath, fileInfo) if self.localMd5Sum: FileUtility.statFile(filePath, fileInfo) FileUtility.getMd5Sum(filePath, fileInfo) diff --git a/src/python/dm/common/utility/ftpUtility.py b/src/python/dm/common/utility/ftpUtility.py index 8a5540ea63e41e7aa1abb0dc29b798bf927219c3..a6a1a130b8f3ed7a8a5d0ce0351d4c7845c0e3ae 100755 --- a/src/python/dm/common/utility/ftpUtility.py +++ b/src/python/dm/common/utility/ftpUtility.py @@ -1,7 +1,10 @@ #!/usr/bin/env python import copy +import os +import time from ftplib import FTP +from dm.common.utility.timeUtility import TimeUtility from dm.common.utility.loggingManager import LoggingManager import urlparse @@ -13,6 +16,7 @@ class FtpUtility: self.username = username self.password = password self.ftpClient = None + self.mlsdFileStatDict = {} @classmethod def parseFtpUrl(cls, url, defaultHost=None, defaultPort=None): @@ -64,6 +68,16 @@ class FtpUtility: elif type == 'file': self.mlsdFileDict[name] = parseDict + def __parseMlsdFileStat(self, line): + # ['Type=dir', 'Modify=20151018024430', 'Size=4096', 'Perm=el', 'UNIX.mode=0775', 'UNIX.owner=sveseli', 'UNIX.uid=500', 'UNIX.group=sveseli', 'UNIX.gid=500', 'Unique=fd00-c2e3e', ' dir2\r'] + parts = line.split(';') + parseDict = {} + self.__parseKeyValue(parts[0], parseDict) + self.__parseKeyValue(parts[1], parseDict) + self.__parseKeyValue(parts[2], parseDict) + name = parts[-1].strip() + self.mlsdFileStatDict[name] = parseDict + def getFiles(self, dirPath, fileDict={}): if not self.ftpClient: self.ftpClient = self.getFtpClient(self.host, self.port, self.username, self.password) @@ -79,10 +93,35 @@ class FtpUtility: self.getFiles(dirPath2,fileDict) return fileDict + def getMd5Sum(self, filePath, fileInfo={}): + if not self.ftpClient: + self.ftpClient = self.getFtpClient(self.host, self.port, self.username, self.password) + md5Sum = self.ftpClient.sendcmd('CKSM MD5 0 -1 %s' % filePath).split()[-1] + fileInfo['md5Sum'] = md5Sum + return md5Sum + + def statFile(self, filePath, fileInfo={}): + fileName = os.path.basename(filePath) + if not self.ftpClient: + self.ftpClient = self.getFtpClient(self.host, self.port, self.username, self.password) + # Need this to be class members for the callback function + self.ftpClient.retrlines('MLSD %s' % filePath, self.__parseMlsdFileStat) + fileStatDict = self.mlsdFileStatDict.get(fileName) + if fileStatDict: + fileInfo['fileSize'] = fileStatDict.get('Size') + modifyTime = fileStatDict.get('Modify') + modifyTime = time.mktime(time.strptime(modifyTime, '%Y%m%d%H%M%S')) + fileInfo['fileModificationTime'] = modifyTime + fileInfo['fileModificationTimeStamp'] = TimeUtility.formatLocalTimeStamp(modifyTime) + del self.mlsdFileStatDict[fileName] + return fileInfo + ####################################################################### # Testing. if __name__ == '__main__': - ftpUtility = FtpUtility('dmstorage', 2811) - files=ftpUtility.getFiles('/opt/DM/data/ESAF/e1') + ftpUtility = FtpUtility('s8dserv', 2811) + files = ftpUtility.getFiles('/export/8-id-i/test') print files + print ftpUtility.getMd5Sum('/export/8-id-i/test/testfile01') + print ftpUtility.statFile('/export/8-id-i/test/testfile01') diff --git a/src/python/dm/daq_web_service/service/experimentSessionController.py b/src/python/dm/daq_web_service/service/experimentSessionController.py index 8fa338a9036c84b903d25cb80efb8abed9bed58a..09786ff61b5aa64c87683864576546599ba1b0ac 100755 --- a/src/python/dm/daq_web_service/service/experimentSessionController.py +++ b/src/python/dm/daq_web_service/service/experimentSessionController.py @@ -27,7 +27,7 @@ class ExperimentSessionController(DmSessionController): if not dataDirectory: raise InvalidRequest('Missing data directory.') dataDirectory = Encoder.decode(dataDirectory) - if not dataDirectory.startswith(os.sep): + if not dataDirectory.startswith('/') and not dataDirectory.count('://'): raise InvalidRequest('Data directory must be an absolute path.') daqInfo = {} @@ -70,7 +70,7 @@ class ExperimentSessionController(DmSessionController): if not dataDirectory: raise InvalidRequest('Missing data directory.') dataDirectory = Encoder.decode(dataDirectory) - if not dataDirectory.startswith(os.sep): + if not dataDirectory.startswith('/') and not dataDirectory.count('://'): raise InvalidRequest('Data directory must be an absolute path.') daqInfo = {}