44 lines
1.2 KiB
Go
44 lines
1.2 KiB
Go
package tunnel
|
|
|
|
import (
|
|
"os"
|
|
"os/signal"
|
|
"syscall"
|
|
|
|
"github.com/rs/zerolog"
|
|
)
|
|
|
|
// waitForSignal handles OS signals for graceful shutdown and configuration reload.
|
|
// It closes graceShutdownC on SIGTERM/SIGINT to trigger graceful shutdown.
|
|
// If reloadC is provided, SIGHUP will send a reload signal instead of being ignored.
|
|
func waitForSignal(graceShutdownC chan struct{}, reloadC chan<- struct{}, logger *zerolog.Logger) {
|
|
signals := make(chan os.Signal, 10)
|
|
signal.Notify(signals, syscall.SIGTERM, syscall.SIGINT, syscall.SIGHUP)
|
|
defer signal.Stop(signals)
|
|
|
|
for {
|
|
select {
|
|
case s := <-signals:
|
|
switch s {
|
|
case syscall.SIGHUP:
|
|
if reloadC != nil {
|
|
logger.Info().Msg("Received SIGHUP, triggering configuration reload")
|
|
select {
|
|
case reloadC <- struct{}{}:
|
|
default:
|
|
logger.Warn().Msg("Configuration reload already in progress, skipping")
|
|
}
|
|
} else {
|
|
logger.Info().Msg("Received SIGHUP but hot reload is not enabled for this tunnel")
|
|
}
|
|
case syscall.SIGTERM, syscall.SIGINT:
|
|
logger.Info().Msgf("Initiating graceful shutdown due to signal %s ...", s)
|
|
close(graceShutdownC)
|
|
return
|
|
}
|
|
case <-graceShutdownC:
|
|
return
|
|
}
|
|
}
|
|
}
|