mirror of
https://github.com/netbirdio/netbird.git
synced 2026-04-30 14:16:38 +00:00
94 lines
2.3 KiB
Go
94 lines
2.3 KiB
Go
package server
|
|
|
|
import (
|
|
"context"
|
|
"os"
|
|
"strconv"
|
|
|
|
log "github.com/sirupsen/logrus"
|
|
|
|
"github.com/netbirdio/netbird/client/internal"
|
|
"github.com/netbirdio/netbird/client/internal/sleep"
|
|
"github.com/netbirdio/netbird/client/proto"
|
|
)
|
|
|
|
const envDisableSleepDetector = "NB_DISABLE_SLEEP_DETECTOR"
|
|
|
|
// serverAgent adapts Server to the handler.Agent and handler.StatusChecker interfaces
|
|
type serverAgent struct {
|
|
s *Server
|
|
}
|
|
|
|
func (a *serverAgent) Up(ctx context.Context) error {
|
|
_, err := a.s.Up(ctx, &proto.UpRequest{})
|
|
return err
|
|
}
|
|
|
|
func (a *serverAgent) Down(ctx context.Context) error {
|
|
_, err := a.s.Down(ctx, &proto.DownRequest{})
|
|
return err
|
|
}
|
|
|
|
func (a *serverAgent) Status() (internal.StatusType, error) {
|
|
return internal.CtxGetState(a.s.rootCtx).Status()
|
|
}
|
|
|
|
// startSleepDetector starts the OS sleep/wake detector and forwards events to
|
|
// the sleep handler. On platforms without a supported detector the attempt
|
|
// logs a warning and returns. Setting NB_DISABLE_SLEEP_DETECTOR=true skips
|
|
// registration entirely.
|
|
func (s *Server) startSleepDetector() {
|
|
if sleepDetectorDisabled() {
|
|
log.Info("sleep detection disabled via " + envDisableSleepDetector)
|
|
return
|
|
}
|
|
|
|
svc, err := sleep.New()
|
|
if err != nil {
|
|
log.Warnf("failed to initialize sleep detection: %v", err)
|
|
return
|
|
}
|
|
|
|
err = svc.Register(func(event sleep.EventType) {
|
|
switch event {
|
|
case sleep.EventTypeSleep:
|
|
log.Info("handling sleep event")
|
|
if err := s.sleepHandler.HandleSleep(s.rootCtx); err != nil {
|
|
log.Errorf("failed to handle sleep event: %v", err)
|
|
}
|
|
case sleep.EventTypeWakeUp:
|
|
log.Info("handling wakeup event")
|
|
if err := s.sleepHandler.HandleWakeUp(s.rootCtx); err != nil {
|
|
log.Errorf("failed to handle wakeup event: %v", err)
|
|
}
|
|
}
|
|
})
|
|
if err != nil {
|
|
log.Errorf("failed to register sleep detector: %v", err)
|
|
return
|
|
}
|
|
|
|
log.Info("sleep detection service initialized")
|
|
|
|
go func() {
|
|
<-s.rootCtx.Done()
|
|
log.Info("stopping sleep event listener")
|
|
if err := svc.Deregister(); err != nil {
|
|
log.Errorf("failed to deregister sleep detector: %v", err)
|
|
}
|
|
}()
|
|
}
|
|
|
|
func sleepDetectorDisabled() bool {
|
|
val := os.Getenv(envDisableSleepDetector)
|
|
if val == "" {
|
|
return false
|
|
}
|
|
disabled, err := strconv.ParseBool(val)
|
|
if err != nil {
|
|
log.Warnf("failed to parse %s=%q: %v", envDisableSleepDetector, val, err)
|
|
return false
|
|
}
|
|
return disabled
|
|
}
|