source: trunk/packages/sipb-xen-base/files/usr/sbin/invirt-getconf @ 797

Last change on this file since 797 was 796, checked in by price, 16 years ago

use yaml.CSafeDumper and yaml.CSafeLoader everywhere

also break some long lines to fit in 80 columns

  • Property svn:executable set to *
File size: 3.3 KB
RevLine 
[771]1#!/usr/bin/env python
[726]2
[733]3"""
[778]4invirt-getconf loads an invirt configuration file (either the original YAML
5source or the faster-to-load JSON cache) and prints the configuration option
6with the given name (key).  Keys are dot-separated paths into the YAML
[733]7configuration tree.  List indexes (0-based) are also treated as path
8components.
9
10(Due to this path language, certain restrictions are placed on the keys used in
[778]11the YAML configuration; e.g., they cannot contain dots.)
[733]12
13Examples:
14
15  invirt-getconf db.uri
16  invirt-getconf authn.0.type
17"""
18
[726]19from invirt.config import load
[789]20from sys import argv, exit, stderr, stdout
[733]21from optparse import OptionParser
[726]22
[771]23class invirt_exception(Exception): pass
[733]24
[771]25def main(argv):
[733]26    try:
[771]27        parser = OptionParser(usage = '%prog [options] key',
28                description = __doc__.strip().split('\n\n')[0])
29        parser.add_option('-s', '--src',
30                default = '/etc/invirt/master.yaml',
31                help = 'the source YAML configuration file to read from')
32        parser.add_option('-c', '--cache',
33                default = '/var/lib/invirt/invirt.json',
34                help = 'path to the JSON cache')
35        parser.add_option('-r', '--refresh',
36                action = 'store_true',
37                help = 'force the cache to be regenerated')
[787]38        parser.add_option('-l', '--ls',
39                action = 'store_true',
40                help = 'list node\'s children')
[771]41        opts, args = parser.parse_args()
[726]42
[788]43        if len(args) > 1:
44            raise invirt_exception(__doc__.strip())
45        elif args and args[0]:
46            components = args[0].split('.')
47        else:
48            components = []
[726]49
[771]50        conf = load(opts.src, opts.cache, opts.refresh)
51        for i, component in enumerate(components):
52            progress = '.'.join(components[:i])
[789]53            if type(conf) not in (dict, list):
[733]54                raise invirt_exception(
[771]55                        '%s: node has no children (atomic datum)' % progress)
56            if type(conf) == list:
57                try: component = int(component)
[733]58                except: raise invirt_exception(
[771]59                        '%s: node a list; integer path component required, '
60                        'but got "%s"' % (progress, component))
61            try: conf = conf[component]
[733]62            except KeyError: raise invirt_exception(
[771]63                    '%s: key "%s" not found' % (progress, component))
64            except IndexError: raise invirt_exception(
65                    '%s: index %s out of range' % (progress, component))
[788]66
[787]67        if opts.ls:
[789]68            if type(conf) not in (dict, list):
[787]69                raise invirt_exception(
70                        '%s: node has no children (atomic datum)' % progress)
71            if type(conf) == list:
72                for i in xrange(len(conf)):
73                    print i
74            else:
75                for k in conf.iterkeys():
76                    print k
77        else:
[789]78            if type(conf) not in (dict, list):
79                print conf
80            else:
81                import yaml
[796]82                yaml.dump(conf, stdout,
83                          Dumper=yaml.CSafeDumper, default_flow_style=False)
[778]84    except invirt_exception, ex:
[733]85        print >> stderr, ex
86        return 1
87
[771]88if __name__ == '__main__':
89    exit(main(argv))
[733]90
[726]91# vim:et:sw=4:ts=4
Note: See TracBrowser for help on using the repository browser.