去除代理头支持, 增加节点面板通信加密 增加导出sql

This commit is contained in:
qaq
2025-07-11 16:24:12 +08:00
parent b690e68951
commit e313a1953c
21 changed files with 960 additions and 143 deletions
+103 -16
View File
@@ -16,6 +16,7 @@ import (
"time"
"github.com/go-gost/x/config"
"github.com/go-gost/x/internal/util/crypto"
"github.com/gorilla/websocket"
"github.com/shirou/gopsutil/v3/cpu"
"github.com/shirou/gopsutil/v3/host"
@@ -90,13 +91,24 @@ type WebSocketReporter struct {
ctx context.Context
cancel context.CancelFunc
connected bool
connecting bool // 新增:正在连接状态
connMutex sync.Mutex // 新增:连接状态锁
connecting bool // 新增:正在连接状态
connMutex sync.Mutex // 新增:连接状态锁
aesCrypto *crypto.AESCrypto // 新增:AES加密器
}
// NewWebSocketReporter 创建一个新的WebSocket报告器
func NewWebSocketReporter(serverURL string) *WebSocketReporter {
func NewWebSocketReporter(serverURL string, secret string) *WebSocketReporter {
ctx, cancel := context.WithCancel(context.Background())
// 创建 AES 加密器
aesCrypto, err := crypto.NewAESCrypto(secret)
if err != nil {
fmt.Printf("❌ 创建 AES 加密器失败: %v\n", err)
aesCrypto = nil
} else {
fmt.Printf("🔐 AES 加密器创建成功\n")
}
return &WebSocketReporter{
url: serverURL,
reconnectTime: 5 * time.Second, // 重连间隔
@@ -106,6 +118,7 @@ func NewWebSocketReporter(serverURL string) *WebSocketReporter {
cancel: cancel,
connected: false,
connecting: false,
aesCrypto: aesCrypto,
}
}
@@ -134,7 +147,7 @@ func (w *WebSocketReporter) run() {
w.connMutex.Lock()
needConnect := !w.connected && !w.connecting
w.connMutex.Unlock()
if needConnect {
if err := w.connect(); err != nil {
fmt.Printf("❌ WebSocket连接失败: %v,%v后重试\n", err, w.reconnectTime)
@@ -167,12 +180,12 @@ func (w *WebSocketReporter) run() {
func (w *WebSocketReporter) connect() error {
w.connMutex.Lock()
defer w.connMutex.Unlock()
// 如果已经在连接中或已连接,直接返回
if w.connecting || w.connected {
return nil
}
// 设置连接中状态
w.connecting = true
defer func() {
@@ -242,7 +255,7 @@ func (w *WebSocketReporter) handleConnection() {
w.connMutex.Lock()
isConnected := w.connected
w.connMutex.Unlock()
if !isConnected {
return
}
@@ -276,7 +289,7 @@ func (w *WebSocketReporter) collectSystemInfo() SystemInfo {
func (w *WebSocketReporter) sendSystemInfo(sysInfo SystemInfo) error {
w.connMutex.Lock()
defer w.connMutex.Unlock()
if w.conn == nil || !w.connected {
return fmt.Errorf("连接未建立")
}
@@ -287,10 +300,35 @@ func (w *WebSocketReporter) sendSystemInfo(sysInfo SystemInfo) error {
return fmt.Errorf("序列化系统信息失败: %v", err)
}
var messageData []byte
// 如果有加密器,则加密数据
if w.aesCrypto != nil {
encryptedData, err := w.aesCrypto.Encrypt(jsonData)
if err != nil {
fmt.Printf("⚠️ 加密失败,发送原始数据: %v\n", err)
messageData = jsonData
} else {
// 创建加密消息包装器
encryptedMessage := map[string]interface{}{
"encrypted": true,
"data": encryptedData,
"timestamp": time.Now().Unix(),
}
messageData, err = json.Marshal(encryptedMessage)
if err != nil {
fmt.Printf("⚠️ 序列化加密消息失败,发送原始数据: %v\n", err)
messageData = jsonData
}
}
} else {
messageData = jsonData
}
// 设置写入超时
w.conn.SetWriteDeadline(time.Now().Add(5 * time.Second))
if err := w.conn.WriteMessage(websocket.TextMessage, jsonData); err != nil {
if err := w.conn.WriteMessage(websocket.TextMessage, messageData); err != nil {
w.connected = false // 标记连接已断开
return fmt.Errorf("写入消息失败: %v", err)
}
@@ -309,7 +347,7 @@ func (w *WebSocketReporter) receiveMessages() {
conn := w.conn
connected := w.connected
w.connMutex.Unlock()
if conn == nil || !connected {
return
}
@@ -338,6 +376,30 @@ func (w *WebSocketReporter) receiveMessages() {
func (w *WebSocketReporter) handleReceivedMessage(messageType int, message []byte) {
switch messageType {
case websocket.TextMessage:
// 先检查是否是加密消息
var encryptedWrapper struct {
Encrypted bool `json:"encrypted"`
Data string `json:"data"`
Timestamp int64 `json:"timestamp"`
}
// 尝试解析为加密消息格式
if err := json.Unmarshal(message, &encryptedWrapper); err == nil && encryptedWrapper.Encrypted {
if w.aesCrypto != nil {
// 解密数据
decryptedData, err := w.aesCrypto.Decrypt(encryptedWrapper.Data)
if err != nil {
fmt.Printf("❌ 解密失败: %v\n", err)
w.sendErrorResponse("DecryptError", fmt.Sprintf("解密失败: %v", err))
return
}
message = decryptedData
} else {
fmt.Printf("❌ 收到加密消息但没有加密器\n")
w.sendErrorResponse("NoDecryptor", "没有可用的解密器")
return
}
}
// 先尝试解析是否是压缩消息
var compressedMsg struct {
Type string `json:"type"`
@@ -744,7 +806,7 @@ func (w *WebSocketReporter) handleCall(data interface{}) error {
func (w *WebSocketReporter) sendResponse(response CommandResponse) {
w.connMutex.Lock()
defer w.connMutex.Unlock()
if w.conn == nil || !w.connected {
fmt.Printf("❌ 无法发送响应:连接未建立\n")
return
@@ -756,19 +818,44 @@ func (w *WebSocketReporter) sendResponse(response CommandResponse) {
return
}
var messageData []byte
// 如果有加密器,则加密数据
if w.aesCrypto != nil {
encryptedData, err := w.aesCrypto.Encrypt(jsonData)
if err != nil {
fmt.Printf("⚠️ 加密响应失败,发送原始数据: %v\n", err)
messageData = jsonData
} else {
// 创建加密消息包装器
encryptedMessage := map[string]interface{}{
"encrypted": true,
"data": encryptedData,
"timestamp": time.Now().Unix(),
}
messageData, err = json.Marshal(encryptedMessage)
if err != nil {
fmt.Printf("⚠️ 序列化加密响应失败,发送原始数据: %v\n", err)
messageData = jsonData
}
}
} else {
messageData = jsonData
}
// 检查消息大小,如果超过10MB则记录警告
if len(jsonData) > 10*1024*1024 {
fmt.Printf("⚠️ 响应消息过大 (%.2f MB),可能会被拒绝\n", float64(len(jsonData))/(1024*1024))
if len(messageData) > 10*1024*1024 {
fmt.Printf("⚠️ 响应消息过大 (%.2f MB),可能会被拒绝\n", float64(len(messageData))/(1024*1024))
}
// 设置较长的写入超时,以应对大消息
timeout := 5 * time.Second
if len(jsonData) > 1024*1024 {
if len(messageData) > 1024*1024 {
timeout = 30 * time.Second
}
w.conn.SetWriteDeadline(time.Now().Add(timeout))
if err := w.conn.WriteMessage(websocket.TextMessage, jsonData); err != nil {
if err := w.conn.WriteMessage(websocket.TextMessage, messageData); err != nil {
fmt.Printf("❌ 发送响应失败: %v\n", err)
w.connected = false
}
@@ -852,7 +939,7 @@ func StartWebSocketReporterWithConfig(Addr string, Secret string, Version string
fmt.Printf("🔗 WebSocket连接URL: %s\n", fullURL)
reporter := NewWebSocketReporter(fullURL)
reporter := NewWebSocketReporter(fullURL, Secret) // Pass Secret here
reporter.Start()
return reporter
}