aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cmd/sklad/main.go22
1 files changed, 21 insertions, 1 deletions
diff --git a/cmd/sklad/main.go b/cmd/sklad/main.go
index aebb5c1..475d214 100644
--- a/cmd/sklad/main.go
+++ b/cmd/sklad/main.go
@@ -1,6 +1,7 @@
package main
import (
+ "context"
"errors"
"html"
"html/template"
@@ -10,11 +11,13 @@ import (
"net/http"
"net/url"
"os"
+ "os/signal"
"path"
"path/filepath"
"regexp"
"strings"
"sync"
+ "syscall"
"time"
"janouch.name/sklad/imgutil"
@@ -399,5 +402,22 @@ func main() {
}
http.HandleFunc("/", handle)
- log.Fatalln(http.ListenAndServe(address, nil))
+ server := &http.Server{Addr: address}
+
+ sigs := make(chan os.Signal, 1)
+ errs := make(chan error, 1)
+ signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM, syscall.SIGHUP)
+ go func() { errs <- server.ListenAndServe() }()
+
+ select {
+ case <-sigs:
+ case err := <-errs:
+ log.Println(err)
+ }
+
+ // Wait for all HTTP goroutines to finish so that not even the database
+ // log gets corrupted by an interrupted update.
+ if err := server.Shutdown(context.Background()); err != nil {
+ log.Fatalln(err)
+ }
}