#!/usr/bin/env python2.5

"""
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()
        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 ]:
                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 )
                except: raise invirt_exception(
                        '%s is a list, requires an integral path component '
                        'but got "%s"' % ( progress(), component ) )
            try: conf = conf[ component ]
            except KeyError: raise invirt_exception(
                    '"%s" not in "%s"' % ( component, progress() ) )
        print conf
    except invirt_exception, ex:
        print >> stderr, ex
        return 1

if __name__ == '__main__': exit( main( argv ) )

# vim:et:sw=4:ts=4
