+
+ needsRefreshPasswd := make(chan os.Signal, 0)
+ needsShutdown := make(chan os.Signal, 0)
+ killed := make(chan error, 0)
+ signal.Notify(needsRefreshPasswd, syscall.SIGHUP)
+ signal.Notify(needsShutdown, syscall.SIGTERM, syscall.SIGINT)
+ go func() {
+ for range needsRefreshPasswd {
+ log.Println("Refreshing passwords")
+ refreshPasswd()
+ }
+ }()
+ go func(s *http.Server) {
+ <-needsShutdown
+ log.Println("Shutting down")
+ ctx, cancel := context.WithTimeout(context.TODO(), time.Minute)
+ killed <- s.Shutdown(ctx)
+ cancel()
+ }(server)
+
+ if *tlsCert == "" {
+ err = server.Serve(ln)
+ } else {
+ err = server.ServeTLS(ln, *tlsCert, *tlsKey)
+ }
+ if err != http.ErrServerClosed {
+ log.Fatal(err)
+ }
+ if err := <-killed; err != nil {
+ log.Fatal(err)
+ }