diff --git a/package.json b/package.json index ea1b6e0f..e3549e6a 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,6 @@ "@vueuse/core": "^14.2.0", "@xterm/addon-fit": "^0.11.0", "@xterm/xterm": "^6.0.0", - "axios": "^1.13.5", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "codemirror": "^6.0.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c0009e9d..716f9303 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -47,9 +47,6 @@ importers: '@xterm/xterm': specifier: ^6.0.0 version: 6.0.0 - axios: - specifier: ^1.13.5 - version: 1.13.5 class-variance-authority: specifier: ^0.7.1 version: 0.7.1 @@ -1314,12 +1311,6 @@ packages: resolution: {integrity: sha512-cbdCP0PGOBq0ASG+sjnKIoYkWMKhhz+F/h9pRexUdX2Hd38+WOlBkRKlqkGOSm0YQpcFMQBJeK4WspUAkwsEdg==} engines: {node: '>=20.19.0'} - asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - - axios@1.13.5: - resolution: {integrity: sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==} - balanced-match@4.0.2: resolution: {integrity: sha512-x0K50QvKQ97fdEz2kPehIerj+YTeptKF9hyYkKf6egnwmMWAkADiO0QCzSp0R5xN8FTZgYaBfSaue46Ej62nMg==} engines: {node: 20 || >=22} @@ -1351,10 +1342,6 @@ packages: resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} engines: {node: '>=18'} - call-bind-apply-helpers@1.0.2: - resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} - engines: {node: '>= 0.4'} - camelcase@5.3.1: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} @@ -1397,10 +1384,6 @@ packages: colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - commander@14.0.3: resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} engines: {node: '>=20'} @@ -1467,10 +1450,6 @@ packages: defu@6.1.4: resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} - delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - detect-libc@2.1.2: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} @@ -1482,10 +1461,6 @@ packages: dijkstrajs@1.0.3: resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==} - dunder-proto@1.0.1: - resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} - engines: {node: '>= 0.4'} - echarts@6.0.0: resolution: {integrity: sha512-Tte/grDQRiETQP4xz3iZWSvoHrkCQtwqd6hs+mifXcjrCuo2iKWbajFObuLJVBlDIJlOzgQPd1hsaKt/3+OMkQ==} @@ -1517,22 +1492,6 @@ packages: error-stack-parser-es@1.0.5: resolution: {integrity: sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==} - es-define-property@1.0.1: - resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} - engines: {node: '>= 0.4'} - - es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - - es-object-atoms@1.1.1: - resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} - engines: {node: '>= 0.4'} - - es-set-tostringtag@2.1.0: - resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} - engines: {node: '>= 0.4'} - esbuild@0.27.2: resolution: {integrity: sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==} engines: {node: '>=18'} @@ -1689,27 +1648,11 @@ packages: flatted@3.3.3: resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} - follow-redirects@1.15.11: - resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - - form-data@4.0.5: - resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} - engines: {node: '>= 6'} - fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] - function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} @@ -1722,14 +1665,6 @@ packages: resolution: {integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==} engines: {node: '>=18'} - get-intrinsic@1.3.0: - resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} - engines: {node: '>= 0.4'} - - get-proto@1.0.1: - resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} - engines: {node: '>= 0.4'} - glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -1738,10 +1673,6 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} - gopd@1.2.0: - resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} - engines: {node: '>= 0.4'} - graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} @@ -1749,18 +1680,6 @@ packages: resolution: {integrity: sha512-6ABGa9CR7WR/0pAJicBy5SJkiikbFM6kf/JjykwX7x+t+s8ORWVnlbi6FkHeFFb36yWsjUpHqSYrygd7ofEUqA==} engines: {node: '>=0.10.0'} - has-symbols@1.1.0: - resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} - engines: {node: '>= 0.4'} - - has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} - - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - hookable@5.5.3: resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} @@ -1998,10 +1917,6 @@ packages: resolution: {integrity: sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA==} hasBin: true - math-intrinsics@1.1.0: - resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} - engines: {node: '>= 0.4'} - mdurl@2.0.0: resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} @@ -2020,14 +1935,6 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} - mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - - mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - mimic-function@5.0.1: resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} engines: {node: '>=18'} @@ -2220,9 +2127,6 @@ packages: engines: {node: '>=14'} hasBin: true - proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - punycode.js@2.3.1: resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} engines: {node: '>=6'} @@ -3870,16 +3774,6 @@ snapshots: '@babel/parser': 7.28.6 ast-kit: 2.2.0 - asynckit@0.4.0: {} - - axios@1.13.5: - dependencies: - follow-redirects: 1.15.11 - form-data: 4.0.5 - proxy-from-env: 1.1.0 - transitivePeerDependencies: - - debug - balanced-match@4.0.2: dependencies: jackspeak: 4.2.3 @@ -3910,11 +3804,6 @@ snapshots: dependencies: run-applescript: 7.1.0 - call-bind-apply-helpers@1.0.2: - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - camelcase@5.3.1: {} caniuse-lite@1.0.30001766: {} @@ -3962,10 +3851,6 @@ snapshots: colorette@2.0.20: {} - combined-stream@1.0.8: - dependencies: - delayed-stream: 1.0.0 - commander@14.0.3: {} compare-versions@6.1.1: {} @@ -4011,20 +3896,12 @@ snapshots: defu@6.1.4: {} - delayed-stream@1.0.0: {} - detect-libc@2.1.2: {} diff@8.0.4: {} dijkstrajs@1.0.3: {} - dunder-proto@1.0.1: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-errors: 1.3.0 - gopd: 1.2.0 - echarts@6.0.0: dependencies: tslib: 2.3.0 @@ -4049,21 +3926,6 @@ snapshots: error-stack-parser-es@1.0.5: {} - es-define-property@1.0.1: {} - - es-errors@1.3.0: {} - - es-object-atoms@1.1.1: - dependencies: - es-errors: 1.3.0 - - es-set-tostringtag@2.1.0: - dependencies: - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - esbuild@0.27.2: optionalDependencies: '@esbuild/aix-ppc64': 0.27.2 @@ -4248,45 +4110,15 @@ snapshots: flatted@3.3.3: {} - follow-redirects@1.15.11: {} - - form-data@4.0.5: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - es-set-tostringtag: 2.1.0 - hasown: 2.0.2 - mime-types: 2.1.35 - fsevents@2.3.3: optional: true - function-bind@1.1.2: {} - gensync@1.0.0-beta.2: {} get-caller-file@2.0.5: {} get-east-asian-width@1.4.0: {} - get-intrinsic@1.3.0: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-define-property: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - function-bind: 1.1.2 - get-proto: 1.0.1 - gopd: 1.2.0 - has-symbols: 1.1.0 - hasown: 2.0.2 - math-intrinsics: 1.1.0 - - get-proto@1.0.1: - dependencies: - dunder-proto: 1.0.1 - es-object-atoms: 1.1.1 - glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -4295,22 +4127,10 @@ snapshots: dependencies: is-glob: 4.0.3 - gopd@1.2.0: {} - graceful-fs@4.2.11: {} gradient-parser@1.2.0: {} - has-symbols@1.1.0: {} - - has-tostringtag@1.0.2: - dependencies: - has-symbols: 1.1.0 - - hasown@2.0.2: - dependencies: - function-bind: 1.1.2 - hookable@5.5.3: {} husky@9.1.7: {} @@ -4505,8 +4325,6 @@ snapshots: punycode.js: 2.3.1 uc.micro: 2.1.0 - math-intrinsics@1.1.0: {} - mdurl@2.0.0: {} memorystream@0.3.1: {} @@ -4520,12 +4338,6 @@ snapshots: braces: 3.0.3 picomatch: 2.3.1 - mime-db@1.52.0: {} - - mime-types@2.1.35: - dependencies: - mime-db: 1.52.0 - mimic-function@5.0.1: {} minimatch@10.2.0: @@ -4691,8 +4503,6 @@ snapshots: prettier@3.8.1: {} - proxy-from-env@1.1.0: {} - punycode.js@2.3.1: {} punycode@2.3.1: {} diff --git a/src/components/BackendSwitcher.vue b/src/components/BackendSwitcher.vue index fd703d61..1510195a 100644 --- a/src/components/BackendSwitcher.vue +++ b/src/components/BackendSwitcher.vue @@ -18,6 +18,7 @@ import { useLifecycle } from "@/composables/useLifecycle"; import { delay } from "@/lib/delay"; import { useBackendExtra } from "@/composables/useBackendExtra"; import { useRouter } from "vue-router"; +import mockInput from "@/components/misc/mockInput.vue"; import { Select, SelectTrigger, @@ -334,6 +335,13 @@ watch( type="password" placeholder="key:secret username|password" /> + + ("token_create", { father_token: backend.value.token, - token_creation: { - username: `[agent]:${nodeUuid}`, - password: generatePassword(16), - timestamp_from: null, - timestamp_to: null, - version: 1, - token_limit: [ - { - // scopes: [{ global: null }], - scopes: [ - { - agent_uuid: nodeUuid, - }, - ], - permissions: AGENT_TEMPLATE_PERMISSIONS, - }, - ], - }, + token_creation: makeTokenObject(nodeUuid), }); if (result?.key && result?.secret) { return `${result.key}:${result.secret}`; @@ -64,3 +70,24 @@ export async function reGenerateToken( console.error("Token re-generation failed:", e); } } + +export async function upgradeTokenLimit( + nodeUuid: string, + backend = currentBackend, +) { + if (!backend.value) return; + const rpc = makeRpcFunction(); + try { + // const tokenDetail = await rpc("token_edit", { + // "token":`[agent]:${nodeUuid}`, + // "supertoken":backend.value?.token || '' + // }) + rpc("token_edit", { + token: backend.value.token, + target_token: `[agent]:${nodeUuid}`, + limit: makeTokenObject(nodeUuid).token_limit, + }); + } catch (e) { + console.error("Token update failed:", e); + } +} diff --git a/src/components/misc/mockInput.vue b/src/components/misc/mockInput.vue new file mode 100644 index 00000000..b431f9e7 --- /dev/null +++ b/src/components/misc/mockInput.vue @@ -0,0 +1,108 @@ + + + diff --git a/src/components/node-manage/NodeManageTabAgents.vue b/src/components/node-manage/NodeManageTabAgents.vue index e2c3df83..073362ec 100644 --- a/src/components/node-manage/NodeManageTabAgents.vue +++ b/src/components/node-manage/NodeManageTabAgents.vue @@ -60,6 +60,7 @@ import { PopConfirm } from "@/components/ui/pop-confirm"; import { compareVersions } from "compare-versions"; import { useTask } from "@/composables/useTask"; import { delay } from "@/lib/delay"; +import { applyPostProces } from "@/lib/migration"; const { t } = useI18n(); const router = useRouter(); @@ -258,6 +259,12 @@ async function confirmVersion(version: string) { for (let i = 0, len = uuids.length; i < len; i++) { const uuid = uuids[i] as string; + const agent = agents.value.find((v) => v.uuid === uuid); + if (!agent) { + continue; + } + const oldVersion = extractVersion(agent.version || ""); + upgradeStatus.value.set(uuid, "upgrading"); await createSelfUpdateTask(uuid, "v" + version, false); await delay(800); @@ -267,10 +274,6 @@ async function confirmVersion(version: string) { const waitInterval = 1000, maxWait = 12000; let finished = false; - const agent = agents.value.find((v) => v.uuid === uuid); - if (!agent) { - continue; - } for (let j = 0; j < maxWait; j += waitInterval) { try { await fetchAgentVersion(agent, waitInterval); @@ -281,6 +284,16 @@ async function confirmVersion(version: string) { if (extractVersion(agent.version || "") === version) { upgradeStatus.value.delete(uuid); finished = true; + + try { + await applyPostProces(uuid, oldVersion, version); + } catch (error) { + console.error("升级后处理失败", error); + toast.error( + `agent ${agent.metadata?.customName || agent.uuid} 升级后处理失败`, + ); + } + break; } } catch (error) { @@ -426,8 +439,8 @@ refresh(); @update:modelValue="(v) => toggleSelectAll(!!v)" /> - {{ t("dashboard.agents.colId") }} {{ t("dashboard.agents.colName") }} + {{ t("dashboard.agents.colId") }} {{ t("dashboard.agents.colIp") }} {{ t("dashboard.agents.colVersion") }} {{ diff --git a/src/components/node/setting/NodeSettingTabConfig.vue b/src/components/node/setting/NodeSettingTabConfig.vue index aca73095..6bb55cfd 100644 --- a/src/components/node/setting/NodeSettingTabConfig.vue +++ b/src/components/node/setting/NodeSettingTabConfig.vue @@ -8,6 +8,7 @@ import { Label } from "@/components/ui/label"; import { NumberField } from "@/components/ui/number-field"; import { Switch } from "@/components/ui/switch"; import { PopConfirm } from "@/components/ui/pop-confirm"; +import { type TASK_NAME } from "@/types/task"; import { useAgentConfig, type AgentConfig, @@ -23,6 +24,7 @@ import { SelectValue, } from "@/components/ui/select"; import { useI18n } from "vue-i18n"; +import { fetchDynamic } from "@/composables/monitoring/useDynamicMonitoring"; const props = defineProps<{ uuid: string }>(); @@ -44,20 +46,13 @@ const staticReportInterval = ref(3600000); // ms const terminalShell = ref<"bash" | "cmd">("bash"); const execMaxCharacter = ref(undefined); const connectTimeout = ref(undefined); +const dynamic_summary_select_disk = ref([]); +const dynamic_summary_select_network_interface = ref([]); +const dynamic_summary_select_disk_list = ref([]); +const dynamic_summary_select_network_interface_list = ref([]); // 特性开关 (server config中的allow_*属性) -const allowTask = ref(false); -const allowIcmpPing = ref(false); -const allowTcpPing = ref(false); -const allowHttpPing = ref(false); -const allowHttpRequest = ref(false); -const allowSelfUpdate = ref(false); -const allowWebShell = ref(false); -const allowExecute = ref(false); -const allowReadConfig = ref(false); -const allowEditConfig = ref(false); -const allowIp = ref(false); -const allowVersion = ref(false); +const allowTaskType = ref(new Set()); /** * 从 AgentConfig 对象更新 UI 状态 @@ -74,21 +69,14 @@ function syncFromConfig(config: splitConfig) { terminalShell.value = basicConfig.terminal_shell || "bash"; execMaxCharacter.value = basicConfig.exec_max_character; connectTimeout.value = basicConfig.connect_timeout_ms; + dynamic_summary_select_network_interface.value = + basicConfig.dynamic_summary_select_network_interface || []; + dynamic_summary_select_disk.value = + basicConfig.dynamic_summary_select_disk || []; // 从 server 配置中提取第一个 server 的 allow_* 属性 if (currentUpstream) { - allowTask.value = currentUpstream.allow_task === true; - allowIcmpPing.value = currentUpstream.allow_icmp_ping === true; - allowTcpPing.value = currentUpstream.allow_tcp_ping === true; - allowHttpPing.value = currentUpstream.allow_http_ping === true; - allowHttpRequest.value = currentUpstream.allow_http_request === true; - ((allowSelfUpdate.value = currentUpstream.allow_self_update === true), - (allowWebShell.value = currentUpstream.allow_web_shell === true)); - allowExecute.value = currentUpstream.allow_execute === true; - allowReadConfig.value = currentUpstream.allow_read_config === true; - allowEditConfig.value = currentUpstream.allow_edit_config === true; - allowIp.value = currentUpstream.allow_edit_config === true; - allowVersion.value = currentUpstream.allow_version === true; + allowTaskType.value = new Set(currentUpstream.allow_task_type || []); } } @@ -130,20 +118,22 @@ function buildConfig(): AgentConfig { config.connect_timeout_ms = connectTimeout.value; } + if (dynamic_summary_select_network_interface.value.length > 0) { + config.dynamic_summary_select_network_interface = + dynamic_summary_select_network_interface.value; + } else { + delete config.dynamic_summary_select_network_interface; + } + + if (dynamic_summary_select_disk.value.length > 0) { + config.dynamic_summary_select_disk = dynamic_summary_select_disk.value; + } else { + delete config.dynamic_summary_select_disk; + } + const currentUpstreamNew: UpstreamServer = { ...agentConfig.value.currentUpstream, - allow_task: allowTask.value, - allow_icmp_ping: allowIcmpPing.value, - allow_tcp_ping: allowTcpPing.value, - allow_http_ping: allowHttpPing.value, - allow_http_request: allowHttpRequest.value, - allow_self_update: allowSelfUpdate.value, - allow_web_shell: allowWebShell.value, - allow_execute: allowExecute.value, - allow_read_config: allowReadConfig.value, - allow_edit_config: allowEditConfig.value, - allow_ip: !!allowIp.value, - allow_version: !!allowVersion.value, + allow_task_type: Array.from(allowTaskType.value), }; return { @@ -169,6 +159,28 @@ onMounted(async () => { } finally { loading.value = false; } + + fetchDynamic(props.uuid, ["network", "disk"], { limit: 1 }).then((res) => { + if (!res || !res.length) { + return; + } + const latest = res[0]; + if (!latest) { + return; + } + if ( + Array.isArray(latest.network?.interfaces) && + latest.network.interfaces.length > 0 + ) { + dynamic_summary_select_network_interface_list.value = + latest.network.interfaces.map((i) => i.interface_name); + } + if (Array.isArray(latest.disk) && latest.disk.length > 0) { + dynamic_summary_select_disk_list.value = latest.disk.map( + (d) => d.mount_point, + ); + } + }); }); /** @@ -181,9 +193,9 @@ async function handleSave() { const success = await writeAgentConfig(props.uuid, config); if (success) { - toast.success(t("dashboard.saveSuccess")); await delay(1000); agentConfig.value = await getAgentConfigExtra(props.uuid); + toast.success(t("dashboard.saveSuccess")); } else { toast.error(t("dashboard.saveFailed")); } @@ -195,22 +207,6 @@ async function handleSave() { saveLoading.value = false; } } - -/** - * 处理禁用 allow_edit_config - */ -function handleEditConfigToggle(checked: boolean) { - if (!checked) { - // 触发确认弹窗 - // 这里通过 PopConfirm 组件处理 - } else { - allowEditConfig.value = true; - } -} - -function confirmDisableEditConfig() { - allowEditConfig.value = false; -}