netns: вход в namespace через nsenter при отказе ip netns exec (#56)
- lib.sh: ns_exec()/ns_prefix() с автоопределением режима (AWG_NS_EXEC_MODE), stand_fail() для кода 4; cleanup в run.sh больше не оставляет мок и sink. - run.sh/topology.sh: коды возврата нормализованы к 0/1/3/4 (255 от iproute2 -> 4). Refs #21, Refs #15, Refs #56
This commit is contained in:
+28
-12
@@ -27,6 +27,12 @@ HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
# shellcheck source=tests/netns/lib.sh
|
||||
source "$HERE/lib.sh"
|
||||
|
||||
# Контракт кодов возврата: 0 — успех, 1 — тесты упали, 3 — заблокировано
|
||||
# окружением, 4 — ошибка стенда. Неожиданные коды утилит (например 255 от
|
||||
# `ip netns exec` в контейнере — issue #56) нормализуем в 4, чтобы CI #17
|
||||
# различал «нет прав» и «сломался стенд».
|
||||
trap 'rc=$?; case "$rc" in 0|1|3|4) exit "$rc" ;; *) warn "run.sh: непредвиденный код ${rc} — трактую как ошибку стенда (4)"; exit 4 ;; esac' ERR
|
||||
|
||||
KEEP_TOPO=0
|
||||
NO_TESTS=0
|
||||
REPORT=""
|
||||
@@ -52,6 +58,9 @@ require_root
|
||||
require_cmd ip
|
||||
require_cmd python3
|
||||
require_netns_capability
|
||||
NS_EXEC_RESOLVED="$(select_ns_exec_mode)"
|
||||
export AWG_NS_EXEC_MODE="$NS_EXEC_RESOLVED"
|
||||
log "вход в netns: ${NS_EXEC_RESOLVED}"
|
||||
|
||||
if [ -n "$WORKDIR_OPT" ]; then
|
||||
export AWG_NETNS_WORKDIR="$WORKDIR_OPT"
|
||||
@@ -81,10 +90,16 @@ cleanup() {
|
||||
[ "$CLEANED" -eq 1 ] && return 0
|
||||
CLEANED=1
|
||||
for pid in "$MOCK_PID" "$SINK_PID"; do
|
||||
if [ -n "$pid" ] && kill -0 "$pid" 2>/dev/null; then
|
||||
kill -TERM "$pid" 2>/dev/null || true
|
||||
wait "$pid" 2>/dev/null || true
|
||||
fi
|
||||
[ -n "$pid" ] || continue
|
||||
kill -0 "$pid" 2>/dev/null || continue
|
||||
kill -TERM "$pid" 2>/dev/null || true
|
||||
# до 2с на штатное завершение, затем SIGKILL — иначе прогон «висит» на wait
|
||||
for _ in $(seq 1 20); do
|
||||
kill -0 "$pid" 2>/dev/null || break
|
||||
sleep 0.1
|
||||
done
|
||||
kill -KILL "$pid" 2>/dev/null || true
|
||||
wait "$pid" 2>/dev/null || true
|
||||
done
|
||||
if [ "$KEEP_TOPO" -eq 1 ]; then
|
||||
warn "топология сохранена (--keep-topology): ${AWG_NS_CLIENT} ${AWG_NS_GW} ${AWG_NS_UPLINK}"
|
||||
@@ -100,24 +115,25 @@ log "рабочий каталог: ${AWG_NETNS_WORKDIR}"
|
||||
bash "$HERE/topology.sh" up
|
||||
|
||||
log "запускаю мок WireGuard-endpoint (udp/${AWG_MOCK_PORT}) в ${AWG_NS_UPLINK}"
|
||||
ip netns exec "$AWG_NS_UPLINK" python3 "$HERE/mock_wg_endpoint.py" \
|
||||
--bind "0.0.0.0:${AWG_MOCK_PORT}" --log "$AWG_MOCK_LOG" --ready "$AWG_MOCK_READY" \
|
||||
--mode-file "$AWG_MOCK_MODE_FILE" --mode respond &
|
||||
mapfile -t NS_PREFIX < <(ns_prefix "$AWG_NS_UPLINK")
|
||||
( exec "${NS_PREFIX[@]}" python3 "$HERE/mock_wg_endpoint.py" \
|
||||
--bind "0.0.0.0:${AWG_MOCK_PORT}" --log "$AWG_MOCK_LOG" --ready "$AWG_MOCK_READY" \
|
||||
--mode-file "$AWG_MOCK_MODE_FILE" --mode respond ) &
|
||||
MOCK_PID=$!
|
||||
|
||||
log "запускаю детектор утечки (${AWG_LEAK_IP}:${AWG_LEAK_PORT}) в ${AWG_NS_UPLINK}"
|
||||
ip netns exec "$AWG_NS_UPLINK" python3 "$HERE/leak_sink.py" \
|
||||
--ip "$AWG_LEAK_IP" --port "$AWG_LEAK_PORT" --log "$AWG_LEAK_LOG" --ready "$AWG_LEAK_READY" &
|
||||
( exec "${NS_PREFIX[@]}" python3 "$HERE/leak_sink.py" \
|
||||
--ip "$AWG_LEAK_IP" --port "$AWG_LEAK_PORT" --log "$AWG_LEAK_LOG" --ready "$AWG_LEAK_READY" ) &
|
||||
SINK_PID=$!
|
||||
|
||||
# ждём готовности обоих процессов (файлы-флаги пишутся после bind)
|
||||
for _ in $(seq 1 100); do
|
||||
if [ -f "$AWG_MOCK_READY" ] && [ -f "$AWG_LEAK_READY" ]; then break; fi
|
||||
if ! kill -0 "$MOCK_PID" 2>/dev/null; then fail "мок WireGuard-endpoint упал при старте"; fi
|
||||
if ! kill -0 "$MOCK_PID" 2>/dev/null; then stand_fail "мок WireGuard-endpoint упал при старте"; fi
|
||||
sleep 0.1
|
||||
done
|
||||
[ -f "$AWG_MOCK_READY" ] || fail "мок WireGuard-endpoint не поднялся за 10с"
|
||||
[ -f "$AWG_LEAK_READY" ] || fail "детектор утечки не поднялся за 10с"
|
||||
[ -f "$AWG_MOCK_READY" ] || stand_fail "мок WireGuard-endpoint не поднялся за 10с"
|
||||
[ -f "$AWG_LEAK_READY" ] || stand_fail "детектор утечки не поднялся за 10с"
|
||||
ok "мок-endpoint и детектор утечки готовы"
|
||||
|
||||
# --- тесты -------------------------------------------------------------------
|
||||
|
||||
Reference in New Issue
Block a user