From 563a01e3c34b2de37248344b397b846188840020 Mon Sep 17 00:00:00 2001 From: sorcier Date: Mon, 2 Nov 2026 03:51:27 +0100 Subject: [PATCH] Fix: add phonebook_contacts to database schema and migrations; harden install script --- install.sh | 10 ++++++---- scripts/nexus-banner.sh | 4 ++-- src/Database.php | 41 ++++++++++++++++++++++++++++++++++++++++ src/PhonebookManager.php | 19 +++++++++++++++++++ 4 files changed, 68 insertions(+), 6 deletions(-) diff --git a/install.sh b/install.sh index e1e1bbb..33abea6 100755 --- a/install.sh +++ b/install.sh @@ -304,6 +304,11 @@ if [ -z "$PHP_SOCK" ]; then PHP_SOCK="/run/php/php8.4-fpm.sock" fi +# Préparation des répertoires Nginx et activation de nexus-pbx +mkdir -p /etc/nginx/sites-available /etc/nginx/sites-enabled +rm -f /etc/nginx/sites-enabled/default +ln -sf /etc/nginx/sites-available/nexus-pbx /etc/nginx/sites-enabled/nexus-pbx + # Application de la configuration Nginx complète (Ports 80, 8080, 8443) php -r ' require_once "/var/www/nexus-pbx/src/Database.php"; @@ -313,9 +318,6 @@ $st = $db->query("SELECT admin_https_port, certbot_strict_port80 FROM settings W App\FirewallManager::applyNginxConfig((int)($st["admin_https_port"] ?? 8443), (int)($st["certbot_strict_port80"] ?? 0)); ' -rm -f /etc/nginx/sites-enabled/default -ln -sf /etc/nginx/sites-available/nexus-pbx /etc/nginx/sites-enabled/nexus-pbx - # Filtre Fail2ban Asterisk cat << 'EOF' > /etc/fail2ban/filter.d/asterisk.conf [Definition] @@ -391,4 +393,4 @@ systemctl restart cron && systemctl enable cron # Exécution immédiate de la bannière console clear || true -/usr/local/bin/nexus-banner +/usr/local/bin/nexus-banner --force || true diff --git a/scripts/nexus-banner.sh b/scripts/nexus-banner.sh index c243871..7d63d25 100755 --- a/scripts/nexus-banner.sh +++ b/scripts/nexus-banner.sh @@ -3,8 +3,8 @@ # NexusPBX - Terminal Console Banner & Network Status (FreePBX-style) # ============================================================================== -# Ne s'exécute que pour les shells interactifs -if [ -t 1 ]; then +# Ne s'exécute que pour les shells interactifs ou avec l'option --force +if [ -t 1 ] || [ "${1:-}" = "--force" ] || [ -n "${SSH_TTY:-}" ]; then C_GREEN="\033[1;32m" C_CYAN="\033[1;36m" diff --git a/src/Database.php b/src/Database.php index cc59a66..fb16d6b 100644 --- a/src/Database.php +++ b/src/Database.php @@ -269,6 +269,24 @@ class Database created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ); + + -- 13. Table phonebook_contacts : Annuaire d'Entreprise & Carnet d'Adresses IP Phone + CREATE TABLE IF NOT EXISTS phonebook_contacts ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + extension_id INTEGER DEFAULT NULL, + display_name VARCHAR(128) NOT NULL, + internal_number VARCHAR(32) NOT NULL DEFAULT '', + mobile_number VARCHAR(32) NOT NULL DEFAULT '', + other_number VARCHAR(32) NOT NULL DEFAULT '', + email VARCHAR(128) NOT NULL DEFAULT '', + photo_url TEXT NOT NULL DEFAULT '', + group_name VARCHAR(64) NOT NULL DEFAULT 'Général', + is_internal INTEGER NOT NULL DEFAULT 1, + created_at DATETIME DEFAULT CURRENT_TIMESTAMP, + updated_at DATETIME DEFAULT CURRENT_TIMESTAMP + ); + CREATE INDEX IF NOT EXISTS idx_phonebook_ext ON phonebook_contacts(extension_id); + CREATE INDEX IF NOT EXISTS idx_phonebook_group ON phonebook_contacts(group_name); SQL; $db->exec($schema); @@ -282,6 +300,7 @@ class Database self::migrateIvrsTable($db); self::migrateCertificatesTable($db); self::migrateFeatureCodesTable($db); + self::migratePhonebookContactsTable($db); // Création du compte admin par défaut (admin / admin123) s'il n'existe aucun utilisateur $userCount = (int)$db->query('SELECT COUNT(*) FROM users')->fetchColumn(); @@ -867,5 +886,27 @@ class Database } } } + + private static function migratePhonebookContactsTable(PDO $db): void + { + $db->exec(" + CREATE TABLE IF NOT EXISTS phonebook_contacts ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + extension_id INTEGER DEFAULT NULL, + display_name VARCHAR(128) NOT NULL, + internal_number VARCHAR(32) NOT NULL DEFAULT '', + mobile_number VARCHAR(32) NOT NULL DEFAULT '', + other_number VARCHAR(32) NOT NULL DEFAULT '', + email VARCHAR(128) NOT NULL DEFAULT '', + photo_url TEXT NOT NULL DEFAULT '', + group_name VARCHAR(64) NOT NULL DEFAULT 'Général', + is_internal INTEGER NOT NULL DEFAULT 1, + created_at DATETIME DEFAULT CURRENT_TIMESTAMP, + updated_at DATETIME DEFAULT CURRENT_TIMESTAMP + ); + CREATE INDEX IF NOT EXISTS idx_phonebook_ext ON phonebook_contacts(extension_id); + CREATE INDEX IF NOT EXISTS idx_phonebook_group ON phonebook_contacts(group_name); + "); + } } diff --git a/src/PhonebookManager.php b/src/PhonebookManager.php index 6f466e3..3976482 100644 --- a/src/PhonebookManager.php +++ b/src/PhonebookManager.php @@ -29,6 +29,25 @@ class PhonebookManager */ public static function syncExtensions(PDO $db): void { + $db->exec(" + CREATE TABLE IF NOT EXISTS phonebook_contacts ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + extension_id INTEGER DEFAULT NULL, + display_name VARCHAR(128) NOT NULL, + internal_number VARCHAR(32) NOT NULL DEFAULT '', + mobile_number VARCHAR(32) NOT NULL DEFAULT '', + other_number VARCHAR(32) NOT NULL DEFAULT '', + email VARCHAR(128) NOT NULL DEFAULT '', + photo_url TEXT NOT NULL DEFAULT '', + group_name VARCHAR(64) NOT NULL DEFAULT 'Général', + is_internal INTEGER NOT NULL DEFAULT 1, + created_at DATETIME DEFAULT CURRENT_TIMESTAMP, + updated_at DATETIME DEFAULT CURRENT_TIMESTAMP + ); + CREATE INDEX IF NOT EXISTS idx_phonebook_ext ON phonebook_contacts(extension_id); + CREATE INDEX IF NOT EXISTS idx_phonebook_group ON phonebook_contacts(group_name); + "); + // 1. Récupère la cartographie des groupes d'extensions $egRows = $db->query("SELECT id, name, members FROM extension_groups")->fetchAll(); $extToGroup = [];