完善了agent
This commit is contained in:
242
agent/tools/system/os_network_info.js
Normal file
242
agent/tools/system/os_network_info.js
Normal file
@@ -0,0 +1,242 @@
|
||||
import * as z from "zod"
|
||||
import { tool } from "langchain"
|
||||
import os from 'os'
|
||||
import { promisify } from 'util'
|
||||
import { exec } from 'child_process'
|
||||
|
||||
const execPromise = promisify(exec)
|
||||
|
||||
/**
|
||||
* 获取系统网卡和网络连接信息工具
|
||||
* @returns {string} - 返回网络信息的 JSON 字符串,包括网卡信息和网络连接信息
|
||||
*/
|
||||
export const getNetworkInfoTool = tool(
|
||||
async (input) => {
|
||||
try {
|
||||
const networkInfo = {
|
||||
platform: os.platform(),
|
||||
networkInterfaces: [],
|
||||
dnsServers: [],
|
||||
gateway: []
|
||||
}
|
||||
|
||||
// 获取网络接口信息(跨平台)
|
||||
const interfaces = os.networkInterfaces()
|
||||
for (const [name, addresses] of Object.entries(interfaces)) {
|
||||
networkInfo.networkInterfaces.push({
|
||||
name,
|
||||
addresses: addresses.map(addr => ({
|
||||
family: addr.family,
|
||||
address: addr.address,
|
||||
netmask: addr.netmask,
|
||||
mac: addr.mac,
|
||||
internal: addr.internal,
|
||||
cidr: addr.cidr
|
||||
}))
|
||||
})
|
||||
}
|
||||
|
||||
// 获取详细网络信息(Windows)
|
||||
if (os.platform() === 'win32') {
|
||||
try {
|
||||
const { stdout } = await execPromise('ipconfig /all')
|
||||
const lines = stdout.trim().split('\n')
|
||||
let currentAdapter = null
|
||||
|
||||
lines.forEach(line => {
|
||||
const adapterMatch = line.match(/适配器\s+(.+?):/)
|
||||
if (adapterMatch) {
|
||||
if (currentAdapter) {
|
||||
networkInfo.networkInterfaces.push(currentAdapter)
|
||||
}
|
||||
currentAdapter = {
|
||||
name: adapterMatch[1],
|
||||
description: '',
|
||||
macAddress: '',
|
||||
dhcpEnabled: false,
|
||||
ipAddress: [],
|
||||
subnetMask: [],
|
||||
defaultGateway: [],
|
||||
dnsServers: []
|
||||
}
|
||||
} else if (currentAdapter) {
|
||||
const descMatch = line.match(/描述\s+(.+)/)
|
||||
if (descMatch) currentAdapter.description = descMatch[1].trim()
|
||||
|
||||
const macMatch = line.match(/物理地址\s+:\s+(.+)/)
|
||||
if (macMatch) currentAdapter.macAddress = macMatch[1].trim()
|
||||
|
||||
const dhcpMatch = line.match(/DHCP 已启用\s+:\s+(.+)/)
|
||||
if (dhcpMatch) currentAdapter.dhcpEnabled = dhcpMatch[1].trim() === '是'
|
||||
|
||||
const ipMatch = line.match(/IPv4 地址\s+:\s+(.+)/)
|
||||
if (ipMatch) currentAdapter.ipAddress.push(ipMatch[1].trim())
|
||||
|
||||
const subnetMatch = line.match(/子网掩码\s+:\s+(.+)/)
|
||||
if (subnetMatch) currentAdapter.subnetMask.push(subnetMatch[1].trim())
|
||||
|
||||
const gatewayMatch = line.match(/默认网关\s+:\s+(.+)/)
|
||||
if (gatewayMatch && gatewayMatch[1].trim()) currentAdapter.defaultGateway.push(gatewayMatch[1].trim())
|
||||
|
||||
const dnsMatch = line.match(/DNS 服务器\s+:\s+(.+)/)
|
||||
if (dnsMatch && dnsMatch[1].trim()) currentAdapter.dnsServers.push(dnsMatch[1].trim())
|
||||
}
|
||||
})
|
||||
|
||||
if (currentAdapter) {
|
||||
networkInfo.networkInterfaces.push(currentAdapter)
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Error getting network config:', error)
|
||||
}
|
||||
|
||||
// 获取DNS服务器(Windows)
|
||||
try {
|
||||
const { stdout } = await execPromise('nslookup localhost 2>&1')
|
||||
const dnsMatch = stdout.match(/Server:\s+(.+)/)
|
||||
if (dnsMatch) {
|
||||
networkInfo.dnsServers.push(dnsMatch[1].trim())
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Error getting DNS servers:', error)
|
||||
}
|
||||
}
|
||||
// 获取详细网络信息(Linux)
|
||||
else if (os.platform() === 'linux') {
|
||||
try {
|
||||
const { stdout } = await execPromise('ip addr show')
|
||||
const lines = stdout.trim().split('\n')
|
||||
let currentInterface = null
|
||||
|
||||
lines.forEach(line => {
|
||||
const interfaceMatch = line.match(/^\d+:\s+(\w+):/)
|
||||
if (interfaceMatch) {
|
||||
if (currentInterface) {
|
||||
networkInfo.networkInterfaces.push(currentInterface)
|
||||
}
|
||||
currentInterface = {
|
||||
name: interfaceMatch[1],
|
||||
state: '',
|
||||
macAddress: '',
|
||||
ipAddress: [],
|
||||
subnetMask: []
|
||||
}
|
||||
} else if (currentInterface) {
|
||||
const stateMatch = line.match(/state\s+(\w+)/)
|
||||
if (stateMatch) currentInterface.state = stateMatch[1]
|
||||
|
||||
const macMatch = line.match(/link\/ether\s+([a-fA-F0-9:]+)/)
|
||||
if (macMatch) currentInterface.macAddress = macMatch[1]
|
||||
|
||||
const ipMatch = line.match(/inet\s+(\d+\.\d+\.\d+\.\d+)\/(\d+)/)
|
||||
if (ipMatch) {
|
||||
currentInterface.ipAddress.push(ipMatch[1])
|
||||
const maskLength = parseInt(ipMatch[2])
|
||||
currentInterface.subnetMask.push(maskLength)
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
if (currentInterface) {
|
||||
networkInfo.networkInterfaces.push(currentInterface)
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Error getting network config:', error)
|
||||
}
|
||||
|
||||
// 获取DNS服务器(Linux)
|
||||
try {
|
||||
const { stdout } = await execPromise('cat /etc/resolv.conf')
|
||||
const dnsMatches = stdout.match(/nameserver\s+(.+)/g)
|
||||
if (dnsMatches) {
|
||||
networkInfo.dnsServers = dnsMatches.map(match => match.replace('nameserver', '').trim())
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Error getting DNS servers:', error)
|
||||
}
|
||||
|
||||
// 获取网关(Linux)
|
||||
try {
|
||||
const { stdout } = await execPromise('ip route show default')
|
||||
const gatewayMatch = stdout.match(/default via (\d+\.\d+\.\d+\.\d+)/)
|
||||
if (gatewayMatch) {
|
||||
networkInfo.gateway.push(gatewayMatch[1])
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Error getting gateway:', error)
|
||||
}
|
||||
}
|
||||
// 获取详细网络信息(macOS)
|
||||
else if (os.platform() === 'darwin') {
|
||||
try {
|
||||
const { stdout } = await execPromise('ifconfig')
|
||||
const lines = stdout.trim().split('\n')
|
||||
let currentInterface = null
|
||||
|
||||
lines.forEach(line => {
|
||||
const interfaceMatch = line.match(/^(\w+):/)
|
||||
if (interfaceMatch) {
|
||||
if (currentInterface) {
|
||||
networkInfo.networkInterfaces.push(currentInterface)
|
||||
}
|
||||
currentInterface = {
|
||||
name: interfaceMatch[1],
|
||||
status: '',
|
||||
macAddress: '',
|
||||
ipAddress: [],
|
||||
subnetMask: []
|
||||
}
|
||||
} else if (currentInterface) {
|
||||
const statusMatch = line.match(/status:\s+(\w+)/)
|
||||
if (statusMatch) currentInterface.status = statusMatch[1]
|
||||
|
||||
const macMatch = line.match(/ether\s+([a-fA-F0-9:]+)/)
|
||||
if (macMatch) currentInterface.macAddress = macMatch[1]
|
||||
|
||||
const ipMatch = line.match(/inet\s+(\d+\.\d+\.\d+\.\d+)\s+netmask\s+(0x[0-9a-fA-F]+)/)
|
||||
if (ipMatch) {
|
||||
currentInterface.ipAddress.push(ipMatch[1])
|
||||
currentInterface.subnetMask.push(ipMatch[2])
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
if (currentInterface) {
|
||||
networkInfo.networkInterfaces.push(currentInterface)
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Error getting network config:', error)
|
||||
}
|
||||
|
||||
// 获取DNS服务器(macOS)
|
||||
try {
|
||||
const { stdout } = await execPromise('scutil --dns | grep nameserver | awk \'{print $3}\'')
|
||||
networkInfo.dnsServers = stdout.trim().split('\n').filter(dns => dns)
|
||||
} catch (error) {
|
||||
console.error('Error getting DNS servers:', error)
|
||||
}
|
||||
|
||||
// 获取网关(macOS)
|
||||
try {
|
||||
const { stdout } = await execPromise('netstat -nr | grep default')
|
||||
const gatewayMatch = stdout.match(/default\s+(\d+\.\d+\.\d+\.\d+)/)
|
||||
if (gatewayMatch) {
|
||||
networkInfo.gateway.push(gatewayMatch[1])
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Error getting gateway:', error)
|
||||
}
|
||||
}
|
||||
|
||||
return JSON.stringify(networkInfo, null, 2)
|
||||
} catch (error) {
|
||||
console.error('Error getting network info:', error)
|
||||
return JSON.stringify({ error: error.message }, null, 2)
|
||||
}
|
||||
},
|
||||
{
|
||||
name: "get_network_info",
|
||||
description: `获取系统网卡和网络信息,包括网卡配置、IP地址、MAC地址、DNS服务器、网关等`,
|
||||
schema: z.object({})
|
||||
}
|
||||
)
|
||||
Reference in New Issue
Block a user