From 506dba41aa9728e12a67002b2bb8f8dbb064b1d2 Mon Sep 17 00:00:00 2001 From: landmineHQ Date: Sun, 24 May 2026 13:46:20 +0800 Subject: [PATCH 1/4] fix: import RpcDebugPanelDialog component in App.vue --- src/App.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/src/App.vue b/src/App.vue index 6cdebce..f0a7dc7 100644 --- a/src/App.vue +++ b/src/App.vue @@ -7,6 +7,7 @@ import { ref, provide, onMounted, watch } from "vue"; import { useBackendStore } from "@/composables/useBackendStore"; import { usePermissionStore } from "@/stores/permission"; import "@/utils/detectUpdate"; +import RpcDebugPanelDialog from "@/components/rpc-debug-panel/RpcDebugPanelDialog.vue"; const background = ref<"default" | "flickering">("default"); From f43fe0f216a3e7294eb0fa9e82ad2ae574eca3eb Mon Sep 17 00:00:00 2001 From: LloydAsp Date: Mon, 25 May 2026 19:06:37 +0800 Subject: [PATCH 2/4] fix: add more timeout for server_database_storage api --- src/pages/dashboard/servers-detail/[backendName].vue | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/pages/dashboard/servers-detail/[backendName].vue b/src/pages/dashboard/servers-detail/[backendName].vue index 9817638..319eada 100644 --- a/src/pages/dashboard/servers-detail/[backendName].vue +++ b/src/pages/dashboard/servers-detail/[backendName].vue @@ -114,10 +114,12 @@ const storageLoading = ref(false); const fetchStorage = async () => { if (!backend.value) return; storageLoading.value = true; + const timeout = 30 * 1000; // 20 seconds try { storageData.value = await getWsConnection(backend.value.url).call( "nodeget-server_database_storage", { token: backend.value.token }, + timeout, ); } finally { storageLoading.value = false; From 1d88bec54149eb088de8d1216bea2448ae4bbe13 Mon Sep 17 00:00:00 2001 From: LloydAsp Date: Sat, 30 May 2026 22:42:59 +0800 Subject: [PATCH 3/4] fix: Fix backend wss pathname bug introduced by branch merge --- src/composables/useBackendStore.ts | 19 ++----------------- .../servers-detail/[backendName].vue | 4 ++-- 2 files changed, 4 insertions(+), 19 deletions(-) diff --git a/src/composables/useBackendStore.ts b/src/composables/useBackendStore.ts index 77a9814..b5d5119 100644 --- a/src/composables/useBackendStore.ts +++ b/src/composables/useBackendStore.ts @@ -12,15 +12,6 @@ const LS_KEY_CURRENT = "nodeget_current_backend"; const backends = ref([]); const currentBackend = ref(null); -export const normalizeUrl = (url: string): string => { - try { - const parsed = new URL(url); - return `${parsed.protocol}//${parsed.host}`; - } catch { - return url; - } -}; - const init = () => { // Load backends from localStorage const storedBackends = localStorage.getItem(LS_KEY_BACKENDS); @@ -28,10 +19,7 @@ const init = () => { try { const parsed = JSON.parse(storedBackends); if (Array.isArray(parsed)) { - backends.value = (parsed as Backend[]).map((b) => ({ - ...b, - url: normalizeUrl(b.url), - })); + backends.value = parsed as Backend[]; } } catch (e) { console.error("Failed to parse backends from localStorage", e); @@ -44,10 +32,7 @@ const init = () => { try { const parsed = JSON.parse(storedCurrent); if (parsed && typeof parsed === "object") { - currentBackend.value = { - ...(parsed as Backend), - url: normalizeUrl((parsed as Backend).url), - }; + currentBackend.value = parsed as Backend; } } catch (e) { console.error("Failed to parse current backend from localStorage", e); diff --git a/src/pages/dashboard/servers-detail/[backendName].vue b/src/pages/dashboard/servers-detail/[backendName].vue index 319eada..daa50a8 100644 --- a/src/pages/dashboard/servers-detail/[backendName].vue +++ b/src/pages/dashboard/servers-detail/[backendName].vue @@ -16,7 +16,7 @@ import { Input } from "@/components/ui/input"; import { Badge } from "@/components/ui/badge"; import { Tabs, TabsList, TabsTrigger, TabsContent } from "@/components/ui/tabs"; // import { RadioGroup, RadioGroupItem, } from '@/components/ui/radio-group' -import { useBackendStore, normalizeUrl } from "@/composables/useBackendStore"; +import { useBackendStore } from "@/composables/useBackendStore"; import { useBackendExtra } from "@/composables/useBackendExtra"; import { getWsConnection } from "@/composables/useWsConnection"; import { useThemeStore } from "@/stores/theme"; @@ -238,7 +238,7 @@ function saveEdit(field: string) { `/dashboard/servers-detail/${encodeURIComponent(editValue.value)}`, ); } else if (field === "url") { - backends.value[idx]!.url = normalizeUrl(editValue.value); + backends.value[idx]!.url = editValue.value; } else if (field === "token") { backends.value[idx]!.token = editValue.value; } From 557a2095ab11e4ee8d7bebf66214e15936c0671e Mon Sep 17 00:00:00 2001 From: LloydAsp Date: Sat, 30 May 2026 23:07:00 +0800 Subject: [PATCH 4/4] feat(token): add ping platform token template --- src/components/token/tokenTemplates.ts | 32 ++++++++++++++++++++++++++ src/locales/en.ts | 5 ++++ src/locales/zh_cn.ts | 14 +++++++++++ 3 files changed, 51 insertions(+) diff --git a/src/components/token/tokenTemplates.ts b/src/components/token/tokenTemplates.ts index 12ede25..517530c 100644 --- a/src/components/token/tokenTemplates.ts +++ b/src/components/token/tokenTemplates.ts @@ -35,6 +35,25 @@ export const VISITOR_TEMPLATE_PERMISSIONS: PermissionEntry[] = [ { kv: { read: "metadata_*" } }, ]; +export const NODEPING_TEMPLATE_PERMISSIONS: PermissionEntry[] = [ + { task: { create: "ping" } }, + { task: { create: "tcp_ping" } }, + { task: { create: "http_ping" } }, + { task: { create: "ip" } }, + { task: { create: "dns" } }, + { task: { create: "http_request" } }, + { task: { create: "version" } }, + { task: { read: "ping" } }, + { task: { read: "tcp_ping" } }, + { task: { read: "http_ping" } }, + { task: { read: "ip" } }, + { task: { read: "dns" } }, + { task: { read: "http_request" } }, + { task: { read: "version" } }, + { kv: { read: "metadata_*" } }, + { node_get: "list_all_agent_uuid" }, +]; + export const TOKEN_TEMPLATES: TokenTemplate[] = [ { id: "agent", @@ -60,6 +79,19 @@ export const TOKEN_TEMPLATES: TokenTemplate[] = [ }, ], }, + { + id: "NodePing", + nameKey: "dashboard.token.templates.NodePing.title", + descriptionKey: "dashboard.token.templates.NodePing.description", + token_limit: [ + { + scopes: [...DEFAULT_SCOPE], + permissions: NODEPING_TEMPLATE_PERMISSIONS.map((item) => ({ + ...item, + })), + }, + ], + }, ]; export const getTokenTemplateById = (id: string) => diff --git a/src/locales/en.ts b/src/locales/en.ts index eb24862..44bc1ad 100644 --- a/src/locales/en.ts +++ b/src/locales/en.ts @@ -498,6 +498,11 @@ export default { description: "Preset read-oriented permissions for basic monitoring visibility.", }, + NodePing: { + title: "NodeSeek Ping Platform", + description: + "Preset creation/read permissions for common Ping operations.", + }, }, }, extensions: { diff --git a/src/locales/zh_cn.ts b/src/locales/zh_cn.ts index 4ba2c32..9b38469 100644 --- a/src/locales/zh_cn.ts +++ b/src/locales/zh_cn.ts @@ -484,6 +484,20 @@ export default { }, }, }, + templates: { + agent: { + title: "Agent端权限", + description: "为常见的Agent操作预设写入权限", + }, + visitor: { + title: "访客权限", + description: "预设读取权限,以实现基本监控可见性", + }, + NodePing: { + title: "NodeSeek Ping平台", + description: "为常见的Ping操作预设创建/读取权限", + }, + }, }, extensions: { title: "扩展管理",