fix(ha): auto-purge zombie channels on HA transition and enforce PJSIP rtp_timeout to fix stuck BLF keys
This commit is contained in:
1 parent
2db19ed2dd
commit
1d2d6b1911
3 files changed
+25
-2
No files matched your search
@@ -18,12 +18,15 @@ if [ -f "$DB_PATH" ]; then
|
|||||||
chmod 660 "$DB_PATH" "${DB_PATH}-wal" "${DB_PATH}-shm" 2>/dev/null || true
|
chmod 660 "$DB_PATH" "${DB_PATH}-wal" "${DB_PATH}-shm" 2>/dev/null || true
|
||||||
fi
|
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
|
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
|
/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
|
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
|
/usr/sbin/asterisk -rx "pjsip send unregister $reg" >> "$LOG_FILE" 2>&1 || true
|
||||||
done
|
done
|
||||||
|
/usr/sbin/asterisk -rx "dialplan reload" >> "$LOG_FILE" 2>&1 || true
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "[$TIMESTAMP] [CLUSTER] Mode Standby actif. En écoute des battements de cœur VRRP." >> "$LOG_FILE"
|
echo "[$TIMESTAMP] [CLUSTER] Mode Standby actif. En écoute des battements de cœur VRRP." >> "$LOG_FILE"
|
||||||
|
|||||||
@@ -33,8 +33,11 @@ if [ -f "$ASTDB_PATH" ]; then
|
|||||||
fi
|
fi
|
||||||
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
|
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 reload" >> "$LOG_FILE" 2>&1 || true
|
||||||
/usr/sbin/asterisk -rx "pjsip send register *" >> "$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
|
for reg in $(/usr/sbin/asterisk -rx "pjsip show registrations" 2>/dev/null | grep -o '[a-zA-Z0-9_\-]*-reg' | sort -u); do
|
||||||
|
|||||||
@@ -221,6 +221,19 @@ class ConfigGenerator
|
|||||||
$lines[] = "force_rport = yes";
|
$lines[] = "force_rport = yes";
|
||||||
$lines[] = "rewrite_contact = yes";
|
$lines[] = "rewrite_contact = yes";
|
||||||
$lines[] = "direct_media = no";
|
$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) {
|
if ($wantsTls && $hasTlsCerts) {
|
||||||
// Verrouillage strict du transport TLS : refuse le repli sur UDP
|
// Verrouillage strict du transport TLS : refuse le repli sur UDP
|
||||||
$lines[] = "transport = transport-tls";
|
$lines[] = "transport = transport-tls";
|
||||||
@@ -374,6 +387,10 @@ class ConfigGenerator
|
|||||||
$lines[] = "trust_id_inbound = {$trustInbound}";
|
$lines[] = "trust_id_inbound = {$trustInbound}";
|
||||||
$lines[] = "trust_id_outbound = {$trustOutbound}";
|
$lines[] = "trust_id_outbound = {$trustOutbound}";
|
||||||
$lines[] = "timers = {$timers}";
|
$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) {
|
if ($rtpKeepalive > 0) {
|
||||||
$lines[] = "rtp_keepalive = {$rtpKeepalive}";
|
$lines[] = "rtp_keepalive = {$rtpKeepalive}";
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in new issue
Block a user