add omf_keys directory to start working on vsys script/fs support to export users...
[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 import os
7 import stat
8 import errno
9 import fuse
10 import sys
11 from fuse import Fuse
12
13 fuse.fuse_python_api = (0, 2)
14
15 keys_dir = "/keys"
16 keys_file = os.path.join(keys_dir, "all")
17
18 # TODO: for Giovanni
19 def read_keys():
20     return "reading PLC users' public keys\n"
21
22 class MyStat(fuse.Stat):
23     def __init__(self):
24         self.st_mode = 0
25         self.st_ino = 0
26         self.st_dev = 0
27         self.st_nlink = 0
28         self.st_uid = 0
29         self.st_gid = 0
30         self.st_size = 0
31         self.st_atime = 0
32         self.st_mtime = 0
33         self.st_ctime = 0
34
35 class KeyFS(Fuse):
36
37     def __init__(self, *args, **kw):
38         Fuse.__init__(self, *args, **kw)
39
40     def getattr(self, path):
41         st = MyStat()
42         if path == '/':
43             st.st_mode = stat.S_IFDIR | 0755
44             st.st_nlink = 2
45         else:
46             st.st_mode = stat.S_IFREG | 0444
47             st.st_nlink = 1
48             st.st_size = len(read_keys())
49         return st
50
51     def readdir(self, path, offset):
52         for r in  '.', '..', os.path.basename(keys_file):
53             yield fuse.Direntry(r)
54
55     def open(self, path, flags):
56         accmode = os.O_RDONLY | os.O_WRONLY | os.O_RDWR
57         if (flags & accmode) != os.O_RDONLY:
58             return -errno.EACCES
59
60     def read (self, path, size, offset):
61         keys = read_keys()
62         slen = len(keys)
63
64         if offset < slen:
65             if offset + size > slen:
66                 size = slen - offset
67             buf = keys[offset:offset+size]
68         else:
69             buf = ''
70         return buf
71
72
73
74 if __name__ == '__main__':
75     fs = KeyFS()
76     fs.multithreaded = 0
77     fs.parse(values=fs, errex=1)
78     try:
79         if fs.fuse_args.mount_expected():
80             os.chdir("/")
81     except OSError:
82         sys.stderr.write("can't enter root of underlying filesystem\n")
83         sys.exit(1)
84
85     fs.main()