#!/usr/bin/env bash
# Совмещение OpenID и контрольной панели на одной машине (инсталлятор 26.2, ветка release/26.2-free).
# Переводит OpenID с собственного TLS-порта 443 на локальный 5556 и выставляет его наружу
# через nginx КП по пути /openid. Инструкция по шагам: см. openid-cp-same-host-26.2.pdf.
#
# Использование (от root, на итоговой машине):
#   ./openid-cp-same-host.sh <fqdn>
#
# Перед каждым изменением файл сохраняется как <файл>.bak.<метка времени>.
# Откат: вернуть .bak-копии на место и перезапустить openid, controlPanel, nginx.
set -euo pipefail

FQDN="${1:?Использование: $0 <fqdn итоговой машины>}"
ISSUER="https://${FQDN}/openid"
TS="$(date +%Y%m%d-%H%M%S)"

OPENID_CONF="/opt/itc/openid/config.yaml"
CP_ENV="/opt/itc/itc/env/client_env.js"
CP_CONF="/opt/itc/itc/config/itc_api_miniCA_controlPanel_config.json"
NGINX_CONF="/opt/itc/itc/nginx/openid.conf"

for f in "$OPENID_CONF" "$CP_ENV" "$CP_CONF"; do
  [ -f "$f" ] || { echo "Не найден $f, установка отличается от ожидаемой"; exit 1; }
done

[ "$(id -u)" -eq 0 ] || { echo "Запускать от root"; exit 1; }

backup() { cp -a "$1" "$1.bak.$TS"; echo "  бэкап: $1.bak.$TS"; }

echo "=== 1. $OPENID_CONF ==="
backup "$OPENID_CONF"
sed -i "s|^issuer: .*|issuer: ${ISSUER}|" "$OPENID_CONF"
# web: свой TLS на 443 -> обычный HTTP на локальном 5556, ключи tlsCert/tlsKey больше не нужны
sed -i 's|^  https: .*|  http: "127.0.0.1:5556"|' "$OPENID_CONF"
sed -i '/^  tlsCert:/d; /^  tlsKey:/d' "$OPENID_CONF"
# adminServer: внутреннее API для КП, наружу не нужно
sed -i 's|^  http: .*:5559.*|  http: "127.0.0.1:5559"|' "$OPENID_CONF"
# redirectURIs: замена списка адресов КП (секция идет последней в файле)
sed -i '/redirectURIs:/,$d' "$OPENID_CONF"
printf '    redirectURIs:\n      - https://%s\n' "$FQDN" >> "$OPENID_CONF"

echo "=== 2. $CP_ENV ==="
backup "$CP_ENV"
sed -i "s|issuer: '[^']*'|issuer: '${ISSUER}'|; s|issuer: \"[^\"]*\"|issuer: '${ISSUER}'|" "$CP_ENV"

echo "=== 3. $CP_CONF ==="
backup "$CP_CONF"
sed -i "s|\"Authority\": \"[^\"]*\"|\"Authority\": \"${ISSUER}\"|" "$CP_CONF"
# Services.OpenId - адрес adminServer (5559), не issuer
sed -i "s|\"OpenId\": \"[^\"]*\"|\"OpenId\": \"http://127.0.0.1:5559\"|" "$CP_CONF"
if command -v python3 >/dev/null 2>&1; then
  python3 -m json.tool "$CP_CONF" >/dev/null || { echo "Конфиг КП стал невалидным JSON, смотрите .bak"; exit 1; }
fi

echo "=== 4. $NGINX_CONF ==="
cat > "$NGINX_CONF" <<'EOF'
location /openid {
    proxy_pass http://127.0.0.1:5556;
    proxy_http_version 1.1;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Real-IP $remote_addr;
}
EOF

echo "=== 5. Перезапуск сервисов ==="
unit_user() {
  local f
  f="$(find /home /etc/systemd/user /usr/local/share/systemd/user /usr/share/systemd/user \
        -name "$1" 2>/dev/null | head -n1)"
  [ -n "$f" ] && stat -c %U "$f"
}

restart_user_unit() {
  local user uid
  user="$(unit_user "$1")"
  [ -n "$user" ] || { echo "Юнит $1 не найден"; exit 1; }
  uid="$(id -u "$user")"
  sudo -u "$user" XDG_RUNTIME_DIR="/run/user/$uid" systemctl --user restart "$1"
  echo "  $1 перезапущен (пользователь $user)"
}

restart_user_unit openid.service
restart_user_unit controlPanel.service
nginx -t
systemctl reload nginx
echo "  nginx перечитал конфигурацию"

echo "=== 6. Проверка ==="
sleep 2
if curl -sk "https://${FQDN}/openid/.well-known/openid-configuration" | grep -q "\"issuer\":\"${ISSUER}\""; then
  echo "issuer в openid-configuration: ${ISSUER} — ок"
else
  echo "issuer не совпал. Проверьте:"
  echo "  journalctl --user -u openid (если бинарь не принял web.http, см. п.1 инструкции: оставить web.https + tlsCert/tlsKey на 127.0.0.1:5556 и поменять proxy_pass в $NGINX_CONF на https://)"
  exit 1
fi

echo
echo "Готово. Бэкапы с меткой $TS лежат рядом с изменёнными файлами."
echo "Откройте КП по https://${FQDN}/ и войдите; пользователям потребуется повторный вход."
