增加公网 IP 采集和网卡 IP 展示

This commit is contained in:
dushixiang committed 2026-01-17 16:24:59 +08:00
1 parent 6fa90252df
commit be54ef2d31
28 files changed
+956 -59

No files matched your search

+90
View File
@@ -9,6 +9,7 @@ import (
"log/slog"
"os"
"runtime"
"strings"
"sync"
"time"
@@ -290,6 +291,8 @@ func (a *Agent) readLoop(conn *websocket.Conn, done chan struct{}) error {
go a.handleTamperProtect(msg.Data)
case protocol.MessageTypeDDNSConfig:
go a.handleDDNSConfig(msg.Data)
case protocol.MessageTypePublicIPConfig:
go a.handlePublicIPConfig(msg.Data)
case protocol.MessageTypeSSHLoginConfig:
go a.handleSSHLoginConfig(conn, msg.Data)
case protocol.MessageTypeUninstall:
@@ -786,6 +789,93 @@ func (a *Agent) handleDDNSConfig(data json.RawMessage) {
}
}
// handlePublicIPConfig 处理公网 IP 采集配置
func (a *Agent) handlePublicIPConfig(data json.RawMessage) {
var config protocol.PublicIPConfigData
if err := json.Unmarshal(data, &config); err != nil {
slog.Warn("解析公网 IP 采集配置失败", "error", err)
return
}
if !config.Enabled || (!config.IPv4Enabled && !config.IPv6Enabled) {
slog.Info("公网 IP 采集已禁用或未配置")
return
}
manager := a.getCollectorManager()
if manager == nil {
manager = collector.NewManager(a.cfg)
a.setCollectorManager(manager)
}
conn := a.getActiveConn()
if conn == nil {
slog.Debug("当前连接不可用,公网 IP 采集跳过")
return
}
var report protocol.PublicIPReportData
if config.IPv4Enabled {
ipv4, err := a.getPublicIPFromAPIs(manager, config.IPv4APIs, false)
if err != nil {
slog.Warn("获取 IPv4 失败", "error", err)
} else {
report.IPv4 = ipv4
slog.Info("获取 IPv4", "ip", ipv4)
}
}
if config.IPv6Enabled {
ipv6, err := a.getPublicIPFromAPIs(manager, config.IPv6APIs, true)
if err != nil {
slog.Warn("获取 IPv6 失败", "error", err)
} else {
report.IPv6 = ipv6
slog.Info("获取 IPv6", "ip", ipv6)
}
}
if report.IPv4 == "" && report.IPv6 == "" {
return
}
if err := conn.WriteJSON(protocol.OutboundMessage{
Type: protocol.MessageTypePublicIPReport,
Data: report,
}); err != nil {
slog.Warn("发送公网 IP 报告失败", "error", err)
}
}
func (a *Agent) getPublicIPFromAPIs(manager *collector.Manager, apis []string, isIPv6 bool) (string, error) {
if len(apis) == 0 {
return manager.GetPublicIP("", isIPv6)
}
var lastErr error
for _, api := range apis {
api = strings.TrimSpace(api)
if api == "" {
continue
}
if !strings.HasPrefix(api, "http://") && !strings.HasPrefix(api, "https://") {
lastErr = fmt.Errorf("非法 API 地址: %s", api)
continue
}
ip, err := manager.GetPublicIP(api, isIPv6)
if err == nil && ip != "" {
return ip, nil
}
lastErr = err
}
if lastErr != nil {
return "", lastErr
}
return "", fmt.Errorf("未能获取公网 IP 地址")
}
// collectAndSendDDNSIP 采集并发送 DDNS IP 地址
func (a *Agent) collectAndSendDDNSIP(conn *safeConn, manager *collector.Manager, config *protocol.DDNSConfigData) error {
var ipReport protocol.DDNSIPReportData