github.com/slspeek/camlistore_namedsearch@v0.0.0-20140519202248-ed6f70f7721a/lib/python/fusepy/sftp.py (about) 1 #!/usr/bin/env python 2 3 from sys import argv, exit 4 from time import time 5 6 from paramiko import SSHClient 7 8 from fuse import FUSE, Operations 9 10 11 class SFTP(Operations): 12 """A simple SFTP filesystem. Requires paramiko: 13 http://www.lag.net/paramiko/ 14 15 You need to be able to login to remote host without entering a password. 16 """ 17 def __init__(self, host, path='.'): 18 self.client = SSHClient() 19 self.client.load_system_host_keys() 20 self.client.connect(host) 21 self.sftp = self.client.open_sftp() 22 self.root = path 23 24 def __del__(self): 25 self.sftp.close() 26 self.client.close() 27 28 def __call__(self, op, path, *args): 29 print '->', op, path, args[0] if args else '' 30 ret = '[Unhandled Exception]' 31 try: 32 ret = getattr(self, op)(self.root + path, *args) 33 return ret 34 except OSError, e: 35 ret = str(e) 36 raise 37 except IOError, e: 38 ret = str(e) 39 raise OSError(*e.args) 40 finally: 41 print '<-', op 42 43 def chmod(self, path, mode): 44 return self.sftp.chmod(path, mode) 45 46 def chown(self, path, uid, gid): 47 return self.sftp.chown(path, uid, gid) 48 49 def create(self, path, mode): 50 f = self.sftp.open(path, 'w') 51 f.chmod(mode) 52 f.close() 53 return 0 54 55 def getattr(self, path, fh=None): 56 st = self.sftp.lstat(path) 57 return dict((key, getattr(st, key)) for key in ('st_atime', 'st_gid', 58 'st_mode', 'st_mtime', 'st_size', 'st_uid')) 59 60 def mkdir(self, path, mode): 61 return self.sftp.mkdir(path, mode) 62 63 def read(self, path, size, offset, fh): 64 f = self.sftp.open(path) 65 f.seek(offset, 0) 66 buf = f.read(size) 67 f.close() 68 return buf 69 70 def readdir(self, path, fh): 71 return ['.', '..'] + [name.encode('utf-8') for name in self.sftp.listdir(path)] 72 73 def readlink(self, path): 74 return self.sftp.readlink(path) 75 76 def rename(self, old, new): 77 return self.sftp.rename(old, self.root + new) 78 79 def rmdir(self, path): 80 return self.sftp.rmdir(path) 81 82 def symlink(self, target, source): 83 return self.sftp.symlink(source, target) 84 85 def truncate(self, path, length, fh=None): 86 return self.sftp.truncate(path, length) 87 88 def unlink(self, path): 89 return self.sftp.unlink(path) 90 91 def utimens(self, path, times=None): 92 return self.sftp.utime(path, times) 93 94 def write(self, path, data, offset, fh): 95 f = self.sftp.open(path, 'r+') 96 f.seek(offset, 0) 97 f.write(data) 98 f.close() 99 return len(data) 100 101 102 if __name__ == "__main__": 103 if len(argv) != 3: 104 print 'usage: %s <host> <mountpoint>' % argv[0] 105 exit(1) 106 fuse = FUSE(SFTP(argv[1]), argv[2], foreground=True, nothreads=True)