Debian Etch + Asterisk 1.4 + HFC-S Card

bin gerade dabei ein "Durchwahlmenü" zu erstellen...

und habe dort mein nächstes Problem...

meine bisherige extensions:

exten => 8001,1,Answer
exten => 8001,n,Background(teilnehmernr_wahl)
exten => 8001,n,Read(teilnehmernr||2)
exten => 8001,n,Wait(1)
exten => 8001,n,SayDigits(${teilnehmernr})
exten => 8001,n,Wait(1)
exten => 8001,n,Dial(Local/${teilnehmernr}@default,60,t)
Jedoch scheint das noch nicht so zu funktionieren (kann es sein, das * versucht erst auf (wenn ich 11 eingebe...) 1 und anschliessend nochmal 1 anzuwählen ?

*20* und *21* soweit wie ich das jetzt verstanden habe, wird dadurch ein macro aufgerufen, das die Nachtschaltung (mailbox) steuert... gibt es da noch etwas zu beachten ? hat sich auch erledigt... :)

jedoch finde ich nicht die Stelle, wo die entspr. Werte abgelegt werden (wohin z.b. die Weiterleitung geht... ?)
 
Zuletzt bearbeitet:
wir sollten mal ein wenig über den dialplan (extensions.conf) und dessen benutzung sprechen:
der asterisk dialplan funkioniert so, dass du ja die gewählten nummern zu funktionsabläufen zuordnest. jetzt ist es unter umständen sehr mühsam, wenn du für jede nummer einen eigenen dieser abläufe definieren musst, deswegen kann man hier sog. "wildcards" verwenden, um das zu "gruppieren". das ganze ist auf http://voip-info.mirrors.bsd.net/wiki/view/Asterisk+Dialplan+Patterns.html recht ausführlich beschrieben, dennoch ein kurzer überblick darüber.
um das ganze von anfang an richtig zu verstehen, sollte man folgendes wissen: in wirklichkeit wählt dein telefon nämlich keine nummer sondern immer einen SIP URI. dieser uri sieht aus, wie eine email adresse und hat also 2 teile (z.b. "[email protected]"):
1. teil: die "durchwahl" (1234)
2. teil: die sip domain (192.168.0.100)
wenn du also auf dem telefon z.b. "1234" wählst, so merkt das telefon, dass keine sip domain in "1234" angegeben wurde und ergänzt die nummer mit einem klammeraffen und der ip adresse des sip servers oder dessen "domain", auf dem du registriert bist. du hast bei deiner konfig bis jetzt immer die ip adresse des sip server angegeben, wenn du das x-lite konfiguriert hat, deswegen verwendet es auch die ip adresse.

richtig verwirrend wird es jetzt, wenn ich dir jetzt sage, dass auch vor dem klammeraffen nicht unbedingt eine ziffernkombination angegeben werden muss, sonder das kann auch eine alphanumerische zeichenkette sein. Es reicht vorab, dass du das weisst, wenn es um die definition im dialplan geht. das mit den alphanumerischen extensions und den domains erkläre ich dir später.

hier mal der wichtigste teil der o.g. voip-info seite:
Code:
X          matches any digit from 0-9 
Z          matches any digit from 1-9 
N          matches any digit from 2-9 
[1237-9]   matches any digit or letter in the brackets 
           (in this example, 1,2,3,7,8,9) 
.          wildcard, matches one or more characters
wird eines der hier erwähnten wildcards verwendet, muss das der asterisk angezeigt werden, deswegen muss vor der extension ein "_" gesetzt werden.

einige beispiele zum verständnis:
"8001" gilt genau für die nummer 8001
"_800X" gilt für die nummern 8000 bis 8009
"_800Z" gilt für 8001 bis 8009
"_800[3-5]" oder "_800[345]" gilt für 8003 bis 8005
"_80XX" gilt für 8000 bis 8099
"_80ZX" gilt für 8010 bis 8099
"_80[0-2][012345]" gilt für die nummern 8000-8005, 8010-8015 und 8020-8025
siehst du das system dahinter?

beim rauswählen weiss man aber die länge der nummer nicht, deswegen zeigt ein "." am ende an, dass dieser "match" für alle nummern gilt, die mit den angegebenen ziffern oder patterns beginnen.

auch hier ein beispiel:
"_0Z." gilt für alle nummern, die mit "0" beginnen, an der zweiten stelle eine ziffer von 1-9 haben und danach noch mindestens eine ziffer haben.

ein verständnis-problem ist es oft, wenn im dialplan aus der notwendigkeit oder einfachheit heraus sich überschneidende patterns verwendet werden:
Code:
...
exten = _[123]X,1,...   ; <- alle nummern von 10-39
...
exten = 20,1,...       ; <- genau die nummer "20"
...
da die 20 aber im nummerbereich 10-39 ebenfalls enthalten ist, könnte man meinen, dass für 20 der erste block gilt, weil der ja davor definiert wurde. asterisk ordnet aber den dialplan nach der genauigkeit der nummernangabe und NICHT nach der reihenfolge in der extensions.conf. deswegen wird hier auch für die nummer 20 der zweite block verwendet.

soweit klar?

um jetzt dein problem mit der fehlermeldung in deinem post zu lokalisieren, muss man sich jetzt den dialplan ansehen und den fehler finden, warum es für die gewählte nummer ("01234567") keinen dialplan eintrag gibt. um jetzt auch die reihenfolge der abarbeitung zu kontrollieren, sollte man das aus der asterisk konsole heraus mit dem befehl
Code:
*CLI> dialplan show internal
machen. es kann durchaus sein, dass ein syntax-fehler in der extensions.conf vorhanden ist, man diesen aber bei einem "dialplan reload" aus der CLI nicht bemerkt, weil das alles so schnell über den bildschirm fliegt. deswegen lohnt hier ein blick in die ausgaben dieses befehls über die bildschirmgrenzen hinaus. im putty einfach den scrollbar verwenden, auf der linux konsole kann mit "shift-pageup" und "shift-pagedown" gescrollt werden.

im zakotel dialplan werden globale variablen auch in einigen patterns verwendet, deswegen ist die suche des fehlers in der datei "extensions.conf" ev. nicht so einfach.

deine fehlermeldung für die "01234567" besagt also, dass für diese nummer kein dialplan-eintrag gefunden wurde, und wenn du etwas im dialplan umgebaut hast, ist entweder
1. ein syntax fehler in der extensions.conf
2. wirklich der eintrag "_0Z.", der hier ja matchen würde, verloren gegangen

kontrollier das mal und gib bitte bescheid

grüße,
laureen
 
bitte verwende in deinem "8001"-menü-block in der letzten zeile kein "Dial(Local/...", mach es mit einem goto. der "Local" channel kann zwar hier verwendet werden und bewirkt auch im prinzip das selbe, jedoch muss dir schon klar sein, wie der funktioniert:
Code:
...
exten = 8001,s,Dial(Local/<extension>@<context>,60,t)
...
es gibt aber bei dir keine 2-stellige "teilnehmernr" im context "default", oder????

grüße,
laureen
 
Game Over... REBOOT....

Sorry habe hier gerade den Überblick verloren... :)

deine fehlermeldung für die "01234567" besagt also, dass für diese nummer kein dialplan-eintrag gefunden wurde, und wenn du etwas im dialplan umgebaut hast, ist entweder
1. ein syntax fehler in der extensions.conf
2. wirklich der eintrag "_0Z.", der hier ja matchen würde, verloren gegangen

war bezogen auf Post 140 (Seite 7) ?! hatte sich ja schon erledigt... lag an einem ein syntax fehler in der extensions.conf..


es gibt aber bei dir keine 2-stellige "teilnehmernr" im context "default", oder????
hast recht... habe da geschludert.. und nicht richtig gelesen...

ich werd´s jetzt mit
exten => 8001,n,Goto(${teilnehmernr},1)
versuchen... ;)
 
exten => 8001,n,Goto(${teilnehmernr},1)
geht aber nur, wenn sich der block für die 8001 im gleichen context wie die "teilnehmernr" befindet, ansonsten:
Code:
...
exten = 8001,n,Goto(internal,${teilnehmernr},1)
...
 
moin ;)

auch das Sprachmenü funktioniert bestens (dank deiner Hilfe...)

habe aber mal wieder eine Frage nach einem "Stichwort" ...

Ich würde gerne NUR Nummern erlauben (extern) die mir bekannt, bzw. authorisiert sind.
Meine momentane Überlegung wäre:

Die vom Anrufer gewählte Nummer (bevor * selber wählt!) per DBget zu selektieren und je nach Ergebnis den Anruf auszuführen, oder zu blockieren... ?!
Oder meinst du, ich soll dies besser per AGI lösen...

Gruß Dennis
 
das solltest du mit einem agi lösen, damit das in einer mysql tabelle stehen kann und du vielleicht die nummern über ein webfrontend verwalten kannst. ich würde dafür ein kleines php agi schreiben, das die datenbank abfragt und den dial absetzt, wenn die nummer erlaubt ist. DBGet ist da nicht wirklich geeignet dafür, da kannst von ausserhalb der asterisk nur schwer ran!

beispiele für php agi's findest du im "/var/lib/asterisk/agi-bin/*.php".

grüße,
laureen
 
hi,

habe ich mir gerade angesehen, jedoch habe ich bisher nicht gefunden, wo die "jetzige" DB (wg. CDR geschrieben wird...)

d.h. dann werde ich also ein agi script schreiben, das die daten ausliest und ggf. erlaubt oder sperrt.

habe mir gerade etliche beiträge hier im forum angesehen, wie man bestimmte rufnummern oder bereiche sperrt... nur bin ich mir hier nicht mehr sicher, wo ich es im dialplan einbauen soll ? im bereich internal oder outbound.. ? evtl. nen kleinen tip ?

;) Gruß Dennis

EDIT: Erster Entwurf

$dest_callcode von * übergebener Ländercode
$dest_status von AGI zurückgegebener Status ob erlaubt oder nicht...

Code:
 #!/usr/bin/php -q
<?php
error_reporting(0);


$m_ini = array();  /// ??? Wofür
$e_ini = array();  ///   " "

// Lese DB Verbinungsdaten
if((file_exists("/etc/asterisk/res_mysql.conf")) && (is_readable("/etc/asterisk/res_mysql.conf"))) {
    $m_ini = parse_ini_file("/etc/asterisk/res_mysql.conf", true);
    $dbhost = $m_ini["general"]["dbhost"];
    $dbuser = $m_ini["general"]["dbuser"];
    $dbpass = $m_ini["general"]["dbpass"];
    $dbname = $m_ini["general"]["dbname"];
} else {
    exit;
}

// Verbinde mit Datenbank
$link = @mysql_connect($dbhost, $dbuser, $dbpass);
if(!$link) {
    exit;
}

@mysql_select_db($dbname, $link);

$sql = "SELECT * FROM ast_callcodetable WHERE dest_callcode=$dest_callcode";
$ret = @mysql_query($sql, $link);
if(@mysql_num_rows($ret) > 0) {

       $data = mysql_fetch_array ($ret);


  $dest_status =$data["dest_status"];

    }
    @mysql_free_result($ret);
}
@mysql_close($link);

?>
 
Zuletzt bearbeitet:
du darfst nicht vergessen, die daten, die dir die asterisk über stdin zur verfügung stellt, einzulesen und den file descriptor für stdin aufzumachen. siehe dazu die function "read" im beispiel-agi "vars.php"!

grüße,
laureen

ps: freue mich über das "et löft...", danke für die blumen!

[EDIT] du weisst aber schon, dass du da nix "zurückgeben" kannst, es wird die asterisk mittels "echo" direkt aus dem agi-script angesteuert. dazu wirf doch bitte einen blick in die "/var/lib/asterisk/agi-bin/fax.php"![/EDIT]
 
Sorry... also ich steh hier voll auf´m Schlauch... habe mir "etliche" Scripte angesehen...

habe ein "ganz einfaches php-Script"

Code:
 <?php

echo "exec SET VALUE_OUT=300";

?>

Dies sollte doch "laut fax.php" ... die Variable "VALUE_OUT" auf 300 setzen...


im Dialplan habe ich dann exten => 96,n,SayDigits(${VALUE_OUT})

kannst du mich da noch einmal "anschubsen"...
Gruß Dennis
 
ok, dann noch mal langsam zum mitdenken:

wenn du ein php-agi schreibst, und zwar ohne dieser php-agi klasse, die es irgendwo zum runterladen gibt, dann muss am anfang des scripts die ausgabe der asterisk an die eingabe des agi scripts abgearbeitet werden. asterisk kommuniziert mit dem agi script über "stdin" und "stdout". mit anderen worten, folgender teil muss bei agis IMMER am anfang stehen:
Code:
#!/usr/bin/php -q
<?php
function read() {
  global $in, $debug;
  $input = str_replace("\n", "", fgets($in, 4096));
  return $input;
}
 
$in=fopen("php://stdin","r");
 
while ($env=read()) {
  $s = split(": ",$env);
  $agi[str_replace("agi_","",$s[0])] = trim($s[1]);
  if (($env == "") || ($env == "\n")) {
    break;
  }
}
...
...
...
danach fügst Du deinen code an, die variablen (info über den anruf) sind im array "$agi" gespeichert. das "vars.php" zeigt dir auf der asterisk konsole, welche variablen da so verfügbar sind.

die zeilen
Code:
...
echo "exec Set VALUE_OUT=300\n";
read();
...
setzten eine channel-variable, die nur für diesen einen anruf gültig ist und im dialplan NACH dem agi script abgefragt werden kann, wie du es angeführt hast.

wichtig sind hier 2 dinge:
1. das "\n" am schuss der "echo" anweisung
2. das "read();", um die antwort der asterisk abzuarbeiten.

ad 2.: du kannst auch
Code:
$result = read();
machen, dann hast du in der php-variable "$result" den return-code des befehls, den du vorher per "echo" an die asterisk geschickt hast.

zu guter letzt sei hier noch angemerkt, dass das agi script unter linux von der command line ausführbar sein muss, ein
Code:
# chmod 755 script.php
setzt die berechtigungen richtig, ansonsten kann die asterisk das script nicht ausführen.

wenn du in der asterisk konsole sehen willst, was die asterisk dem agi script schickt bzw. was das script zurück schickt (zur fehlersuche), schalte mit
Code:
*CLI> agi debug
den dubug ein, mit
Code:
*CLI> agi debug off
kannst du den wieder ausschalten.

btw: falls du es nicht weisst, das "@" vor einem php befehlt schaltet die fehlerausgabe von php für diesen einen befehl aus, das solltest du erst verwenden, wenn das script getestet ist und in produktion läuft. ein "@mysql_connect(..." gibt also keine fehlermeldungen aus, auch wenn die mysql verbindung nicht hergestellt werden konnte (z.b. falsches passwort).

jetzt besser?

grüße,
laureen
 
So passt das schon ;) Danke für die beschreibung, da stand ich dann wohl wirklich auf dem schlauch...

werd mich jetzt mal "dran setzten" und berichten...

EDIT: Also hat funktioniert... ;) weiter gehts...


Gruß Dennis
PS: lag bestimmt am Wetter....
 
Guten Morgen ;)
nach "längerer" Abstinenz, bin ich wieder am * dran ;)

Habe anscheinend etwas "viel" am Dialplan "gearbeitet", denn ich habe nun Porbleme mit den Macros (aus meiner Sicht...) D.h. ich kann z.B. keine Weiterleitung ein bzw. ausschalten... obwohl das eigentlich schlüssig sein sollte.

Genaueres muss ich mir aber noch einmal ansehen.

Gruß Dennis
 
Genaueres muss ich mir aber noch einmal ansehen.
Es liegt daran, das der verwendete ATA kein * durchlässt...

d.h. ich kann NICHT *20* wählen...

von meinem xlite funktioniert alles...

eine idee, wie ich einen "workaround" bewerkstelligen könnte ?
ich will mal versuchen, ob ich das mit einem 70er Zahlenbereich erledigt bekomme...


gruß Dennis
 
welchen ATA verwendest du denn? kannst du da einen "dialplan" drinnen ändern?

grüße,
laureen
 
Hi,
schön wieder von dir zu hören... :)

habe hier einen Grandstream GWX-4008 bin aber dabei, statt *20*, *21* und *22* auf den zahlenbereich 70,71,72 umzustellen... und gerade am testen... ob das so funktioniert wie ich das will... ;)

Gruß Dennis
 
meine extensions.conf

...
exten = _7[0-2].,1,Macro(diversion)
exten = _divXX,1,ExecIf($["${DB(DIV/${CALLERID(num)})}"!=""]|Goto|70,1)
exten = _divXX,n,Goto(71,1)
...


[macro-diversion]
; *20* to delete diversions
; *21* to set diversion to "mailbox" or toggle
; *22*XX to set diversion to number XX

exten = s,1,NoOp(Macro diversion called for ${MACRO_EXTEN} by extension ${CALLERID(num)})
exten = s,n,NoCDR()
exten = s,n,Set(PEERNAME=${CALLERID(num)})
exten = s,n,GotoIf($["${SIPPEER(${PEERNAME},context)}"!="internal"]?end)
exten = s,n,GotoIf($["${CUT(MACRO_EXTEN,*,2)}"="70"]?unset)
exten = s,n,GotoIf($["${CUT(MACRO_EXTEN,*,2)}"="71"]?mailbox)
exten = s,n,GotoIf($["${CUT(MACRO_EXTEN,*,2)}"="72"]?number)
exten = s,n,Goto(hangup)

exten = s,n(mailbox),GotoIf($["${DB(DIV/${CALLERID(num)})}"!=""]?unset)
exten = s,n,NoOp(Setting diversion for extension ${CALLERID(num)} to mailbox)
exten = s,n,Set(DB(DIV/${CALLERID(num)})=mailbox)
;exten = s,n,TrySystem(/var/lib/asterisk/agi-bin/setmessage.php "Umgeleitet zur Mailbox" "${PEERNAME}" &)
exten = s,n,Devstate(div${CALLERID(num)},2)
exten = s,n,Goto(end)

exten = s,n(number),Set(DIV_DEST=${MACRO_EXTEN:4})
exten = s,n,GotoIf($["${DIV_DEST}"=""]?hangup)
exten = s,n,NoOp(Setting diversion to ${DIV_DEST} for extension ${CALLERID(num)})
exten = s,n,Set(DB(DIV/${CALLERID(num)})=${DIV_DEST})
;exten = s,n,TrySystem(/var/lib/asterisk/agi-bin/setmessage.php "Umgeleitet zu ${DIV_DEST}" "${PEERNAME}" &)
exten = s,n,Devstate(div${CALLERID(num)},2)
exten = s,n,Goto(end)

exten = s,n(unset),NoOp(Un-Setting diversion for extension ${CALLERID(num)})
exten = s,n,Set(DB(DIV/${CALLERID(num)})="")
;exten = s,n,TrySystem(/var/lib/asterisk/agi-bin/setmessage.php "" "${PEERNAME}" &)
exten = s,n,Devstate(div${CALLERID(num)},1)
exten = s,n,Goto(end)

exten = s,n(end),Answer()
exten = s,n,Wait(0.5)
exten = s,n(hangup),Hangup()
 
das ist keine saubere lösung, versuch mal, den dialplan in deinem ATA zu finden, dort steht wahrscheinlich drinnen, dass er "*"+irgendwas anders behandeln soll.

grüße,
laureen

hab übrigens gerade gesehen, dass neue asterisk pakete bei zakotel online sind!
 
also unter der Administrator oberfläche finde ich da nichts mit "*"


also bei dem MACRO blick ich noch nicht so ganz durch...
mir würde allerdings auch eine "feste" Weiterleitung, die ich per Tel von einem einzigen Apperat aktivieren kann genügen.

d.h. ich wähle abends die "71" und der anruf geht in die mailbox.
wähle ich "72" geht der anruf zu 017212345678
bei "70" wird alles deaktiviert...

um noch einmal auf den dailplan zurückzukommen...
exten = _7[0-2].,1,Macro(diversion)
reagiert auf interne Anrufe 7+[0,1,2] also 70,71,72 und führt Macro diversion aus

exten = _divXX,1,ExecIf($["${DB(DIV/${CALLERID(num)})}"!=""]|Goto|70,1)
Wenn CallerID nicht leer ist, führe aus... und Goto 70,1 (wo ist 70,1 ?!)
exten = _divXX,n,Goto(71,1)
kA was die Zeile soll ? gehe zu Zeile 71,1 (habe ich nicht...?!)


[macro-diversion]
; *20* to delete diversions
; *21* to set diversion to "mailbox" or toggle
; *22*XX to set diversion to number XX

exten = s,1,NoOp(Macro diversion called for ${MACRO_EXTEN} by extension ${CALLERID(num)})
exten = s,n,NoCDR()
exten = s,n,Set(PEERNAME=tel${CALLERID(num)})
exten = s,n,GotoIf($["${SIPPEER(${PEERNAME},context)}"!="internal"]?end)
exten = s,n,GotoIf($["${CUT(MACRO_EXTEN,*,2)}"="70"]?unset)
Was besagt der * ?, das nach oder bevor dem * 2 Stellen ausgewertet werden ?
?unset / ?mailbox / wofür ist das unset gedacht ? an wen wird es übergeben ?


exten = s,n,GotoIf($["${CUT(MACRO_EXTEN,*,2)}"="71"]?mailbox)
exten = s,n,GotoIf($["${CUT(MACRO_EXTEN,*,2)}"="72"]?number)
exten = s,n,Goto(hangup)

exten = s,n(mailbox),GotoIf($["${DB(DIV/${CALLERID(num)})}"!=""]?unset)
exten = s,n,NoOp(Setting diversion for extension ${CALLERID(num)} to mailbox)
exten = s,n,Set(DB(DIV/${CALLERID(num)})=mailbox)
;exten = s,n,TrySystem(/var/lib/asterisk/agi-bin/setmessage.php "Umgeleitet zur Mailbox" "${PEERNAME}" &)
exten = s,n,Devstate(div${CALLERID(num)},2)
exten = s,n,Goto(end)

exten = s,n(number),Set(DIV_DEST=${MACRO_EXTEN:4})
exten = s,n,GotoIf($["${DIV_DEST}"=""]?hangup)
exten = s,n,NoOp(Setting diversion to ${DIV_DEST} for extension ${CALLERID(num)})
exten = s,n,Set(DB(DIV/${CALLERID(num)})=${DIV_DEST})
;exten = s,n,TrySystem(/var/lib/asterisk/agi-bin/setmessage.php "Umgeleitet zu ${DIV_DEST}" "${PEERNAME}" &)
exten = s,n,Devstate(div${CALLERID(num)},2)
exten = s,n,Goto(end)

exten = s,n(unset),NoOp(Un-Setting diversion for extension ${CALLERID(num)})
exten = s,n,Set(DB(DIV/${CALLERID(num)})="")
;exten = s,n,TrySystem(/var/lib/asterisk/agi-bin/setmessage.php "" "${PEERNAME}" &)
exten = s,n,Devstate(div${CALLERID(num)},1)
exten = s,n,Goto(end)

exten = s,n(end),Answer()
exten = s,n,Wait(0.5)
exten = s,n(hangup),Hangup()
 
exten = _divXX,1,ExecIf($["${DB(DIV/${CALLERID(num)})}"!=""]|Goto|70,1)
das brauchst du nur, wenn du snom telefone verwendest, es wird für mailbox-toggle verwendet indem du eine taste auf dem telefon definierst, die diese toggle funktion zur verfügung stellt und leuchten soll, wenn eine umleitung gesetzt ist.

Wenn CallerID nicht leer ist, führe aus... und Goto 70,1 (wo ist 70,1 ?!)
also ein wenig genauer musst du schon lesen, da wird überprüft, ob der datenbank-eintrag ungleich "" ist, und wenn es ungleich "" ist, dann macht er ein goto auf die extension "70" auf die priorität 1, also
Code:
...
exten = 70,1,TueWasAuchImmer()
...

lass das macro bitte so, wie es original war und füge folgende zeilen in deinen internal context ein:
Code:
...
[internal]
...
exten = 70,1,Goto(internal,*20*,1)
exten = 71,1,Goto(internal,*21*,1)
exten = 72,1,Goto(internal,*22*0017212345678,1)
...
dann kannst du dir das alles sparen.

[EDIT] die nummer, auf die du umleiten willst muss im format eingegeben werden, als ob du sie von deinem voip telefon aus wählst!!!!!! deswegen die "00"[/EDIT]

willst du aber verstehen, was die macros so tun, musst du schon ein wenig die doku der einzelnen dialplan applikationen und funktionen studieren...

grüße,
laureen
 
Kostenlos!

Statistik des Forums

Themen
249,052
Beiträge
2,309,531
Mitglieder
378,850
Neuestes Mitglied
IchBinEsDoch