Logpy-AgentOne/telefon/freeswitch/einrichten.sh
Jeuner 83b576f5e4 feat(telefon): Notruf-Ton vor der Ansage, Taste 1 verbindet zu Astra
Hauptnummer und DW3 spielen nach dem Annehmen den Notruf-Ton aus dem
Profil (8 kHz mono PCM16). Taste 1 geht wie Durchwahl 9 an den
Pipecat-Bootstrap, ohne Taste weiter zu Ansage und Aufnahme.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 17:00:17 +02:00

80 lines
3.6 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|@@DW9_DDI@@|${DW9_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"
# Kontext fuer Taste 1 waehrend des Notruf-Tons - Top-Level unter dialplan/,
# nicht in public/ (siehe notruf_menue.xml.tpl).
fuelle "$PROJEKT/telefon/freeswitch/notruf_menue.xml.tpl" "$FS_ETC/dialplan/notruf_menue.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 "Notruf -> $FS_ETC/dialplan/notruf_menue.xml (Ton: telefon/notruf_ton.wav, Taste 1 -> Astra)"
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
# DW9 (rufagent) -> Astra-Telefonagent. Dateiname "00_dw9_..." ist Absicht:
# muss alphabetisch vor 00_praxis_ab.xml einsortieren, siehe
# dw9_rufagent.xml.tpl fuer die Begruendung (2026-09-13 gefunden).
if [ -n "${DW9_DDI:-}" ]; then
fuelle "$PROJEKT/telefon/freeswitch/dw9_rufagent.xml.tpl" "$FS_ETC/dialplan/public/00_dw9_rufagent.xml"
echo "DW9 -> $FS_ETC/dialplan/public/00_dw9_rufagent.xml (DDI: $DW9_DDI, -> Astra)"
else
echo "DW9 -> uebersprungen (DW9_DDI leer in .env)"
fi