note on usage
[playground.git] / omf_keys / key_fs.py
1 #!/usr/bin/python
2
3 # A FUSE filesystem implementation to provide a file interface for
4 # vsys_publickeys VSYS script. To be used by OMF Resource Controller.
5
6 # Usage: ./keys_fs.py /keys
7 #        ls /keys
8 #        cat /keys/all
9
10 # NOTE:
11 # Sliver has to have following ccapabilities set.
12 # SECURE_MOUNT
13 # BINARY_MOUNT
14
15
16 import os
17 import stat
18 import errno
19 import fuse
20 import sys
21 from fuse import Fuse
22
23 fuse.fuse_python_api = (0, 2)
24
25 keys_dir = "/keys"
26 keys_file = os.path.join(keys_dir, "all")
27
28 # TODO: for Giovanni
29 def read_keys():
30     return "reading PLC users' public keys\n"
31
32 class MyStat(fuse.Stat):
33     def __init__(self):
34         self.st_mode = 0
35         self.st_ino = 0
36         self.st_dev = 0
37         self.st_nlink = 0
38         self.st_uid = 0
39         self.st_gid = 0
40         self.st_size = 0
41         self.st_atime = 0
42         self.st_mtime = 0
43         self.st_ctime = 0
44
45 class KeyFS(Fuse):
46
47     def __init__(self, *args, **kw):
48         Fuse.__init__(self, *args, **kw)
49
50     def getattr(self, path):
51         st = MyStat()
52         if path == '/':
53             st.st_mode = stat.S_IFDIR | 0755
54             st.st_nlink = 2
55         else:
56             st.st_mode = stat.S_IFREG | 0444
57             st.st_nlink = 1
58             st.st_size = len(read_keys())
59         return st
60
61     def readdir(self, path, offset):
62         for r in  '.', '..', os.path.basename(keys_file):
63             yield fuse.Direntry(r)
64
65     def open(self, path, flags):
66         accmode = os.O_RDONLY | os.O_WRONLY | os.O_RDWR
67         if (flags & accmode) != os.O_RDONLY:
68             return -errno.EACCES
69
70     def read (self, path, size, offset):
71         keys = read_keys()
72         slen = len(keys)
73
74         if offset < slen:
75             if offset + size > slen:
76                 size = slen - offset
77             buf = keys[offset:offset+size]
78         else:
79             buf = ''
80         return buf
81
82
83
84 if __name__ == '__main__':
85     fs = KeyFS()
86     fs.multithreaded = 0
87     fs.parse(values=fs, errex=1)
88     try:
89         if fs.fuse_args.mount_expected():
90             os.chdir("/")
91     except OSError:
92         sys.stderr.write("can't enter root of underlying filesystem\n")
93         sys.exit(1)
94
95     fs.main()