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:
2026-08-26 12:36:31 +03:00
co-authored by Claude Opus 5
parent 753d21c3e8
commit 12b1d02f39
+66 -13
View File
@@ -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
# ---------- итог ---------- # ---------- итог ----------