cisco-config-parser 2.2.7__tar.gz → 2.2.9__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. {cisco_config_parser-2.2.7 → cisco_config_parser-2.2.9}/PKG-INFO +1 -1
  2. {cisco_config_parser-2.2.7 → cisco_config_parser-2.2.9}/cisco_config_parser/__init__.py +1 -1
  3. {cisco_config_parser-2.2.7 → cisco_config_parser-2.2.9}/cisco_config_parser/layer3_interface/l3_interface_parser.py +11 -8
  4. {cisco_config_parser-2.2.7 → cisco_config_parser-2.2.9}/cisco_config_parser/layer3_interface/l3_section_parser.py +59 -16
  5. {cisco_config_parser-2.2.7 → cisco_config_parser-2.2.9}/cisco_config_parser/parser_regex/ios_regex.py +5 -4
  6. {cisco_config_parser-2.2.7 → cisco_config_parser-2.2.9}/cisco_config_parser/setup.py +1 -1
  7. {cisco_config_parser-2.2.7 → cisco_config_parser-2.2.9}/cisco_config_parser.egg-info/PKG-INFO +1 -1
  8. {cisco_config_parser-2.2.7 → cisco_config_parser-2.2.9}/setup.py +1 -1
  9. {cisco_config_parser-2.2.7 → cisco_config_parser-2.2.9}/README.md +0 -0
  10. {cisco_config_parser-2.2.7 → cisco_config_parser-2.2.9}/cisco_config_parser/cisco_config_parser.py +0 -0
  11. {cisco_config_parser-2.2.7 → cisco_config_parser-2.2.9}/cisco_config_parser/global_search/__init__.py +0 -0
  12. {cisco_config_parser-2.2.7 → cisco_config_parser-2.2.9}/cisco_config_parser/global_search/global_obj.py +0 -0
  13. {cisco_config_parser-2.2.7 → cisco_config_parser-2.2.9}/cisco_config_parser/global_search/global_parser.py +0 -0
  14. {cisco_config_parser-2.2.7 → cisco_config_parser-2.2.9}/cisco_config_parser/global_search/global_separator.py +0 -0
  15. {cisco_config_parser-2.2.7 → cisco_config_parser-2.2.9}/cisco_config_parser/global_search/ios/__init__.py +0 -0
  16. {cisco_config_parser-2.2.7 → cisco_config_parser-2.2.9}/cisco_config_parser/global_search/nxos/__init__.py +0 -0
  17. {cisco_config_parser-2.2.7 → cisco_config_parser-2.2.9}/cisco_config_parser/global_search/xr/__init__.py +0 -0
  18. {cisco_config_parser-2.2.7 → cisco_config_parser-2.2.9}/cisco_config_parser/helper/__init__.py +0 -0
  19. {cisco_config_parser-2.2.7 → cisco_config_parser-2.2.9}/cisco_config_parser/helper/help.py +0 -0
  20. {cisco_config_parser-2.2.7 → cisco_config_parser-2.2.9}/cisco_config_parser/helper/helper.py +0 -0
  21. {cisco_config_parser-2.2.7 → cisco_config_parser-2.2.9}/cisco_config_parser/layer2_interface/__init__.py +0 -0
  22. {cisco_config_parser-2.2.7 → cisco_config_parser-2.2.9}/cisco_config_parser/layer2_interface/l2_interface_obj.py +0 -0
  23. {cisco_config_parser-2.2.7 → cisco_config_parser-2.2.9}/cisco_config_parser/layer2_interface/l2_interface_parser.py +0 -0
  24. {cisco_config_parser-2.2.7 → cisco_config_parser-2.2.9}/cisco_config_parser/layer2_interface/l2_interface_separator.py +0 -0
  25. {cisco_config_parser-2.2.7 → cisco_config_parser-2.2.9}/cisco_config_parser/layer2_interface/l2_section_parser.py +0 -0
  26. {cisco_config_parser-2.2.7 → cisco_config_parser-2.2.9}/cisco_config_parser/layer3_interface/__init__.py +0 -0
  27. {cisco_config_parser-2.2.7 → cisco_config_parser-2.2.9}/cisco_config_parser/layer3_interface/l3_interface_obj.py +0 -0
  28. {cisco_config_parser-2.2.7 → cisco_config_parser-2.2.9}/cisco_config_parser/layer3_interface/l3_interface_separator.py +0 -0
  29. {cisco_config_parser-2.2.7 → cisco_config_parser-2.2.9}/cisco_config_parser/old_version/__init__.py +0 -0
  30. {cisco_config_parser-2.2.7 → cisco_config_parser-2.2.9}/cisco_config_parser/old_version/exceptions.py +0 -0
  31. {cisco_config_parser-2.2.7 → cisco_config_parser-2.2.9}/cisco_config_parser/old_version/obj.py +0 -0
  32. {cisco_config_parser-2.2.7 → cisco_config_parser-2.2.9}/cisco_config_parser/old_version/old_parse.py +0 -0
  33. {cisco_config_parser-2.2.7 → cisco_config_parser-2.2.9}/cisco_config_parser/old_version/ssh.py +0 -0
  34. {cisco_config_parser-2.2.7 → cisco_config_parser-2.2.9}/cisco_config_parser/old_version/utils.py +0 -0
  35. {cisco_config_parser-2.2.7 → cisco_config_parser-2.2.9}/cisco_config_parser/parent_child/__init__.py +0 -0
  36. {cisco_config_parser-2.2.7 → cisco_config_parser-2.2.9}/cisco_config_parser/parent_child/parent_child_obj.py +0 -0
  37. {cisco_config_parser-2.2.7 → cisco_config_parser-2.2.9}/cisco_config_parser/parent_child/parent_child_parser.py +0 -0
  38. {cisco_config_parser-2.2.7 → cisco_config_parser-2.2.9}/cisco_config_parser/parent_child/parent_child_separator.py +0 -0
  39. {cisco_config_parser-2.2.7 → cisco_config_parser-2.2.9}/cisco_config_parser/parser/__init__.py +0 -0
  40. {cisco_config_parser-2.2.7 → cisco_config_parser-2.2.9}/cisco_config_parser/parser/parser.py +0 -0
  41. {cisco_config_parser-2.2.7 → cisco_config_parser-2.2.9}/cisco_config_parser/parser_regex/__init__.py +0 -0
  42. {cisco_config_parser-2.2.7 → cisco_config_parser-2.2.9}/cisco_config_parser/parser_regex/common_regex.py +0 -0
  43. {cisco_config_parser-2.2.7 → cisco_config_parser-2.2.9}/cisco_config_parser/parser_regex/nxos_regex.py +0 -0
  44. {cisco_config_parser-2.2.7 → cisco_config_parser-2.2.9}/cisco_config_parser/routing_protocol/__init__.py +0 -0
  45. {cisco_config_parser-2.2.7 → cisco_config_parser-2.2.9}/cisco_config_parser/routing_protocol/ios/__init__.py +0 -0
  46. {cisco_config_parser-2.2.7 → cisco_config_parser-2.2.9}/cisco_config_parser/routing_protocol/ios/rtp_bgp.py +0 -0
  47. {cisco_config_parser-2.2.7 → cisco_config_parser-2.2.9}/cisco_config_parser/routing_protocol/ios/rtp_eigtp.py +0 -0
  48. {cisco_config_parser-2.2.7 → cisco_config_parser-2.2.9}/cisco_config_parser/routing_protocol/ios/rtp_ios_rtp_obj.py +0 -0
  49. {cisco_config_parser-2.2.7 → cisco_config_parser-2.2.9}/cisco_config_parser/routing_protocol/ios/rtp_ospf.py +0 -0
  50. {cisco_config_parser-2.2.7 → cisco_config_parser-2.2.9}/cisco_config_parser/routing_protocol/ios/rtp_static.py +0 -0
  51. {cisco_config_parser-2.2.7 → cisco_config_parser-2.2.9}/cisco_config_parser/routing_protocol/nxos/__init__.py +0 -0
  52. {cisco_config_parser-2.2.7 → cisco_config_parser-2.2.9}/cisco_config_parser/routing_protocol/nxos/rtp_bgp.py +0 -0
  53. {cisco_config_parser-2.2.7 → cisco_config_parser-2.2.9}/cisco_config_parser/routing_protocol/nxos/rtp_nxos_rtp_obj.py +0 -0
  54. {cisco_config_parser-2.2.7 → cisco_config_parser-2.2.9}/cisco_config_parser/routing_protocol/nxos/rtp_ospf.py +0 -0
  55. {cisco_config_parser-2.2.7 → cisco_config_parser-2.2.9}/cisco_config_parser/routing_protocol/nxos/rtp_static.py +0 -0
  56. {cisco_config_parser-2.2.7 → cisco_config_parser-2.2.9}/cisco_config_parser/routing_protocol/nxos/rtp_vxlan.py +0 -0
  57. {cisco_config_parser-2.2.7 → cisco_config_parser-2.2.9}/cisco_config_parser/routing_protocol/utils/__init__.py +0 -0
  58. {cisco_config_parser-2.2.7 → cisco_config_parser-2.2.9}/cisco_config_parser/routing_protocol/utils/rtp_ios_separator.py +0 -0
  59. {cisco_config_parser-2.2.7 → cisco_config_parser-2.2.9}/cisco_config_parser/routing_protocol/utils/rtp_nxos_separator.py +0 -0
  60. {cisco_config_parser-2.2.7 → cisco_config_parser-2.2.9}/cisco_config_parser/routing_protocol/utils/utils.py +0 -0
  61. {cisco_config_parser-2.2.7 → cisco_config_parser-2.2.9}/cisco_config_parser/routing_protocol/xr/__init__.py +0 -0
  62. {cisco_config_parser-2.2.7 → cisco_config_parser-2.2.9}/cisco_config_parser/separator/__init__.py +0 -0
  63. {cisco_config_parser-2.2.7 → cisco_config_parser-2.2.9}/cisco_config_parser/separator/separator.py +0 -0
  64. {cisco_config_parser-2.2.7 → cisco_config_parser-2.2.9}/cisco_config_parser.egg-info/SOURCES.txt +0 -0
  65. {cisco_config_parser-2.2.7 → cisco_config_parser-2.2.9}/cisco_config_parser.egg-info/dependency_links.txt +0 -0
  66. {cisco_config_parser-2.2.7 → cisco_config_parser-2.2.9}/cisco_config_parser.egg-info/top_level.txt +0 -0
  67. {cisco_config_parser-2.2.7 → cisco_config_parser-2.2.9}/pyproject.toml +0 -0
  68. {cisco_config_parser-2.2.7 → cisco_config_parser-2.2.9}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: cisco_config_parser
3
- Version: 2.2.7
3
+ Version: 2.2.9
4
4
  Summary: This library is used for Network Automation involving Cisco Routers and Switch. It will parse Cisco IOS, IOS-XE, IOS-XR, and NXOS configuration file into objects and/or json format
5
5
  Home-page: https://github.com/arezazadeh/cisco_config_parser
6
6
  Author: Ahmad Rezazadeh
@@ -6,7 +6,7 @@ _ALL_ = [
6
6
  "ConfigParserOld",
7
7
  ]
8
8
 
9
- __version__ = "2.2.7"
9
+ __version__ = "2.2.9"
10
10
  __author__ = "Ahmad Rezazadeh"
11
11
  __email__ = "ahmad@klevernet.io"
12
12
  __url__ = "klevernet.ai"
@@ -41,25 +41,27 @@ class L3InterfaceParser:
41
41
 
42
42
  for l3_interface in l3_interfaces:
43
43
 
44
+ l3_interface_stripped = "\n".join([line.strip() for line in l3_interface.split("\n") if line.strip()])
44
45
  # create an instance of the L3Interface class
45
46
  l3_intf_cls = L3Interface()
46
47
 
47
48
  # split the l3_interface section into lines
48
49
  # remove the first line which is the interface name
49
50
  # and store the rest of the lines in the children attribute of the l3_intf_cls object
50
- l3_intf_split_line = SPLIT_ON_LINE.split(l3_interface)
51
+ l3_intf_split_line = SPLIT_ON_LINE.split(l3_interface_stripped)
51
52
  l3_intf_cls.children = [
52
53
  line.strip() for line in l3_intf_split_line
53
54
  if line and not line.startswith("interface")
54
55
  ]
55
56
 
56
57
  # search for the regex in the l3_interface section
57
- interface_regex = INTERFACE_MULTILINE_REGEX.search(l3_interface)
58
- description_regex = DESCRIPTION_REGEX.search(l3_interface)
59
- ip_address_regex = IP_ADDRESS_REGEX.search(l3_interface)
60
- vrf_regex = VRF_REGEX.search(l3_interface)
61
- helper_address_regex = HELPER_ADDRESS_REGEX.search(l3_interface)
62
- sec_ip_address_regex = SECONDARY_IP_ADDRESS_REGEX.search(l3_interface)
58
+ interface_regex = INTERFACE_MULTILINE_REGEX.search(l3_interface_stripped)
59
+ description_regex = DESCRIPTION_REGEX.search(l3_interface_stripped)
60
+ ip_address_regex = IP_ADDRESS_REGEX.search(l3_interface_stripped)
61
+ vrf_regex = VRF_REGEX.search(l3_interface_stripped)
62
+ helper_address_regex = HELPER_ADDRESS_REGEX.search(l3_interface_stripped)
63
+ sec_ip_address_regex = SECONDARY_IP_ADDRESS_REGEX.search(l3_interface_stripped)
64
+
63
65
 
64
66
 
65
67
  # if the regex is found, parse the line and store the value in the l3_intf_cls object
@@ -76,13 +78,14 @@ class L3InterfaceParser:
76
78
  if sec_ip_address_regex:
77
79
  # set the primary flag to False to indicate that the ip address is a secondary ip address
78
80
  ip_address_kwargs["primary"] = False
81
+ ip_address_kwargs["ip_address_line_regex"] = sec_ip_address_regex
79
82
  l3_intf_cls = _L3SectionParser._parse_ip_address_line(**ip_address_kwargs)
80
83
 
81
84
  if vrf_regex:
82
85
  l3_intf_cls = _L3SectionParser._parse_vrf_line(vrf_line_regex=vrf_regex, l3_interface_obj=l3_intf_cls)
83
86
 
84
87
  if helper_address_regex:
85
- l3_intf_cls = _L3SectionParser._parse_helper_address_line(l3_interface_obj=l3_intf_cls, section=l3_interface)
88
+ l3_intf_cls = _L3SectionParser._parse_helper_address_line(l3_interface_obj=l3_intf_cls, section=l3_interface_stripped)
86
89
 
87
90
  if interface_regex:
88
91
  l3_intf_cls.name = interface_regex.group(1).strip()
@@ -19,7 +19,37 @@ class _L3SectionParser:
19
19
  return: l3_interface_obj
20
20
  """
21
21
 
22
- def process_ip_address_with_cidr(ip_address_with_cidr, obj):
22
+
23
+ def cleanup_ip_address(ip_address_line_regex):
24
+ ip_address_regex = [ip_group for ip_group in ip_address_line_regex.groups() if ip_group]
25
+ if not ip_address_regex:
26
+ return None
27
+
28
+ if "/" in ip_address_regex[0]:
29
+ ip_address_config = ip_address_regex[0].split("/")
30
+ ip_addr = ip_address_config[0].strip()
31
+ cidr = ip_address_config[1].strip()
32
+ subnet_ = ipaddress.IPv4Network(f"{ip_addr}/{cidr}", strict=False)
33
+ return {
34
+ "ip_address": ip_addr.strip(),
35
+ "mask": str(subnet_.netmask),
36
+ "subnet": str(subnet_).strip()
37
+ }
38
+
39
+ else:
40
+ ip_address_section = ip_address_regex[0].split()
41
+ ip_address = ip_address_section[0].strip()
42
+ mask = ip_address_section[1].strip()
43
+ subnet = str(ipaddress.IPv4Network(f"{ip_address}/{mask}", strict=False))
44
+ return {
45
+ "ip_address": ip_address.strip(),
46
+ "mask": mask.strip(),
47
+ "subnet": subnet.strip()
48
+ }
49
+
50
+
51
+
52
+ def process_ip_address_with_cidr(ip_address_with_cidr, obj, primary=True):
23
53
  """
24
54
  Process the ip address with cidr
25
55
  :param ip_address_with_cidr: str
@@ -39,25 +69,36 @@ class _L3SectionParser:
39
69
  l3_interface_obj = kwargs.get("l3_interface_obj")
40
70
  primary = kwargs.get("primary", True)
41
71
 
42
- ip_address_regex = [ip_group for ip_group in ip_address_line_regex.groups() if ip_group]
72
+ ip_info = cleanup_ip_address(ip_address_line_regex)
73
+ # ip_address_regex = [ip_group for ip_group in ip_address_line_regex.groups() if ip_group]
43
74
 
75
+ # print(ip_address_regex)
44
76
  # Check if the ip address has a CIDR - 10.1.1.1/24
45
- if "/" in ip_address_regex[0]:
46
- l3_interface_obj = process_ip_address_with_cidr(ip_address_regex[0], l3_interface_obj)
47
- return l3_interface_obj
48
-
49
- ip_address_section = ip_address_regex[0].split()
50
- ip_address = ip_address_section[0].strip()
51
- mask = ip_address_section[1].strip()
52
- subnet = str(ipaddress.IPv4Network(f"{ip_address}/{mask}", strict=False))
77
+ # if "/" in ip_address_regex[0]:
78
+ #
79
+ # l3_interface_obj = process_ip_address_with_cidr(ip_address_regex[0], l3_interface_obj)
80
+ # return l3_interface_obj
81
+
82
+ # ip_address_section = ip_address_regex[0].split()
83
+ # ip_address = ip_address_section[0].strip()
84
+ # mask = ip_address_section[1].strip()
85
+ # subnet = str(ipaddress.IPv4Network(f"{ip_address}/{mask}", strict=False))
53
86
  if primary:
54
- l3_interface_obj.ip_address = ip_address.strip()
55
- l3_interface_obj.mask = mask.strip()
56
- l3_interface_obj.subnet = subnet.strip()
87
+ l3_interface_obj.ip_address = ip_info["ip_address"].strip()
88
+ l3_interface_obj.mask = ip_info["mask"].strip()
89
+ l3_interface_obj.subnet = ip_info["subnet"].strip()
90
+
91
+ # l3_interface_obj.ip_address = ip_address.strip()
92
+ # l3_interface_obj.mask = mask.strip()
93
+ # l3_interface_obj.subnet = subnet.strip()
57
94
  else:
58
- l3_interface_obj.sec_ip_address = ip_address.strip()
59
- l3_interface_obj.sec_mask = mask.strip()
60
- l3_interface_obj.sec_subnet = subnet.strip()
95
+ l3_interface_obj.sec_ip_address = ip_info["ip_address"].strip()
96
+ l3_interface_obj.sec_mask = ip_info["mask"].strip()
97
+ l3_interface_obj.sec_subnet = ip_info["subnet"].strip()
98
+
99
+ # l3_interface_obj.sec_ip_address = ip_address.strip()
100
+ # l3_interface_obj.sec_mask = mask.strip()
101
+ # l3_interface_obj.sec_subnet = subnet.strip()
61
102
 
62
103
  return l3_interface_obj
63
104
 
@@ -73,7 +114,9 @@ class _L3SectionParser:
73
114
  vrf_line_regex = kwargs.get("vrf_line_regex")
74
115
  l3_interface_obj = kwargs.get("l3_interface_obj")
75
116
  vrf = vrf_line_regex.groups()
117
+
76
118
  vrf = [vrf_group for vrf_group in vrf if vrf_group][0]
119
+
77
120
  l3_interface_obj.vrf = vrf.strip()
78
121
  return l3_interface_obj
79
122
 
@@ -28,10 +28,11 @@ INTERFACE_REGEX = re.compile(r"interface\s(.*)", flags=re.MULTILINE)
28
28
  # L3 Interface
29
29
  DESCRIPTION_REGEX = re.compile(r"description\s(.*)", flags=re.MULTILINE)
30
30
  IP_ADDRESS_REGEX = re.compile(r"ip\saddress\s(\d+\.\d+\.\d+\.\d+\s\d+\.\d+\.\d+\.\d+)|ip\saddress\s(\d+\.\d+\.\d+\.\d+/\d+)|ipv4\saddress\s(\d+\.\d+\.\d+\.\d+\s\d+\.\d+\.\d+\.\d+)|ipv4\saddress\s(\d+\.\d+\.\d+\.\d+/\d+)")
31
- IP_ADDRESS_CIDR_REGEX = re.compile(r"ip\saddress\s(\d+\.\d+\.\d+\.\d+/\d+)")
32
- HELPER_ADDRESS_REGEX = re.compile(r"ip\shelper-address\s(.*)")
33
- SECONDARY_IP_ADDRESS_REGEX = re.compile(r"ip\saddress\s(.*)secondary")
34
- VRF_REGEX = re.compile(r"ip\svrf\sforwarding\s(.*)|vrf\smember\s(.*)|vrf\s(.*)")
31
+ # IP_ADDRESS_REGEX = re.compile(r"ipv?4?\saddress\s(\d+\.\d+\.\d+\.\d+)(\s\d+\.\d+\.\d+\.\d+|/\d+)?", flags=re.MULTILINE)
32
+ IP_ADDRESS_CIDR_REGEX = re.compile(r"ip\saddress\s(\d+\.\d+\.\d+\.\d+/\d+)", flags=re.MULTILINE)
33
+ HELPER_ADDRESS_REGEX = re.compile(r"ip\shelper-address\s(.*)", flags=re.MULTILINE)
34
+ SECONDARY_IP_ADDRESS_REGEX = re.compile(r"^ip\saddress\s(.*)\ssecondary", flags=re.MULTILINE)
35
+ VRF_REGEX = re.compile(r"^ip\svrf\sforwarding\s(.*)|^vrf\smember\s(.*)|^vrf\sforwarding\s(.*)|^vrf\s(\S+)$", flags=re.MULTILINE)
35
36
 
36
37
 
37
38
 
@@ -3,6 +3,6 @@ from setuptools import setup, find_packages
3
3
 
4
4
  setup(
5
5
  name='cisco_config_parser',
6
- version='2.2.7',
6
+ version='2.2.9',
7
7
  packages=find_packages(),
8
8
  )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: cisco_config_parser
3
- Version: 2.2.7
3
+ Version: 2.2.9
4
4
  Summary: This library is used for Network Automation involving Cisco Routers and Switch. It will parse Cisco IOS, IOS-XE, IOS-XR, and NXOS configuration file into objects and/or json format
5
5
  Home-page: https://github.com/arezazadeh/cisco_config_parser
6
6
  Author: Ahmad Rezazadeh
@@ -3,7 +3,7 @@ from setuptools import setup, find_packages
3
3
 
4
4
  HERE = pathlib.Path(__file__).parent
5
5
 
6
- VERSION = '2.2.7'
6
+ VERSION = '2.2.9'
7
7
  PACKAGE_NAME = 'cisco_config_parser'
8
8
  AUTHOR = 'Ahmad Rezazadeh'
9
9
  AUTHOR_EMAIL = 'ahmad@klevernet.io'