Patch: Extension Ansage in Voicemail

AreaZ

Neuer User
Mitglied seit
28 Sep 2005
Beiträge
1
Punkte für Reaktionen
0
Punkte
0
Hallo zusammen,

für alle die es Interessiert.... :roll:

Hatte gestern folgendes Problem mit meinen Voicemail-Boxen. (Asterisk-1.0.9, Amportal, bristuff-0.2.0-RC8j, chan_capi_vm)

Habe einen großen Haufen PSTN und SIP Leitungen, zahlreiche SIP User und Analoge Telefone an meinem Asterisk. Problem nun, einige User haben Catchall Mailboxen, also ein Postfach, auf das mehrere Rufnummern auflaufen.

Beispiel: Rufnummer: 12345 - Mailbox-Teilnehmer: 210

Die Standardansage meldet sich nun mit "blabla Teilnehmer 210 ist nicht erreichbar...".

Nun möchte ich aber, dass die Mailbox sich mit "blabla Teilnehmer 12345 ist nicht erreichbar..." meldet und außerdem selbsttätig erkennt, welche Rufnummer wurde angerufen und diese in den Text mit einbezieht.

:arrow: Vorweg: Ich weiß, dass es einfacher ist, eine Ansage aufzunehmen und gut ist...Allerdings möchten einige Benutzer keine Ansage aufnehmen und lieber den Standard behalten. Daher nun die folgende Problemlösung.

Bringen wir der voicemail app also bei, dass sie ausser der eigentlichen extension number auch noch andere Nummern in den Text aufnehmen kann.

Zunächst einmal, teilen wir in der extensions.conf eine kleine Änderung mit:

Code:
; Alter code....
;exten => s-BUSY,1,Voicemail(b${ARG1})   ; Voicemail Busy message
;exten => s-BUSY,2,Hangup()
;exten => _s-.,1,Voicemail(u${ARG1})     ; Voicemail Unavailable message
;exten => _s-.,2,Hangup()

; Neuer code....
exten => s-BUSY,1,Voicemail(b${ARG1},${DNID})   ; Voicemail Busy message
exten => s-BUSY,2,Hangup()
exten => _s-.,1,Voicemail(u${ARG1},${DNID})     ; Voicemail Unavailable message
exten => _s-.,2,Hangup()

Somit wird die Voicemail() funktion interpretiert als: Voicemail("u210|12345"). Wobei die jetzige Konfiguration alles nach dem "|" ignoriert und somit das System wie gehabt weiter funktioniert.

Nun allerdings müssen wir der app_voicemail.c ein wenig auf den Zahn.... :!: Schließlich soll sie die Nummer hinter einem "|" als Rufnummer in den Standardtext aufnehmen.

Dies erreichen wir mit diesem Patch (Code ist GPL):

Code:
12a13,14
>  
> /* vmid patch: Oliver Welter <[email protected]> */
1114c1116
< static int invent_message(struct ast_channel *chan, char *context, char *ext, int busy, char *ecodes)
---
> static int invent_message(struct ast_channel *chan, char *context, char *ext, int busy, char *ecodes, char *toldnum)
1133c1135,1144
< 		res = ast_say_digit_str(chan, ext, ecodes, chan->language);
---
> 		if (!toldnum)
> 		{
> 			ast_log(LOG_VERBOSE, "No vmid override. Using '%s' as vmid\n", ext);
> 			res = ast_say_digit_str(chan, ext, ecodes, chan->language);
> 		}
> 		else
> 		{
> 			ast_log(LOG_VERBOSE, "Got override. Using '%s' as vm-identifier\n", toldnum);
> 			res = ast_say_digit_str(chan, toldnum, ecodes, chan->language);		
> 		}
1298c1309
< static int leave_voicemail(struct ast_channel *chan, char *ext, int silent, int busy, int unavail)
---
> static int leave_voicemail(struct ast_channel *chan, char *ext, int silent, int busy, int unavail, char *toldnum)
1385c1396
< 				res = invent_message(chan, vmu->context, ext, busy, ecodes);
---
> 				res = invent_message(chan, vmu->context, ext, busy, ecodes, toldnum);
2318c2329
< 		cmd=leave_voicemail(chan,username,0,0,0);
---
> 		cmd=leave_voicemail(chan,username,0,0,0, NULL);
3720a3732
> 	char * tmp2, *toldnum;
3734c3746,3753
< 	ext = tmp;
---
> 	
> 	ast_log(LOG_DEBUG, "Got data token '%s'\n",tmp);
> 	tmp2 = strtok(tmp, "|");
> 	ext = tmp2;
> 	tmp2 = strtok(NULL, "|");
> 	toldnum = tmp2;
> 		
> 	//ext = tmp;
3748c3767,3768
< 	res = leave_voicemail(chan, ext, silent, busy, unavail);
---
> 	
> 	res = leave_voicemail(chan, ext, silent, busy, unavail, toldnum);
4567c4587
< 					leave_voicemail(chan, num, 1, 0, 1);
---
> 					leave_voicemail(chan, num, 1, 0, 1, NULL);

Wir kopieren einfach den obigen Inhalt in die Datei app_voicemail.patch und kopieren diese in unser Asterisk-src Unterverzeichnis apps. Nun geben wir ein cat app_voicemail.patch | patch app_voicemail.c und wechseln ins Asterisk-src Verzeichnis.

:arrow: Nun wird Asterisk angehalten!!!

Eingabe: make

:idea: Nun die Datei apps/app_voicemail.so ins Asterisk modules Verzeichnis kopieren (Sometimes /usr/lib/asterisk/modules) und Asterisk neu starten.

Rufen wir nun die externe Nummer 12345 an, an dem sich die Voicemailbox 210 befindet, so meldet diese sich mit "blablabla Teilnehmer 12345 ist nicht erreichbar..."

BTW: Die Ansage kann nun beliebig durch austauschen der ${DNID} Variablen geändert werden.

Gruß AreaZ
 
Man könnte auch einfach Symlinks verwenden. Geht dann sogar ohne Asterisk-Neustart ;)

Aber find ich trotzdem toll, dass du dir die Mühe gemacht hast. Wenn du Zeit und Lust hast, kannst du ja den Patch an die CVS-Version und im Bugtracker posten. Ich bin mir sicher, dass andere dieses Feature auch gerne hätten. Denk dann aber bitte daran, den Disclaimer zu unterschreiben.
 
Vorweg: Ich weiß, dass es einfacher ist, eine Ansage aufzunehmen und gut ist...

Wo muss ich die Ansagen für die verschiedenen SIP-Teilnehmer zwischenspeichern. Wie sagen ich dem * dass er die richtige Voicemailansage abspielt?

Gruß Dani
 
Sorry, dass ich einen uralten Thread aufwärme...
Ich möchte auch lieber die DID angesagt bekommen (auch wenn auch ich weiss, dass das Aufnehmen einer Ansage einfacher ist) anstatt die interne Nummer, habe aber keine Lust, app_voicemail wie oben beschrieben zu patchen...
Hat jemand eine elegante Lösung dafür, z.B.:
Man könnte auch einfach Symlinks verwenden.
Wie soll denn das gehen?
Einen Symlink /var/spool/asterisk/voicemail/default/<extension>/unavail.wav erstellen? Aber worauf soll der zeigen?
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.