Add missing core CLI options for Windows

This commit is contained in:
Daniel 2024-08-22 14:22:17 +02:00
parent 77d8e3818d
commit 8abe04cb07

View file

@ -1,7 +1,7 @@
//nolint:gci,nolintlint
package main package main
import ( import (
"bufio"
"errors" "errors"
"flag" "flag"
"fmt" "fmt"
@ -23,7 +23,17 @@ import (
"github.com/safing/portmaster/spn/conf" "github.com/safing/portmaster/spn/conf"
) )
var sigUSR1 = syscall.Signal(0xa) var (
printStackOnExit bool
enableInputSignals bool
sigUSR1 = syscall.Signal(0xa) // dummy for windows
)
func init() {
flag.BoolVar(&printStackOnExit, "print-stack-on-exit", false, "prints the stack before of shutting down")
flag.BoolVar(&enableInputSignals, "input-signals", false, "emulate signals using stdin")
}
func main() { func main() {
flag.Parse() flag.Parse()
@ -80,12 +90,21 @@ func main() {
err = instance.Start() err = instance.Start()
if err != nil { if err != nil {
fmt.Printf("instance start failed: %s\n", err) fmt.Printf("instance start failed: %s\n", err)
// Print stack on start failure, if enabled.
if printStackOnExit {
printStackTo(os.Stdout, "PRINTING STACK ON START FAILURE")
}
os.Exit(1) os.Exit(1)
} }
}() }()
// Wait for signal. // Wait for signal.
signalCh := make(chan os.Signal, 1) signalCh := make(chan os.Signal, 1)
if enableInputSignals {
go inputSignals(signalCh)
}
signal.Notify( signal.Notify(
signalCh, signalCh,
os.Interrupt, os.Interrupt,
@ -139,6 +158,12 @@ func main() {
slog.Error("failed to stop", "err", err) slog.Error("failed to stop", "err", err)
} }
log.Shutdown() log.Shutdown()
// Print stack on shutdown, if enabled.
if printStackOnExit {
printStackTo(os.Stdout, "PRINTING STACK ON EXIT")
}
os.Exit(instance.ExitCode()) os.Exit(instance.ExitCode())
} }
@ -151,3 +176,21 @@ func printStackTo(writer io.Writer, msg string) {
slog.Error("failed to write stack trace", "err", err) slog.Error("failed to write stack trace", "err", err)
} }
} }
func inputSignals(signalCh chan os.Signal) {
scanner := bufio.NewScanner(os.Stdin)
for scanner.Scan() {
switch scanner.Text() {
case "SIGHUP":
signalCh <- syscall.SIGHUP
case "SIGINT":
signalCh <- syscall.SIGINT
case "SIGQUIT":
signalCh <- syscall.SIGQUIT
case "SIGTERM":
signalCh <- syscall.SIGTERM
case "SIGUSR1":
signalCh <- sigUSR1
}
}
}