X-Git-Url: http://xvm.mit.edu/gitweb/invirt/packages/invirt-base.git/blobdiff_plain/e007cebc17c83ba2b927a157299d82f0024ac1c7..0d85b11a8c6016f4d29a378046e2f6fd56668c5b:/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 cbb0a85..c468499 --- a/files/usr/sbin/invirt-getconf +++ b/files/usr/sbin/invirt-getconf @@ -1,18 +1,57 @@ -#!/usr/bin/env python +#!/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