def config_to_dict(module): data = get_config(module) obj = [] for line in data.split('\n'): if line.startswith('set protocols static route'): match = re.search(r'static route (\S+)', line, re.M) prefix = match.group(1).split('/')[0] mask = match.group(1).split('/')[1] if 'next-hop' in line: match_hop = re.search(r'next-hop (\S+)', line, re.M) next_hop = match_hop.group(1).strip("'") match_distance = re.search(r'distance (\S+)', line, re.M) if match_distance is not None: admin_distance = match_distance.group(1)[1:-1] else: admin_distance = None if admin_distance is not None: obj.append({ 'prefix': prefix, 'mask': mask, 'next_hop': next_hop, 'admin_distance': admin_distance }) else: obj.append({ 'prefix': prefix, 'mask': mask, 'next_hop': next_hop, 'admin_distance': 'None' }) return obj
def config_to_dict(module): data = get_config(module) obj = [] for line in data.split('\n'): if line.startswith('set system syslog'): match = re.search(r'set system syslog (\S+)', line, re.M) dest = match.group(1) if dest == 'host': match = re.search(r'host (\S+)', line, re.M) name = match.group(1) elif dest == 'file': match = re.search(r'file (\S+)', line, re.M) name = match.group(1) elif dest == 'user': match = re.search(r'user (\S+)', line, re.M) name = match.group(1) else: name = None if 'facility' in line: match = re.search(r'facility (\S+)', line, re.M) facility = match.group(1) if 'level' in line: match = re.search(r'level (\S+)', line, re.M) level = match.group(1).strip("'") obj.append({ 'dest': dest, 'name': name, 'facility': facility, 'level': level }) return obj
def config_to_dict(module): data = get_config(module) obj = [] for line in data.split("\n"): if line.startswith("set protocols static route"): match = re.search(r"static route (\S+)", line, re.M) prefix = match.group(1).split("/")[0] mask = match.group(1).split("/")[1] if "next-hop" in line: match_hop = re.search(r"next-hop (\S+)", line, re.M) next_hop = match_hop.group(1).strip("'") match_distance = re.search(r"distance (\S+)", line, re.M) if match_distance is not None: admin_distance = match_distance.group(1)[1:-1] else: admin_distance = None if admin_distance is not None: obj.append({ "prefix": prefix, "mask": mask, "next_hop": next_hop, "admin_distance": admin_distance, }) else: obj.append({ "prefix": prefix, "mask": mask, "next_hop": next_hop, "admin_distance": "None", }) return obj
def config_to_dict(module): data = get_config(module) obj = [] for line in data.split("\n"): if line.startswith("set system syslog"): match = re.search(r"set system syslog (\S+)", line, re.M) dest = match.group(1) if dest == "host": match = re.search(r"host (\S+)", line, re.M) name = match.group(1) elif dest == "file": match = re.search(r"file (\S+)", line, re.M) name = match.group(1) elif dest == "user": match = re.search(r"user (\S+)", line, re.M) name = match.group(1) else: name = None if "facility" in line: match = re.search(r"facility (\S+)", line, re.M) facility = match.group(1) if "level" in line: match = re.search(r"level (\S+)", line, re.M) level = match.group(1).strip("'") obj.append({ "dest": dest, "name": name, "facility": facility, "level": level, }) return obj
def has_lldp(module): config = get_config(module).splitlines() if "set service 'lldp'" in config or 'set service lldp' in config: return True else: return False
def run(module, result): # get the current active config from the node or passed in via # the config param config = module.params['config'] or get_config(module) # create the candidate config object from the arguments candidate = get_candidate(module) # create loadable config that includes only the configuration updates connection = get_connection(module) try: response = connection.get_diff(candidate=candidate, running=config, diff_match=module.params['match']) except ConnectionError as exc: module.fail_json(msg=to_text(exc, errors='surrogate_then_replace')) commands = response.get('config_diff') sanitize_config(commands, result) result['commands'] = commands commit = not module.check_mode comment = module.params['comment'] diff = None if commands: diff = load_config(module, commands, commit=commit, comment=comment) if result.get('filtered'): result['warnings'].append('Some configuration commands were ' 'removed, please see the filtered key') result['changed'] = True if module._diff: result['diff'] = {'prepared': diff}
def main(): backup_spec = dict(filename=dict(), dir_path=dict(type="path")) argument_spec = dict( src=dict(type="path"), lines=dict(type="list", elements="str"), match=dict(default="line", choices=["line", "none"]), comment=dict(default=DEFAULT_COMMENT), config=dict(), backup=dict(type="bool", default=False), backup_options=dict(type="dict", options=backup_spec), save=dict(type="bool", default=False), ) argument_spec.update(vyos_argument_spec) mutually_exclusive = [("lines", "src")] module = AnsibleModule( argument_spec=argument_spec, mutually_exclusive=mutually_exclusive, supports_check_mode=True, ) warnings = list() result = dict(changed=False, warnings=warnings) if module.params["backup"]: result["__backup__"] = get_config(module=module) if any((module.params["src"], module.params["lines"])): run(module, result) if module.params["save"]: diff = run_commands(module, commands=["configure", "compare saved"])[1] if diff != "[edit]": if not module.check_mode: run_commands(module, commands=["save"]) result["changed"] = True run_commands(module, commands=["exit"]) if result.get("changed") and any( (module.params["src"], module.params["lines"]) ): msg = ( "To ensure idempotency and correct diff the input configuration lines should be" " similar to how they appear if present in" " the running configuration on device" ) if module.params["src"]: msg += " including the indentation" if "warnings" in result: result["warnings"].append(msg) else: result["warnings"] = msg module.exit_json(**result)
def config_to_dict(module): data = get_config(module) output = None obj = {'banner': module.params['banner'], 'state': 'absent'} for line in data.split('\n'): if line.startswith('set system login banner %s' % obj['banner']): match = re.findall(r'%s (.*)' % obj['banner'], line, re.M) output = match if output: obj['text'] = output[0].encode().decode('unicode_escape') obj['state'] = 'present' return obj
def config_to_dict(module): data = get_config(module) output = None obj = {"banner": module.params["banner"], "state": "absent"} for line in data.split("\n"): if line.startswith("set system login banner %s" % obj["banner"]): match = re.findall(r"%s (.*)" % obj["banner"], line, re.M) output = match if output: obj["text"] = output[0].encode().decode("unicode_escape") obj["state"] = "present" return obj
def main(): backup_spec = dict( filename=dict(), dir_path=dict(type='path') ) argument_spec = dict( src=dict(type='path'), lines=dict(type='list'), match=dict(default='line', choices=['line', 'none']), comment=dict(default=DEFAULT_COMMENT), config=dict(), backup=dict(type='bool', default=False), backup_options=dict(type='dict', options=backup_spec), save=dict(type='bool', default=False), ) argument_spec.update(vyos_argument_spec) mutually_exclusive = [('lines', 'src')] module = AnsibleModule( argument_spec=argument_spec, mutually_exclusive=mutually_exclusive, supports_check_mode=True ) warnings = list() result = dict(changed=False, warnings=warnings) if module.params['backup']: result['__backup__'] = get_config(module=module) if any((module.params['src'], module.params['lines'])): run(module, result) if module.params['save']: diff = run_commands(module, commands=['configure', 'compare saved'])[1] if diff != '[edit]': run_commands(module, commands=['save']) result['changed'] = True run_commands(module, commands=['exit']) module.exit_json(**result)
def config_to_dict(module): data = get_config(module) config = {'domain_search': [], 'name_server': []} for line in data.split('\n'): if line.startswith('set system host-name'): config['host_name'] = line[22:-1] elif line.startswith('set system domain-name'): config['domain_name'] = line[24:-1] elif line.startswith('set system domain-search domain'): config['domain_search'].append(line[33:-1]) elif line.startswith('set system name-server'): config['name_server'].append(line[24:-1]) return config
def config_to_dict(module): data = get_config(module) config = {"domain_search": [], "name_server": []} for line in data.split("\n"): if line.startswith("set system host-name"): config["host_name"] = line[22:-1] elif line.startswith("set system domain-name"): config["domain_name"] = line[24:-1] elif line.startswith("set system domain-search domain"): config["domain_search"].append(line[33:-1]) elif line.startswith("set system name-server"): config["name_server"].append(line[24:-1]) return config
def main(): backup_spec = dict(filename=dict(), dir_path=dict(type="path")) argument_spec = dict( src=dict(type="path"), lines=dict(type="list", elements="str"), match=dict(default="line", choices=["line", "none"]), comment=dict(default=DEFAULT_COMMENT), config=dict(), backup=dict(type="bool", default=False), backup_options=dict(type="dict", options=backup_spec), save=dict(type="bool", default=False), ) argument_spec.update(vyos_argument_spec) mutually_exclusive = [("lines", "src")] module = AnsibleModule( argument_spec=argument_spec, mutually_exclusive=mutually_exclusive, supports_check_mode=True, ) warnings = list() result = dict(changed=False, warnings=warnings) if module.params["backup"]: result["__backup__"] = get_config(module=module) if any((module.params["src"], module.params["lines"])): run(module, result) if module.params["save"]: diff = run_commands(module, commands=["configure", "compare saved"])[1] if diff != "[edit]": if not module.check_mode: run_commands(module, commands=["save"]) result["changed"] = True run_commands(module, commands=["exit"]) module.exit_json(**result)
def map_config_to_obj(module): data = get_config(module, flags=["| grep interface"]) obj = [] for line in data.split("\n"): if line.startswith("set interfaces ethernet"): match = re.search(r"set interfaces ethernet (\S+)", line, re.M) name = match.group(1) if name: interface = {} for item in obj: if item["name"] == name: interface = item break if not interface: interface = {"name": name} obj.append(interface) match = re.search(r"%s (\S+)" % name, line, re.M) if match: param = match.group(1) if param == "description": match = re.search(r"description (.+)", line, re.M) description = match.group(1).strip("'") interface["description"] = description elif param == "speed": match = re.search(r"speed (\S+)", line, re.M) speed = match.group(1).strip("'") interface["speed"] = speed elif param == "mtu": match = re.search(r"mtu (\S+)", line, re.M) mtu = match.group(1).strip("'") interface["mtu"] = int(mtu) elif param == "duplex": match = re.search(r"duplex (\S+)", line, re.M) duplex = match.group(1).strip("'") interface["duplex"] = duplex elif param.strip("'") == "disable": interface["disable"] = True return obj
def map_config_to_obj(module): data = get_config(module, flags=['| grep interface']) obj = [] for line in data.split('\n'): if line.startswith('set interfaces ethernet'): match = re.search(r'set interfaces ethernet (\S+)', line, re.M) name = match.group(1) if name: interface = {} for item in obj: if item['name'] == name: interface = item break if not interface: interface = {'name': name} obj.append(interface) match = re.search(r'%s (\S+)' % name, line, re.M) if match: param = match.group(1) if param == 'description': match = re.search(r'description (.+)', line, re.M) description = match.group(1).strip("'") interface['description'] = description elif param == 'speed': match = re.search(r'speed (\S+)', line, re.M) speed = match.group(1).strip("'") interface['speed'] = speed elif param == 'mtu': match = re.search(r'mtu (\S+)', line, re.M) mtu = match.group(1).strip("'") interface['mtu'] = int(mtu) elif param == 'duplex': match = re.search(r'duplex (\S+)', line, re.M) duplex = match.group(1).strip("'") interface['duplex'] = duplex elif param.strip("'") == 'disable': interface['disable'] = True return obj
def run(module, result): # get the current active config from the node or passed in via # the config param config = module.params["config"] or get_config(module) # create the candidate config object from the arguments candidate = get_candidate(module) # create loadable config that includes only the configuration updates connection = get_connection(module) try: response = connection.get_diff( candidate=candidate, running=config, diff_match=module.params["match"], ) except ConnectionError as exc: module.fail_json(msg=to_text(exc, errors="surrogate_then_replace")) commands = response.get("config_diff") sanitize_config(commands, result) result["commands"] = commands commit = not module.check_mode comment = module.params["comment"] diff = None if commands: diff = load_config(module, commands, commit=commit, comment=comment) if result.get("filtered"): result["warnings"].append( "Some configuration commands were " "removed, please see the filtered key" ) result["changed"] = True if module._diff: result["diff"] = {"prepared": diff}
def map_config_to_obj(module): obj = [] config = get_config(module).splitlines() output = [c for c in config if c.startswith("set service lldp interface")] for i in output: splitted_line = i.split() if len(splitted_line) > 5: new_obj = {"name": splitted_line[4]} if splitted_line[5] == "'disable'": new_obj["state"] = "disabled" else: new_obj = {"name": splitted_line[4][1:-1]} new_obj["state"] = "present" obj.append(new_obj) return obj
def config_to_dict(module): data = get_config(module) 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 cfg = re.findall(regex, data, re.M) cfg = "\n".join(cfg) obj = { "name": user, "state": "present", "configured_password": None, "level": parse_level(cfg), "full_name": parse_full_name(cfg), } instances.append(obj) return instances
def config_to_dict(module): data = get_config(module) 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 cfg = re.findall(regex, data, re.M) cfg = '\n'.join(cfg) obj = { 'name': user, 'state': 'present', 'configured_password': None, 'level': parse_level(cfg), 'full_name': parse_full_name(cfg) } instances.append(obj) return instances