summaryrefslogtreecommitdiff
path: root/cloudinit
diff options
context:
space:
mode:
Diffstat (limited to 'cloudinit')
-rw-r--r--cloudinit/CloudConfig/cc_update_etc_hosts.py41
-rw-r--r--cloudinit/util.py38
2 files changed, 76 insertions, 3 deletions
diff --git a/cloudinit/CloudConfig/cc_update_etc_hosts.py b/cloudinit/CloudConfig/cc_update_etc_hosts.py
new file mode 100644
index 00000000..856cbae1
--- /dev/null
+++ b/cloudinit/CloudConfig/cc_update_etc_hosts.py
@@ -0,0 +1,41 @@
+# vi: ts=4 expandtab
+#
+# Copyright (C) 2011 Canonical Ltd.
+#
+# Author: Scott Moser <scott.moser@canonical.com>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 3, as
+# published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+import cloudinit.util as util
+from cloudinit.CloudConfig import per_always
+
+frequency = per_always
+
+def handle(name,cfg,cloud,log,args):
+ if not util.get_cfg_option_bool(cfg,"manage_etc_hosts",False):
+ log.debug("manage_etc_hosts is not set. not modifying /etc/hosts")
+ return
+
+ try:
+ hostname = util.get_cfg_option_str(cfg,"hostname",cloud.get_hostname())
+ if not hostname:
+ hostname = cloud.get_hostname()
+
+ if not hostname:
+ log.info("manage_etc_hosts was set, but no hostname found")
+ return
+
+ util.render_to_file('hosts', '/etc/hosts', { 'hostname' : hostname })
+
+ except Exception as e:
+ log.warn("failed to update /etc/hosts")
+ raise
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"]