nextcloud-install/check-sudo.sh
2026-06-24 09:23:58 +03:00

105 lines
3.3 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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 ]]