X-Git-Url: http://xvm.mit.edu/gitweb/invirt/packages/invirt-base.git/blobdiff_plain/5fd5693e85dd48e795a6e4efed040087219bb04b..a397d9a4ae7892377e47497933aa0ed18667fea2:/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