-
Notifications
You must be signed in to change notification settings - Fork 1
/
server.go
119 lines (101 loc) · 2.17 KB
/
server.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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
package options
import (
"crypto/tls"
"fmt"
"log"
"os"
"regexp"
"google.golang.org/grpc/credentials"
"gopkg.in/yaml.v2"
)
const (
VERSION = "0.2.0"
IMG_VERSION = "0.2.0"
NETEM_ID = "ntm"
SERVER_CONFIG_FILE = "/etc/gonetem/config.yaml"
INITIAL_SERVER_CONFIG = `
listen: "localhost:10110"
tls:
enabled: false
ca: ""
cert: ""
key: ""
workdir: /tmp
docker:
images:
server: mroy31/gonetem-server
host: mroy31/gonetem-host
router: mroy31/gonetem-frr
ovs: mroy31/gonetem-ovs
`
)
type DockerImageT int
const (
IMG_ROUTER DockerImageT = iota
IMG_HOST
IMG_SERVER
IMG_OVS
)
type NetemServerConfig struct {
Listen string
Tls TLSOptions
Workdir string
Docker struct {
Images struct {
Server string
Host string
Router string
Ovs string
}
}
}
var (
ServerConfig = NetemServerConfig{}
)
func InitServerConfig() {
err := yaml.Unmarshal([]byte(INITIAL_SERVER_CONFIG), &ServerConfig)
if err != nil {
log.Fatalf("Unable to initialize server config: %v", err)
}
}
func CreateServerConfig(config string) error {
return os.WriteFile(config, []byte(INITIAL_SERVER_CONFIG), 0644)
}
func ParseServerConfig(config string) error {
data, err := os.ReadFile(config)
if err != nil {
return err
}
return yaml.Unmarshal(data, &ServerConfig)
}
func GetDockerImageId(imgType DockerImageT) string {
var name string
hasTagRE := regexp.MustCompile(`^\S+:[\w\.]+$`)
switch imgType {
case IMG_ROUTER:
name = ServerConfig.Docker.Images.Router
case IMG_HOST:
name = ServerConfig.Docker.Images.Host
case IMG_SERVER:
name = ServerConfig.Docker.Images.Server
case IMG_OVS:
name = ServerConfig.Docker.Images.Ovs
}
if !hasTagRE.MatchString(name) {
name = fmt.Sprintf("%s:%s", name, IMG_VERSION)
}
return name
}
func LoadServerTLSCredentials() (credentials.TransportCredentials, error) {
certPool, serverCerts, err := loadTLSCerts(ServerConfig.Tls)
if err != nil {
return nil, err
}
// Create the credentials and return it
config := &tls.Config{
Certificates: serverCerts,
ClientAuth: tls.RequireAndVerifyClientCert,
ClientCAs: certPool,
}
return credentials.NewTLS(config), nil
}