diff options
Diffstat (limited to 'cloudinit')
-rw-r--r-- | cloudinit/CloudConfig/cc_update_etc_hosts.py | 41 | ||||
-rw-r--r-- | cloudinit/util.py | 38 |
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"] |