Skip to content
Snippets Groups Projects
ftpUtility.py 2.99 KiB
Newer Older
#!/usr/bin/env python

import copy
from ftplib import FTP
from dm.common.utility.loggingManager import LoggingManager

class FtpUtility:

    def __init__(self, host, port, username=None, password=None):
        self.host = host
        self.port = port
        self.username = username
        self.password = password
        self.ftpClient = 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 getFtpClient(cls, host, port, username=None, password=None):
        ftp = FTP()
        ftp.connect(host, port)
        ftp.login(username, password)
        return ftp

    @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 __parseMlsdOutput(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()
        parseDict['Name'] = name
        type = parseDict.get('Type', '')
        if type == 'dir' :
            self.mlsdDirList.append(name)
        elif type == 'file':
            self.mlsdFileDict[name] = parseDict

    def getFiles(self, dir, fileDict={}):
        if not self.ftpClient:
            self.ftpClient = self.getFtpClient(self.host, self.port, self.username, self.password)
        # Need these to be class members for the callback function
        self.mlsdFileDict = {}
        self.mlsdDirList = []
        self.ftpClient.retrlines('MLSD %s' % dir, self.__parseMlsdOutput)
        for (fileName,fileInfo) in self.mlsdFileDict.items():
            filePath = '%s/%s' % (dir, fileName)
            fileDict[filePath] = fileInfo
        for d in copy.copy(self.mlsdDirList):
            dirPath = '%s/%s' % (dir,d)
            self.getFiles(dirPath,fileDict)
        return fileDict

#######################################################################
# Testing.

if __name__ == '__main__':
    ftpUtility = FtpUtility('dmstorage', 2811)
    files=ftpUtility.getFiles('/opt/DM/data/ESAF/e1')
    print files