PythonBPF – Writing eBPF Programs in Pure Python
PythonBPF – пишем eBPF-программы на чистом Python
(в 2 раза короче)
Что это
Библиотека pip install pythonbpf компилирует Python-код в объектные .o-файлы и загружает их в ядро как обычные eBPF-программы. Репо: GitHub.
Было
Встраивали C в многострочные строки, теряя линтеры и подсветку:
from bcc import BPF
prog = """
int hello(void *ctx) {
bpf_trace_printk("Hello\\n");
return 0;
}
"""
b = BPF(text=prog)
b.attach_kprobe(event="sys_clone", fn_name="hello")
Стало
Тот же функционал — на Python:
from pythonbpf import bpf, section, compile
from pythonbpf.maps import HashMap
from pythonbpf.helpers import ktime
from ctypes import *
@bpf
def last() -> HashMap: # глобальная BPF-мапа
return HashMap(c_uint64, c_uint64, 1)
@bpf
@section("tracepoint/syscalls/sys_enter_execve")
def hello(_: c_void_p) -> c_int32:
print("entered")
return 0
@bpf
@section("tracepoint/syscalls/sys_exit_execve")
def bye(_: c_void_p) -> c_int64:
print("exited")
last().update(0, ktime())
return 0
@bpf
def LICENSE() -> str: # лицензия ядра
return "GPL"
compile() # → .o и загрузка
Как работает
ast→ деревоllvmlite→ LLVM IRllc→ BPF-объектlibbpf→ загрузка в ядро