Anrufweiterleitung über CLI "programmieren"

beowulf

Neuer User
Mitglied seit
28 Mai 2004
Beiträge
161
Punkte für Reaktionen
0
Punkte
16
Hallo!

Ich weiß, daß ich an meinen SIP Endgeräten eine individuelle Weiterleitung einstellen kann. Zwar kann ich mit einigen Klimmzügen, die Webinterfaces der SIP Geräte von außerhalb meines LANs erreichen, aber per SSH komme ich leicht auf meinen Server im LAN und somit an die CLI.

Kann ich nun direkt über die CLI eine Anrufweiterleitung programmieren? Also, Anrufe, die von Nebenstelle 39 entgegengenommen werden, sollen auf die Nebenstelle 34 weitergeleitet werden.

Wenn ja, wie geht das.

Danke,
Niki
 
Einige SIP-Endgeräte realisieren die Weiterleitung innerhalb des Endgerätes. Diese kannst Du dann vom * aus nicht beeinflussen.

Wenn Du Deine Weiterleitung im Asterisk mittels eines Eintrages in der Datenbank vornimmst kannst Du natürlich diesen mit database put Users/Redirect/496... 491... überschreiben oder mit database del ... löschen.

Ich biete alternativ eine von extern erreichbare "Programmier-Rufnummer" (mit PIN-Abrage) an um die Umleitung auch aus der Ferne ändern zu können.


MfG Mathias
 
Alternativ wuerde ich mir generell eine Umleitung wie folgt bauen:

Code:
;Interne 2 Stellige Durchwahl
;
exten => _XX,1,Macro(weiterleitung,${EXTEN},SIP/${EXTEN},Tt)

; Macro Weiterleitung incl. Chef Sekretaerin Funktion
;
[macro-weiterleitung]
exten => s,1,Set(temp=${DB(CFIM/${ARG1})})

exten => s,n,GotoIf($["${temp}" = "${CALLERIDNUM}"]?ja:nein)

exten => s,n(nein),GotoIf(${temp}?cfim:nocfim)

exten => s,n(cfim),Dial(Local/${temp}@intern/n)
exten => s,n,Busy()
exten => s,n(nocfim),NoOp

exten => s,n(ja),Dial(${ARG2},240,t) ; 15sec timeout

exten => s,n,Set(temp=${DB(CFBS/${ARG1})})
exten => s,n,GotoIf(${temp}?cfbs:nocfbs)
exten => s,n(cfbs),Dial(Local/${temp}@intern/n)
exten => s,n(nocfbs),Busy

Dazu baust du dir einfach noch ne Nebenstelle, die dann die Datenbank Eintraege setzt. Ich habe mir ein AGI geschrieben mit SipSak und einen Loopdetect, damit es zu keiner Schleife kommt. Des weiteren wollte ich bei meinen Snom Telefonen die Umleitung auf dem Display angezeigt bekommen, daher habe ich SipSak genutzt.

Nichts desto trotz kannst du via Asterisk CLI mittels "database put CFIM <Rufnummer> <Weiterleitung>" die Statische-Umleitung setzen. Mit CFBS die Weiterleitung bei nicht erreichbar.
 
Zuletzt bearbeitet:
Mathias-R schrieb:
Einige SIP-Endgeräte realisieren die Weiterleitung innerhalb des Endgerätes. Diese kannst Du dann vom * aus nicht beeinflussen.

Falsch. Wenn ich von der CLI aus dafür sorge, daß der Anruf erst gar nicht am Endgerät ankommt, ist es völlig egal, was im Endgerät als lokale Umleitung gespeichert ist.

beowulf schrieb:
Kann ich nun direkt über die CLI eine Anrufweiterleitung programmieren?

Ja, kannst Du. Sogar ganz ohne Datenbank. Du kannst von der CLI aus den Dialplan jederzeit ändern. Wenn Du also - um bei Deinem Beispiel zu bleiben - von der 34 nach 38 umleiten willst, dann mußt Du lediglich den Dialplan so ändern, daß danach folgender Eintrag vorhanden ist:

Code:
exten => 34,1,dial,SIP/38

Hilfe dazu findest Du auf der CLI mit "help" und die beiden interessanten Kommandos sind "remove extension" und "add extension"
 
betateilchen schrieb:
Falsch. Wenn ich von der CLI aus dafür sorge, daß der Anruf erst gar nicht am Endgerät ankommt, ist es völlig egal, was im Endgerät als lokale Umleitung gespeichert ist.
Die Frage war jedoch:
beowulf schrieb:
...daß ich an meinen SIP Endgeräten eine individuelle Weiterleitung einstellen kann...
Du solltest also erst die Frage lesen, ehe Du eine Antwort als "falsch" bezeichnest! Wenn Die Umleitung am SIP-Endgerät eingestellt ist kann es nicht vom CLI geändert werden - und das war hier die Fragestellung.

Die Alternativlösung einer Umleitung im * hatte ich schließlich auch schon vorgeschlagen.
 
Mathias-R schrieb:
Die Frage war jedoch: daß ich an meinen SIP Endgeräten eine individuelle Weiterleitung einstellen kann

:crazy:

Schon wieder falsch! Das war überhaupt keine Frage, sondern ein Aussagesatz, den Du jetzt einfach vorne und hinten beschnitten hast :kasper:

Der ganze Satz war:

beowulf schrieb:
Ich weiß, daß ich an meinen SIP Endgeräten eine individuelle Weiterleitung einstellen kann

Du solltest nicht einfach fremde Beiträge sinnlos zerstückelt und dadurch falsch zitieren!

Die Frage um die es im Thread Titel und um ersten Beitrag ging, ist eindeutig formuliert:

beowulf schrieb:
Kann ich nun direkt über die CLI eine Anrufweiterleitung programmieren?

Eindeutiger und klarer kann man eine Frage nicht stellen!

Du solltest also erst die Frage lesen, ehe Du eine Antwort als "falsch" bezeichnest!

Im Gegensatz zu Dir habe ich das getan.


Wenn Die Umleitung am SIP-Endgerät eingestellt ist kann es nicht vom CLI geändert werden - und das war hier die Fragestellung.

Nein, das war nicht die Fragestellung.
 
betateilchen,

jetzt muss ich aber Mathias-R Recht geben:

Mathias-R schrieb:
Einige SIP-Endgeräte realisieren die Weiterleitung innerhalb des Endgerätes. Diese kannst Du dann vom * aus nicht beeinflussen.

Damit sagt er doch nur, dass wenn am Endgerät eine Weiterleitung (mit dem Ergebnis SIP response 302 "Moved Temporarily") eingerichtet wurde man dies nicht mehr CLI-seitig ändern kann. Und das stimmt doch, oder?

betateilchen schrieb:
Falsch. Wenn ich von der CLI aus dafür sorge, daß der Anruf erst gar nicht am Endgerät ankommt, ist es völlig egal, was im Endgerät als lokale Umleitung gespeichert ist.

Und damit hast Du natürlich völlig Recht. Das widerspricht jedoch nicht der Aussage von Mathias.

Ich schätze Dich als überaus kompetenten Asterisk-Experten und verdanke Dir viel - aber wir sollten die Kirche doch im Dorf lassen...

Sorry, wenn ich mich da eingemischt habe. Aber das fand ich unfair!

Ralph
 
@Ralph*
Und trotzdem ging das an der Frage vorbei, denn die lautete nun mal anders.
 
Im Grunde ist doch allen klar, was gemeint ist (Das hoffe ich jedenfalls. Falls ich falsch liegen sollte, tut es mir leid):

1. Ist am SIP-Endgerät eine Rufumleitung eingerichtet, dann ist die CLI-seitig nicht zu ändern. Denn von dort aus hat man keinen Zugriff auf die Geräteprogrammierung. Ob die geräteseitige Rufumleitung überhaupt zum Tragen kommt ist aber auch eine Frage des Dialplanes.

2. Denn man kann bereits im Dialplan (also auch via CLI) dafür sorgen, dass das SIP-Endgerät gar nicht erst erreicht wird, indem anstatt Gerät 39 eben Gerät 34 angerufen wird.

Die Frage war also:
Kann ich nun direkt über die CLI eine Anrufweiterleitung programmieren?

Und die Antwort lautet: Ja

Als Einführung seiner Frage schrieb beowulf noch:
Ich weiß, daß ich an meinen SIP Endgeräten eine individuelle Weiterleitung einstellen kann

Dies hat Mathias-R in #2 bestätigt. Wobei er in #5 leider fälschlicherweise behauptet hat, dass dies die Frage gewesen sei.

So, jetzt ist hoffentlich alles gut...

Ralph
 
Zuletzt bearbeitet:
baschdieh schrieb:
Nichts desto trotz kannst du via Asterisk CLI mittels "database put CFIM <Rufnummer> <Weiterleitung>" die Statische-Umleitung setzen. Mit CFBS die Weiterleitung bei nicht erreichbar.

Ja, so etwas habe ich gesucht. Und die ganze Syntax sieht dann so aus:
database put CFIM 34 38 ?

Niki
 
Hi Niki,

genau (Syntax via Asterisk CLI) - damit stellst du die Weiterleitung der Nebenstelle "34" auf das Weiterleitungsziel "38". Diese Sache erfordert natuerlich die Anpassung deiner extensions.conf wie bereits zuvor geschrieben.

Viel Erfolg :)
 
baschdieh, kannst du das AGI hier mal posten, ich suche nämlich noch eine geschmeidige Lösung um gegenseitige Rufumleitungen zu unterbinden!

Danke im voraus...
 
@Guard-X:
Ein Loop-Detect funktioniert nur solange keine Rufe von externen Netzen zurück kommen. Mit einer Umleitung vom * zu einem Handy via Genion und zurück zum * kam es leider dennoch zum Loop, zumal der extern umgeleitete Ruf oft erst einige Sekunden später anliegt und eine andere CID hat. Die einzige Lösung die ich hier finden konnte ist die Zahl der Gespräche von und zu jeder Rufnummer zu begrenzen:
Code:
exten => _X.,1,ExecIf($[(${GROUP_COUNT(CallCnt@from${CALLERID(number)})} > 20)]$[(${GROUP_COUNT(CallCnt@to${EXTEN})} > 10)]$[(${GROUP_COUNT(CallCnt)} > 200)],HangUp(38))
exten => _X.,2,Set(GROUP(from${CALLERID(number)})=CallCnt)
exten => _X.,3,Set(GROUP(to${EXTEN})=CallCnt)
Den Count to... darf man natürlich nicht auf Zentrale / Callcenter anwenden, from... nicht auf Anonymous.
Vielleicht hat auch baschdieh hier noch einen besseren Weg gefunden?

@betateilchen:
Auch ich schätze Dein Fachwissen als Asterisk-Experte und bin Dir dankbar für Deine Unterstützung in diesem Forum. Mein sachlicher Einwand sollte nicht als Kritik an Deiner Person verstanden werden.

MfG Mathias
 
Hi Guard,

habe das Script in php gebaut....:

Code:
#!/usr/bin/php -q
<?php

$prefix=""; 

function loop_detected() {
        echo "EXEC GoTO _*21*X.|102";
        exit(3);
}


$database=$argv[1];
$weitvon=$argv[2];
$weitnach=$argv[3];

if($weitvon==$weitnach) {
        loop_detected();
}


$output=`asterisk -rx 'database show CFIM'`;
$array=split("\n",$output);
$i=0;
$array_lines=count($array);
foreach($array as $element) {
        if($i+3<=$array_lines)
        {
                $element=str_replace(" ","",$element);
                $element=substr($element,6);
                $zwischen=split(":",$element);
                $weiterleitungen[$zwischen[0]]=$zwischen[1];
        }
        $i++;
}
if(is_array($weiterleitungen))
{
        $needle=$weitnach;
        while(array_key_exists($needle, $weiterleitungen)){
                $needle=$weiterleitungen[$needle];
                if($weitvon==$needle)
                {
                        loop_detected();
                }
        }
}
$output=`asterisk -rx 'database show CFBS'`;
$array=split("\n",$output);
$i=0;
$array_lines=count($array);
foreach($array as $element) {
        if($i+3<=$array_lines)
        {
                $element=str_replace(" ","",$element);
                $element=substr($element,6);
                $zwischen=split(":",$element);
                $weiterleitungen[$zwischen[0]]=$zwischen[1];
        }
        $i++;
}
if(is_array($weiterleitungen))
{
        $needle=$weitnach;
        while(array_key_exists($needle, $weiterleitungen)){
                $needle=$weiterleitungen[$needle];
                if($weitvon==$needle)
                {
                        loop_detected();
                }
        }
}

$peer=$prefix.$weitvon;
$output=`asterisk -rx 'sip show peer $peer'`;
$array=split("\n",$output);
$array=split(";",$array[38]);
$sipuri=substr($array[0], 17);
exec("asterisk -rx 'database put " . $database . " " . $weitvon . " " . $weitnach  . "'");
if($database=="CFIM")
{
        exec('sipsak -M -O desktop -B "Uml. -> '.$weitnach.'" -r 5060 -s '.$sipuri.' -H 172.16.200.1');
}
?>

Funzt einwandfrei....wenn nen Loop entsteht, wir das akustisch wiedergegeben und die Weiterleitung natuerlich nicht gesetzt :)
 
baschdieh schrieb:
Dazu baust du dir einfach noch ne Nebenstelle, die dann die Datenbank Eintraege setzt.
Supi, danke für das AGI!

Und wie sieht deine exten aus, für die Übergabe an das AGI?

mfg Guard-X

Edit1: Habe das jetzt mal so gemacht, musste im Macro aber noch einiges anpassen.

Code:
exten => _*21*X.,1,AGI(call-forwarding.agi|CFIM|${CALLERIDNUM}|${EXTEN:4})

Edit2: Ach ja, wie kann ich denn die Rufumleitung mit deinem Beispiel einfach nur an- und ausschalten?
 
Hey,

anbei meine extensions.conf:

Code:
; Call Forward Statisch
exten => _*21*X.,1,AGI(weiterleitung.agi|CFIM|${CALLERIDNUM}|${EXTEN:4})
exten => _*21*X.,2,Playback(weiterleitungaktiv)
exten => _*21*X.,3,Hangup
exten => _*21*X.,102,Playback(loopdetect)
exten => _*21*X.,103,HangUp()

; Call Forward Status akutisch abfragen
exten => *21**,1,Set(nrweiter=${DB(CFIM/${CALLERIDNUM})})
exten => *21**,2,Noop(${nrweiter})
exten => *21**,3,GotoIf($["${nrweiter}" = ""]?10:4)
exten => *21**,4,Wait(1)
exten => *21**,5,Playback(weiterneben)
exten => *21**,6,SayNumber(${CALLERIDNUM})
exten => *21**,7,Playback(weiterauf)
exten => *21**,8,SayNumber(${nrweiter})
exten => *21**,9,HangUp()

exten => *21**,10,Wait(1)
exten => *21**,11,Playback(kweiter)
exten => *21**,12,HangUp()

;Aufheben
exten => *21,1,AGI(waufheben.agi|CFIM|${CALLERIDNUM})
exten => *21,2,Playback(weiterleitungdeaktiv)
exten => *21,3,Hangup

Hoffe das beantwortet Deine Frage ? ;-)

P.s.:
AH - Vielleicht solltest du noch den Code zum Aufheben haben...hehe
Code:
#!/usr/bin/php -q
<?php

#$prefix="MyNumberMap-"; # Wenn keine numerischen SIP-Accounts verwendet werden, muss Prefix gesetzt werden

$database=$argv[1];
$weitvon=$argv[2];

$peer=$prefix.$weitvon;
$peercut=`grep $peer /etc/asterisk/extensions.conf`;
$peercut2=split("=",$peercut);
$peercut3=split("\n",$peercut2[1]);
$output=`asterisk -rx 'sip show peer $peercut3[0]'`;
$array=split("\n",$output);
$array=split(";",$array[38]);
$sipuri=substr($array[0], 17);
exec("asterisk -rx 'database del ".$database." ".$weitvon."'");
if($database=="CFIM")
{
        exec('sipsak -M -O desktop -B "" -r 5060 -s '.$sipuri.' -H 172.16.200.1');
}
?>

Das sollte es gewesen sein.. ;-)
 
@baschdieh

Wenn ich das richtig sehe erkennst Du damit nur Loops innerhalb Deines Asterisk. Eine Weiterleitung zu einem Endgerät (oder einer Fritzbox) und innerhalb des Endgerätes (oder der Fritzbox) zurück zur Anlage führt dann somit immer noch zum Loop - oder fängst Du das auch irgendwie ab?
 
Das Script setzt natuerlich voraus, dass die Endgeraete die Umleitung direkt auf dem Server mittels z.B. "*21*XXXX" durchgefuehrt wird.

Beispiel:
-> Umleitung von 100 auf 110

Würde nun der Aperat 110 auf die 100 umleiten (mit *21*XX), würde ein "Loop" entstehen, das Script wuerde es erkennen und somit kann die Umleitung nicht durchgeführt werden.
Wenn natuerlich manuell am Endgerät (ohne *21) die Umleitung eingerichtet werden wuerde, wuerde das Script natuerlich NICHT greifen - die Anlage wuerde es ja nicht anhand der Datenbank auslesen koennen.
 
Hallo baschdieh,

da du die Befehle direkt über den Asterisk absetzt, z.B.
Code:
$output=`asterisk -rx 'database show CFIM'`;
bringt ein verbose oder debug Modus die ganze Sache scheinbar etwas durcheinander. Bei uns funktioniert z.B. die Loop Detection dann nicht mehr. Kannst du das bestätigen?

mfg Guard-X
 
Hey,

in wie fern "durcheinander" ? Ich habe hier keine Realtime Konfig - Debug habe ich auf 10 - Verbose ebenfalls auf 10 und das Script funktioniert einwandfrei. Das Script merkt sich ja die Nebenstelle und das Weiterleitungsziel (wenn eine Weiterleitung eingetragen werden soll). Diese Infos werden dann mittels "database show CFIM" verglichen. Sieht er ein Dublikat, traegt er es nicht ein.

Also hier - absolut kein Problem - selbst auf anderen Maschinen (ohne Realtime Konfig) funktioniert es hier einwandfrei...

In wie fern macht sich der Fehler bemerkbar ? Weiterleitung wird, obwohl es bereits eingetragen ist, eingerichtet?
 

Zurzeit aktive Besucher

Neueste Beiträge

Statistik des Forums

Themen
246,274
Beiträge
2,249,293
Mitglieder
373,863
Neuestes Mitglied
RuthBeatty
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.