X-Git-Url: http://xvm.mit.edu/gitweb/invirt/packages/invirt-base.git/blobdiff_plain/c4e6b2806febb24d73d79ec91431e0deaa8cee24..56adc1baf4fefbc3571311905eb0dc2954fea8cb:/scripts/invirt-getconf diff --git a/scripts/invirt-getconf b/scripts/invirt-getconf index 530efd6..07e475b 100755 --- a/scripts/invirt-getconf +++ b/scripts/invirt-getconf @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ invirt-getconf loads an invirt configuration file (either the original YAML @@ -13,74 +13,68 @@ the YAML configuration; e.g., they cannot contain dots.) Examples: invirt-getconf db.uri - invirt-getconf authn.0.type + invirt-getconf hosts.0.ip """ -from invirt import config -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('-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('.') +import argparse +import sys +import yaml + +import invirt + + +class PathResolutionException(Exception): + pass + + +def main(): + parser = argparse.ArgumentParser(description='Get values from invirt configuration file') + parser.add_argument('-r', '--refresh', action='store_true', help='Force regenerate the cache') + parser.add_argument('-l', '--ls', action='store_true', help='List children of node') + parser.add_argument('path', nargs='?', default='', help='Path of value to get') + + args = parser.parse_args() + + components = args.path.split('.') + + conf = invirt.config.load(args.refresh) + for i, component in enumerate(components): + progress = '.'.join(components[:i]) + + if isinstance(conf, list): + try: + component = int(component) + except ValueError: + raise PathResolutionException(f'{progress}: node is a list; integer path component required, ' + 'but got "{component}"') + + try: + conf = conf[component] + except IndexError: + raise PathResolutionException(f'{progress}: index {component} out of range') + elif isinstance(conf, dict): + try: + conf = conf[component] + except KeyError: + raise PathResolutionException(f'{progress}: key "{component}" not found') else: - components = [] - - conf = config.load(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)) - - 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 + raise PathResolutionException(f'{progress}: node has no children (atomic datum)') + + if args.ls: + if isinstance(conf, list): + for i in range(len(conf)): + print(i) + elif isinstance(conf, dict): + for k in conf: + 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 + raise PathResolutionException(f'{".".join(components)}: node has no children (atomic datum)') + else: + if isinstance(conf, (dict, list)): + print(conf) + else: + yaml.dump(conf, sys.stdout, Dumper=yaml.CSafeDumper, default_flow_style=False) -if __name__ == '__main__': - exit(main(argv)) -# vim:et:sw=4:ts=4 +if __name__ == '__main__': + main()