-# vim: ai ts=4 sts=4 et sw=4
+# Cumulus: Efficient Filesystem Backup to the Cloud
+# Copyright (C) 2010 The Cumulus Developers
+# See the AUTHORS file for a list of contributors.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
#needed for python 2.5
-from __future__ import with_statement
+
+from __future__ import division, print_function, unicode_literals
from paramiko import Transport, SFTPClient, RSAKey, DSSKey
from paramiko.config import SSHConfig
does not support password authentication or password
protected authentication keys"""
def __init__(self, url, **kw):
- if self.path.find('@') != -1:
+ if self.netloc.find('@') != -1:
user, self.netloc = self.netloc.split('@')
else:
user = None
-# if self.netloc.find(':') != -1:
-# host, self.path = self.netloc.split(':')
-# else:
-# host, self.path = self.netloc.split('/', 1)
-
self.config = SSHHostConfig(self.netloc, user)
host_keys = paramiko.util.load_host_keys(os.path.expanduser('~/.ssh/known_hosts'))
try:
- self.hostkey = host_keys[self.config['hostkeyalias']].values()[0]
+ self.hostkey = list(host_keys[self.config['hostkeyalias']].values())[0]
except:
- print str(self.config)
+ print(str(self.config))
raise
- if(self.config.has_key('identityfile')):
+ if('identityfile' in self.config):
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)
- except SSHException, e:
+ self.auth_key = RSAKey (key_file)
+ except SSHException as 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()
return "%s/%s" % (self.path, name)
def list(self, type):
- return filter(type_patterns[type].match, self.client.listdir(self.path))
+ return list(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)
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