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.
- unifi_network_maps/__init__.py +1 -0
- unifi_network_maps/adapters/__init__.py +1 -0
- {unifi_mermaid → unifi_network_maps/adapters}/config.py +7 -1
- {unifi_mermaid → unifi_network_maps/adapters}/unifi.py +1 -1
- unifi_network_maps/assets/themes/dark.yaml +47 -0
- unifi_network_maps/assets/themes/default.yaml +47 -0
- unifi_network_maps/cli/__init__.py +41 -0
- unifi_network_maps/cli/__main__.py +8 -0
- unifi_network_maps/cli/main.py +281 -0
- unifi_network_maps/io/__init__.py +1 -0
- {unifi_mermaid → unifi_network_maps/io}/debug.py +1 -1
- unifi_network_maps/model/__init__.py +1 -0
- unifi_network_maps/model/labels.py +35 -0
- {unifi_mermaid → unifi_network_maps/model}/lldp.py +19 -33
- unifi_network_maps/model/ports.py +23 -0
- {unifi_mermaid → unifi_network_maps/model}/topology.py +216 -89
- unifi_network_maps/render/__init__.py +1 -0
- {unifi_mermaid → unifi_network_maps/render}/mermaid.py +21 -16
- unifi_network_maps/render/mermaid_theme.py +46 -0
- {unifi_mermaid → unifi_network_maps/render}/svg.py +208 -175
- unifi_network_maps/render/svg_theme.py +64 -0
- unifi_network_maps/render/theme.py +90 -0
- {unifi_network_maps-1.2.1.dist-info → unifi_network_maps-1.3.0.dist-info}/METADATA +63 -8
- unifi_network_maps-1.3.0.dist-info/RECORD +75 -0
- unifi_network_maps-1.3.0.dist-info/entry_points.txt +2 -0
- unifi_network_maps-1.3.0.dist-info/licenses/LICENSES.md +10 -0
- unifi_network_maps-1.3.0.dist-info/top_level.txt +1 -0
- unifi_mermaid/__init__.py +0 -1
- unifi_mermaid/cli.py +0 -197
- unifi_mermaid/labels.py +0 -15
- unifi_network_maps-1.2.1.dist-info/RECORD +0 -63
- unifi_network_maps-1.2.1.dist-info/entry_points.txt +0 -2
- unifi_network_maps-1.2.1.dist-info/licenses/LICENSES.md +0 -10
- unifi_network_maps-1.2.1.dist-info/top_level.txt +0 -1
- {unifi_mermaid → unifi_network_maps}/assets/__init__.py +0 -0
- {unifi_mermaid → unifi_network_maps}/assets/icons/__init__.py +0 -0
- {unifi_mermaid → unifi_network_maps}/assets/icons/access-point.svg +0 -0
- {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/ISOPACKS_LICENSE +0 -0
- {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/block.svg +0 -0
- {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/cache.svg +0 -0
- {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/cardterminal.svg +0 -0
- {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/cloud.svg +0 -0
- {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/cronjob.svg +0 -0
- {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/cube.svg +0 -0
- {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/desktop.svg +0 -0
- {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/diamond.svg +0 -0
- {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/dns.svg +0 -0
- {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/document.svg +0 -0
- {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/firewall.svg +0 -0
- {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/function-module.svg +0 -0
- {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/image.svg +0 -0
- {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/laptop.svg +0 -0
- {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/loadbalancer.svg +0 -0
- {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/lock.svg +0 -0
- {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/mail.svg +0 -0
- {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/mailmultiple.svg +0 -0
- {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/mobiledevice.svg +0 -0
- {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/office.svg +0 -0
- {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/package-module.svg +0 -0
- {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/paymentcard.svg +0 -0
- {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/plane.svg +0 -0
- {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/printer.svg +0 -0
- {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/pyramid.svg +0 -0
- {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/queue.svg +0 -0
- {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/router.svg +0 -0
- {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/server.svg +0 -0
- {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/speech.svg +0 -0
- {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/sphere.svg +0 -0
- {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/storage.svg +0 -0
- {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/switch-module.svg +0 -0
- {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/tower.svg +0 -0
- {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/truck-2.svg +0 -0
- {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/truck.svg +0 -0
- {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/user.svg +0 -0
- {unifi_mermaid → unifi_network_maps}/assets/icons/isometric/vm.svg +0 -0
- {unifi_mermaid → unifi_network_maps}/assets/icons/laptop.svg +0 -0
- {unifi_mermaid → unifi_network_maps}/assets/icons/router-network.svg +0 -0
- {unifi_mermaid → unifi_network_maps}/assets/icons/server-network.svg +0 -0
- {unifi_mermaid → unifi_network_maps}/assets/icons/server.svg +0 -0
- {unifi_mermaid → unifi_network_maps/io}/export.py +0 -0
- {unifi_network_maps-1.2.1.dist-info → unifi_network_maps-1.3.0.dist-info}/WHEEL +0 -0
- {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.
|
|
4
|
-
Summary: Dynamic UniFi ->
|
|
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
|
-
|
|
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/
|
|
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,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 +0,0 @@
|
|
|
1
|
-
unifi_mermaid
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|