Доступ к части запросов Python, отформатированных в формате JSON - PullRequest
0 голосов
/ 27 октября 2019

Я только начинаю кодировать на Python, и я все еще пытаюсь выяснить, как все работает, поэтому, если логика, лежащая в основе этого, не верна, пожалуйста, исправьте меня. устройство и сравнивает возвращенные данные с другим устройством. Цель состоит в том, чтобы поддерживать синхронизацию конфигурации обоих устройств.

Вот сценарий:

import requests
import json
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)

net_objects = ['aaa','availability_group','dns_group','dns_host','group','host','multicast','network','range']

for obj in net_objects:
    src_URL = 'https://172.16.2.100:4444/api/objects/network/' + obj + '/'
    src_headers = {
        'Accept': 'application/json',
        'Authorization': 'Basic dG9rZW46U2tCaENIZUlRZnlVeEpBU3dqYUh2c0VHRmZjdWtDTFg='
        }
    src_net_obj = requests.get(src_URL, headers=src_headers, timeout=15, verify=False)

    dst_URL = 'https://172.16.2.101:4444/api/objects/network/' + obj + '/'
    dst_headers = {
        'Accept': 'application/json',
        'X-Restd-Err-Ack': 'all',
        'Authorization': 'Basic dG9rZW46dlZ3WnVZZGxpd01IRkxNVXpKVXZtZXhiZGZHSExobnI='
        }
    dst_net_obj = requests.get(dst_URL, headers=dst_headers, timeout=15, verify=False)

    for src_dict_item in src_net_obj.json():
        if src_dict_item["name"] in dst_net_obj.json():
            update =  requests.patch(url, headers=dst_headers, timeout=15, verify=False)
        else:
            update =  requests.put(url, headers=dst_headers, timeout=15, verify=False)

Я не уверен насчет синтаксиса. Вот что я ожидаю от него:

  1. Запрос устройства-источника и возврат данных в формате JSON
  2. Запрос устройства-адресата и возврат данных в формате JSON
  3. Сравнить оба запроса
  4. Если объект в устройстве-источнике также существует в целевом устройстве, обновите его, используя PATCH запрос
  5. Если объект в устройстве-источнике не существует в целевом устройстве,создайте его, используя PUT запрос

Я фильтрую значение name, возвращаемое запросом. Если имя существует и на устройстве-источнике, и на устройстве-получателе, я хочу, чтобы оно обновляло данные в объекте-получателе, используя объект-источник. В конечном итоге я хотел бы сравнить фактические данные в ocjects, просто пропустив текущий объект, если данные одинаковы как в Source, так и в Destination, но они появятся позже.

Возвращенные данные из GETзапрос на устройстве-источнике выглядит следующим образом:

[{'_locked': '', '_ref': 'REF_DefaultL2TPPool', '_type': 'network/network', 'address': '10.242.3.0', 'address6': 'fd32:5a88:8e98:3::', 'comment': 'Default L2TP VPN Remote Access IP Pool', 'interface': '', 'name': 'VPN Pool (L2TP)', 'netmask': 24, 'netmask6': 64, 'resolved': True, 'resolved6': True}, {'_locked': '', '_ref': 'REF_DefaultPPTPPool', '_type': 'network/network', 'address': '10.242.1.0', 'address6': 'fd32:5a88:8e98:1::', 'comment': 'Default PPTP Remote Access IP Pool', 'interface': '', 'name': 'VPN Pool (PPTP)', 'netmask': 24, 'netmask6': 64, 'resolved': True, 'resolved6': True}, {'_locked': '', '_ref': 'REF_NetNetNetVlan66Publi', '_type': 'network/network', 'address': '192.168.66.0', 'address6': '', 'comment': '', 'interface': '', 'name': 'VLAN 66 Public', 'netmask': 24, 'netmask6': 128, 'resolved': True, 'resolved6': False}, {'_locked': '', '_ref': 'REF_DefaultRWPool', '_type': 'network/network', 'address': '10.242.4.0', 'address6': 'fd32:5a88:8e98:4::', 'comment': 'Default IPsec VPN Remote Access IP Pool', 'interface': '', 'name': 'VPN Pool (IPsec)', 'netmask': 24, 'netmask6': 64, 'resolved': True, 'resolved6': True}, {'_locked': 'user', '_ref': 'REF_NetworkInternet', '_type': 'network/network', 'address': '0.0.0.0', 'address6': '', 'comment': '"Any" network, bound to interfaces with default IPv4 gateway', 'interface': 'REF_IntEthExternaWan', 'name': 'Internet IPv4', 'netmask': 0, 'netmask6': 0, 'resolved': True, 'resolved6': False}, {'_locked': '', '_ref': 'REF_DefaultSSLPool', '_type': 'network/network', 'address': '10.242.2.0', 'address6': 'fd32:5a88:8e98:2::', 'comment': 'Default SSL VPN IP Pool', 'interface': '', 'name': 'VPN Pool (SSL)', 'netmask': 24, 'netmask6': 64, 'resolved': True, 'resolved6': True}, {'_locked': 'user', '_ref': 'REF_NetworkInternet6', '_type': 'network/network', 'address': '0.0.0.0', 'address6': '::', 'comment': '"Any" network, bound to interfaces with default IPv6 gateway', 'interface': '', 'name': 'Internet IPv6', 'netmask': 0, 'netmask6': 0, 'resolved': False, 'resolved6': False}, {'_locked': '', '_ref': 'REF_DefaultCiscoRWPool', '_type': 'network/network', 'address': '10.242.5.0', 'address6': 'fd32:5a88:8e98:5::', 'comment': 'Default IPsec VPN Remote Access IP Pool for Cisco clients', 'interface': '', 'name': 'VPN Pool (Cisco)', 'netmask': 24, 'netmask6': 64, 'resolved': True, 'resolved6': True}, {'_locked': '', '_ref': 'REF_NetNetNetVlan1Site', '_type': 'network/network', 'address': '192.168.0.0', 'address6': '', 'comment': '', 'interface': '', 'name': 'NET - VLAN 1 Site 1', 'netmask': 24, 'netmask6': 128, 'resolved': True, 'resolved6': False}]

Вот данные, полученные из запроса GET на устройстве-получателе:

[{'_locked': '', '_ref': 'REF_DefaultL2TPPool', '_type': 'network/network', 'address': '10.242.3.0', 'address6': 'fd32:5a88:8e98:3::', 'comment': 'Default L2TP VPN Remote Access IP Pool', 'interface': '', 'name': 'VPN Pool (L2TP)', 'netmask': 24, 'netmask6': 64, 'resolved': True, 'resolved6': True}, {'_locked': '', '_ref': 'REF_DefaultPPTPPool', '_type': 'network/network', 'address': '10.242.1.0', 'address6': 'fd32:5a88:8e98:1::', 'comment': 'Default PPTP Remote Access IP Pool', 'interface': '', 'name': 'VPN Pool (PPTP)', 'netmask': 24, 'netmask6': 64, 'resolved': True, 'resolved6': True}, {'_locked': '', '_ref': 'REF_DefaultRWPool', '_type': 'network/network', 'address': '10.242.4.0', 'address6': 'fd32:5a88:8e98:4::', 'comment': 'Default IPsec VPN Remote Access IP Pool', 'interface': '', 'name': 'VPN Pool (IPsec)', 'netmask': 24, 'netmask6': 64, 'resolved': True, 'resolved6': True}, {'_locked': 'user', '_ref': 'REF_NetworkInternet', '_type': 'network/network', 'address': '0.0.0.0', 'address6': '', 'comment': '"Any" network, bound to interfaces with default IPv4 gateway', 'interface': 'REF_IntEthExternaWan', 'name': 'Internet IPv4', 'netmask': 0, 'netmask6': 0, 'resolved': True, 'resolved6': False}, {'_locked': '', '_ref': 'REF_DefaultSSLPool', '_type': 'network/network', 'address': '10.242.2.0', 'address6': 'fd32:5a88:8e98:2::', 'comment': 'Default SSL VPN IP Pool', 'interface': '', 'name': 'VPN Pool (SSL)', 'netmask': 24, 'netmask6': 64, 'resolved': True, 'resolved6': True}, {'_locked': 'user', '_ref': 'REF_NetworkInternet6', '_type': 'network/network', 'address': '0.0.0.0', 'address6': '::', 'comment': '"Any" network, bound to interfaces with default IPv6 gateway', 'interface': '', 'name': 'Internet IPv6', 'netmask': 0, 'netmask6': 0, 'resolved': False, 'resolved6': False}, {'_locked': '', '_ref': 'REF_DefaultCiscoRWPool', '_type': 'network/network', 'address': '10.242.5.0', 'address6': 'fd32:5a88:8e98:5::', 'comment': 'Default IPsec VPN Remote Access IP Pool for Cisco clients', 'interface': '', 'name': 'VPN Pool (Cisco)', 'netmask': 24, 'netmask6': 64, 'resolved': True, 'resolved6': True}]

Я пытаюсь сравнить эти возвращенные данные из источника с данными, возвращенными из пункта назначения.

Это, очевидно, не работает, так как я ожидаю, что это будет работать. Я пробовал несколько комбинаций, но я не могу найти правильный способ сделать это.

Любая помощь будет оценена.

1 Ответ

0 голосов
/ 29 октября 2019

Так как я не совсем уверен, что вы хотите сделать, вот кое-что, что может, по крайней мере, частично пройти туда: он сравнивает Источник с Пунктом назначения и дает вам отчет о различиях. И вы можете взять это оттуда. Включенная функция отсюда поднимается .

src = [the Source data you posted above]
dest = [the Destination data you posted above]

Import itertools

def compare_dict(dict1, dict2):
    for x1 in set(dict1.keys()).union(dict2.keys()):
        z = dict1.get(x1) == dict2.get(x1)
        if not z:
            print('key', x1)
            print('value A', dict1.get(x1), '\nvalue B', dict2.get(x1))
            print('-----\n')

for s,d in itertools.zip_longest(src,dest):
    if d is not None and s is not None:
        compare_dict(s,d)
    else:
        print('Not in Destination:',list(s.items()))

Вывод:

key netmask6
value A 128 
value B 64

.....
Not in Destination: [('_locked', ''), ('_ref', 'REF_DefaultCiscoRWPool')...]

и т. Д. Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...