Initial commit: simtrace2-pysniff v0.1.0
Python-based SIMtrace2 sniffer — drop-in replacement for simtrace2-sniff. Single dependency (pyusb), auto-reconnect, GSMTAP/PCAP output, library API. Modules: protocol.py — SIMtrace2 USB sniffing protocol parser device.py — USB discovery + SniffSession with exponential backoff reconnect gsmtap.py — GSMTAP UDP sender for Wireshark pcap.py — PCAP file writer (LINKTYPE_GSMTAP) dump.py — hex dump formatters + file output __main__.py — CLI entry point Startup script sniff-start.sh handles udev permission checks and shows install instructions. udev rule uses TAG+=uaccess (systemd-logind ACL).
This commit is contained in:
commit
73b0277ef7
13 files changed
+1289
No files matched your search
Executable
+83
@@ -0,0 +1,83 @@
|
||||
#!/bin/bash
|
||||
# simtrace2-pysniff startup script
|
||||
#
|
||||
# Usage: ./sniff-start.sh [--gsmtap HOST[:PORT]] [--pcap FILE] [--output FILE] [--inactivity-timeout SECONDS]
|
||||
#
|
||||
# Options set via environment variables act as defaults; CLI flags override them.
|
||||
|
||||
set -euo pipefail
|
||||
shopt -s nullglob
|
||||
|
||||
PROJECT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||||
|
||||
GSMTAP="${GSMTAP:-}"
|
||||
PCAP="${PCAP:-}"
|
||||
OUTPUT="${OUTPUT:-}"
|
||||
INACTIVITY_TIMEOUT="${INACTIVITY_TIMEOUT:-0}"
|
||||
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case "$1" in
|
||||
--gsmtap) GSMTAP="$2"; shift 2 ;;
|
||||
--pcap) PCAP="$2"; shift 2 ;;
|
||||
--output|-o) OUTPUT="$2"; shift 2 ;;
|
||||
--inactivity-timeout) INACTIVITY_TIMEOUT="$2"; shift 2 ;;
|
||||
--keep-running|--no-reconnect)
|
||||
EXTRA_ARGS+=("$1"); shift ;;
|
||||
*) EXTRA_ARGS+=("$1"); shift ;;
|
||||
esac
|
||||
done
|
||||
|
||||
check_permissions() {
|
||||
local bad_perms=0
|
||||
|
||||
for devdir in /sys/bus/usb/devices/*/; do
|
||||
[[ -f "${devdir}busnum" ]] || continue
|
||||
[[ -f "${devdir}devnum" ]] || continue
|
||||
[[ -f "${devdir}uevent" ]] || continue
|
||||
|
||||
local vid
|
||||
vid=$(grep -oP 'PRODUCT=\K[a-f0-9]+' "${devdir}uevent" 2>/dev/null || true)
|
||||
[[ "$vid" == "1d50" ]] || continue
|
||||
|
||||
local busnum devnum node
|
||||
busnum=$(<"${devdir}busnum")
|
||||
devnum=$(<"${devdir}devnum")
|
||||
node=$(printf '/dev/bus/usb/%03d/%03d' "$busnum" "$devnum")
|
||||
|
||||
if [[ ! -e "$node" ]]; then
|
||||
continue
|
||||
fi
|
||||
|
||||
if [[ -w "$node" ]]; then
|
||||
return 0
|
||||
fi
|
||||
|
||||
bad_perms=1
|
||||
echo "Permission denied on $node" >&2
|
||||
done
|
||||
|
||||
if [[ $bad_perms -eq 1 ]]; then
|
||||
echo "" >&2
|
||||
echo "Install the udev rule (then reconnect the device):" >&2
|
||||
echo "──────────────────────────────────────────────────" >&2
|
||||
echo " sudo cp '$PROJECT_DIR/70-simtrace2-pysniff.rules' /etc/udev/rules.d/" >&2
|
||||
echo " sudo udevadm control --reload-rules" >&2
|
||||
echo " sudo udevadm trigger" >&2
|
||||
echo "──────────────────────────────────────────────────" >&2
|
||||
return 1
|
||||
fi
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
check_permissions || exit 3
|
||||
|
||||
ARGS=()
|
||||
[[ -n "$GSMTAP" ]] && ARGS+=(--gsmtap "$GSMTAP")
|
||||
[[ -n "$PCAP" ]] && ARGS+=(--pcap "$PCAP")
|
||||
[[ -n "$OUTPUT" ]] && ARGS+=(--output "$OUTPUT")
|
||||
[[ "$INACTIVITY_TIMEOUT" != "0" ]] && ARGS+=(--inactivity-timeout "$INACTIVITY_TIMEOUT")
|
||||
ARGS+=("${EXTRA_ARGS[@]}")
|
||||
|
||||
echo "Starting simtrace2-pysniff..." >&2
|
||||
exec env PYTHONPATH="$PROJECT_DIR" python3 -m simtrace2_pysniff "${ARGS[@]}"
|
||||
Reference in new issue
Block a user