mirror of
https://github.com/decke/smtprelay.git
synced 2025-12-26 02:52:31 -07:00
Handle signals and gracefully shut down server
This commit is contained in:
47
main.go
47
main.go
@@ -6,8 +6,9 @@ import (
|
|||||||
"net"
|
"net"
|
||||||
"net/textproto"
|
"net/textproto"
|
||||||
"os"
|
"os"
|
||||||
|
"os/signal"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"syscall"
|
||||||
|
|
||||||
"github.com/chrj/smtpd"
|
"github.com/chrj/smtpd"
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
@@ -284,6 +285,8 @@ func main() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var servers []*smtpd.Server
|
||||||
|
|
||||||
// Create a server for each desired listen address
|
// Create a server for each desired listen address
|
||||||
for _, listenAddr := range strings.Split(*listen, " ") {
|
for _, listenAddr := range strings.Split(*listen, " ") {
|
||||||
server := &smtpd.Server{
|
server := &smtpd.Server{
|
||||||
@@ -334,12 +337,46 @@ func main() {
|
|||||||
"address": listenAddr,
|
"address": listenAddr,
|
||||||
}).WithError(err).Fatal("error starting listener")
|
}).WithError(err).Fatal("error starting listener")
|
||||||
}
|
}
|
||||||
defer lsnr.Close()
|
servers = append(servers, server)
|
||||||
|
|
||||||
go server.Serve(lsnr)
|
go func() {
|
||||||
|
server.Serve(lsnr)
|
||||||
|
}()
|
||||||
}
|
}
|
||||||
|
|
||||||
for true {
|
handleSignals()
|
||||||
time.Sleep(time.Minute)
|
|
||||||
|
// First close the listeners
|
||||||
|
for _, server := range servers {
|
||||||
|
logger := log.WithField("address", server.Address())
|
||||||
|
logger.Debug("Shutting down server")
|
||||||
|
err := server.Shutdown(false)
|
||||||
|
if err != nil {
|
||||||
|
logger.WithError(err).
|
||||||
|
Warning("Shutdown failed")
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Then wait for the clients to exit
|
||||||
|
for _, server := range servers {
|
||||||
|
logger := log.WithField("address", server.Address())
|
||||||
|
logger.Debug("Waiting for server")
|
||||||
|
err := server.Wait()
|
||||||
|
if err != nil {
|
||||||
|
logger.WithError(err).
|
||||||
|
Warning("Wait failed")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Debug("done")
|
||||||
|
}
|
||||||
|
|
||||||
|
func handleSignals() {
|
||||||
|
// Wait for SIGINT, SIGQUIT, or SIGTERM
|
||||||
|
sigs := make(chan os.Signal, 1)
|
||||||
|
signal.Notify(sigs, syscall.SIGINT, syscall.SIGQUIT, syscall.SIGTERM)
|
||||||
|
sig := <-sigs
|
||||||
|
|
||||||
|
log.WithField("signal", sig).
|
||||||
|
Info("shutting down in response to received signal")
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user