У меня есть два словаря, которые я пытаюсь сравнить и определить, относится ли IP интерфейса к определенной сети. У меня проблема в том, что я не знаю, как проверить каждый отдельный IP-адрес по нескольким IP-адресам. Когда я выполняю оператор if:
if ipaddress.ip_address(interface_address) in ipaddress.ip_network(ospf_int_range):
Не удается найти совпадение, поскольку первое interface_address
, которое он извлекает, - это 192.1.1.1, а ospf_int_range
возвращает 192.168.100.1. Вот диктат для ospf_int_range
.
{
"id": 1,
"vrf": "test",
"area": [{"area-id": 0, "authentication": {"message-digest": [None]}}],
"network": [
{"ip": "192.1.1.1", "wildcard": "0.0.0.0", "area": 0},
{"ip": "192.168.100.1", "wildcard": "0.0.0.0", "area": 0},
],
"router-id": "192.1.1.1",
}
Переменная interface_address
также может иметь несколько значений в зависимости от количества настроенных интерфейсов в dict. В идеале для каждого интерфейса в l oop он должен сравниваться со всеми парами 'network', ip '/' wildcard 'в другом dict.
Обновление: здесь весь код
def ospf_audit():
for interface_types in device_config['Cisco-IOS-XE-native:native']['interface']:
if 'GigabitEthernet' in interface_types:
for interface_attributes in device_config['Cisco-IOS-XE-native:native']['interface']['GigabitEthernet']:
#print(interface_attributes.items())
if 'vrf' in interface_attributes.keys():
interface_names = str(interface_attributes.get('name'))
interface_vrfs = str(interface_attributes['vrf']['forwarding'])
#print('\nGigabitEthernet '+interface_names+' vrf: '+interface_vrfs)
if 'ip' in interface_attributes.keys():
interface_ips = interface_attributes['ip']['address']['primary']['address']
print('\nGigabitEthernet '+interface_names+' vrf: '+interface_vrfs+' IP Address: '+interface_ips)
for network_statement in routing_protocol['Cisco-IOS-XE-ospf:router-ospf']['ospf']['process-id-vrf']:
for ospf_network in network_statement['network']:
ospf_interfaces = ospf_network['ip']
ospf_wildcards = ospf_network['wildcard']
wildcard_to_mask = str(ipaddress.ip_network(ospf_interfaces+'/'+ospf_wildcards, strict=False).netmask)
if wildcard_to_mask == '0.0.0.0':
wildcard_to_mask = '255.255.255.255'
ospf_intf_range = ipaddress.ip_interface(ospf_interfaces+'/'+wildcard_to_mask)
print(ospf_intf_range)
else:
print('\nGigabitEthernet '+interface_names+' vrf: '+interface_vrfs+' IP Address: Shutdown')
elif interface_attributes.get('vrf') is None:
interface_names = str(interface_attributes.get('name'))
#print('\nGigabitEthernet '+interface_names)
if 'ip' in interface_attributes.keys():
interface_ips = interface_attributes['ip']['address']['primary']['address']
print('\nGigabitEthernet '+interface_names+' vrf: global IP Address: '+interface_ips)
for network_statement in routing_protocol['Cisco-IOS-XE-ospf:router-ospf']['ospf']['process-id']:
for ospf_network in network_statement['network']:
ospf_interfaces = ospf_network['ip']
ospf_wildcards = ospf_network['wildcard']
wildcard_to_mask = str(ipaddress.ip_network(ospf_interfaces+'/'+ospf_wildcards, strict=False).netmask)
if wildcard_to_mask == '0.0.0.0':
wildcard_to_mask = '255.255.255.255'
ospf_intf_range = ipaddress.ip_interface(ospf_interfaces+'/'+wildcard_to_mask)
print(ospf_intf_range)
else:
print('\nGigabitEthernet '+interface_names+' vrf: global IP Address: Shutdown')
elif 'Loopback' in interface_types:
for interface_attributes in device_config['Cisco-IOS-XE-native:native']['interface']['Loopback']:
#print(interface_attributes.items())
if 'vrf' in interface_attributes.keys():
interface_names = str(interface_attributes.get('name'))
interface_vrfs = str(interface_attributes['vrf']['forwarding'])
#print('\nLoopback '+interface_names+' vrf: '+interface_vrfs)
if 'ip' in interface_attributes.keys():
interface_ips = interface_attributes['ip']['address']['primary']['address']
print('\nLoopback '+interface_names+' vrf: '+interface_vrfs+' IP Address: '+interface_ips)
for network_statement in routing_protocol['Cisco-IOS-XE-ospf:router-ospf']['ospf']['process-id-vrf']:
for ospf_network in network_statement['network']:
print(network_statement)
ospf_interfaces = ospf_network['ip']
ospf_wildcards = ospf_network['wildcard']
wildcard_to_mask = str(ipaddress.ip_network(ospf_interfaces+'/'+ospf_wildcards, strict=False).netmask)
if wildcard_to_mask == '0.0.0.0':
wildcard_to_mask = '255.255.255.255'
ospf_intf_range = ipaddress.ip_interface(ospf_interfaces+'/'+wildcard_to_mask)
print(ospf_intf_range)
else:
print('\nLoopback '+interface_names+' vrf: '+interface_vrfs+' IP Address: Shutdown')
elif interface_attributes.get('vrf') is None:
interface_names = str(interface_attributes.get('name'))
#print('\nLoopback '+interface_names)
if 'ip' in interface_attributes.keys():
interface_ips = interface_attributes['ip']['address']['primary']['address']
print('\nLoopback '+interface_names+' vrf: global IP Address: '+interface_ips)
for network_statement in routing_protocol['Cisco-IOS-XE-ospf:router-ospf']['ospf']['process-id']:
for ospf_network in network_statement['network']:
ospf_interfaces = ospf_network['ip']
ospf_wildcards = ospf_network['wildcard']
wildcard_to_mask = str(ipaddress.ip_network(ospf_interfaces+'/'+ospf_wildcards, strict=False).netmask)
if wildcard_to_mask == '0.0.0.0':
wildcard_to_mask = '255.255.255.255'
ospf_intf_range = ipaddress.ip_interface(ospf_interfaces+'/'+wildcard_to_mask)
print(ospf_intf_range)
else:
print('\nLoopback '+interface_names+' vrf: global IP Address: Shutdown')