Add error can be sent from cloud to display in api

Former-commit-id: 2167f22713
This commit is contained in:
Owen
2026-01-16 14:19:02 -08:00
parent 71044165d0
commit 0b46289136
4 changed files with 83 additions and 14 deletions

View File

@@ -19,6 +19,12 @@ import (
"golang.zx2c4.com/wireguard/tun"
)
// OlmErrorData represents the error data sent from the server
type OlmErrorData struct {
Code string `json:"code"`
Message string `json:"message"`
}
func (o *Olm) handleConnect(msg websocket.WSMessage) {
logger.Debug("Received message: %v", msg.Data)
@@ -206,11 +212,39 @@ func (o *Olm) handleConnect(msg websocket.WSMessage) {
logger.Info("WireGuard device created.")
}
func (o *Olm) handleOlmError(msg websocket.WSMessage) {
logger.Debug("Received olm error message: %v", msg.Data)
var errorData OlmErrorData
jsonData, err := json.Marshal(msg.Data)
if err != nil {
logger.Error("Error marshaling olm error data: %v", err)
return
}
if err := json.Unmarshal(jsonData, &errorData); err != nil {
logger.Error("Error unmarshaling olm error data: %v", err)
return
}
logger.Error("Olm error (code: %s): %s", errorData.Code, errorData.Message)
// Set the olm error in the API server so it can be exposed via status
o.apiServer.SetOlmError(errorData.Code, errorData.Message)
// Invoke onOlmError callback if configured
if o.olmConfig.OnOlmError != nil {
go o.olmConfig.OnOlmError(errorData.Code, errorData.Message)
}
}
func (o *Olm) handleTerminate(msg websocket.WSMessage) {
logger.Info("Received terminate message")
o.apiServer.SetTerminated(true)
o.apiServer.SetConnectionStatus(false)
o.apiServer.SetRegistered(false)
o.apiServer.ClearOlmError()
o.apiServer.ClearPeerStatuses()
network.ClearNetworkSettings()

View File

@@ -337,6 +337,7 @@ func (o *Olm) StartTunnel(config TunnelConfig) {
// Handlers for managing connection status
o.websocket.RegisterHandler("olm/wg/connect", o.handleConnect)
o.websocket.RegisterHandler("olm/error", o.handleOlmError)
o.websocket.RegisterHandler("olm/terminate", o.handleTerminate)
// Handlers for managing peers
@@ -427,6 +428,7 @@ func (o *Olm) StartTunnel(config TunnelConfig) {
o.apiServer.SetTerminated(true)
o.apiServer.SetConnectionStatus(false)
o.apiServer.SetRegistered(false)
o.apiServer.ClearOlmError()
o.apiServer.ClearPeerStatuses()
network.ClearNetworkSettings()
@@ -471,20 +473,20 @@ func (o *Olm) StartTunnel(config TunnelConfig) {
for {
select {
case <-sigChan:
logger.Info("SIGHUP received, toggling power mode")
if powerMode == "normal" {
powerMode = "low"
if err := o.SetPowerMode("low"); err != nil {
logger.Error("Failed to set low power mode: %v", err)
logger.Info("SIGHUP received, toggling power mode")
if powerMode == "normal" {
powerMode = "low"
if err := o.SetPowerMode("low"); err != nil {
logger.Error("Failed to set low power mode: %v", err)
}
} else {
powerMode = "normal"
if err := o.SetPowerMode("normal"); err != nil {
logger.Error("Failed to set normal power mode: %v", err)
}
}
} else {
powerMode = "normal"
if err := o.SetPowerMode("normal"); err != nil {
logger.Error("Failed to set normal power mode: %v", err)
}
}
case <-tunnelCtx.Done():
return
}
@@ -597,6 +599,7 @@ func (o *Olm) StopTunnel() error {
// Update API server status
o.apiServer.SetConnectionStatus(false)
o.apiServer.SetRegistered(false)
o.apiServer.ClearOlmError()
network.ClearNetworkSettings()
o.apiServer.ClearPeerStatuses()

View File

@@ -46,6 +46,7 @@ type OlmConfig struct {
OnConnected func()
OnTerminated func()
OnAuthError func(statusCode int, message string) // Called when auth fails (401/403)
OnOlmError func(code string, message string) // Called when registration fails
OnExit func() // Called when exit is requested via API
}