class BPFState: task:str pid:int cpu:int timestamp:int message:str def __init__(self) -> None: self.task = None self.pid = None self.cpu = None self.timestamp = None self.message = None return def is_none(self) -> bool: return self.task is None def __repr__(self) -> str: info = f"BPFState {self.task} {self.pid} { self.cpu} {self.timestamp} {self.message}" return info class BaseBPF: def __init__(self, name:str) -> None: self.name = name return def attach_uprobe(self, exe_path:str, exe_sym:str, bpf_func:str) -> bool: raise NotADirectoryError def attach_uretprobe(self, exe_path:str, exe_sym:str, bpf_func:str) -> bool: raise NotADirectoryError def cleanup(self) -> None: raise NotADirectoryError def trace_ebpf(self) -> BPFState: raise NotADirectoryError