Logpy-AgentOne/telefon/freeswitch/einrichten.sh
Jeuner 3da0cd7ec9 feat(telefon): Wartezeit vor answer() fuer parallel klingelnde Durchwahl (DW3)
Manche Provider (Fonial/Plusnet) klingeln bei einer Durchwahl parallel an
mehreren registrierten Zielen. Ohne Verzoegerung gewinnt AgentOne das Rennen
immer, weil answer() sofort laeuft - das eigentliche Endgeraet kommt nie zum
Klingeln. DW3_DDI in der .env schaltet 20s Wartezeit vor answer() frei,
erkannt ueber den SIP-Header X-ORIGINAL-DDI-URI (destination_number ist bei
diesem Trunk unbrauchbar). Nimmt jemand am Endgeraet ab, bricht der Provider
AgentOnes Versuch per CANCEL ab; sonst laeuft der Dialplan normal weiter zu
Ansage+Aufnahme.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017ovr91y2VK8bYYKPimcX68
2026-09-01 02:53:05 +02:00

65 lines
2.8 KiB
Bash
Executable file

#!/bin/bash
# Traegt Trunk und Dialplan in die FreeSWITCH-Konfiguration ein.
# Das SIP-Passwort kommt aus der .env und landet nur in der FreeSWITCH-Config
# (Rechte 600), nie im Git.
set -euo pipefail
PROJEKT="$(cd "$(dirname "$0")/../.." && pwd)"
FS_ETC="${FS_ETC:-/opt/homebrew/etc/freeswitch}"
# FreeSWITCHs record-App zerlegt ihre Argumente an Leerzeichen:
# record <pfad> <zeitlimit> <stille-schwelle> <stille-treffer>
# Ein Leerzeichen im Projektpfad macht daraus einen abgeschnittenen Pfad; die
# Aufnahme landet neben dem Projekt, der Eingang bleibt leer und der Watcher
# bekommt nie etwas zu sehen. Die Ansage laeuft trotzdem - playback nimmt sein
# Argument am Stueck. Der Fehler sieht deshalb aus wie ein Watcher-Problem.
case "$PROJEKT" in
*\ *)
ersatz="$HOME/$(basename "$PROJEKT" | tr ' ' '-')"
{
echo "Der Projektpfad enthaelt ein Leerzeichen:"
echo " $PROJEKT"
echo "FreeSWITCH kann darin nicht aufnehmen. Abhilfe - einen Pfad ohne"
echo "Leerzeichen anlegen und dieses Skript darueber aufrufen:"
echo " ln -s \"$PROJEKT\" \"$ersatz\""
echo " $ersatz/telefon/freeswitch/einrichten.sh"
} >&2
exit 1 ;;
esac
[ -d "$FS_ETC" ] || { echo "FreeSWITCH-Konfiguration nicht gefunden: $FS_ETC" >&2; exit 1; }
[ -f "$PROJEKT/.env" ] || { echo ".env fehlt in $PROJEKT" >&2; exit 1; }
# .env einlesen, ohne die Werte auszugeben.
set -a; source "$PROJEKT/.env"; set +a
for v in SIP_USER SIP_PASS SIP_DOMAIN; do
[ -n "${!v:-}" ] || { echo "$v fehlt in .env" >&2; exit 1; }
done
[ -f "$PROJEKT/telefon/ansage.wav" ] || {
echo "Ansage fehlt - erst telefon/ansage_bauen.sh ausfuehren" >&2; exit 1; }
mkdir -p "$FS_ETC/sip_profiles/external" "$FS_ETC/dialplan/public"
fuelle() { # <vorlage> <ziel>
sed -e "s|@@SIP_USER@@|$SIP_USER|g" \
-e "s|@@SIP_PASS@@|$SIP_PASS|g" \
-e "s|@@SIP_DOMAIN@@|$SIP_DOMAIN|g" \
-e "s|@@SIP_PROXY@@|${SIP_PROXY:-$SIP_DOMAIN}|g" \
-e "s|@@DW3_DDI@@|${DW3_DDI:-}|g" \
-e "s|@@PROJEKT@@|$PROJEKT|g" "$1" > "$2"
}
fuelle "$PROJEKT/telefon/freeswitch/plusnet.xml.tpl" "$FS_ETC/sip_profiles/external/plusnet.xml"
chmod 600 "$FS_ETC/sip_profiles/external/plusnet.xml" # enthaelt das SIP-Passwort
fuelle "$PROJEKT/telefon/freeswitch/praxis_ab.xml.tpl" "$FS_ETC/dialplan/public/00_praxis_ab.xml"
echo "Trunk -> $FS_ETC/sip_profiles/external/plusnet.xml (Rechte 600)"
echo "Dialplan -> $FS_ETC/dialplan/public/00_praxis_ab.xml"
echo "Ansage -> $PROJEKT/telefon/ansage.wav"
echo "Eingang -> $PROJEKT/telefon/eingang"
if [ -n "${DW3_DDI:-}" ]; then
fuelle "$PROJEKT/telefon/freeswitch/dw3_warten.xml.tpl" "$FS_ETC/dialplan/public/00_dw3_warten.xml"
echo "DW3 -> $FS_ETC/dialplan/public/00_dw3_warten.xml (DDI: $DW3_DDI, 20s Wartezeit)"
else
echo "DW3 -> uebersprungen (DW3_DDI leer in .env)"
fi