Add capabilities at build
This commit is contained in:
85
slopcap
Normal file
85
slopcap
Normal file
@@ -0,0 +1,85 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
helper_dir=${SLOPTRAP_HELPER_DIR:-/run/sloptrap-helper}
|
||||
queue_dir="$helper_dir/queue"
|
||||
default_output=${SLOPTRAP_CAPTURE_DIR:-/codex/state/captures}
|
||||
mkdir -p "$queue_dir" "$default_output"
|
||||
|
||||
if [[ ${1-} != "capture" ]]; then
|
||||
printf 'usage: slopcap capture --interface <iface> [--filter <expr>] [--output <path>] [--stdout]\n' >&2
|
||||
exit 2
|
||||
fi
|
||||
shift
|
||||
|
||||
iface=""
|
||||
filter=""
|
||||
output=""
|
||||
stdout_mode=0
|
||||
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case "$1" in
|
||||
--interface)
|
||||
shift
|
||||
[[ $# -gt 0 ]] || { printf 'slopcap: --interface requires a value\n' >&2; exit 2; }
|
||||
iface=$1
|
||||
;;
|
||||
--filter)
|
||||
shift
|
||||
[[ $# -gt 0 ]] || { printf 'slopcap: --filter requires a value\n' >&2; exit 2; }
|
||||
filter=$1
|
||||
;;
|
||||
--output)
|
||||
shift
|
||||
[[ $# -gt 0 ]] || { printf 'slopcap: --output requires a value\n' >&2; exit 2; }
|
||||
output=$1
|
||||
;;
|
||||
--stdout)
|
||||
stdout_mode=1
|
||||
;;
|
||||
*)
|
||||
printf 'slopcap: unsupported argument %s\n' "$1" >&2
|
||||
exit 2
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
[[ -n $iface ]] || { printf 'slopcap: --interface is required\n' >&2; exit 2; }
|
||||
if [[ -z $output && $stdout_mode -eq 0 ]]; then
|
||||
output="$default_output/capture-$(date +%s).pcap"
|
||||
fi
|
||||
|
||||
request_dir=$(mktemp -d "$queue_dir/request.XXXXXX.req")
|
||||
trap 'rm -rf "$request_dir"' EXIT INT TERM HUP
|
||||
printf 'packet-capture\n' >"$request_dir/op"
|
||||
printf '%s\n' "$iface" >"$request_dir/interface"
|
||||
printf '%s\n' "$filter" >"$request_dir/filter"
|
||||
printf '%s\n' "$output" >"$request_dir/output"
|
||||
printf '%s\n' "$stdout_mode" >"$request_dir/stdout_mode"
|
||||
|
||||
stream_pid=""
|
||||
if [[ $stdout_mode -eq 1 ]]; then
|
||||
touch "$request_dir/stdout"
|
||||
tail -f "$request_dir/stdout" &
|
||||
stream_pid=$!
|
||||
fi
|
||||
|
||||
while [[ ! -f "$request_dir/status" ]]; do
|
||||
sleep 1
|
||||
done
|
||||
|
||||
if [[ -n $stream_pid ]]; then
|
||||
kill "$stream_pid" >/dev/null 2>&1 || true
|
||||
wait "$stream_pid" >/dev/null 2>&1 || true
|
||||
fi
|
||||
|
||||
if [[ $stdout_mode -eq 0 && -s "$request_dir/stdout" ]]; then
|
||||
cat "$request_dir/stdout"
|
||||
fi
|
||||
if [[ -s "$request_dir/stderr" ]]; then
|
||||
cat "$request_dir/stderr" >&2
|
||||
fi
|
||||
|
||||
status=$(<"$request_dir/status")
|
||||
exit "$status"
|
||||
Reference in New Issue
Block a user