Сравнение двух словарей с несколькими значениями - PullRequest
0 голосов
/ 24 апреля 2020

У меня есть два словаря, которые я пытаюсь сравнить и определить, относится ли 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')
...