Changeset 771 for trunk/packages
- Timestamp:
- Jul 28, 2008, 12:25:19 PM (16 years ago)
- Location:
- trunk/packages/sipb-xen-base/files/usr
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/packages/sipb-xen-base/files/usr/sbin/invirt-getconf
r733 r771 1 #!/usr/bin/env python 2.51 #!/usr/bin/env python 2 2 3 3 """ … … 20 20 from optparse import OptionParser 21 21 22 class invirt_exception( Exception): pass22 class invirt_exception(Exception): pass 23 23 24 def main( argv):24 def main(argv): 25 25 try: 26 parser = OptionParser() 27 parser.add_option('-f', '--file', default = '/etc/invirt/master.yaml', 28 help = 'the configuration file to read from') 29 options, args = parser.parse_args() 26 parser = OptionParser(usage = '%prog [options] key', 27 description = __doc__.strip().split('\n\n')[0]) 28 parser.add_option('-s', '--src', 29 default = '/etc/invirt/master.yaml', 30 help = 'the source YAML configuration file to read from') 31 parser.add_option('-c', '--cache', 32 default = '/var/lib/invirt/invirt.json', 33 help = 'path to the JSON cache') 34 parser.add_option('-r', '--refresh', 35 action = 'store_true', 36 help = 'force the cache to be regenerated') 37 opts, args = parser.parse_args() 30 38 31 39 try: [key] = args 32 except: raise invirt_exception( __doc__)40 except: raise invirt_exception(__doc__.strip()) 33 41 34 conf = load( )42 conf = load(opts.src, opts.cache, opts.refresh) 35 43 components = key.split('.') 36 for i, component in enumerate( components):37 progress = lambda: '.'.join( components[:i])38 if type( conf ) not in [ dict, list]:44 for i, component in enumerate(components): 45 progress = '.'.join(components[:i]) 46 if type(conf) not in [dict, list]: 39 47 raise invirt_exception( 40 'prematurely arrived at an atomic datum in the tree:\n' 41 '%s has no children' % progress() ) 42 if type( conf ) == list: 43 try: component = int( component ) 48 '%s: node has no children (atomic datum)' % progress) 49 if type(conf) == list: 50 try: component = int(component) 44 51 except: raise invirt_exception( 45 '%s is a list, requires an integral path component'46 'but got "%s"' % ( progress(), component ))47 try: conf = conf[ component]52 '%s: node a list; integer path component required, ' 53 'but got "%s"' % (progress, component)) 54 try: conf = conf[component] 48 55 except KeyError: raise invirt_exception( 49 '"%s" not in "%s"' % ( component, progress() ) ) 56 '%s: key "%s" not found' % (progress, component)) 57 except IndexError: raise invirt_exception( 58 '%s: index %s out of range' % (progress, component)) 50 59 print conf 51 except invirt_exception, ex:60 except (invirt_exception, OSError), ex: 52 61 print >> stderr, ex 53 62 return 1 54 63 55 if __name__ == '__main__': exit( main( argv ) ) 64 if __name__ == '__main__': 65 exit(main(argv)) 56 66 57 67 # vim:et:sw=4:ts=4 -
trunk/packages/sipb-xen-base/files/usr/share/python-support/sipb-xen-base/invirt/config.py
r766 r771 1 import yaml 1 import json, yaml 2 from os import error, makedirs 3 from os.path import dirname, getmtime 2 4 3 default_path = '/etc/invirt/master.yaml' 5 default_src_path = '/etc/invirt/master.yaml' 6 default_cache_path = '/var/lib/invirt/invirt.json' 4 7 5 8 try: default_loader = yaml.CSafeLoader 6 9 except: default_loader = yaml.SafeLoader 7 10 8 def load( path = default_path ): 9 return yaml.load( file(path), default_loader ) 11 def wrap(rsrc, func): 12 "Utility to that emulates with Python 2.5's `with closing(rsrc)`." 13 try: return func(rsrc) 14 finally: rsrc.close() 15 16 def load(src_path = default_src_path, 17 cache_path = default_cache_path, 18 force_refresh = False): 19 """ 20 Try loading the configuration from the faster-to-load JSON cache at 21 cache_path. If it doesn't exist or is outdated, load the configuration 22 instead from the original YAML file at src_path and regenerate the cache. 23 I assume I have the permissions to write to the cache directory. 24 """ 25 if force_refresh: 26 do_refresh = True 27 else: 28 src_mtime = getmtime(src_path) 29 try: cache_mtime = getmtime(cache_path) 30 except OSError: do_refresh = True 31 else: do_refresh = src_mtime > cache_mtime 32 33 if do_refresh: 34 # reload the source and regenerate the cache 35 cfg = wrap(file(src_path), lambda f: yaml.load(f, default_loader)) 36 wrap(file(cache_path, 'w'), lambda f: f.write(json.write(cfg))) 37 else: 38 cfg = wrap(file(cache_path), lambda f: json.read(f.read())) 39 return cfg 10 40 11 41 # vim:et:sw=4:ts=4
Note: See TracChangeset
for help on using the changeset viewer.