Asterisk: Call Forwarding (Anrufweiterleitung)

Asterisk: Call Forwarding (Anrufweiterleitung)

Wichtig: Es dürfen keine weiteren Dial´s eingerichtet sein. Diese funktionieren mit dem Call Forwarding nicht.

ich wollte gerne eine einfache Anrufweiterleitung (Call Forwarding) die ich in den Dialplan einfüge und jeder Nutzer diese Funktion benutzen kann ohne, dass ich die einzelnen Schaltungen für die Benutzer ändern muss. Ich habe viel gesucht und viel gebastelt um die Funktionen zu haben, die ich haben wollte.

Fangen wir vorne an. Als erstes schreiben wir die Funktion, dass die Rufumleitung eingeleitet wird.

exten => _*5X.,1,Answer()
exten => _*5X.,n,Set(DB(CF/${CALLERID(num)})=${EXTEN:2})
exten => _*5X.,n,SayDigits(${EXTEN:2})
exten => _*5X.,n,NoOp(Weiterleitung fuer ${CALLERID(num)} auf ${EXTEN:2} aktiviert.)
exten => _*5X.,n,Hangup()

Um nun die Weiterleitung zu aktivieren rufen wir *5 an. Dies geht aber nur wenn wir hinter der *5 die Nummer angeben, an die wir weiterleiten wollen. Sprich *5100 bedeutet, leite an die Rufnummer 100 weiter. Hierfür wird eine Datenbank namens "CF" angelegt. Diese ist aufgebaut mit unserer eigenen Nummer "${CALLERID}" und als Value mit der Nummer an die wir weiterleiten wollen "${EXTEN:2}".

Nun folgt die Funktion, mit der wir die Anrufweiterleitung zurückziehen.

exten => *5,1,Answer()
exten => *5,n,NoOp(${DB_DELETE(CF/${CALLERID(num)})})
exten => *5,n,Playback(auth-thankyou)
exten => *5,n,NoOp(Weiterleitung fuer ${CALLERID(num)} deaktiviert.)
exten => *5,n,Hangup()

Geben wir nun nur die *5 ein so wird der Datenbankeintrag gelöscht. Dies ist wichtig für das eigentliche Script, welches später die Anrufweiterleitung prüft:

exten => _X.,1,NoOp(Anruf von ${CALLERID(num)} fuer ${EXTEN})
exten => _X.,n,GotoIf($[${DB_EXISTS(CF/${EXTEN})}]?forward:normal)
exten => _X.,n(normal),Dial(SIP/${EXTEN})
exten => _X.,n(forward),NoOp(Anruf fuer ${EXTEN} wird verbunden zu ${DB(CF/${EXTEN})})
exten => _X.,n,Playback(call-forwarding)
exten => _X.,n,Dial(SIP/${DB(CF/${EXTEN})})

Egal, welche Nummer nun gewählt wird, es muss diesen Teil des Dialplan´s durchlaufen. Über die GotoIf Abfrage, prüft das Script, ob es die Datenbank von dem angerufenen gibt. Sollte hier True als Argument kommen, so wird an "forward" weitergeleitet.