158 lines
5.0 KiB
Bash
158 lines
5.0 KiB
Bash
#!/bin/bash
|
|
# REQUIRES: plesk
|
|
#
|
|
# Convierte domains de una versión de PHP a otra de forma masiva e interactiva.
|
|
|
|
# --- COLORES ---
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
BLUE='\033[0;34m'
|
|
YELLOW='\033[1;33m'
|
|
NC='\033[0m'
|
|
|
|
# --- CHECKS ---
|
|
if ! command -v plesk &> /dev/null; then
|
|
echo -e "${RED}[!] Error: Este script requiere Plesk.${NC}"
|
|
exit 1
|
|
fi
|
|
|
|
if [[ $EUID -ne 0 ]]; then
|
|
echo -e "${RED}[!] Este script debe ejecutarse como root.${NC}"
|
|
exit 1
|
|
fi
|
|
|
|
# --- FUNCIONES ---
|
|
|
|
get_handlers() {
|
|
# Obtenemos la lista de handlers. Formato esperado de 'plesk bin php_handler --list':
|
|
# id | display name | full version | version | type | cgi-bin | php-cli | php.ini | custom | status
|
|
|
|
# Array global: HANDLER_IDS, HANDLER_NAMES
|
|
HANDLER_IDS=()
|
|
HANDLER_NAMES=()
|
|
|
|
# Usamos ' +' (2+ espacios) como separador en awk para preservar el display name
|
|
# que puede contener espacios (ej: "8.3.30 by Vendor")
|
|
while read -r line; do
|
|
# ID es la primera columna.
|
|
local hid=$(echo "$line" | awk -F' +' '{print $1}')
|
|
if [[ "$hid" == "id:" || -z "$hid" ]]; then continue; fi
|
|
|
|
# Display name es la segunda columna (separada por 2+ espacios, contiene espacios internos).
|
|
local dname=$(echo "$line" | awk -F' +' '{print $2}')
|
|
|
|
HANDLER_IDS+=("$hid")
|
|
|
|
# Versión: primer patrón numérico
|
|
local ver=$(echo "$line" | grep -oE '[0-9]+\.[0-9]+(\.[0-9]+)?' | head -1)
|
|
|
|
# Tipo
|
|
local type=$(echo "$line" | grep -oE '[[:space:]](fpm|fastcgi|cgi|module)[[:space:]]' | head -1 | awk '{print $1}')
|
|
if [ -z "$type" ]; then
|
|
type=$(echo "$line" | grep -oE '(fpm|fastcgi|cgi|module)' | head -1)
|
|
fi
|
|
|
|
# Contar dominios usándolo
|
|
local dcount=$(plesk db -Ne "SELECT COUNT(d.id) FROM domains d JOIN hosting h ON h.dom_id=d.id WHERE d.htype = 'vrt_hst' AND h.php_handler_id = '$hid'")
|
|
|
|
# Formato: id [display name] (PHP ver | tipo) - Dominios: N
|
|
HANDLER_NAMES+=("$hid [$dname] (PHP $ver | $type) - Dominios: $dcount")
|
|
|
|
done < <(plesk bin php_handler --list | grep -v "id:")
|
|
}
|
|
|
|
select_handler() {
|
|
local prompt_msg="$1"
|
|
echo -e "${BLUE}${prompt_msg}${NC}"
|
|
|
|
count=1
|
|
for i in "${!HANDLER_NAMES[@]}"; do
|
|
# Formatear la salida para que se vea bonita
|
|
echo -e " [${YELLOW}$count${NC}] ${HANDLER_NAMES[$i]}"
|
|
((count++))
|
|
done
|
|
|
|
local selection
|
|
while true; do
|
|
read -p "Selecciona una opción (1-${#HANDLER_NAMES[@]}): " selection
|
|
if [[ "$selection" =~ ^[0-9]+$ ]] && [ "$selection" -ge 1 ] && [ "$selection" -le "${#HANDLER_NAMES[@]}" ]; then
|
|
# Retornar el ID seleccionado (indice - 1)
|
|
local idx=$((selection-1))
|
|
RET_VAL="${HANDLER_IDS[$idx]}"
|
|
return
|
|
fi
|
|
echo -e "${RED}Opción inválida.${NC}"
|
|
done
|
|
}
|
|
|
|
# --- MAIN ---
|
|
|
|
echo -e "${GREEN}=== PLESK PHP VERSION SWITCHER ===${NC}"
|
|
|
|
# 1. Obtener lista
|
|
echo "Cargando handlers PHP..."
|
|
get_handlers
|
|
|
|
if [ ${#HANDLER_IDS[@]} -eq 0 ]; then
|
|
echo -e "${RED}[!] No se encontraron handlers de PHP.${NC}"
|
|
exit 1
|
|
fi
|
|
|
|
# 2. Seleccionar OLD
|
|
select_handler "Selecciona el handler ANTIGUO (origen):"
|
|
OLD_HANDLER="$RET_VAL"
|
|
echo -e "Has seleccionado OLD: ${GREEN}$OLD_HANDLER${NC}\n"
|
|
|
|
# 3. Seleccionar NEW
|
|
select_handler "Selecciona el handler NUEVO (destino):"
|
|
NEW_HANDLER="$RET_VAL"
|
|
echo -e "Has seleccionado NEW: ${GREEN}$NEW_HANDLER${NC}\n"
|
|
|
|
if [ "$OLD_HANDLER" == "$NEW_HANDLER" ]; then
|
|
echo -e "${RED}[!] El handler origen y destino son el mismo. Saliendo.${NC}"
|
|
exit 0
|
|
fi
|
|
|
|
# 4. Buscar dominios
|
|
echo -e "Buscando dominios con handler '$OLD_HANDLER'..."
|
|
# Consulta SQL para obtener dominios.
|
|
# Solo filtramos que sea tipo 'vrt_hst' (virtual hosting)
|
|
DOMAINS=$(plesk db -Ne "SELECT d.name FROM domains d JOIN hosting h ON h.dom_id=d.id WHERE d.htype = 'vrt_hst' AND h.php_handler_id = '$OLD_HANDLER'")
|
|
|
|
if [ -z "$DOMAINS" ]; then
|
|
echo -e "${YELLOW}No se encontraron dominios usando '$OLD_HANDLER'.${NC}"
|
|
exit 0
|
|
fi
|
|
|
|
DOMAIN_COUNT=$(echo "$DOMAINS" | wc -l)
|
|
echo -e "Se han encontrado ${YELLOW}$DOMAIN_COUNT${NC} dominios."
|
|
|
|
# 5. Confirmar
|
|
echo -e "${RED}ATENCIÓN:${NC} Se va a cambiar el handler de todos estos dominios a '$NEW_HANDLER'."
|
|
echo -e "Esto también activará PHP en la configuración del dominio si estaba deshabilitado (al cambiar el handler, Plesk regenera config)."
|
|
read -p "¿Continuar? (y/N): " confirm
|
|
if [[ "$confirm" != "y" && "$confirm" != "Y" ]]; then
|
|
echo "Cancelado."
|
|
exit 0
|
|
fi
|
|
|
|
# 6. Ejecutar
|
|
echo ""
|
|
counter=1
|
|
for domain in $DOMAINS; do
|
|
echo -ne "[${counter}/${DOMAIN_COUNT}] Procesando ${BLUE}${domain}${NC}... "
|
|
|
|
# Ejecutamos el cambio.
|
|
# Capturamos output y error
|
|
OUT=$(plesk bin domain -u "$domain" -php_handler_id "$NEW_HANDLER" 2>&1)
|
|
|
|
if [ $? -eq 0 ]; then
|
|
echo -e "${GREEN}OK${NC}"
|
|
else
|
|
echo -e "${RED}ERROR${NC}"
|
|
echo " -> $OUT"
|
|
fi
|
|
((counter++))
|
|
done
|
|
|
|
echo -e "\n${GREEN}Proceso finalizado.${NC}" |