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
|
||||
# Smoke-test для tiktak. Запускать НА VULNBOX из каталога репы.
|
||||
# Smoke-test для tiktak. Запускать НА VULNBOX, из любого каталога.
|
||||
# ./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 по
|
||||
# токену) и отдельно проверяет, что патчи действительно в задеплоенном билде.
|
||||
@@ -19,17 +24,60 @@ info() { printf '\n\033[1m%s\033[0m\n' "$1"; }
|
||||
|
||||
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 ----------
|
||||
# 1) уже загруженный файл 2) скачать с живого сервиса 3) ffmpeg на хосте
|
||||
# 4) ffmpeg внутри контейнера
|
||||
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"
|
||||
elif 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
|
||||
else
|
||||
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 [ -n "$SVC" ] && ls "$SVC"/public/video/*.webm >/dev/null 2>&1; then
|
||||
cp "$(ls -S "$SVC"/public/video/*.webm | tail -1)" "$VIDEO"
|
||||
echo "видео: взял с диска"
|
||||
fi
|
||||
|
||||
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
|
||||
[ -s "$VIDEO" ] || { echo "не смог получить тестовый webm — положи любой в services/tiktak/public/video/"; exit 1; }
|
||||
echo "тестовое видео: $(wc -c < "$VIDEO") байт"
|
||||
|
||||
# ---------- 1. живость ----------
|
||||
@@ -110,15 +158,20 @@ fi
|
||||
# ---------- 6. бомба ----------
|
||||
info "6. decompression bomb"
|
||||
BOMB="$TMP/bomb.webm"
|
||||
if command -v ffmpeg >/dev/null 2>&1 && \
|
||||
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
|
||||
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
|
||||
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)
|
||||
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")
|
||||
dt=$(( $(date +%s) - t0 ))
|
||||
[ "$code" = "422" ] && ok "бомба 8192x8192 отбита за ${dt}s" || bad "бомба -> $code за ${dt}s (ждали 422)"
|
||||
else
|
||||
echo " -- пропуск: нет ffmpeg для генерации бомбы"
|
||||
echo " -- пропуск: не смог сгенерить бомбу (нет ffmpeg ни на хосте, ни в контейнере)"
|
||||
fi
|
||||
|
||||
# ---------- итог ----------
|
||||
|
||||
Reference in New Issue
Block a user