invirt-base (0.0.2) unstable; urgency=low
* eliminate choice of source and cache files for invirt.config.load and
- invirt-getconf, so we can make it more complex
+ invirt-getconf, so we can do what follows
+ * look in /etc/invirt/conf.d/ as well as /etc/invirt/master.yaml
-- Greg Price <price@mit.edu> Tue, 28 Oct 2008 21:16:14 -0400
import json
from invirt.common import *
+import os
from os import rename
from os.path import getmtime
from contextlib import closing
try: loader = yaml.CSafeLoader
except: loader = yaml.SafeLoader
-src_path = '/etc/invirt/master.yaml'
-cache_path = '/var/lib/invirt/cache.json'
-lock_path = '/var/lib/invirt/cache.lock'
+src_path = '/etc/invirt/master.yaml'
+src_dirpath = '/etc/invirt/conf.d'
+cache_path = '/var/lib/invirt/cache.json'
+lock_path = '/var/lib/invirt/cache.lock'
+
+def augment(d1, d2):
+ """Splice dict-tree d2 into d1. Return d1.
+
+ Example:
+ >>> d = {'a': {'b': 1}, 'c': 2}
+ >>> augment(d, {'a': {'d': 3}})
+ {'a': {'b', 1, 'd': 3}, 'c': 2}
+ >>> d
+ {'a': {'b', 1, 'd': 3}, 'c': 2}
+ """
+ for k in d2:
+ if k in d1 and isinstance(d1[k], dict):
+ augment(d1[k], d2[k])
+ else:
+ d1[k] = d2[k]
+ return d1
+
+def list_files():
+ yield src_path
+ for name in os.listdir(src_dirpath):
+ yield os.path.join(src_dirpath, name)
def load_master():
- with closing(file(src_path)) as f:
- return yaml.load(f, loader)
+ config = dict()
+ for filename in list_files():
+ with closing(file(filename)) as f:
+ augment(config, yaml.load(f, loader))
+ return config
def get_src_mtime():
- return getmtime(src_path)
+ return max(max(getmtime(filename) for filename in list_files()),
+ getmtime(src_dirpath))
def load(force_refresh = False):
"""