383b43252bcb5f7d2d0b9bad21041dcebb7d6f35
[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 sys
18 import stat
19 import errno
20 import fuse
21 import fcntl
22 import select
23 from fuse import Fuse
24
25 fuse.fuse_python_api = (0, 2)
26
27 keys_dir = "/keys"
28 keys_file = os.path.join(keys_dir, "all")
29
30 def read_keys():
31     fin = os.open("/vsys/publickeys.in", os.O_NONBLOCK | os.O_WRONLY)
32     fout = os.open("/vsys/publickeys.out", os.O_NONBLOCK | os.O_RDONLY)
33     
34     in_flags = fcntl.fcntl(fin, fcntl.F_GETFL)
35     out_flags = fcntl.fcntl(fin, fcntl.F_GETFL)
36     
37     res = select.select([fout], [], [])
38     
39     fcntl.fcntl(fin, fcntl.F_SETFL, in_flags & ~os.O_NONBLOCK)
40     fcntl.fcntl(fout, fcntl.F_SETFL, out_flags & ~os.O_NONBLOCK)
41     
42     f = os.fdopen(fout, "r")
43     return f.read()
44
45 class MyStat(fuse.Stat):
46     def __init__(self):
47         self.st_mode = 0
48         self.st_ino = 0
49         self.st_dev = 0
50         self.st_nlink = 0
51         self.st_uid = 0
52         self.st_gid = 0
53         self.st_size = 0
54         self.st_atime = 0
55         self.st_mtime = 0
56         self.st_ctime = 0
57
58 class KeyFS(Fuse):
59
60     def __init__(self, *args, **kw):
61         Fuse.__init__(self, *args, **kw)
62
63     def getattr(self, path):
64         st = MyStat()
65         if path == '/':
66             st.st_mode = stat.S_IFDIR | 0755
67             st.st_nlink = 2
68         else:
69             st.st_mode = stat.S_IFREG | 0444
70             st.st_nlink = 1
71             st.st_size = len(read_keys())
72         return st
73
74     def readdir(self, path, offset):
75         for r in  '.', '..', os.path.basename(keys_file):
76             yield fuse.Direntry(r)
77
78     def open(self, path, flags):
79         accmode = os.O_RDONLY | os.O_WRONLY | os.O_RDWR
80         if (flags & accmode) != os.O_RDONLY:
81             return -errno.EACCES
82
83     def read (self, path, size, offset):
84         keys = read_keys()
85         slen = len(keys)
86
87         if offset < slen:
88             if offset + size > slen:
89                 size = slen - offset
90             buf = keys[offset:offset+size]
91         else:
92             buf = ''
93         return buf
94
95
96
97 if __name__ == '__main__':
98     fs = KeyFS()
99     fs.multithreaded = 0
100     fs.parse(values=fs, errex=1)
101     try:
102         if fs.fuse_args.mount_expected():
103             os.chdir("/")
104     except OSError:
105         sys.stderr.write("can't enter root of underlying filesystem\n")
106         sys.exit(1)
107
108     fs.main()