X-Git-Url: http://xvm.mit.edu/gitweb/invirt/packages/invirt-base.git/blobdiff_plain/cef2d3c03515e9c1063771c928b8695b72d051ad..30641d7872dd5f494c965b4d9f01e8d8910dc4f4:/python/invirt/config.py diff --git a/python/invirt/config.py b/python/invirt/config.py index cd0dd06..039ca3d 100644 --- a/python/invirt/config.py +++ b/python/invirt/config.py @@ -7,6 +7,7 @@ from os import rename from os.path import getmtime from contextlib import closing import yaml +import re try: loader = yaml.CSafeLoader except: loader = yaml.SafeLoader @@ -19,6 +20,8 @@ lock_path = '/var/lib/invirt/cache.lock' def augment(d1, d2): """Splice dict-tree d2 into d1. Return d1. + d2 may be None for an empty dict-tree, because yaml.load produces that. + Example: >>> d = {'a': {'b': 1}, 'c': 2} >>> augment(d, {'a': {'d': 3}}) @@ -26,6 +29,8 @@ def augment(d1, d2): >>> d {'a': {'b', 1, 'd': 3}, 'c': 2} """ + if d2 is None: + return d1 for k in d2: if k in d1 and isinstance(d1[k], dict): augment(d1[k], d2[k]) @@ -33,10 +38,27 @@ def augment(d1, d2): d1[k] = d2[k] return d1 +def run_parts_list(dirname): + """Reimplements Debian's run-parts --list. + + One difference from run-parts's behavior: run-parts --list /foo/ + will give output like /foo//bar, but run_parts_list('/foo/') gives + /foo/bar in deference to Python conventions. + + Matches documented behavior of run-parts in debianutils v2.28.2, dated 2007. + """ + # From run-parts(8). + lanana_re = re.compile('^[a-z0-9]+$') + lsb_re = re.compile('^_?([a-z0-9_.]+-)+[a-z0-9]+$') + deb_cron_re = re.compile('^[a-z0-9][a-z0-9-]*$') + for name in os.listdir(dirname): + if lanana_re.match(name) or lsb_re.match(name) or deb_cron_re.match(name): + yield os.path.join(dirname, name) + def list_files(): yield src_path - for name in os.listdir(src_dirpath): - yield os.path.join(src_dirpath, name) + for name in run_parts_list(src_dirpath): + yield name def load_master(): config = dict() @@ -118,6 +140,7 @@ def load(force_refresh = False): return ns.cfg dicts = load() -structs = dicts2struct(dicts) +structs = dicts2struct(dicts, '') +safestructs = dicts2struct(dicts, '', '') # vim:et:sw=4:ts=4