aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ansible/netbox/pyproject.toml10
-rw-r--r--ansible/netbox/sync-unifi.py88
2 files changed, 98 insertions, 0 deletions
diff --git a/ansible/netbox/pyproject.toml b/ansible/netbox/pyproject.toml
new file mode 100644
index 0000000..84c0d6d
--- /dev/null
+++ b/ansible/netbox/pyproject.toml
@@ -0,0 +1,10 @@
+[project]
+name = "netbox"
+version = "0.1.0"
+description = "Add your description here"
+readme = "README.md"
+requires-python = ">=3.12"
+dependencies = [
+ "unifi-controller-api",
+ "pynetbox",
+]
diff --git a/ansible/netbox/sync-unifi.py b/ansible/netbox/sync-unifi.py
new file mode 100644
index 0000000..620e48d
--- /dev/null
+++ b/ansible/netbox/sync-unifi.py
@@ -0,0 +1,88 @@
+import os
+import sys
+from unifi_controller_api import UnifiController
+from unifi_controller_api.exceptions import UnifiAuthenticationError, UnifiAPIError
+
+class Db():
+ def __init__(self):
+ self.devices = []
+ self.interfaces = []
+ self.ips = []
+
+def controller_login() -> UnifiController:
+# try:
+ controller = UnifiController(
+ controller_url=os.getenv("UNIFI_URL"),
+ username=os.getenv("UNIFI_USERNAME"),
+ password=os.getenv("UNIFI_PASSWORD"),
+ is_udm_pro=False,
+ verify_ssl=True,
+ )
+
+ # Just to check that there is a valid authentication
+ controller.get_unifi_site(include_health=False, raw=False)
+
+ return controller
+# except UnifiAuthenticationError:
+# print("Authentication failed - please check your UniFi Controller credentials and URL.")
+# except UnifiAPIError as e:
+# print(f"UniFi API error: {e}")
+# except Exception as e:
+# print(f"An unexpected error occurred: {e}")
+
+site_name=os.getenv("UNIFI_SITE")
+vrf=os.getenv("VRF")
+
+def collect_devices(controller: UnifiController) -> Db:
+ db = Db()
+
+ devices = []
+
+ try:
+ devices = controller.get_unifi_site_device(site_name=site_name, detailed=True, raw=False)
+ except UnifiAPIError as e:
+ print(f"Error fetching device information: {e}")
+ except Exception as e:
+ print(f"An unexpected error occurred: {e}")
+
+ devices = sorted(devices, key=lambda d: d.name)
+ for d in devices:
+ print(f"{d.name}", file=sys.stderr)
+ print(f"{d}", file=sys.stderr)
+ db.devices.append({
+ "name": d.name,
+ "mac": d.mac,
+ "serial": d.serial,
+ })
+ db.ips.append({
+ "address": d.ip,
+ "status": "active",
+ "vrf": vrf,
+ "device": d.name,
+ "interface": "",
+ "is_primary": "true",
+ })
+# db.interfaces.append({
+# })
+
+ return db
+
+def print_db(db: Db):
+ def p(xs):
+ for x in xs:
+ print(f"---")
+ for k, v in x.items():
+ print(f"{k}: {v}")
+
+ p(sorted(db.devices, key=lambda d: d["name"]))
+ p(sorted(db.interfaces, key=lambda d: d["address"]))
+ p(sorted(db.ips, key=lambda d: d["address"]))
+
+
+def main():
+ controller = controller_login()
+ db = collect_devices(controller)
+ print_db(db)
+
+if __name__ == "__main__":
+ main()