diff --git a/plesk/domainstatus.sh b/plesk/domainstatus.sh index 1bcf8de..b1345ba 100644 --- a/plesk/domainstatus.sh +++ b/plesk/domainstatus.sh @@ -78,11 +78,14 @@ for DOMAIN in $DOMAINS; do UPLOAD_MAX=$(grep -i "^upload_max_filesize" "$PHP_CONFIG" | cut -d= -f2 | tr -d '[:space:]') UPLOAD_NUM=${UPLOAD_MAX//[!0-9]/} + [ -z "$UPLOAD_NUM" ] && UPLOAD_NUM=0 POST_MAX=$(grep -i "^post_max_size" "$PHP_CONFIG" | cut -d= -f2 | tr -d '[:space:]') POST_NUM=${POST_MAX//[!0-9]/} + [ -z "$POST_NUM" ] && POST_NUM=0 MAX_EXEC=$(grep -i "^max_execution_time" "$PHP_CONFIG" | cut -d= -f2 | tr -d '[:space:]') + [ -z "$MAX_EXEC" ] && MAX_EXEC=0 else MEMORY_LIMIT="No ini" UPLOAD_MAX="0"; UPLOAD_NUM=0 diff --git a/plesk/switchphpversion.sh b/plesk/switchphpversion.sh new file mode 100644 index 0000000..c683e1a --- /dev/null +++ b/plesk/switchphpversion.sh @@ -0,0 +1,161 @@ +#!/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: + # cgi 5.4.16 by OS vendor 5.4.16 5.4 cgi /usr/bin/php-cgi /usr/bin/php /etc/php.ini true disabled + + # Usamos awk para extraer ID y DisplayName de las lineas que no son cabecera + # Filtramos por status enabled/broken? Mejor solo mostrar los disponibles en NEW, pero mostrar todos en OLD. + + # Array global: HANDLER_IDS, HANDLER_NAMES + HANDLER_IDS=() + HANDLER_NAMES=() + + # Leer salida comando (saltando cabeceras que suelen tener 'id:') + while read -r line; do + # ID es la primera columna. + local hid=$(echo "$line" | awk '{print $1}') + if [[ "$hid" == "id:" || -z "$hid" ]]; then continue; fi + + HANDLER_IDS+=("$hid") + + # Extraer información relevante para mostrar al usuario + # Versión: primer patrón que parezca un número de versión + local ver=$(echo "$line" | grep -oE '[0-9]+\.[0-9]+(\.[0-9]+)?' | head -1) + + # Tipo: buscamos palabras clave conocidas (fpm, fastcgi, cgi) + # Usamos espacios alrededor para evitar coincidencias parciales si es posible + local type=$(echo "$line" | grep -oE '[[:space:]](fpm|fastcgi|cgi|module)[[:space:]]' | head -1 | awk '{print $1}') + if [ -z "$type" ]; then + # Fallback: intentar buscar sin espacios si está al final o principio (menos probable en medio del output de plesk) + 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: plesk-php83-fpm (PHP 8.3.30 - fpm) - Dominios: 5 + HANDLER_NAMES+=("$hid (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}" \ No newline at end of file