/
grpc.go
84 lines (68 loc) · 1.66 KB
/
grpc.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
// Unless explicitly stated otherwise all files in this repository are licensed
// under the Apache License Version 2.0.
// This product includes software developed at Datadog (https://www.datadoghq.com/).
// Copyright 2016-present Datadog, Inc.
// Package module holds module related files
package module
import (
"fmt"
"net"
"os"
"sync"
"google.golang.org/grpc"
"github.com/DataDog/datadog-agent/pkg/security/seclog"
)
// GRPCServer defines a gRPC server
type GRPCServer struct {
server *grpc.Server
netListener net.Listener
wg sync.WaitGroup
family string
address string
}
// NewGRPCServer returns a new gRPC server
func NewGRPCServer(family string, address string) *GRPCServer {
// force socket cleanup of previous socket not cleanup
if family == "unix" {
_ = os.Remove(address)
}
return &GRPCServer{
family: family,
address: address,
server: grpc.NewServer(),
}
}
// Start the server
func (g *GRPCServer) Start() error {
ln, err := net.Listen(g.family, g.address)
if err != nil {
return fmt.Errorf("unable to create runtime security socket: %w", err)
}
if g.family == "unix" {
if err := os.Chmod(g.address, 0700); err != nil {
return fmt.Errorf("unable to create runtime security socket: %w", err)
}
}
g.netListener = ln
g.wg.Add(1)
go func() {
defer g.wg.Done()
if err := g.server.Serve(ln); err != nil {
seclog.Errorf("error launching the grpc server: %v", err)
}
}()
return nil
}
// Stop the server
func (g *GRPCServer) Stop() {
if g.server != nil {
g.server.Stop()
}
if g.netListener != nil {
g.netListener.Close()
if g.family == "unix" {
_ = os.Remove(g.address)
}
}
g.wg.Wait()
}