aboutsummaryrefslogtreecommitdiffstats
path: root/examples/tg19/netbox_tools/netbox2gondul.py
diff options
context:
space:
mode:
Diffstat (limited to 'examples/tg19/netbox_tools/netbox2gondul.py')
-rw-r--r--examples/tg19/netbox_tools/netbox2gondul.py133
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)