From 68ab51548954e4871fff25d5b05ceeba6c5b20b4 Mon Sep 17 00:00:00 2001
From: Sinisa Veseli <sveseli@aps.anl.gov>
Date: Mon, 2 Nov 2015 13:50:08 +0000
Subject: [PATCH] add ftp utility for monitoring file systems

---
 src/python/dm/common/utility/ftpUtility.py | 70 ++++++++++++++++++++++
 1 file changed, 70 insertions(+)
 create mode 100755 src/python/dm/common/utility/ftpUtility.py

diff --git a/src/python/dm/common/utility/ftpUtility.py b/src/python/dm/common/utility/ftpUtility.py
new file mode 100755
index 00000000..16c48845
--- /dev/null
+++ b/src/python/dm/common/utility/ftpUtility.py
@@ -0,0 +1,70 @@
+#!/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 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)
+        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('zagreb', 2811)
+    files=ftpUtility.getFiles('/tmp/test')
+    print files
-- 
GitLab