simple initial version of invirt-getconf simply reads & navigates yaml; fixed permissions
authorYang Zhang <y_z@mit.edu>
Mon, 28 Jul 2008 00:11:04 +0000 (20:11 -0400)
committerYang Zhang <y_z@mit.edu>
Mon, 28 Jul 2008 00:11:04 +0000 (20:11 -0400)
svn path=/trunk/packages/sipb-xen-base/; revision=733

files/usr/sbin/invirt-getconf [changed mode: 0644->0755]
files/usr/share/python-support/sipb-xen-base/invirt/config.py

old mode 100644 (file)
new mode 100755 (executable)
index 912156a..c468499
@@ -1,18 +1,57 @@
 #!/usr/bin/env python2.5
 
 #!/usr/bin/env python2.5
 
+"""
+invirt-getconf [-f FILE] KEY prints the configuration the option named KEY from
+the invirt configuration file FILE.  Keys are dot-separated paths into the YAML
+configuration tree.  List indexes (0-based) are also treated as path
+components.
+
+(Due to this path language, certain restrictions are placed on the keys used in
+the YAML configuration, e.g. they cannot contain dots.)
+
+Examples:
+
+  invirt-getconf db.uri
+  invirt-getconf authn.0.type
+"""
+
 from invirt.config import load
 from invirt.config import load
-from sys import argv, stderr
+from sys import argv, exit, stderr
+from optparse import OptionParser
+
+class invirt_exception( Exception ): pass
 
 def main( argv ):
 
 def main( argv ):
-    try: command, key = argv
-    except: print >> stderr, 'invirt-getconf KEY'
-    conf = load()
-    for component in key.split('.')[:-1]:
-        if component.isdigit(): component = int( component )
-        conf = conf[ component ]
-    print conf[key]
-
-if __name__ == '__main__':
-    main( argv )
+    try:
+        parser = OptionParser()
+        parser.add_option('-f', '--file', default = '/etc/invirt/master.yaml',
+                help = 'the configuration file to read from')
+        options, args = parser.parse_args()
+
+        try: [key] = args
+        except: raise invirt_exception( __doc__ )
+
+        conf = load()
+        components = key.split('.')
+        for i, component in enumerate( components ):
+            progress = lambda: '.'.join( components[:i] )
+            if type( conf ) not in [ dict, list ]:
+                raise invirt_exception(
+                        'prematurely arrived at an atomic datum in the tree:\n'
+                        '%s has no children' % progress() )
+            if type( conf ) == list:
+                try: component = int( component )
+                except: raise invirt_exception(
+                        '%s is a list, requires an integral path component '
+                        'but got "%s"' % ( progress(), component ) )
+            try: conf = conf[ component ]
+            except KeyError: raise invirt_exception(
+                    '"%s" not in "%s"' % ( component, progress() ) )
+        print conf
+    except invirt_exception, ex:
+        print >> stderr, ex
+        return 1
+
+if __name__ == '__main__': exit( main( argv ) )
 
 # vim:et:sw=4:ts=4
 
 # vim:et:sw=4:ts=4
index 42e3b2f..37fafb4 100644 (file)
@@ -3,8 +3,11 @@ import yaml
 
 default_path = '/etc/invirt/master.yaml'
 
 
 default_path = '/etc/invirt/master.yaml'
 
+try:    default_loader = yaml.CSafeLoader
+except: default_loader = yaml.SafeLoader
+
 def load( path = default_path ):
     with file( path ) as f:
 def load( path = default_path ):
     with file( path ) as f:
-        return yaml.load( f, yaml.CSafeLoader )
+        return yaml.load( f, default_loader )
 
 # vim:et:sw=4:ts=4
 
 # vim:et:sw=4:ts=4