@coffeerunhobby/mcp-ha-connect 2.4.8 → 2.5.1
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.
- package/.env.example +16 -1
- package/README.md +31 -5
- package/dist/config.d.ts +5 -0
- package/dist/config.js +18 -0
- package/dist/config.js.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/net/adapters/omada.d.ts +10 -1
- package/dist/net/adapters/omada.js +40 -2
- package/dist/net/adapters/omada.js.map +1 -1
- package/dist/net/adapters/ruijie.d.ts +82 -0
- package/dist/net/adapters/ruijie.js +491 -0
- package/dist/net/adapters/ruijie.js.map +1 -0
- package/dist/net/model.d.ts +30 -2
- package/dist/net/model.js.map +1 -1
- package/dist/ruijieClient/crypto.d.ts +20 -0
- package/dist/ruijieClient/crypto.js +57 -0
- package/dist/ruijieClient/crypto.js.map +1 -0
- package/dist/ruijieClient/index.d.ts +74 -0
- package/dist/ruijieClient/index.js +240 -0
- package/dist/ruijieClient/index.js.map +1 -0
- package/dist/server/common.d.ts +2 -0
- package/dist/server/common.js +2 -1
- package/dist/server/common.js.map +1 -1
- package/dist/server/http.d.ts +11 -0
- package/dist/server/http.js +25 -10
- package/dist/server/http.js.map +1 -1
- package/dist/server/stdio.d.ts +2 -0
- package/dist/server/stdio.js.map +1 -1
- package/dist/server/stream.d.ts +2 -0
- package/dist/server/stream.js +2 -1
- package/dist/server/stream.js.map +1 -1
- package/dist/tools/index.d.ts +3 -0
- package/dist/tools/index.js +9 -3
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/net/index.d.ts +14 -2
- package/dist/tools/net/index.js +84 -3
- package/dist/tools/net/index.js.map +1 -1
- package/dist/upstreams.d.ts +7 -2
- package/dist/upstreams.js +54 -2
- package/dist/upstreams.js.map +1 -1
- package/dist/utils/redact.js +1 -1
- package/dist/utils/redact.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +3 -3
package/.env.example
CHANGED
|
@@ -170,7 +170,7 @@ MCP_AUTH_SECRET=replace-with-a-random-secret-at-least-32-characters
|
|
|
170
170
|
# - Issue a distinct JWT per client (with scoped RBAC permissions) for audit
|
|
171
171
|
|
|
172
172
|
# -----------------------------------------------------------------------------
|
|
173
|
-
# Network tools (net_, with the Omada
|
|
173
|
+
# Network tools (net_, with the Omada and Ruijie plugins)
|
|
174
174
|
# -----------------------------------------------------------------------------
|
|
175
175
|
|
|
176
176
|
# LAN address(es) or host name(s) of the machine this server runs on, comma-separated
|
|
@@ -178,3 +178,18 @@ MCP_AUTH_SECRET=replace-with-a-random-secret-at-least-32-characters
|
|
|
178
178
|
# its switch port, its network's VLAN or gateway, or its internet access (rules). While this is
|
|
179
179
|
# unset, ports with devices on them are left alone.
|
|
180
180
|
# MCP_SERVER_ADDRESSES=192.168.0.18
|
|
181
|
+
|
|
182
|
+
# -----------------------------------------------------------------------------
|
|
183
|
+
# Ruijie / Reyee router (net_ tools with controller "ruijie"; read-only in 2.5.0)
|
|
184
|
+
# -----------------------------------------------------------------------------
|
|
185
|
+
|
|
186
|
+
# RUIJIE_PLUGIN_ENABLED=false
|
|
187
|
+
# The router's management address. Use https: the router's login page hides the password
|
|
188
|
+
# with a key shipped in the page, so over plain http anyone watching can read it.
|
|
189
|
+
# RUIJIE_BASE_URL=https://192.168.110.1
|
|
190
|
+
# The admin password (the username is always admin). A refused login is never retried:
|
|
191
|
+
# wrong passwords lock the router's login.
|
|
192
|
+
# RUIJIE_PASSWORD=
|
|
193
|
+
# false accepts the router's self-signed certificate (for this client only).
|
|
194
|
+
# RUIJIE_STRICT_SSL=false
|
|
195
|
+
# RUIJIE_TIMEOUT=15000
|
package/README.md
CHANGED
|
@@ -77,7 +77,7 @@ high-value questions an LLM can actually answer about your network:
|
|
|
77
77
|
> above through two tools — `omada_browse` + `omada_read` — keeping the tool-schema budget
|
|
78
78
|
> small for low-context models. See the Omada tool tables below for the full eager surface.
|
|
79
79
|
|
|
80
|
-
## Available Tools (
|
|
80
|
+
## Available Tools (83 Total)
|
|
81
81
|
|
|
82
82
|
### Home Assistant Tools (38)
|
|
83
83
|
|
|
@@ -251,11 +251,13 @@ Lets the controller enforce a schedule itself (e.g. a curfew) instead of a daily
|
|
|
251
251
|
| `omada_getSiteNtpStatus` | Get the site's NTP server configuration and status |
|
|
252
252
|
| `omada_setSiteNtpServers` | Replace the site's NTP server list (needs `CONFIGURE`; `dryRun` previews the change) |
|
|
253
253
|
|
|
254
|
-
### Vendor-neutral Network Tools (
|
|
254
|
+
### Vendor-neutral Network Tools (23)
|
|
255
255
|
|
|
256
256
|
The `net_` tools describe networks the same way for every controller vendor: one shared model, with an adapter per
|
|
257
|
-
vendor (TP-Link Omada
|
|
258
|
-
built from several objects, or unsupported (`net_capabilities`), and refuses what
|
|
257
|
+
vendor (TP-Link Omada, and Ruijie / Reyee routers read-only since 2.5.0; UniFi and MikroTik are planned). Each adapter
|
|
258
|
+
says per feature whether it is native, built from several objects, or unsupported (`net_capabilities`), and refuses what
|
|
259
|
+
it can't do instead of dropping it. With several controllers configured, every `net_` tool takes an optional
|
|
260
|
+
`controller` (`omada` or `ruijie`); without it Omada answers.
|
|
259
261
|
Every change is planned first: `dryRun` shows the steps, what they mean, which online devices would be cut off, and a
|
|
260
262
|
`basis` (a fingerprint of the change and what it read). Passing that `basis` when applying refuses the change if it
|
|
261
263
|
is another change, or the controller or those devices changed since; `allowLockout` (cutting devices off) requires it.
|
|
@@ -277,6 +279,8 @@ one is set in the controller's web UI. Reads need `QUERY`, changes `CONFIGURE`.
|
|
|
277
279
|
| `net_listPorts` | Switch ports: the networks each carries (untagged and tagged), its profile, the online devices on it, uplinks, and why a port is protected |
|
|
278
280
|
| `net_assignPort` | Set the networks a switch port carries: its untagged network (e.g. a wired IoT device's port on "IoT") and optionally tagged ones (`all`, `none` or a list); its other settings keep following its profile. Uplinks (from the controller's topology: the switch's own uplink and every network device below it), the ports the controller and this server are on (`MCP_SERVER_ADDRESSES`), link aggregation ports and ports with their own settings are refused, whatever `allowLockout` says. While where the controller or this server is can't be told, ports with devices on them are left alone. Devices that would lose their network need `allowLockout` |
|
|
279
281
|
| `net_getMdnsRepeater` / `net_setMdnsRepeater` | Whether mDNS (Bonjour) discovery is repeated between networks; switch it on or off, or change the networks (e.g. so Home Assistant discovers IoT devices). Discovery only: traffic still follows the rules |
|
|
282
|
+
| `net_listFirmware` | The firmware each network device runs and, when the vendor offers one, the newer version with its release notes and whether `net_upgradeFirmware` can install it |
|
|
283
|
+
| `net_upgradeFirmware` | **ADMIN.** Install the version the vendor offers for a device, only from the vendor's own download server; the device restarts keeping its settings, so everything behind it is offline for a few minutes (always needs a dry run first, then `allowLockout` and its `basis`). Ruijie routers only for now; on Omada firmware is listed, upgrades stay in the controller web UI |
|
|
280
284
|
|
|
281
285
|
On Omada, a network isolation flag (use a block rule instead), a "guest" network type, switching IPv6 on, and WPA2/WPA3
|
|
282
286
|
mixed mode are not available through the API and are refused. Rules are gateway ACLs (the gateway routes between the
|
|
@@ -288,6 +292,17 @@ usually set none, and a port can't be put back on its profile's). The mDNS repea
|
|
|
288
292
|
one gateway mDNS rule: create it once in the web UI (with the services to repeat), then change it here; access point
|
|
289
293
|
mDNS rules, several rules or a one-way rule are shown as `foreign` and left to the web UI.
|
|
290
294
|
|
|
295
|
+
On a Ruijie / Reyee router (2.5.0, read-only, mapped on a RG-EG105G-V3 with ReyeeOS 2.324) the `net_` list tools show
|
|
296
|
+
its LAN networks, the devices it sees on its LAN right now (named by their address lease), DHCP reservations, its
|
|
297
|
+
ports (the WAN port as the protected uplink) and its access-control rules; rules the model can't say faithfully (a
|
|
298
|
+
source "anywhere", source ports, IPv6, user groups, schedules, only some connection states, an interface restriction the
|
|
299
|
+
model can't carry, ports for TCP or UDP only) are shown as `foreign`.
|
|
300
|
+
Every change but a firmware upgrade (2.5.1: the version the router itself is offered, the same as its page's Online
|
|
301
|
+
Upgrade) is refused for now: reservations and rules come next, then networks. It talks to the router's local web
|
|
302
|
+
API with its admin password; use `https://` (the router's own login page hides the password with a key that is
|
|
303
|
+
shipped in the page, so only HTTPS really protects it). A refused login is never retried, because wrong passwords lock
|
|
304
|
+
the router's login: the Ruijie tools then refuse until the setting is fixed and the server restarted.
|
|
305
|
+
|
|
291
306
|
### AI Tools (1)
|
|
292
307
|
|
|
293
308
|
| Tool | Description |
|
|
@@ -363,7 +378,8 @@ mDNS rules, several rules or a one-way rule are shown as `foreign` and left to t
|
|
|
363
378
|
### Optional - Chat face (OpenAPI/REST surface)
|
|
364
379
|
|
|
365
380
|
The server also serves an OpenAPI/REST face (`/openapi.json` + `/api/*`) for chat UIs
|
|
366
|
-
like Open WebUI.
|
|
381
|
+
like Open WebUI. `/openapi.json` needs no token, so it is served on the LAN only: a request that came through
|
|
382
|
+
Cloudflare (it carries `CF-Connecting-IP` or `CF-Ray`) gets a 404, so point the chat UI at the server's LAN address. By default it exposes the classic 8 Home Assistant tools. Tools marked
|
|
367
383
|
chat-eligible in code can be activated per category with read/write granularity:
|
|
368
384
|
|
|
369
385
|
| Variable | Default | Description |
|
|
@@ -485,6 +501,16 @@ Clients only see the tools they may use: `tools/list` is filtered by the caller'
|
|
|
485
501
|
| `OMADA_TIMEOUT` | `30000` | API request timeout (ms) |
|
|
486
502
|
| `MCP_SERVER_ADDRESSES` | - | LAN address(es) or host name(s) of the machine this server runs on, comma-separated (for Docker: the host's LAN address). The `net_` tools protect it like the controller: never its switch port, its network's VLAN or gateway, or its internet access (rules). While unset, ports with devices on them are left alone |
|
|
487
503
|
|
|
504
|
+
### Optional - Ruijie / Reyee Router
|
|
505
|
+
|
|
506
|
+
| Variable | Default | Description |
|
|
507
|
+
|----------|---------|-------------|
|
|
508
|
+
| `RUIJIE_PLUGIN_ENABLED` | `false` | Enable the Ruijie router (its `net_` tools take `controller: "ruijie"`) |
|
|
509
|
+
| `RUIJIE_BASE_URL` | - | The router's management address, e.g. `https://192.168.110.1` (use https: over plain http its password can be read on the wire) |
|
|
510
|
+
| `RUIJIE_PASSWORD` | - | The router's admin password (the username is always `admin`). Never retried when refused: wrong passwords lock the router's login |
|
|
511
|
+
| `RUIJIE_STRICT_SSL` | `true` | Validate the router's certificate; `false` accepts its self-signed one (this client only) |
|
|
512
|
+
| `RUIJIE_TIMEOUT` | `15000` | Request timeout (ms) |
|
|
513
|
+
|
|
488
514
|
## Advanced Configuration Examples
|
|
489
515
|
|
|
490
516
|
### With AI Analysis (Ollama)
|
package/dist/config.d.ts
CHANGED
|
@@ -6,6 +6,7 @@ export interface EnvironmentConfig {
|
|
|
6
6
|
haPluginEnabled: boolean;
|
|
7
7
|
aiPluginEnabled: boolean;
|
|
8
8
|
omadaPluginEnabled: boolean;
|
|
9
|
+
ruijiePluginEnabled: boolean;
|
|
9
10
|
baseUrl?: string;
|
|
10
11
|
token?: string;
|
|
11
12
|
strictSsl: boolean;
|
|
@@ -19,6 +20,10 @@ export interface EnvironmentConfig {
|
|
|
19
20
|
requestTimeout?: number;
|
|
20
21
|
/** LAN addresses or host names of the machine this server runs on (MCP_SERVER_ADDRESSES); empty when not set. */
|
|
21
22
|
serverAddresses: string[];
|
|
23
|
+
ruijieBaseUrl?: string;
|
|
24
|
+
ruijiePassword?: string;
|
|
25
|
+
ruijieStrictSsl: boolean;
|
|
26
|
+
ruijieTimeout?: number;
|
|
22
27
|
aiProvider: AIProviderType;
|
|
23
28
|
aiUrl: string;
|
|
24
29
|
aiModel: string;
|
package/dist/config.js
CHANGED
|
@@ -23,6 +23,7 @@ const envSchema = z
|
|
|
23
23
|
haPluginEnabled: createBooleanStringSchema(false),
|
|
24
24
|
aiPluginEnabled: createBooleanStringSchema(false),
|
|
25
25
|
omadaPluginEnabled: createBooleanStringSchema(false),
|
|
26
|
+
ruijiePluginEnabled: createBooleanStringSchema(false),
|
|
26
27
|
// Home Assistant Client Configuration (optional if using Omada only)
|
|
27
28
|
haUrl: z.string().url({ message: 'HA_URL must be a valid URL' }).optional(),
|
|
28
29
|
haToken: z.string().min(1).optional(),
|
|
@@ -38,6 +39,11 @@ const envSchema = z
|
|
|
38
39
|
omadaTimeout: numericStringSchema,
|
|
39
40
|
// LAN address(es) of the machine this server runs on, comma-separated (its switch port is never reassigned)
|
|
40
41
|
serverAddresses: z.string().optional(),
|
|
42
|
+
// Ruijie / Reyee router (local eWeb API; optional)
|
|
43
|
+
ruijieBaseUrl: z.string().url({ message: 'RUIJIE_BASE_URL must be a valid URL' }).optional(),
|
|
44
|
+
ruijiePassword: z.string().min(1).optional(),
|
|
45
|
+
ruijieStrictSsl: createBooleanStringSchema(true),
|
|
46
|
+
ruijieTimeout: numericStringSchema,
|
|
41
47
|
// Pre-registered REST actions for the invokeAction tool (optional; raw JSON,
|
|
42
48
|
// parsed + validated by parseRestActions after the env parse)
|
|
43
49
|
restActions: z.string().optional(),
|
|
@@ -152,6 +158,7 @@ export function loadConfig(env = process.env) {
|
|
|
152
158
|
haPluginEnabled: env.HA_PLUGIN_ENABLED,
|
|
153
159
|
aiPluginEnabled: env.AI_PLUGIN_ENABLED,
|
|
154
160
|
omadaPluginEnabled: env.OMADA_PLUGIN_ENABLED,
|
|
161
|
+
ruijiePluginEnabled: env.RUIJIE_PLUGIN_ENABLED,
|
|
155
162
|
// Home Assistant Client Configuration
|
|
156
163
|
haUrl: env.HA_URL,
|
|
157
164
|
haToken: env.HA_TOKEN,
|
|
@@ -166,6 +173,11 @@ export function loadConfig(env = process.env) {
|
|
|
166
173
|
omadaStrictSsl: env.OMADA_STRICT_SSL,
|
|
167
174
|
omadaTimeout: env.OMADA_TIMEOUT,
|
|
168
175
|
serverAddresses: env.MCP_SERVER_ADDRESSES,
|
|
176
|
+
// Ruijie / Reyee router
|
|
177
|
+
ruijieBaseUrl: env.RUIJIE_BASE_URL,
|
|
178
|
+
ruijiePassword: env.RUIJIE_PASSWORD,
|
|
179
|
+
ruijieStrictSsl: env.RUIJIE_STRICT_SSL,
|
|
180
|
+
ruijieTimeout: env.RUIJIE_TIMEOUT,
|
|
169
181
|
// Pre-registered REST actions
|
|
170
182
|
restActions: env.MCP_REST_ACTIONS,
|
|
171
183
|
// Chat-face tool slice
|
|
@@ -236,6 +248,7 @@ export function loadConfig(env = process.env) {
|
|
|
236
248
|
haPluginEnabled: parsed.data.haPluginEnabled,
|
|
237
249
|
aiPluginEnabled: parsed.data.aiPluginEnabled,
|
|
238
250
|
omadaPluginEnabled: parsed.data.omadaPluginEnabled,
|
|
251
|
+
ruijiePluginEnabled: parsed.data.ruijiePluginEnabled,
|
|
239
252
|
// Home Assistant Client Configuration (optional)
|
|
240
253
|
baseUrl: parsed.data.haUrl?.replace(/\/$/, ''),
|
|
241
254
|
token: parsed.data.haToken,
|
|
@@ -250,6 +263,11 @@ export function loadConfig(env = process.env) {
|
|
|
250
263
|
omadaStrictSsl: parsed.data.omadaStrictSsl,
|
|
251
264
|
requestTimeout: parsed.data.omadaTimeout,
|
|
252
265
|
serverAddresses: (parsed.data.serverAddresses ?? '').split(',').map((a) => a.trim()).filter((a) => a !== ''),
|
|
266
|
+
// Ruijie / Reyee router (optional)
|
|
267
|
+
ruijieBaseUrl: parsed.data.ruijieBaseUrl?.replace(/\/$/, ''),
|
|
268
|
+
ruijiePassword: parsed.data.ruijiePassword,
|
|
269
|
+
ruijieStrictSsl: parsed.data.ruijieStrictSsl,
|
|
270
|
+
ruijieTimeout: parsed.data.ruijieTimeout,
|
|
253
271
|
// Pre-registered REST actions (throws on malformed JSON — config typos fail loudly)
|
|
254
272
|
restActions: parseRestActions(parsed.data.restActions),
|
|
255
273
|
// Chat-face tool slice (throws on unknown category/access — typos fail loudly)
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -27,15 +27,16 @@ async function main() {
|
|
|
27
27
|
});
|
|
28
28
|
// Connect the upstreams. One that doesn't answer yet doesn't stop the server:
|
|
29
29
|
// it is retried in the background (see upstreams.ts).
|
|
30
|
-
const { haClient, omadaClient, aiClient } = await connectUpstreams(config);
|
|
30
|
+
const { haClient, omadaClient, ruijieClient, aiClient } = await connectUpstreams(config);
|
|
31
31
|
// Start server in appropriate mode
|
|
32
32
|
if (config.useHttp) {
|
|
33
|
-
await startHttpServer({ haClient, omadaClient, aiClient, config });
|
|
33
|
+
await startHttpServer({ haClient, omadaClient, ruijieClient, aiClient, config });
|
|
34
34
|
}
|
|
35
35
|
else {
|
|
36
36
|
await startStdioServer({
|
|
37
37
|
haClient,
|
|
38
38
|
omadaClient,
|
|
39
|
+
ruijieClient,
|
|
39
40
|
aiClient,
|
|
40
41
|
restActions: config.restActions,
|
|
41
42
|
toolRegistrationMode: config.toolRegistrationMode,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC;QACH,kCAAkC;QAClC,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAE5B,sGAAsG;QACtG,MAAM,SAAS,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC;QAElC,qEAAqE;QACrE,UAAU,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAEzD,MAAM,CAAC,IAAI,CAAC,mBAAmB,OAAO,WAAW,CAAC,CAAC;QACnD,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE;YAClC,eAAe,EAAE,MAAM,CAAC,eAAe;YACvC,eAAe,EAAE,MAAM,CAAC,eAAe;YACvC,kBAAkB,EAAE,MAAM,CAAC,kBAAkB;YAC7C,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB,CAAC,CAAC;QAEH,8EAA8E;QAC9E,sDAAsD;QACtD,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,MAAM,gBAAgB,CAAC,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
* - Omada lists every SSID again under a pseudo WLAN group "gateway" without detail.
|
|
16
16
|
*/
|
|
17
17
|
import type { OmadaClient } from '../../omadaClient/index.js';
|
|
18
|
-
import { type ApplyResult, type Capabilities, type Change, type Client, type Group, type MdnsRepeater, type Network, type NetworkController, type Plan, type Port, type PortProfile, type PortRef, type ProtectedResources, type Reservation, type Rule, type Wifi } from '../model.js';
|
|
18
|
+
import { type ApplyResult, type Capabilities, type Change, type Client, type Group, type Firmware, type MdnsRepeater, type Network, type NetworkController, type Plan, type Port, type PortProfile, type PortRef, type ProtectedResources, type Reservation, type Rule, type Wifi } from '../model.js';
|
|
19
19
|
export interface OmadaAdapterOptions {
|
|
20
20
|
siteId?: string;
|
|
21
21
|
/** The controller's host name or address (host of OMADA_BASE_URL): its network is protected. */
|
|
@@ -64,6 +64,8 @@ export declare class OmadaNetworkController implements NetworkController {
|
|
|
64
64
|
listPorts(device?: PortRef['device']): Promise<Port[]>;
|
|
65
65
|
listRules(): Promise<Rule[]>;
|
|
66
66
|
listGroups(kind?: Group['kind']): Promise<Group[]>;
|
|
67
|
+
/** The running firmware of every adopted device; whether a newer one exists isn't read here (the controller has to check first). */
|
|
68
|
+
listFirmware(): Promise<Firmware[]>;
|
|
67
69
|
getMdnsRepeater(): Promise<MdnsRepeater>;
|
|
68
70
|
private portWorld;
|
|
69
71
|
/** For each network, the devices whose ports carry it. */
|
|
@@ -150,6 +152,13 @@ export declare class OmadaNetworkController implements NetworkController {
|
|
|
150
152
|
/** Everything that still references a network: SSIDs, port profiles, switch ports carrying it untagged, DHCP reservations, ACL rules. */
|
|
151
153
|
private networkUsers;
|
|
152
154
|
private buildWifiCreate;
|
|
155
|
+
/**
|
|
156
|
+
* Which devices broadcast a new SSID (bit 0 = access points, bit 1 = the gateway): the access
|
|
157
|
+
* points when the site has any, the gateway only when it reports a radio (wirelessRouter).
|
|
158
|
+
* Never copied from another SSID: an SSID put on a gateway without Wi-Fi can't be saved in the
|
|
159
|
+
* web UI (live, ER605, 2026-10-21). The gateway's details come with a network's port list.
|
|
160
|
+
*/
|
|
161
|
+
private wifiDeviceType;
|
|
153
162
|
private buildWifiUpdate;
|
|
154
163
|
private buildWifiDelete;
|
|
155
164
|
private macFilterBody;
|
|
@@ -112,6 +112,7 @@ export class OmadaNetworkController {
|
|
|
112
112
|
groups: { address: 'unsupported', mac: 'unsupported' },
|
|
113
113
|
reservations: 'native',
|
|
114
114
|
mdnsRepeater: 'native',
|
|
115
|
+
firmware: 'unsupported',
|
|
115
116
|
};
|
|
116
117
|
}
|
|
117
118
|
// ---- reads -----------------------------------------------------------------------
|
|
@@ -336,6 +337,20 @@ export class OmadaNetworkController {
|
|
|
336
337
|
}));
|
|
337
338
|
return kind === 'address' ? address : kind === 'mac' ? mac : [...address, ...mac];
|
|
338
339
|
}
|
|
340
|
+
/** The running firmware of every adopted device; whether a newer one exists isn't read here (the controller has to check first). */
|
|
341
|
+
async listFirmware() {
|
|
342
|
+
const devices = await this.client.listDevices(this.client.resolveSiteId(this.options.siteId));
|
|
343
|
+
return devices.map((d) => {
|
|
344
|
+
const raw = d;
|
|
345
|
+
return {
|
|
346
|
+
device: { mac: formatMac(String(raw.mac)) },
|
|
347
|
+
...(typeof raw.name === 'string' ? { name: raw.name } : {}),
|
|
348
|
+
...(typeof raw.model === 'string' ? { model: raw.model } : {}),
|
|
349
|
+
current: String(raw.firmwareVersion ?? 'unknown'),
|
|
350
|
+
upgradable: false,
|
|
351
|
+
};
|
|
352
|
+
});
|
|
353
|
+
}
|
|
339
354
|
async getMdnsRepeater() {
|
|
340
355
|
return toMdns(await this.client.networkConfig.listMdnsRules(this.options.siteId)).repeater;
|
|
341
356
|
}
|
|
@@ -657,6 +672,9 @@ export class OmadaNetworkController {
|
|
|
657
672
|
throw unsupported('creating or deleting port profiles here (do it in the controller web UI)', 'ports.profiles');
|
|
658
673
|
case 'mdnsRepeater':
|
|
659
674
|
return await this.buildMdnsSet(change.enabled, change.networks, snap);
|
|
675
|
+
case 'firmware':
|
|
676
|
+
// The Open API can (start-online-upgrade), but it isn't live-tested here yet.
|
|
677
|
+
throw new NetError('UNSUPPORTED', 'Upgrading Omada firmware through the net_ tools is not available yet; use the controller web UI (Devices > upgrade).', { capability: 'firmware' });
|
|
660
678
|
case 'rule':
|
|
661
679
|
if (change.op === 'create')
|
|
662
680
|
return this.buildRuleCreate(change.value, snap);
|
|
@@ -1284,11 +1302,11 @@ export class OmadaNetworkController {
|
|
|
1284
1302
|
const wlanId = snap.ssids[0]?.wlanId ?? (await this.client.networkConfig.listSsidSummaries(snap.siteId)).find((w) => w.wlanId !== PSEUDO_WLAN_ID)?.wlanId;
|
|
1285
1303
|
if (!wlanId)
|
|
1286
1304
|
throw new NetError('NOT_FOUND', 'No WLAN group to add the Wi-Fi network to');
|
|
1287
|
-
const template = snap.ssids[0]?.detail;
|
|
1288
1305
|
const macFilter = value.macFilter ? await this.macFilterBody(value.macFilter, snap) : undefined;
|
|
1306
|
+
const deviceType = await this.wifiDeviceType(snap);
|
|
1289
1307
|
const body = {
|
|
1290
1308
|
name,
|
|
1291
|
-
deviceType
|
|
1309
|
+
deviceType,
|
|
1292
1310
|
band: bandBits(checkBands(value.bands)),
|
|
1293
1311
|
guestNetEnable: value.clientIsolation,
|
|
1294
1312
|
broadcast: !value.hidden,
|
|
@@ -1317,6 +1335,8 @@ export class OmadaNetworkController {
|
|
|
1317
1335
|
],
|
|
1318
1336
|
wouldLockOut: [],
|
|
1319
1337
|
reads: { networks: true, ssids: true, macGroups: macFilter !== undefined },
|
|
1338
|
+
// Which devices broadcast it: a change (an access point added, another gateway) is a CONFLICT.
|
|
1339
|
+
extra: { deviceType },
|
|
1320
1340
|
execute: async (s) => {
|
|
1321
1341
|
await this.client.networkConfig.createSsid(wlanId, body, s.siteId);
|
|
1322
1342
|
const created = (await this.client.networkConfig.listSsidSummaries(s.siteId))
|
|
@@ -1338,6 +1358,24 @@ export class OmadaNetworkController {
|
|
|
1338
1358
|
},
|
|
1339
1359
|
};
|
|
1340
1360
|
}
|
|
1361
|
+
/**
|
|
1362
|
+
* Which devices broadcast a new SSID (bit 0 = access points, bit 1 = the gateway): the access
|
|
1363
|
+
* points when the site has any, the gateway only when it reports a radio (wirelessRouter).
|
|
1364
|
+
* Never copied from another SSID: an SSID put on a gateway without Wi-Fi can't be saved in the
|
|
1365
|
+
* web UI (live, ER605, 2026-10-21). The gateway's details come with a network's port list.
|
|
1366
|
+
*/
|
|
1367
|
+
async wifiDeviceType(snap) {
|
|
1368
|
+
const devices = await this.client.listDevices(snap.siteId);
|
|
1369
|
+
const hasAccessPoints = devices.some((d) => d.type === 'ap');
|
|
1370
|
+
const first = snap.networks[0];
|
|
1371
|
+
const entries = devices.some((d) => d.type === 'gateway') && first ? await this.client.networkConfig.listNetworkPorts(first.id, first.vlan, snap.siteId) : [];
|
|
1372
|
+
const gatewayWifi = entries.some((e) => e.type === 'gateway' && e.gatewayInfo?.gatewayDetail?.wirelessRouter === true);
|
|
1373
|
+
const deviceType = (hasAccessPoints ? 1 : 0) + (gatewayWifi ? 2 : 0);
|
|
1374
|
+
if (deviceType === 0) {
|
|
1375
|
+
throw new NetError('UNSUPPORTED', 'Nothing could broadcast this Wi-Fi network: the site has no access point and the gateway has no Wi-Fi', { capability: 'wifi.create' });
|
|
1376
|
+
}
|
|
1377
|
+
return deviceType;
|
|
1378
|
+
}
|
|
1341
1379
|
async buildWifiUpdate(ref, set, passphrase, snap) {
|
|
1342
1380
|
const ssid = resolveSsid(snap.ssids, ref);
|
|
1343
1381
|
const groups = snap.macGroups;
|