/
main.go
102 lines (94 loc) · 2.47 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
package main
import (
"context"
"os"
"os/signal"
"github.com/aegistudio/shaft"
"github.com/aegistudio/shaft/serpent"
"github.com/spf13/cobra"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"golang.org/x/sync/errgroup"
"github.com/chaitin/systracer"
"github.com/chaitin/systracer/inode"
)
type moduleBarrier struct{}
var (
moduleInits []func() shaft.Option
allEnabled bool
logLevel = "info"
)
var rootCmd = &cobra.Command{
Use: "systracer",
Long: "Linux system activity tracer",
PreRunE: func(cmd *cobra.Command, _ []string) error {
for _, moduleInit := range moduleInits {
if err := serpent.AddOption(
cmd, moduleInit()); err != nil {
return err
}
}
return nil
},
RunE: serpent.Executor(shaft.Module(
shaft.Stack(func(
next func(*errgroup.Group, context.Context) error,
rootCtx serpent.CommandContext,
) error {
cancelCtx, cancel := context.WithCancel(rootCtx)
group, ctx := errgroup.WithContext(cancelCtx)
defer func() { _ = group.Wait() }()
defer cancel()
return next(group, ctx)
}),
shaft.Invoke(func(
group *errgroup.Group, _ []moduleBarrier,
logger *zap.SugaredLogger,
) error {
logger.Info("initialization complete")
return group.Wait()
}),
shaft.Provide(func(
ctx context.Context, group *errgroup.Group,
options []systracer.Option,
) (systracer.Manager, error) {
return systracer.New(ctx, group, options...)
}),
shaft.Stack(func(
next func(*zap.Logger, *zap.SugaredLogger) error,
) error {
level, err := zapcore.ParseLevel(logLevel)
if err != nil {
return err
}
consoleLevel := zap.NewAtomicLevelAt(level)
consoleConfig := zap.NewDevelopmentEncoderConfig()
consoleConfig.EncodeLevel = zapcore.CapitalColorLevelEncoder
consoleErrors := zapcore.Lock(os.Stderr)
consoleEncoder := zapcore.NewConsoleEncoder(consoleConfig)
loggerCore := zapcore.NewCore(
consoleEncoder, consoleErrors, consoleLevel)
logger := zap.New(loggerCore)
sugaredLogger := logger.Sugar()
defer logger.Sync()
return next(logger, sugaredLogger)
}),
inode.Module,
)).RunE,
}
func init() {
rootCmd.PersistentFlags().BoolVar(
&allEnabled, "all", allEnabled,
"capture all supported events")
rootCmd.PersistentFlags().StringVar(
&logLevel, "log-level", logLevel,
"setup the log level of the logger")
}
func main() {
ctx, cancel := signal.NotifyContext(
context.Background(), os.Interrupt)
defer cancel()
if err := serpent.ExecuteContext(ctx, rootCmd); err != nil {
os.Exit(1)
}
}