summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xbin/cloud-init26
-rw-r--r--cloudinit/ssh_util.py3
-rw-r--r--cloudinit/util.py9
3 files changed, 27 insertions, 11 deletions
diff --git a/bin/cloud-init b/bin/cloud-init
index e00913e3..0330cb2b 100755
--- a/bin/cloud-init
+++ b/bin/cloud-init
@@ -202,16 +202,18 @@ def main_init(name, args):
try:
init.fetch()
except sources.DataSourceNotFoundException:
- util.logexc(LOG, "No instance datasource found!")
+ util.logexc(LOG, ("No instance datasource found!"
+ " Likely bad things to come!"))
# In the case of cloud-init (net mode) it is a bit
# more likely that the user would consider it
# failure if nothing was found. When using
# upstart it will also mentions job failure
# in console log if exit code is != 0.
- if args.local:
- return 0
- else:
- return 1
+ if not args.force:
+ if args.local:
+ return 0
+ else:
+ return 1
# Stage 6
iid = init.instancify()
LOG.debug("%s will now be targeting instance id: %s", name, iid)
@@ -272,8 +274,11 @@ def main_modules(action_name, args):
init.fetch()
except sources.DataSourceNotFoundException:
# There was no datasource found, theres nothing to do
- util.logexc(LOG, 'Can not apply stage %s, no datasource found!', name)
- return 1
+ util.logexc(LOG, ('Can not apply stage %s, '
+ 'no datasource found!'
+ " Likely bad things to come!"), name)
+ if not args.force:
+ return 1
# Stage 3
mods = stages.Modules(init, extract_fns(args))
# Stage 4
@@ -321,6 +326,8 @@ def main_single(name, args):
# the module being ran (so continue on)
util.logexc(LOG, ("Failed to fetch your datasource,"
" likely bad things to come!"))
+ if not args.force:
+ return 1
# Stage 3
mods = stages.Modules(init, extract_fns(args))
mod_args = args.module_args
@@ -373,6 +380,11 @@ def main():
help=('show additional pre-action'
' logging (default: %(default)s)'),
default=False)
+ parser.add_argument('--force', action='store_true',
+ help=('force running even if no datasource is'
+ ' found (use at your own risk)'),
+ dest='force',
+ default=False)
subparsers = parser.add_subparsers()
# Each action and its sub-options (if any)
diff --git a/cloudinit/ssh_util.py b/cloudinit/ssh_util.py
index fc8b9b3d..e0a2f0ca 100644
--- a/cloudinit/ssh_util.py
+++ b/cloudinit/ssh_util.py
@@ -197,7 +197,8 @@ def update_authorized_keys(fname, keys):
# Replace it with our better one
ent = k
# Don't add it later
- to_add.remove(k)
+ if k in to_add:
+ to_add.remove(k)
entries[i] = ent
# Now append any entries we did not match above
diff --git a/cloudinit/util.py b/cloudinit/util.py
index 3cf51e65..3ff3835a 100644
--- a/cloudinit/util.py
+++ b/cloudinit/util.py
@@ -1303,21 +1303,24 @@ def shellify(cmdlist, add_header=True):
if add_header:
content += "#!/bin/sh\n"
escaped = "%s%s%s%s" % ("'", '\\', "'", "'")
+ cmds_made = 0
for args in cmdlist:
- # if the item is a list, wrap all items in single tick
- # if its not, then just write it directly
+ # If the item is a list, wrap all items in single tick.
+ # If its not, then just write it directly.
if isinstance(args, list):
fixed = []
for f in args:
fixed.append("'%s'" % (str(f).replace("'", escaped)))
content = "%s%s\n" % (content, ' '.join(fixed))
+ cmds_made += 1
elif isinstance(args, (str, basestring)):
content = "%s%s\n" % (content, args)
+ cmds_made += 1
else:
raise RuntimeError(("Unable to shellify type %s"
" which is not a list or string")
% (obj_name(args)))
- LOG.debug("Shellified %s to %s", cmdlist, content)
+ LOG.debug("Shellified %s commands.", cmds_made)
return content