make 'include-once' really "download source once per-instance"

Marc's implementation would only ever process the include-once urls a single
time.  This changes that to process them every time, with the second time
coming from a file on disk rather than the url.

You can then do expiring or one time use URLs in the include-once and
have all function of if the content was there every time.

The cached file is readable by root-only.
This commit is contained in:
Scott Moser 2011-07-26 10:22:23 -04:00
parent bfb15c173d
commit 4fdfba5e15
2 changed files with 16 additions and 8 deletions

View File

@ -22,6 +22,7 @@ from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders
import yaml
from cloudinit import util, get_ipath_cur
starts_with_mappings={
'#include' : 'text/x-include-url',
@ -61,16 +62,21 @@ def do_include(str,parts):
elif line.startswith("#include"):
line = line[len("#include"):].lstrip()
if line.startswith("#"): continue
if includeonce == True:
uniquestring = base64.encodestring(line).strip('\n')
includeonce_filename = "/var/lib/cloud/instance/.includeonce.%s" % uniquestring
if os.path.isfile(includeonce_filename): continue
includeonce_file = open(includeonce_filename,'w')
includeonce_file.close()
# urls cannot not have leading or trailing white space
uniquestring = base64.encodestring(line).strip()
includeonce_filename = "%/urlcache/%s" % (get_ipath_cur("data"), uniquestring)
try:
content = urllib.urlopen(line).read()
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:
log.debug(traceback.format_exc(e))
process_includes(email.message_from_string(decomp_str(content)),parts)

View File

@ -42,7 +42,9 @@ finds. However, certain types of user-data are handled specially.
urls, one per line. Each of the URLs will be read, and their content
will be passed through this same set of rules. Ie, the content
read from the URL can be gzipped, mime-multi-part, or plain text
This file will just be processed once by cloud-init
This file will just be downloaded only once per instance, and its
contents cached for subsequent boots. This allows you to pass in
one-time-use or expiring URLs.
* Cloud Config Data
begins with #cloud-config or Content-Type: text/cloud-config