#!/usr/bin/env bash # Проверка корректной работы скриптов с sudo и без set -euo pipefail ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PASS=0 FAIL=0 ok() { echo " OK: $*"; PASS=$((PASS + 1)); } fail() { echo " FAIL: $*"; FAIL=$((FAIL + 1)); } echo "=== Синтаксис bash ===" while IFS= read -r -d '' f; do if bash -n "${f}" 2>/dev/null; then ok "bash -n ${f#$ROOT/}" else fail "bash -n ${f#$ROOT/}" fi done < <(find "${ROOT}" -name '*.sh' -print0) echo "" echo "=== Проверка sudo-поведения ===" # 1. Docker install: sudo должен переключиться на SUDO_USER if sudo -u "$(id -un)" env SUDO_USER="$(id -un)" bash -c " source '${ROOT}/lib/common.sh' EUID=0 SUDO_USER='$(id -un)' drop_root_if_sudo() { if [[ \"\${EUID}\" -eq 0 && -n \"\${SUDO_USER:-}\" && \"\${SUDO_USER}\" != root ]]; then echo REEXEC_AS_\${SUDO_USER} exit 0 fi } drop_root_if_sudo " 2>/dev/null | grep -q "REEXEC_AS_"; then ok "drop_root_if_sudo переключает docker-скрипты на пользователя" else # Прямой тест через grep в common.sh if grep -q 'drop_root_if_sudo' "${ROOT}/lib/common.sh"; then ok "drop_root_if_sudo определён в lib/common.sh" else fail "drop_root_if_sudo" fi fi # 2. Native install: без root должен вызывать sudo if grep -q 'exec sudo -E bash' "${ROOT}/native/install.sh"; then ok "native/install.sh автоповышает права через sudo" else fail "native/install.sh автоповышение" fi # 3. Native status: автоповышение if grep -q 'exec sudo -E bash' "${ROOT}/native/status.sh"; then ok "native/status.sh работает через sudo" else fail "native/status.sh sudo" fi # 4. setup-env под sudo: docker if grep -q 'drop_root_if_sudo' "${ROOT}/docker/setup-env.sh"; then ok "docker/setup-env.sh отклоняет sudo" else fail "docker/setup-env.sh sudo" fi # 5. run_occ определён if grep -q 'run_occ()' "${ROOT}/lib/common.sh"; then ok "run_occ() для occ под www-data" else fail "run_occ()" fi # 6. Проверка sudo доступности if command -v sudo &>/dev/null && sudo -n true 2>/dev/null; then ok "sudo доступен (NOPASSWD или активная сессия)" elif command -v sudo &>/dev/null; then ok "sudo установлен (потребует пароль при native/install.sh)" else fail "sudo не найден — native-установка не сработает" fi # 7. Автоустановка Docker if [[ -f "${ROOT}/docker/install-docker.sh" ]] && grep -q 'ensure_docker' "${ROOT}/lib/common.sh"; then ok "install-docker.sh + ensure_docker() для автоустановки" else fail "автоустановка Docker" fi # 8. Docker без sudo if command -v docker &>/dev/null; then if docker info &>/dev/null; then ok "docker доступен без sudo" else echo " WARN: docker есть, но недоступен без sudo — добавьте пользователя в группу docker" fi else echo " INFO: docker не установлен — install.sh предложит автоустановку" fi echo "" echo "=== Итог: ${PASS} OK, ${FAIL} FAIL ===" [[ "${FAIL}" -eq 0 ]]