unifi-network-maps 1.4.11__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/__main__.py +8 -0
- unifi_network_maps/adapters/__init__.py +1 -0
- unifi_network_maps/adapters/config.py +49 -0
- unifi_network_maps/adapters/unifi.py +457 -0
- unifi_network_maps/assets/__init__.py +0 -0
- unifi_network_maps/assets/icons/__init__.py +0 -0
- unifi_network_maps/assets/icons/access-point.svg +1 -0
- unifi_network_maps/assets/icons/isometric/ISOPACKS_LICENSE +7 -0
- unifi_network_maps/assets/icons/isometric/block.svg +23 -0
- unifi_network_maps/assets/icons/isometric/cache.svg +48 -0
- unifi_network_maps/assets/icons/isometric/cardterminal.svg +316 -0
- unifi_network_maps/assets/icons/isometric/cloud.svg +89 -0
- unifi_network_maps/assets/icons/isometric/cronjob.svg +409 -0
- unifi_network_maps/assets/icons/isometric/cube.svg +24 -0
- unifi_network_maps/assets/icons/isometric/desktop.svg +107 -0
- unifi_network_maps/assets/icons/isometric/diamond.svg +23 -0
- unifi_network_maps/assets/icons/isometric/dns.svg +46 -0
- unifi_network_maps/assets/icons/isometric/document.svg +62 -0
- unifi_network_maps/assets/icons/isometric/firewall.svg +200 -0
- unifi_network_maps/assets/icons/isometric/function-module.svg +215 -0
- unifi_network_maps/assets/icons/isometric/image.svg +65 -0
- unifi_network_maps/assets/icons/isometric/laptop.svg +37 -0
- unifi_network_maps/assets/icons/isometric/loadbalancer.svg +65 -0
- unifi_network_maps/assets/icons/isometric/lock.svg +155 -0
- unifi_network_maps/assets/icons/isometric/mail.svg +35 -0
- unifi_network_maps/assets/icons/isometric/mailmultiple.svg +91 -0
- unifi_network_maps/assets/icons/isometric/mobiledevice.svg +66 -0
- unifi_network_maps/assets/icons/isometric/office.svg +136 -0
- unifi_network_maps/assets/icons/isometric/package-module.svg +39 -0
- unifi_network_maps/assets/icons/isometric/paymentcard.svg +92 -0
- unifi_network_maps/assets/icons/isometric/plane.svg +1 -0
- unifi_network_maps/assets/icons/isometric/printer.svg +122 -0
- unifi_network_maps/assets/icons/isometric/pyramid.svg +28 -0
- unifi_network_maps/assets/icons/isometric/queue.svg +38 -0
- unifi_network_maps/assets/icons/isometric/router.svg +39 -0
- unifi_network_maps/assets/icons/isometric/server.svg +112 -0
- unifi_network_maps/assets/icons/isometric/speech.svg +70 -0
- unifi_network_maps/assets/icons/isometric/sphere.svg +15 -0
- unifi_network_maps/assets/icons/isometric/storage.svg +92 -0
- unifi_network_maps/assets/icons/isometric/switch-module.svg +45 -0
- unifi_network_maps/assets/icons/isometric/tower.svg +50 -0
- unifi_network_maps/assets/icons/isometric/truck-2.svg +1 -0
- unifi_network_maps/assets/icons/isometric/truck.svg +1 -0
- unifi_network_maps/assets/icons/isometric/user.svg +231 -0
- unifi_network_maps/assets/icons/isometric/vm.svg +50 -0
- unifi_network_maps/assets/icons/laptop.svg +1 -0
- unifi_network_maps/assets/icons/router-network.svg +1 -0
- unifi_network_maps/assets/icons/server-network.svg +1 -0
- unifi_network_maps/assets/icons/server.svg +1 -0
- unifi_network_maps/assets/themes/dark.yaml +50 -0
- unifi_network_maps/assets/themes/default.yaml +47 -0
- unifi_network_maps/cli/__init__.py +5 -0
- unifi_network_maps/cli/__main__.py +8 -0
- unifi_network_maps/cli/args.py +166 -0
- unifi_network_maps/cli/main.py +134 -0
- unifi_network_maps/cli/render.py +255 -0
- unifi_network_maps/cli/runtime.py +157 -0
- unifi_network_maps/io/__init__.py +1 -0
- unifi_network_maps/io/debug.py +60 -0
- unifi_network_maps/io/export.py +32 -0
- unifi_network_maps/io/mkdocs_assets.py +21 -0
- unifi_network_maps/io/mock_data.py +23 -0
- unifi_network_maps/io/mock_generate.py +7 -0
- unifi_network_maps/model/__init__.py +1 -0
- unifi_network_maps/model/labels.py +35 -0
- unifi_network_maps/model/lldp.py +99 -0
- unifi_network_maps/model/mock.py +307 -0
- unifi_network_maps/model/ports.py +23 -0
- unifi_network_maps/model/topology.py +909 -0
- unifi_network_maps/render/__init__.py +1 -0
- unifi_network_maps/render/device_ports_md.py +492 -0
- unifi_network_maps/render/legend.py +30 -0
- unifi_network_maps/render/lldp_md.py +352 -0
- unifi_network_maps/render/markdown_tables.py +21 -0
- unifi_network_maps/render/mermaid.py +273 -0
- unifi_network_maps/render/mermaid_theme.py +56 -0
- unifi_network_maps/render/mkdocs.py +167 -0
- unifi_network_maps/render/svg.py +1235 -0
- unifi_network_maps/render/svg_theme.py +64 -0
- unifi_network_maps/render/templates/device_port_block.md.j2 +5 -0
- unifi_network_maps/render/templates/legend_compact.html.j2 +14 -0
- unifi_network_maps/render/templates/lldp_device_section.md.j2 +15 -0
- unifi_network_maps/render/templates/markdown_section.md.j2 +3 -0
- unifi_network_maps/render/templates/mermaid_legend.mmd.j2 +30 -0
- unifi_network_maps/render/templates/mkdocs_document.md.j2 +23 -0
- unifi_network_maps/render/templates/mkdocs_dual_theme_style.html.j2 +8 -0
- unifi_network_maps/render/templates/mkdocs_html_block.html.j2 +2 -0
- unifi_network_maps/render/templates/mkdocs_legend.css.j2 +29 -0
- unifi_network_maps/render/templates/mkdocs_legend.js.j2 +18 -0
- unifi_network_maps/render/templates/mkdocs_mermaid_block.md.j2 +4 -0
- unifi_network_maps/render/templating.py +19 -0
- unifi_network_maps/render/theme.py +109 -0
- unifi_network_maps-1.4.11.dist-info/METADATA +290 -0
- unifi_network_maps-1.4.11.dist-info/RECORD +99 -0
- unifi_network_maps-1.4.11.dist-info/WHEEL +5 -0
- unifi_network_maps-1.4.11.dist-info/entry_points.txt +2 -0
- unifi_network_maps-1.4.11.dist-info/licenses/LICENSE +21 -0
- unifi_network_maps-1.4.11.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
"""MkDocs-specific rendering helpers."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import logging
|
|
6
|
+
from dataclasses import dataclass
|
|
7
|
+
from datetime import datetime
|
|
8
|
+
from zoneinfo import ZoneInfo
|
|
9
|
+
|
|
10
|
+
from ..model.topology import ClientPortMap, Device, PortMap, build_node_type_map
|
|
11
|
+
from .device_ports_md import render_device_port_overview
|
|
12
|
+
from .mermaid import render_legend, render_legend_compact, render_mermaid
|
|
13
|
+
from .mermaid_theme import MermaidTheme
|
|
14
|
+
from .templating import render_template
|
|
15
|
+
|
|
16
|
+
logger = logging.getLogger(__name__)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@dataclass(frozen=True)
|
|
20
|
+
class MkdocsRenderOptions:
|
|
21
|
+
direction: str
|
|
22
|
+
legend_style: str
|
|
23
|
+
legend_scale: float
|
|
24
|
+
timestamp_zone: str
|
|
25
|
+
client_scope: str
|
|
26
|
+
dual_theme: bool
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def render_mkdocs(
|
|
30
|
+
edges: list,
|
|
31
|
+
devices: list[Device],
|
|
32
|
+
*,
|
|
33
|
+
mermaid_theme: MermaidTheme,
|
|
34
|
+
port_map: PortMap,
|
|
35
|
+
client_ports: ClientPortMap | None,
|
|
36
|
+
options: MkdocsRenderOptions,
|
|
37
|
+
dark_mermaid_theme: MermaidTheme | None = None,
|
|
38
|
+
) -> str:
|
|
39
|
+
clients = None
|
|
40
|
+
node_types = build_node_type_map(devices, clients, client_mode=options.client_scope)
|
|
41
|
+
content = render_mermaid(
|
|
42
|
+
edges,
|
|
43
|
+
direction=options.direction,
|
|
44
|
+
node_types=node_types,
|
|
45
|
+
theme=mermaid_theme,
|
|
46
|
+
)
|
|
47
|
+
dual_theme = options.dual_theme and dark_mermaid_theme is not None
|
|
48
|
+
legend_title = "Legend" if options.legend_style != "compact" else ""
|
|
49
|
+
if dual_theme and dark_mermaid_theme is not None:
|
|
50
|
+
dark_content = render_mermaid(
|
|
51
|
+
edges,
|
|
52
|
+
direction=options.direction,
|
|
53
|
+
node_types=node_types,
|
|
54
|
+
theme=dark_mermaid_theme,
|
|
55
|
+
)
|
|
56
|
+
map_block = _mkdocs_dual_mermaid_block(content, dark_content, base_class="unifi-mermaid")
|
|
57
|
+
legend_block = _mkdocs_dual_legend_block(
|
|
58
|
+
options.legend_style,
|
|
59
|
+
mermaid_theme=mermaid_theme,
|
|
60
|
+
dark_mermaid_theme=dark_mermaid_theme,
|
|
61
|
+
legend_scale=options.legend_scale,
|
|
62
|
+
)
|
|
63
|
+
dual_style = _mkdocs_dual_theme_style()
|
|
64
|
+
else:
|
|
65
|
+
map_block = _mkdocs_mermaid_block(content, class_name="unifi-mermaid")
|
|
66
|
+
legend_block = _mkdocs_single_legend_block(
|
|
67
|
+
options.legend_style,
|
|
68
|
+
mermaid_theme=mermaid_theme,
|
|
69
|
+
legend_scale=options.legend_scale,
|
|
70
|
+
)
|
|
71
|
+
dual_style = ""
|
|
72
|
+
return render_template(
|
|
73
|
+
"mkdocs_document.md.j2",
|
|
74
|
+
title="UniFi network",
|
|
75
|
+
timestamp_line=_timestamp_line(options.timestamp_zone),
|
|
76
|
+
dual_style=dual_style,
|
|
77
|
+
map_block=map_block,
|
|
78
|
+
legend_title=legend_title,
|
|
79
|
+
legend_block=legend_block,
|
|
80
|
+
device_overview=render_device_port_overview(
|
|
81
|
+
devices, port_map, client_ports=client_ports
|
|
82
|
+
).rstrip()
|
|
83
|
+
+ "\n",
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def _timestamp_line(timestamp_zone: str) -> str:
|
|
88
|
+
if timestamp_zone.strip().lower() in {"off", "none", "false"}:
|
|
89
|
+
return ""
|
|
90
|
+
try:
|
|
91
|
+
zone = ZoneInfo(timestamp_zone)
|
|
92
|
+
except Exception as exc: # noqa: BLE001
|
|
93
|
+
logger.warning("Invalid mkdocs timestamp zone '%s': %s", timestamp_zone, exc)
|
|
94
|
+
return ""
|
|
95
|
+
generated_at = datetime.now(zone).strftime("%Y-%m-%d %H:%M:%S %Z")
|
|
96
|
+
return f"Generated: {generated_at}"
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def _mkdocs_mermaid_block(content: str, *, class_name: str) -> str:
|
|
100
|
+
return render_template(
|
|
101
|
+
"mkdocs_mermaid_block.md.j2",
|
|
102
|
+
class_name=class_name,
|
|
103
|
+
content=content,
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
def _mkdocs_dual_mermaid_block(
|
|
108
|
+
light_content: str,
|
|
109
|
+
dark_content: str,
|
|
110
|
+
*,
|
|
111
|
+
base_class: str,
|
|
112
|
+
) -> str:
|
|
113
|
+
light = _mkdocs_mermaid_block(light_content, class_name=f"{base_class} {base_class}--light")
|
|
114
|
+
dark = _mkdocs_mermaid_block(dark_content, class_name=f"{base_class} {base_class}--dark")
|
|
115
|
+
return f"{light}\n{dark}"
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
def _mkdocs_single_legend_block(
|
|
119
|
+
legend_style: str,
|
|
120
|
+
*,
|
|
121
|
+
mermaid_theme: MermaidTheme,
|
|
122
|
+
legend_scale: float,
|
|
123
|
+
) -> str:
|
|
124
|
+
if legend_style == "compact":
|
|
125
|
+
return render_template(
|
|
126
|
+
"mkdocs_html_block.html.j2",
|
|
127
|
+
class_name="unifi-legend",
|
|
128
|
+
data_unifi_legend=True,
|
|
129
|
+
content=render_legend_compact(theme=mermaid_theme),
|
|
130
|
+
)
|
|
131
|
+
return "```mermaid\n" + render_legend(theme=mermaid_theme, legend_scale=legend_scale) + "```"
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
def _mkdocs_dual_legend_block(
|
|
135
|
+
legend_style: str,
|
|
136
|
+
*,
|
|
137
|
+
mermaid_theme: MermaidTheme,
|
|
138
|
+
dark_mermaid_theme: MermaidTheme,
|
|
139
|
+
legend_scale: float,
|
|
140
|
+
) -> str:
|
|
141
|
+
if legend_style == "compact":
|
|
142
|
+
light = render_template(
|
|
143
|
+
"mkdocs_html_block.html.j2",
|
|
144
|
+
class_name="unifi-legend unifi-legend--light",
|
|
145
|
+
data_unifi_legend=True,
|
|
146
|
+
content=render_legend_compact(theme=mermaid_theme),
|
|
147
|
+
)
|
|
148
|
+
dark = render_template(
|
|
149
|
+
"mkdocs_html_block.html.j2",
|
|
150
|
+
class_name="unifi-legend unifi-legend--dark",
|
|
151
|
+
data_unifi_legend=True,
|
|
152
|
+
content=render_legend_compact(theme=dark_mermaid_theme),
|
|
153
|
+
)
|
|
154
|
+
return f"{light}\n{dark}"
|
|
155
|
+
light = _mkdocs_mermaid_block(
|
|
156
|
+
render_legend(theme=mermaid_theme, legend_scale=legend_scale),
|
|
157
|
+
class_name="unifi-legend unifi-legend--light",
|
|
158
|
+
)
|
|
159
|
+
dark = _mkdocs_mermaid_block(
|
|
160
|
+
render_legend(theme=dark_mermaid_theme, legend_scale=legend_scale),
|
|
161
|
+
class_name="unifi-legend unifi-legend--dark",
|
|
162
|
+
)
|
|
163
|
+
return f"{light}\n{dark}"
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
def _mkdocs_dual_theme_style() -> str:
|
|
167
|
+
return render_template("mkdocs_dual_theme_style.html.j2") + "\n"
|