From c3172a04b1afea2c4355ed7754650c8e484bfa32 Mon Sep 17 00:00:00 2001 From: SerinaNya <34389622+SerinaNya@users.noreply.github.com> Date: Thu, 27 Aug 2026 23:19:53 +0800 Subject: [PATCH 1/3] refactor(web)!: remove obsolete interfaces endpoint --- AGENTS.md | 6 ++-- dashboard | 2 +- .../network/klalb/web/KLALBWebServer.java | 32 ++----------------- 3 files changed, 7 insertions(+), 33 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 5c9ebac..16377ee 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -39,7 +39,7 @@ No test suite, no CI. Classes named `*Test*` (`nathole/`, `ntp/`) are manual `ma - Entrypoint `org.kne.cloud.network.klalb.KLALBMain`: load config → build `KLALBProxySystem` → open Swing GUI (`KLALBStateGUI3`) unless `"nogui": true` → start `KLALBWebServer` (if `"webUI": true` or web server enabled, default port `4665`) → interactive console (`help`, `links-state`, `route`, `kperf`, ...). - `org.kne.cloud.network.klalb.web.KLALBWebServer` — built-in HTTP/SSE server (JDK `HttpServer`): - - API endpoints: `/api/status`, `/api/events` (SSE stream, 200ms intervals), `/api/links`, `/api/links/action`, `/api/links/reconnect`, `/api/routes`, `/api/nodes` (topology graph), `/api/interfaces`, `/api/config`. + - API endpoints: `/api/status`, `/api/events` (SSE stream, 200ms intervals), `/api/links`, `/api/links/action`, `/api/links/reconnect`, `/api/routing-table`, `/api/nodes` (topology graph), `/api/node-info?address=` (on-demand full node info), `/api/config`. - Static file hosting / SPA fallback: serves `dashboard/dist/` assets directly. - `org.kne.cloud.network` — generic socket framework: `VirtualSocket*` hierarchy, `SocketBridge` port-forwarding proxies, `ProtocolDetector` (multi-protocol mux on one port), `MultiProtocolSocketAddress` = URI-style addresses (`tcp://`, `udp://`, `kltp://`, `ntp://`) dispatched through the `SocketType` registry. - `...network.klalb` — app core: `KLALBController` (the virtual SRv6 network), `KLALBRemoteLink` (WAN lines), `*Packet` wire-format classes, virtual socket implementations. @@ -59,7 +59,7 @@ No test suite, no CI. Classes named `*Test*` (`nathole/`, `ntp/`) are manual `ma Located in `dashboard/`: - **Git layout**: `dashboard/` is a separate git repo wired in as a submodule (own origin on `git.code.cq.cn`). Commit frontend changes inside `dashboard/` first, then bump the submodule pointer in the parent repo — parent-repo commits alone do not capture them. - **Stack**: Vite + React 19 + TypeScript + Tailwind CSS v4 + `@base-ui/react` (style: `base-nova`, icons: `lucide-react`, toasts: `@base-ui/react/toast`). -- **Routing**: Hash-based routing (`#/overview`, `#/connections`, `#/topology`, `#/settings`, etc.) for seamless SPA hosting under Java `KLALBWebServer`. +- **Routing**: Hash-based routing (`#/overview`, `#/connections`, `#/routing-table`, `#/topology`, `#/settings`) for seamless SPA hosting under Java `KLALBWebServer`. - **Package Manager**: `pnpm` (run all commands from `dashboard/` directory). - **Component installation**: **Must** use CLI via `pnpm dlx shadcn@latest add ` (e.g. `pnpm dlx shadcn@latest add alert card badge toast`). Never create or fake shadcn components manually. Non-shadcn libs (`@xyflow/react`, `d3-force`) are installed via plain `pnpm add`. - **Commands**: @@ -69,7 +69,9 @@ Located in `dashboard/`: - **Pages & data flow**: - Overview / Connections read the SSE stream (`use-klalb-sse.ts`, 200ms pushes of status + links). - Settings loads/saves `/api/config` (`use-klalb-config.ts`); save payload must keep legacy field aliases alongside new names for compatibility. + - Routing table polls `/api/routing-table` every 1s (`use-routing-table.ts`); `cost` is delay-derived and displayed in milliseconds. - Topology polls `/api/nodes` every 1s (`use-topology.ts`) — SSE does NOT carry topology. + - Selecting a topology node queries `/api/node-info`; remote node descriptions require a full SRv6 node-info request and can time out after 3s. - Topology layout: `d3-force` headless simulation (recomputed only when node/edge structure changes) rendered by `@xyflow/react` with custom `device-node` / `link-edge` components in `src/components/topology/`. - React hooks lint rule forbids `setState` synchronously inside effects — initialize form state via component `key` remount + lazy `useState(() => ...)` initializers (see `SettingsForm` pattern). diff --git a/dashboard b/dashboard index ad94d2c..89474b9 160000 --- a/dashboard +++ b/dashboard @@ -1 +1 @@ -Subproject commit ad94d2c2747b851546ed1a07d8df505bfda87b15 +Subproject commit 89474b9e91791b8efe098a13171e6ff962ad7ba1 diff --git a/src/org/kne/cloud/network/klalb/web/KLALBWebServer.java b/src/org/kne/cloud/network/klalb/web/KLALBWebServer.java index 19d7f71..d967389 100644 --- a/src/org/kne/cloud/network/klalb/web/KLALBWebServer.java +++ b/src/org/kne/cloud/network/klalb/web/KLALBWebServer.java @@ -68,10 +68,9 @@ public class KLALBWebServer { server.createContext("/api/links", this::handleLinks); server.createContext("/api/links/action", this::handleLinkAction); server.createContext("/api/links/reconnect", this::handleReconnectAll); - server.createContext("/api/routes", this::handleRoutes); + server.createContext("/api/routing-table", this::handleRoutingTable); server.createContext("/api/nodes", this::handleNodes); server.createContext("/api/node-info", this::handleNodeInfo); - server.createContext("/api/interfaces", this::handleInterfaces); server.createContext("/api/config", this::handleConfig); // Static Files / SPA Fallback Handler @@ -429,7 +428,7 @@ public class KLALBWebServer { } } - private void handleRoutes(HttpExchange exchange) throws IOException { + private void handleRoutingTable(HttpExchange exchange) throws IOException { if (handleCorsPreflight(exchange)) return; if (!"GET".equalsIgnoreCase(exchange.getRequestMethod())) { sendError(exchange, 405, "Method not allowed"); @@ -633,33 +632,6 @@ public class KLALBWebServer { sendJsonResponse(exchange, 200, result); } - private void handleInterfaces(HttpExchange exchange) throws IOException { - if (handleCorsPreflight(exchange)) return; - if (!"GET".equalsIgnoreCase(exchange.getRequestMethod())) { - sendError(exchange, 405, "Method not allowed"); - return; - } - - KLALBController kc = proxySystem.getKlalbController(); - JsonArray ifacesArray = new JsonArray(); - if (kc != null && kc.getNetworkInterfaceManager() != null) { - List ifaces = kc.getNetworkInterfaceManager().getAllAvaliableNetworkInterface(); - for (NetworkInterface nif : ifaces) { - JsonObject obj = new JsonObject(); - obj.addProperty("name", nif.getName()); - obj.addProperty("displayName", nif.getDisplayName()); - JsonArray ips = new JsonArray(); - List addrs = kc.getNetworkInterfaceManager().getNetworkInterfaceAddress(nif); - for (InetAddress a : addrs) { - ips.add(new JsonPrimitive(a.getHostAddress())); - } - obj.add("addresses", ips); - ifacesArray.add(obj); - } - } - sendJsonResponse(exchange, 200, ifacesArray); - } - private void handleConfig(HttpExchange exchange) throws IOException { if (handleCorsPreflight(exchange)) return; String method = exchange.getRequestMethod(); -- 2.39.5 From ed9442385597df2d5a2f1369c61eab5a6f5f3420 Mon Sep 17 00:00:00 2001 From: SerinaNya <34389622+SerinaNya@users.noreply.github.com> Date: Fri, 28 Aug 2026 16:53:37 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=F0=9F=9A=91=20recover=20fastcopy.dll?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fastcopy.dll | Bin 0 -> 12288 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 fastcopy.dll diff --git a/fastcopy.dll b/fastcopy.dll new file mode 100644 index 0000000000000000000000000000000000000000..7e08bef3e9171f2b4ff9a4e72bc52a94eec57e2c GIT binary patch literal 12288 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 Date: Fri, 28 Aug 2026 17:00:40 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=F0=9F=99=88=20add=20omo-slim=20files=20to?= =?UTF-8?q?=20.gitignore?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 5b3692f..a5a279e 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,5 @@ dashboard/.env.*.local /klalb-config.json /klalbconfig-old.json + +/.slim/ \ No newline at end of file -- 2.39.5