"""Install desktop entries.""" import ipaddress import json import os import pathlib import re import click import pynetbox @click.command() def main(): data = json.load(open(f"/run/user/{os.getuid()}/secrets/netbox.json")) nb = pynetbox.api( data["url"], token=data["token"], threading=True, ) appdir = pathlib.Path("~/dev/nixos-desktops/hostapps.json").expanduser().resolve() data = {} cisco = nb.dcim.manufacturers.get(name="Cisco") if cisco is None: return role_ids = [] for name in ["Network", "Network Core", "Network Edge", "Network WAN"]: role = nb.dcim.device_roles.get(name=name) if role is not None: role_ids.append(role.id) for device in nb.dcim.devices.filter( manufacturer_id=cisco.id, role_id=role_ids, status="active", has_primary_ip="true", ): if device.virtual_chassis is not None: name = device.virtual_chassis.name else: name = device.name address = None if device.primary_ip4 is not None: address = str(ipaddress.ip_interface(device.primary_ip4.address).ip) if address is None and device.primary_ip6 is not None: address = str(ipaddress.ip_interface(device.primary_ip6.address).ip) if address is None: print(f"{device.name} does not have a primary IP address") continue services = nb.ipam.services.filter(device_id=device.id) for service in services: if service.name.lower() in ["ssh", "telnet"]: for port in service.ports: data[f"{name}:{service.name.lower()}:{port}"] = { "name": name, "type": service.name.lower(), "comment": " ".join(name.split("-")), "address": address, "port": port, "username": "jcollie", "manufacturer": device.device_type.manufacturer.name, "model": device.device_type.model, "part_number": device.device_type.part_number, "class": re.sub(r"[^a-zA-Z0-9_]", "_", name), } print(name, address) schneider = nb.dcim.manufacturers.get(name="Schneider") if schneider is None: return role_ids = [] for name in ["Power Protection", "Power Distribution"]: role = nb.dcim.device_roles.get(name=name) if role is not None: role_ids.append(role.id) for device in nb.dcim.devices.filter( manufacturer_id=schneider.id, role_id=role_ids, status="active", has_primary_ip="true", ): name = device.name address = None if device.primary_ip4 is not None: address = str(ipaddress.ip_interface(device.primary_ip4.address).ip) if address is None and device.primary_ip6 is not None: address = str(ipaddress.ip_interface(device.primary_ip6.address).ip) if address is None: print(f"{device.name} does not have a primary IP address") continue services = nb.ipam.services.filter(device_id=device.id) for service in services: if service.name.lower() in ["ssh", "telnet"]: for port in service.ports: data[f"{name}:{service.name.lower()}:{port}"] = { "name": name, "type": service.name.lower(), "comment": " ".join(name.split("-")), "address": address, "port": port, "username": "apc", "manufacturer": device.device_type.manufacturer.name, "model": device.device_type.model, "part_number": device.device_type.part_number, "class": re.sub(r"[^a-zA-Z0-9_]", "_", name), } print(name, address) open(appdir, "w").write(json.dumps(data, indent=2)) if __name__ == "__main__": main()