async function apiGetRetry(url, retry = false) { try { const res = await fetch(url); if (!res.ok) { throw new Error("HTTP " + res.status); } const text = await res.text(); if (!text || text.trim() === "") { throw new Error("empty response"); } return text.trim(); } catch (e) { console.log("GET failed:", url, e.message); if (retry) { setTimeout(() => apiGetRetry(url, true), 3000); } throw e; } } function getNetInfo1() { document.getElementById("text1").innerText = ""; apiGetRetry("/api/network/interfaces") .then(data => { document.getElementById("text1").innerText = data; }) .catch(() => { document.getElementById("text1").innerText = "获取失败"; }); } function getNetInfo2() { document.getElementById("text2").innerText = ""; apiGetRetry("/api/network/routes") .then(data => { document.getElementById("text2").innerText = data; }) .catch(() => { document.getElementById("text2").innerText = "获取失败"; }); } function getNetInfo3() { document.getElementById("text3").innerText = ""; apiGetRetry("/api/network/dns") .then(data => { document.getElementById("text3").innerText = data; }) .catch(() => { document.getElementById("text3").innerText = "获取失败"; }); } let netLogLevel = ""; function setNetLogLevel() { const level = logLevel.value; fetch("/api/network/loglevel", { method: "POST", headers: {"Content-Type": "application/json"}, body: JSON.stringify({level}) }) .then(async r => { if (!r.ok) throw new Error(await r.text()); netLogLevel = level; }) .catch(e => { logLevel.value = netLogLevel; }); } function getNetLogLevel() { fetch("/api/network/loglevel") .then(async r => { if (!r.ok) throw new Error(await r.text()); return r.json(); }) .then(d => { netLogLevel = d.log_level; logLevel.value = d.log_level; }) .catch(e => { netLogLevel = ""; logLevel.value = ""; }); } function downloadNetLogFile() { const btn = event.currentTarget; btn.disabled = true; fetch("/api/network/logfile") .then(async r => { if (!r.ok) { throw new Error("HTTP " + r.status); } const disposition = r.headers.get("Content-Disposition"); let filename = "network.log.tar.gz"; if (disposition) { const match = disposition.match(/filename="?([^";]+)"?/); if (match) { filename = match[1]; } } return { blob: await r.blob(), filename }; }) .then(({ blob, filename }) => { const url = URL.createObjectURL(blob); const a = document.createElement("a"); a.href = url; a.download = filename; document.body.appendChild(a); a.click(); a.remove(); setTimeout(() => { URL.revokeObjectURL(url); }, 1000); alert("下载成功"); }) .catch(e => { console.error("download failed:", e); alert("下载失败: " + e.message); }) .finally(() => { btn.disabled = false; btn.textContent = "下载"; }); } function restartNetService() { if (!confirm("确定重启联网服务吗?")) { return; } const btn = event.currentTarget; btn.disabled = true; fetch("/api/network/restart", { method: "POST" }) .then(async r => { if (!r.ok) { throw new Error(await r.text()); } logLevel.value = "info"; netLogLevel = logLevel.value; alert("重启成功"); }) .catch(e => { console.error("restart failed:", e); alert("重启失败: " + e.message); }) .finally(() => { btn.disabled = false; }); } 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(); getNetLogLevel(); connectLog("yfkj-networkd.service", "text4"); } function exitPage2() { stopNetStatusRefresh(); disconnectLog(); }