Configurar actualización forzada diaria de cPanel/WHM Imprimir

  • 1

Configuración de tarea cron persistente para actualización de cPanel mediante script

Objetivo

Configurar una tarea persistente de cron en servidores cPanel/WHM para ejecutar de forma programada:

  • Revalidación de licencia.

  • Verificación de la configuración de actualizaciones de cPanel.

  • Actualización de cPanel.

  • Reinicio de servicios.

  • Reparación de licencia.

Esto ayuda a garantizar la aplicación oportuna de actualizaciones y parches de seguridad.


Configurar el canal de actualizaciones de cPanel

Crear el script:

nano /root/actualizar_cpanel.sh

Agregar el siguiente contenido:

#!/bin/bash

# Definimos la ruta del log de auditoría
LOG_ERROR="/var/log/upcp-custom.log"

# Marca de inicio en el log
echo "==================== $(date): INICIO DEL PROCESO ====================" >> "$LOG_ERROR"

# VALIDACIÓN DE SEGURIDAD: ¿Existe cPanel en este servidor?
if [ ! -x /scripts/upcp ]; then
    echo "$(date): [CRÍTICO] /scripts/upcp no existe o no es ejecutable. Abortando." >> "$LOG_ERROR"
    echo "==================== $(date): FIN POR ERROR ====================" >> "$LOG_ERROR"
    echo "" >> "$LOG_ERROR"
    exit 1
fi

# Intentamos escribir la configuración de cPanel
cat > /etc/cpupdate.conf <<'EOF'
CPANEL=release
RPMUP=daily
SARULESUP=daily
STAGING_DIR=/usr/local/cpanel
UPDATES=daily
EOF

if [ "$?" -ne 0 ]; then
    echo "$(date): [ADVERTENCIA] No fue posible escribir en /etc/cpupdate.conf (¿Disco en Read-Only?)." >> "$LOG_ERROR"
fi

# Verificamos y ejecutamos licencia al inicio
if [ -x /usr/bin/RedLicenseCP ]; then
    /usr/bin/RedLicenseCP >> "$LOG_ERROR" 2>&1
fi

# 1. Primer intento de upcp con límite de 30 minutos
timeout --signal=TERM --kill-after=30s 1800s /scripts/upcp
STATUS_UPCP=$?

# 2. Evaluación del primer resultado
case "$STATUS_UPCP" in
    0)
        echo "$(date): [ÉXITO] El comando /scripts/upcp terminó correctamente." >> "$LOG_ERROR"
        ;;
    124)
        echo "$(date): [TIMEOUT] ¡Congelamiento detectado! upcp excedió los 30 minutos. Limpiando entorno..." >> "$LOG_ERROR"
        
        # Matamos procesos rebeldes de forma precisa y limpiamos candados
        pgrep -f "/scripts/upcp" >/dev/null && pkill -f "/scripts/upcp"
        sleep 5
        rm -f /var/cpanel/upcp.lock
        rm -f /var/cpanel/updatelogs/upcp.pid
        
        # Reintento forzado con red de seguridad (Timeout de 30 min)
        if [ -x /usr/bin/RedLicenseCP ]; then /usr/bin/RedLicenseCP >> "$LOG_ERROR" 2>&1; fi
        
        echo "$(date): Lanzando /scripts/upcp --force..." >> "$LOG_ERROR"
        timeout --signal=TERM --kill-after=30s 1800s /scripts/upcp --force
        STATUS_RETRY=$?
        
        # Verificamos el resultado del segundo intento
        if [ "$STATUS_RETRY" -ne 0 ]; then
            echo "$(date): [ALERTA] El reintento con --force también falló (Código: $STATUS_RETRY)." >> "$LOG_ERROR"
        else
            echo "$(date): [ÉXITO] El reintento con --force finalizó correctamente." >> "$LOG_ERROR"
        fi
        ;;
    *)
        # Errores inesperados (repositorios, falta de disco, etc.)
        echo "$(date): [ERROR] upcp falló con un código inesperado: $STATUS_UPCP. Continuando para asegurar estabilidad..." >> "$LOG_ERROR"
        ;;
esac

# 3. Fase de estabilización (Espera de 2 minutos)
sleep 120

# 4. Aseguramos disponibilidad levantando servicios y fijando licencia
/scripts/restartsrv_cpsrvd >> "$LOG_ERROR" 2>&1

if [ -x /usr/bin/RedLicenseCP ]; then
    /usr/bin/RedLicenseCP -fix >> "$LOG_ERROR" 2>&1
fi

# Marca de fin en el log
echo "==================== $(date): FIN DEL PROCESO ====================" >> "$LOG_ERROR"
echo "" >> "$LOG_ERROR" # Línea en blanco para separar el siguiente día

Asignar permisos:

chmod 700 /root/actualizar_cpanel.sh
chown root:root /root/actualizar_cpanel.sh

Crear tarea cron persistente

Crear el archivo:

nano /etc/cron.d/actualizar_cpanel

Agregar:

MAILTO=""
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

0 8 * * * root /root/actualizar_cpanel.sh

Permisos requeridos

chmod 644 /etc/cron.d/actualizar_cpanel
chown root:root /etc/cron.d/actualizar_cpanel

Recargar el servicio cron

systemctl reload crond

o

service crond reload

Verificar funcionamiento

Consultar eventos recientes:

journalctl -u crond -n 50

o

grep CRON /var/log/cron

Logs útiles de cPanel

Logs de actualización:

/var/cpanel/updatelogs/

Log principal de cPanel:

/usr/local/cpanel/logs/error_log

Ejecución forzada en caso de error

La tarea programada utiliza:

/scripts/upcp

por ser el método recomendado por cPanel para actualizaciones periódicas.

Si la actualización presenta errores, queda incompleta o es necesario forzar la reinstalación de componentes, ejecutar manualmente:

/scripts/upcp --force

Esta opción debe utilizarse únicamente como mecanismo de recuperación y no como parte de la tarea programada diaria.


¿Le ha resultado útil esta respuesta?

« Atrás