X-Git-Url: http://xvm.mit.edu/gitweb/invirt/packages/invirt-base.git/blobdiff_plain/5fd5693e85dd48e795a6e4efed040087219bb04b..refs/tags/sipb-xen-base/8.12:/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..06c0aa7 --- a/files/usr/sbin/invirt-getconf +++ b/files/usr/sbin/invirt-getconf @@ -1,18 +1,91 @@ -#!/usr/bin/env python2.5 +#!/usr/bin/env python + +""" +invirt-getconf loads an invirt configuration file (either the original YAML +source or the faster-to-load JSON cache) and prints the configuration option +with the given name (key). 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, stdout +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') + parser.add_option('-l', '--ls', + action = 'store_true', + help = 'list node\'s children') + opts, args = parser.parse_args() + + if len(args) > 1: + raise invirt_exception(__doc__.strip()) + elif args and args[0]: + components = args[0].split('.') + else: + components = [] + + conf = load(opts.src, opts.cache, opts.refresh) + 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)) -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 opts.ls: + if type(conf) not in (dict, list): + raise invirt_exception( + '%s: node has no children (atomic datum)' % progress) + if type(conf) == list: + for i in xrange(len(conf)): + print i + else: + for k in conf.iterkeys(): + print k + else: + if type(conf) not in (dict, list): + print conf + else: + import yaml + yaml.dump(conf, stdout, + Dumper=yaml.CSafeDumper, default_flow_style=False) + except invirt_exception, ex: + print >> stderr, ex + return 1 if __name__ == '__main__': - main( argv ) + exit(main(argv)) # vim:et:sw=4:ts=4