From a397d9a4ae7892377e47497933aa0ed18667fea2 Mon Sep 17 00:00:00 2001 From: Yang Zhang Date: Sun, 27 Jul 2008 20:11:04 -0400 Subject: [PATCH] simple initial version of invirt-getconf simply reads & navigates yaml; fixed permissions svn path=/trunk/packages/sipb-xen-base/; revision=733 --- files/usr/sbin/invirt-getconf | 61 ++++++++++++++++---- .../python-support/sipb-xen-base/invirt/config.py | 5 +- 2 files changed, 54 insertions(+), 12 deletions(-) mode change 100644 => 100755 files/usr/sbin/invirt-getconf diff --git a/files/usr/sbin/invirt-getconf b/files/usr/sbin/invirt-getconf old mode 100644 new mode 100755 index 912156a..c468499 --- a/files/usr/sbin/invirt-getconf +++ b/files/usr/sbin/invirt-getconf @@ -1,18 +1,57 @@ #!/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 sys import argv, stderr +from sys import argv, exit, stderr +from optparse import OptionParser + +class invirt_exception( Exception ): pass 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 diff --git a/files/usr/share/python-support/sipb-xen-base/invirt/config.py b/files/usr/share/python-support/sipb-xen-base/invirt/config.py index 42e3b2f..37fafb4 100644 --- a/files/usr/share/python-support/sipb-xen-base/invirt/config.py +++ b/files/usr/share/python-support/sipb-xen-base/invirt/config.py @@ -3,8 +3,11 @@ import 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: - return yaml.load( f, yaml.CSafeLoader ) + return yaml.load( f, default_loader ) # vim:et:sw=4:ts=4 -- 1.7.9.5