summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog3
-rw-r--r--TODO1
-rw-r--r--cloudinit/util.py38
-rw-r--r--config/cloud.cfg9
-rw-r--r--config/cloud.cfg.d/05_logging.cfg (renamed from config/logging.cfg)0
-rw-r--r--config/cloud.cfg.d/README3
-rwxr-xr-xsetup.py1
7 files changed, 42 insertions, 13 deletions
diff --git a/ChangeLog b/ChangeLog
index de9468a1..705948ab 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -16,6 +16,9 @@
- make DataSourceEc2 retries and timeout configurable
- add helper routines for apt-get update and install
- add 'bootcmd' like 'runcmd' to cloud-config syntax for running things early
+ - move from '#opt_include' in config file format to conf_d.
+ ie, now files in /etc/cloud.cfg.d/ is read rather than reading
+ '#opt_include <filename>' or '#include <filename>' in cloud.cfg
0.6.0:
- change permissions of /var/log/cloud-init.log to accomodate
syslog writing to it (LP: #704509)
diff --git a/TODO b/TODO
index 424587b5..568bdb07 100644
--- a/TODO
+++ b/TODO
@@ -1,4 +1,3 @@
-- conf.d rather than 'opt_include' (or #include)
- consider 'failsafe' DataSource
If all others fail, setting a default that
- sets the user password, writing it to console
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"]
diff --git a/config/cloud.cfg b/config/cloud.cfg
index c27cc5e8..d9f352e8 100644
--- a/config/cloud.cfg
+++ b/config/cloud.cfg
@@ -32,12 +32,3 @@ cloud_final_modules:
- keys-to-console
- phone-home
- final-message
-
-## logging.cfg contains info on logging output for cloud-init
-#include logging.cfg
-
-## distro.cfg contains the local distro specific values
-#opt_include distro.cfg
-
-##local.cfg is for local overrides of any of the above
-#opt_include local.cfg
diff --git a/config/logging.cfg b/config/cloud.cfg.d/05_logging.cfg
index 2e7ac2ed..2e7ac2ed 100644
--- a/config/logging.cfg
+++ b/config/cloud.cfg.d/05_logging.cfg
diff --git a/config/cloud.cfg.d/README b/config/cloud.cfg.d/README
new file mode 100644
index 00000000..60702e9d
--- /dev/null
+++ b/config/cloud.cfg.d/README
@@ -0,0 +1,3 @@
+# All files in this directory will be read by cloud-init
+# They are read in lexical order. Later files overwrite values in
+# earlier files.
diff --git a/setup.py b/setup.py
index 3eed7b7c..2184e599 100755
--- a/setup.py
+++ b/setup.py
@@ -38,6 +38,7 @@ setup(name='cloud-init',
'cloud-init-cfg.py',
],
data_files=[('/etc/cloud', glob('config/*.cfg')),
+ ('/etc/cloud/cloud.cfg.d', glob('config/cloud.cfg.d/*')),
('/etc/cloud/templates', glob('templates/*')),
('/etc/init', glob('upstart/*.conf')),
('/usr/share/cloud-init', []),