hostapps/hostapps/update.py

97 lines
3.4 KiB
Python
Raw Normal View History

2022-05-28 14:14:08 -05:00
"""Install desktop entries."""
import ipaddress
2023-10-18 20:26:59 -05:00
import json
2022-05-28 14:14:08 -05:00
import os
import pathlib
2023-12-07 19:47:17 -06:00
import re
2022-05-28 14:14:08 -05:00
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,
)
2022-07-21 17:38:19 -05:00
appdir = pathlib.Path("~/dev/home-manager/hostapps.json").expanduser().resolve()
2022-05-28 14:14:08 -05:00
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",
2023-10-18 20:31:33 -05:00
has_primary_ip="true",
2022-05-28 14:14:08 -05:00
):
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(
2023-10-18 20:26:59 -05:00
ipaddress.ip_interface(device.primary_ip4.address).ip
2022-05-28 14:14:08 -05:00
),
"port": port,
"username": "jcollie",
2023-10-30 22:26:24 -05:00
"manufacturer": device.device_type.manufacturer.name,
"model": device.device_type.model,
"part_number": device.device_type.part_number,
2023-12-07 19:47:17 -06:00
"class": re.sub(r"[^a-zA-Z0-9_]", "_", name),
2022-05-28 14:14:08 -05:00
}
2023-10-18 20:26:59 -05:00
print(name, str(ipaddress.ip_interface(device.primary_ip4.address).ip))
2022-05-28 14:14:08 -05:00
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")
2022-05-28 14:14:08 -05:00
for device in nb.dcim.devices.filter(
manufacturer_id=schneider.id,
role_id=[power_protection.id, power_distribution.id],
2022-05-28 14:14:08 -05:00
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(
2023-10-18 20:26:59 -05:00
ipaddress.ip_interface(device.primary_ip4.address).ip
2022-05-28 14:14:08 -05:00
),
"port": port,
"username": "apc",
2023-10-30 22:26:24 -05:00
"manufacturer": device.device_type.manufacturer.name,
"model": device.device_type.model,
"part_number": device.device_type.part_number,
2023-12-07 19:47:17 -06:00
"class": re.sub(r"[^a-zA-Z0-9_]", "_", name),
2022-05-28 14:14:08 -05:00
}
2023-10-18 20:26:59 -05:00
print(name, str(ipaddress.ip_interface(device.primary_ip4.address).ip))
2022-05-28 14:14:08 -05:00
open(appdir, "w").write(json.dumps(data, indent=2))
if __name__ == "__main__":
main()