X-Git-Url: http://xvm.mit.edu/gitweb/invirt/packages/invirt-base.git/blobdiff_plain/e007cebc17c83ba2b927a157299d82f0024ac1c7..95eb488e71743cadb53e3d1af9e0d7ce5414ce9e:/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..d503dea --- a/files/usr/sbin/invirt-getconf +++ b/files/usr/sbin/invirt-getconf @@ -1,18 +1,67 @@ #!/usr/bin/env python +""" +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: + parser = OptionParser(usage = '%prog [options] key', + description = __doc__.strip().split('\n\n')[0]) + parser.add_option('-s', '--src', + default = '/etc/invirt/master.yaml', + help = 'the source YAML configuration file to read from') + parser.add_option('-c', '--cache', + default = '/var/lib/invirt/invirt.json', + help = 'path to the JSON cache') + parser.add_option('-r', '--refresh', + action = 'store_true', + help = 'force the cache to be regenerated') + opts, args = parser.parse_args() + + try: [key] = args + except: raise invirt_exception(__doc__.strip()) -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] + conf = load(opts.src, opts.cache, opts.refresh) + components = key.split('.') + for i, component in enumerate(components): + progress = '.'.join(components[:i]) + if type(conf) not in [dict, list]: + raise invirt_exception( + '%s: node has no children (atomic datum)' % progress) + if type(conf) == list: + try: component = int(component) + except: raise invirt_exception( + '%s: node a list; integer path component required, ' + 'but got "%s"' % (progress, component)) + try: conf = conf[component] + except KeyError: raise invirt_exception( + '%s: key "%s" not found' % (progress, component)) + except IndexError: raise invirt_exception( + '%s: index %s out of range' % (progress, component)) + print conf + except (invirt_exception, OSError), ex: + print >> stderr, ex + return 1 if __name__ == '__main__': - main( argv ) + exit(main(argv)) # vim:et:sw=4:ts=4