This does not fix the reload issue, but will give us flexibility to access the packetConn and listener to make this all work.
79 lines
1.7 KiB
Go
79 lines
1.7 KiB
Go
// +build !windows
|
|
|
|
package core
|
|
|
|
import (
|
|
"io/ioutil"
|
|
"log"
|
|
"os"
|
|
"os/signal"
|
|
"syscall"
|
|
)
|
|
|
|
// trapSignalsPosix captures POSIX-only signals.
|
|
func trapSignalsPosix() {
|
|
go func() {
|
|
sigchan := make(chan os.Signal, 1)
|
|
signal.Notify(sigchan, syscall.SIGTERM, syscall.SIGHUP, syscall.SIGQUIT, syscall.SIGUSR1)
|
|
|
|
for sig := range sigchan {
|
|
switch sig {
|
|
case syscall.SIGTERM:
|
|
log.Println("[INFO] SIGTERM: Terminating process")
|
|
if PidFile != "" {
|
|
os.Remove(PidFile)
|
|
}
|
|
os.Exit(0)
|
|
|
|
case syscall.SIGQUIT:
|
|
log.Println("[INFO] SIGQUIT: Shutting down")
|
|
exitCode := executeShutdownCallbacks("SIGQUIT")
|
|
err := Stop()
|
|
if err != nil {
|
|
log.Printf("[ERROR] SIGQUIT stop: %v", err)
|
|
exitCode = 1
|
|
}
|
|
if PidFile != "" {
|
|
os.Remove(PidFile)
|
|
}
|
|
os.Exit(exitCode)
|
|
|
|
case syscall.SIGHUP:
|
|
log.Println("[INFO] SIGHUP: Hanging up")
|
|
err := Stop()
|
|
if err != nil {
|
|
log.Printf("[ERROR] SIGHUP stop: %v", err)
|
|
}
|
|
|
|
case syscall.SIGUSR1:
|
|
log.Println("[INFO] SIGUSR1: Reloading")
|
|
|
|
var updatedCaddyfile Input
|
|
|
|
caddyfileMu.Lock()
|
|
if caddyfile == nil {
|
|
// Hmm, did spawing process forget to close stdin? Anyhow, this is unusual.
|
|
log.Println("[ERROR] SIGUSR1: no Corefile to reload (was stdin left open?)")
|
|
caddyfileMu.Unlock()
|
|
continue
|
|
}
|
|
if caddyfile.IsFile() {
|
|
body, err := ioutil.ReadFile(caddyfile.Path())
|
|
if err == nil {
|
|
updatedCaddyfile = CaddyfileInput{
|
|
Filepath: caddyfile.Path(),
|
|
Contents: body,
|
|
RealFile: true,
|
|
}
|
|
}
|
|
}
|
|
caddyfileMu.Unlock()
|
|
|
|
err := Restart(updatedCaddyfile)
|
|
if err != nil {
|
|
log.Printf("[ERROR] SIGUSR1: %v", err)
|
|
}
|
|
}
|
|
}
|
|
}()
|
|
}
|