Commit f1edfe43 authored by Brenden Blanco's avatar Brenden Blanco

Add bpf-run command line tool

Example usage:
sudo bpf-run -p sys_clone -c 'bpf_trace_printk("Hello, World!\n");' -t
Signed-off-by: default avatarBrenden Blanco <bblanco@plumgrid.com>
parent ada05c25
...@@ -6,6 +6,7 @@ macro(symlink_file SRC DST) ...@@ -6,6 +6,7 @@ macro(symlink_file SRC DST)
endmacro() endmacro()
symlink_file(${CMAKE_CURRENT_SOURCE_DIR}/bpf ${CMAKE_CURRENT_BINARY_DIR}/bpf) symlink_file(${CMAKE_CURRENT_SOURCE_DIR}/bpf ${CMAKE_CURRENT_BINARY_DIR}/bpf)
symlink_file(${CMAKE_CURRENT_SOURCE_DIR}/bpf-run ${CMAKE_CURRENT_BINARY_DIR}/bpf-run)
set(PIP_INSTALLABLE "${CMAKE_CURRENT_BINARY_DIR}/dist/bpf-${REVISION}.tar.gz") set(PIP_INSTALLABLE "${CMAKE_CURRENT_BINARY_DIR}/dist/bpf-${REVISION}.tar.gz")
configure_file(setup.py.in ${CMAKE_CURRENT_BINARY_DIR}/setup.py @ONLY) configure_file(setup.py.in ${CMAKE_CURRENT_BINARY_DIR}/setup.py @ONLY)
......
# file GENERATED by distutils, do NOT edit # file GENERATED by distutils, do NOT edit
setup.py setup.py
bpf/__init__.py bpf/__init__.py
bpf-run
#!/usr/bin/env python
import sys
USAGE = """\
usage: {argv0} <opts> -p probe_func -c cmd
-c cmd contents of the program to run, omitting prototype
-d name dump table <name> upon exit
-n sec run for <sec> seconds and then exit (default=-1)
-p probe kernel entry point to trace (required)
-t attach to kernel trace output
-v increase verbosity
example:
{argv0} -p sys_clone -c 'bpf_trace_printk("hello\\n");' -t\
"""
wrapper = """
int run(void *ctx) {
%s
return 0;
}
"""
def print_usage_and_exit(rc, msg=None):
if rc != 0:
sys.stdout = sys.stderr
if msg:
print(msg)
print(USAGE.format(argv0=sys.argv[0]))
sys.exit(rc)
def main():
import getopt
import os
import signal
try:
opts, args = getopt.getopt(sys.argv[1:], "c:d:hn:p:tv")
except getopt.error, msg:
print_usage_and_exit(2, msg)
runcmd = None
probe_fn = None
trace = 0
dump_tables = []
verbose = 0
nsec = 0
for o, a in opts:
if o == "-d": dump_tables.append(a)
if o == "-n": nsec = int(a)
if o == "-t": trace = 1
if o == "-v": verbose += 1
if o == "-c": runcmd = a
if o == "-p": probe_fn = a
if o == "-h": print_usage_and_exit(0)
if not runcmd or not probe_fn:
print_usage_and_exit(2, "Error: -p and -c arguments are required")
from bpf import BPF
b = BPF(text=wrapper % runcmd, debug=verbose)
fn = b.load_func("run", BPF.KPROBE)
BPF.attach_kprobe(fn, probe_fn)
if nsec:
def receive_alarm(signo, stack):
os.kill(os.getpid(), signal.SIGINT)
signal.signal(signal.SIGALRM, receive_alarm)
signal.alarm(nsec)
try:
if trace:
with open("/sys/kernel/debug/tracing/trace_pipe") as f:
while True:
line = f.readline(128)
print(line.rstrip())
sys.stdout.flush()
elif nsec:
signal.pause()
except KeyboardInterrupt:
pass
if dump_tables:
print("Table dump not yet implemented")
if __name__ == "__main__":
main()
...@@ -14,4 +14,5 @@ setup(name='bpf', ...@@ -14,4 +14,5 @@ setup(name='bpf',
author_email='bblanco@plumgrid.com', author_email='bblanco@plumgrid.com',
url='http://plumgrid.com', url='http://plumgrid.com',
packages=['bpf'], packages=['bpf'],
scripts=['bpf-run'],
platforms=['Linux']) platforms=['Linux'])
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment