diff options
| author | Ole Mathias Aa. Heggem <olemathias.aa.heggem@gmail.com> | 2019-11-11 22:14:22 +0100 | 
|---|---|---|
| committer | Ole Mathias Aa. Heggem <olemathias.aa.heggem@gmail.com> | 2019-11-11 22:14:22 +0100 | 
| commit | ef8122013956d09127c25285fde92b39c4e8af55 (patch) | |
| tree | 34ce1266ae41d86e9378f481c1afb1e00be9c90c /examples/tg19/netbox_tools/netbox2gondul.py | |
| parent | 1f190fed23d84fa00559653e868e6be5ff6451aa (diff) | |
A little TG19 scripts and config
Diffstat (limited to 'examples/tg19/netbox_tools/netbox2gondul.py')
| -rw-r--r-- | examples/tg19/netbox_tools/netbox2gondul.py | 133 | 
1 files changed, 133 insertions, 0 deletions
diff --git a/examples/tg19/netbox_tools/netbox2gondul.py b/examples/tg19/netbox_tools/netbox2gondul.py new file mode 100644 index 0000000..f0154dd --- /dev/null +++ b/examples/tg19/netbox_tools/netbox2gondul.py @@ -0,0 +1,133 @@ +#!/usr/bin/python3 + +import ipaddress +import requests +import json +from requests.auth import HTTPBasicAuth + +import pynetbox + +gondul_url = 'https://gondul.tg19.gathering.org' +gondul_user = 'tech' +gondul_pass = '<Removed>' + +nb = pynetbox.api( +    'https://netbox.infra.gathering.org', +    token='<Removed>' +) + +snmp_community = '<Removed>' + +ipam_roles = [1, 2, 5, 4, 7] +#ipam_roles = [1] + +switches_roles = [11, 10, 6, 8] +#switches_roles = [11] + +# Create vlans/networks +nb_vlans = nb.ipam.vlans.all() +for vlan in nb_vlans: +    if vlan.role is None: +        continue +    if vlan.role.id not in ipam_roles: +        continue +    prefix_v4 = nb.ipam.prefixes.filter(vlan_id=vlan.id, family=4, status=1) +    if len(prefix_v4) <= 0: +        print("No v4 prefix found for vlan {}".format(vlan.name)) +        prefix_v4 = None +        gw4 = None +    else: +        prefix_v4 = prefix_v4[0].prefix +        gw4 = ipaddress.IPv4Network(prefix_v4)[1].exploded + +    prefix_v6 = nb.ipam.prefixes.filter(vlan_id=vlan.id, family=6, status=1) +    if len(prefix_v6) <= 0: +        print("No v6 prefix found for vlan {}".format(vlan.name)) +        prefix_v6 = None +        gw6 = None +    else: +        prefix_v6 = prefix_v6[0].prefix +        gw6 = ipaddress.IPv6Network(prefix_v6)[1].exploded + +    router = nb.ipam.ip_addresses.filter(address=gw4) +    if len(router) <= 0: +        print("No router found for vlan {}".format(vlan.name)) +        router = None +    else: +        router = router[0].interface.device.name + +    #tags = [vlan.role.slug] +    data = json.dumps([{'name': vlan.name, 'subnet4': prefix_v4, 'subnet6': prefix_v6, 'gw4': gw4, 'gw6': gw6, 'router': router, 'vlan': vlan.vid}]) +    r = requests.post("{}/api/write/networks".format(gondul_url), data=data, headers={'content-type': 'application/json'}, auth=HTTPBasicAuth(gondul_user, gondul_pass)) +    print(r.status_code, r.text, data) + +# Create switches/devices +nb_switches = nb.dcim.devices.all() +for switch in nb_switches: +    if switch.device_role is None: +        continue +    if switch.device_role.id not in switches_roles: +        continue +    lag = nb.dcim.interfaces.filter(device_id=switch.id, name='ae0') +    if len(lag) <= 0: +        print("No ae0 found for switch {}, not setting distro".format(switch.name)) +        distro = None +        uplink = None +    else: +        uplinks = nb.dcim.interfaces.filter(lag_id=lag[0].id) +        if uplinks is not None and uplinks[0].connected_endpoint is not None: +            distro = uplinks[0].connected_endpoint.device.name +            uplink = "{}.0".format(uplinks[0].connected_endpoint.name) +        else: +            distro = None +            uplink = None + +    if switch.primary_ip4 is not None: +        mgmt_vlan = nb.ipam.prefixes.filter(contains=switch.primary_ip4.address, status=1) +        print(mgmt_vlan) +        ip4 = str(switch.primary_ip4.address) +        if len(mgmt_vlan) <= 0: +            print("mgmt_vlan not found for switch {}".format(switch.name)) +            mgmt_vlan_name = None +        elif mgmt_vlan[0].vlan is None: +            print("mgmt_vlan not found for switch {}".format(switch.name)) +            mgmt_vlan_name = None +        else: +            mgmt_vlan_name = mgmt_vlan[0].vlan.name +    else: +        mgmt_vlan_name = None +        ip4 = '' + +    if switch.primary_ip6 is not None: +        ip6 = str(switch.primary_ip6) +    else: +        ip6 = '' + +    print(switch.device_role.id) +    if switch.device_role.id != 8: +        traffic_vlan = switch.name +    else: +        traffic_vlan = None + +    data = {'sysname': switch.name, 'community': snmp_community} + +    if distro is not None: +        data.update({'distro_name': distro}) +    if uplink is not None: +        data.update({'distro_phy_port': uplink}) +    if traffic_vlan is not None: +        data.update({'traffic_vlan': traffic_vlan}) +    if mgmt_vlan_name is not None: +        data.update({'mgmt_vlan': mgmt_vlan_name}) +    if ip4 is not None and ip4 != '': +        data.update({'mgmt_v4_addr': ip4}) +    if ip6 is not None and ip6 != '': +        data.update({'mgmt_v6_addr': ip6}) + +    tags = [switch.device_role.slug] + switch.tags +    data.update({'tags': tags}) + +    data = json.dumps([data]) +    print(data) +    r = requests.post("{}/api/write/switches".format(gondul_url), data=data, headers={'content-type': 'application/json'}, auth=HTTPBasicAuth(gondul_user, gondul_pass)) +    print(r.status_code, r.reason, data)  | 
