diff options
author | Scott Moser <smoser@ubuntu.com> | 2011-07-26 14:17:24 -0400 |
---|---|---|
committer | Scott Moser <smoser@ubuntu.com> | 2011-07-26 14:17:24 -0400 |
commit | 10edc78d777cadb2cd871776622e6a775ef8f8a2 (patch) | |
tree | c348e0f3710a8378121aaa7684fa020b959d8986 /cloudinit/UserDataHandler.py | |
parent | a3dcbac2528f7c8ecaedeca64c4792f7e3d4ee59 (diff) | |
parent | d5874c0bfcefc74ad9045efe4ed8450039b11b9a (diff) | |
download | vyos-cloud-init-10edc78d777cadb2cd871776622e6a775ef8f8a2.tar.gz vyos-cloud-init-10edc78d777cadb2cd871776622e6a775ef8f8a2.zip |
add support for 'include-once' and public and private keys to mcollective
the new 'include-once' type will include a URL only once, and cache its
results. This way you can use expiring URLs or one-time use urls to
pass sensitive data to the instance. The instance will cache the result
in a local root only file for subsequent boots.
Additionally, add support for specifying public and private keys for
mcollective via cloud-config.
Both these features come via Marc Cluet.
Diffstat (limited to 'cloudinit/UserDataHandler.py')
-rw-r--r-- | cloudinit/UserDataHandler.py | 37 |
1 files changed, 35 insertions, 2 deletions
diff --git a/cloudinit/UserDataHandler.py b/cloudinit/UserDataHandler.py index 83377dab..9670c0cb 100644 --- a/cloudinit/UserDataHandler.py +++ b/cloudinit/UserDataHandler.py @@ -22,9 +22,13 @@ from email.mime.text import MIMEText from email.mime.base import MIMEBase from email import encoders import yaml +import cloudinit +import cloudinit.util as util +import md5 starts_with_mappings={ '#include' : 'text/x-include-url', + '#include-once' : 'text/x-include-once-url', '#!' : 'text/x-shellscript', '#cloud-config' : 'text/cloud-config', '#upstart-job' : 'text/upstart-job', @@ -45,16 +49,41 @@ def decomp_str(str): def do_include(str,parts): import urllib + import os # is just a list of urls, one per line # also support '#include <url here>' + includeonce = False for line in str.splitlines(): if line == "#include": continue - if line.startswith("#include"): + if line == "#include-once": + includeonce = True + continue + if line.startswith("#include-once"): + line = line[len("#include-once"):].lstrip() + includeonce = True + elif line.startswith("#include"): line = line[len("#include"):].lstrip() if line.startswith("#"): continue - content = urllib.urlopen(line).read() + + # urls cannot not have leading or trailing white space + msum = md5.new() + msum.update(line.strip()) + includeonce_filename = "%s/urlcache/%s" % ( + cloudinit.get_ipath_cur("data"), msum.hexdigest()) + try: + if includeonce and os.path.isfile(includeonce_filename): + with open(includeonce_filename, "r") as fp: + content = fp.read() + else: + content = urllib.urlopen(line).read() + if includeonce: + util.write_file(includeonce_filename, content, mode=0600) + except Exception as e: + raise + process_includes(email.message_from_string(decomp_str(content)),parts) + def explode_cc_archive(archive,parts): for ent in yaml.load(archive): # ent can be one of: @@ -113,6 +142,10 @@ def process_includes(msg,parts): do_include(payload,parts) continue + if ctype == 'text/x-include-once-url': + do_include(payload,parts) + continue + if ctype == "text/cloud-config-archive": explode_cc_archive(payload,parts) continue |