From cef2d3c03515e9c1063771c928b8695b72d051ad Mon Sep 17 00:00:00 2001 From: Greg Price Date: Wed, 29 Oct 2008 00:44:45 -0400 Subject: [PATCH] use /etc/invirt/conf.d/ too in invirt.config svn path=/trunk/packages/invirt-base/; revision=1422 --- debian/changelog | 3 ++- python/invirt/config.py | 40 ++++++++++++++++++++++++++++++++++------ 2 files changed, 36 insertions(+), 7 deletions(-) diff --git a/debian/changelog b/debian/changelog index fc2a696..e09b46e 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,7 +1,8 @@ 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 Tue, 28 Oct 2008 21:16:14 -0400 diff --git a/python/invirt/config.py b/python/invirt/config.py index 7c2b805..cd0dd06 100644 --- a/python/invirt/config.py +++ b/python/invirt/config.py @@ -2,6 +2,7 @@ from __future__ import with_statement import json from invirt.common import * +import os from os import rename from os.path import getmtime from contextlib import closing @@ -10,16 +11,43 @@ import yaml 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): """ -- 1.7.9.5