check_tiktak.sh: не зависеть от раскладки каталогов
На vulnbox сервис лежит в ./tiktak, в репе -- в ./services/tiktak, и скрипт падал на поиске тестового видео ещё до первой проверки. - каталог сервиса ищется сам (./tiktak, ./services/tiktak, ., рядом со скриптом), либо задаётся через TIKTAK_DIR - тестовый webm: с диска -> скачать с живого сервиса (/feed -> /watch/N -> ссылка на .webm, публичное видео отдаёт её без авторизации) -> ffmpeg на хосте -> ffmpeg в контейнере - бомба для проверки DoS-защиты тоже генерится в контейнере, если на хосте нет ffmpeg Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
+66
-13
@@ -1,7 +1,12 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
# Smoke-test для tiktak. Запускать НА VULNBOX из каталога репы.
|
# Smoke-test для tiktak. Запускать НА VULNBOX, из любого каталога.
|
||||||
# ./check_tiktak.sh -> проверяет 127.0.0.1:5000
|
# ./check_tiktak.sh -> проверяет 127.0.0.1:5000
|
||||||
# ./check_tiktak.sh 10.10.10.3 -> проверяет чужой/свой бокс по сети
|
# ./check_tiktak.sh 10.10.10.3 -> проверяет бокс по сети
|
||||||
|
# TIKTAK_DIR=~/tiktak ./check_tiktak.sh -> если каталог не нашёлся сам
|
||||||
|
#
|
||||||
|
# Каталог сервиса ищется сам: ./tiktak, ./services/tiktak, ., рядом со скриптом.
|
||||||
|
# Тестовое видео берётся с диска, иначе скачивается с самого сервиса, иначе
|
||||||
|
# генерится ffmpeg на хосте или в контейнере -- нужен хотя бы один источник.
|
||||||
#
|
#
|
||||||
# Повторяет сценарий чекера (register -> create -> watch -> vtt -> share по
|
# Повторяет сценарий чекера (register -> create -> watch -> vtt -> share по
|
||||||
# токену) и отдельно проверяет, что патчи действительно в задеплоенном билде.
|
# токену) и отдельно проверяет, что патчи действительно в задеплоенном билде.
|
||||||
@@ -19,17 +24,60 @@ info() { printf '\n\033[1m%s\033[0m\n' "$1"; }
|
|||||||
|
|
||||||
req() { curl -sS -m 10 "$@"; }
|
req() { curl -sS -m 10 "$@"; }
|
||||||
|
|
||||||
|
# ---------- где лежит сервис ----------
|
||||||
|
# Раскладка отличается: на vulnbox это ./tiktak, в репе ./services/tiktak.
|
||||||
|
# Переопределить можно через TIKTAK_DIR=/path ./check_tiktak.sh
|
||||||
|
SELF_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
SVC=""
|
||||||
|
for cand in "${TIKTAK_DIR:-}" \
|
||||||
|
"./tiktak" "./services/tiktak" "." \
|
||||||
|
"$SELF_DIR/tiktak" "$SELF_DIR/services/tiktak" "$SELF_DIR"; do
|
||||||
|
[ -n "$cand" ] || continue
|
||||||
|
if [ -f "$cand/docker-compose.yml" ] && [ -d "$cand/public" ]; then
|
||||||
|
SVC="$(cd "$cand" && pwd)"; break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
[ -n "$SVC" ] && echo "каталог сервиса: $SVC" || echo "каталог сервиса не найден (не критично, нужен только для видео и бомбы)"
|
||||||
|
|
||||||
|
dc() { [ -n "$SVC" ] && docker compose -f "$SVC/docker-compose.yml" "$@"; }
|
||||||
|
|
||||||
# ---------- тестовый webm ----------
|
# ---------- тестовый webm ----------
|
||||||
|
# 1) уже загруженный файл 2) скачать с живого сервиса 3) ffmpeg на хосте
|
||||||
|
# 4) ffmpeg внутри контейнера
|
||||||
VIDEO="$TMP/clip.webm"
|
VIDEO="$TMP/clip.webm"
|
||||||
if ls services/tiktak/public/video/*.webm >/dev/null 2>&1; then
|
|
||||||
cp "$(ls -S services/tiktak/public/video/*.webm | tail -1)" "$VIDEO"
|
if [ -n "$SVC" ] && ls "$SVC"/public/video/*.webm >/dev/null 2>&1; then
|
||||||
elif command -v ffmpeg >/dev/null 2>&1; then
|
cp "$(ls -S "$SVC"/public/video/*.webm | tail -1)" "$VIDEO"
|
||||||
ffmpeg -y -v error -f lavfi -i testsrc=size=320x240:rate=5 -t 1 -c:v libvpx "$VIDEO" </dev/null
|
echo "видео: взял с диска"
|
||||||
else
|
fi
|
||||||
docker compose -f services/tiktak/docker-compose.yml exec -T tiktak \
|
|
||||||
ffmpeg -v error -f lavfi -i testsrc=size=320x240:rate=5 -t 1 -c:v libvpx -f webm - > "$VIDEO" 2>/dev/null
|
if [ ! -s "$VIDEO" ]; then
|
||||||
|
# публичное видео отдаёт ссылку на .webm прямо в /watch без авторизации
|
||||||
|
for vid in $(req "$BASE/feed" | grep -o '/watch/[0-9]*' | grep -o '[0-9]*' | head -15); do
|
||||||
|
src=$(req "$BASE/watch/$vid" | grep -o 'public/video/[A-Za-z0-9-]*\.webm' | head -1)
|
||||||
|
[ -n "$src" ] || continue
|
||||||
|
req -o "$VIDEO" "$BASE/$src" && [ -s "$VIDEO" ] && { echo "видео: скачал с сервиса (/watch/$vid)"; break; }
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -s "$VIDEO" ] && command -v ffmpeg >/dev/null 2>&1; then
|
||||||
|
ffmpeg -y -v error -f lavfi -i testsrc=size=320x240:rate=5 -t 1 -c:v libvpx "$VIDEO" </dev/null 2>/dev/null \
|
||||||
|
&& echo "видео: сгенерил ffmpeg"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -s "$VIDEO" ] && [ -n "$SVC" ]; then
|
||||||
|
dc exec -T tiktak ffmpeg -v error -f lavfi -i testsrc=size=320x240:rate=5 -t 1 \
|
||||||
|
-c:v libvpx -f webm - > "$VIDEO" 2>/dev/null && [ -s "$VIDEO" ] \
|
||||||
|
&& echo "видео: сгенерил ffmpeg в контейнере"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -s "$VIDEO" ]; then
|
||||||
|
echo
|
||||||
|
echo "не смог получить тестовый webm. Варианты:"
|
||||||
|
echo " TIKTAK_DIR=/path/to/tiktak $0 $HOST"
|
||||||
|
echo " либо положи любой .webm в <сервис>/public/video/"
|
||||||
|
exit 1
|
||||||
fi
|
fi
|
||||||
[ -s "$VIDEO" ] || { echo "не смог получить тестовый webm — положи любой в services/tiktak/public/video/"; exit 1; }
|
|
||||||
echo "тестовое видео: $(wc -c < "$VIDEO") байт"
|
echo "тестовое видео: $(wc -c < "$VIDEO") байт"
|
||||||
|
|
||||||
# ---------- 1. живость ----------
|
# ---------- 1. живость ----------
|
||||||
@@ -110,15 +158,20 @@ fi
|
|||||||
# ---------- 6. бомба ----------
|
# ---------- 6. бомба ----------
|
||||||
info "6. decompression bomb"
|
info "6. decompression bomb"
|
||||||
BOMB="$TMP/bomb.webm"
|
BOMB="$TMP/bomb.webm"
|
||||||
if command -v ffmpeg >/dev/null 2>&1 && \
|
if command -v ffmpeg >/dev/null 2>&1; then
|
||||||
ffmpeg -y -v error -f lavfi -i color=c=black:s=8192x8192:d=1 -c:v libvpx "$BOMB" </dev/null 2>/dev/null && [ -s "$BOMB" ]; then
|
ffmpeg -y -v error -f lavfi -i color=c=black:s=8192x8192:d=1 -c:v libvpx "$BOMB" </dev/null 2>/dev/null
|
||||||
|
elif [ -n "$SVC" ]; then
|
||||||
|
dc exec -T tiktak ffmpeg -v error -f lavfi -i color=c=black:s=8192x8192:d=1 \
|
||||||
|
-c:v libvpx -f webm - > "$BOMB" 2>/dev/null
|
||||||
|
fi
|
||||||
|
if [ -s "$BOMB" ]; then
|
||||||
t0=$(date +%s)
|
t0=$(date +%s)
|
||||||
code=$(req -o /dev/null -w '%{http_code}' -b "$J1" -X POST "$BASE/create" \
|
code=$(req -o /dev/null -w '%{http_code}' -b "$J1" -X POST "$BASE/create" \
|
||||||
-F "description=b" -F "subtitles=b" -F "video=@$BOMB;type=video/webm")
|
-F "description=b" -F "subtitles=b" -F "video=@$BOMB;type=video/webm")
|
||||||
dt=$(( $(date +%s) - t0 ))
|
dt=$(( $(date +%s) - t0 ))
|
||||||
[ "$code" = "422" ] && ok "бомба 8192x8192 отбита за ${dt}s" || bad "бомба -> $code за ${dt}s (ждали 422)"
|
[ "$code" = "422" ] && ok "бомба 8192x8192 отбита за ${dt}s" || bad "бомба -> $code за ${dt}s (ждали 422)"
|
||||||
else
|
else
|
||||||
echo " -- пропуск: нет ffmpeg для генерации бомбы"
|
echo " -- пропуск: не смог сгенерить бомбу (нет ffmpeg ни на хосте, ни в контейнере)"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# ---------- итог ----------
|
# ---------- итог ----------
|
||||||
|
|||||||
Reference in New Issue
Block a user