create individual files for each key.
Barış Metin [Wed, 23 Jun 2010 17:14:57 +0000 (19:14 +0200)]
omf_keys/key_fs.py

index 383b432..e3deadc 100644 (file)
@@ -11,6 +11,9 @@
 # Sliver has to have following ccapabilities set.
 # SECURE_MOUNT
 # BINARY_MOUNT
+#
+# we also depend on fuse and python-fuse packages.
+#
 
 
 import os
@@ -25,7 +28,7 @@ from fuse import Fuse
 fuse.fuse_python_api = (0, 2)
 
 keys_dir = "/keys"
-keys_file = os.path.join(keys_dir, "all")
+
 
 def read_keys():
     fin = os.open("/vsys/publickeys.in", os.O_NONBLOCK | os.O_WRONLY)
@@ -42,6 +45,23 @@ def read_keys():
     f = os.fdopen(fout, "r")
     return f.read()
 
+def all_keys():
+    keys = read_keys()
+
+    files = {}
+    num = 0
+    for line in keys.split('\n'):
+        line = line.strip()
+        fields = line.split()
+        try:
+            name = fields[2]
+            files[name] = line
+        except:
+            num += 1
+            files["unnamed_key%d" % num] = line
+
+    return files
+
 class MyStat(fuse.Stat):
     def __init__(self):
         self.st_mode = 0
@@ -65,14 +85,26 @@ class KeyFS(Fuse):
         if path == '/':
             st.st_mode = stat.S_IFDIR | 0755
             st.st_nlink = 2
-        else:
+        elif os.path.basename(path) == "all":
             st.st_mode = stat.S_IFREG | 0444
             st.st_nlink = 1
             st.st_size = len(read_keys())
+        else:
+            filename = os.path.basename(path)
+            keys = all_keys()
+            st.st_mode = stat.S_IFREG | 0444
+            st.st_nlink = 1
+            try:
+                st.st_size = len(keys[filename])
+            except:
+                st.st_size = 0
         return st
 
     def readdir(self, path, offset):
-        for r in  '.', '..', os.path.basename(keys_file):
+        files = ['.', '..', "all"]
+        keys = all_keys()
+        files.extend(keys.keys())
+        for r in files:
             yield fuse.Direntry(r)
 
     def open(self, path, flags):
@@ -81,8 +113,14 @@ class KeyFS(Fuse):
             return -errno.EACCES
 
     def read (self, path, size, offset):
-        keys = read_keys()
-        slen = len(keys)
+        if os.path.basename(path) == "all":
+            content = read_keys()
+        else:
+            filename = os.path.basename(path)
+            keys = all_keys()
+            content = keys[filename]
+
+        slen = len(content)
 
         if offset < slen:
             if offset + size > slen: