summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2024-02-19 11:53:13 +0200
committerPaul Buetow <paul@buetow.org>2024-02-19 11:53:13 +0200
commit4309271756784e9e4846a385c477ea31f183dc3b (patch)
treec302159be3c7322a59bcbf08c5fe9b5b423721b0
parent728b11eb64db53d8f71faa86ed5043efbaa8d589 (diff)
make ioriotng able to run without .c source files present
-rw-r--r--.gitignore2
-rw-r--r--Makefile13
-rw-r--r--internal/tracepoints/syscalls.go76
-rw-r--r--internal/tracepoints/tracepoints.go23
4 files changed, 36 insertions, 78 deletions
diff --git a/.gitignore b/.gitignore
index bb65147..95947f5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,4 +2,4 @@ ioriotng
/ioriotng.bpf.c
*.o
vmlinux.h
-
+tracepoint_list.go
diff --git a/Makefile b/Makefile
index 19460a8..8dc859e 100644
--- a/Makefile
+++ b/Makefile
@@ -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
+}