diff --git a/scripts/cluster/notify_backup.sh b/scripts/cluster/notify_backup.sh index f600b34..87ac026 100755 --- a/scripts/cluster/notify_backup.sh +++ b/scripts/cluster/notify_backup.sh @@ -18,12 +18,15 @@ if [ -f "$DB_PATH" ]; then chmod 660 "$DB_PATH" "${DB_PATH}-wal" "${DB_PATH}-shm" 2>/dev/null || true fi -# 2. Désenregistrement des Trunks PJSIP pour éviter les conflits d'appels entrants avec le Master +# 2. Raccrochage immédiat des canaux orphelins et désenregistrement des Trunks PJSIP +# Un nœud en Standby / Backup ne doit avoir aucun canal actif afin de libérer les BLF et éviter les conflits if pidof asterisk >/dev/null 2>&1; then + /usr/sbin/asterisk -rx "channel request hangup all" >> "$LOG_FILE" 2>&1 || true /usr/sbin/asterisk -rx "pjsip send unregister *" >> "$LOG_FILE" 2>&1 || true for reg in $(/usr/sbin/asterisk -rx "pjsip show registrations" 2>/dev/null | grep -o '[a-zA-Z0-9_\-]*-reg' | sort -u); do /usr/sbin/asterisk -rx "pjsip send unregister $reg" >> "$LOG_FILE" 2>&1 || true done + /usr/sbin/asterisk -rx "dialplan reload" >> "$LOG_FILE" 2>&1 || true fi echo "[$TIMESTAMP] [CLUSTER] Mode Standby actif. En écoute des battements de cœur VRRP." >> "$LOG_FILE" diff --git a/scripts/cluster/notify_master.sh b/scripts/cluster/notify_master.sh index 56a855d..0eed385 100755 --- a/scripts/cluster/notify_master.sh +++ b/scripts/cluster/notify_master.sh @@ -33,8 +33,11 @@ if [ -f "$ASTDB_PATH" ]; then fi fi -# 3. Réactivation des enregistrements Trunks PJSIP et rechargement de la config +# 3. Purge préventive des canaux résiduels / fantômes et rechargement PJSIP/Dialplan +# Si le nœud a été mis en pause ou déconnecté, les canaux antérieurs sont morts. +# Leur raccrochage réinitialise immédiatement les hints à l'état Idle et éteint les BLF. if pidof asterisk >/dev/null 2>&1; then + /usr/sbin/asterisk -rx "channel request hangup all" >> "$LOG_FILE" 2>&1 || true /usr/sbin/asterisk -rx "pjsip reload" >> "$LOG_FILE" 2>&1 || true /usr/sbin/asterisk -rx "pjsip send register *" >> "$LOG_FILE" 2>&1 || true for reg in $(/usr/sbin/asterisk -rx "pjsip show registrations" 2>/dev/null | grep -o '[a-zA-Z0-9_\-]*-reg' | sort -u); do diff --git a/src/ConfigGenerator.php b/src/ConfigGenerator.php index b895584..0f407b7 100644 --- a/src/ConfigGenerator.php +++ b/src/ConfigGenerator.php @@ -221,6 +221,19 @@ class ConfigGenerator $lines[] = "force_rport = yes"; $lines[] = "rewrite_contact = yes"; $lines[] = "direct_media = no"; + + // Détection automatique et purge des flux RTP fantômes / morts (ex: basculement HA, coupure réseau) + $rtpTimeout = max(5, (int)($settings['rtp_timeout'] ?? 30)); + $rtpHoldTimeout = max(30, $rtpTimeout * 2); + $rtpKeepalive = max(0, (int)($settings['rtp_keepalive'] ?? 15)); + $lines[] = "rtp_timeout = {$rtpTimeout}"; + $lines[] = "rtp_timeout_hold = {$rtpHoldTimeout}"; + if ($rtpKeepalive > 0) { + $lines[] = "rtp_keepalive = {$rtpKeepalive}"; + } + $lines[] = "timers = yes"; + $lines[] = "timers_min_se = 90"; + $lines[] = "timers_sess_expires = 1800"; if ($wantsTls && $hasTlsCerts) { // Verrouillage strict du transport TLS : refuse le repli sur UDP $lines[] = "transport = transport-tls"; @@ -374,6 +387,10 @@ class ConfigGenerator $lines[] = "trust_id_inbound = {$trustInbound}"; $lines[] = "trust_id_outbound = {$trustOutbound}"; $lines[] = "timers = {$timers}"; + $rtpTimeout = max(5, (int)($settings['rtp_timeout'] ?? 30)); + $rtpHoldTimeout = max(30, $rtpTimeout * 2); + $lines[] = "rtp_timeout = {$rtpTimeout}"; + $lines[] = "rtp_timeout_hold = {$rtpHoldTimeout}"; if ($rtpKeepalive > 0) { $lines[] = "rtp_keepalive = {$rtpKeepalive}"; }