diff options
| author | Paul Buetow <paul@buetow.org> | 2024-02-19 11:53:13 +0200 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2024-02-19 11:53:13 +0200 |
| commit | 4309271756784e9e4846a385c477ea31f183dc3b (patch) | |
| tree | c302159be3c7322a59bcbf08c5fe9b5b423721b0 | |
| parent | 728b11eb64db53d8f71faa86ed5043efbaa8d589 (diff) | |
make ioriotng able to run without .c source files present
| -rw-r--r-- | .gitignore | 2 | ||||
| -rw-r--r-- | Makefile | 13 | ||||
| -rw-r--r-- | internal/tracepoints/syscalls.go | 76 | ||||
| -rw-r--r-- | internal/tracepoints/tracepoints.go | 23 |
4 files changed, 36 insertions, 78 deletions
@@ -2,4 +2,4 @@ ioriotng /ioriotng.bpf.c *.o vmlinux.h - +tracepoint_list.go @@ -14,8 +14,19 @@ bpfbuild: make -C ./internal/c redo if [ ! -e ioriotng.bpf.o ]; then cp -v ./internal/c/ioriotng.bpf.o .; fi +.PHONY: tracepoint_list.go +tracepoint_list.go: + # Fetch tracepoint probes from C code and generate list for Go userland code to auto-attach to. + echo "// Auto-generated from C, don't change manually!" > ./internal/tracepoints/tracepoint_list.go + echo 'package tracepoints' >> ./internal/tracepoints/tracepoint_list.go + echo >> ./internal/tracepoints/tracepoint_list.go + echo 'var tracepointList = []string{' >> ./internal/tracepoints/tracepoint_list.go + sed -n -E '/^SEC.*sys_(enter|exit)_/ { s/[")]//g; s/.*sys_(.*)/\t"\1",/; p; }' \ + ./internal/c/tracepoints/*.c >> ./internal/tracepoints/tracepoint_list.go + echo '}' >> ./internal/tracepoints/tracepoint_list.go + .PHONY: gobuild -gobuild: +gobuild: tracepoint_list.go go build -tags netgo -ldflags '-w -extldflags "-static"' -o ioriotng ./cmd/ioriotng/main.go .PHONY: clean diff --git a/internal/tracepoints/syscalls.go b/internal/tracepoints/syscalls.go deleted file mode 100644 index ccc4f58..0000000 --- a/internal/tracepoints/syscalls.go +++ /dev/null @@ -1,76 +0,0 @@ -package tracepoints - -import ( - "fmt" - "os" - "regexp" - "strings" - - bpf "github.com/aquasecurity/libbpfgo" -) - -// SEC("tracepoint/syscalls/sys_exit_openat") -var syscallRe = regexp.MustCompile(`sys_((enter|exit).*)"\)`) - -func filterLines(lines []string) ([]string, error) { - var syscalls []string - - for _, line := range lines { - matches := syscallRe.FindStringSubmatch(line) - if len(matches) < 1 { - continue - } - syscalls = append(syscalls, matches[1]) - } - - return syscalls, nil -} - -// Filter out all used syscall tracepoints from *.bpf.c -func tracedSyscalls() ([]string, error) { - var syscalls []string - const syscallDir = "internal/c/tracepoints" - - files, err := os.ReadDir(syscallDir) - if err != nil { - return syscalls, err - } - - for _, file := range files { - fileName := file.Name() - if !strings.HasSuffix(fileName, ".c") { - continue - } - content, err := os.ReadFile(fmt.Sprintf("%s/%s", syscallDir, fileName)) - if err != nil { - return syscalls, err - } - syscalls_, err := filterLines(strings.Split(string(content), "\n")) - if err != nil { - return syscalls, err - } - syscalls = append(syscalls, syscalls_...) - } - - return syscalls, nil -} - -func AttachSyscalls(bpfModule *bpf.Module) error { - syscalls, err := tracedSyscalls() - if err != nil { - return err - } - for _, name := range syscalls { - // Attach to tracepoint - prog, err := bpfModule.GetProgram(fmt.Sprintf("handle_%s", name)) - if err != nil { - return fmt.Errorf("Failed to get BPF program handle_%s: %v", name, err) - } - fmt.Println("Attached prog handle_" + name) - if _, err = prog.AttachTracepoint("syscalls", fmt.Sprintf("sys_%s", name)); err != nil { - return fmt.Errorf("Failed to attach to sys_%s tracepoint: %v", name, err) - } - fmt.Println("Attached tracepoint sys_" + name) - } - return nil -} diff --git a/internal/tracepoints/tracepoints.go b/internal/tracepoints/tracepoints.go new file mode 100644 index 0000000..1b6cf56 --- /dev/null +++ b/internal/tracepoints/tracepoints.go @@ -0,0 +1,23 @@ +package tracepoints + +import ( + "fmt" + + bpf "github.com/aquasecurity/libbpfgo" +) + +func AttachSyscalls(bpfModule *bpf.Module) error { + for _, name := range tracepointList { + // Attach to tracepoint + prog, err := bpfModule.GetProgram(fmt.Sprintf("handle_%s", name)) + if err != nil { + return fmt.Errorf("Failed to get BPF program handle_%s: %v", name, err) + } + fmt.Println("Attached prog handle_" + name) + if _, err = prog.AttachTracepoint("syscalls", fmt.Sprintf("sys_%s", name)); err != nil { + return fmt.Errorf("Failed to attach to sys_%s tracepoint: %v", name, err) + } + fmt.Println("Attached tracepoint sys_" + name) + } + return nil +} |
