From ac2119cf623ab1c2ea2a4e46005c2eee94a85ec0 Mon Sep 17 00:00:00 2001 From: Michael Vrable Date: Tue, 30 Mar 2010 14:59:38 -0700 Subject: [PATCH] Some assorted fixes for the SFTP backend. - Automatically call the close() method of a storage backend when the object is garbage collected. - Calling stat in the SFTP backend when the file doesn't exist will raise a Cumulus NotFoundError instead of a generic IOError. - Avoid the use of keyword arguments when calling SFTPClient methods (in my testing the first argument might be called 'path' instead of 'filename', but avoid the problem altogether by just using positional arguments). --- python/cumulus/store/__init__.py | 3 +++ python/cumulus/store/sftp.py | 21 ++++++++++++--------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/python/cumulus/store/__init__.py b/python/cumulus/store/__init__.py index 84ca119..6c8c8ee 100644 --- a/python/cumulus/store/__init__.py +++ b/python/cumulus/store/__init__.py @@ -67,5 +67,8 @@ class Store (object): pass + def __del__(self): + self.close() + def open(url): return Store(url) diff --git a/python/cumulus/store/sftp.py b/python/cumulus/store/sftp.py index 5e6766e..e87c098 100644 --- a/python/cumulus/store/sftp.py +++ b/python/cumulus/store/sftp.py @@ -72,20 +72,20 @@ class SFTPStore(Store): key_file = os.path.expanduser(self.config['identityfile']) #not really nice but i don't see a cleaner way atm... try: - self.auth_key = RSAKey (filename = key_file) + self.auth_key = RSAKey (key_file) except SSHException, e: if e.message == 'Unable to parse file': - self.auth_key = DSAKey (filename = key_file) + self.auth_key = DSAKey (key_file) else: raise else: filename = os.path.expanduser('~/.ssh/id_rsa') if os.path.exists(filename): - self.auth_key = RSAKey(filename = filename) + self.auth_key = RSAKey(filename) else: filename = os.path.expanduser('~/.ssh/id_dsa') if (os.path.exists(filename)): - self.auth_key = DSSKey (filename = filename) + self.auth_key = DSSKey (filename) self.__connect() @@ -102,10 +102,10 @@ class SFTPStore(Store): return filter(type_patterns[type].match, self.client.listdir(self.path)) def get(self, type, name): - return self.client.open(filename = self.__build_fn(name), mode = 'rb') + return self.client.open(self.__build_fn(name), mode = 'rb') def put(self, type, name, fp): - remote_file = self.client.open(filename = self.__build_fn(name), mode = 'wb') + remote_file = self.client.open(self.__build_fn(name), mode = 'wb') buf = fp.read(4096) while (len(buf) > 0): remote_file.write(buf) @@ -113,11 +113,14 @@ class SFTPStore(Store): remote_file.close() def delete(self, type, name): - self.client.remove(filename = self.__build_fn(name)) + self.client.remove(self.__build_fn(name)) def stat(self, type, name): - stat = self.client.stat(filename = self.__build_fn(name)) - return {'size': stat.st_size} + try: + stat = self.client.stat(self.__build_fn(name)) + return {'size': stat.st_size} + except IOError: + raise NotFoundError def close(self): """connection has to be explicitly closed, otherwise -- 2.20.1