/
keyshare-root.go
79 lines (68 loc) · 1.54 KB
/
keyshare-root.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
package cmd
import (
"context"
"fmt"
"net/http"
"os"
"os/signal"
"syscall"
"github.com/privacybydesign/irmago/server"
"github.com/sirupsen/logrus"
"github.com/spf13/cobra"
"github.com/spf13/viper"
)
var keyshareRootCmd = &cobra.Command{
Use: "keyshare",
Short: "IRMA keyshare server components",
}
func init() {
RootCmd.AddCommand(keyshareRootCmd)
}
type stoppableServer interface {
Handler() http.Handler
Stop()
}
func runServer(serv stoppableServer, logger *logrus.Logger) {
// Determine full listening address.
fullAddr := fmt.Sprintf("%s:%d", viper.GetString("listen_addr"), viper.GetInt("port"))
// Load TLS configuration
TLSConfig := configureTLS()
httpServer := &http.Server{
Addr: fullAddr,
Handler: serv.Handler(),
TLSConfig: TLSConfig,
}
stopped := make(chan struct{})
interrupt := make(chan os.Signal, 1)
signal.Notify(interrupt, os.Interrupt, syscall.SIGTERM)
go func() {
var err error
if TLSConfig != nil {
err = server.FilterStopError(httpServer.ListenAndServeTLS("", ""))
} else {
err = server.FilterStopError(httpServer.ListenAndServe())
}
if err != nil {
_ = server.LogError(err)
}
logger.Debug("Server stopped")
stopped <- struct{}{}
}()
for {
select {
case <-interrupt:
logger.Debug("Caught interrupt")
err := httpServer.Shutdown(context.Background())
if err != nil {
_ = server.LogError(err)
}
serv.Stop()
logger.Debug("Sent stop signal to server")
case <-stopped:
logger.Info("Exiting")
close(stopped)
close(interrupt)
return
}
}
}