diff --git a/check_tiktak.sh b/check_tiktak.sh index e937a13..1548342 100755 --- a/check_tiktak.sh +++ b/check_tiktak.sh @@ -1,7 +1,12 @@ #!/usr/bin/env bash -# Smoke-test для tiktak. Запускать НА VULNBOX из каталога репы. -# ./check_tiktak.sh -> проверяет 127.0.0.1:5000 -# ./check_tiktak.sh 10.10.10.3 -> проверяет чужой/свой бокс по сети +# Smoke-test для tiktak. Запускать НА VULNBOX, из любого каталога. +# ./check_tiktak.sh -> проверяет 127.0.0.1:5000 +# ./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" "$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 \ + && 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 && [ -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 +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 # ---------- итог ----------