#!/bin/bash

# ============================================================
# Instalación automática de WHM/cPanel
# Compatible con AlmaLinux 9 y AlmaLinux 10
# ============================================================

set -e

LOG_FILE="/root/cpanel-install.log"

exec > >(tee -a "$LOG_FILE") 2>&1

echo "============================================================"
echo "       INSTALACIÓN AUTOMÁTICA DE WHM/cPanel"
echo "       AlmaLinux 9 / AlmaLinux 10"
echo "============================================================"
echo ""

# ------------------------------------------------------------
# 1. Verificar ROOT
# ------------------------------------------------------------

if [ "$EUID" -ne 0 ]; then
    echo "ERROR: Debes ejecutar este script como ROOT."
    exit 1
fi

echo "[OK] Usuario ROOT detectado."

# ------------------------------------------------------------
# 2. Detectar sistema operativo
# ------------------------------------------------------------

if [ ! -f /etc/os-release ]; then
    echo "ERROR: No se puede detectar el sistema operativo."
    exit 1
fi

source /etc/os-release

if [ "$ID" != "almalinux" ]; then
    echo "ERROR: Este script requiere AlmaLinux."
    echo "Sistema detectado: $PRETTY_NAME"
    exit 1
fi

OS_MAJOR_VERSION=$(echo "$VERSION_ID" | cut -d. -f1)

case "$OS_MAJOR_VERSION" in

    9)
        echo "[OK] AlmaLinux 9 detectado."
        ;;

    10)
        echo "[OK] AlmaLinux 10 detectado."
        ;;

    *)
        echo "ERROR: Versión de AlmaLinux no soportada por este script."
        echo "Versión detectada: $VERSION_ID"
        exit 1
        ;;

esac

echo "Sistema operativo: $PRETTY_NAME"

# ------------------------------------------------------------
# 3. Verificar arquitectura
# ------------------------------------------------------------

ARCH=$(uname -m)

if [ "$ARCH" != "x86_64" ]; then
    echo ""
    echo "ERROR: cPanel requiere arquitectura x86_64."
    echo "Arquitectura detectada: $ARCH"
    exit 1
fi

echo "[OK] Arquitectura x86_64 detectada."

# ------------------------------------------------------------
# 4. Verificar si cPanel ya está instalado
# ------------------------------------------------------------

if [ -d "/usr/local/cpanel" ]; then
    echo ""
    echo "ERROR: Parece que cPanel ya está instalado."
    echo "No se continuará para evitar una instalación sobre un sistema existente."
    exit 1
fi

# ------------------------------------------------------------
# 5. Solicitar FQDN
# ------------------------------------------------------------

echo ""
read -p "Introduce el hostname FQDN (ej: server.midominio.com): " FQDN

if [[ ! "$FQDN" =~ ^[a-zA-Z0-9]([a-zA-Z0-9.-]*[a-zA-Z0-9])?\.[a-zA-Z]{2,}$ ]]; then
    echo ""
    echo "ERROR: El hostname no parece ser un FQDN válido."
    echo "Ejemplo válido: server.midominio.com"
    exit 1
fi

echo ""
echo "Hostname seleccionado: $FQDN"

# ------------------------------------------------------------
# 6. Configurar hostname
# ------------------------------------------------------------

echo ""
echo "[1/9] Configurando hostname..."

hostnamectl set-hostname "$FQDN"

echo "[OK] Hostname configurado:"
hostnamectl --static

# ------------------------------------------------------------
# 7. Actualizar sistema
# ------------------------------------------------------------

echo ""
echo "[2/9] Actualizando sistema..."

dnf clean all
dnf update -y

# ------------------------------------------------------------
# 8. Instalar paquetes básicos
# ------------------------------------------------------------

echo ""
echo "[3/9] Instalando paquetes básicos..."

dnf install -y \
    curl \
    wget \
    perl \
    tar \
    gzip \
    nano \
    vim \
    net-tools \
    bind-utils \
    chrony

# ------------------------------------------------------------
# 9. Deshabilitar SELinux
# ------------------------------------------------------------

echo ""
echo "[4/9] Configurando SELinux..."

if [ -f /etc/selinux/config ]; then

    cp /etc/selinux/config /etc/selinux/config.backup

    sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

    if ! grep -q "^SELINUX=disabled" /etc/selinux/config; then
        echo "SELINUX=disabled" >> /etc/selinux/config
    fi

    echo "[OK] SELinux configurado como disabled."

    # Intentar poner SELinux en permissive temporalmente
    if command -v setenforce >/dev/null 2>&1; then
        setenforce 0 2>/dev/null || true
    fi

else

    echo "ADVERTENCIA: No se encontró /etc/selinux/config."

fi

# ------------------------------------------------------------
# 10. Deshabilitar Firewalld
# ------------------------------------------------------------

echo ""
echo "[5/9] Deshabilitando firewalld..."

systemctl stop firewalld 2>/dev/null || true
systemctl disable firewalld 2>/dev/null || true
systemctl mask firewalld 2>/dev/null || true

echo "[OK] firewalld deshabilitado."

# ------------------------------------------------------------
# 11. Configurar sincronización de hora
# ------------------------------------------------------------

echo ""
echo "[6/9] Configurando sincronización de hora..."

systemctl enable --now chronyd

# ------------------------------------------------------------
# 12. Verificaciones
# ------------------------------------------------------------

echo ""
echo "[7/9] Verificando configuración..."

echo ""
echo "Sistema:"
cat /etc/redhat-release

echo ""
echo "Hostname:"
hostname -f

echo ""
echo "Arquitectura:"
uname -m

echo ""
echo "SELinux:"
getenforce 2>/dev/null || true

echo ""
echo "Firewall:"
systemctl is-active firewalld 2>/dev/null || true

echo ""
echo "Espacio disponible:"
df -h /

echo ""
echo "Memoria RAM:"
free -h

# ------------------------------------------------------------
# 13. Confirmación antes de instalar
# ------------------------------------------------------------

echo ""
echo "============================================================"
echo " SERVIDOR PREPARADO PARA INSTALAR WHM/cPanel"
echo "============================================================"
echo ""
echo "Sistema:       $PRETTY_NAME"
echo "Hostname:      $FQDN"
echo "Arquitectura:  $ARCH"
echo ""
echo "IMPORTANTE:"
echo ""
echo "- El servidor debe ser una instalación limpia."
echo "- No debe existir Apache, PHP, MySQL/MariaDB u otro panel."
echo "- Se requiere licencia válida de cPanel."
echo "- La instalación puede tardar entre 30 y 90 minutos."
echo "- NO reinicies el servidor durante la instalación."
echo ""
read -p "¿Deseas continuar con la instalación? (SI/NO): " CONFIRM

if [[ "$CONFIRM" != "SI" && "$CONFIRM" != "si" ]]; then

    echo ""
    echo "Instalación cancelada."
    echo "El sistema quedó preparado."
    exit 0

fi

# ------------------------------------------------------------
# 14. Descargar instalador oficial de cPanel
# ------------------------------------------------------------

echo ""
echo "[8/9] Descargando instalador oficial de cPanel..."

cd /home

rm -f latest

curl -o latest -L https://securedownloads.cpanel.net/latest

chmod +x latest

# ------------------------------------------------------------
# 15. Instalar WHM/cPanel
# ------------------------------------------------------------

echo ""
echo "============================================================"
echo " INICIANDO INSTALACIÓN DE WHM/cPanel"
echo "============================================================"
echo ""

sh /home/latest

# ------------------------------------------------------------
# 16. Finalización
# ------------------------------------------------------------

echo ""
echo "[9/9] Instalación finalizada."

echo ""
echo "============================================================"
echo " INSTALACIÓN COMPLETADA"
echo "============================================================"
echo ""

IP_ADDRESS=$(hostname -I | awk '{print $1}')

echo "WHM:"
echo "https://${IP_ADDRESS}:2087"

echo ""
echo "Hostname:"
hostname -f

echo ""
echo "Log:"
echo "$LOG_FILE"

echo ""
echo "============================================================"
echo " IMPORTANTE"
echo "============================================================"
echo ""
echo "Accede a WHM mediante:"
echo "https://${IP_ADDRESS}:2087"
echo ""
echo "Si deseas convertir el servidor a CloudLinux:"
echo ""
echo "WHM"
echo "  → Software"
echo "    → MultiPHP Manager"
echo "      → Upgrade to CloudLinux"
echo ""
echo "============================================================"