diff options
Diffstat (limited to 'cloudinit/util.py')
-rw-r--r-- | cloudinit/util.py | 38 |
1 files changed, 35 insertions, 3 deletions
diff --git a/cloudinit/util.py b/cloudinit/util.py index 72db58f9..3a40cc99 100644 --- a/cloudinit/util.py +++ b/cloudinit/util.py @@ -44,9 +44,7 @@ def get_base_cfg(cfgfile,cfg_builtin="", parsed_cfgs=None): if parsed_cfgs and cfgfile in parsed_cfgs: return(parsed_cfgs[cfgfile]) - contents = read_file_with_includes(cfgfile) - if contents: - syscfg = yaml.load(contents) + syscfg = read_conf_with_confd(cfgfile) kern_contents = read_cc_from_cmdline() if kern_contents: @@ -260,6 +258,40 @@ def read_file_with_includes(fname, rel = ".", stack=[], patt = None): stack.pop() return(contents) +def read_conf_d(confd): + # get reverse sorted list (later trumps newer) + confs = sorted(os.listdir(confd),reverse=True) + + # remove anything not ending in '.cfg' + confs = filter(lambda f: f.endswith(".cfg"), confs) + + # remove anything not a file + confs = filter(lambda f: os.path.isfile("%s/%s" % (confd,f)),confs) + + cfg = { } + for conf in confs: + cfg = mergedict(cfg,read_conf("%s/%s" % (confd,conf))) + + return(cfg) + +def read_conf_with_confd(cfgfile): + cfg = read_conf(cfgfile) + confd = False + if "conf_d" in cfg: + if cfg['conf_d'] is not None: + confd = cfg['conf_d'] + if not isinstance(confd,str): + raise Exception("cfgfile %s contains 'conf_d' with non-string" % cfgfile) + elif os.path.isdir("%s.d" % cfgfile): + confd = "%s.d" % cfgfile + + if not confd: return(cfg) + + confd_cfg = read_conf_d(confd) + + return(mergedict(confd_cfg,cfg)) + + def get_cmdline(): if 'DEBUG_PROC_CMDLINE' in os.environ: cmdline = os.environ["DEBUG_PROC_CMDLINE"] |