+ s := &http.Server{
+ Addr: *bind,
+ ReadTimeout: time.Minute,
+ WriteTimeout: time.Minute,
+ }
+ 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()
+ }(s)
+ if err := s.ListenAndServe(); err != http.ErrServerClosed {
+ log.Fatal(err)
+ }
+ if err := <-killed; err != nil {
+ log.Fatal(err)
+ }