diff options
Diffstat (limited to 'plugins/modules/vyos_user.py')
-rw-r--r-- | plugins/modules/vyos_user.py | 156 |
1 files changed, 84 insertions, 72 deletions
diff --git a/plugins/modules/vyos_user.py b/plugins/modules/vyos_user.py index f4fd77d..74ec720 100644 --- a/plugins/modules/vyos_user.py +++ b/plugins/modules/vyos_user.py @@ -20,9 +20,9 @@ # ANSIBLE_METADATA = { - 'metadata_version': '1.1', - 'status': ['preview'], - 'supported_by': 'network' + "metadata_version": "1.1", + "status": ["preview"], + "supported_by": "network", } DOCUMENTATION = """ @@ -139,62 +139,67 @@ from functools import partial from ansible.module_utils.basic import AnsibleModule from ansible.module_utils.network.common.utils import remove_default_spec -from ansible_collections.vyos.vyos.plugins.module_utils.network. \ - vyos.vyos import get_config, load_config +from ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.vyos import ( + get_config, + load_config, +) from ansible.module_utils.six import iteritems -from ansible_collections.vyos.vyos.plugins.module_utils.network. \ - vyos.vyos import vyos_argument_spec +from ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.vyos import ( + vyos_argument_spec, +) def validate_level(value, module): - if value not in ('admin', 'operator'): - module.fail_json(msg='level must be either admin or operator, got %s' % - value) + if value not in ("admin", "operator"): + module.fail_json(msg="level must be either admin or operator, got %s" % value) def spec_to_commands(updates, module): commands = list() - state = module.params['state'] - update_password = module.params['update_password'] + state = module.params["state"] + update_password = module.params["update_password"] def needs_update(want, have, x): return want.get(x) and (want.get(x) != have.get(x)) def add(command, want, x): - command.append('set system login user %s %s' % (want['name'], x)) + command.append("set system login user %s %s" % (want["name"], x)) for update in updates: want, have = update - if want['state'] == 'absent': - commands.append('delete system login user %s' % want['name']) + if want["state"] == "absent": + commands.append("delete system login user %s" % want["name"]) continue - if needs_update(want, have, 'level'): - add(commands, want, "level %s" % want['level']) + if needs_update(want, have, "level"): + add(commands, want, "level %s" % want["level"]) - if needs_update(want, have, 'full_name'): - add(commands, want, "full-name %s" % want['full_name']) + if needs_update(want, have, "full_name"): + add(commands, want, "full-name %s" % want["full_name"]) - if needs_update(want, have, 'configured_password'): - if update_password == 'always' or not have: + if needs_update(want, have, "configured_password"): + if update_password == "always" or not have: add( - commands, want, 'authentication plaintext-password %s' % - want['configured_password']) + commands, + want, + "authentication plaintext-password %s" + % want["configured_password"], + ) return commands def parse_level(data): - match = re.search(r'level (\S+)', data, re.M) + match = re.search(r"level (\S+)", data, re.M) if match: level = match.group(1)[1:-1] return level def parse_full_name(data): - match = re.search(r'full-name (\S+)', data, re.M) + match = re.search(r"full-name (\S+)", data, re.M) if match: full_name = match.group(1)[1:-1] return full_name @@ -203,22 +208,22 @@ def parse_full_name(data): def config_to_dict(module): data = get_config(module) - match = re.findall(r'^set system login user (\S+)', data, re.M) + match = re.findall(r"^set system login user (\S+)", data, re.M) if not match: return list() instances = list() for user in set(match): - regex = r' %s .+$' % user + regex = r" %s .+$" % user cfg = re.findall(regex, data, re.M) - cfg = '\n'.join(cfg) + cfg = "\n".join(cfg) obj = { - 'name': user, - 'state': 'present', - 'configured_password': None, - 'level': parse_level(cfg), - 'full_name': parse_full_name(cfg) + "name": user, + "state": "present", + "configured_password": None, + "level": parse_level(cfg), + "full_name": parse_full_name(cfg), } instances.append(obj) @@ -231,7 +236,7 @@ def get_param_value(key, item, module): value = module.params[key] # validate the param value (if validator func exists) - validator = globals().get('validate_%s' % key) + validator = globals().get("validate_%s" % key) if all((value, validator)): validator(value, module) @@ -239,17 +244,17 @@ def get_param_value(key, item, module): def map_params_to_obj(module): - aggregate = module.params['aggregate'] + aggregate = module.params["aggregate"] if not aggregate: - if not module.params['name'] and module.params['purge']: + if not module.params["name"] and module.params["purge"]: return list() else: - users = [{'name': module.params['name']}] + users = [{"name": module.params["name"]}] else: users = list() for item in aggregate: if not isinstance(item, dict): - users.append({'name': item}) + users.append({"name": item}) else: users.append(item) @@ -257,10 +262,10 @@ def map_params_to_obj(module): for item in users: get_value = partial(get_param_value, item=item, module=module) - item['configured_password'] = get_value('configured_password') - item['full_name'] = get_value('full_name') - item['level'] = get_value('level') - item['state'] = get_value('state') + item["configured_password"] = get_value("configured_password") + item["full_name"] = get_value("full_name") + item["level"] = get_value("level") + item["state"] = get_value("state") objects.append(item) return objects @@ -269,7 +274,7 @@ def map_params_to_obj(module): def update_objects(want, have): updates = list() for entry in want: - item = next((i for i in have if i['name'] == entry['name']), None) + item = next((i for i in have if i["name"] == entry["name"]), None) if item is None: updates.append((entry, {})) elif item: @@ -282,64 +287,71 @@ def update_objects(want, have): def main(): """ main entry point for module execution """ - element_spec = dict(name=dict(), - full_name=dict(), - level=dict(aliases=['role']), - configured_password=dict(no_log=True), - update_password=dict(default='always', - choices=['on_create', 'always']), - state=dict(default='present', - choices=['present', 'absent'])) + element_spec = dict( + name=dict(), + full_name=dict(), + level=dict(aliases=["role"]), + configured_password=dict(no_log=True), + update_password=dict(default="always", choices=["on_create", "always"]), + state=dict(default="present", choices=["present", "absent"]), + ) aggregate_spec = deepcopy(element_spec) - aggregate_spec['name'] = dict(required=True) + aggregate_spec["name"] = dict(required=True) # remove default in aggregate spec, to handle common arguments remove_default_spec(aggregate_spec) - argument_spec = dict(aggregate=dict(type='list', - elements='dict', - options=aggregate_spec, - aliases=['users', 'collection']), - purge=dict(type='bool', default=False)) + argument_spec = dict( + aggregate=dict( + type="list", + elements="dict", + options=aggregate_spec, + aliases=["users", "collection"], + ), + purge=dict(type="bool", default=False), + ) argument_spec.update(element_spec) argument_spec.update(vyos_argument_spec) - mutually_exclusive = [('name', 'aggregate')] - module = AnsibleModule(argument_spec=argument_spec, - mutually_exclusive=mutually_exclusive, - supports_check_mode=True) + mutually_exclusive = [("name", "aggregate")] + module = AnsibleModule( + argument_spec=argument_spec, + mutually_exclusive=mutually_exclusive, + supports_check_mode=True, + ) warnings = list() - if module.params['password'] and not module.params['configured_password']: + if module.params["password"] and not module.params["configured_password"]: warnings.append( 'The "password" argument is used to authenticate the current connection. ' - + 'To set a user password use "configured_password" instead.') + + 'To set a user password use "configured_password" instead.' + ) - result = {'changed': False} + result = {"changed": False} if warnings: - result['warnings'] = warnings + result["warnings"] = warnings want = map_params_to_obj(module) have = config_to_dict(module) commands = spec_to_commands(update_objects(want, have), module) - if module.params['purge']: - want_users = [x['name'] for x in want] - have_users = [x['name'] for x in have] + if module.params["purge"]: + want_users = [x["name"] for x in want] + have_users = [x["name"] for x in have] for item in set(have_users).difference(want_users): - commands.append('delete system login user %s' % item) + commands.append("delete system login user %s" % item) - result['commands'] = commands + result["commands"] = commands if commands: commit = not module.check_mode load_config(module, commands, commit=commit) - result['changed'] = True + result["changed"] = True module.exit_json(**result) -if __name__ == '__main__': +if __name__ == "__main__": main() |