Refactor client routes and add IP fetching functionality
- Moved client route definitions to separate files for better organization. - Added new route to fetch client IP addresses, supporting both IPv4 and IPv6. - Implemented system information retrieval in the client routes. - Updated package dependencies to their latest versions. - Adjusted call route to prevent overwriting existing routes.
This commit is contained in:
@@ -1,84 +1,2 @@
|
||||
|
||||
import { app, assistantConfig } from '../../app.ts';
|
||||
import { createSkill } from '@kevisual/router';
|
||||
import os from 'node:os';
|
||||
import { runCommand } from '@/services/app/index.ts';
|
||||
app
|
||||
.route({
|
||||
path: 'client',
|
||||
key: 'version',
|
||||
description: '获取客户端版本号',
|
||||
})
|
||||
.define(async (ctx) => {
|
||||
ctx.body = 'v1.0.0';
|
||||
})
|
||||
.addTo(app);
|
||||
|
||||
app
|
||||
.route({
|
||||
path: 'client',
|
||||
key: 'time',
|
||||
description: '获取当前时间',
|
||||
})
|
||||
.define(async (ctx) => {
|
||||
ctx.body = {
|
||||
time: new Date().getTime(),
|
||||
date: new Date().toLocaleDateString(),
|
||||
};
|
||||
})
|
||||
.addTo(app);
|
||||
|
||||
// 调用 path: client key: system
|
||||
app
|
||||
.route({
|
||||
path: 'client',
|
||||
key: 'system',
|
||||
description: '获取系统信息',
|
||||
metadata: {
|
||||
tags: ['opencode'],
|
||||
...createSkill({
|
||||
skill: 'view-system-info',
|
||||
title: '查看系统信息',
|
||||
summary: '获取服务器操作系统平台、架构和版本信息',
|
||||
})
|
||||
}
|
||||
})
|
||||
.define(async (ctx) => {
|
||||
const { platform, arch, release } = os;
|
||||
ctx.body = {
|
||||
platform: platform(),
|
||||
arch: arch(),
|
||||
release: release(),
|
||||
};
|
||||
})
|
||||
.addTo(app);
|
||||
|
||||
|
||||
app.route({
|
||||
path: 'client',
|
||||
key: 'restart',
|
||||
description: '重启客户端',
|
||||
middleware: ['admin-auth'],
|
||||
metadata: {
|
||||
tags: ['opencode'],
|
||||
...createSkill({
|
||||
skill: 'restart-client',
|
||||
title: '重启客户端',
|
||||
summary: '重启当前运行的客户端应用程序',
|
||||
})
|
||||
}
|
||||
}).define(async (ctx) => {
|
||||
const cmd = 'pm2 restart assistant-server --update-env';
|
||||
try {
|
||||
runCommand(cmd, []);
|
||||
ctx.body = {
|
||||
message: '客户端重启命令已执行',
|
||||
};
|
||||
} catch (error) {
|
||||
ctx.status = 500;
|
||||
ctx.body = {
|
||||
message: '重启客户端失败',
|
||||
error: error.message,
|
||||
};
|
||||
}
|
||||
}).addTo(app);
|
||||
import './ip.ts';
|
||||
import './system.ts'
|
||||
72
assistant/src/routes/client/ip.ts
Normal file
72
assistant/src/routes/client/ip.ts
Normal file
@@ -0,0 +1,72 @@
|
||||
|
||||
import { app } from '../../app.ts';
|
||||
import { createSkill } from '@kevisual/router';
|
||||
import os from 'node:os';
|
||||
|
||||
const baseURLv4 = 'https://4.ipw.cn/';
|
||||
const baseURLv6 = 'https://6.ipw.cn/';
|
||||
|
||||
export const isIpv6 = (ip: string): boolean => {
|
||||
return ip.includes(':');
|
||||
}
|
||||
|
||||
export const isIpv4 = (ip: string): boolean => {
|
||||
return ip.split('.').length === 4;
|
||||
}
|
||||
export const fetchIP = async (url: string): Promise<string> => {
|
||||
const response = await fetch(url);
|
||||
if (!response.ok) {
|
||||
throw new Error(`Failed to fetch IP from ${url}: ${response.statusText}`);
|
||||
}
|
||||
const ip = (await response.text()).trim();
|
||||
return ip;
|
||||
}
|
||||
|
||||
app.route({
|
||||
path: 'client',
|
||||
key: 'ip',
|
||||
description: '获取客户端 IP 地址',
|
||||
metadata: {
|
||||
tags: ['opencode'],
|
||||
...createSkill({
|
||||
skill: 'view-client-ip',
|
||||
title: '查看客户端 IP 地址',
|
||||
summary: '获取当前客户端的 IP 地址信息',
|
||||
})
|
||||
}
|
||||
})
|
||||
.define(async (ctx) => {
|
||||
const networkInterfaces = os.networkInterfaces();
|
||||
const ipAddresses: { type: string, address: string }[] = [];
|
||||
for (const interfaceDetails of Object.values(networkInterfaces)) {
|
||||
if (interfaceDetails) {
|
||||
for (const detail of interfaceDetails) {
|
||||
if (detail.family === 'IPv4' && !detail.internal) {
|
||||
ipAddresses.push({
|
||||
type: 'IPv4-local',
|
||||
address: detail.address,
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
const res = await fetchIP(baseURLv6);
|
||||
if (isIpv6(res)) {
|
||||
ipAddresses.push({
|
||||
type: 'IPv6',
|
||||
address: res,
|
||||
});
|
||||
}
|
||||
const res4 = await fetchIP(baseURLv4);
|
||||
if (isIpv4(res4)) {
|
||||
ipAddresses.push({
|
||||
type: 'IPv4',
|
||||
address: res4,
|
||||
});
|
||||
}
|
||||
|
||||
ctx.body = {
|
||||
ipAddresses,
|
||||
};
|
||||
})
|
||||
.addTo(app);
|
||||
85
assistant/src/routes/client/system.ts
Normal file
85
assistant/src/routes/client/system.ts
Normal file
@@ -0,0 +1,85 @@
|
||||
|
||||
import { app, assistantConfig } from '../../app.ts';
|
||||
import { createSkill } from '@kevisual/router';
|
||||
import os from 'node:os';
|
||||
import { runCommand } from '@/services/app/index.ts';
|
||||
|
||||
app
|
||||
.route({
|
||||
path: 'client',
|
||||
key: 'version',
|
||||
description: '获取客户端版本号',
|
||||
})
|
||||
.define(async (ctx) => {
|
||||
ctx.body = 'v1.0.0';
|
||||
})
|
||||
.addTo(app);
|
||||
|
||||
app
|
||||
.route({
|
||||
path: 'client',
|
||||
key: 'time',
|
||||
description: '获取当前时间',
|
||||
})
|
||||
.define(async (ctx) => {
|
||||
ctx.body = {
|
||||
time: new Date().getTime(),
|
||||
date: new Date().toLocaleDateString(),
|
||||
};
|
||||
})
|
||||
.addTo(app);
|
||||
|
||||
// 调用 path: client key: system
|
||||
app
|
||||
.route({
|
||||
path: 'client',
|
||||
key: 'system',
|
||||
description: '获取系统信息',
|
||||
metadata: {
|
||||
tags: ['opencode'],
|
||||
...createSkill({
|
||||
skill: 'view-system-info',
|
||||
title: '查看系统信息',
|
||||
summary: '获取服务器操作系统平台、架构和版本信息',
|
||||
})
|
||||
}
|
||||
})
|
||||
.define(async (ctx) => {
|
||||
const { platform, arch, release } = os;
|
||||
ctx.body = {
|
||||
platform: platform(),
|
||||
arch: arch(),
|
||||
release: release(),
|
||||
};
|
||||
})
|
||||
.addTo(app);
|
||||
|
||||
|
||||
app.route({
|
||||
path: 'client',
|
||||
key: 'restart',
|
||||
description: '重启客户端',
|
||||
middleware: ['admin-auth'],
|
||||
metadata: {
|
||||
tags: ['opencode'],
|
||||
...createSkill({
|
||||
skill: 'restart-client',
|
||||
title: '重启客户端',
|
||||
summary: '重启当前运行的客户端应用程序',
|
||||
})
|
||||
}
|
||||
}).define(async (ctx) => {
|
||||
const cmd = 'pm2 restart assistant-server --update-env';
|
||||
try {
|
||||
runCommand(cmd, []);
|
||||
ctx.body = {
|
||||
message: '客户端重启命令已执行',
|
||||
};
|
||||
} catch (error) {
|
||||
ctx.status = 500;
|
||||
ctx.body = {
|
||||
message: '重启客户端失败',
|
||||
error: error.message,
|
||||
};
|
||||
}
|
||||
}).addTo(app);
|
||||
Reference in New Issue
Block a user