#!/usr/bin/env python import copy import stat import pysftp from dm.common.utility.timeUtility import TimeUtility from dm.common.utility.loggingManager import LoggingManager import urlparse class SftpUtility: DEFAULT_PORT = 22 def __init__(self, host, port=DEFAULT_PORT, username=None, password=None): self.host = host self.port = port self.username = username self.password = password self.sftpClient = None @classmethod def parseFtpUrl(cls, url, defaultHost=None, defaultPort=None): host = defaultHost port = defaultPort scheme = None dirPath = url if url.startswith('ftp://'): parseResult = urlparse.urlparse(url) scheme = parseResult.scheme netlocTokens = parseResult.netloc.split(':') host = netlocTokens[0] if len(netlocTokens) > 1: port = int(netlocTokens[1]) dirPath = parseResult.path return (scheme, host, port, dirPath) @classmethod def getSftpClient(cls, host, port=DEFAULT_PORT, username=None, password=None): sftp = pysftp.Connection(host, username=username, password=password, port=port) return sftp @classmethod def getLogger(cls): logger = LoggingManager.getInstance().getLogger(cls.__name__) return logger def __parseKeyValue(cls, keyValue, outputDict={}): key,value = keyValue.split('=') value = value.strip() outputDict[key] = value return outputDict def getFiles(self, dirPath, fileDict={}, replacementDirPath=None): if not self.sftpClient: self.sftpClient = self.getSftpClient(self.host, self.port, self.username, self.password) if not replacementDirPath: replacementDirPath = dirPath attrs = self.sftpClient.listdir_attr(dirPath) for attr in attrs: fileName = attr.filename mode = attr.st_mode if stat.S_ISDIR(mode): dirPath2 = '%s/%s' % (dirPath, fileName) replacementDirPath2 = '%s/%s' % (replacementDirPath, fileName) self.getFiles(dirPath2, fileDict, replacementDirPath2) elif stat.S_ISREG(mode): filePath = '%s/%s' % (replacementDirPath, fileName) fileInfo = {'fileSize' : attr.st_size, 'fileModificationTime' : attr.st_mtime } fileInfo['fileModificationTimeStamp'] = TimeUtility.formatLocalTimeStamp(attr.st_mtime) fileDict[filePath] = fileInfo return fileDict ####################################################################### # Testing. if __name__ == '__main__': sftpUtility = SftpUtility('xstor-devel', username='dmadmin') files = sftpUtility.getFiles('/data/testing/test1') print files files = sftpUtility.getFiles('/data/testing/test1', replacementDirPath='/xyz/ccc') print files