diff --git a/cmd/main.go b/cmd/main.go index fcf2cdfe..0e49174f 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -101,15 +101,22 @@ func supervise() error { cmd.Args = os.Args logFile, err := os.CreateTemp("", "jetkvm-stdout.log") - defer func() { - // we don't care about the errors here - _ = logFile.Close() - _ = os.Remove(logFile.Name()) - }() if err != nil { return fmt.Errorf("failed to create log file: %w", err) } + logFileName := logFile.Name() + defer func() { + // Close file if it's still open (safe to call even if already closed) + if logFile != nil { + _ = logFile.Close() + } + // Only remove if file still exists at original location (wasn't renamed) + if _, err := os.Stat(logFileName); err == nil { + _ = os.Remove(logFileName) + } + }() + // Use io.MultiWriter to write to both the original streams and our buffers cmd.Stdout = io.MultiWriter(os.Stdout, logFile) cmd.Stderr = io.MultiWriter(os.Stderr, logFile) @@ -133,6 +140,8 @@ func supervise() error { } if exiterr, ok := cmdErr.(*exec.ExitError); ok { + // createErrorDump will close and rename the file if successful + // Note: os.Exit bypasses defer, but file is already handled by createErrorDump createErrorDump(logFile) os.Exit(exiterr.ExitCode()) } diff --git a/network.go b/network.go index eb14c70d..b2b224f0 100644 --- a/network.go +++ b/network.go @@ -6,6 +6,7 @@ import ( "net" "net/http" "reflect" + "sync/atomic" "time" "github.com/jetkvm/kvm/internal/confparser" @@ -118,6 +119,10 @@ func setPublicIPReadyState(ipv4Ready, ipv6Ready bool) { publicIPState.SetIPv4AndIPv6(ipv4Ready, ipv6Ready) } +var ( + isOnline = &atomic.Bool{} +) + func networkStateChanged(_ string, state types.InterfaceState) { // do not block the main thread go waitCtrlAndRequestDisplayUpdate(true, "network_state_changed") @@ -126,7 +131,10 @@ func networkStateChanged(_ string, state types.InterfaceState) { writeJSONRPCEvent("networkState", state.ToRpcInterfaceState(), currentSession) } - if state.Online { + previousOnline := isOnline.Load() + isOnline.Store(state.Online) + + if state.Online && !previousOnline { networkLogger.Info().Msg("network state changed to online, triggering time sync") triggerTimeSyncOnNetworkStateChange() }