Files
api_health/agent/tools/system/os_socket_info.js
2026-05-30 16:41:26 +08:00

158 lines
5.1 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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)
/**
* 获取系统活动连接和Socket信息工具
* @returns {string} - 返回Socket信息的 JSON 字符串,包括活动连接和监听端口等
*/
export const getSocketInfoTool = tool(
async (input) => {
try {
const socketInfo = {
platform: os.platform(),
activeConnections: [],
listeningPorts: []
}
// 获取活动连接Windows
if (os.platform() === 'win32') {
try {
const { stdout } = await execPromise('netstat -ano')
const lines = stdout.trim().split('\n').slice(4)
socketInfo.activeConnections = lines.map(line => {
const parts = line.trim().split(/\s+/)
if (parts.length >= 5) {
return {
protocol: parts[0],
localAddress: parts[1],
foreignAddress: parts[2],
state: parts[3],
processId: parts[4]
}
}
return null
}).filter(item => item)
} catch (error) {
console.error('Error getting active connections:', error)
}
// 获取监听端口Windows
try {
const { stdout } = await execPromise('netstat -an | findstr LISTENING')
const lines = stdout.trim().split('\n')
socketInfo.listeningPorts = lines.map(line => {
const parts = line.trim().split(/\s+/)
if (parts.length >= 4) {
return {
protocol: parts[0],
localAddress: parts[1],
state: parts[3]
}
}
return null
}).filter(item => item)
} catch (error) {
console.error('Error getting listening ports:', error)
}
}
// 获取活动连接Linux
else if (os.platform() === 'linux') {
try {
const { stdout } = await execPromise('ss -tuln')
const lines = stdout.trim().split('\n').slice(1)
socketInfo.activeConnections = lines.map(line => {
const parts = line.trim().split(/\s+/)
if (parts.length >= 5) {
return {
protocol: parts[0],
state: parts[1],
localAddress: parts[4],
peerAddress: parts[5]
}
}
return null
}).filter(item => item)
} catch (error) {
console.error('Error getting active connections:', error)
}
// 获取监听端口Linux
try {
const { stdout } = await execPromise('ss -tulpn')
const lines = stdout.trim().split('\n').slice(1)
socketInfo.listeningPorts = lines.map(line => {
const parts = line.trim().split(/\s+/)
if (parts.length >= 6) {
return {
protocol: parts[0],
state: parts[1],
localAddress: parts[4],
processInfo: parts[5]
}
}
return null
}).filter(item => item)
} catch (error) {
console.error('Error getting listening ports:', error)
}
}
// 获取活动连接macOS
else if (os.platform() === 'darwin') {
try {
const { stdout } = await execPromise('netstat -an')
const lines = stdout.trim().split('\n').slice(2)
socketInfo.activeConnections = lines.map(line => {
const parts = line.trim().split(/\s+/)
if (parts.length >= 6) {
return {
protocol: parts[0],
localAddress: parts[3],
foreignAddress: parts[4],
state: parts[5]
}
}
return null
}).filter(item => item)
} catch (error) {
console.error('Error getting active connections:', error)
}
// 获取监听端口macOS
try {
const { stdout } = await execPromise('netstat -an | grep LISTEN')
const lines = stdout.trim().split('\n')
socketInfo.listeningPorts = lines.map(line => {
const parts = line.trim().split(/\s+/)
if (parts.length >= 6) {
return {
protocol: parts[0],
localAddress: parts[3],
foreignAddress: parts[4],
state: parts[5]
}
}
return null
}).filter(item => item)
} catch (error) {
console.error('Error getting listening ports:', error)
}
}
return JSON.stringify(socketInfo, null, 2)
} catch (error) {
console.error('Error getting socket info:', error)
return JSON.stringify({ error: error.message }, null, 2)
}
},
{
name: "get_socket_info",
description: `获取系统活动连接和Socket信息包括TCP/UDP连接、监听端口、进程ID等`,
schema: z.object({})
}
)