diff --git a/goseg/handler/system.go b/goseg/handler/system.go index 267de0db..26dde404 100644 --- a/goseg/handler/system.go +++ b/goseg/handler/system.go @@ -53,6 +53,11 @@ func SystemHandler(msg []byte) error { zap.L().Info(fmt.Sprintf("Device shutdown requested")) switch systemPayload.Payload.Command { case "restart": + if err = config.UpdateConf(map[string]interface{}{ + "gracefulExit": true, + }); err != nil { + zap.L().Error(fmt.Sprintf("Couldn't set graceful exit to true: %v", err)) + } if config.DebugMode { zap.L().Debug(fmt.Sprintf("DebugMode detected, skipping GroundSeg restart. Exiting program.")) os.Exit(0) @@ -68,6 +73,11 @@ func SystemHandler(msg []byte) error { switch systemPayload.Payload.Command { case "shutdown": zap.L().Info(fmt.Sprintf("Device shutdown requested")) + if err = config.UpdateConf(map[string]interface{}{ + "gracefulExit": true, + }); err != nil { + zap.L().Error(fmt.Sprintf("Couldn't set graceful exit to true: %v", err)) + } if config.DebugMode { zap.L().Debug(fmt.Sprintf("DebugMode detected, skipping shutdown. Exiting program.")) os.Exit(0) @@ -78,6 +88,11 @@ func SystemHandler(msg []byte) error { } case "restart": zap.L().Info(fmt.Sprintf("Device restart requested")) + if err = config.UpdateConf(map[string]interface{}{ + "gracefulExit": true, + }); err != nil { + zap.L().Error(fmt.Sprintf("Couldn't set graceful exit to true: %v", err)) + } if config.DebugMode { zap.L().Debug(fmt.Sprintf("DebugMode detected, skipping restart. Exiting program.")) os.Exit(0) diff --git a/goseg/routines/system.go b/goseg/routines/system.go index c861b42c..f282ba90 100644 --- a/goseg/routines/system.go +++ b/goseg/routines/system.go @@ -45,21 +45,26 @@ func AptUpdateLoop() { } func mDNSServer() { - domains, err := mDNSDiscovery() - if err != nil { - zap.L().Warn("Couldn't discover mDNS servers on LAN -- defaulting to nativeplanet.local") + conf := config.Conf() + if !conf.GracefulExit && (len(conf.LastKnownMDNS) > 0) { + system.LocalUrl = conf.LastKnownMDNS } else { - // check if there's already a nativeplanet.local - counter := 2 - domainBase := strings.Split(LocalDomain, ".")[0] - for contains(domains, domainBase) { - LocalDomain = fmt.Sprintf("nativeplanet%d.local", counter) - zap.L().Info(fmt.Sprintf("Incrementing to %v...", LocalDomain)) - counter++ - domainBase = strings.Split(LocalDomain, ".")[0] + domains, err := mDNSDiscovery() + if err != nil { + zap.L().Warn("Couldn't discover mDNS servers on LAN -- defaulting to nativeplanet.local") + } else { + // check if there's already a nativeplanet.local + counter := 2 + domainBase := strings.Split(LocalDomain, ".")[0] + for contains(domains, domainBase) { + LocalDomain = fmt.Sprintf("nativeplanet%d.local", counter) + zap.L().Info(fmt.Sprintf("Incrementing to %v...", LocalDomain)) + counter++ + domainBase = strings.Split(LocalDomain, ".")[0] + } } + system.LocalUrl = LocalDomain } - system.LocalUrl = LocalDomain // advertise the http server on loop // we use RegisterProxy so we can spoof the hostname for { @@ -68,7 +73,7 @@ func mDNSServer() { fmt.Println("Error:", err) return } - zap.L().Debug(fmt.Sprintf("Announcing %v for %v", system.LocalUrl, ips)) + zap.L().Info(fmt.Sprintf("Announcing %v for %v", system.LocalUrl, ips)) server, err := zeroconf.RegisterProxy( strings.Split(system.LocalUrl, ".")[0], "_http._tcp", @@ -81,6 +86,14 @@ func mDNSServer() { ) if err != nil { zap.L().Error(fmt.Sprintf("Failed to announce mDNS server: %v", err)) + } else { + zap.L().Info(fmt.Sprintf("Caching %v", system.LocalUrl)) + if err = config.UpdateConf(map[string]interface{}{ + "gracefulExit": false, + "lastKnownMDNS": system.LocalUrl, + }); err != nil { + zap.L().Error(fmt.Sprintf("Couldn't update mdns cache: %v", err)) + } } time.Sleep(120 * time.Second) server.Shutdown()