From 6fe51bb797810832de4301f85b5b3ca11630e108 Mon Sep 17 00:00:00 2001 From: Scott Moser Date: Thu, 17 Feb 2011 15:48:41 -0500 Subject: change from yaml+'#include' to yaml + config.d format for cloud.cfg --- ChangeLog | 3 +++ TODO | 1 - cloudinit/util.py | 38 +++++++++++++++++++++++--- config/cloud.cfg | 9 ------- config/cloud.cfg.d/05_logging.cfg | 57 +++++++++++++++++++++++++++++++++++++++ config/cloud.cfg.d/README | 3 +++ config/logging.cfg | 57 --------------------------------------- setup.py | 1 + 8 files changed, 99 insertions(+), 70 deletions(-) create mode 100644 config/cloud.cfg.d/05_logging.cfg create mode 100644 config/cloud.cfg.d/README delete mode 100644 config/logging.cfg 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 ' or '#include ' 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/cloud.cfg.d/05_logging.cfg b/config/cloud.cfg.d/05_logging.cfg new file mode 100644 index 00000000..2e7ac2ed --- /dev/null +++ b/config/cloud.cfg.d/05_logging.cfg @@ -0,0 +1,57 @@ +## this yaml formated config file handles setting +## logger information. The values that are necessary to be set +## are seen at the bottom. The top '_log' are only used to remove +## redundency in a syslog and fallback-to-file case. +## +## The 'log_cfgs' entry defines a list of logger configs +## Each entry in the list is tried, and the first one that +## works is used. If a log_cfg list entry is an array, it will +## be joined with '\n'. +_log: + - &log_base | + [loggers] + keys=root,cloudinit + + [handlers] + keys=consoleHandler,cloudLogHandler + + [formatters] + keys=simpleFormatter,arg0Formatter + + [logger_root] + level=DEBUG + handlers=consoleHandler,cloudLogHandler + + [logger_cloudinit] + level=DEBUG + qualname=cloudinit + handlers= + propagate=1 + + [handler_consoleHandler] + class=StreamHandler + level=WARNING + formatter=arg0Formatter + args=(sys.stderr,) + + [formatter_arg0Formatter] + format=%(asctime)s - %(filename)s[%(levelname)s]: %(message)s + + [formatter_simpleFormatter] + format=[CLOUDINIT] %(filename)s[%(levelname)s]: %(message)s + - &log_file | + [handler_cloudLogHandler] + class=FileHandler + level=DEBUG + formatter=arg0Formatter + args=('/var/log/cloud-init.log',) + - &log_syslog | + [handler_cloudLogHandler] + class=handlers.SysLogHandler + level=DEBUG + formatter=simpleFormatter + args=("/dev/log", handlers.SysLogHandler.LOG_USER) + +log_cfgs: + - [ *log_base, *log_syslog ] + - [ *log_base, *log_file ] 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/config/logging.cfg b/config/logging.cfg deleted file mode 100644 index 2e7ac2ed..00000000 --- a/config/logging.cfg +++ /dev/null @@ -1,57 +0,0 @@ -## this yaml formated config file handles setting -## logger information. The values that are necessary to be set -## are seen at the bottom. The top '_log' are only used to remove -## redundency in a syslog and fallback-to-file case. -## -## The 'log_cfgs' entry defines a list of logger configs -## Each entry in the list is tried, and the first one that -## works is used. If a log_cfg list entry is an array, it will -## be joined with '\n'. -_log: - - &log_base | - [loggers] - keys=root,cloudinit - - [handlers] - keys=consoleHandler,cloudLogHandler - - [formatters] - keys=simpleFormatter,arg0Formatter - - [logger_root] - level=DEBUG - handlers=consoleHandler,cloudLogHandler - - [logger_cloudinit] - level=DEBUG - qualname=cloudinit - handlers= - propagate=1 - - [handler_consoleHandler] - class=StreamHandler - level=WARNING - formatter=arg0Formatter - args=(sys.stderr,) - - [formatter_arg0Formatter] - format=%(asctime)s - %(filename)s[%(levelname)s]: %(message)s - - [formatter_simpleFormatter] - format=[CLOUDINIT] %(filename)s[%(levelname)s]: %(message)s - - &log_file | - [handler_cloudLogHandler] - class=FileHandler - level=DEBUG - formatter=arg0Formatter - args=('/var/log/cloud-init.log',) - - &log_syslog | - [handler_cloudLogHandler] - class=handlers.SysLogHandler - level=DEBUG - formatter=simpleFormatter - args=("/dev/log", handlers.SysLogHandler.LOG_USER) - -log_cfgs: - - [ *log_base, *log_syslog ] - - [ *log_base, *log_file ] 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', []), -- cgit v1.2.3