mtk-router-sdk 0.1.0__tar.gz

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 (144) hide show
  1. mtk_router_sdk-0.1.0/LICENSE +21 -0
  2. mtk_router_sdk-0.1.0/PKG-INFO +169 -0
  3. mtk_router_sdk-0.1.0/README.md +137 -0
  4. mtk_router_sdk-0.1.0/pyproject.toml +85 -0
  5. mtk_router_sdk-0.1.0/setup.cfg +4 -0
  6. mtk_router_sdk-0.1.0/src/mtk_router_sdk/__init__.py +62 -0
  7. mtk_router_sdk-0.1.0/src/mtk_router_sdk/bootstrap/__init__.py +5 -0
  8. mtk_router_sdk-0.1.0/src/mtk_router_sdk/bootstrap/engine.py +653 -0
  9. mtk_router_sdk-0.1.0/src/mtk_router_sdk/cli.py +1164 -0
  10. mtk_router_sdk-0.1.0/src/mtk_router_sdk/cli_init_site.py +209 -0
  11. mtk_router_sdk-0.1.0/src/mtk_router_sdk/client.py +111 -0
  12. mtk_router_sdk-0.1.0/src/mtk_router_sdk/client_resolve.py +184 -0
  13. mtk_router_sdk-0.1.0/src/mtk_router_sdk/config/__init__.py +31 -0
  14. mtk_router_sdk-0.1.0/src/mtk_router_sdk/config/env.py +151 -0
  15. mtk_router_sdk-0.1.0/src/mtk_router_sdk/config/load.py +176 -0
  16. mtk_router_sdk-0.1.0/src/mtk_router_sdk/config/schema.py +71 -0
  17. mtk_router_sdk-0.1.0/src/mtk_router_sdk/config/vpn_endpoint_creds.py +117 -0
  18. mtk_router_sdk-0.1.0/src/mtk_router_sdk/control/__init__.py +5 -0
  19. mtk_router_sdk-0.1.0/src/mtk_router_sdk/control/leases.py +187 -0
  20. mtk_router_sdk-0.1.0/src/mtk_router_sdk/discovery/__init__.py +6 -0
  21. mtk_router_sdk-0.1.0/src/mtk_router_sdk/discovery/compatibility.py +106 -0
  22. mtk_router_sdk-0.1.0/src/mtk_router_sdk/discovery/models.py +82 -0
  23. mtk_router_sdk-0.1.0/src/mtk_router_sdk/discovery/service.py +137 -0
  24. mtk_router_sdk-0.1.0/src/mtk_router_sdk/exceptions.py +49 -0
  25. mtk_router_sdk-0.1.0/src/mtk_router_sdk/intent/__init__.py +17 -0
  26. mtk_router_sdk-0.1.0/src/mtk_router_sdk/intent/runner.py +150 -0
  27. mtk_router_sdk-0.1.0/src/mtk_router_sdk/models/__init__.py +6 -0
  28. mtk_router_sdk-0.1.0/src/mtk_router_sdk/models/connection.py +22 -0
  29. mtk_router_sdk-0.1.0/src/mtk_router_sdk/models/exec_result.py +16 -0
  30. mtk_router_sdk-0.1.0/src/mtk_router_sdk/net/__init__.py +19 -0
  31. mtk_router_sdk-0.1.0/src/mtk_router_sdk/net/gateway.py +107 -0
  32. mtk_router_sdk-0.1.0/src/mtk_router_sdk/net/ssh_host.py +225 -0
  33. mtk_router_sdk-0.1.0/src/mtk_router_sdk/ops/__init__.py +20 -0
  34. mtk_router_sdk-0.1.0/src/mtk_router_sdk/ops/client_block.py +149 -0
  35. mtk_router_sdk-0.1.0/src/mtk_router_sdk/ops/slot_route.py +22 -0
  36. mtk_router_sdk-0.1.0/src/mtk_router_sdk/ops/sniffer.py +109 -0
  37. mtk_router_sdk-0.1.0/src/mtk_router_sdk/ops/vpn_checkpoint.py +196 -0
  38. mtk_router_sdk-0.1.0/src/mtk_router_sdk/parsing/__init__.py +6 -0
  39. mtk_router_sdk-0.1.0/src/mtk_router_sdk/parsing/keyvalue.py +20 -0
  40. mtk_router_sdk-0.1.0/src/mtk_router_sdk/parsing/terse.py +32 -0
  41. mtk_router_sdk-0.1.0/src/mtk_router_sdk/proxy/__init__.py +58 -0
  42. mtk_router_sdk-0.1.0/src/mtk_router_sdk/proxy/certs.py +365 -0
  43. mtk_router_sdk-0.1.0/src/mtk_router_sdk/proxy/cli.py +385 -0
  44. mtk_router_sdk-0.1.0/src/mtk_router_sdk/proxy/engine.py +405 -0
  45. mtk_router_sdk-0.1.0/src/mtk_router_sdk/proxy/forward_proxy.py +749 -0
  46. mtk_router_sdk-0.1.0/src/mtk_router_sdk/proxy/models.py +321 -0
  47. mtk_router_sdk-0.1.0/src/mtk_router_sdk/proxy/rest_client.py +170 -0
  48. mtk_router_sdk-0.1.0/src/mtk_router_sdk/proxy/routes.py +473 -0
  49. mtk_router_sdk-0.1.0/src/mtk_router_sdk/proxy/sdk.py +596 -0
  50. mtk_router_sdk-0.1.0/src/mtk_router_sdk/proxy/store.py +285 -0
  51. mtk_router_sdk-0.1.0/src/mtk_router_sdk/proxy/upstream.py +263 -0
  52. mtk_router_sdk-0.1.0/src/mtk_router_sdk/py.typed +1 -0
  53. mtk_router_sdk-0.1.0/src/mtk_router_sdk/ros_adapter.py +35 -0
  54. mtk_router_sdk-0.1.0/src/mtk_router_sdk/service/__init__.py +1 -0
  55. mtk_router_sdk-0.1.0/src/mtk_router_sdk/service/app.py +199 -0
  56. mtk_router_sdk-0.1.0/src/mtk_router_sdk/service/main.py +16 -0
  57. mtk_router_sdk-0.1.0/src/mtk_router_sdk/service/openapi_paths.py +578 -0
  58. mtk_router_sdk-0.1.0/src/mtk_router_sdk/service/openapi_spec.py +356 -0
  59. mtk_router_sdk-0.1.0/src/mtk_router_sdk/service/runtime.py +18 -0
  60. mtk_router_sdk-0.1.0/src/mtk_router_sdk/service/snapshot.py +78 -0
  61. mtk_router_sdk-0.1.0/src/mtk_router_sdk/service/state.py +45 -0
  62. mtk_router_sdk-0.1.0/src/mtk_router_sdk/service/static/dashboard/index.html +70 -0
  63. mtk_router_sdk-0.1.0/src/mtk_router_sdk/service/static/dashboard/proxy.html +1193 -0
  64. mtk_router_sdk-0.1.0/src/mtk_router_sdk/service/v1_routes.py +1459 -0
  65. mtk_router_sdk-0.1.0/src/mtk_router_sdk/testing/__init__.py +61 -0
  66. mtk_router_sdk-0.1.0/src/mtk_router_sdk/testing/cli.py +396 -0
  67. mtk_router_sdk-0.1.0/src/mtk_router_sdk/testing/dashboard.py +1747 -0
  68. mtk_router_sdk-0.1.0/src/mtk_router_sdk/testing/dashboard_embed_serve.py +126 -0
  69. mtk_router_sdk-0.1.0/src/mtk_router_sdk/testing/dashboard_errors.py +283 -0
  70. mtk_router_sdk-0.1.0/src/mtk_router_sdk/testing/dashboard_web/css/animations.css +725 -0
  71. mtk_router_sdk-0.1.0/src/mtk_router_sdk/testing/dashboard_web/css/base.css +3565 -0
  72. mtk_router_sdk-0.1.0/src/mtk_router_sdk/testing/dashboard_web/css/motion.css +492 -0
  73. mtk_router_sdk-0.1.0/src/mtk_router_sdk/testing/dashboard_web/index.html +1093 -0
  74. mtk_router_sdk-0.1.0/src/mtk_router_sdk/testing/dashboard_web/js/core/activity.js +48 -0
  75. mtk_router_sdk-0.1.0/src/mtk_router_sdk/testing/dashboard_web/js/core/animations.js +283 -0
  76. mtk_router_sdk-0.1.0/src/mtk_router_sdk/testing/dashboard_web/js/core/api.js +197 -0
  77. mtk_router_sdk-0.1.0/src/mtk_router_sdk/testing/dashboard_web/js/core/dom.js +2 -0
  78. mtk_router_sdk-0.1.0/src/mtk_router_sdk/testing/dashboard_web/js/core/logs-render.js +254 -0
  79. mtk_router_sdk-0.1.0/src/mtk_router_sdk/testing/dashboard_web/js/core/state.js +52 -0
  80. mtk_router_sdk-0.1.0/src/mtk_router_sdk/testing/dashboard_web/js/core/tooltips.js +78 -0
  81. mtk_router_sdk-0.1.0/src/mtk_router_sdk/testing/dashboard_web/js/core/ui-chrome.js +45 -0
  82. mtk_router_sdk-0.1.0/src/mtk_router_sdk/testing/dashboard_web/js/docs/interactive.js +102 -0
  83. mtk_router_sdk-0.1.0/src/mtk_router_sdk/testing/dashboard_web/js/main.js +146 -0
  84. mtk_router_sdk-0.1.0/src/mtk_router_sdk/testing/dashboard_web/js/panels/dns.js +366 -0
  85. mtk_router_sdk-0.1.0/src/mtk_router_sdk/testing/dashboard_web/js/panels/network.js +2385 -0
  86. mtk_router_sdk-0.1.0/src/mtk_router_sdk/testing/dashboard_web/js/panels/overview-ws.js +165 -0
  87. mtk_router_sdk-0.1.0/src/mtk_router_sdk/testing/dashboard_web/js/panels/profiles-settings.js +248 -0
  88. mtk_router_sdk-0.1.0/src/mtk_router_sdk/testing/dashboard_web/js/panels/proxy.js +318 -0
  89. mtk_router_sdk-0.1.0/src/mtk_router_sdk/testing/dashboard_web/js/panels/recording.js +176 -0
  90. mtk_router_sdk-0.1.0/src/mtk_router_sdk/testing/dashboard_web/js/panels/scenarios.js +85 -0
  91. mtk_router_sdk-0.1.0/src/mtk_router_sdk/testing/dashboard_web/js/panels/sdk-connect.js +286 -0
  92. mtk_router_sdk-0.1.0/src/mtk_router_sdk/testing/dashboard_web/js/panels/setup.js +394 -0
  93. mtk_router_sdk-0.1.0/src/mtk_router_sdk/testing/dashboard_web/partials/documentation.html +1059 -0
  94. mtk_router_sdk-0.1.0/src/mtk_router_sdk/testing/dashboard_workspace.py +232 -0
  95. mtk_router_sdk-0.1.0/src/mtk_router_sdk/testing/dns.py +504 -0
  96. mtk_router_sdk-0.1.0/src/mtk_router_sdk/testing/http_api.py +80 -0
  97. mtk_router_sdk-0.1.0/src/mtk_router_sdk/testing/kit.py +270 -0
  98. mtk_router_sdk-0.1.0/src/mtk_router_sdk/testing/network.py +859 -0
  99. mtk_router_sdk-0.1.0/src/mtk_router_sdk/testing/profiles.py +520 -0
  100. mtk_router_sdk-0.1.0/src/mtk_router_sdk/testing/pytest_plugin.py +425 -0
  101. mtk_router_sdk-0.1.0/src/mtk_router_sdk/testing/recording.py +658 -0
  102. mtk_router_sdk-0.1.0/src/mtk_router_sdk/testing/routes.py +258 -0
  103. mtk_router_sdk-0.1.0/src/mtk_router_sdk/testing/scenarios.py +602 -0
  104. mtk_router_sdk-0.1.0/src/mtk_router_sdk/testing/tracker.py +488 -0
  105. mtk_router_sdk-0.1.0/src/mtk_router_sdk/transport/__init__.py +6 -0
  106. mtk_router_sdk-0.1.0/src/mtk_router_sdk/transport/base.py +40 -0
  107. mtk_router_sdk-0.1.0/src/mtk_router_sdk/transport/ssh.py +142 -0
  108. mtk_router_sdk-0.1.0/src/mtk_router_sdk.egg-info/PKG-INFO +169 -0
  109. mtk_router_sdk-0.1.0/src/mtk_router_sdk.egg-info/SOURCES.txt +142 -0
  110. mtk_router_sdk-0.1.0/src/mtk_router_sdk.egg-info/dependency_links.txt +1 -0
  111. mtk_router_sdk-0.1.0/src/mtk_router_sdk.egg-info/entry_points.txt +3 -0
  112. mtk_router_sdk-0.1.0/src/mtk_router_sdk.egg-info/requires.txt +14 -0
  113. mtk_router_sdk-0.1.0/src/mtk_router_sdk.egg-info/top_level.txt +1 -0
  114. mtk_router_sdk-0.1.0/tests/test_bootstrap.py +214 -0
  115. mtk_router_sdk-0.1.0/tests/test_cli_l2tp_redact.py +16 -0
  116. mtk_router_sdk-0.1.0/tests/test_cli_slot_vpn.py +124 -0
  117. mtk_router_sdk-0.1.0/tests/test_cli_sniffer.py +116 -0
  118. mtk_router_sdk-0.1.0/tests/test_cli_vpn_debug_helpers.py +67 -0
  119. mtk_router_sdk-0.1.0/tests/test_client_block.py +166 -0
  120. mtk_router_sdk-0.1.0/tests/test_client_resolve.py +94 -0
  121. mtk_router_sdk-0.1.0/tests/test_config.py +49 -0
  122. mtk_router_sdk-0.1.0/tests/test_connection_merge.py +88 -0
  123. mtk_router_sdk-0.1.0/tests/test_dashboard_embed_serve.py +38 -0
  124. mtk_router_sdk-0.1.0/tests/test_dashboard_errors.py +56 -0
  125. mtk_router_sdk-0.1.0/tests/test_dashboard_workspace.py +141 -0
  126. mtk_router_sdk-0.1.0/tests/test_discovery.py +62 -0
  127. mtk_router_sdk-0.1.0/tests/test_gateway_resolution.py +88 -0
  128. mtk_router_sdk-0.1.0/tests/test_intent_ssid.py +59 -0
  129. mtk_router_sdk-0.1.0/tests/test_leases.py +50 -0
  130. mtk_router_sdk-0.1.0/tests/test_ops_sniffer.py +37 -0
  131. mtk_router_sdk-0.1.0/tests/test_parsing.py +23 -0
  132. mtk_router_sdk-0.1.0/tests/test_parsing_keyvalue.py +12 -0
  133. mtk_router_sdk-0.1.0/tests/test_parsing_terse.py +28 -0
  134. mtk_router_sdk-0.1.0/tests/test_proxy.py +316 -0
  135. mtk_router_sdk-0.1.0/tests/test_ros_adapter.py +15 -0
  136. mtk_router_sdk-0.1.0/tests/test_service_http.py +70 -0
  137. mtk_router_sdk-0.1.0/tests/test_session_recorder.py +22 -0
  138. mtk_router_sdk-0.1.0/tests/test_ssh_host.py +113 -0
  139. mtk_router_sdk-0.1.0/tests/test_v1_by_client.py +112 -0
  140. mtk_router_sdk-0.1.0/tests/test_v1_by_ssid.py +128 -0
  141. mtk_router_sdk-0.1.0/tests/test_v1_sniffer.py +109 -0
  142. mtk_router_sdk-0.1.0/tests/test_vpn_checkpoint.py +113 -0
  143. mtk_router_sdk-0.1.0/tests/test_vpn_endpoint_creds.py +55 -0
  144. mtk_router_sdk-0.1.0/tests/test_vpn_us_uk_setup.py +226 -0
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 MTK Router Automation Platform contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,169 @@
1
+ Metadata-Version: 2.4
2
+ Name: mtk-router-sdk
3
+ Version: 0.1.0
4
+ Summary: MikroTik RouterOS automation SDK (multi-slot VPN, discovery, bootstrap)
5
+ Author: MTK Router Automation contributors
6
+ License: MIT
7
+ Keywords: mikrotik,routeros,network,vpn,automation
8
+ Classifier: Development Status :: 3 - Alpha
9
+ Classifier: Intended Audience :: Developers
10
+ Classifier: License :: OSI Approved :: MIT License
11
+ Classifier: Programming Language :: Python :: 3
12
+ Classifier: Programming Language :: Python :: 3.10
13
+ Classifier: Programming Language :: Python :: 3.11
14
+ Classifier: Programming Language :: Python :: 3.12
15
+ Classifier: Topic :: System :: Networking
16
+ Requires-Python: >=3.10
17
+ Description-Content-Type: text/markdown
18
+ License-File: LICENSE
19
+ Requires-Dist: paramiko<4,>=3.4
20
+ Provides-Extra: dev
21
+ Requires-Dist: pytest>=7.4; extra == "dev"
22
+ Requires-Dist: pytest-cov>=4.1; extra == "dev"
23
+ Requires-Dist: ruff>=0.3; extra == "dev"
24
+ Requires-Dist: mypy>=1.8; extra == "dev"
25
+ Requires-Dist: httpx<0.29,>=0.27; extra == "dev"
26
+ Requires-Dist: starlette>=0.37; extra == "dev"
27
+ Requires-Dist: uvicorn[standard]>=0.27; extra == "dev"
28
+ Provides-Extra: service
29
+ Requires-Dist: starlette>=0.37; extra == "service"
30
+ Requires-Dist: uvicorn[standard]>=0.27; extra == "service"
31
+ Dynamic: license-file
32
+
33
+ # MTK Router Automation Platform
34
+
35
+ Greenfield product for **MikroTik RouterOS**: multi-slot Wi‑Fi, per-slot VPN policy routing, discovery-driven configuration, optional AI **intent** API, and operator dashboard — delivered as a **Python library**, **HTTP service**, **TypeScript SDK**, and **CLI**.
36
+
37
+ **Normative specification:** [docs/ROUTER_SDK.md](docs/ROUTER_SDK.md) (API semantics, locks, bootstrap, security model).
38
+
39
+ ## Documentation map
40
+
41
+ | Document | Audience |
42
+ |----------|----------|
43
+ | [docs/README.md](docs/README.md) | Index of all docs |
44
+ | [docs/QUICK_START.md](docs/QUICK_START.md) | **5-minute setup**: get running fast |
45
+ | [docs/EXAMPLES.md](docs/EXAMPLES.md) | **Copy-paste code**: Python, TypeScript, CLI |
46
+ | [docs/GLOSSARY.md](docs/GLOSSARY.md) | **Terms**: slots, routing marks, bootstrap, leases |
47
+ | [docs/CLI_REFERENCE.md](docs/CLI_REFERENCE.md) | **All CLI commands**: flags, options, examples |
48
+ | [docs/TROUBLESHOOTING.md](docs/TROUBLESHOOTING.md) | **Fix common issues**: connection, VPN, proxy |
49
+ | [docs/ROUTER_SDK.md](docs/ROUTER_SDK.md) | Full product & technical specification |
50
+ | [docs/USER_GUIDE.md](docs/USER_GUIDE.md) | Operators: install, configure, run |
51
+ | [docs/USE_CASES.md](docs/USE_CASES.md) | Scenario-first: doctor, bootstrap, HTTP, leases, intents, TS client |
52
+ | [docs/ADOPTION_GUIDE.md](docs/ADOPTION_GUIDE.md) | **Start here**: diagrams, Python + JS snippets, SSH vs HTTP, gaps |
53
+ | [docs/VPN_SETUP_AND_TEST.md](docs/VPN_SETUP_AND_TEST.md) | **Live VPN**: bootstrap, `vpn-debug`, `slot-vpn`, `scripts/verify_vpn_live.py` |
54
+ | [docs/PROXY_TESTING.md](docs/PROXY_TESTING.md) | **API proxy**: intercept/modify responses per-client IP, full HTTP logging, HTTPS certs |
55
+ | [docs/TESTING_SDK.md](docs/TESTING_SDK.md) | **Testing toolkit**: network simulation, DNS override, profiles, scenarios, pytest |
56
+ | [docs/PPV_TESTING_AND_MOCKING.md](docs/PPV_TESTING_AND_MOCKING.md) | **PPV / entitlement**: record-replay & proxy possibilities vs DRM and billing |
57
+ | [docs/ENVIRONMENT.md](docs/ENVIRONMENT.md) | **`MTK_*` env vars** (SSH, HTTP service, secrets, bootstrap) |
58
+ | [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) | System diagram & component boundaries |
59
+ | [docs/DEVELOPMENT.md](docs/DEVELOPMENT.md) | Contributors: repo layout, build, test |
60
+ | [docs/TESTING_GUIDE.md](docs/TESTING_GUIDE.md) | How to write and run tests |
61
+ | [docs/RELEASE_PROCESS.md](docs/RELEASE_PROCESS.md) | Versioning, tagging, publishing |
62
+ | [docs/COMPLIANCE_AND_PRIVACY.md](docs/COMPLIANCE_AND_PRIVACY.md) | Logging, capture, AI, data handling |
63
+ | [docs/AI_LOCAL_ASSISTANT.md](docs/AI_LOCAL_ASSISTANT.md) | Local LLM (Ollama), guided first-time setup |
64
+ | [docs/API_REFERENCE.md](docs/API_REFERENCE.md) | OpenAPI, SDK doc entry points |
65
+ | [docs/FEATURE_LIST.md](docs/FEATURE_LIST.md) | Complete feature inventory, gaps, quality metrics |
66
+ | [docs/ROADMAP_TESTER_FEATURES.md](docs/ROADMAP_TESTER_FEATURES.md) | **Future**: network simulation, chaos engineering, test scenarios |
67
+ | [docs/GOVERNANCE.md](docs/GOVERNANCE.md) | Maintainer / decision process |
68
+ | [docs/rfcs/](docs/rfcs/) | RFC process + templates (big design proposals) |
69
+ | [docs/adr/](docs/adr/) | ADR process + templates (record architecture choices) |
70
+ | [CONTRIBUTING.md](CONTRIBUTING.md) | How to contribute |
71
+ | [SECURITY.md](SECURITY.md) | Vulnerability reporting |
72
+ | [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md) | Community standards |
73
+ | [CHANGELOG.md](CHANGELOG.md) | Release history |
74
+ | [SUPPORT.md](SUPPORT.md) | How to get help |
75
+ | [LICENSE](LICENSE) | MIT |
76
+
77
+ ## Status
78
+
79
+ - **Specification:** [docs/ROUTER_SDK.md](docs/ROUTER_SDK.md).
80
+ - **Python SDK (alpha):** SSH transport, discovery, JSON **site** config, **bootstrap engine** (plan + `--apply`), CLI below, **pytest** suite with fakes, optional **HTTP** service (`mtk-serve`), **TypeScript** HTTP client `clients/typescript/`, optional **Node.js** direct-SSH client `clients/node-ssh/` (no `baseUrl`).
81
+ - **HTTP / REST (alpha):** Spec-style **`/v1/*`** routes on **`mtk-serve`**: discovery, **dashboard snapshot**, wireless/VPN/DHCP/policy tables, **PUT `/v1/config/slots`**, **POST `/v1/bootstrap`** (+ dry-run), **slot leases** (`reject` or **`MTK_SLOT_LOCK_MODE=fifo_queue`**), **runtime VPN** (`POST /v1/slots/{id}/vpn` + `X-Slot-Lease`), **per-client block** (`POST /v1/client/block` — firewall DROP, runtime only), **`POST /v1/ai/intent`**, **`WS /v1/stream`**, **`GET /readyz`**, **`POST/DELETE /v1/session`** (SSH target override). Optional **`MTK_SERVICE_TOKEN`** enforces **`Authorization: Bearer`**. Static **dashboard** at **`/dashboard/`**.
82
+ - **Bootstrap + wifiwave2:** Discovery records **`wireless.menu_kind`** (`wireless` | `wifi`); bootstrap uses **`/interface wifi`** security + VAP menus when the profile reports **wifiwave2** (syntax may still need tuning per board — validate on hardware).
83
+ - **OpenAPI + CI:** **`GET /openapi.json`** merges core + v1 paths; GitHub Actions runs **Python 3.10–3.12** (ruff, mypy, pytest), **`clients/typescript`** **`npm run build`**, and **`clients/node-ssh`** **`npm ci`** smoke load.
84
+ - **Still to build / polish:** slot **DELETE** / **`PATCH /v1/config`**, human-in-the-loop approvals, richer DHCP/slot analytics, **sniffer IPv6** / HTTP download of **.pcap**. **CLI** **`mtk slot-vpn`** and **`mtk sniffer`** (IPv4 filter, capture file on router) work over **SSH** without **`mtk-serve`**. The npm HTTP client stays hand-written for ergonomics; **`openapi.d.ts`** is regenerated from **`openapi.json`**; CI checks drift.
85
+
86
+ ### Install the SDK (editable)
87
+
88
+ Requires **Python 3.10 or newer** (use a single `python`/`python3` that meets that — do not run `python` with `3.10+` as if it were a script name).
89
+
90
+ ```bash
91
+ python3 -m venv .venv && source .venv/bin/activate
92
+ python -m pip install -e ".[dev]"
93
+ export MTK_HOST=192.168.88.1 MTK_USER=admin MTK_PASSWORD='your-password'
94
+ mtk doctor
95
+ ```
96
+
97
+ `mtk doctor` only applies to **MikroTik RouterOS** over SSH; if `MTK_HOST` points at another device, the CLI explains that instead of a generic failure.
98
+
99
+ ### CLI commands
100
+
101
+ | Command | Purpose |
102
+ |--------|---------|
103
+ | `mtk init-site` | Interactive wizard → writes a site JSON (`-o file.json`) with `connection`, `vpn_registry`, and `slots` explained step by step |
104
+ | `mtk doctor` | Discovery + human summary + JSON snapshot |
105
+ | `mtk doctor --site FILE` | Same, but SSH target comes from the file’s optional `connection` block (see below). **Do not** paste shell comments on the same line in **zsh** unless `setopt INTERACTIVE_COMMENTS` is on, or `# …` is passed as extra arguments. |
106
+ | `mtk interfaces` | `/interface … print terse` as JSON |
107
+ | `mtk ip` | `/ip address … print terse` as JSON |
108
+ | `mtk l2tp` | `/interface l2tp-client … print terse` as JSON (secrets redacted; **`--show-secrets`** to print raw) |
109
+ | `mtk vpn-debug [tunnel]` | L2TP print + monitor + ping + log tail — **human** sections by default; **`--json`** for machine output |
110
+ | `mtk vpn-reset [tunnel]` | Disable then enable L2TP client (drop stuck IPsec/L2TP); **`--pause SEC`** between steps |
111
+ | `mtk exec '/path …'` | One arbitrary RouterOS command; JSON with exit + stdout/stderr |
112
+ | `mtk bootstrap site.json` | Dry-run: merged plan (no changes). Add **`--apply`** to run idempotent scripts on the router (destructive — test on lab gear first). |
113
+ | `mtk slot-vpn --site FILE SLOT_ID GATEWAY` | Set policy-route **gateway** for that slot’s **routing-mark** (SSH). Or **`--ssid SSID`** instead of **`SLOT_ID`** (SSID must match an **enabled** slot in the site file). |
114
+ | `mtk sniffer start --site FILE --slot N --ip IPv4` | Start **`/tool sniffer`** with **`filter-ip-address`**; **`.pcap`** on router. Or **`--ssid SSID`** instead of **`--slot`**. See **`mtk sniffer stop`** / **`status`**. |
115
+ | `mtk client-resolve --site FILE --ip ADDR` | Print JSON: map client IP → slot (subnets in site; SSH to router for DHCP **`dhcp_<id>`** unless **`--no-ssh`**). Pairs with HTTP **`GET /v1/client/resolve`** and **`POST /v1/by-client/...`**. |
116
+ | `mtk sniffer stop` / `mtk sniffer status` | Stop sniffer or print **`/tool sniffer print`** as JSON |
117
+ | `mtk client-block block IP` | Block internet for a client (firewall DROP, runtime only, no persistence) |
118
+ | `mtk client-block unblock IP` | Remove block for a client |
119
+ | `mtk client-block list` / `status IP` | List all blocked / check one IP |
120
+ | `mtk proxy set IP PATH JSON` | Set mock API response for endpoint (per-client, like Charles Proxy) |
121
+ | `mtk proxy error IP PATH --status 500` | Simulate error response |
122
+ | `mtk proxy log` | View proxied requests with full HTTP details |
123
+
124
+ **SSH settings:** You can put an optional top-level `connection` object in the site JSON (`host`, `username`, `password_ref` or `password`, `port`, `timeout`). Values may be literals or `env:VAR`. **If both exist, environment variables win** (`MTK_HOST`, `MTK_USER`, `MTK_PASSWORD`, `MTK_PORT`, `MTK_TIMEOUT`) so production can override a file safely. **Full env reference:** [docs/ENVIRONMENT.md](docs/ENVIRONMENT.md).
125
+
126
+ **Router IP without `MTK_HOST`:** If you omit `MTK_HOST` and there is no `connection.host` in the site file, the SDK probes likely LAN routers (gateway, `192.168.88.1`, etc.) for SSH. Override with **`MTK_HOST`**, or set **`MTK_AUTO_SSH_PROBE=0`** to disable TCP probes, or **`MTK_SKIP_GATEWAY_DETECT=1`** to prefer `192.168.88.1` when not on that subnet.
127
+
128
+ **Bootstrap skips (optional):** `MTK_BOOTSTRAP_SKIP_SSH_SERVICE=1` skips merging slot subnets into **`/ip service ssh address`**; `MTK_BOOTSTRAP_SKIP_INPUT_SSH=1` skips the guest/slot **input** firewall rule for SSH. **`MTK_BOOTSTRAP_TIMEOUT`** sets per-step SSH timeout seconds (default `120`).
129
+
130
+ Example site file: [examples/site.example.json](examples/site.example.json). It is a **template only** (`REPLACE_WITH_*` placeholders, fake hostnames on purpose). Copy it to a local file (e.g. `my-site.json`, add to `.gitignore`), put your **real** VPN endpoints under `vpn_registry`, your SSIDs under `slots`, and keep passwords out of the file — use `env:MTK_WIFI_PSK`, `env:MTK_VPN_USER`, `env:MTK_VPN_PASSWORD` (or inline refs only on trusted machines). The `_meta` block is documentation for humans; the SDK ignores unknown top-level keys.
131
+
132
+ ### HTTP service (optional)
133
+
134
+ After `python -m pip install -e ".[dev]"` (includes Starlette/Uvicorn):
135
+
136
+ ```bash
137
+ export MTK_HOST=… MTK_USER=admin MTK_PASSWORD=…
138
+ # optional: export MTK_SITE_CONFIG=/path/to/site.json
139
+ # optional: export MTK_SERVICE_TOKEN=secret # then send Authorization: Bearer …
140
+ mtk-serve # default port 8765, override with MTK_HTTP_PORT
141
+ ```
142
+
143
+ - `GET /` — JSON index (links to OpenAPI, dashboard, health, **readyz**, v1)
144
+ - `GET /dashboard/` — minimal operator UI (snapshot, doctor)
145
+ - `GET /openapi.json` — **OpenAPI 3.1** (core + **`/v1/*`**)
146
+ - `GET /healthz` — liveness
147
+ - `GET /readyz` — readiness (SSH discovery succeeds)
148
+ - `GET /v1/version` — SDK version
149
+ - `GET /v1/doctor` — discovery JSON (`503` if router error or missing env)
150
+ - **`/v1/...`** — see OpenAPI or [ROUTER_SDK.md §6.2](docs/ROUTER_SDK.md) (leases, bootstrap, intents, WebSocket stream, …)
151
+
152
+ ### TypeScript client
153
+
154
+ - **HTTP (browser / any `fetch`):** `clients/typescript/` — `MtkHttpClient` + `baseUrl` pointing at `mtk-serve` (`npm install && npm run build` there).
155
+ - **Node without HTTP:** `clients/node-ssh/` — `MtkSshClient` uses `MTK_*` env and SSH (`ssh2`); see `clients/node-ssh/README.md`.
156
+
157
+ ### Legacy GUI
158
+
159
+ The old CustomTkinter prototype was renamed to [`legacy_mikrotik_commander.py`](legacy_mikrotik_commander.py) so **`pyproject.toml`** owns packaging. Run it only if you still need that UI: `python legacy_mikrotik_commander.py`.
160
+
161
+ ## Quick orientation
162
+
163
+ - **Python** integrators: import `mtk_router_sdk` (`RouterClient`, `SshTransport`, parsers); CLI **`mtk`**.
164
+ - **JavaScript/TypeScript** integrators: npm **`@mtk/router-client`** (`MtkClient`) → HTTPS → service (not SSH in the browser).
165
+ - **Operators**: run **`mtk-router-service`** on a trusted LAN host; use dashboard or API with TLS + auth.
166
+
167
+ ## License
168
+
169
+ See [LICENSE](LICENSE).
@@ -0,0 +1,137 @@
1
+ # MTK Router Automation Platform
2
+
3
+ Greenfield product for **MikroTik RouterOS**: multi-slot Wi‑Fi, per-slot VPN policy routing, discovery-driven configuration, optional AI **intent** API, and operator dashboard — delivered as a **Python library**, **HTTP service**, **TypeScript SDK**, and **CLI**.
4
+
5
+ **Normative specification:** [docs/ROUTER_SDK.md](docs/ROUTER_SDK.md) (API semantics, locks, bootstrap, security model).
6
+
7
+ ## Documentation map
8
+
9
+ | Document | Audience |
10
+ |----------|----------|
11
+ | [docs/README.md](docs/README.md) | Index of all docs |
12
+ | [docs/QUICK_START.md](docs/QUICK_START.md) | **5-minute setup**: get running fast |
13
+ | [docs/EXAMPLES.md](docs/EXAMPLES.md) | **Copy-paste code**: Python, TypeScript, CLI |
14
+ | [docs/GLOSSARY.md](docs/GLOSSARY.md) | **Terms**: slots, routing marks, bootstrap, leases |
15
+ | [docs/CLI_REFERENCE.md](docs/CLI_REFERENCE.md) | **All CLI commands**: flags, options, examples |
16
+ | [docs/TROUBLESHOOTING.md](docs/TROUBLESHOOTING.md) | **Fix common issues**: connection, VPN, proxy |
17
+ | [docs/ROUTER_SDK.md](docs/ROUTER_SDK.md) | Full product & technical specification |
18
+ | [docs/USER_GUIDE.md](docs/USER_GUIDE.md) | Operators: install, configure, run |
19
+ | [docs/USE_CASES.md](docs/USE_CASES.md) | Scenario-first: doctor, bootstrap, HTTP, leases, intents, TS client |
20
+ | [docs/ADOPTION_GUIDE.md](docs/ADOPTION_GUIDE.md) | **Start here**: diagrams, Python + JS snippets, SSH vs HTTP, gaps |
21
+ | [docs/VPN_SETUP_AND_TEST.md](docs/VPN_SETUP_AND_TEST.md) | **Live VPN**: bootstrap, `vpn-debug`, `slot-vpn`, `scripts/verify_vpn_live.py` |
22
+ | [docs/PROXY_TESTING.md](docs/PROXY_TESTING.md) | **API proxy**: intercept/modify responses per-client IP, full HTTP logging, HTTPS certs |
23
+ | [docs/TESTING_SDK.md](docs/TESTING_SDK.md) | **Testing toolkit**: network simulation, DNS override, profiles, scenarios, pytest |
24
+ | [docs/PPV_TESTING_AND_MOCKING.md](docs/PPV_TESTING_AND_MOCKING.md) | **PPV / entitlement**: record-replay & proxy possibilities vs DRM and billing |
25
+ | [docs/ENVIRONMENT.md](docs/ENVIRONMENT.md) | **`MTK_*` env vars** (SSH, HTTP service, secrets, bootstrap) |
26
+ | [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) | System diagram & component boundaries |
27
+ | [docs/DEVELOPMENT.md](docs/DEVELOPMENT.md) | Contributors: repo layout, build, test |
28
+ | [docs/TESTING_GUIDE.md](docs/TESTING_GUIDE.md) | How to write and run tests |
29
+ | [docs/RELEASE_PROCESS.md](docs/RELEASE_PROCESS.md) | Versioning, tagging, publishing |
30
+ | [docs/COMPLIANCE_AND_PRIVACY.md](docs/COMPLIANCE_AND_PRIVACY.md) | Logging, capture, AI, data handling |
31
+ | [docs/AI_LOCAL_ASSISTANT.md](docs/AI_LOCAL_ASSISTANT.md) | Local LLM (Ollama), guided first-time setup |
32
+ | [docs/API_REFERENCE.md](docs/API_REFERENCE.md) | OpenAPI, SDK doc entry points |
33
+ | [docs/FEATURE_LIST.md](docs/FEATURE_LIST.md) | Complete feature inventory, gaps, quality metrics |
34
+ | [docs/ROADMAP_TESTER_FEATURES.md](docs/ROADMAP_TESTER_FEATURES.md) | **Future**: network simulation, chaos engineering, test scenarios |
35
+ | [docs/GOVERNANCE.md](docs/GOVERNANCE.md) | Maintainer / decision process |
36
+ | [docs/rfcs/](docs/rfcs/) | RFC process + templates (big design proposals) |
37
+ | [docs/adr/](docs/adr/) | ADR process + templates (record architecture choices) |
38
+ | [CONTRIBUTING.md](CONTRIBUTING.md) | How to contribute |
39
+ | [SECURITY.md](SECURITY.md) | Vulnerability reporting |
40
+ | [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md) | Community standards |
41
+ | [CHANGELOG.md](CHANGELOG.md) | Release history |
42
+ | [SUPPORT.md](SUPPORT.md) | How to get help |
43
+ | [LICENSE](LICENSE) | MIT |
44
+
45
+ ## Status
46
+
47
+ - **Specification:** [docs/ROUTER_SDK.md](docs/ROUTER_SDK.md).
48
+ - **Python SDK (alpha):** SSH transport, discovery, JSON **site** config, **bootstrap engine** (plan + `--apply`), CLI below, **pytest** suite with fakes, optional **HTTP** service (`mtk-serve`), **TypeScript** HTTP client `clients/typescript/`, optional **Node.js** direct-SSH client `clients/node-ssh/` (no `baseUrl`).
49
+ - **HTTP / REST (alpha):** Spec-style **`/v1/*`** routes on **`mtk-serve`**: discovery, **dashboard snapshot**, wireless/VPN/DHCP/policy tables, **PUT `/v1/config/slots`**, **POST `/v1/bootstrap`** (+ dry-run), **slot leases** (`reject` or **`MTK_SLOT_LOCK_MODE=fifo_queue`**), **runtime VPN** (`POST /v1/slots/{id}/vpn` + `X-Slot-Lease`), **per-client block** (`POST /v1/client/block` — firewall DROP, runtime only), **`POST /v1/ai/intent`**, **`WS /v1/stream`**, **`GET /readyz`**, **`POST/DELETE /v1/session`** (SSH target override). Optional **`MTK_SERVICE_TOKEN`** enforces **`Authorization: Bearer`**. Static **dashboard** at **`/dashboard/`**.
50
+ - **Bootstrap + wifiwave2:** Discovery records **`wireless.menu_kind`** (`wireless` | `wifi`); bootstrap uses **`/interface wifi`** security + VAP menus when the profile reports **wifiwave2** (syntax may still need tuning per board — validate on hardware).
51
+ - **OpenAPI + CI:** **`GET /openapi.json`** merges core + v1 paths; GitHub Actions runs **Python 3.10–3.12** (ruff, mypy, pytest), **`clients/typescript`** **`npm run build`**, and **`clients/node-ssh`** **`npm ci`** smoke load.
52
+ - **Still to build / polish:** slot **DELETE** / **`PATCH /v1/config`**, human-in-the-loop approvals, richer DHCP/slot analytics, **sniffer IPv6** / HTTP download of **.pcap**. **CLI** **`mtk slot-vpn`** and **`mtk sniffer`** (IPv4 filter, capture file on router) work over **SSH** without **`mtk-serve`**. The npm HTTP client stays hand-written for ergonomics; **`openapi.d.ts`** is regenerated from **`openapi.json`**; CI checks drift.
53
+
54
+ ### Install the SDK (editable)
55
+
56
+ Requires **Python 3.10 or newer** (use a single `python`/`python3` that meets that — do not run `python` with `3.10+` as if it were a script name).
57
+
58
+ ```bash
59
+ python3 -m venv .venv && source .venv/bin/activate
60
+ python -m pip install -e ".[dev]"
61
+ export MTK_HOST=192.168.88.1 MTK_USER=admin MTK_PASSWORD='your-password'
62
+ mtk doctor
63
+ ```
64
+
65
+ `mtk doctor` only applies to **MikroTik RouterOS** over SSH; if `MTK_HOST` points at another device, the CLI explains that instead of a generic failure.
66
+
67
+ ### CLI commands
68
+
69
+ | Command | Purpose |
70
+ |--------|---------|
71
+ | `mtk init-site` | Interactive wizard → writes a site JSON (`-o file.json`) with `connection`, `vpn_registry`, and `slots` explained step by step |
72
+ | `mtk doctor` | Discovery + human summary + JSON snapshot |
73
+ | `mtk doctor --site FILE` | Same, but SSH target comes from the file’s optional `connection` block (see below). **Do not** paste shell comments on the same line in **zsh** unless `setopt INTERACTIVE_COMMENTS` is on, or `# …` is passed as extra arguments. |
74
+ | `mtk interfaces` | `/interface … print terse` as JSON |
75
+ | `mtk ip` | `/ip address … print terse` as JSON |
76
+ | `mtk l2tp` | `/interface l2tp-client … print terse` as JSON (secrets redacted; **`--show-secrets`** to print raw) |
77
+ | `mtk vpn-debug [tunnel]` | L2TP print + monitor + ping + log tail — **human** sections by default; **`--json`** for machine output |
78
+ | `mtk vpn-reset [tunnel]` | Disable then enable L2TP client (drop stuck IPsec/L2TP); **`--pause SEC`** between steps |
79
+ | `mtk exec '/path …'` | One arbitrary RouterOS command; JSON with exit + stdout/stderr |
80
+ | `mtk bootstrap site.json` | Dry-run: merged plan (no changes). Add **`--apply`** to run idempotent scripts on the router (destructive — test on lab gear first). |
81
+ | `mtk slot-vpn --site FILE SLOT_ID GATEWAY` | Set policy-route **gateway** for that slot’s **routing-mark** (SSH). Or **`--ssid SSID`** instead of **`SLOT_ID`** (SSID must match an **enabled** slot in the site file). |
82
+ | `mtk sniffer start --site FILE --slot N --ip IPv4` | Start **`/tool sniffer`** with **`filter-ip-address`**; **`.pcap`** on router. Or **`--ssid SSID`** instead of **`--slot`**. See **`mtk sniffer stop`** / **`status`**. |
83
+ | `mtk client-resolve --site FILE --ip ADDR` | Print JSON: map client IP → slot (subnets in site; SSH to router for DHCP **`dhcp_<id>`** unless **`--no-ssh`**). Pairs with HTTP **`GET /v1/client/resolve`** and **`POST /v1/by-client/...`**. |
84
+ | `mtk sniffer stop` / `mtk sniffer status` | Stop sniffer or print **`/tool sniffer print`** as JSON |
85
+ | `mtk client-block block IP` | Block internet for a client (firewall DROP, runtime only, no persistence) |
86
+ | `mtk client-block unblock IP` | Remove block for a client |
87
+ | `mtk client-block list` / `status IP` | List all blocked / check one IP |
88
+ | `mtk proxy set IP PATH JSON` | Set mock API response for endpoint (per-client, like Charles Proxy) |
89
+ | `mtk proxy error IP PATH --status 500` | Simulate error response |
90
+ | `mtk proxy log` | View proxied requests with full HTTP details |
91
+
92
+ **SSH settings:** You can put an optional top-level `connection` object in the site JSON (`host`, `username`, `password_ref` or `password`, `port`, `timeout`). Values may be literals or `env:VAR`. **If both exist, environment variables win** (`MTK_HOST`, `MTK_USER`, `MTK_PASSWORD`, `MTK_PORT`, `MTK_TIMEOUT`) so production can override a file safely. **Full env reference:** [docs/ENVIRONMENT.md](docs/ENVIRONMENT.md).
93
+
94
+ **Router IP without `MTK_HOST`:** If you omit `MTK_HOST` and there is no `connection.host` in the site file, the SDK probes likely LAN routers (gateway, `192.168.88.1`, etc.) for SSH. Override with **`MTK_HOST`**, or set **`MTK_AUTO_SSH_PROBE=0`** to disable TCP probes, or **`MTK_SKIP_GATEWAY_DETECT=1`** to prefer `192.168.88.1` when not on that subnet.
95
+
96
+ **Bootstrap skips (optional):** `MTK_BOOTSTRAP_SKIP_SSH_SERVICE=1` skips merging slot subnets into **`/ip service ssh address`**; `MTK_BOOTSTRAP_SKIP_INPUT_SSH=1` skips the guest/slot **input** firewall rule for SSH. **`MTK_BOOTSTRAP_TIMEOUT`** sets per-step SSH timeout seconds (default `120`).
97
+
98
+ Example site file: [examples/site.example.json](examples/site.example.json). It is a **template only** (`REPLACE_WITH_*` placeholders, fake hostnames on purpose). Copy it to a local file (e.g. `my-site.json`, add to `.gitignore`), put your **real** VPN endpoints under `vpn_registry`, your SSIDs under `slots`, and keep passwords out of the file — use `env:MTK_WIFI_PSK`, `env:MTK_VPN_USER`, `env:MTK_VPN_PASSWORD` (or inline refs only on trusted machines). The `_meta` block is documentation for humans; the SDK ignores unknown top-level keys.
99
+
100
+ ### HTTP service (optional)
101
+
102
+ After `python -m pip install -e ".[dev]"` (includes Starlette/Uvicorn):
103
+
104
+ ```bash
105
+ export MTK_HOST=… MTK_USER=admin MTK_PASSWORD=…
106
+ # optional: export MTK_SITE_CONFIG=/path/to/site.json
107
+ # optional: export MTK_SERVICE_TOKEN=secret # then send Authorization: Bearer …
108
+ mtk-serve # default port 8765, override with MTK_HTTP_PORT
109
+ ```
110
+
111
+ - `GET /` — JSON index (links to OpenAPI, dashboard, health, **readyz**, v1)
112
+ - `GET /dashboard/` — minimal operator UI (snapshot, doctor)
113
+ - `GET /openapi.json` — **OpenAPI 3.1** (core + **`/v1/*`**)
114
+ - `GET /healthz` — liveness
115
+ - `GET /readyz` — readiness (SSH discovery succeeds)
116
+ - `GET /v1/version` — SDK version
117
+ - `GET /v1/doctor` — discovery JSON (`503` if router error or missing env)
118
+ - **`/v1/...`** — see OpenAPI or [ROUTER_SDK.md §6.2](docs/ROUTER_SDK.md) (leases, bootstrap, intents, WebSocket stream, …)
119
+
120
+ ### TypeScript client
121
+
122
+ - **HTTP (browser / any `fetch`):** `clients/typescript/` — `MtkHttpClient` + `baseUrl` pointing at `mtk-serve` (`npm install && npm run build` there).
123
+ - **Node without HTTP:** `clients/node-ssh/` — `MtkSshClient` uses `MTK_*` env and SSH (`ssh2`); see `clients/node-ssh/README.md`.
124
+
125
+ ### Legacy GUI
126
+
127
+ The old CustomTkinter prototype was renamed to [`legacy_mikrotik_commander.py`](legacy_mikrotik_commander.py) so **`pyproject.toml`** owns packaging. Run it only if you still need that UI: `python legacy_mikrotik_commander.py`.
128
+
129
+ ## Quick orientation
130
+
131
+ - **Python** integrators: import `mtk_router_sdk` (`RouterClient`, `SshTransport`, parsers); CLI **`mtk`**.
132
+ - **JavaScript/TypeScript** integrators: npm **`@mtk/router-client`** (`MtkClient`) → HTTPS → service (not SSH in the browser).
133
+ - **Operators**: run **`mtk-router-service`** on a trusted LAN host; use dashboard or API with TLS + auth.
134
+
135
+ ## License
136
+
137
+ See [LICENSE](LICENSE).
@@ -0,0 +1,85 @@
1
+ [build-system]
2
+ requires = ["setuptools>=68", "wheel"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "mtk-router-sdk"
7
+ version = "0.1.0"
8
+ description = "MikroTik RouterOS automation SDK (multi-slot VPN, discovery, bootstrap)"
9
+ readme = "README.md"
10
+ requires-python = ">=3.10"
11
+ license = { text = "MIT" }
12
+ authors = [{ name = "MTK Router Automation contributors" }]
13
+ keywords = ["mikrotik", "routeros", "network", "vpn", "automation"]
14
+ classifiers = [
15
+ "Development Status :: 3 - Alpha",
16
+ "Intended Audience :: Developers",
17
+ "License :: OSI Approved :: MIT License",
18
+ "Programming Language :: Python :: 3",
19
+ "Programming Language :: Python :: 3.10",
20
+ "Programming Language :: Python :: 3.11",
21
+ "Programming Language :: Python :: 3.12",
22
+ "Topic :: System :: Networking",
23
+ ]
24
+ dependencies = [
25
+ "paramiko>=3.4,<4",
26
+ ]
27
+
28
+ [project.optional-dependencies]
29
+ dev = [
30
+ "pytest>=7.4",
31
+ "pytest-cov>=4.1",
32
+ "ruff>=0.3",
33
+ "mypy>=1.8",
34
+ "httpx>=0.27,<0.29",
35
+ "starlette>=0.37",
36
+ "uvicorn[standard]>=0.27",
37
+ ]
38
+ service = [
39
+ "starlette>=0.37",
40
+ "uvicorn[standard]>=0.27",
41
+ ]
42
+
43
+ [project.scripts]
44
+ mtk = "mtk_router_sdk.cli:main"
45
+ mtk-serve = "mtk_router_sdk.service.main:main"
46
+
47
+ [tool.setuptools.packages.find]
48
+ where = ["src"]
49
+
50
+ [tool.setuptools.package-data]
51
+ mtk_router_sdk = [
52
+ "py.typed",
53
+ "service/static/dashboard/*.html",
54
+ "testing/dashboard_web/index.html",
55
+ "testing/dashboard_web/partials/*.html",
56
+ "testing/dashboard_web/css/*.css",
57
+ "testing/dashboard_web/js/*.js",
58
+ "testing/dashboard_web/js/*/*.js",
59
+ ]
60
+
61
+ [tool.ruff]
62
+ target-version = "py310"
63
+ line-length = 100
64
+ src = ["src", "tests"]
65
+
66
+ [tool.ruff.lint]
67
+ select = ["E", "F", "I", "UP", "B", "SIM"]
68
+
69
+ [tool.ruff.lint.per-file-ignores]
70
+ # Generated RouterOS one-liner scripts are intentionally long.
71
+ "src/mtk_router_sdk/bootstrap/engine.py" = ["E501"]
72
+ "src/mtk_router_sdk/service/openapi_paths.py" = ["E501"]
73
+
74
+ [tool.mypy]
75
+ python_version = "3.10"
76
+ strict = true
77
+ packages = ["mtk_router_sdk"]
78
+
79
+ [[tool.mypy.overrides]]
80
+ module = "paramiko.*"
81
+ ignore_missing_imports = true
82
+
83
+ [tool.pytest.ini_options]
84
+ testpaths = ["tests"]
85
+ pythonpath = ["src"]
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -0,0 +1,62 @@
1
+ """
2
+ MTK Router SDK — MikroTik RouterOS automation (modular, transport-pluggable).
3
+
4
+ Public surface kept small; subpackages expose building blocks for advanced use.
5
+ """
6
+
7
+ from importlib.metadata import PackageNotFoundError, version
8
+
9
+ from mtk_router_sdk.bootstrap import BootstrapEngine, BootstrapPlan, BootstrapStep
10
+ from mtk_router_sdk.client import RouterClient
11
+ from mtk_router_sdk.config import (
12
+ ConnectionSettings,
13
+ SiteConfig,
14
+ connection_config_from_env,
15
+ connection_config_from_merged,
16
+ load_site_config,
17
+ load_site_config_from_path,
18
+ )
19
+ from mtk_router_sdk.discovery import DiscoveryService, RouterCapabilityProfile
20
+ from mtk_router_sdk.exceptions import (
21
+ CommandExecutionError,
22
+ ConfigurationError,
23
+ ConnectionFailedError,
24
+ DiscoveryError,
25
+ MtkRouterError,
26
+ TransportClosedError,
27
+ )
28
+ from mtk_router_sdk.models import ConnectionConfig, ExecResult
29
+ from mtk_router_sdk.ros_adapter import RosCommandAdapter
30
+ from mtk_router_sdk.transport import AbstractTransport, SshTransport
31
+
32
+ try:
33
+ __version__ = version("mtk-router-sdk")
34
+ except PackageNotFoundError:
35
+ __version__ = "0.1.0"
36
+
37
+ __all__ = [
38
+ "__version__",
39
+ "AbstractTransport",
40
+ "BootstrapEngine",
41
+ "BootstrapPlan",
42
+ "BootstrapStep",
43
+ "CommandExecutionError",
44
+ "ConfigurationError",
45
+ "ConnectionConfig",
46
+ "ConnectionSettings",
47
+ "ConnectionFailedError",
48
+ "DiscoveryError",
49
+ "DiscoveryService",
50
+ "ExecResult",
51
+ "MtkRouterError",
52
+ "RosCommandAdapter",
53
+ "RouterCapabilityProfile",
54
+ "RouterClient",
55
+ "SiteConfig",
56
+ "SshTransport",
57
+ "TransportClosedError",
58
+ "connection_config_from_env",
59
+ "connection_config_from_merged",
60
+ "load_site_config",
61
+ "load_site_config_from_path",
62
+ ]
@@ -0,0 +1,5 @@
1
+ """Phased RouterOS bootstrap (VPN + Wi‑Fi slots) from site config."""
2
+
3
+ from mtk_router_sdk.bootstrap.engine import BootstrapEngine, BootstrapPlan, BootstrapStep
4
+
5
+ __all__ = ["BootstrapEngine", "BootstrapPlan", "BootstrapStep"]