"""Install desktop entries.""" import ipaddress import os import pathlib import json 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/home-manager/hostapps.json").expanduser().resolve() data = {} cisco = nb.dcim.manufacturers.get(name="Cisco") network = nb.dcim.device_roles.get(name="Network") for device in nb.dcim.devices.filter( manufacturer_id=cisco.id, role_id=network.id, status="active", has_primary_ip="true", ): if device.virtual_chassis is not None: name = device.virtual_chassis.name else: name = device.name 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": str( ipaddress.ip_interface(device.primary_ip.address).ip ), "port": port, "username": "jcollie", } print(name, str(ipaddress.ip_interface(device.primary_ip.address).ip)) schneider = nb.dcim.manufacturers.get(name="Schneider") power_protection = nb.dcim.device_roles.get(name="Power Protection") power_distribution = nb.dcim.device_roles.get(name="Power Distribution") for device in nb.dcim.devices.filter( manufacturer_id=schneider.id, role_id=[power_protection.id, power_distribution.id], status="active", has_primary_ip="true", ): name = device.name 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": str( ipaddress.ip_interface(device.primary_ip.address).ip ), "port": port, "username": "apc", } print(name, str(ipaddress.ip_interface(device.primary_ip.address).ip)) open(appdir, "w").write(json.dumps(data, indent=2)) if __name__ == "__main__": main()