#!/bin/bash
# 70-selinux.sh — SELinux под стек nginx→apache:8888→php-fpm:9082→mariadb на el9.
# На CentOS 7 SELinux тут фактически не мешал; на Stream 9 он ENFORCING по умолчанию,
# поэтому без этих правил Apache не достучится до php-fpm, а nginx — до Apache.
set -euo pipefail
cd "$(dirname "$0")"; source ./env.sh
need_root

MODE=$(getenforce 2>/dev/null || echo Disabled)
log "SELinux режим: $MODE"
if [ "$MODE" = "Disabled" ]; then warn "SELinux выключен — правила ниже не нужны, пропускаю"; exit 0; fi

log "Булевы значения"
setsebool -P httpd_can_network_connect 1        # nginx→apache:8888, apache→fpm:9082, php→внешние API (платёжки)
setsebool -P httpd_can_network_connect_db 1     # подключение к БД по сети/localhost
setsebool -P httpd_unified 1 2>/dev/null || true
setsebool -P httpd_execmem 1 2>/dev/null || true
ok "булевы выставлены"

log "Метки нестандартных портов (http_port_t): $APACHE_PORT, $APACHE_PORT2, $FPM_PORT"
for p in "$APACHE_PORT" "$APACHE_PORT2" "$FPM_PORT"; do
  semanage port -a -t http_port_t -p tcp "$p" 2>/dev/null \
    && ok "порт $p помечен" \
    || { semanage port -m -t http_port_t -p tcp "$p" 2>/dev/null && ok "порт $p уже/перемечен" || warn "порт $p — проверь вручную"; }
done

log "Контексты файлов сайта ($WEBROOT) — read-write для веб-сервера"
# Битрикс пишет в кэш/upload/managed/.settings и т.д. — проще пометить весь docroot rw.
semanage fcontext -a -t httpd_sys_rw_content_t "$WEBROOT(/.*)?" 2>/dev/null \
  || semanage fcontext -m -t httpd_sys_rw_content_t "$WEBROOT(/.*)?" 2>/dev/null || true
log "restorecon по дереву (может занять 1-2 минуты на 21G)"
restorecon -RF "$WEBROOT"
restorecon -RF /var/lib/php/session 2>/dev/null || true
ok "контексты применены"

cat <<'EOF'

  Если после старта что-то не работает и в логах SELinux-deny:
    ausearch -m AVC -ts recent | audit2allow -m mypol      # посмотреть
    ausearch -m AVC -ts recent | audit2allow -M mypol && semodule -i mypol.pp
  КРАЙНИЙ случай (НЕ рекомендуется как постоянное решение):
    setenforce 0   # временно permissive, чтобы разблокировать и спокойно донастроить
EOF
ok "Дальше: 80-firewall.sh"
