-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmain.go
167 lines (147 loc) · 3.95 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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
package main
import (
"context"
"github.com/efekarakus/termcolor"
"github.com/gorilla/mux"
"github.com/qup42/loghead/logs"
"github.com/qup42/loghead/node_metrics"
"github.com/qup42/loghead/ssh"
"github.com/qup42/loghead/types"
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
"golang.org/x/sync/errgroup"
"net"
"net/http"
"os"
"os/signal"
"time"
)
func SetupLogging() {
var colors bool
switch l := termcolor.SupportLevel(os.Stderr); l {
case termcolor.Level16M:
colors = true
case termcolor.Level256:
colors = true
case termcolor.LevelBasic:
colors = true
case termcolor.LevelNone:
colors = false
default:
// no color, return text as is.
colors = false
}
// Adhere to no-color.org manifesto of allowing users to
// turn off color in cli/services
if _, noColorIsSet := os.LookupEnv("NO_COLOR"); noColorIsSet {
colors = false
}
zerolog.TimeFieldFormat = zerolog.TimeFormatUnix
log.Logger = log.Output(zerolog.ConsoleWriter{
Out: os.Stderr,
TimeFormat: time.RFC3339,
NoColor: !colors,
}).With().Caller().Logger()
}
func serve(ctx context.Context, r *mux.Router, ln net.Listener) error {
s := http.Server{
Handler: r,
WriteTimeout: 15 * time.Second,
ReadTimeout: 15 * time.Second,
}
serveErr := make(chan error, 1)
go func() {
serveErr <- s.Serve(ln)
}()
var err error
select {
case <-ctx.Done():
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
err = s.Shutdown(ctx)
case err = <-serveErr:
}
return err
}
func main() {
SetupLogging()
c, err := types.LoadConfig()
if err != nil {
log.Fatal().Err(err).Msg("Failed to load config")
}
zerolog.SetGlobalLevel(c.Log.Level)
log.Debug().Msgf("Config: %+v", c)
var fls *logs.FileLoggerService
var fwd *logs.ForwardingService
var hs *logs.HostInfoService
var ms *logs.MetricsService
var rs *ssh.RecordingService
if c.Loghead.Processors.FileLogger.Enabled {
fls, err = logs.NewFileLoggerService(c.Loghead.Processors.FileLogger)
if err != nil {
log.Fatal().Err(err)
}
}
if c.Loghead.Processors.Metrics {
ms = logs.NewMetricsService()
}
if c.Loghead.Processors.Hostinfo {
hs = &logs.HostInfoService{}
}
if c.Loghead.Processors.Forward.Enabled {
log.Info().Msgf("Enableing forwarder to %s", c.Loghead.Processors.Forward.Addr)
fwd = logs.NewForwardingService(c.Loghead.Processors.Forward.Addr)
}
rs, err = ssh.NewRecordingService(c.SSHRecorder)
if err != nil {
log.Fatal().Err(err).Msg("Could not create SSH Recorder")
}
var nms *node_metrics.NodeMetricsService
nms, err = node_metrics.NewNodeMetricsService(c.NodeMetrics)
if err != nil {
log.Fatal().Err(err).Msg("Could not create Node Metrics")
}
ctx := context.Background()
ctx, cancel := signal.NotifyContext(ctx, os.Interrupt)
defer cancel()
g, ctx := errgroup.WithContext(ctx)
// logtail
ltr := mux.NewRouter()
addClientLogsRoutes(ltr, c, fwd, fls, hs, ms)
logheadListener, err := types.MakeListener(ctx, c.Loghead.Listener, "loghead")
if err != nil {
log.Fatal().Err(err).Msg("Creating loghead listener")
}
defer logheadListener.Close()
g.Go(func() error {
return serve(ctx, ltr, logheadListener.Listener)
})
// SSH session recording
sr := mux.NewRouter()
addSSHRecordingRoutes(sr, rs)
sshListener, err := types.MakeListener(ctx, c.SSHRecorder.Listener, "SSHRecorder")
if err != nil {
log.Fatal().Err(err).Msg("Creating SSHRecorder listener")
}
defer sshListener.Close()
g.Go(func() error {
return serve(ctx, sr, sshListener.Listener)
})
// Node metrics
if c.NodeMetrics.Enabled {
nm := mux.NewRouter()
addNodeMetricsRoutes(nm, c, nms)
nodeMetricsListener, err := types.MakeListener(ctx, c.NodeMetrics.Listener, "NodeMetrics")
if err != nil {
log.Fatal().Err(err).Msg("Creating NodeMetrics listener")
}
defer nodeMetricsListener.Close()
g.Go(func() error {
return serve(ctx, nm, nodeMetricsListener.Listener)
})
}
err = g.Wait()
if err != nil {
log.Fatal().Err(err).Msg("error running server")
}
}