/
forward.go
68 lines (58 loc) · 1.26 KB
/
forward.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
package commands
import (
"fmt"
"github.com/jtarchie/jsyslog/clients"
"github.com/jtarchie/jsyslog/listeners"
"go.uber.org/zap"
"golang.org/x/sync/errgroup"
)
type ForwardCmd struct {
From []string `help:"the uri to listen to messages" default:"tcp://0.0.0.0:9000" required:""`
To []string `help:"the uri to forward messages to" required:""`
}
func (l *ForwardCmd) Run(logger *zap.Logger) error {
outputs := []clients.Client{}
for _, uri := range l.To {
output, err := clients.New(uri)
if err != nil {
return fmt.Errorf(
"could not create client (%s): %w",
uri,
err,
)
}
outputs = append(outputs, output)
}
errGroup := &errgroup.Group{}
for _, uri := range l.From {
uri := uri
errGroup.Go(func() error {
server, err := listeners.New(
uri,
func(message []byte) error {
for _, output := range outputs {
err := output.WriteString(fmt.Sprintf("%s\n", message))
if err != nil {
return fmt.Errorf(
"could not write to (%s): %w",
uri,
err,
)
}
}
return nil
},
logger,
)
if err != nil {
return fmt.Errorf(
"could not start from (%s): %w",
uri,
err,
)
}
return server.ListenAndServe()
})
}
return errGroup.Wait()
}