#!/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 [--filter ] [--output ] [--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"