added reconnection functionality to the agent, which is used if the server is not reachable

This commit is contained in:
Stefan Friese 2025-01-21 14:03:07 +00:00
parent 555d235c3d
commit 323c04af89
1 changed files with 46 additions and 11 deletions

View File

@ -74,27 +74,62 @@ func registerAgent(agentName string, agentId string, agentIp string) error {
}
func connectToWebSocket(agentName string, agentIp string) error {
func connectToWebSocket(agentName, agentIp string) error {
wsURL := fmt.Sprintf("ws://%s/data?agentName=%s&IPv4Address=%s", webSocketAddr, url.QueryEscape(agentName), url.QueryEscape(agentIp))
var err error
for {
conn, _, err = websocket.DefaultDialer.Dial(wsURL, nil)
if err != nil {
return fmt.Errorf("Failed to connect to WebSocket: %v", err)
if err == nil {
log.Println("WeSocket connection established")
return nil
}
log.Println("WebSocket connection established")
return nil
log.Printf("Failed to connect to WebSocket: %v. Retrying in 5 seconds...", err)
time.Sleep(5 * time.Second)
}
}
func listenForCommands() {
func reconnectToWebSocket(agentName, agentIp string) error {
backoff := 2 * time.Second
maxBackoff := 1 * time.Minute
for {
log.Println("Attempting to reconnect to WebSocket...")
err := connectToWebSocket(agentName, agentIp)
if err == nil {
log.Println("Reconnection succesful.")
return nil
}
log.Printf("Reconnection failed: %v", err)
time.Sleep(backoff)
backoff *= 2
if backoff > maxBackoff {
backoff = maxBackoff
}
}
}
func listenForCommands(agentName, agentIp string) {
defer conn.Close()
for {
_, rawMessage, err := conn.ReadMessage()
if err != nil {
log.Printf("Error reading message: %v", err)
break
log.Printf("Connection lost: %v", err)
if reconnectErr := reconnectToWebSocket(agentName, agentIp); reconnectErr != nil {
log.Printf("Critical error during reconnection: %v", reconnectErr)
}
continue
}
// for {
// _, rawMessage, err := conn.ReadMessage()
// if err != nil {
// log.Printf("Error reading message: %v", err)
// break
// }
var message Message
if err := json.Unmarshal(rawMessage, &message); err != nil {
@ -154,5 +189,5 @@ func main() {
log.Fatalf("Websocket connection failed: %v", err)
}
listenForCommands()
listenForCommands(agentName, agentIp)
}