Source code for nettoolkit.yaml_facts.cisco.parsers.protocol_rip_run

"""cisco running-config parser for rip section output """

# ------------------------------------------------------------------------------
from .common import *
from .protocols import ProtocolsConfig, get_protocol_instance_dict
# ------------------------------------------------------------------------------


# ------------------------------------------------------------------------------
#  RIP ATTR FUNCS
# ------------------------------------------------------------------------------

def _get_rip_version(attr_dict, line, spl):
	if spl[0] == 'version':
		available_versions = spl[1:]
		append_attribute(attr_dict, 'version', available_versions)

def _get_auto_summary(attr_dict, line, spl):
	if line.strip() == 'no auto summary':
		append_attribute(attr_dict, 'auto-summary', False)

def _get_source_validation(attr_dict, line, spl):
	if 'validate-update-source' in spl:
		append_attribute(attr_dict, 'validate-update-source', spl[0] != 'no')

def _get_networks(attr_dict, line, spl):
	if spl[0] == 'network':
		if len(spl)>2:
			network = str(addressing(spl[1], spl[2]))
		else:
			network = str(classful_subnet(spl[1]))
		append_attribute(attr_dict, 'networks', network)

def _get_neighbors(attr_dict, line, spl):
	if spl[0] == 'neighbor':
		append_attribute(attr_dict, 'neighbor', spl[1])

def _get_redistributions(attr_dict, line, spl):
	if spl[0] == 'redistribute':
		append_attribute(attr_dict, 'redistribute', " ".join(spl[1:]))

def _get_default_metric(attr_dict, line, spl):
	if spl[0] == 'default-metric':
		append_attribute(attr_dict, 'default-metric', spl[1])

def _get_offset_list(attr_dict, line, spl):
	if spl[0] == 'offset-list':
		offset_list = spl[1]
		direction = spl[2]
		offset_number = spl[3]
		if not attr_dict.get('offset-list'):
			attr_dict['offset-list']= {}
		offset_dict = attr_dict['offset-list']
		if not offset_dict.get(offset_list):
			offset_dict[offset_list] = {}
		offset_list_dict = offset_dict[offset_list]
		append_attribute(offset_list_dict, 'direction', direction)
		append_attribute(offset_list_dict, 'offset_number', offset_number)
		if len(spl)>3: 
			offset_interface = spl[4]
			append_attribute(offset_list_dict, 'offset_interface', offset_interface)

# ====================================================================================================
#  RIP Config extractor Class
# ====================================================================================================

[docs] @dataclass class RIPConf(ProtocolsConfig): ## RIP Supported AF types supported_af_types = ('ipv4', 'ipv6') attr_functions = [ _get_rip_version, _get_auto_summary, _get_source_validation, _get_networks, _get_neighbors, _get_redistributions, _get_default_metric, _get_offset_list, ] def __post_init__(self): self.rip_vrf_dict = {} self.protocol_config_initialize(protocol='rip') self._iterate_vrfs() self.remove_empty_vrfs(self.rip_vrf_dict) def _iterate_vrfs(self): for vrf, vrf_dict in self.vrfs.items(): if not vrf_dict.get('lines'): continue self.rip_vrf_dict[vrf] = self._get_attributes(vrf_dict['lines'])
# ==================================================================================================== # RIP Config extractor function # ====================================================================================================
[docs] def get_rip_running(command_output): """parse output of : show running-config Args: command_output (list): command output Returns: dict: protocols rip level parsed output dictionary """ RC = RIPConf(command_output) return get_protocol_instance_dict(protocol='rip', instances_dic=RC.rip_vrf_dict)
# ====================================================================================================