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:
+1
-1
@@ -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
|
||||
|
||||
@@ -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
@@ -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():
|
||||
|
||||
@@ -6,7 +6,6 @@ import (
|
||||
"log"
|
||||
"os/exec"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user