-
Notifications
You must be signed in to change notification settings - Fork 1
/
main.go
100 lines (85 loc) · 2.71 KB
/
main.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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
package main
import (
"net"
"os"
"os/signal"
"syscall"
"github.com/kelseyhightower/envconfig"
"github.com/pkg/errors"
"go.uber.org/zap"
envoy_service_auth_v2 "github.com/envoyproxy/go-control-plane/envoy/service/auth/v2"
envoy_service_auth_v3 "github.com/envoyproxy/go-control-plane/envoy/service/auth/v3"
grpc_middleware "github.com/grpc-ecosystem/go-grpc-middleware"
grpc_zap "github.com/grpc-ecosystem/go-grpc-middleware/logging/zap"
grpc_ctxtags "github.com/grpc-ecosystem/go-grpc-middleware/tags"
"google.golang.org/grpc"
)
func main() {
shouldExit := make(chan os.Signal, 1)
signal.Notify(shouldExit, syscall.SIGINT, syscall.SIGTERM)
var c Config
err := envconfig.Process("forwardeaz_service", &c)
if err != nil {
panic(errors.Wrap(err, "failed to process configuration"))
}
if c.Version == "" {
c.Version = "unknown"
}
logConfig := zap.NewProductionConfig()
err = logConfig.Level.UnmarshalText([]byte(c.LogLevel))
if err != nil {
panic(errors.Wrapf(err, "failed to determine log-level: %s", c.LogLevel))
}
commonLogFields := zap.Fields(
zap.String("version", c.Version),
)
logger, err := logConfig.Build(commonLogFields)
if err != nil {
panic(errors.Wrap(err, "failed to set-up logging"))
}
grpc_zap.ReplaceGrpcLoggerV2(logger)
listener, err := net.Listen("tcp", c.Address)
if err != nil {
logger.Panic("Failed to bind service to address", zap.Error(err), zap.String("address", c.Address))
}
var opts []grpc_zap.Option
server := grpc.NewServer(
grpc_middleware.WithUnaryServerChain(
grpc_ctxtags.UnaryServerInterceptor(grpc_ctxtags.WithFieldExtractor(grpc_ctxtags.CodeGenRequestFieldExtractor)),
grpc_zap.UnaryServerInterceptor(logger, opts...),
),
grpc_middleware.WithStreamServerChain(
grpc_ctxtags.StreamServerInterceptor(grpc_ctxtags.WithFieldExtractor(grpc_ctxtags.CodeGenRequestFieldExtractor)),
grpc_zap.StreamServerInterceptor(logger, opts...),
),
)
checker := &forwardAuthChecker{
logger: logger,
forwardAuthAddress: c.ForwardAuthAddress,
authRequestHeaders: c.AuthRequestHeaders,
authResponseHeaders: c.AuthResponseHeaders,
trustForwardHeader: c.TrustForwardHeader,
}
// DEPRECATED: included to support Contour <= v1.10.0
v2 := &authV2{
logger: logger,
checker: checker,
}
envoy_service_auth_v2.RegisterAuthorizationServer(server, v2)
v3 := &authV3{
logger: logger,
checker: checker,
}
envoy_service_auth_v3.RegisterAuthorizationServer(server, v3)
go func() {
logger.Info("Starting service", zap.Any("config", c))
err := server.Serve(listener)
if err != nil {
logger.Panic("Failed to start service", zap.Error(err))
}
}()
<-shouldExit
logger.Info("Stopping service")
server.GracefulStop()
_ = logger.Sync()
}