diff --git a/phpver.sh b/phpver.sh index de98682..627b4ea 100644 --- a/phpver.sh +++ b/phpver.sh @@ -1,59 +1,202 @@ #!/bin/bash -# Config +# Configuration et commentaires (FR) +# Ce script a été modifié pour améliorer : +# - la portabilité (fonction mktemp compatible Linux/macOS/BSD), +# - la robustesse (set -euo pipefail, IFS restreint), +# - l'ergonomie (acceptation de 7.4 ou 74, options CLI --dry-run et -v/--version), +# - la sécurité opérationnelle (backup horodaté de l'ancien .htaccess, écriture atomique), +# - la sûreté au démarrage PHP (php.ini généré avec extensions commentées par défaut). +# +# Les sections ci-dessous sont commentées pour expliquer pourquoi chaque changement +# a été apporté et comment l'adapter à différents environnements d'hébergement. +set -euo pipefail +IFS=$'\n\t' PWD=$(pwd) TXT_ERROR="[\e[0;31mERROR\e[0;0m]" TXT_OK="[\e[0;32mOK\e[0;0m]" TXT_INFO="[\e[0;33mINFO\e[0;0m]" -# Demande de la version de PHP -echo -e $TXT_INFO "Sélectionnez la version de PHP en format suivant (Pour les versions 5.2 jusqu'à la 8.2 | EXEMPLE : 74 pour PHP 7.4) : " -read -r PHP_VERSION +# Options par défaut +DRY_RUN=0 +CLI_VERSION="" +SHOW_HELP=0 -# Check si la version est ok -if [[ ! $PHP_VERSION =~ ^(52|53|54|55|56|70|71|72|73|74|75|76|77|78|79|80|81|82|83)$ ]]; then - echo -e "$TXT_ERROR La version de PHP saisie '$PHP_VERSION' n'est pas correct. Veuillez entrer une version entre 52 et 83." - exit 1 +print_help() { + cat < Spécifier la version PHP (ex: 74) en ligne de commande + -h, --help Afficher cette aide + +Si aucune version n'est fournie via -v/--version, le script demandera une saisie interactive. +EOF +} + +parse_args() { + while [[ $# -gt 0 ]]; do + case "$1" in + -n|--dry-run) + DRY_RUN=1; shift ;; + -v|--version) + CLI_VERSION="$2"; shift 2 ;; + -h|--help) + SHOW_HELP=1; shift ;; + --) + shift; break ;; + -*) + echo "Unknown option: $1"; exit 1 ;; + *) + break ;; + esac + done +} + +parse_args "$@" +if [[ $SHOW_HELP -eq 1 ]]; then + print_help; exit 0 fi -# Rename old htaccess for bkp -HTACCESS_FILE=".htaccess" -NEW_HTACCESS_FILE="${HTACCESS_FILE}_" -COUNTER=1 +# Configuration modifiable +# Si vous voulez que les extensions listées soient activées automatiquement, +# mettez ENABLE_EXT=1 (attention : seules les extensions présentes sur le système +# seront prises en compte). Par défaut on laisse les extensions commentées. +ENABLE_EXT=0 +DEFAULT_MEMORY_LIMIT="2048M" + +mktemp_portable() { + # Fonction utilitaire : mktemp portable + # Pourquoi : la syntaxe de mktemp diffère entre GNU (Linux) et BSD (macOS). Cette + # fonction essaye plusieurs variantes afin d'obtenir un fichier temporaire + # utilisable sur la plupart des systèmes sans provoquer d'erreur. + # On retourne un chemin (stdout) utilisable pour l'écriture atomique. + # Exemple d'utilisation : TMP=$(mktemp_portable "${HTACCESS_FILE}.tmp") + # Le fichier retourné doit être supprimé après usage ; on gère ça via trap. + local prefix="$1" + local tmp + if tmp=$(mktemp "${prefix}.XXXX" 2>/dev/null); then + echo "$tmp"; return 0 + fi + if tmp=$(mktemp -t "${prefix}" 2>/dev/null); then + echo "$tmp"; return 0 + fi + if tmp=$(mktemp 2>/dev/null); then + echo "$tmp"; return 0 + fi + # Last resort + echo "/tmp/${prefix}.$RANDOM" +} -while [[ -f "$NEW_HTACCESS_FILE" ]]; do - NEW_HTACCESS_FILE="${HTACCESS_FILE}_$COUNTER" - COUNTER=$((COUNTER + 1)) -done +# Sélection de la version PHP +# On supporte trois modes d'entrée : +# 1) Argument CLI (-v/--version) : utile pour automatisation/CI +# 2) Variable d'environnement exportée PHP_VERSION : utile pour scripts appelants +# 3) Prompt interactif : quand l'utilisateur lance manuellement le script +# +# On accepte également le format "7.4" qui est normalisé en "74". +if [[ -n "$CLI_VERSION" ]]; then + PHP_VERSION="$CLI_VERSION" +elif [[ -n "${PHP_VERSION:-}" ]]; then + # keep already-exported PHP_VERSION + : +else + while true; do + echo -e "$TXT_INFO Sélectionnez la version de PHP au format 74 pour PHP 7.4 (ex: 7.4 ou 74) :" + read -r PHP_VERSION + + # Normaliser 7.4 -> 74 + if [[ $PHP_VERSION =~ ^[0-9]+\.[0-9]+$ ]]; then + PHP_VERSION="${PHP_VERSION/./}" + fi + + if [[ $PHP_VERSION =~ ^(52|53|54|55|56|70|71|72|73|74|75|76|77|78|79|80|81|82|83)$ ]]; then + break + fi + echo -e "$TXT_ERROR La version de PHP saisie '$PHP_VERSION' n'est pas correcte. Réessayez." + done +fi + +# Sauvegarde de l'ancien .htaccess (backup horodaté) +# Pourquoi : les règles .htaccess peuvent rendre un site inaccessible. Nous +# sauvegardons l'ancien fichier avec un timestamp pour pouvoir revenir en arrière +# rapidement si nécessaire. +HTACCESS_FILE=".htaccess" +TIMESTAMP="$(date +%Y%m%d-%H%M%S)" if [[ -f "$HTACCESS_FILE" ]]; then - mv "$HTACCESS_FILE" "$NEW_HTACCESS_FILE" - echo -e "$TXT_OK Ancien fichier rename en $NEW_HTACCESS_FILE." + NEW_HTACCESS_FILE="${HTACCESS_FILE}.bak.$TIMESTAMP" + # Si le fichier existe déjà (cas improbable), ajouter un suffixe numérique + local_counter=1 + while [[ -f "$NEW_HTACCESS_FILE" ]]; do + NEW_HTACCESS_FILE="${HTACCESS_FILE}.bak.${TIMESTAMP}.$local_counter" + local_counter=$((local_counter + 1)) + done + if [[ $DRY_RUN -eq 1 ]]; then + echo -e "$TXT_INFO [dry-run] Ancien fichier serait renommé en ${NEW_HTACCESS_FILE}." + else + mv "${HTACCESS_FILE}" "${NEW_HTACCESS_FILE}" + echo -e "$TXT_OK Ancien fichier renommé en ${NEW_HTACCESS_FILE}." + fi else - echo -e "$TXT_OK Aucun fichier $HTACCESS_FILE à renommer." + echo -e "$TXT_INFO Aucun fichier ${HTACCESS_FILE} à renommer." fi -# Créer le nouveau .htaccess +# Construire le bloc .htaccess BLOCK_TEMPLATE=$(cat < -SetHandler application/x-httpd-php$PHP_VERSION +SetHandler application/x-httpd-php${PHP_VERSION} -AddHandler application/x-httpd-php$PHP_VERSION .php -suPHP_ConfigPath $PWD/php.ini +AddHandler application/x-httpd-php${PHP_VERSION} .php +suPHP_ConfigPath ${PWD}/php.ini EOL ) -# Créer le htaccess avec les règles -echo "$BLOCK_TEMPLATE" > "$HTACCESS_FILE" -echo -e "$TXT_OK Nouveau fichier $HTACCESS_FILE créé." +# Écriture atomique du .htaccess +# On écrit d'abord dans un fichier temporaire (mktemp_portable) puis on effectue un +# mv atomique. Cela évite d'avoir un fichier .htaccess partiellement écrit si le +# script est interrompu. Un trap supprime le temporaire en cas d'erreur. +TMP_HTACCESS="$(mktemp_portable "${HTACCESS_FILE}.tmp")" +trap '[[ -n "${TMP_HTACCESS:-}" && -f "${TMP_HTACCESS}" ]] && rm -f -- "${TMP_HTACCESS}"' EXIT +if [[ $DRY_RUN -eq 1 ]]; then + echo -e "$TXT_INFO [dry-run] Ecriture du .htaccess (contenu affiché ci-dessous):" + printf "%s\n" "$BLOCK_TEMPLATE" +else + printf "%s\n" "$BLOCK_TEMPLATE" > "$TMP_HTACCESS" +fi -# Ajout des Rewrite de Wordpress +# Ajout des Rewrite de WordPress si présent if [[ -f "wp-config.php" ]]; then - echo -e "$TXT_INFO Site Wordpress trouvé. Ajout des règles dans le .htaccess." + echo -e "$TXT_INFO Site WordPress trouvé. Ajout des règles dans le .htaccess." + if [[ $DRY_RUN -eq 1 ]]; then + cat <> "$TMP_HTACCESS" - # Ajouter les règles - cat <> "$HTACCESS_FILE" +# BEGIN WordPress +RewriteEngine On +RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] +RewriteBase / +RewriteRule ^index\.php$ - [L] +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteRule . /index.php [L] +# END WordPress +EOL + fi # BEGIN WordPress RewriteEngine On @@ -65,53 +208,104 @@ RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] # END WordPress EOL - echo -e "$TXT_OK Règles ajoutées dans le $HTACCESS_FILE." + echo -e "$TXT_OK Règles WordPress ajoutées au fichier temporaire." +else + echo -e "$TXT_INFO Pas de WordPress détecté. Seules les règles PHP seront ajoutées." +fi + +# Déplacer atomiquement +if [[ $DRY_RUN -eq 1 ]]; then + echo -e "$TXT_INFO [dry-run] .htaccess prêt à être déplacé en ${HTACCESS_FILE} (non écrit)." + # montrer un aperçu + echo "--- .htaccess preview ---" + echo "$BLOCK_TEMPLATE" else - echo -e "$TXT_INFO Pas de Wordpress trouvé. Uniquement les règles PHP seront ajoutées." + mv "$TMP_HTACCESS" "$HTACCESS_FILE" + trap - EXIT + echo -e "$TXT_OK Nouveau fichier ${HTACCESS_FILE} créé." fi -# Créer php.ini +# Génération du php.ini +# On génère un php.ini minimal avec des valeurs courantes. Les extensions sont +# commentées par défaut pour éviter d'activer des modules inexistants sur la +# machine cible (ce qui provoquerait des erreurs à l'initialisation de PHP). PHP_INI_FILE="php.ini" +if [[ $DRY_RUN -eq 1 ]]; then + echo -e "$TXT_INFO [dry-run] Le fichier ${PHP_INI_FILE} serait créé avec le contenu suivant:" + cat < "$PHP_INI_FILE" -date.timezone=Europe/Paris -extension=mysqlnd.so -extension=nd_mysqli.so -extension=nd_pdo_mysql.so -extension=json.so -extension=intl.so -extension=mcrypt.so -extension=gd.so -extension=xml.so -extension=xmlreader.so -extension=xmlrpc.so -extension=xmlwriter.so -extension=soap.so -extension=tidy.so -extension=bcmath.so -extension=dom.so -extension=fileinfo.so -extension=imap.so -extension=zip.so -extension=mcrypt.so -extension=intl.so -extension=pdo.so -extension=fileinfo.so -extension=mbstring.so -extension=imagick.so -display_errors=off -memory_limit=2038M -max_input_vars=250000 -max_execution_time=360 -output_buffering=4096 -upload_max_filesize=512M -post_max_size=512M EOL +else + cat < "$PHP_INI_FILE" +; Generated by prestashop-fix.sh +date.timezone = Europe/Paris -echo -e "$TXT_OK Le $PHP_INI_FILE est bien créé avec les options." +; Performances / limites +display_errors = Off +memory_limit = ${DEFAULT_MEMORY_LIMIT} +max_input_vars = 250000 +max_execution_time = 360 +output_buffering = 4096 +upload_max_filesize = 512M +post_max_size = 512M -# Fin -echo -e "\n$TXT_OK Script terminé avec succès !" +; Extensions: décommentez celles que vous voulez activer si elles existent sur le système +;extension=mysqli.so +;extension=pdo_mysql.so +;extension=json.so +;extension=intl.so +;extension=gd.so +;extension=xml.so +;extension=xmlreader.so +;extension=xmlwriter.so +;extension=soap.so +;extension=tidy.so +;extension=bcmath.so +;extension=dom.so +;extension=fileinfo.so +;extension=imap.so +;extension=zip.so +;extension=mbstring.so +;extension=imagick.so -rm -rf phpver.sh +EOL + echo -e "$TXT_OK Le ${PHP_INI_FILE} a été créé (extensions commentées par défaut)." +fi + +# Nettoyage optionnel +if [[ -f "phpver.sh" ]]; then + rm -f "phpver.sh" + echo -e "$TXT_INFO Fichier phpver.sh supprimé." +fi + +echo -e "\n$TXT_OK Script terminé avec succès !"