X-Git-Url: http://xvm.mit.edu/gitweb/invirt/packages/invirt-base.git/blobdiff_plain/a397d9a4ae7892377e47497933aa0ed18667fea2..bed209caf968dd992a7f849f8b982b4b46a0f876:/files/usr/sbin/invirt-getconf diff --git a/files/usr/sbin/invirt-getconf b/files/usr/sbin/invirt-getconf index c468499..bb4fd80 100755 --- a/files/usr/sbin/invirt-getconf +++ b/files/usr/sbin/invirt-getconf @@ -1,13 +1,14 @@ -#!/usr/bin/env python2.5 +#!/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 +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.) +the YAML configuration; e.g., they cannot contain dots.) Examples: @@ -15,43 +16,79 @@ Examples: invirt-getconf authn.0.type """ -from invirt.config import load -from sys import argv, exit, stderr +from invirt.config import default_src_path, default_cache_path, load +from sys import argv, exit, stderr, stdout from optparse import OptionParser -class invirt_exception( Exception ): pass +class invirt_exception(Exception): pass -def main( argv ): +def 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 ]: + parser = OptionParser(usage = '%prog [options] key', + description = __doc__.strip().split('\n\n')[0]) + parser.add_option('-s', '--src', + default = default_src_path, + help = 'the source YAML configuration file to read from') + parser.add_option('-c', '--cache', + default = default_cache_path, + 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( - 'prematurely arrived at an atomic datum in the tree:\n' - '%s has no children' % progress() ) - if type( conf ) == list: - try: component = int( component ) + '%s: node has no children (atomic datum)' % 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 ] + '%s: node a list; integer path component required, ' + 'but got "%s"' % (progress, component)) + try: conf = conf[component] except KeyError: raise invirt_exception( - '"%s" not in "%s"' % ( component, progress() ) ) - print conf + '%s: key "%s" not found' % (progress, component)) + except IndexError: raise invirt_exception( + '%s: index %s out of range' % (progress, component)) + + if opts.ls: + if type(conf) not in (dict, list): + raise invirt_exception( + '%s: node has no children (atomic datum)' + % '.'.join(components)) + 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 + try: dumper = yaml.CSafeDumper + except: dumper = yaml.SafeDumper + yaml.dump(conf, stdout, + Dumper = dumper, default_flow_style = False) except invirt_exception, ex: print >> stderr, ex return 1 -if __name__ == '__main__': exit( main( argv ) ) +if __name__ == '__main__': + exit(main(argv)) # vim:et:sw=4:ts=4