From e93695af02cf2c31c121894c4d41f247cb9589c6 Mon Sep 17 00:00:00 2001 From: niels van hooij Date: Mon, 14 Aug 2023 16:20:11 +0200 Subject: [PATCH 1/5] first commit --- .../libs/parser/hvrp/display_config_dhcp.py | 183 ++++++++++++++++++ 1 file changed, 183 insertions(+) create mode 100644 src/genie/libs/parser/hvrp/display_config_dhcp.py diff --git a/src/genie/libs/parser/hvrp/display_config_dhcp.py b/src/genie/libs/parser/hvrp/display_config_dhcp.py new file mode 100644 index 0000000000..16a7851114 --- /dev/null +++ b/src/genie/libs/parser/hvrp/display_config_dhcp.py @@ -0,0 +1,183 @@ +import logging +from genie.metaparser import MetaParser +from genie.metaparser.util.schemaengine import Any, Optional +import re + + +class DisplayConfigDhcpSchema(MetaParser): + schema = { + Any(): { + Optional("domain"): str, + Optional("gateway"): str, + Optional("netbios_servers"): list, + Optional("dns_servers"): list, + Optional("dhcp_excludes"): { + Any(): { + Optional('end'): str, + Optional('start'): str, + } + }, + Optional("networks"): { + Any(): { + Optional('ip'): str, + Optional('subnet_mask'): str, + } + }, + Optional("dhcp_options"): { + Any(): { + Optional("option"): str, + Optional("type"): str, + Optional("data"): str, + } + }, + Optional("lease_time"): str, + }, + } + +class DisplayConfigDhcp(DisplayConfigDhcpSchema): + # note below command does not exist. + # there is no command that filters all dhcp info (unless regex on cli) + # but that is not a good option. better to leverage python for that + # the real command we will run is display current-configuration. + cli_command = "display dhcp configuration" + + def cli(self, output=None): + real_cmd = "DisplayConfigDhcpSchema" + out = self.device.execute(real_cmd) if output is None else output + + # below regex extracts blocks op dhcp pools until the ! char: + # ! + # ip pool dhcppool-vlan10 + # network 10.23.25.0 mask 255.255.255.0 + # # + p_get_dhcp_pool_blocks = re.compile( + r'(?Pip pool[\s\S]*?(?=\n.*?\#))') + + # ex: domain-name Wijnen.local + p_block_domain = re.compile(r"^domain-name (?P.*$)") + + # ex: ip pool dhcppool-vlan10 + p_block_pool_name = re.compile(r"^ip pool (?P.*)$") + + # ex: gateway-list 10.23.25.254 + # something huawei config appends an extra whitespace at the end! + p_block_gateway = re.compile( + r"^gateway-list\s+(?P\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}|\w.*)$") + + # ex: network 10.0.10.160 255.255.255.240 + p_block_network = re.compile( + r"^network\s(?P\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s+mask\s+(?P\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})") + + # note: there are a lot of options. for parsing we do not opinionate + # we also dont do matching in the option data. + # because it can contain almost everything + p_block_options = re.compile( + r"^option\s(?P