WebSocket-Infrastruktur: bidirektionaler Command-Kanal + TCP-Tunnel

- Agent: WS-Client mit Reconnect, Command-Handler (exec, tunnel_open/close/data)
- Backend: WS-Hub, Tunnel-Manager mit dynamischen Proxy-Ports (10000-20000)
- API: /agents/{id}/exec, /tunnel, /tunnels, /proxy/{tunnel_id}
- Binary WebSocket Messages fuer effiziente Tunnel-Daten
- gorilla/websocket (pure Go, kein CGO)
- README aktualisiert
This commit is contained in:
cynfo3000
2026-02-28 07:42:33 +01:00
parent 6120d0cffa
commit f47154787d
12 changed files with 1211 additions and 198 deletions
+1 -1
View File
@@ -4,4 +4,4 @@ go 1.22
require gopkg.in/yaml.v3 v3.0.1
require github.com/gorilla/websocket v1.5.3 // indirect
require github.com/gorilla/websocket v1.5.3
+8
View File
@@ -12,6 +12,7 @@ import (
"github.com/cynfo/rmm-agent/client"
"github.com/cynfo/rmm-agent/collector"
"github.com/cynfo/rmm-agent/config"
"github.com/cynfo/rmm-agent/ws"
)
func main() {
@@ -79,6 +80,13 @@ func main() {
log.Printf("Agent registriert mit ID: %s", agentID)
// WebSocket-Client starten
wsClient := ws.NewClient(cfg.BackendURL, agentID, cfg.APIKey, cfg.Insecure)
if err := wsClient.Start(); err != nil {
log.Printf("WebSocket-Client starten fehlgeschlagen: %v", err)
}
defer wsClient.Stop()
// Heartbeat-Loop
ticker := time.NewTicker(time.Duration(cfg.IntervalSeconds) * time.Second)
defer ticker.Stop()
+18 -3
View File
@@ -3,9 +3,9 @@ package ws
import (
"context"
"crypto/tls"
"encoding/json"
"fmt"
"log"
"net/http"
"net/url"
"sync"
"time"
@@ -218,12 +218,27 @@ func (c *Client) readMessages(conn *websocket.Conn, msgChan chan<- Message, errC
defer close(msgChan)
for {
var msg Message
if err := conn.ReadJSON(&msg); err != nil {
messageType, data, err := conn.ReadMessage()
if err != nil {
errChan <- err
return
}
if messageType == websocket.BinaryMessage {
// Binary-Message für Tunnel-Daten verarbeiten
if err := c.tunnelManager.ProcessBinaryMessage(data); err != nil {
log.Printf("Binary-Message verarbeiten fehlgeschlagen: %v", err)
}
continue
}
// JSON-Message parsen
var msg Message
if err := json.Unmarshal(data, &msg); err != nil {
log.Printf("JSON-Message parsen fehlgeschlagen: %v", err)
continue
}
select {
case msgChan <- msg:
case <-c.ctx.Done():
-1
View File
@@ -6,7 +6,6 @@ import (
"log"
"os/exec"
"strconv"
"strings"
"time"
)