| #!/usr/bin/python3 | |
| import sys | |
| import time | |
| from bcc import BPF | |
| src = r""" | |
| BPF_RINGBUF_OUTPUT(buffer, 1 << 4); | |
| struct event { | |
| char filename[64]; | |
| int dfd; | |
| int flags; | |
| int mode; | |
| }; | |
| TRACEPOINT_PROBE(syscalls, sys_enter_openat) { | |
| int zero = 0; | |
| struct event *event = buffer.ringbuf_reserve(sizeof(struct event)); | |
| if (!event) { | |
| return 1; | |
| } | |
| bpf_probe_read_user_str(event->filename, sizeof(event->filename), args->filename); | |
| event->dfd = args->dfd; | |
| event->flags = args->flags; | |
| event->mode = args->mode; | |
| buffer.ringbuf_submit(event, 0); | |
| // or, to discard: buffer.ringbuf_discard(event, 0); | |
| return 0; | |
| } | |
| """ | |
| b = BPF(text=src) | |
| def callback(ctx, data, size): | |
| event = b['buffer'].event(data) | |
| print("%-64s %10d %10d %10d" % (event.filename.decode('utf-8'), event.dfd, event.flags, event.mode)) | |
| b['buffer'].open_ring_buffer(callback) | |
| print("Printing openat() calls, ctrl-c to exit.") | |
| print("%-64s %10s %10s %10s" % ("FILENAME", "DIR_FD", "FLAGS", "MODE")) | |
| try: | |
| while 1: | |
| b.ring_buffer_consume() | |
| time.sleep(0.5) | |
| except KeyboardInterrupt: | |
| sys.exit() |