From: Michael Vrable Date: Tue, 30 Mar 2010 21:59:38 +0000 (-0700) Subject: Some assorted fixes for the SFTP backend. X-Git-Url: https://git.vrable.net/?a=commitdiff_plain;h=ac2119cf623ab1c2ea2a4e46005c2eee94a85ec0;p=cumulus.git 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). --- 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