diff --git a/cmd/gluetun/main.go b/cmd/gluetun/main.go index 9b85021b..ca408a70 100644 --- a/cmd/gluetun/main.go +++ b/cmd/gluetun/main.go @@ -37,6 +37,9 @@ import ( "github.com/qdm12/golibs/logging" "github.com/qdm12/golibs/params" "github.com/qdm12/goshutdown" + "github.com/qdm12/goshutdown/goroutine" + "github.com/qdm12/goshutdown/group" + "github.com/qdm12/goshutdown/order" "github.com/qdm12/gosplash" "github.com/qdm12/updated/pkg/dnscrypto" ) @@ -302,6 +305,7 @@ func _main(ctx context.Context, buildInfo models.BuildInformation, } // TODO move inside firewall? // Shutdown settings + const totalShutdownTimeout = 3 * time.Second const defaultShutdownTimeout = 400 * time.Millisecond defaultShutdownOnSuccess := func(goRoutineName string) { logger.Info(goRoutineName + ": terminated ✔️") @@ -309,34 +313,32 @@ func _main(ctx context.Context, buildInfo models.BuildInformation, defaultShutdownOnFailure := func(goRoutineName string, err error) { logger.Warn(goRoutineName + ": " + err.Error() + " ⚠️") } - defaultGoRoutineSettings := goshutdown.GoRoutineSettings{Timeout: defaultShutdownTimeout} - defaultGroupSettings := goshutdown.GroupSettings{ - Timeout: defaultShutdownTimeout, - OnSuccess: defaultShutdownOnSuccess, - } + defaultGroupOptions := []group.Option{ + group.OptionTimeout(defaultShutdownTimeout), + group.OptionOnSuccess(defaultShutdownOnSuccess)} - controlGroupHandler := goshutdown.NewGroupHandler("control", defaultGroupSettings) - tickersGroupHandler := goshutdown.NewGroupHandler("tickers", defaultGroupSettings) - otherGroupHandler := goshutdown.NewGroupHandler("other", defaultGroupSettings) + controlGroupHandler := goshutdown.NewGroupHandler("control", defaultGroupOptions...) + tickersGroupHandler := goshutdown.NewGroupHandler("tickers", defaultGroupOptions...) + otherGroupHandler := goshutdown.NewGroupHandler("other", defaultGroupOptions...) portForwardLogger := logger.NewChild(logging.Settings{Prefix: "port forwarding: "}) portForwardLooper := portforward.NewLoop(allSettings.VPN.Provider.PortForwarding, httpClient, firewallConf, portForwardLogger) portForwardHandler, portForwardCtx, portForwardDone := goshutdown.NewGoRoutineHandler( - "port forwarding", goshutdown.GoRoutineSettings{Timeout: time.Second}) + "port forwarding", goroutine.OptionTimeout(time.Second)) go portForwardLooper.Run(portForwardCtx, portForwardDone) unboundLogger := logger.NewChild(logging.Settings{Prefix: "dns over tls: "}) unboundLooper := dns.NewLoop(dnsConf, allSettings.DNS, httpClient, unboundLogger) dnsHandler, dnsCtx, dnsDone := goshutdown.NewGoRoutineHandler( - "unbound", defaultGoRoutineSettings) + "unbound", goroutine.OptionTimeout(defaultShutdownTimeout)) // wait for unboundLooper.Restart or its ticker launched with RunRestartTicker go unboundLooper.Run(dnsCtx, dnsDone) otherGroupHandler.Add(dnsHandler) dnsTickerHandler, dnsTickerCtx, dnsTickerDone := goshutdown.NewGoRoutineHandler( - "dns ticker", defaultGoRoutineSettings) + "dns ticker", goroutine.OptionTimeout(defaultShutdownTimeout)) go unboundLooper.RunRestartTicker(dnsTickerCtx, dnsTickerDone) controlGroupHandler.Add(dnsTickerHandler) @@ -344,12 +346,12 @@ func _main(ctx context.Context, buildInfo models.BuildInformation, logger.NewChild(logging.Settings{Prefix: "ip getter: "}), allSettings.PublicIP, puid, pgid) pubIPHandler, pubIPCtx, pubIPDone := goshutdown.NewGoRoutineHandler( - "public IP", defaultGoRoutineSettings) + "public IP", goroutine.OptionTimeout(defaultShutdownTimeout)) go publicIPLooper.Run(pubIPCtx, pubIPDone) otherGroupHandler.Add(pubIPHandler) pubIPTickerHandler, pubIPTickerCtx, pubIPTickerDone := goshutdown.NewGoRoutineHandler( - "public IP", defaultGoRoutineSettings) + "public IP", goroutine.OptionTimeout(defaultShutdownTimeout)) go publicIPLooper.RunRestartTicker(pubIPTickerCtx, pubIPTickerDone) tickersGroupHandler.Add(pubIPTickerHandler) @@ -359,20 +361,20 @@ func _main(ctx context.Context, buildInfo models.BuildInformation, cmder, publicIPLooper, unboundLooper, vpnLogger, httpClient, buildInfo, allSettings.VersionInformation) vpnHandler, vpnCtx, vpnDone := goshutdown.NewGoRoutineHandler( - "vpn", goshutdown.GoRoutineSettings{Timeout: time.Second}) + "vpn", goroutine.OptionTimeout(time.Second)) go vpnLooper.Run(vpnCtx, vpnDone) updaterLooper := updater.NewLooper(allSettings.Updater, allServers, storage, vpnLooper.SetServers, httpClient, logger.NewChild(logging.Settings{Prefix: "updater: "})) updaterHandler, updaterCtx, updaterDone := goshutdown.NewGoRoutineHandler( - "updater", defaultGoRoutineSettings) + "updater", goroutine.OptionTimeout(defaultShutdownTimeout)) // wait for updaterLooper.Restart() or its ticket launched with RunRestartTicker go updaterLooper.Run(updaterCtx, updaterDone) tickersGroupHandler.Add(updaterHandler) updaterTickerHandler, updaterTickerCtx, updaterTickerDone := goshutdown.NewGoRoutineHandler( - "updater ticker", defaultGoRoutineSettings) + "updater ticker", goroutine.OptionTimeout(defaultShutdownTimeout)) go updaterLooper.RunRestartTicker(updaterTickerCtx, updaterTickerDone) controlGroupHandler.Add(updaterTickerHandler) @@ -380,21 +382,21 @@ func _main(ctx context.Context, buildInfo models.BuildInformation, logger.NewChild(logging.Settings{Prefix: "http proxy: "}), allSettings.HTTPProxy) httpProxyHandler, httpProxyCtx, httpProxyDone := goshutdown.NewGoRoutineHandler( - "http proxy", defaultGoRoutineSettings) + "http proxy", goroutine.OptionTimeout(defaultShutdownTimeout)) go httpProxyLooper.Run(httpProxyCtx, httpProxyDone) otherGroupHandler.Add(httpProxyHandler) shadowsocksLooper := shadowsocks.NewLooper(allSettings.ShadowSocks, logger.NewChild(logging.Settings{Prefix: "shadowsocks: "})) shadowsocksHandler, shadowsocksCtx, shadowsocksDone := goshutdown.NewGoRoutineHandler( - "shadowsocks proxy", defaultGoRoutineSettings) + "shadowsocks proxy", goroutine.OptionTimeout(defaultShutdownTimeout)) go shadowsocksLooper.Run(shadowsocksCtx, shadowsocksDone) otherGroupHandler.Add(shadowsocksHandler) controlServerAddress := ":" + strconv.Itoa(int(allSettings.ControlServer.Port)) controlServerLogging := allSettings.ControlServer.Log httpServerHandler, httpServerCtx, httpServerDone := goshutdown.NewGoRoutineHandler( - "http server", defaultGoRoutineSettings) + "http server", goroutine.OptionTimeout(defaultShutdownTimeout)) httpServer := server.New(httpServerCtx, controlServerAddress, controlServerLogging, logger.NewChild(logging.Settings{Prefix: "http server: "}), buildInfo, vpnLooper, portForwardLooper, unboundLooper, updaterLooper, publicIPLooper) @@ -404,16 +406,13 @@ func _main(ctx context.Context, buildInfo models.BuildInformation, healthLogger := logger.NewChild(logging.Settings{Prefix: "healthcheck: "}) healthcheckServer := healthcheck.NewServer(allSettings.Health, healthLogger, vpnLooper) healthServerHandler, healthServerCtx, healthServerDone := goshutdown.NewGoRoutineHandler( - "HTTP health server", defaultGoRoutineSettings) + "HTTP health server", goroutine.OptionTimeout(defaultShutdownTimeout)) go healthcheckServer.Run(healthServerCtx, healthServerDone) - const orderShutdownTimeout = 3 * time.Second - orderSettings := goshutdown.OrderSettings{ - Timeout: orderShutdownTimeout, - OnFailure: defaultShutdownOnFailure, - OnSuccess: defaultShutdownOnSuccess, - } - orderHandler := goshutdown.NewOrder("gluetun", orderSettings) + orderHandler := goshutdown.NewOrderHandler("gluetun", + order.OptionTimeout(totalShutdownTimeout), + order.OptionOnSuccess(defaultShutdownOnSuccess), + order.OptionOnFailure(defaultShutdownOnFailure)) orderHandler.Append(controlGroupHandler, tickersGroupHandler, healthServerHandler, vpnHandler, portForwardHandler, otherGroupHandler) diff --git a/go.mod b/go.mod index 89f730fb..2d63caec 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( github.com/golang/mock v1.6.0 github.com/qdm12/dns v1.11.0 github.com/qdm12/golibs v0.0.0-20210822203818-5c568b0777b6 - github.com/qdm12/goshutdown v0.1.0 + github.com/qdm12/goshutdown v0.3.0 github.com/qdm12/gosplash v0.1.0 github.com/qdm12/ss-server v0.3.0 github.com/qdm12/updated v0.0.0-20210603204757-205acfe6937e diff --git a/go.sum b/go.sum index 5e98cd7e..6f75dd99 100644 --- a/go.sum +++ b/go.sum @@ -109,8 +109,8 @@ github.com/qdm12/golibs v0.0.0-20210603202746-e5494e9c2ebb/go.mod h1:15RBzkun0i8 github.com/qdm12/golibs v0.0.0-20210723175634-a75ca7fd74c2/go.mod h1:6aRbg4Z/bTbm9JfxsGXfWKHi7zsOvPfUTK1S5HuAFKg= github.com/qdm12/golibs v0.0.0-20210822203818-5c568b0777b6 h1:bge5AL7cjHJMPz+5IOz5yF01q/l8No6+lIEBieA8gMg= github.com/qdm12/golibs v0.0.0-20210822203818-5c568b0777b6/go.mod h1:6aRbg4Z/bTbm9JfxsGXfWKHi7zsOvPfUTK1S5HuAFKg= -github.com/qdm12/goshutdown v0.1.0 h1:lmwnygdXtnr2pa6VqfR/bm8077/BnBef1+7CP96B7Sw= -github.com/qdm12/goshutdown v0.1.0/go.mod h1:/LP3MWLqI+wGH/ijfaUG+RHzBbKXIiVKnrg5vXOCf6Q= +github.com/qdm12/goshutdown v0.3.0 h1:pqBpJkdwlZlfTEx4QHtS8u8CXx6pG0fVo6S1N0MpSEM= +github.com/qdm12/goshutdown v0.3.0/go.mod h1:EqZ46No00kCTZ5qzdd3qIzY6ayhMt24QI8Mh8LVQYmM= github.com/qdm12/gosplash v0.1.0 h1:Sfl+zIjFZFP7b0iqf2l5UkmEY97XBnaKkH3FNY6Gf7g= github.com/qdm12/gosplash v0.1.0/go.mod h1:+A3fWW4/rUeDXhY3ieBzwghKdnIPFJgD8K3qQkenJlw= github.com/qdm12/ss-server v0.3.0 h1:BfKv4OU6dYb2KcDMYpTc7LIuO2jB73g3JCzy988GrLI=