def handle(_name, cfg, cloud, log, args): if not is_key_in_nested_dict(cfg, "ssh_import_id"): log.debug("Skipping module named ssh-import-id, no 'ssh_import_id'" " directives found.") return elif not subp.which(SSH_IMPORT_ID_BINARY): log.warning( "ssh-import-id is not installed, but module ssh_import_id is " "configured. Skipping module.") return # import for "user: XXXXX" if len(args) != 0: user = args[0] ids = [] if len(args) > 1: ids = args[1:] import_ssh_ids(ids, user, log) return # import for cloudinit created users (users, _groups) = ug_util.normalize_users_groups(cfg, cloud.distro) elist = [] for (user, user_cfg) in users.items(): import_ids = [] if user_cfg["default"]: import_ids = util.get_cfg_option_list(cfg, "ssh_import_id", []) else: try: import_ids = user_cfg["ssh_import_id"] except Exception: log.debug("User %s is not configured for ssh_import_id", user) continue try: import_ids = util.uniq_merge(import_ids) import_ids = [str(i) for i in import_ids] except Exception: log.debug("User %s is not correctly configured for ssh_import_id", user) continue if not len(import_ids): continue try: import_ssh_ids(import_ids, user, log) except Exception as exc: util.logexc(log, "ssh-import-id failed for: %s %s", user, import_ids) elist.append(exc) if len(elist): raise elist[0]
def handle(_name, cfg, cloud, log, args): # import for "user: XXXXX" if len(args) != 0: user = args[0] ids = [] if len(args) > 1: ids = args[1:] import_ssh_ids(ids, user, log) return # import for cloudinit created users (users, _groups) = ug_util.normalize_users_groups(cfg, cloud.distro) elist = [] for (user, user_cfg) in users.items(): import_ids = [] if user_cfg["default"]: import_ids = util.get_cfg_option_list(cfg, "ssh_import_id", []) else: try: import_ids = user_cfg["ssh_import_id"] except Exception: log.debug("User %s is not configured for ssh_import_id", user) continue try: import_ids = util.uniq_merge(import_ids) import_ids = [str(i) for i in import_ids] except Exception: log.debug("User %s is not correctly configured for ssh_import_id", user) continue if not len(import_ids): continue try: import_ssh_ids(import_ids, user, log) except Exception as exc: util.logexc(log, "ssh-import-id failed for: %s %s", user, import_ids) elist.append(exc) if len(elist): raise elist[0]
def handle(_name, cfg, cloud, log, args): # import for "user: XXXXX" if len(args) != 0: user = args[0] ids = [] if len(args) > 1: ids = args[1:] import_ssh_ids(ids, user, log) return # import for cloudinit created users (users, _groups) = ug_util.normalize_users_groups(cfg, cloud.distro) elist = [] for (user, user_cfg) in users.items(): import_ids = [] if user_cfg['default']: import_ids = util.get_cfg_option_list(cfg, "ssh_import_id", []) else: try: import_ids = user_cfg['ssh_import_id'] except Exception: log.debug("User %s is not configured for ssh_import_id", user) continue try: import_ids = util.uniq_merge(import_ids) import_ids = [str(i) for i in import_ids] except Exception: log.debug("User %s is not correctly configured for ssh_import_id", user) continue if not len(import_ids): continue try: import_ssh_ids(import_ids, user, log) except Exception as exc: util.logexc(log, "ssh-import-id failed for: %s %s", user, import_ids) elist.append(exc) if len(elist): raise elist[0]
def _normalize_users(u_cfg, def_user_cfg=None): if isinstance(u_cfg, dict): ad_ucfg = [] for (k, v) in u_cfg.items(): if isinstance(v, (bool, int, float) + six.string_types): if util.is_true(v): ad_ucfg.append(str(k)) elif isinstance(v, dict): v['name'] = k ad_ucfg.append(v) else: raise TypeError(("Unmappable user value type %s" " for key %s") % (type_utils.obj_name(v), k)) u_cfg = ad_ucfg elif isinstance(u_cfg, six.string_types): u_cfg = util.uniq_merge_sorted(u_cfg) users = {} for user_config in u_cfg: if isinstance(user_config, (list,) + six.string_types): for u in util.uniq_merge(user_config): if u and u not in users: users[u] = {} elif isinstance(user_config, dict): if 'name' in user_config: n = user_config.pop('name') prev_config = users.get(n) or {} users[n] = util.mergemanydict([prev_config, user_config]) else: # Assume the default user then prev_config = users.get('default') or {} users['default'] = util.mergemanydict([prev_config, user_config]) else: raise TypeError(("User config must be dictionary/list " " or string types only and not %s") % type_utils.obj_name(user_config)) # Ensure user options are in the right python friendly format if users: c_users = {} for (uname, uconfig) in users.items(): c_uconfig = {} for (k, v) in uconfig.items(): k = k.replace('-', '_').strip() if k: c_uconfig[k] = v c_users[uname] = c_uconfig users = c_users # Fixup the default user into the real # default user name and replace it... def_user = None if users and 'default' in users: def_config = users.pop('default') if def_user_cfg: # Pickup what the default 'real name' is # and any groups that are provided by the # default config def_user_cfg = def_user_cfg.copy() def_user = def_user_cfg.pop('name') def_groups = def_user_cfg.pop('groups', []) # Pickup any config + groups for that user name # that we may have previously extracted parsed_config = users.pop(def_user, {}) parsed_groups = parsed_config.get('groups', []) # Now merge our extracted groups with # anything the default config provided users_groups = util.uniq_merge_sorted(parsed_groups, def_groups) parsed_config['groups'] = ",".join(users_groups) # The real config for the default user is the # combination of the default user config provided # by the distro, the default user config provided # by the above merging for the user 'default' and # then the parsed config from the user's 'real name' # which does not have to be 'default' (but could be) users[def_user] = util.mergemanydict([def_user_cfg, def_config, parsed_config]) # Ensure that only the default user that we # found (if any) is actually marked as being # the default user if users: for (uname, uconfig) in users.items(): if def_user and uname == def_user: uconfig['default'] = True else: uconfig['default'] = False return users
def _normalize_users(u_cfg, def_user_cfg=None): if isinstance(u_cfg, dict): ad_ucfg = [] for (k, v) in u_cfg.items(): if isinstance(v, (bool, int, float) + six.string_types): if util.is_true(v): ad_ucfg.append(str(k)) elif isinstance(v, dict): v['name'] = k ad_ucfg.append(v) else: raise TypeError(("Unmappable user value type %s" " for key %s") % (type_utils.obj_name(v), k)) u_cfg = ad_ucfg elif isinstance(u_cfg, six.string_types): u_cfg = util.uniq_merge_sorted(u_cfg) users = {} for user_config in u_cfg: if isinstance(user_config, (list, ) + six.string_types): for u in util.uniq_merge(user_config): if u and u not in users: users[u] = {} elif isinstance(user_config, dict): if 'name' in user_config: n = user_config.pop('name') prev_config = users.get(n) or {} users[n] = util.mergemanydict([prev_config, user_config]) else: # Assume the default user then prev_config = users.get('default') or {} users['default'] = util.mergemanydict( [prev_config, user_config]) else: raise TypeError(("User config must be dictionary/list " " or string types only and not %s") % type_utils.obj_name(user_config)) # Ensure user options are in the right python friendly format if users: c_users = {} for (uname, uconfig) in users.items(): c_uconfig = {} for (k, v) in uconfig.items(): k = k.replace('-', '_').strip() if k: c_uconfig[k] = v c_users[uname] = c_uconfig users = c_users # Fixup the default user into the real # default user name and replace it... def_user = None if users and 'default' in users: def_config = users.pop('default') if def_user_cfg: # Pickup what the default 'real name' is # and any groups that are provided by the # default config def_user_cfg = def_user_cfg.copy() def_user = def_user_cfg.pop('name') def_groups = def_user_cfg.pop('groups', []) # Pickup any config + groups for that user name # that we may have previously extracted parsed_config = users.pop(def_user, {}) parsed_groups = parsed_config.get('groups', []) # Now merge our extracted groups with # anything the default config provided users_groups = util.uniq_merge_sorted(parsed_groups, def_groups) parsed_config['groups'] = ",".join(users_groups) # The real config for the default user is the # combination of the default user config provided # by the distro, the default user config provided # by the above merging for the user 'default' and # then the parsed config from the user's 'real name' # which does not have to be 'default' (but could be) users[def_user] = util.mergemanydict( [def_user_cfg, def_config, parsed_config]) # Ensure that only the default user that we # found (if any) is actually marked as being # the default user if users: for (uname, uconfig) in users.items(): if def_user and uname == def_user: uconfig['default'] = True else: uconfig['default'] = False return users
def _normalize_users(u_cfg, def_user_cfg=None): if isinstance(u_cfg, dict): ad_ucfg = [] for k, v in u_cfg.items(): if isinstance(v, (bool, int, float, str)): if util.is_true(v): ad_ucfg.append(str(k)) elif isinstance(v, dict): v["name"] = k ad_ucfg.append(v) else: raise TypeError("Unmappable user value type %s for key %s" % (type_utils.obj_name(v), k)) u_cfg = ad_ucfg elif isinstance(u_cfg, str): u_cfg = util.uniq_merge_sorted(u_cfg) users = {} for user_config in u_cfg: if isinstance(user_config, (list, str)): for u in util.uniq_merge(user_config): if u and u not in users: users[u] = {} elif isinstance(user_config, dict): n = user_config.pop("name", "default") prev_config = users.get(n) or {} users[n] = util.mergemanydict([prev_config, user_config]) else: raise TypeError("User config must be dictionary/list or string " " types only and not %s" % (type_utils.obj_name(user_config))) # Ensure user options are in the right python friendly format if users: c_users = {} for uname, uconfig in users.items(): c_uconfig = {} for k, v in uconfig.items(): k = k.replace("-", "_").strip() if k: c_uconfig[k] = v c_users[uname] = c_uconfig users = c_users # Fix the default user into the actual default user name and replace it. def_user = None if users and "default" in users: def_config = users.pop("default") if def_user_cfg: # Pickup what the default 'real name' is and any groups that are # provided by the default config def_user_cfg = def_user_cfg.copy() def_user = def_user_cfg.pop("name") def_groups = def_user_cfg.pop("groups", []) # Pick any config + groups for the user name that we may have # extracted previously parsed_config = users.pop(def_user, {}) parsed_groups = parsed_config.get("groups", []) # Now merge the extracted groups with the default config provided users_groups = util.uniq_merge_sorted(parsed_groups, def_groups) parsed_config["groups"] = ",".join(users_groups) # The real config for the default user is the combination of the # default user config provided by the distro, the default user # config provided by the above merging for the user 'default' and # then the parsed config from the user's 'real name' which does not # have to be 'default' (but could be) users[def_user] = util.mergemanydict( [def_user_cfg, def_config, parsed_config]) # Ensure that only the default user that we found (if any) is actually # marked as the default user for uname, uconfig in users.items(): uconfig["default"] = uname == def_user if def_user else False return users