3 # A FUSE filesystem implementation to provide a file interface for
4 # vsys_publickeys VSYS script. To be used by OMF Resource Controller.
6 # Usage: ./keys_fs.py /keys
11 # Sliver has to have following ccapabilities set.
15 # we also depend on fuse and python-fuse packages.
28 fuse.fuse_python_api = (0, 2)
32 all_ssh_keys_dict = None
39 fin = os.open("/vsys/publickeys.in", os.O_NONBLOCK | os.O_WRONLY)
40 fout = os.open("/vsys/publickeys.out", os.O_NONBLOCK | os.O_RDONLY)
42 in_flags = fcntl.fcntl(fin, fcntl.F_GETFL)
43 out_flags = fcntl.fcntl(fin, fcntl.F_GETFL)
45 res = select.select([fout], [], [])
47 fcntl.fcntl(fin, fcntl.F_SETFL, in_flags & ~os.O_NONBLOCK)
48 fcntl.fcntl(fout, fcntl.F_SETFL, out_flags & ~os.O_NONBLOCK)
50 f = os.fdopen(fout, "r")
51 all_ssh_keys = f.read()
56 global all_ssh_keys_dict
58 return all_ssh_keys_dict
63 for line in keys.split('\n'):
73 if f.startswith("ssh-"):
82 filename = "%s_%s" % (filename, f)
88 files["unnamed_key%d" % num] = line
90 files[filename] = "%s\n" % line
94 class MyStat(fuse.Stat):
109 def __init__(self, *args, **kw):
110 Fuse.__init__(self, *args, **kw)
112 def getattr(self, path):
115 st.st_mode = stat.S_IFDIR | 0755
117 elif os.path.basename(path) == "all":
118 st.st_mode = stat.S_IFREG | 0444
120 st.st_size = len(read_keys())
122 filename = os.path.basename(path)
124 st.st_mode = stat.S_IFREG | 0444
127 st.st_size = len(keys[filename])
132 def readdir(self, path, offset):
133 files = ['.', '..', "all"]
135 files.extend(keys.keys())
137 yield fuse.Direntry(r)
139 def open(self, path, flags):
140 accmode = os.O_RDONLY | os.O_WRONLY | os.O_RDWR
141 if (flags & accmode) != os.O_RDONLY:
144 def read (self, path, size, offset):
145 if os.path.basename(path) == "all":
146 content = read_keys()
148 filename = os.path.basename(path)
150 content = keys[filename]
155 if offset + size > slen:
157 buf = content[offset:offset+size]
164 if __name__ == '__main__':
167 fs.parse(values=fs, errex=1)
169 if fs.fuse_args.mount_expected():
172 sys.stderr.write("can't enter root of underlying filesystem\n")