#!/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 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('.') 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 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__': exit(main(argv)) # vim:et:sw=4:ts=4