#!/usr/bin/python """Hello World FUSE example in Python from http://osdir.com/ml/file-systems.fuse.devel/2006-06/msg00000.html """ import os, sys, stat, errno, syslog import fuse from fuse import Fuse fuse.fuse_python_api = (0, 2) HELLO = { 'script': None, 'path': '/hello', 'string': 'Hello World!\n', 'mountpoint': '/mnt/fuse/hello' } if len(sys.argv) and sys.argv[0] and os.path.exists(sys.argv[0]): HELLO['script'] = os.path.abspath(sys.argv[0]) print >>sys.stderr, 'initialized %s' % HELLO['script'] else: print >>sys.stderr, 'could not initialize script properly' class HelloStat(fuse.Stat): def __init__(self): attributes = ['st_mode', 'st_ino', 'st_dev', 'st_nlink', 'st_uid', 'st_gid', 'st_size', 'st_atime', 'st_mtime', 'st_ctime'] from_source = ['st_uid', 'st_gid', 'st_atime', 'st_ctime', 'st_mtime'] initial = dict([[attr, 0] for attr in attributes]) try: if HELLO['script']: syslog.syslog(syslog.LOG_INFO, 'stat %s' % HELLO['script']) source_stat = os.stat(HELLO['script']) for attribute in from_source: initial[attribute] = getattr(source_stat, attribute, 0) except: pass syslog.syslog(syslog.LOG_INFO, 'initial stat: %s' % repr(initial)) for attribute in attributes: setattr(self, attribute, initial[attribute]) class HelloFS(Fuse): def getattr(self, path): st = HELLO['stat'] = HelloStat() if path == '/': st.st_mode = stat.S_IFDIR | 0755 st.st_nlink = 2 elif path == HELLO['path']: st.st_mode = stat.S_IFREG | 0444 st.st_nlink = 1 st.st_size = len(HELLO['string']) else: return -errno.ENOENT return st def readdir(self, path, offset): ret = ['.', '..', HELLO['path'][1:]] for r in ret: yield fuse.Direntry(r) def open(self,path,flags): if path!=HELLO['path']: return -errno.ENOENT if (flags & 3) != os.O_RDONLY: return -errno.EACCES return 0 def read(self,path,size,offset): if path != HELLO['path']: return -errno.ENOENT slen = len(HELLO['string']) if offset < slen: if (offset+size)>slen: size = slen-offset buf = HELLO['string'][offset:offset+size] else: buf = '' return buf def main(): usage=""" Userspace hello example """ + Fuse.fusage syslog.openlog('hellofuse', syslog.LOG_PID, syslog.LOG_KERN) syslog.syslog(syslog.LOG_INFO, 'starting FUSE "hello world"') server = HelloFS(version="%prog " + fuse.__version__, usage=usage, dash_s_do='setsingle') server.parse(values=server, errex=1) server.main() if __name__=='__main__': if len(sys.argv) < 2: sys.argv.append(HELLO['mountpoint']) main()