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