-#!/usr/bin/env python
+#!/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, stderr
+from sys import argv, exit, stderr
+from optparse import OptionParser
+
+class invirt_exception( Exception ): pass
def main( argv ):
- try: command, key = argv
- except: print >> stderr, 'invirt-getconf KEY'
- conf = load()
- for component in key.split('.')[:-1]:
- if component.isdigit(): component = int( component )
- conf = conf[ component ]
- print conf[key]
-
-if __name__ == '__main__':
- 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