diff options
-rwxr-xr-x | bin/cloud-init | 26 | ||||
-rw-r--r-- | cloudinit/ssh_util.py | 3 | ||||
-rw-r--r-- | cloudinit/util.py | 9 |
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 |