mirror of
https://github.com/fosrl/olm.git
synced 2026-02-16 18:06:43 +00:00
@@ -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)
|
||||
|
||||
@@ -209,8 +215,51 @@ 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")
|
||||
|
||||
var errorData OlmErrorData
|
||||
|
||||
jsonData, err := json.Marshal(msg.Data)
|
||||
if err != nil {
|
||||
logger.Error("Error marshaling terminate error data: %v", err)
|
||||
} else {
|
||||
if err := json.Unmarshal(jsonData, &errorData); err != nil {
|
||||
logger.Error("Error unmarshaling terminate error data: %v", err)
|
||||
} else {
|
||||
logger.Info("Terminate reason (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)
|
||||
}
|
||||
}
|
||||
|
||||
o.apiServer.SetTerminated(true)
|
||||
o.apiServer.SetConnectionStatus(false)
|
||||
o.apiServer.SetRegistered(false)
|
||||
|
||||
29
olm/olm.go
29
olm/olm.go
@@ -342,6 +342,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
|
||||
@@ -434,6 +435,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()
|
||||
|
||||
@@ -478,20 +480,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
|
||||
}
|
||||
@@ -604,6 +606,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()
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user