Skip to content

Commit ff02f5a

Browse files
committed
refactor: move certstream initialization code to own module
This way the code is structured in a way more understandable way
1 parent eea4a0c commit ff02f5a

2 files changed

Lines changed: 105 additions & 30 deletions

File tree

cmd/certstream-server-go/main.go

Lines changed: 4 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,8 @@ import (
55
"fmt"
66
"log"
77

8-
"github.com/d-Rickyy-b/certstream-server-go/internal/certificatetransparency"
8+
"github.com/d-Rickyy-b/certstream-server-go/internal/certstream"
99
"github.com/d-Rickyy-b/certstream-server-go/internal/config"
10-
"github.com/d-Rickyy-b/certstream-server-go/internal/metrics"
11-
"github.com/d-Rickyy-b/certstream-server-go/internal/web"
1210
)
1311

1412
// main is the entry point for the application.
@@ -25,34 +23,10 @@ func main() {
2523
log.SetFlags(log.LstdFlags | log.Lshortfile)
2624
log.Printf("Starting certstream-server-go v%s\n", config.Version)
2725

28-
conf, err := config.ReadConfig(*configFile)
26+
cs, err := certstream.NewCertstreamFromConfigFile(*configFile)
2927
if err != nil {
30-
log.Fatalln("Error while parsing yaml file:", err)
28+
log.Fatalf("Error while creating certstream server: %v", err)
3129
}
3230

33-
webserver := web.NewWebsocketServer(conf.Webserver.ListenAddr, conf.Webserver.ListenPort, conf.Webserver.CertPath, conf.Webserver.CertKeyPath)
34-
35-
setupMetrics(conf, webserver)
36-
37-
go webserver.Start()
38-
39-
watcher := certificatetransparency.Watcher{}
40-
watcher.Start()
41-
}
42-
43-
// setupMetrics configures the webserver to handle prometheus metrics according to the config.
44-
func setupMetrics(conf config.Config, webserver *web.WebServer) {
45-
if conf.Prometheus.Enabled {
46-
// If prometheus is enabled, and interface is either unconfigured or same as webserver config, use existing webserver
47-
if (conf.Prometheus.ListenAddr == "" || conf.Prometheus.ListenAddr == conf.Webserver.ListenAddr) &&
48-
(conf.Prometheus.ListenPort == 0 || conf.Prometheus.ListenPort == conf.Webserver.ListenPort) {
49-
log.Println("Starting prometheus server on same interface as webserver")
50-
webserver.RegisterPrometheus(conf.Prometheus.MetricsURL, metrics.WritePrometheus)
51-
} else {
52-
log.Println("Starting prometheus server on new interface")
53-
metricsServer := web.NewMetricsServer(conf.Prometheus.ListenAddr, conf.Prometheus.ListenPort, conf.Prometheus.CertPath, conf.Prometheus.CertKeyPath)
54-
metricsServer.RegisterPrometheus(conf.Prometheus.MetricsURL, metrics.WritePrometheus)
55-
go metricsServer.Start()
56-
}
57-
}
31+
cs.Start()
5832
}

internal/certstream/certstream.go

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
package certstream
2+
3+
// The certstream package provides the main entry point for the certstream-server-go application.
4+
// It initializes the webserver and the watcher for the certificate transparency logs.
5+
// It also handles signals for graceful shutdown of the server.
6+
7+
import (
8+
"log"
9+
10+
"github.com/d-Rickyy-b/certstream-server-go/internal/certificatetransparency"
11+
"github.com/d-Rickyy-b/certstream-server-go/internal/config"
12+
"github.com/d-Rickyy-b/certstream-server-go/internal/metrics"
13+
"github.com/d-Rickyy-b/certstream-server-go/internal/web"
14+
)
15+
16+
type Certstream struct {
17+
webserver *web.WebServer
18+
metricsServer *web.WebServer
19+
watcher *certificatetransparency.Watcher
20+
config config.Config
21+
}
22+
23+
// NewCertstreamServer creates a new Certstream server from a config struct.
24+
func NewCertstreamServer(config config.Config) (*Certstream, error) {
25+
cs := Certstream{}
26+
cs.config = config
27+
28+
// Initialize the webserver used for the websocket server
29+
webserver := web.NewWebsocketServer(config.Webserver.ListenAddr, config.Webserver.ListenPort, config.Webserver.CertPath, config.Webserver.CertKeyPath)
30+
cs.webserver = webserver
31+
32+
// Setup metrics server
33+
cs.setupMetrics(webserver)
34+
35+
return &cs, nil
36+
}
37+
38+
// NewCertstreamFromConfigFile creates a new Certstream server from a config file.
39+
func NewCertstreamFromConfigFile(configPath string) (*Certstream, error) {
40+
conf, err := config.ReadConfig(configPath)
41+
if err != nil {
42+
return nil, err
43+
}
44+
45+
return NewCertstreamServer(conf)
46+
}
47+
48+
// setupMetrics configures the webserver to handle prometheus metrics according to the config.
49+
func (cs *Certstream) setupMetrics(webserver *web.WebServer) {
50+
if cs.config.Prometheus.Enabled {
51+
// If prometheus is enabled, and interface is either unconfigured or same as webserver config, use existing webserver
52+
if (cs.config.Prometheus.ListenAddr == "" || cs.config.Prometheus.ListenAddr == cs.config.Webserver.ListenAddr) &&
53+
(cs.config.Prometheus.ListenPort == 0 || cs.config.Prometheus.ListenPort == cs.config.Webserver.ListenPort) {
54+
log.Println("Starting prometheus server on same interface as webserver")
55+
webserver.RegisterPrometheus(cs.config.Prometheus.MetricsURL, metrics.WritePrometheus)
56+
} else {
57+
log.Println("Starting prometheus server on new interface")
58+
cs.metricsServer = web.NewMetricsServer(cs.config.Prometheus.ListenAddr, cs.config.Prometheus.ListenPort, cs.config.Prometheus.CertPath, cs.config.Prometheus.CertKeyPath)
59+
cs.metricsServer.RegisterPrometheus(cs.config.Prometheus.MetricsURL, metrics.WritePrometheus)
60+
}
61+
}
62+
}
63+
64+
// Start starts the webserver and the watcher.
65+
// This is a blocking function that will run until the server is stopped.
66+
func (cs *Certstream) Start() {
67+
log.Printf("Starting certstream-server-go v%s\n", config.Version)
68+
69+
// If there is no watcher initialized, create a new one
70+
if cs.watcher == nil {
71+
cs.watcher = &certificatetransparency.Watcher{}
72+
}
73+
74+
// Start webserver and metrics server
75+
if cs.webserver == nil {
76+
log.Fatalln("Webserver not initialized! Exiting...")
77+
}
78+
go cs.webserver.Start()
79+
80+
if cs.metricsServer != nil {
81+
go cs.metricsServer.Start()
82+
}
83+
84+
// Start the watcher - this is a blocking function
85+
cs.watcher.Start()
86+
}
87+
88+
// Stop stops the watcher and the webserver.
89+
func (cs *Certstream) Stop() {
90+
if cs.watcher != nil {
91+
cs.watcher.Stop()
92+
}
93+
94+
if cs.webserver != nil {
95+
cs.webserver.Stop()
96+
}
97+
98+
if cs.metricsServer != nil {
99+
cs.metricsServer.Stop()
100+
}
101+
}

0 commit comments

Comments
 (0)