diff --git a/scripts/update.sh b/scripts/update.sh new file mode 100755 index 0000000..f579c96 --- /dev/null +++ b/scripts/update.sh @@ -0,0 +1,153 @@ +#!/usr/bin/env bash +# ============================================================================== +# NexusPBX - Script de Mise à Jour Automatique (OTA) +# ============================================================================== + +set -e + +# Couleurs pour le terminal +C_RESET="\033[0m" +C_GREEN="\033[1;32m" +C_CYAN="\033[1;36m" +C_YELLOW="\033[1;33m" +C_RED="\033[1;31m" +C_BOLD="\033[1m" +C_GRAY="\033[0;90m" + +APP_DIR="/var/www/nexus-pbx" +GIT_REMOTE="origin" +GIT_BRANCH="main" + +# Vérification des privilèges +if [ "$(id -u)" -ne 0 ]; then + echo -e "${C_RED}[ERREUR] Ce script doit être exécuté en root (ou via sudo).${C_RESET}" + exit 1 +fi + +MODE="update" +for arg in "$@"; do + case "$arg" in + --check|-c) + MODE="check" + ;; + --force|-f) + MODE="force" + ;; + esac +done + +cd "$APP_DIR" || exit 1 +git config --global --add safe.directory "$APP_DIR" 2>/dev/null || true + +# Lecture de la version locale +CURRENT_VER="Inconnue" +if [ -f "$APP_DIR/version.json" ]; then + CURRENT_VER=$(grep -o '"version"[^:]*:[^"]*"[^"]*"' "$APP_DIR/version.json" | cut -d'"' -f4) +fi + +echo -e "${C_CYAN}${C_BOLD}==========================================================${C_RESET}" +echo -e "${C_CYAN}${C_BOLD} NexusPBX - Gestionnaire de Mises à Jour ${C_RESET}" +echo -e "${C_CYAN}${C_BOLD}==========================================================${C_RESET}" +echo -e "Version actuellement installée : ${C_BOLD}v${CURRENT_VER}${C_RESET}" + +# Récupération des informations distantes +echo -e "${C_GRAY}-> Recherche de nouvelles versions sur le dépôt officiel...${C_RESET}" +git fetch "$GIT_REMOTE" "$GIT_BRANCH" --quiet 2>/dev/null || { + echo -e "${C_RED}[AVERTISSEMENT] Impossible de contacter le serveur distant Git.${C_RESET}" +} + +# Extraction de la version distante depuis le commit distant +REMOTE_VER=$(git show "${GIT_REMOTE}/${GIT_BRANCH}:version.json" 2>/dev/null | grep -o '"version"[^:]*:[^"]*"[^"]*"' | cut -d'"' -f4 || echo "$CURRENT_VER") +LOCAL_HASH=$(git rev-parse HEAD 2>/dev/null || echo "local") +REMOTE_HASH=$(git rev-parse "${GIT_REMOTE}/${GIT_BRANCH}" 2>/dev/null || echo "remote") + +if [ "$MODE" = "check" ]; then + if [ "$LOCAL_HASH" != "$REMOTE_HASH" ] || [ "$CURRENT_VER" != "$REMOTE_VER" ]; then + echo -e "${C_GREEN}${C_BOLD}[NOUVEAUTÉ] Une mise à jour est disponible !${C_RESET}" + echo -e "Version disponible : ${C_GREEN}${C_BOLD}v${REMOTE_VER}${C_RESET} (actuelle: v${CURRENT_VER})" + exit 0 + else + echo -e "${C_GREEN}[OK] Votre système NexusPBX est à jour (v${CURRENT_VER}).${C_RESET}" + exit 0 + fi +fi + +if [ "$LOCAL_HASH" = "$REMOTE_HASH" ] && [ "$CURRENT_VER" = "$REMOTE_VER" ] && [ "$MODE" != "force" ]; then + echo -e "${C_GREEN}[OK] Vous disposez déjà de la dernière version (v${CURRENT_VER}).${C_RESET}" + echo -e "${C_GRAY}(Utilisez 'nexus-update --force' pour forcer une réinstallation complète des fichiers.)${C_RESET}" + exit 0 +fi + +echo -e "\n${C_YELLOW}-> Mise à jour vers la version v${REMOTE_VER}...${C_RESET}" + +# 1. Sauvegarde préventive automatique +echo -e "${C_GRAY}[1/6] Création d'une sauvegarde préventive du système...${C_RESET}" +mkdir -p "$APP_DIR/storage/backups" +BACKUP_DATE=$(date +%Y%m%d_%H%M%S) +BACKUP_FILE="$APP_DIR/storage/backups/pre-update-${BACKUP_DATE}.tar.gz" +tar -czf "$BACKUP_FILE" \ + -C "$APP_DIR/storage" database.sqlite \ + -C /etc/asterisk pjsip.custom.conf extensions.custom.conf 2>/dev/null || true +echo -e "${C_GREEN} ✓ Sauvegarde de sécurité créée : $(basename "$BACKUP_FILE")${C_RESET}" + +# 2. Application des derniers fichiers de code Git +echo -e "${C_GRAY}[2/6] Déploiement des nouveaux fichiers de code...${C_RESET}" +git reset --hard "${GIT_REMOTE}/${GIT_BRANCH}" +chown -R www-data:asterisk "$APP_DIR" +chmod 2775 "$APP_DIR/storage" "$APP_DIR/storage/backups" "$APP_DIR/storage/sounds" 2>/dev/null || true + +# 3. Vérification des dépendances Debian +echo -e "${C_GRAY}[3/6] Vérification des composants et outils système...${C_RESET}" +which ffmpeg >/dev/null 2>&1 && which rsync >/dev/null 2>&1 && which sox >/dev/null 2>&1 || { + echo -e " -> Installation de paquets complémentaires..." + apt-get update -y -qq && apt-get install -y -qq --no-install-recommends acl ffmpeg rsync sox +} + +# 4. Exécution des migrations SQLite et régénération Dialplan +echo -e "${C_GRAY}[4/6] Exécution des migrations de base de données & régénération dialplan...${C_RESET}" +php -r ' +require_once "/var/www/nexus-pbx/src/Database.php"; +require_once "/var/www/nexus-pbx/src/ConfigGenerator.php"; +$db = App\Database::getConnection(true); +$gen = new App\ConfigGenerator($db); +$gen->writeAllConfigs(); +' + +# 5. Fix permissions & ACLs +echo -e "${C_GRAY}[5/6] Application des permissions et ACLs système...${C_RESET}" +setfacl -R -m u:www-data:rwx,g:asterisk:rwx /etc/asterisk /var/lib/asterisk/sounds /var/lib/asterisk/moh 2>/dev/null || true +setfacl -R -d -m u:www-data:rwx,g:asterisk:rwx /etc/asterisk /var/lib/asterisk/sounds /var/lib/asterisk/moh 2>/dev/null || true +chmod 0664 /etc/asterisk/*.conf /etc/asterisk/*.custom.conf 2>/dev/null || true + +# 6. Rechargement des services +echo -e "${C_GRAY}[6/6] Rechargement à chaud d'Asterisk et des services web...${C_RESET}" +asterisk -rx "core reload" >/dev/null 2>&1 || true +asterisk -rx "pjsip reload" >/dev/null 2>&1 || true +asterisk -rx "dialplan reload" >/dev/null 2>&1 || true +systemctl reload php*-fpm 2>/dev/null || true +systemctl reload nginx 2>/dev/null || true + +NEW_VER="Inconnue" +if [ -f "$APP_DIR/version.json" ]; then + NEW_VER=$(grep -o '"version"[^:]*:[^"]*"[^"]*"' "$APP_DIR/version.json" | cut -d'"' -f4) +fi + +echo "" +echo -e "${C_GREEN}${C_BOLD}==========================================================${C_RESET}" +echo -e "${C_GREEN}${C_BOLD} [SUCCÈS] NexusPBX a été mis à jour avec succès en v${NEW_VER} !${C_RESET}" +echo -e "${C_GREEN}${C_BOLD}==========================================================${C_RESET}" +echo "" + +# Affichage du changelog de la nouvelle version +if [ -f "$APP_DIR/version.json" ]; then + echo -e "${C_CYAN}${C_BOLD}Nouveautés de cette version :${C_RESET}" + php -r ' + $v = json_decode(file_get_contents("/var/www/nexus-pbx/version.json"), true); + if (!empty($v["changelog"])) { + foreach ($v["changelog"] as $line) { + echo " • " . $line . "\n"; + } + } + ' +fi +echo "" diff --git a/version.json b/version.json new file mode 100644 index 0000000..a1dcabf --- /dev/null +++ b/version.json @@ -0,0 +1,14 @@ +{ + "version": "1.3.0", + "codename": "Helios", + "release_date": "2026-11-04", + "min_php_version": "8.2", + "changelog": [ + "Gestion avancée des passerelles analogiques / FXO (Grandstream HT813, Cisco SPA, ATA)", + "Message vocal d'indisponibilité / congestion configurable sur les routes sortantes", + "Système de mise à jour automatique en 1-clic et commande CLI nexus-update", + "Compatibilité étendue téléphones IP (Yealink, Fanvil, Grandstream, Snom, Cisco)", + "Préfixe de ligne CID entrant pour identifier la provenance des appels", + "Génération automatique des tonalités et dial options Asterisk optimisées" + ] +}