Skip to content

Commit 687cdb1

Browse files
committed
chore(cmd): introduce evt program
Initially, the evt program is able to trigger events in the system by the use of the `trigger` command.
1 parent 22fa7ba commit 687cdb1

File tree

6 files changed

+427
-1
lines changed

6 files changed

+427
-1
lines changed

Makefile

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
.PHONY: all | env
2-
all: tracee-ebpf tracee-rules signatures tracee
2+
all: tracee-ebpf tracee-rules signatures tracee evt
33

44
#
55
# make
@@ -611,6 +611,39 @@ clean-signatures:
611611
# other commands
612612
#
613613

614+
# evt
615+
616+
EVT_SRC_DIRS = ./cmd/evt
617+
EVT_SRC = $(shell find $(EVT_SRC_DIRS) \
618+
-type f \
619+
-name '*.go' \
620+
! -name '*_test.go' \
621+
)
622+
EVT_TRIGGERS_DIR = $(EVT_SRC_DIRS)/cmd/trigger/triggers
623+
624+
.PHONY: evt
625+
evt: $(OUTPUT_DIR)/evt
626+
627+
$(OUTPUT_DIR)/evt: \
628+
$(EVT_SRC) \
629+
$(OUTPUT_DIR)/tracee \
630+
| .eval_goenv \
631+
.checkver_$(CMD_GO) \
632+
#
633+
$(GO_ENV_EBPF) $(CMD_GO) build \
634+
-ldflags="$(GO_DEBUG_FLAG) \
635+
" \
636+
-v -o $@ \
637+
./cmd/evt
638+
cp -r $(EVT_TRIGGERS_DIR) $(OUTPUT_DIR)/evt-triggers
639+
640+
641+
.PHONY: clean-evt
642+
clean-evt:
643+
#
644+
$(CMD_RM) -rf $(OUTPUT_DIR)/evt
645+
$(CMD_RM) -rf $(OUTPUT_DIR)/evt-triggers
646+
614647
# tracee-bench
615648

616649
TRACEE_BENCH_SRC_DIRS = ./cmd/tracee-bench/

cmd/evt/cmd/helpers/helpers.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package helpers
2+
3+
import (
4+
"fmt"
5+
"io"
6+
"path/filepath"
7+
)
8+
9+
type PrefixWriter struct {
10+
Prefix []byte
11+
Writer io.Writer
12+
}
13+
14+
// Write writes the given bytes with the prefix
15+
func (pw *PrefixWriter) Write(p []byte) (int, error) {
16+
return pw.Writer.Write(append(pw.Prefix, p...))
17+
}
18+
19+
const (
20+
MaxCommLen = 16
21+
)
22+
23+
func GetFilterOutCommScope(cmd string) string {
24+
comm := filepath.Base(cmd)
25+
comm = comm[:min(len(comm), MaxCommLen-1)]
26+
return fmt.Sprintf("comm!=%s", comm)
27+
}
28+
29+
func GetFilterInTreeScope(pid string) string {
30+
return fmt.Sprintf("tree=%s", pid)
31+
}

cmd/evt/cmd/root.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package cmd
2+
3+
import (
4+
"context"
5+
"os"
6+
7+
"github.com/spf13/cobra"
8+
9+
"github.com/aquasecurity/tracee/cmd/evt/cmd/trigger"
10+
)
11+
12+
func init() {
13+
rootCmd.AddCommand(trigger.Cmd())
14+
}
15+
16+
var (
17+
rootCmd = &cobra.Command{
18+
Use: "evt",
19+
Short: "An event testing tool",
20+
Long: "evt is a simple testing tool that generates events to stress the system",
21+
}
22+
)
23+
24+
func initRootCmd() error {
25+
rootCmd.SetOutput(os.Stdout)
26+
rootCmd.SetErr(os.Stderr)
27+
28+
return nil
29+
}
30+
31+
func Execute(ctx context.Context) error {
32+
if err := initRootCmd(); err != nil {
33+
return err
34+
}
35+
36+
return rootCmd.ExecuteContext(ctx)
37+
}

cmd/evt/cmd/trigger/cobra.go

Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
package trigger
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"os"
7+
"time"
8+
9+
"github.com/spf13/cobra"
10+
)
11+
12+
var (
13+
triggerCmd = &cobra.Command{
14+
Use: "trigger",
15+
Aliases: []string{"t"},
16+
Short: "Trigger events to trigger",
17+
RunE: triggerCmdRun,
18+
SilenceErrors: true,
19+
SilenceUsage: true,
20+
}
21+
)
22+
23+
const (
24+
defaultTriggerOps = int32(1)
25+
defaultTriggerSleep = 10 * time.Nanosecond
26+
triggerTimeout = 30 * time.Minute
27+
)
28+
29+
func init() {
30+
triggerCmd.Flags().StringP(
31+
"event",
32+
"e",
33+
"",
34+
"<name>...\t\tSelect event to trigger",
35+
)
36+
if err := triggerCmd.MarkFlagRequired("event"); err != nil {
37+
triggerCmd.PrintErrf("marking required flag: %v\n", err)
38+
os.Exit(1)
39+
}
40+
41+
triggerCmd.Flags().Int32P(
42+
"ops",
43+
"o",
44+
defaultTriggerOps,
45+
"<number>...\t\tNumber of operations to perform",
46+
)
47+
48+
triggerCmd.Flags().DurationP(
49+
"sleep",
50+
"s",
51+
defaultTriggerSleep,
52+
"<duration>...\t\tSleep time between operations",
53+
)
54+
55+
triggerCmd.Flags().BoolP(
56+
"bypass-flags",
57+
"f",
58+
false,
59+
"\t\t\tPrint tracee bypass flags",
60+
)
61+
62+
triggerCmd.Flags().BoolP(
63+
"wait-signal",
64+
"w",
65+
false,
66+
"\t\t\tWait for start signal (SIGUSR1)",
67+
)
68+
}
69+
70+
func getTrigger(cmd *cobra.Command) (*trigger, error) {
71+
event, err := cmd.Flags().GetString("event")
72+
if err != nil {
73+
return nil, err
74+
}
75+
76+
ops, err := cmd.Flags().GetInt32("ops")
77+
if err != nil {
78+
return nil, err
79+
}
80+
if ops <= 0 {
81+
return nil, fmt.Errorf("ops must be greater than 0")
82+
}
83+
84+
sleep, err := cmd.Flags().GetDuration("sleep")
85+
if err != nil {
86+
return nil, err
87+
}
88+
89+
bypassFlags, err := cmd.Flags().GetBool("bypass-flags")
90+
if err != nil {
91+
return nil, err
92+
}
93+
94+
waitSignal, err := cmd.Flags().GetBool("wait-signal")
95+
if err != nil {
96+
return nil, err
97+
}
98+
99+
return &trigger{
100+
event: event,
101+
ops: ops,
102+
sleep: sleep,
103+
printBypassFlags: bypassFlags,
104+
waitSignal: waitSignal,
105+
cmd: cmd,
106+
}, nil
107+
}
108+
109+
func triggerCmdRun(cmd *cobra.Command, args []string) error {
110+
t, err := getTrigger(cmd)
111+
if err != nil {
112+
return err
113+
}
114+
115+
ctx, cancel := context.WithTimeoutCause(
116+
t.cmd.Context(),
117+
triggerTimeout,
118+
fmt.Errorf("timeout after %v", triggerTimeout),
119+
)
120+
defer cancel()
121+
t.ctx = ctx
122+
123+
return t.run()
124+
}
125+
126+
func Cmd() *cobra.Command {
127+
return triggerCmd
128+
}

0 commit comments

Comments
 (0)