Skip to content
Snippets Groups Projects
interfaces.py 1.53 KiB
Newer Older
import requests
import logging
from functools import reduce

logger = logging.getLogger(__name__)


def _get_ip_info(host):  # pragma: no cover
    def reduce_func(prev, curr):

        interface_name = curr.get('name')
        router_name = curr.get('router')
        if interface_name and router_name:
            router = prev.get(router_name, {})
            interface = router.get(interface_name, {})
            ipv4 = curr.get('ipv4', [])
            ipv6 = curr.get('ipv6', [])
            interface['ipv4'] = ipv4
            interface['ipv6'] = ipv6
            router[interface_name] = interface
            prev[router_name] = router

        return prev
    r = requests.get(f'{host}/data/interfaces')
    r.raise_for_status()
    interfaces = r.json()
    return reduce(reduce_func, interfaces, {})


def get_interfaces(host):  # pragma: no cover
Bjarke Madsen's avatar
Bjarke Madsen committed
    r = requests.get(f'{host}/poller/interfaces')
    r.raise_for_status()
    interfaces = r.json()
    ip_info = _get_ip_info(host)

    def enrich(interface):
        router_name = interface.get('router')
        router = ip_info.get(router_name)
        if not router:
            return interface

        ip = router.get(interface['name'])
        ipv4 = ip['ipv4']
        ipv6 = ip['ipv6']
        interface['ipv4'] = ipv4
        interface['ipv6'] = ipv6
        return interface
    enriched = list(map(enrich, interfaces))
    return enriched


def get_gws_direct(host):
    r = requests.get(f'{host}/poller/gws/direct')
    r.raise_for_status()
    interfaces = r.json()
    return interfaces