86 lines
2.1 KiB
Bash
86 lines
2.1 KiB
Bash
#!/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"
|