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)