unifi-network-maps 1.2.1__py3-none-any.whl → 1.3.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. unifi_network_maps/__init__.py +1 -0
  2. unifi_network_maps/adapters/__init__.py +1 -0
  3. {unifi_mermaid → unifi_network_maps/adapters}/config.py +7 -1
  4. {unifi_mermaid → unifi_network_maps/adapters}/unifi.py +1 -1
  5. unifi_network_maps/assets/themes/dark.yaml +47 -0
  6. unifi_network_maps/assets/themes/default.yaml +47 -0
  7. unifi_network_maps/cli/__init__.py +41 -0
  8. unifi_network_maps/cli/__main__.py +8 -0
  9. unifi_network_maps/cli/main.py +281 -0
  10. unifi_network_maps/io/__init__.py +1 -0
  11. {unifi_mermaid → unifi_network_maps/io}/debug.py +1 -1
  12. unifi_network_maps/model/__init__.py +1 -0
  13. unifi_network_maps/model/labels.py +35 -0
  14. {unifi_mermaid → unifi_network_maps/model}/lldp.py +19 -33
  15. unifi_network_maps/model/ports.py +23 -0
  16. {unifi_mermaid → unifi_network_maps/model}/topology.py +216 -89
  17. unifi_network_maps/render/__init__.py +1 -0
  18. {unifi_mermaid → unifi_network_maps/render}/mermaid.py +21 -16
  19. unifi_network_maps/render/mermaid_theme.py +46 -0
  20. {unifi_mermaid → unifi_network_maps/render}/svg.py +208 -175
  21. unifi_network_maps/render/svg_theme.py +64 -0
  22. unifi_network_maps/render/theme.py +90 -0
  23. {unifi_network_maps-1.2.1.dist-info → unifi_network_maps-1.3.0.dist-info}/METADATA +63 -8
  24. unifi_network_maps-1.3.0.dist-info/RECORD +75 -0
  25. unifi_network_maps-1.3.0.dist-info/entry_points.txt +2 -0
  26. unifi_network_maps-1.3.0.dist-info/licenses/LICENSES.md +10 -0
  27. unifi_network_maps-1.3.0.dist-info/top_level.txt +1 -0
  28. unifi_mermaid/__init__.py +0 -1
  29. unifi_mermaid/cli.py +0 -197
  30. unifi_mermaid/labels.py +0 -15
  31. unifi_network_maps-1.2.1.dist-info/RECORD +0 -63
  32. unifi_network_maps-1.2.1.dist-info/entry_points.txt +0 -2
  33. unifi_network_maps-1.2.1.dist-info/licenses/LICENSES.md +0 -10
  34. unifi_network_maps-1.2.1.dist-info/top_level.txt +0 -1
  35. {unifi_mermaid → unifi_network_maps}/assets/__init__.py +0 -0
  36. {unifi_mermaid → unifi_network_maps}/assets/icons/__init__.py +0 -0
  37. {unifi_mermaid → unifi_network_maps}/assets/icons/access-point.svg +0 -0
  38. {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/ISOPACKS_LICENSE +0 -0
  39. {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/block.svg +0 -0
  40. {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/cache.svg +0 -0
  41. {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/cardterminal.svg +0 -0
  42. {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/cloud.svg +0 -0
  43. {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/cronjob.svg +0 -0
  44. {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/cube.svg +0 -0
  45. {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/desktop.svg +0 -0
  46. {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/diamond.svg +0 -0
  47. {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/dns.svg +0 -0
  48. {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/document.svg +0 -0
  49. {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/firewall.svg +0 -0
  50. {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/function-module.svg +0 -0
  51. {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/image.svg +0 -0
  52. {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/laptop.svg +0 -0
  53. {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/loadbalancer.svg +0 -0
  54. {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/lock.svg +0 -0
  55. {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/mail.svg +0 -0
  56. {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/mailmultiple.svg +0 -0
  57. {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/mobiledevice.svg +0 -0
  58. {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/office.svg +0 -0
  59. {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/package-module.svg +0 -0
  60. {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/paymentcard.svg +0 -0
  61. {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/plane.svg +0 -0
  62. {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/printer.svg +0 -0
  63. {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/pyramid.svg +0 -0
  64. {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/queue.svg +0 -0
  65. {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/router.svg +0 -0
  66. {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/server.svg +0 -0
  67. {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/speech.svg +0 -0
  68. {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/sphere.svg +0 -0
  69. {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/storage.svg +0 -0
  70. {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/switch-module.svg +0 -0
  71. {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/tower.svg +0 -0
  72. {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/truck-2.svg +0 -0
  73. {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/truck.svg +0 -0
  74. {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/user.svg +0 -0
  75. {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/vm.svg +0 -0
  76. {unifi_mermaid → unifi_network_maps}/assets/icons/laptop.svg +0 -0
  77. {unifi_mermaid → unifi_network_maps}/assets/icons/router-network.svg +0 -0
  78. {unifi_mermaid → unifi_network_maps}/assets/icons/server-network.svg +0 -0
  79. {unifi_mermaid → unifi_network_maps}/assets/icons/server.svg +0 -0
  80. {unifi_mermaid → unifi_network_maps/io}/export.py +0 -0
  81. {unifi_network_maps-1.2.1.dist-info → unifi_network_maps-1.3.0.dist-info}/WHEEL +0 -0
  82. {unifi_network_maps-1.2.1.dist-info → unifi_network_maps-1.3.0.dist-info}/licenses/LICENSE +0 -0
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: unifi-network-maps
3
- Version: 1.2.1
4
- Summary: Dynamic UniFi -> Mermaid network maps
3
+ Version: 1.3.0
4
+ Summary: Dynamic UniFi -> network maps in mermaid or svg
5
5
  Author: Merlijn
6
6
  License: MIT
7
7
  Project-URL: Homepage, https://github.com/merlijntishauser/unifi-network-maps
@@ -26,6 +26,7 @@ License-File: LICENSE
26
26
  License-File: LICENSES.md
27
27
  Requires-Dist: unifi-controller-api
28
28
  Requires-Dist: python-dotenv
29
+ Requires-Dist: PyYAML
29
30
  Provides-Extra: dev
30
31
  Requires-Dist: pre-commit; extra == "dev"
31
32
  Requires-Dist: pytest; extra == "dev"
@@ -66,6 +67,12 @@ export UNIFI_PASS=********
66
67
  export UNIFI_VERIFY_SSL=false
67
68
  ```
68
69
 
70
+ Use a custom env file:
71
+
72
+ ```bash
73
+ unifi-network-maps --env-file ./site.env --stdout
74
+ ```
75
+
69
76
  ## Usage
70
77
 
71
78
  Basic map (tree layout by LLDP hops):
@@ -137,24 +144,72 @@ See `LICENSES.md` for third-party license info.
137
144
 
138
145
  ## Options
139
146
 
140
- - `--format mermaid|svg|svg-iso`: output format (default mermaid).
147
+ The CLI groups options by category (`Source`, `Functional`, `Mermaid`, `SVG`, `Output`, `Debug`).
148
+
149
+ Source:
150
+ - `--site`: override `UNIFI_SITE`.
151
+ - `--env-file`: load environment variables from a specific `.env` file.
152
+
153
+ Functional:
141
154
  - `--include-ports`: show port labels (Mermaid shows both ends; SVG shows compact labels).
155
+ - `--include-clients`: add active wired clients as leaf nodes.
142
156
  - `--only-unifi`: only include neighbors that are UniFi devices.
157
+
158
+ Mermaid:
143
159
  - `--direction LR|TB`: diagram direction for Mermaid (default TB).
144
- - `--stdout`: write output to stdout.
145
- - `--markdown`: wrap Mermaid output in a code fence.
146
160
  - `--group-by-type`: group nodes by gateway/switch/AP in Mermaid subgraphs.
147
- - `--include-clients`: add active wired clients as leaf nodes.
148
161
  - `--legend-only`: render just the legend as a separate Mermaid graph (Mermaid only).
162
+
163
+ SVG:
164
+ - `--svg-width/--svg-height`: override SVG output dimensions.
165
+ - `--theme-file`: load a YAML theme for Mermaid + SVG colors (see `examples/theme.yaml` and `examples/theme-dark.yaml`).
166
+
167
+ Output:
168
+ - `--format mermaid|svg|svg-iso`: output format (default mermaid).
169
+ - `--stdout`: write output to stdout.
170
+ - `--markdown`: wrap Mermaid output in a code fence.
171
+
172
+ Debug:
149
173
  - `--debug-dump`: dump gateway + sample devices to stderr for debugging.
150
174
  - `--debug-sample N`: number of non-gateway devices in debug dump (default 2).
151
- - `--svg-width/--svg-height`: override SVG output dimensions.
152
175
 
153
176
  ## Notes
154
177
 
155
178
  - Default output is top-to-bottom (TB) and rendered as a hop-based tree from the gateway(s).
156
179
  - Nodes are color-coded by type (gateway/switch/AP/client) with a sensible default palette.
157
180
  - PoE links are highlighted in blue and annotated with a power icon when detected from `port_table`.
158
- - SVG output uses vendored device glyphs from `src/unifi_mermaid/assets/icons`.
181
+ - SVG output uses vendored device glyphs from `src/unifi_network_maps/assets/icons`.
159
182
  - Isometric SVG output uses MIT-licensed icons from `markmanx/isopacks`.
160
183
  - SVG port labels render inside child nodes for readability.
184
+
185
+ ## AI Disclosure
186
+
187
+ This project used OpenAI Codex as a coding assistant for portions of the implementation and documentation.
188
+
189
+ ## Theme file
190
+
191
+ Example theme YAML (override only the values you want):
192
+
193
+ ```yaml
194
+ mermaid:
195
+ nodes:
196
+ gateway:
197
+ fill: "#ffe3b3"
198
+ stroke: "#d98300"
199
+ poe_link: "#1e88e5"
200
+ svg:
201
+ links:
202
+ standard:
203
+ from: "#2ecc71"
204
+ to: "#1b8f4a"
205
+ poe:
206
+ from: "#1e88e5"
207
+ to: "#0d47a1"
208
+ nodes:
209
+ switch:
210
+ from: "#d6ecff"
211
+ to: "#b6dcff"
212
+ ```
213
+
214
+ The built-in themes live at `src/unifi_network_maps/assets/themes/default.yaml` and
215
+ `src/unifi_network_maps/assets/themes/dark.yaml`.
@@ -0,0 +1,75 @@
1
+ unifi_network_maps/__init__.py,sha256=F5mW07pSyGrqDNY2Ehr-UpDzpBtN-FsYU0QGZWf6PJE,22
2
+ unifi_network_maps/adapters/__init__.py,sha256=nzx1KsiYalL_YuXKE6acW8Dj5flmMg0-i4gyYO0gV54,22
3
+ unifi_network_maps/adapters/config.py,sha256=Bx9JDZxxY7Gjxyb8FDT0dxiKfgXt_TmzTDbgvpwB53s,1548
4
+ unifi_network_maps/adapters/unifi.py,sha256=DH-rI66eCfUbM7AFaRhrU-dkuO1Z83aezMorcXzF5eM,4344
5
+ unifi_network_maps/assets/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
+ unifi_network_maps/assets/icons/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
+ unifi_network_maps/assets/icons/access-point.svg,sha256=RJOgO2s9Ino5lWRrh4V7q8Jdwffros5bQq3UeDuQYF4,742
8
+ unifi_network_maps/assets/icons/laptop.svg,sha256=HL-RN12Lo1iv8zcTy9tLkI80uRPtXkfrjUlndcKCQpk,204
9
+ unifi_network_maps/assets/icons/router-network.svg,sha256=0myOeJVDaL0IK9GVkhx0hOMypYo_7Ffa7KoQ6k7dTNc,380
10
+ unifi_network_maps/assets/icons/server-network.svg,sha256=2PsXXTg__kcscFMV6p_9IJid9FXOGYVeQBhkcrqJF3Y,407
11
+ unifi_network_maps/assets/icons/server.svg,sha256=dAnRkLXXSlErqm3iIUYmT1QMNl2aHT4Q9DHZGyzWUHA,408
12
+ unifi_network_maps/assets/icons/isometric/ISOPACKS_LICENSE,sha256=FmJz5tMnuATt1il4JQg_FXeoIMP9IBPL7eUudavjtMU,1062
13
+ unifi_network_maps/assets/icons/isometric/block.svg,sha256=eamjXpQ7fk9WTMyJM3gB27JLIGXQaqHeEfYDtqzBD1U,1364
14
+ unifi_network_maps/assets/icons/isometric/cache.svg,sha256=V61hZz2UINczLXN1IICmVeR0vP5brsKGxaSyu1NIDeE,2493
15
+ unifi_network_maps/assets/icons/isometric/cardterminal.svg,sha256=K0cW4ItqB_7m5SihxEhzJNTQsb_kOElCNUnJ2SNiPik,17597
16
+ unifi_network_maps/assets/icons/isometric/cloud.svg,sha256=etKa3fntaEAroKq7ehsJPFgmGAhhzzawWIApFKFyFsc,6484
17
+ unifi_network_maps/assets/icons/isometric/cronjob.svg,sha256=vxlJiKBoWQQt_3WdPmvlKaAg05pZ2kX9aGqJPqa6GFw,24495
18
+ unifi_network_maps/assets/icons/isometric/cube.svg,sha256=6IL4Kdrc3MJHO1iZK5drfFOxU_U-Osdmv71_j8S0ajE,1421
19
+ unifi_network_maps/assets/icons/isometric/desktop.svg,sha256=TewxdgvFk-ZPk2OWfHPbZIxQPxkeUvfU6FTkofoCZjo,6428
20
+ unifi_network_maps/assets/icons/isometric/diamond.svg,sha256=zr6jPC4bW2m5itfdhz_0vFslxGCVHlR4-zbi9SG-gdE,1269
21
+ unifi_network_maps/assets/icons/isometric/dns.svg,sha256=oh2uxWlcp_yFvqHDf4cXm_VCQH4otDVXie43Sp5vKRI,3878
22
+ unifi_network_maps/assets/icons/isometric/document.svg,sha256=uj_ViyDC1VFzY2yvBvzD_nMnxymVtQVzKOvLzf-DcNo,4410
23
+ unifi_network_maps/assets/icons/isometric/firewall.svg,sha256=_reSBteNzuzV3FDVwAxBo_AbtcUp39UjsBtBaIN00y4,17636
24
+ unifi_network_maps/assets/icons/isometric/function-module.svg,sha256=WnXLuocOv9z_fjm_f-CCmhcEzrJzsz25GnFZMfL8V-Y,13386
25
+ unifi_network_maps/assets/icons/isometric/image.svg,sha256=li58qSs7c3Vpi1ObrZI-6AEx-Nl76-XoiFyKsPe90L4,4819
26
+ unifi_network_maps/assets/icons/isometric/laptop.svg,sha256=4hcO8iylzYvsKBn3ZnkQUMVNAplpqgcjZCrtfATWAvE,2651
27
+ unifi_network_maps/assets/icons/isometric/loadbalancer.svg,sha256=nYCZMNhtRg2UZBXc6xpVx95WCX3JB1QmmPHXMyLQyw0,3570
28
+ unifi_network_maps/assets/icons/isometric/lock.svg,sha256=zRKGImGeFTOxpp3RnjfE9xfljSfX6-1dg2Kfydu4TTA,13438
29
+ unifi_network_maps/assets/icons/isometric/mail.svg,sha256=x87SMbMx6O1Z8AJJ5MX1f_GDNIPK6iB0YfTmDCFB33Q,2556
30
+ unifi_network_maps/assets/icons/isometric/mailmultiple.svg,sha256=enSXrlm6yRsBDuWMAE-PpKFRNF2GnVj2plR53FsKkFI,6612
31
+ unifi_network_maps/assets/icons/isometric/mobiledevice.svg,sha256=QWa8iyoVomwN9s0AdBPIoxbN2KaNKWbTfRFk_21Ycuo,6042
32
+ unifi_network_maps/assets/icons/isometric/office.svg,sha256=0Uo-uH931RLW3VXgL8fzhHa9-ScmpWghcIpFdKJ_hWc,8444
33
+ unifi_network_maps/assets/icons/isometric/package-module.svg,sha256=nlC_IX-toVU9d2I6DSJ4mI9nrlvi_-KBkxCVWG0HvWQ,2036
34
+ unifi_network_maps/assets/icons/isometric/paymentcard.svg,sha256=qvzkYH8dEmyWEbHKg8xo-CbwNHSskQuV5FVbYz2Lalk,6026
35
+ unifi_network_maps/assets/icons/isometric/plane.svg,sha256=sZbJKpD22pMV0DBeMbtBDAXEx8J4V9DvXUKOrnif788,13712
36
+ unifi_network_maps/assets/icons/isometric/printer.svg,sha256=qMM-SawojVCp_NLMDuXWOxWHJHuHjl8JjYojU6ZnHoc,10348
37
+ unifi_network_maps/assets/icons/isometric/pyramid.svg,sha256=UeGfxq7XqKGLCxg-h8iS8E-HnDievrI4rngRM2O5KZg,2000
38
+ unifi_network_maps/assets/icons/isometric/queue.svg,sha256=MiFWbzikrEejXu_NDQEyRVa9a37xvykWV0V92NxVk4I,2595
39
+ unifi_network_maps/assets/icons/isometric/router.svg,sha256=Ah_nQpBsL0Me3tFK4yMZIvykC9rmqEuMxMfDTzpHG50,3192
40
+ unifi_network_maps/assets/icons/isometric/server.svg,sha256=aU7K7jOqS3GFkqoG7IxICoyq9PLWt8wShwr5KmU8P4c,7067
41
+ unifi_network_maps/assets/icons/isometric/speech.svg,sha256=gAVe0k3eMwIuAxv1Dq-IhDgzY51i5WlCidG_4GKk5Ig,5663
42
+ unifi_network_maps/assets/icons/isometric/sphere.svg,sha256=TQqAIwvuW2bXalk9ik0I1Iej1dXG4mmPWq59q_tVaYA,1340
43
+ unifi_network_maps/assets/icons/isometric/storage.svg,sha256=9UvfV_K9BmuwiBhKgpeLeS8D63sTKo-htAlJ5m18kQU,8212
44
+ unifi_network_maps/assets/icons/isometric/switch-module.svg,sha256=_M3gqVvZpCZJ8KnP7hV1WBQVST5iBHHRy45ynFnnErQ,3738
45
+ unifi_network_maps/assets/icons/isometric/tower.svg,sha256=9vj6QOoditHqPOXm3wqwuy6AAuYOty23HU6JtoFAC9w,4356
46
+ unifi_network_maps/assets/icons/isometric/truck-2.svg,sha256=I7MFGbXW2fmr9WdD29NSgYk0Suu3TWFojhuNt4pJDS0,8328
47
+ unifi_network_maps/assets/icons/isometric/truck.svg,sha256=BrpBr9Qf8hplQIrBpfhN2USxUlPvGCKahlV5e-G13r0,7195
48
+ unifi_network_maps/assets/icons/isometric/user.svg,sha256=bYpr0t8rETJ1M7RDTWaNkK-nfF3kq9eMxmxYCthNmE0,23026
49
+ unifi_network_maps/assets/icons/isometric/vm.svg,sha256=in6x9cdS6JgQVJl0KAbA79rap4X140dfIBCuxmgQI7s,3694
50
+ unifi_network_maps/assets/themes/dark.yaml,sha256=F86A25kd0VSCCpN4jcMZxPWWtqNC5ftJHUEvUvESTQQ,849
51
+ unifi_network_maps/assets/themes/default.yaml,sha256=F2Jj18NmdaJ_zyERvGAn8NEWBwapjtozrtZUxayd5AU,849
52
+ unifi_network_maps/cli/__init__.py,sha256=2FdmLMpYFh_7P0ew2LnieLANf6ni43Ht9FKzYUDiNis,770
53
+ unifi_network_maps/cli/__main__.py,sha256=nK_jh78VW3h3DRvSpjzpcf64zkCqniP2k82xUR9Hw2I,147
54
+ unifi_network_maps/cli/main.py,sha256=yxUCD1BRRBXITp2_0vuClyDrQhNiusnXKzaOu5PwUhw,8972
55
+ unifi_network_maps/io/__init__.py,sha256=nzx1KsiYalL_YuXKE6acW8Dj5flmMg0-i4gyYO0gV54,22
56
+ unifi_network_maps/io/debug.py,sha256=wTSGMARfVh_U2R5vD-n9DjwQHdhMpypmVvoXRUdy68k,1461
57
+ unifi_network_maps/io/export.py,sha256=v3x6mSXmbO3dWtNQv4nGNGVqMCIE0mvTBGTKsNJBg6o,352
58
+ unifi_network_maps/model/__init__.py,sha256=nzx1KsiYalL_YuXKE6acW8Dj5flmMg0-i4gyYO0gV54,22
59
+ unifi_network_maps/model/labels.py,sha256=m_k8mbzWtOSDOjjHhLUqwIw93pg98HAtGtHkiERXmek,1135
60
+ unifi_network_maps/model/lldp.py,sha256=H_HMia0aYolK-gYx61Td873IbFXmrQw3_qOvpzBfVog,2707
61
+ unifi_network_maps/model/ports.py,sha256=o3NBlXcC5VV5iPWJsO4Ll1mRKJZC0f8zTHdlkkE34GU,609
62
+ unifi_network_maps/model/topology.py,sha256=DD9rgUzK6Z-ikGcozS_j2sC0wbRj-XggSflwQjRxgrk,21564
63
+ unifi_network_maps/render/__init__.py,sha256=nzx1KsiYalL_YuXKE6acW8Dj5flmMg0-i4gyYO0gV54,22
64
+ unifi_network_maps/render/mermaid.py,sha256=jAG_Uy5hbxqbGaPI38mBr8otih_Ft8bWpTu249kSaOw,5336
65
+ unifi_network_maps/render/mermaid_theme.py,sha256=QReSBFoYSIz7vgAwyHx-9f4ucbSgMTGvo1Ffa2ZfzDQ,1527
66
+ unifi_network_maps/render/svg.py,sha256=sHtu0CVYsl48RMngomMm5BElIm35hWo2LOg404YSQgU,32548
67
+ unifi_network_maps/render/svg_theme.py,sha256=Si1ArM3v_-wAvHZyLFPiOZ0ohQRd6ezIckwC3_b-WIw,2684
68
+ unifi_network_maps/render/theme.py,sha256=-cPvj9dfmOpBD3Ohpye_yTBWxXtsE0-g73mekqoh5kA,3606
69
+ unifi_network_maps-1.3.0.dist-info/licenses/LICENSE,sha256=mYo1siIIfIwyfdOuK2-Zt0ij2xBTii2hnpeTu79nD80,1074
70
+ unifi_network_maps-1.3.0.dist-info/licenses/LICENSES.md,sha256=C-x0ys_T0o9rMO-GjI8Jn9tGa3ujUfvRrU5KjFXwnLs,254
71
+ unifi_network_maps-1.3.0.dist-info/METADATA,sha256=Bh_n_rXLfzQsgwV1aP_EijC71onQQGabH6LkeQj5Izo,5483
72
+ unifi_network_maps-1.3.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
73
+ unifi_network_maps-1.3.0.dist-info/entry_points.txt,sha256=cdJ7jsBgNgHxSflYUOqgz5BbvuM0Nnh-x8_Hbyh_LFg,67
74
+ unifi_network_maps-1.3.0.dist-info/top_level.txt,sha256=G0rUX1PNfVCn1u-KtB6QjFQHopCOVLnPMczvPOoraHg,19
75
+ unifi_network_maps-1.3.0.dist-info/RECORD,,
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ unifi-network-maps = unifi_network_maps.cli:main
@@ -0,0 +1,10 @@
1
+ # Third-Party Licenses
2
+
3
+ ## markmanx/isopacks (MIT)
4
+
5
+ Isometric SVG icons are vendored under `src/unifi_network_maps/assets/icons/isometric/`.
6
+ The upstream MIT license is included at:
7
+
8
+ ```
9
+ src/unifi_network_maps/assets/icons/isometric/ISOPACKS_LICENSE
10
+ ```
@@ -0,0 +1 @@
1
+ unifi_network_maps
unifi_mermaid/__init__.py DELETED
@@ -1 +0,0 @@
1
- __version__ = "1.2.2"
unifi_mermaid/cli.py DELETED
@@ -1,197 +0,0 @@
1
- """CLI entry point."""
2
-
3
- from __future__ import annotations
4
-
5
- import argparse
6
- import logging
7
-
8
- from .config import Config
9
- from .debug import debug_dump_devices
10
- from .export import write_output
11
- from .mermaid import render_legend, render_mermaid
12
- from .svg import SvgOptions, render_svg
13
- from .topology import (
14
- build_client_edges,
15
- build_device_index,
16
- build_node_type_map,
17
- build_topology,
18
- group_devices_by_type,
19
- normalize_devices,
20
- )
21
- from .unifi import fetch_clients, fetch_devices
22
-
23
- logger = logging.getLogger(__name__)
24
-
25
-
26
- def _load_dotenv() -> None:
27
- try:
28
- from dotenv import load_dotenv
29
- except ImportError:
30
- logger.info("python-dotenv not installed; skipping .env loading")
31
- return
32
- load_dotenv()
33
-
34
-
35
- def _build_parser() -> argparse.ArgumentParser:
36
- parser = argparse.ArgumentParser(
37
- description="Generate Mermaid network maps from UniFi LLDP data"
38
- )
39
- parser.add_argument("--site", default=None, help="UniFi site name (overrides UNIFI_SITE)")
40
- parser.add_argument(
41
- "--format",
42
- default="mermaid",
43
- choices=["mermaid", "svg", "svg-iso"],
44
- help="Output format",
45
- )
46
- parser.add_argument(
47
- "--markdown",
48
- action="store_true",
49
- help="Wrap output in a Markdown mermaid code fence for notes tools like Obsidian",
50
- )
51
- parser.add_argument("--output", default=None, help="Output file path")
52
- parser.add_argument("--include-ports", action="store_true", help="Include port labels in edges")
53
- parser.add_argument(
54
- "--only-unifi", action="store_true", help="Only include neighbors that are UniFi devices"
55
- )
56
- parser.add_argument("--direction", default="TB", choices=["LR", "TB"], help="Mermaid direction")
57
- parser.add_argument(
58
- "--group-by-type",
59
- action="store_true",
60
- help="Group nodes by gateway/switch/ap in Mermaid subgraphs",
61
- )
62
- parser.add_argument(
63
- "--legend-only",
64
- action="store_true",
65
- help="Render only the legend as a separate Mermaid graph",
66
- )
67
- parser.add_argument(
68
- "--include-clients",
69
- action="store_true",
70
- help="Include active clients as leaf nodes",
71
- )
72
- parser.add_argument("--stdout", action="store_true", help="Write output to stdout")
73
- parser.add_argument(
74
- "--debug-dump",
75
- action="store_true",
76
- help="Dump gateway and sample device data to stderr for debugging",
77
- )
78
- parser.add_argument(
79
- "--debug-sample",
80
- type=int,
81
- default=2,
82
- help="Number of non-gateway devices to include in debug dump (default: 2)",
83
- )
84
- parser.add_argument("--svg-width", type=int, default=None, help="SVG width override")
85
- parser.add_argument("--svg-height", type=int, default=None, help="SVG height override")
86
- return parser
87
-
88
-
89
- def main(argv: list[str] | None = None) -> int:
90
- logging.basicConfig(level=logging.INFO, format="%(levelname)s %(name)s: %(message)s")
91
- parser = _build_parser()
92
- args = parser.parse_args(argv)
93
-
94
- try:
95
- _load_dotenv()
96
- config = Config.from_env()
97
- except ValueError as exc:
98
- logging.error(str(exc))
99
- return 2
100
-
101
- site = args.site or config.site
102
-
103
- if args.legend_only:
104
- content = render_legend()
105
- if args.markdown:
106
- content = f"""```mermaid
107
- {content}```
108
- """
109
- write_output(content, output_path=args.output, stdout=args.stdout)
110
- return 0
111
-
112
- try:
113
- raw_devices = list(fetch_devices(config, site=site, detailed=True))
114
- devices = normalize_devices(raw_devices)
115
- if args.debug_dump:
116
- debug_dump_devices(raw_devices, devices, sample_count=max(0, args.debug_sample))
117
- groups_for_rank = group_devices_by_type(devices)
118
- gateways = groups_for_rank.get("gateway", [])
119
- topology = build_topology(
120
- devices,
121
- include_ports=args.include_ports,
122
- only_unifi=args.only_unifi,
123
- gateways=gateways,
124
- )
125
- except Exception as exc:
126
- logging.error("Failed to build topology: %s", exc)
127
- return 1
128
-
129
- if args.format == "mermaid":
130
- groups = None
131
- group_order = None
132
- direction = args.direction
133
- if topology.tree_edges:
134
- edges = topology.tree_edges
135
- else:
136
- edges = topology.raw_edges
137
- logging.warning("No gateway found for hierarchy; rendering raw edges.")
138
- clients = None
139
- if args.include_clients:
140
- clients = list(fetch_clients(config, site=site))
141
- device_index = build_device_index(devices)
142
- edges = edges + build_client_edges(
143
- clients, device_index, include_ports=args.include_ports
144
- )
145
- if args.group_by_type:
146
- groups = groups_for_rank
147
- group_order = ["gateway", "switch", "ap", "other"]
148
- content = render_mermaid(
149
- edges,
150
- direction=direction,
151
- groups=groups,
152
- group_order=group_order,
153
- node_types=build_node_type_map(devices, clients),
154
- )
155
- elif args.format in {"svg", "svg-iso"}:
156
- if topology.tree_edges:
157
- edges = topology.tree_edges
158
- else:
159
- edges = topology.raw_edges
160
- logging.warning("No gateway found for hierarchy; rendering raw edges.")
161
- clients = None
162
- if args.include_clients:
163
- clients = list(fetch_clients(config, site=site))
164
- device_index = build_device_index(devices)
165
- edges = edges + build_client_edges(
166
- clients, device_index, include_ports=args.include_ports
167
- )
168
- options = SvgOptions(width=args.svg_width, height=args.svg_height)
169
- if args.format == "svg-iso":
170
- from .svg import render_svg_isometric
171
-
172
- content = render_svg_isometric(
173
- edges,
174
- node_types=build_node_type_map(devices, clients),
175
- options=options,
176
- )
177
- else:
178
- content = render_svg(
179
- edges,
180
- node_types=build_node_type_map(devices, clients),
181
- options=options,
182
- )
183
- else:
184
- logging.error("Unsupported format: %s", args.format)
185
- return 2
186
-
187
- if args.markdown and args.format == "mermaid":
188
- content = f"""```mermaid
189
- {content}```
190
- """
191
-
192
- write_output(content, output_path=args.output, stdout=args.stdout)
193
- return 0
194
-
195
-
196
- if __name__ == "__main__":
197
- raise SystemExit(main())
unifi_mermaid/labels.py DELETED
@@ -1,15 +0,0 @@
1
- """Edge label helpers."""
2
-
3
- from __future__ import annotations
4
-
5
-
6
- def compose_port_label(left: str, right: str, port_map: dict[tuple[str, str], str]) -> str | None:
7
- left_label = port_map.get((left, right))
8
- right_label = port_map.get((right, left))
9
- if left_label and right_label:
10
- return f"{left}: {left_label} <-> {right}: {right_label}"
11
- if left_label:
12
- return f"{left}: {left_label} <-> {right}: ?"
13
- if right_label:
14
- return f"{left}: ? <-> {right}: {right_label}"
15
- return None
@@ -1,63 +0,0 @@
1
- unifi_mermaid/__init__.py,sha256=uuf4VNtTNA93fMhoAur9YafzaKJFnczY-H1SSCSuRVQ,22
2
- unifi_mermaid/cli.py,sha256=huze3hX_jqzZ6C8nhsYid1_42mKmyvd7AdNAdPfDdco,6498
3
- unifi_mermaid/config.py,sha256=w_yxmktKOgBf9C81yTRikGf15QxfvV1af35gGzg_wD4,1269
4
- unifi_mermaid/debug.py,sha256=y_QSINuQpnfDGH_NBvV30KErrQy6ktLKqlnxY3fRuUE,1454
5
- unifi_mermaid/export.py,sha256=v3x6mSXmbO3dWtNQv4nGNGVqMCIE0mvTBGTKsNJBg6o,352
6
- unifi_mermaid/labels.py,sha256=dGe8L8eHjRMRtS6lcxf384A6o7-NWh0-TvvHQCSFgPk,519
7
- unifi_mermaid/lldp.py,sha256=vD-VwUQy1jhMB0msII3ulbMS5jMmGANry6zlzUrcC-g,3017
8
- unifi_mermaid/mermaid.py,sha256=lAYtoefVkprhdTJSZS31byENNXz8pZ4kBCSvG7LxJCE,5714
9
- unifi_mermaid/svg.py,sha256=BtVLGhpdg2TpqiyvxQjM8feUaWVacVCBdvGBRUonESg,33874
10
- unifi_mermaid/topology.py,sha256=mPb-8lyo-dVW2Esmpygz26Yh4Q97MefcVYa0RUG47tM,18209
11
- unifi_mermaid/unifi.py,sha256=_radelIF834kvEnq54x7xkz_138LS-DuMO4cbw94j3I,4339
12
- unifi_mermaid/assets/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
- unifi_mermaid/assets/icons/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
- unifi_mermaid/assets/icons/access-point.svg,sha256=RJOgO2s9Ino5lWRrh4V7q8Jdwffros5bQq3UeDuQYF4,742
15
- unifi_mermaid/assets/icons/laptop.svg,sha256=HL-RN12Lo1iv8zcTy9tLkI80uRPtXkfrjUlndcKCQpk,204
16
- unifi_mermaid/assets/icons/router-network.svg,sha256=0myOeJVDaL0IK9GVkhx0hOMypYo_7Ffa7KoQ6k7dTNc,380
17
- unifi_mermaid/assets/icons/server-network.svg,sha256=2PsXXTg__kcscFMV6p_9IJid9FXOGYVeQBhkcrqJF3Y,407
18
- unifi_mermaid/assets/icons/server.svg,sha256=dAnRkLXXSlErqm3iIUYmT1QMNl2aHT4Q9DHZGyzWUHA,408
19
- unifi_mermaid/assets/icons/isometric/ISOPACKS_LICENSE,sha256=FmJz5tMnuATt1il4JQg_FXeoIMP9IBPL7eUudavjtMU,1062
20
- unifi_mermaid/assets/icons/isometric/block.svg,sha256=eamjXpQ7fk9WTMyJM3gB27JLIGXQaqHeEfYDtqzBD1U,1364
21
- unifi_mermaid/assets/icons/isometric/cache.svg,sha256=V61hZz2UINczLXN1IICmVeR0vP5brsKGxaSyu1NIDeE,2493
22
- unifi_mermaid/assets/icons/isometric/cardterminal.svg,sha256=K0cW4ItqB_7m5SihxEhzJNTQsb_kOElCNUnJ2SNiPik,17597
23
- unifi_mermaid/assets/icons/isometric/cloud.svg,sha256=etKa3fntaEAroKq7ehsJPFgmGAhhzzawWIApFKFyFsc,6484
24
- unifi_mermaid/assets/icons/isometric/cronjob.svg,sha256=vxlJiKBoWQQt_3WdPmvlKaAg05pZ2kX9aGqJPqa6GFw,24495
25
- unifi_mermaid/assets/icons/isometric/cube.svg,sha256=6IL4Kdrc3MJHO1iZK5drfFOxU_U-Osdmv71_j8S0ajE,1421
26
- unifi_mermaid/assets/icons/isometric/desktop.svg,sha256=TewxdgvFk-ZPk2OWfHPbZIxQPxkeUvfU6FTkofoCZjo,6428
27
- unifi_mermaid/assets/icons/isometric/diamond.svg,sha256=zr6jPC4bW2m5itfdhz_0vFslxGCVHlR4-zbi9SG-gdE,1269
28
- unifi_mermaid/assets/icons/isometric/dns.svg,sha256=oh2uxWlcp_yFvqHDf4cXm_VCQH4otDVXie43Sp5vKRI,3878
29
- unifi_mermaid/assets/icons/isometric/document.svg,sha256=uj_ViyDC1VFzY2yvBvzD_nMnxymVtQVzKOvLzf-DcNo,4410
30
- unifi_mermaid/assets/icons/isometric/firewall.svg,sha256=_reSBteNzuzV3FDVwAxBo_AbtcUp39UjsBtBaIN00y4,17636
31
- unifi_mermaid/assets/icons/isometric/function-module.svg,sha256=WnXLuocOv9z_fjm_f-CCmhcEzrJzsz25GnFZMfL8V-Y,13386
32
- unifi_mermaid/assets/icons/isometric/image.svg,sha256=li58qSs7c3Vpi1ObrZI-6AEx-Nl76-XoiFyKsPe90L4,4819
33
- unifi_mermaid/assets/icons/isometric/laptop.svg,sha256=4hcO8iylzYvsKBn3ZnkQUMVNAplpqgcjZCrtfATWAvE,2651
34
- unifi_mermaid/assets/icons/isometric/loadbalancer.svg,sha256=nYCZMNhtRg2UZBXc6xpVx95WCX3JB1QmmPHXMyLQyw0,3570
35
- unifi_mermaid/assets/icons/isometric/lock.svg,sha256=zRKGImGeFTOxpp3RnjfE9xfljSfX6-1dg2Kfydu4TTA,13438
36
- unifi_mermaid/assets/icons/isometric/mail.svg,sha256=x87SMbMx6O1Z8AJJ5MX1f_GDNIPK6iB0YfTmDCFB33Q,2556
37
- unifi_mermaid/assets/icons/isometric/mailmultiple.svg,sha256=enSXrlm6yRsBDuWMAE-PpKFRNF2GnVj2plR53FsKkFI,6612
38
- unifi_mermaid/assets/icons/isometric/mobiledevice.svg,sha256=QWa8iyoVomwN9s0AdBPIoxbN2KaNKWbTfRFk_21Ycuo,6042
39
- unifi_mermaid/assets/icons/isometric/office.svg,sha256=0Uo-uH931RLW3VXgL8fzhHa9-ScmpWghcIpFdKJ_hWc,8444
40
- unifi_mermaid/assets/icons/isometric/package-module.svg,sha256=nlC_IX-toVU9d2I6DSJ4mI9nrlvi_-KBkxCVWG0HvWQ,2036
41
- unifi_mermaid/assets/icons/isometric/paymentcard.svg,sha256=qvzkYH8dEmyWEbHKg8xo-CbwNHSskQuV5FVbYz2Lalk,6026
42
- unifi_mermaid/assets/icons/isometric/plane.svg,sha256=sZbJKpD22pMV0DBeMbtBDAXEx8J4V9DvXUKOrnif788,13712
43
- unifi_mermaid/assets/icons/isometric/printer.svg,sha256=qMM-SawojVCp_NLMDuXWOxWHJHuHjl8JjYojU6ZnHoc,10348
44
- unifi_mermaid/assets/icons/isometric/pyramid.svg,sha256=UeGfxq7XqKGLCxg-h8iS8E-HnDievrI4rngRM2O5KZg,2000
45
- unifi_mermaid/assets/icons/isometric/queue.svg,sha256=MiFWbzikrEejXu_NDQEyRVa9a37xvykWV0V92NxVk4I,2595
46
- unifi_mermaid/assets/icons/isometric/router.svg,sha256=Ah_nQpBsL0Me3tFK4yMZIvykC9rmqEuMxMfDTzpHG50,3192
47
- unifi_mermaid/assets/icons/isometric/server.svg,sha256=aU7K7jOqS3GFkqoG7IxICoyq9PLWt8wShwr5KmU8P4c,7067
48
- unifi_mermaid/assets/icons/isometric/speech.svg,sha256=gAVe0k3eMwIuAxv1Dq-IhDgzY51i5WlCidG_4GKk5Ig,5663
49
- unifi_mermaid/assets/icons/isometric/sphere.svg,sha256=TQqAIwvuW2bXalk9ik0I1Iej1dXG4mmPWq59q_tVaYA,1340
50
- unifi_mermaid/assets/icons/isometric/storage.svg,sha256=9UvfV_K9BmuwiBhKgpeLeS8D63sTKo-htAlJ5m18kQU,8212
51
- unifi_mermaid/assets/icons/isometric/switch-module.svg,sha256=_M3gqVvZpCZJ8KnP7hV1WBQVST5iBHHRy45ynFnnErQ,3738
52
- unifi_mermaid/assets/icons/isometric/tower.svg,sha256=9vj6QOoditHqPOXm3wqwuy6AAuYOty23HU6JtoFAC9w,4356
53
- unifi_mermaid/assets/icons/isometric/truck-2.svg,sha256=I7MFGbXW2fmr9WdD29NSgYk0Suu3TWFojhuNt4pJDS0,8328
54
- unifi_mermaid/assets/icons/isometric/truck.svg,sha256=BrpBr9Qf8hplQIrBpfhN2USxUlPvGCKahlV5e-G13r0,7195
55
- unifi_mermaid/assets/icons/isometric/user.svg,sha256=bYpr0t8rETJ1M7RDTWaNkK-nfF3kq9eMxmxYCthNmE0,23026
56
- unifi_mermaid/assets/icons/isometric/vm.svg,sha256=in6x9cdS6JgQVJl0KAbA79rap4X140dfIBCuxmgQI7s,3694
57
- unifi_network_maps-1.2.1.dist-info/licenses/LICENSE,sha256=mYo1siIIfIwyfdOuK2-Zt0ij2xBTii2hnpeTu79nD80,1074
58
- unifi_network_maps-1.2.1.dist-info/licenses/LICENSES.md,sha256=Uao68LFd1WSqO7PFuwfIzE9ljVpuS9MvW8p5vUyQtzA,244
59
- unifi_network_maps-1.2.1.dist-info/METADATA,sha256=L833UFcIgbqpRJvd_Hvzisw-zuW-ygtQYsSODiJ-7Ms,4349
60
- unifi_network_maps-1.2.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
61
- unifi_network_maps-1.2.1.dist-info/entry_points.txt,sha256=jA4Si3sQdbNFe2IpxTVT9jOJaLY4wndjGxMfnLGtQzU,62
62
- unifi_network_maps-1.2.1.dist-info/top_level.txt,sha256=p9xnCkaZ4ft0L08Zd22zsLCTx17U-J9f7q-M-AlU1lc,14
63
- unifi_network_maps-1.2.1.dist-info/RECORD,,
@@ -1,2 +0,0 @@
1
- [console_scripts]
2
- unifi-network-maps = unifi_mermaid.cli:main
@@ -1,10 +0,0 @@
1
- # Third-Party Licenses
2
-
3
- ## markmanx/isopacks (MIT)
4
-
5
- Isometric SVG icons are vendored under `src/unifi_mermaid/assets/icons/isometric/`.
6
- The upstream MIT license is included at:
7
-
8
- ```
9
- src/unifi_mermaid/assets/icons/isometric/ISOPACKS_LICENSE
10
- ```
@@ -1 +0,0 @@
1
- unifi_mermaid
File without changes
File without changes