In invirt-base:
[invirt/packages/invirt-base.git] / python / invirt / config.py
index cd0dd06..bcd2423 100644 (file)
@@ -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,6 @@ def load(force_refresh = False):
     return ns.cfg
 
 dicts = load()
-structs = dicts2struct(dicts)
+structs = dicts2struct(dicts, '')
 
 # vim:et:sw=4:ts=4