; ******************************************************************** ; asterisk extension config für asterisk auf der Fritz!Box 7050/7170 ; ******************************************************************** ; (asterisk 1.2.16 von openwrt.org; chan_capi 1.0.1; chan_sccp-20060408, isdn4kutils: ; www.spblinux.de/fbox/openwrt/) ; mit besonderem Dank an betateilchen von www.ip-phone-forum.de ; für den asterisk Grundkurs (www.ip-phone-forum.de/showthread.php?t=91217) ; usb installation framework, chan_sccp, careful testing and more contributed by dynamic ; 2006-05, 2006-10, 2007-04, spblinux ; Konzept ; (WICHTIG: bei ungeschütztem Netzwerk Passwörter in sip.conf, iax.conf ändern!) ; - die MSN für das Festnetz am externen isdn S0 Bus der fritzbox ist in capi.conf ; gehende Rufe: ; 0xxxxxxx für Festnetz Nummer 0xxxxxxx (führende 0 wird mit gewählt) ; 5yyy intern für ISDN Telefone (am internen S0 Bus, yyy=msn des Telefons) ; 6zzz remote asterisk (user asterisk2, auf ip Adresse wie unten in [lokal], ; Passwort steht in iax.conf, beide einstellbar durch cfg_asterisk start) ; 70y interne SCCP Telefone (701, 702, 703 vorkonfiguriert ->sccp.conf) ; (SCCP-Verwendung: sccp.conf muss angepasst werden und ; noload => chan_sccp.so in modules.conf muss entfernt werden) ; 77z interne SIP Telefone (771, 772, 773, 774 vorkonfiguriert ->sip.conf) ; (neu 2007-01, dreistellige SIP Nummern, damit analoge Nebenstellen ; der fritzbox sich problemlos per avm-sipclient am asterisk anmelden ; koennen; auch fuer isdn intern empfohlen, damit dtmf und Signalisierung ; funktionieren) ; 8z interne IAX2 Telefone (81, 82, 83, 84 vorkonfiguriert ->iax.conf) ; 80 Echotest ; 89 fragt Passwort ab (/var/tmp/asterisk/passwd) und startet Tunnel ; zebedee2.bin -f /etc/zebedee/zbdr23.conf für telnetd ; 90 Anrufbeantwortertest (Email-Konfiguration in Abschnitt [globals]) ; 91 Begruessungsansage fuer Anrufbeantworter aufnehmen ; (geht bei reboot verloren, wenn nicht per cfg_asterisk usb_install ; installiert worden ist; /var/lib/asterisk/sounds/VM_MESSAGE.gsm) ; usb_install auf USB in addons/asterisk/usr/lib/asterisk/sounds) ; 92 Music on hold testen (/var/lib/asterisk/moh bzw. bei usb_install ; auf USB in addons/asterisk/usr/lib/asterisk/moh) ; 93 Callthrough testen (Passwort in /var/tmp/asterisk/passwd bzw. bei ; usb_install auf USB in addons/asterisk/etc/asterisk/passwd) ; (fragt Nummer ab und ruft diese Nummer per isdn (controller 1) an; ; logfile in /var/log/asterisk, bei USB in addons/asterisk/log/asterisk) ; 94 Callback testen (nur fuer in CB_IN_CHANNEL festgelegten Anrufer ; und nur auf in CB_OUT_CHANNEL festgelegte Nummer und Rueckruf ; erfolgt nur, wenn innerhalb von 5 Sekunden aufgelegt wird) ; kommende Rufe: ; - Rufe vom Festnetz werden auf msn 31 (isdn intern), 701, 771 und 81 signalisiert ; - Anruf von in CB_IN_CHANNEL definierter externer Rufnummer aus triggert ; Callback auf Nummer CB_OUT_CHANNEL (wenn innerhalb von 5 Sekunden aufgelegt wird) ; Anmerkungen: ; - bei den Telefonen 771,..774, 81,..84 ist Nummer=Name=User=Passwort voreingestellt ; - SIP Telefone MÜSSEN asterisk auf Port 5061 ansprechen (-> sip.conf) ; (oder Port des avm-SIP-clients veraendern: teils per voipd Neustart ; mit voipd -P 5062, teils durch Aendern von /var/flash/voip.cfg) ; - Telefone am internen S0: die oben genannten Nummern sind als ; - 9aaaaaa# zu wählen ; - und es muss auf der Fritzbox ein nicht aktiver Internetprovider existieren ; z.b. Internetnummer 99 ; - eine Wahlregel in der Fritzbox muss 9 auf "Internetnummer 99" umleiten ; (sonst übernimmt/ändert der telefon daemon auf der fritzbox den Anruf... ; und ohne telefon daemon geht das Rauswählen ins Festnetz nicht) ; - zudem muss bei Internettelefonie/Erweitert der automatische Fallback ; ins Festnetz ausgeschaltet sein! ; - WLAN auf der Fritzbox muss/sollte deaktiviert sein, damit genügend RAM für ; asterisk vorhanden ist ; - getestet auf fritzbox 7050/7170 an ISDN Anschluss ; - für eigene Anpassungen: siehe oben genannter Grundkurs ; - Testversion ohne jede Gewähr (->auf ungewollte Telefonkosten achten!) [globals] ; gehende Nummer in [festnetz_out] CAPI_CALLERID=1234567 ;Callback (interne extension 94 oder auf CAPI/ISDN1 eingehender Ruf): ;(Triggerung durch Auflegen innerhalb von 5 Sekunden): CB_IN_CHANNEL=SIP/772 CB_OUT_CHANNEL=SIP/772 ;intern (fuer internes ISDN-Telefon mit msn 772; extension 94 waehlbar per 994#): ;CB_IN_CHANNEL=CAPI/ISDN3/772 ;CB_OUT_CHANNEL=CAPI/ISDN3/772 ;extern ;CB_IN_CHANNEL=CAPI/ISDN1/0981234567 ;CB_OUT_CHANNEL=CAPI/ISDN1/0981234567 CB_CALLERID=Fritzbox <1234567> CB_WAITTIME=90 CB_CONTEXT=echotest CB_EXTENSION=80 ;CB_CONTEXT=callthroughtest ;CB_EXTENSION=93 MAILER_TO=root@localhost MAILER_FROM=asterisk@localhost MAILER_SMTP=smtp.localhost ; smtp user und password nur bei Bedarf eintragen (sonst leer lassen!) MAILER_USER= MAILER_PASSWORD= [general] static=yes writeprotect=no ; Macros [macro-entfernegitter] ; wenn Nummer mit # endet, das # Zeichen abschneiden, als EXTEN2 zurückgeben ; - um am internen isdn S0 der fritzbox asterisk zu erreichen, muss 912...# gewählt werden exten => s,1,Set(EXTEN2=${IF( $[ ${MACRO_EXTEN:-1} = # ] ? ${MACRO_EXTEN:0:$[${LEN(${MACRO_EXTEN})}-1]} : ${MACRO_EXTEN} )}) ;exten => s,n,NoOp(${EVAL(${EXTEN2})} -- ${MACRO_CONTEXT}) ; -------------------------------------------------------------------- ; f.r interne Funktionen: Echo, Anrufbeantworter ... ;Callback testen [callbacktest] exten => _94!,1,noop,callerid=${CALLERID}, channel=${CHANNEL:0:10}, callback_in_channel=${CB_IN_CHANNEL} exten => _94!,n,gotoif,$["${CHANNEL:0:$[${LEN(${CB_IN_CHANNEL})}-1-${LEN(${CALLERIDNUM})}]}" != "${CB_IN_CHANNEL:0:$[${LEN(${CB_IN_CHANNEL})}-1-${LEN(${CALLERIDNUM})}]}"]?80 exten => _94!,n,gotoif,$["${CALLERIDNUM}" != "${CB_IN_CHANNEL:-${LEN(${CALLERIDNUM})}}"]?80 exten => _94!,n,wait,1 exten => _94!,n,goto,callback-wait|s|1 ; nicht per include in lokal aufzunehmen; wird ueber callbacktest aufgerufen. [callback-wait] exten => s,1,Set(CB_TRIGGERED=1|g) exten => s,n,ringing exten => s,n,wait,5 exten => t,1,Set(CB_TRIGGERED=0|g) exten => t,n,hangup exten => h,1,gotoif,$[${CB_TRIGGERED}]?callback-callfile|s|1 ; nicht per include in lokal aufzunehmen; wird ueber callbacktest aufgerufen. [callback-callfile] exten => s,1,system,echo "Channel: ${CB_OUT_CHANNEL}" >/var/spool/asterisk/call0 exten => s,n,system,echo "CallerID: ${CB_CALLERID}" >>/var/spool/asterisk/call0 exten => s,n,system,echo "WaitTime: ${CB_WAITTIME}" >>/var/spool/asterisk/call0 exten => s,n,system,echo "MaxRetries: 0" >>/var/spool/asterisk/call0 exten => s,n,system,echo "Context: ${CB_CONTEXT}" >>/var/spool/asterisk/call0 exten => s,n,system,echo "Extension: ${CB_EXTENSION}" >>/var/spool/asterisk/call0 exten => s,n,system,mv /var/spool/asterisk/call0 /var/spool/asterisk/outgoing exten => s,n,system,touch /var/spool/asterisk/outgoing exten => s,n,goto,100 exten => s,80,wait,5 exten => s,100,hangup ;Callthrough testen [callthroughtest] ; Prompt caller to authenticate and validate passcode exten => _93!,1,Goto(callthroughauth,s,1) ; nicht per include in lokal aufzunehmen; wird ueber callthroughtest aufgerufen. [callthroughauth] ; Prompt caller to authenticate and validate passcode ;exten => _1234567!,1,goto(s,1) exten => s,1,answer exten => s,2,Noop(${CALLERIDNUM}) exten => s,3,wait,1 exten => s,4,authenticate,/etc/asterisk/passwd|j ; Log failed authentication and hangup exten => _93!,105,system,chroot /oldroot echo "${DATETIME} - ${CALLERIDNUM}: Authentication Failed!" >> /var/log/asterisk/callthrough.log exten => _93!,n,HangUp() exten => s,5,Goto(callthrough,s,1) ; Log when call has been aborted exten => h,1,system,chroot /oldroot echo "${DATETIME} - ${CALLERIDNUM}: Call has been aborted at ${DATETIME}" >> /var/log/asterisk/callthrough.log ; nicht per include in lokal aufzunehmen; wird ueber callthroughtest aufgerufen. [callthrough] ; Prompt caller to key-in number to be dialed and to finish with # exten => s,1,Set(NR=) exten => s,2,Background(vm-enter-num-to-call) exten => s,3,Set(TIMEOUT(response)=30) exten => s,4,WaitExten exten => _X,1,Set(NR=${NR}${EXTEN}) exten => _X,2,Goto(s,3) exten => *,1,Goto(s,1) exten => #,1,NoOp(${NR}) exten => #,2,Playback(vm-dialout) exten => #,3,NoOP(Dialing Now) exten => #,4,system,chroot /oldroot echo "${DATETIME} - ${CALLERIDNUM}: Authenticated & dialing ${NR}" >> /var/log/asterisk/callthrough.log exten => #,5,NoOp(Dialing ${NR}) exten => #,6,Dial,CAPI/ISDN1/${NR}|55|bd ;exten => #,6,Dial,SIP/${NR}|55|bd exten => #,n,HangUp() ; Log when connection timed out exten => t,1,Busy(3) exten => t,n,system,chroot /oldroot echo "${DATETIME} - ${CALLERIDNUM}: Call to ${NR} timed out." >> /var/log/asterisk/callthrough.log exten => t,n,HangUp() ; Log when call has finished exten => h,1,system,chroot /oldroot echo "${DATETIME} - ${CALLERIDNUM}: Call to ${NR} completed." >> /var/log/asterisk/callthrough.log ;music on hold testen [mohtest] exten => _92!,1,Macro,entfernegitter exten => _92!,n,answer exten => _92!,n,wait,1 exten => _92!,n,musiconhold exten => _92!,n,hangup ;Begruessungsnachricht des Anrufbeantworters aufnehmen [record_message] exten => _91!,1,Macro,entfernegitter exten => _91!,n,answer exten => _91!,n,wait,1 exten => _91!,n,playback,beep exten => _91!,n,record,VM_MESSAGE.gsm|3|60 exten => _91!,n,playback,VM_MESSAGE exten => _91!,n,playback,beep exten => _91!,n,hangup ;bei usb-Installation werden die Nachrichten vor dem mailen ;auf den usb-Speicher geschrieben (/var/spool/asterisk); ;(Schreiben auf RAM durch Ersetzen von /var/spool/asterisk durch /var/spool) [recordtest] ; Prompt caller to authenticate and validate passcode exten => _90!,1,Goto(record,s,1) ; nicht per include in lokal aufzunehmen; wird ueber recordtest aufgerufen. [record] exten => s,1,Macro,entfernegitter exten => s,n,answer,2000 exten => s,n,wait,1 ; die gew.hlte Nummer ansagen: exten => s,n,SayDigits,${EXTEN2} ; Ansagetext vorspielen exten => s,n,playback,VM_MESSAGE exten => s,n,set,MSGFILENAME=${CALLERIDNUM}-${TIMESTAMP} exten => s,n,set,MAILER_SUBJECT=Anrufer:${CALLERIDNUM} ${DATETIME} exten => s,n,record,/var/spool/asterisk/${MSGFILENAME}.WAV|5|60 ;exten => s,n,playback,/var/spool/asterisk/${MSGFILENAME} exten => s,n,hangup ; Nachricht nach Hangup per e-mail versenden und löschen exten => h,1,gotoif,${MSGFILENAME}?20:48 exten => h,20,system,chroot /oldroot mv /var/spool/asterisk/${MSGFILENAME}.WAV /var/spool/asterisk/${MSGFILENAME}.wav exten => h,n,gotoif,${MAILER_USER}?40 exten => h,n,system(chroot /oldroot mailer -s "${MAILER_SUBJECT}" -m "${MAILER_SMTP}" -f "${MAILER_FROM}" -t "${MAILER_TO}" -d /var/spool/asterisk/${MSGFILENAME}.wav) exten => h,n,goto,45 exten => h,40,system(chroot /oldroot mailer -a "${MAILER_USER}" -w "${MAILER_PASSWORD}" -s "${MAILER_SUBJECT}" -m "${MAILER_SMTP}" -f "${MAILER_FROM}" -t "${MAILER_TO}" -d /var/spool/asterisk/${MSGFILENAME}.wav) exten => h,n,goto,45 ; Nachricht bei erfolgreichem Versand loeschen exten => h,45,gotoif,$[${SYSTEMSTATUS} = SUCCESS]?46:48 exten => h,46,system,chroot /oldroot rm /var/spool/asterisk/${MSGFILENAME}.wav exten => h,47,goto,49 exten => h,48,NoOp(Hanging up - no message to send) exten => h,49,NoOp() [echotest] exten => _80!,1,Macro,entfernegitter exten => _80!,n,answer exten => _80!,n,wait,2 ; als Test auf die Spracheinstellung, die gewählte Nummer ansagen: exten => _80!,n,SayNumber,80 exten => _80!,n,wait,2 exten => _80!,n,playback,demo-echotest exten => _80!,n,echo exten => _80!,n,playback,demo-echodone exten => _80!,n,hangup [authtest] exten => _89!,1,Macro,entfernegitter exten => _89!,n,answer exten => _89!,n,wait,2 exten => _89!,n,authenticate,/etc/asterisk/passwd exten => _89!,n,system,zebedee2.bin -f /etc/zebedee/zbdr23.conf exten => _89!,n,playback,beep exten => _89!,n,hangup ; ; -------------------------------------------------------------------- ; für rausgehende Rufe ; ; Es hat sich als gute Praxis erwiesen, die Inhalte der Datei ; extensions.conf modular aufzubauen. Diese Praxis wollen ; wir auch hier anwenden ; [lokal] include => echotest include => authtest include => recordtest include => record_message include => mohtest include => callthroughtest include => callbacktest ; Erreichbarkeit der Nebenstellen ; untereinander herstellen ; Erreichbarkeit der Telefone am internen S0 der fritzbox 7050 ; (wähle nach S0 intern ohne führende Ziffer 5: 5123 für Telefon mit msn=123) exten => _5.,1,Dial,CAPI/ISDN3/${EXTEN:1}|55|Tt/b ; remote asterisk ; (wähle nach remote asterisk ohne führende Ziffer 6: 680 echotest remote) exten => _6X.,1,Dial,IAX2/asterisk2@192.168.123.123/${EXTEN:1} ; SCCP exten => _70X,1,Dial,SCCP/${EXTEN}|55|Ttr ; SIP exten => _77X,1,Dial,SIP/${EXTEN}|55|Ttr ; IAX2 exten => _8[1-9],1,Dial,IAX2/${EXTEN}|55|Ttr [festnetz_out] ; Raustelefonieren per externen S0 der fritzbox 7050 ; wenn Nummer führende Null hat (0 wird mitgewählt!) ; erzwinge default calller id aus capi.conf: /d ; (/d geht nicht; SetCallerID verwenden) exten => _0X.,1,SetCallerID,${CAPI_CALLERID} exten => _0X.,n,Dial,CAPI/ISDN1/${EXTEN}|55|Tt/bd ; -------------------------------------------------------------------- ; für reinkommende Rufe ; ; hier kommt der default-Context, in dem alle Geraete in der ; Grundkonfiguration erstmal laufen. ; Alle Geraete koennen sich gegenseitig anrufen [default] include => lokal [sip771] include => lokal include => festnetz_out [sip772] include => lokal include => festnetz_out [sip773] include => lokal include => festnetz_out [sip774] include => lokal include => festnetz_out [sccp701] include => lokal include => festnetz_out [sccp702] include => lokal include => festnetz_out [sccp703] include => lokal include => festnetz_out [iax81] include => lokal include => festnetz_out [iax82] include => lokal include => festnetz_out [iax83] include => lokal include => festnetz_out [iax84] include => lokal include => festnetz_out [asterisk2_in] include => lokal ; ISDN S0 extern [capi-in1] ; solange in capi.conf nur auf einer msn Nummer Anrufe angenommen werden ; reicht es, unabhängig von der msn immer auf die ; gewünschten Nebenstellen weiterzuverbinden ; callback? ; (compare number and channel of caller with number and channel in CB_IN_CHANNEL) exten => _X.,1,noop,callerid_num=${CALLERIDNUM}, channel=${CHANNEL}, callback_channel=${CB_IN_CHANNEL} exten => _X.,n,gotoif,$["${CHANNEL:0:$[${LEN(${CB_IN_CHANNEL})}-1-${LEN(${CALLERIDNUM})}]}" != "${CB_IN_CHANNEL:0:$[${LEN(${CB_IN_CHANNEL})}-1-${LEN(${CALLERIDNUM})}]}"]?80 exten => _X.,n,gotoif,$["${CALLERIDNUM}" != "${CB_IN_CHANNEL:-${LEN(${CALLERIDNUM})}}"]?80 exten => _X.,n,goto,callback-wait|s|1 exten => _X.,1, ; Bei SCCP SetCalledParty Funktion nutzen um Name und Nummer der jeweiligen angerufenen Nebenstelle(n) ; fuer chan_sccp zu setzen ;exten => _701.,1,SetCalledParty("Home Office" <1234567>)> ;exten => _701.,2,Dial,SIP/771&IAX2/81&SCCP/701&CAPI/ISDN3/31|30|r ; mit sccp: exten => _X.,80,Dial,SIP/771&IAX2/81&SCCP/701&CAPI/ISDN3/31|30|r ; ohne sccp: ;exten => _X.,80,Dial,SIP/771&IAX2/81&CAPI/ISDN3/31|30|r ; ISDN S0 intern: akzeptiere nur Anrufe mit führender 9 ; (entferne die führende 9 und das abschliessende #) [capi-in3] exten => _9[1-9]!,1,Macro,entfernegitter exten => _9[1-9]!,n,Goto,lokal|${EXTEN2:1}|1 exten => _90!,1,Macro,entfernegitter exten => _90!,n,Goto,festnetz_out|${EXTEN2:1}|1