Selaa lähdekoodia

完成webui->网络连接 页面的所有功能

niujiuru 2 viikkoa sitten
vanhempi
commit
19fb7985a1

+ 1 - 1
web-ui.service/web/static/js/page1.js

@@ -1,5 +1,5 @@
 function initPage1() {
 }
 
-function destroyPage1() {
+function exitPage1() {
 }

+ 50 - 1
web-ui.service/web/static/js/page2.js

@@ -171,7 +171,55 @@ function restartNetService() {
   });
 }
 
+let netStatusTimer = null;
+function getNetworkStatus() {
+  fetch("/api/network/status")
+    .then(async r => {
+      if (!r.ok) {
+        throw new Error("HTTP " + r.status);
+      }
+
+      return r.json();
+    })
+    .then(data => {
+      document.getElementById("var1").textContent = data.var1 || "--";
+      document.getElementById("var2").textContent = data.var2 || "--";
+      document.getElementById("var3").textContent = data.var3 || "--";
+      document.getElementById("var4").textContent = data.var4 || "--";
+      document.getElementById("var5").textContent = data.var5 || "--";
+    })
+    .catch(e => {
+      console.error("network status failed:", e);
+
+      document.getElementById("var1").textContent = "--";
+      document.getElementById("var2").textContent = "--";
+      document.getElementById("var3").textContent = "--";
+      document.getElementById("var4").textContent = "--";
+      document.getElementById("var5").textContent = "--";
+    });
+}
+
+function startNetStatusRefresh() {
+  if (netStatusTimer) {
+    return;
+  }
+
+  getNetworkStatus();
+
+  netStatusTimer = setInterval(() => {
+    getNetworkStatus();
+  }, 5000);
+}
+
+function stopNetStatusRefresh() {
+  if (netStatusTimer) {
+    clearInterval(netStatusTimer);
+    netStatusTimer = null;
+  }
+}
+
 function initPage2() {
+  startNetStatusRefresh();
   getNetInfo1();
   getNetInfo2();
   getNetInfo3();
@@ -179,6 +227,7 @@ function initPage2() {
   connectLog("yfkj-networkd.service", "text4");
 }
 
-function destroyPage2() {
+function exitPage2() {
+  stopNetStatusRefresh();
   disconnectLog();
 }

+ 1 - 1
web-ui.service/web/static/js/page3.js

@@ -1,5 +1,5 @@
 function initPage3() {
 }
 
-function destroyPage3() {
+function exitPage3() {
 }

+ 1 - 1
web-ui.service/web/static/js/page4.js

@@ -1,5 +1,5 @@
 function initPage4() {
 }
 
-function destroyPage4() {
+function exitPage4() {
 }

+ 1 - 1
web-ui.service/web/static/js/page5.js

@@ -1,5 +1,5 @@
 function initPage5() {
 }
 
-function destroyPage5() {
+function exitPage5() {
 }

+ 1 - 1
web-ui.service/web/static/js/page6.js

@@ -1,5 +1,5 @@
 function initPage6() {
 }
 
-function destroyPage6() {
+function exitPage6() {
 }

+ 1 - 1
web-ui.service/web/static/js/page7.js

@@ -1,5 +1,5 @@
 function initPage7() {
 }
 
-function destroyPage7() {
+function exitPage7() {
 }

+ 1 - 1
web-ui.service/web/static/js/page8.js

@@ -1,5 +1,5 @@
 function initPage8() {
 }
 
-function destroyPage8() {
+function exitPage8() {
 }

+ 3 - 3
web-ui.service/web/static/js/router.js

@@ -15,7 +15,7 @@ const pageHandlers = {
   page1: {},
   page2: {
     init: () => window.initPage2?.(),
-    destroy: () => window.destroyPage2?.()
+    exit: () => window.exitPage2?.()
   },
   page3: {},
   page4: {},
@@ -67,8 +67,8 @@ async function loadPage(name) {
     const temp = document.createElement("div");
     temp.innerHTML = html;
 
-    if (currentPage && pageHandlers[currentPage]?.destroy) {
-      pageHandlers[currentPage].destroy();
+    if (currentPage && pageHandlers[currentPage]?.exit) {
+      pageHandlers[currentPage].exit();
     }
 
     clearOldScripts();

+ 64 - 9
web-ui.service/web_handler.go

@@ -2,6 +2,7 @@ package main
 
 import (
 	"bufio"
+	"context"
 	"encoding/json"
 	"fmt"
 	"io/fs"
@@ -210,7 +211,21 @@ func netDNS(w http.ResponseWriter, r *http.Request) {
 	runShellAndWrite(w, "cat /etc/resolv.conf")
 }
 
-func callLocalRPC(w http.ResponseWriter, r *http.Request, port int, method string, params any) {
+func callRPCResult(ctx context.Context, port int, method string, params any, result any) error {
+	client, err := jsonrpc2.NewRPCClient(fmt.Sprintf("http://127.0.0.1:%d/rpc", port))
+	if err != nil {
+		return err
+	}
+
+	resp, err := client.Call(ctx, method, params)
+	if err != nil {
+		return err
+	}
+
+	return json.Unmarshal(resp.Result, result)
+}
+
+func callRPCResponse(w http.ResponseWriter, r *http.Request, port int, method string, params any) {
 	client, err := jsonrpc2.NewRPCClient(fmt.Sprintf("http://127.0.0.1:%d/rpc", port))
 	if err != nil {
 		http.Error(w, err.Error(), http.StatusInternalServerError)
@@ -230,7 +245,7 @@ func callLocalRPC(w http.ResponseWriter, r *http.Request, port int, method strin
 func serviceLogLevel(w http.ResponseWriter, r *http.Request, port int) {
 	switch r.Method {
 	case http.MethodGet:
-		callLocalRPC(w, r, port, "basic.getLogLevel", nil)
+		callRPCResponse(w, r, port, "basic.getLogLevel", nil)
 
 	case http.MethodPost:
 		var req struct {
@@ -242,7 +257,7 @@ func serviceLogLevel(w http.ResponseWriter, r *http.Request, port int) {
 			return
 		}
 
-		callLocalRPC(w, r, port, "basic.setLogLevel", map[string]string{"log_level": req.Level})
+		callRPCResponse(w, r, port, "basic.setLogLevel", map[string]string{"log_level": req.Level})
 
 	default:
 		http.Error(w, "method not allowed", http.StatusMethodNotAllowed)
@@ -256,17 +271,34 @@ func serviceLogLevelHandler(port int) http.HandlerFunc {
 }
 
 func DownloadNetworkLog(w http.ResponseWriter, r *http.Request) {
-	filename := fmt.Sprintf("network.log.%s.tar.gz", time.Now().Format("20060102150405"))
-	tmpFile := "/tmp/" + filename
-
-	cmd := exec.Command("tar", "-czf", tmpFile, "-C", "/opt/yfkj/networkd.service/log", ".")
-	if out, err := cmd.CombinedOutput(); err != nil {
-		http.Error(w, string(out), http.StatusInternalServerError)
+	if r.Method != http.MethodGet {
+		http.Error(w, "method not allowed", http.StatusMethodNotAllowed)
 		return
 	}
 
+	filename := fmt.Sprintf("network.log.%s.tar.gz", time.Now().Format("20060102150405"))
+	tmpFile := fmt.Sprintf("/tmp/%d.tar.gz", time.Now().UnixNano())
+
 	defer os.Remove(tmpFile)
 
+	cmd := exec.Command(
+		"tar",
+		"--warning=no-file-changed",
+		"-czf",
+		tmpFile,
+		"-C",
+		"/opt/yfkj/networkd.service/log",
+		".",
+	)
+
+	out, err := cmd.CombinedOutput()
+	if err != nil {
+		if exitErr, ok := err.(*exec.ExitError); !ok || exitErr.ExitCode() != 1 {
+			http.Error(w, string(out), http.StatusInternalServerError)
+			return
+		}
+	}
+
 	w.Header().Set("Content-Type", "application/gzip")
 	w.Header().Set("Content-Disposition", fmt.Sprintf(`attachment; filename="%s"`, filename))
 
@@ -289,3 +321,26 @@ func RestartNetworkService(w http.ResponseWriter, r *http.Request) {
 	w.Header().Set("Content-Type", "application/json")
 	w.Write([]byte(`{"status":"ok"}`))
 }
+
+func NetworkStatusHandler(w http.ResponseWriter, r *http.Request) {
+	var modem struct {
+		ICCID string `json:"iccid"`
+		RSSI  string `json:"rssi"`
+	}
+	var net struct {
+		Status string `json:"net_ok"`
+		Type   string `json:"net_type"`
+	}
+
+	err1 := callRPCResult(r.Context(), 7000, "core.getNetStatus", nil, &net)
+	err2 := callRPCResult(r.Context(), 7000, "core.getModemInfo", nil, &modem)
+
+	w.Header().Set("Content-Type", "application/json; charset=utf-8")
+	json.NewEncoder(w).Encode(map[string]string{
+		"var1": map[bool]string{true: "🟢正常", false: "🔴异常"}[err1 == nil || err2 == nil],
+		"var2": map[bool]string{true: "🟢正常", false: "🔴异常"}[net.Status == "true"],
+		"var3": net.Type,
+		"var4": modem.RSSI,
+		"var5": modem.ICCID,
+	})
+}

+ 5 - 0
web-ui.service/web_route.go

@@ -57,6 +57,11 @@ var routes = []Route{
 		"/api/network/restart",
 		RestartNetworkService,
 	},
+
+	{
+		"/api/network/status",
+		NetworkStatusHandler,
+	},
 }
 
 func registerRoutes(mux *http.ServeMux) {

+ 2 - 2
web-ui.service/web_session.go

@@ -18,8 +18,8 @@ var (
 )
 
 const (
-	idleTimeout = 5 * time.Minute
-	gcPeriod    = 1 * time.Hour
+	idleTimeout = 10 * time.Minute
+	gcPeriod    = 60 * time.Minute
 )
 
 func createSession() string {