Enum Abfrage

Bei mir ist alles in extensions.conf. Es gibt keine #include extensions-custom.conf in meinem extensions.conf.

Das was ich unter [enum] geschrieben habe, muß auch unter [enum] erscheinen, weil [enum] ganz neu ist.

Das was unter [international-custom] erscheint war nur in [international-custom] weil ich war der Meinung, [international-custom] schon woanders in Deinem Dialplan unter einem include=>international-custom richtig verwendet ist. Da ich jetzt Deinen extensions.conf näher anschaue, kann ich vorschlagen, Du stellst diese drei Zeilen an einer Stelle wo die eine Wirkung haben, und nicht in international-custom, sondern vielleicht direkt nach [default].

auch zu beachten, ist daß wo ich "@provider" geschrieben habe, alles muß richtig geändert sein für Deine Konfiguration und Provider.
 
Hi John,


Was ist mit globals?




Yeah, bei mir geht es jetzt.









Thx Super.


Update:

Es wird nur e164.arpa abgefragt, org nicht, weist Du warum?




Timm
 
Zuletzt bearbeitet:
>Was ist mit globals?
Code:
[globals] in extensions.conf muß zwischen [general] und dem ersten [context] sein.  Dort werdel globale Variabeln gesetzt, wie z.B. MeinOrtsnetz.

>Es wird nur e164.arpa abgefragt, org nicht, weist Du warum?

Tippfehler?

[enum]
exten => _Z.,1,Set(enumlist=e164.org e164.arpa|tree=0)

d.H. e164.org zuerst, dann e164.arpa

erst nach Tippfehler schauen, dann folgende Nr versuchen:
000 1 800 444 4444 -- das geht, oder?

wenn nicht, sollst Du als Debugzeile

exten => _Z.,n,Noop(${e164})

einfügen, name dem ersten "While" und vor dem "Set(sipcount..."

Dann 000 1 800 4444444 wählen.  Du siehst so etwas:
wenn nötig: CLI> set verbose 3

    -- Goto (enum,18004444444,1)
    -- Executing Set("SIP/x28-35ee4600", "enumlist=e164.org e164.arpa|tree=0") in new stack
    -- Executing While("SIP/x28-35ee4600", "1") in new stack
    -- Executing NoOp("SIP/x28-35ee4600", "e164.org") in new stack
    -- Executing Set("SIP/x28-35ee4600", "sipcount=2|counter=0") in new stack
    -- Executing While("SIP/x28-35ee4600", "1") in new stack
    -- Executing Set("SIP/x28-35ee4600", "counter=1") in new stack
    -- Executing GotoIf("SIP/x28-35ee4600", "0?ew") in new stack
    -- Executing Dial("SIP/x28-35ee4600", "SIP/[email protected]|120") in new stack
    -- Called [email][email protected][/email]
    -- SIP/tf.voipmich.com-35f08600 answered SIP/x28-35ee4600

Wenn's nicht geht, dieses Trace hier eintragen.
 
Hi John,


geht immer noch nicht.
Das ganze schaut jetzt so aus:
Code:
[enum]
exten => _Z.,1,Set(enumlist=e164.org e164.arpa|tree=0)
exten => _Z.,n,While($["${SET(e164=${CUT(enumlist, ,${SET(tree=$[${tree} + 1])})})}" != ""])
exten => _Z.,n,Noop(${e164})
exten => _Z.,n,Set(sipcount=${ENUMLOOKUP(+${EXTEN},sip,c,${ e164})}|counter=0)
exten => _Z.,n,While($[${counter}<0${sipcount}])
exten => _Z.,n,Set(counter=$[${counter}+1])
exten => _Z.,n,Gotoif($["${SET(e=${ENUMLOOKUP(+${EXTEN},sip,${counter},${e 164})})}"=""]?ew)
exten => _Z.,n,Dial(SIP/${e},120)
exten => _Z.,n(ew),EndWhile
exten => _Z.,n,EndWhile
exten => _Z.,n,GotoIf($["${DIALSTATUS}"=""]?ef)
exten => _Z.,n,Noop(${DIALSTATUS})
exten => _Z.,n,Congestion()
exten => _Z.,n,Hangup
exten => _Z.,n(ef),Goto(00${EXTEN},1)
Er springt nach einer gewissen Zeit immer auf de Provider.
Habe auch schon eine Inlandsnummer probiert die von mir in org eingetragen ist.


Wird denn die enum.conf nicht berücksichtigt?


Thx

Timm

Thx

Timm
 
Zuletzt bearbeitet:
Ich sehe zwei Tippfehler. In beiden Fällen, extra Leerzeichen.

Nennen wir [enum] "Zeile null".

Erster Fehler, Zeile 4: ${ e164} muß ${e164} sein.

Zweiter Fehler, Zeile 7: ${e 164} muß ${e164} sein.

>Wird denn die enum.conf nicht berücksichtigt?

Nocheinmal, klar und deutlich: "Die Application EnumLookup ist veraltet. enum.conf ist veraltet. Ab Asterisk 1.2 wird statt EnumLookup die Funktion ${ENUMLOOKUP()} verwendet. ${ENUMLOOKUP()} verwendet enum.conf nicht. Fehlt der Parameter "zone-suffix", ist der default nur e164.arpa."

In dem [enum] Beispiel, in dem Aufruf zu ${ENUMLOOKUP()}, ist ${e164} der aktuelle Parameter "zone-suffix". Da Deine Tippfehler in beiden Fällen diesen Parameter trafen, ist es kein Wunder, daß e164.org nicht abgefragt war. Nach Behebung des Fehlers, bearbeitet dann Asterisk die ganze Liste von zone-suffixes die in Zeile 1 angegeben sind.

Ist das nicht der Fall in Deiner Anlage, dann bitte:

CLI> set verbose 3

Wähle 00018004444444.
Asterisk Dialplan Trace hier im Forum einfügen.

/john
 
Hi John,


super für Deine genaue Erklärung.
Ja das mit EnumLookup sagtest Du schon, aber ich wusste nicht das die neue Version keine enum.conf berügsichtigt.
Bei mir ist die enum.conf vorhanden und das hat mich verwirrt.

Ja jetzt geht es.
Super danke.

Wenn ich das richtig verstanden habe, dann könnte ich doch e164.info auch noch hinzufügen, die Zeile würde dann so ausschauen:

exten => _Z.,1,Set(enumlist=e164.org e164.info e164.arpa|tree=0)

Grüße

Timm
 
Zuletzt bearbeitet:
>Wenn ich das richtig verstanden habe

Genau. Die verschiedenen Zonen sind in der angegebenen Nachfolge (links nach rechts) einzeln nacheinander abgefragt.

/john
 
Hi John,


mir ist aufgefallen, dass manche Rufnummern die in e164.org stehen, von der Anlage nicht gefunden werden.


Das eigenartige dabei ist, frage ich bei http://www.sipbroker.com/sipbroker/action/enumLookup
nach, wird der Eintrag gefunden, aber die Anlage springt auf den Provider.


Kannst Du Dir das erklären?


Thx

Timm
 
Dann muß Du so machen:

CLI> set verbose 3

Und dann wählen. Dann sehen wir was eigentlich los ist.

Da Du mir die Nr (nennen wir die "0043abcdefghi" für diese Diskussion) per PM geschickt has, habe ich das gemacht. Da sehe ich, genau an der Stelle wo ${ENUMLOOKUP()} über e164.org gemacht wird, folgende Fehlermeldungen:

Jan 26 07:31:04 WARNING[787]: enum.c:255 parse_naptr: Error during regex substitution.
Jan 26 07:31:04 WARNING[787]: enum.c:347 enum_callback: Failed to parse naptr :(
Jan 26 07:31:04 WARNING[787]: dns.c:163 dns_parse_answer: Failed to parse result
Jan 26 07:31:04 WARNING[787]: dns.c:209 ast_search_dns: DNS Parse error for i.h.g.f.e.d.c.b.a.3.4.e164.org

In enum.c, sehe ich folgendes:

if (isprint(*subst)) {
*d++ = *subst++;
d_len--;
} else {
ast_log(LOG_WARNING, "Error during regex substitution.\n");
return -1;
}

Schauen wir den Eintrag i.h.g.f.e.d.c.b.a.3.4.e164.org an:

$ host -tnaptr i.h.g.f.e.d.c.b.a.3.4.e164.org

Dann sehen wir einen E2U+ADDRESS Eintrag:

order = 100, preference = 10
flags = "u"
services = "E2U+ADDRESS"
rule = "!^.*$!ADDRESS:CN=Kunden Name;STREET=Kundenstr 24;L=Kundendorf;ST=Oberîsterreich;C=Austria!"
replacement = (root)

Erstens muß ich fragen warum Asterisk den E2U+ADDRESS Eintrag überhaupt angeschaut hat. Wir haben wohl

${ENUMLOOKUP(+43abcdefghi,sip,c,e164.org)}

angegeben. Asterisk tut's aber.

Die "wide characters" führen also zu diesen Fehler. Ich habe RFC 2915 ein bißchen angeschaut. Ich bin z.Zt. überzeugt, daß mit "flags" gleich "u", solche Zeichen mussen URI-kodiert sein. Davon bin ich noch nicht sicher, und habe im Moment keine Zeit weiter danachzuschauen. Wir brauchen ein RFC 2915 internationalisierungs Expert. Ich werde dieses Problem an einen Kollegen schicken. Erwarte eine Antwort in einigen Wochen. Aber auf allen Fällen, wird Asterisk Version 1.2.14 oder früher NIE diesen Eintrag bearbeiten; der Eintrag muß bei e164.org verändert werden.
 
Zuletzt bearbeitet:
Hi John,


habe den Eintrag auf "oe" geändert und nun funktioniert es.

Man soll halt keine Umlaute verwenden.


Dank Dir Super.

Ich komme leider nicht auf die Konsole, da es ja eine "fertige Anlage" ist.
Ich habe lediglich die Möglichkeit über die Weboberfläche einige conf dateien zu ändern.

Nachmals danke.

Timm
 
Hi John,


nochmal eine Frage dazu.
In Deinem Enum Beispiel geht es ja wenn die Abfrage nagativ ist, zu einem Provider, mir wäre es aber recht, wenn statt zum Provider zur Least Cost Routing Tabelle geht, bzw. zu den default Einstellungen der einzelnen Nebenstellen, wie mache ich das?

Es sollte so sein das eben Enum eingefügt wird und wenn es keinen Enum-Eintrag gibt, dann sollte es so weitergehen als ob es gar keine Enumabfrage gegeben hat.


Thx


Timm
 
Dann nimm einfach das

exten => _Z.,n(ef),Goto(00${EXTEN},1)

am Ende, und Goto die richtige Stelle (context,extension,n), die in Deinem Dialplan zur Least Cost Routing-Tabelle führt.

Um eine genauere Antwort zu geben, bräuchte ich Deine ganze extensions.conf Datei zzg. alle weitere Dateien die mit #include in extensions.conf eingefügt sind.

--------------

Inzwischen hat mir Timmbo seine Dateien geschickt. Hier sind Teile meiner Antwort:

Diese blöden Weboberflächen!

Folgende Zeilen müssen wir aus [default-custom] entfernen:
exten => _0Z.,1,Goto(enum,43${EXTEN:1},1)
exten => _00Z.,1,Goto(enum,${EXTEN:2},1)

In sip.conf oder iax.conf oder zapata.conf (je nachdem wo Du context=52, context=53, usw. findest) änderst Du context=nn auf context=enumnn (z.B. context=52 wird context=enum52). Wenn diese Dateien auch von der Weboberfläche autogeneriert sind, dann mußt Du jedesmal wieder diese Änderung machen.

Dann in extensions_custom.conf machst Du

[enum52]
include => vorerst
[enum53]
include => vorerst
[usw...]

[vorerst]
exten => _X,1,Goto(${CONTEXT:4},${EXTEN},1) ; Kein enum
exten => _Z.,1,Goto(${CONTEXT:4},${EXTEN},1); Kein enum
exten => _0.,1,Set(Nebenstelle=${CONTEXT:4}); Wohin bei enum failure
exten => _0.,2,Goto(pre-enum,${EXTEN},1) ; Vorerst, enum versuchen

[pre-enum]
exten => _0Z.,1,Goto(enum,43${EXTEN:1},1) ; Österreich
exten => _00Z.,1,Goto(enum,${EXTEN:2},1) ; Andere Länder

Am Ende von [enum] hast Du dann (die folgende Zeile und die Zeilen davor bleiben unverändert).

exten => _Z.,n(ef),Goto(00${EXTEN},1)

; Enum lookup failed, gehen wir nach [nn] für normale LCR usw.

exten => _0043Z.,1,Goto(${Nebenstelle},0${EXTEN:4},1) ; Zurück für Österreich
exten => _00Z.,1,Goto(${Nebenstelle},${EXTEN},1) ; Zurück für andere Länder

Wohin soll ich die Rechnung schicken? :)

Oder vielleicht sollst Du Dich zu meinem halbtägigen Trainingskurs in Nürnberg am 20.4. anmelden: http://www.decus.de/symposium2007/kurse/ Kurs T2V14 am Vormittag.
 
Zuletzt bearbeitet:
Hi John,

hab mir das Asterisk Buch 1.2 -> 1.4 gekauft und hab das ganze jetzt so gelöst, funzt wirklich Prima, auch dank Deiner großen Hilfe.

Code:
[52]
include=default
include=enum-go
[nachenum52]
include=lcr
include=outgoingsipgate.at


[53]
include=default
include=enum-go
[nachenum53]
include=lcr
include=outgoingsipgate.at


[54]
include=default
include=enum-go
[nachenum54]
include=lcr
include=outgoingsipgate.at


[55]
include=default
include=enum-go
[nachenum55]
include=lcr
include=outgoingsipgate.at





[enum-go]
; 0->lokales Ortsnetz, 00->Österreich, 000->Ausland
exten => _X.,1,Set(Nebenstelle=${CALLERIDNUM})
exten => _Z.,2,Goto(nachenum${Nebenstelle},${EXTEN},1)
exten => _0Z.,2,Goto(enum,43${EXTEN:1},1)
exten => _00Z.,2,Goto(enum,${EXTEN:2},1)



[enum]
exten => _Z.,1,Set(CALLERID(number)=0043720720xxx${Nebenstelle})
exten => _Z.,n,Set(enumlist=e164.org e164.arpa|tree=0)
exten => _Z.,n,While($["${SET(e164=${CUT(enumlist, ,${SET(tree=$[${tree} + 1])})})}" != ""])
exten => _Z.,n,Set(sipcount=${ENUMLOOKUP(+${EXTEN},sip,c,${e164})}|counter=0)
exten => _Z.,n,While($[${counter}<0${sipcount}])
exten => _Z.,n,Set(counter=$[${counter}+1])
exten => _Z.,n,Gotoif($["${SET(e=${ENUMLOOKUP(+${EXTEN},sip,${counter},${e164})})}"=""]?ew)
exten => _Z.,n,Playback(/mnt/kd/accessvoip/sounds/moo)
exten => _Z.,n,Dial(SIP/${e},120)
exten => _Z.,n(ew),EndWhile
exten => _Z.,n,EndWhile
exten => _Z.,n,GotoIf($["${DIALSTATUS}"=""]?ef)
exten => _Z.,n,Noop(${DIALSTATUS})
exten => _Z.,n,Congestion()
exten => _Z.,n,Hangup
exten => _Z.,n(ef),goto(enum-lcr,00${EXTEN},1)



; Enum lookup failed
[enum-lcr]
exten => _0043Z.,1,Goto(nachenum${Nebenstelle},0${EXTEN:4},1) 
exten => _00Z.,1,Goto(nachenum${Nebenstelle},${EXTEN},1)

Guard-X: Code Tags eingefügt!
 
Hi John,

Code:
[enum]
exten => _Z.,1,Set(CALLERID(number)=0043720720xxx${Nebenste lle})
exten => _Z.,n,Set(enumlist=e164.org e164.arpa|tree=0)
exten => _Z.,n,While($["${SET(e164=${CUT(enumlist, ,${SET(tree=$[${tree} + 1])})})}" != ""])
exten => _Z.,n,Set(sipcount=${ENUMLOOKUP(+${EXTEN},sip,c,${ e164})}|counter=0)
exten => _Z.,n,While($[${counter}<0${sipcount}])
exten => _Z.,n,Set(counter=$[${counter}+1])
exten => _Z.,n,Gotoif($["${SET(e=${ENUMLOOKUP(+${EXTEN},sip,${counter},${e 164})})}"=""]?ew)
exten => _Z.,n,Playback(/mnt/kd/accessvoip/sounds/moo)
exten => _Z.,n,Dial(SIP/${e},120)
exten => _Z.,n(ew),EndWhile
exten => _Z.,n,EndWhile
exten => _Z.,n,GotoIf($["${DIALSTATUS}"=""]?ef)
exten => _Z.,n,Noop(${DIALSTATUS})
exten => _Z.,n,Congestion()
exten => _Z.,n,Hangup
exten => _Z.,n(ef),goto(enum-lcr,00${EXTEN},1)

Edit Guard-X: Code Tags eingefügt!


bei Deinem enum-Script wollte ich noch fragen wie es sich verhält, wenn die Antwort auf die Abfrage z.B. TEL: 43664123456 wäre?

Ist dann das verhalten so wie wenn keine Antwort käme und die eingegebene Rufnummer wird dann über Festnetz gewählt, oder nimmt er die in Enum eingetragene Nummer und wählt die über Festnetz?

Ich wollte das selbst ausprobieren, jedoch scheint es einen Enumcache zu geben, da die Änderung in ENUM keine Wirkung zeigt.


Grüße und Danke.


Timm
 
funzt wirklich Prima

@Timmbo. Hast du an dieser Konfiguration in der Zwischenzeit etwas geändert? Für mich stellt sich nun genau deine Frage. Ich bin auch auf die enum.conf reingefallen ;-)

Telefoniert wird nur über VOIP mit Standort Österreich, allerdings verwende ich keine 0 um rauszutelefonieren, sondern "manuelles" LCR mit *XX. ENUM-Abfrage soll mindestens in arpa und org vor jedem Gespräch stattfinden.

Wenn du Änderungen durchgeführt hast, wäre es nett, wenn du deine Konfiguration posten würdest.
 
Hi,

nee habe nichts geändert, wie eh und je.

Grüße
Timm
 
Ich versuche die ENUM-Abfrage an meine Situration anzupassen. das ist vor allem keine 0 als Vorwahl für externe Gespräche. Dazu habe ich probiert, einfach nur die Ausgabe auf die Konsole zu leiten und danach zu wählen, das klappt aber gar nicht und bringt die Meldung "extension not found"

Code:
[test20_out]
exten => _*20Z.,1,NoOp("Enum Abfrage OHNE Ortskennzahl 431${EXTEN:4}")
exten => _*20Z.,n,Dial,SIP/00431${EXTEN:3}@20_yesss21|45|r
exten => _*200Z.,n,NoOp("Enum Abfrage MIT Ortskennzahl 43${EXTEN:4}")
exten => _*200Z.,n,Dial,SIP/0043${EXTEN:4}@20_yesss21|45|r
exten => _*2000Z.,n,NoOp("Enum Abfrage mit Landeskennzahl ${EXTEN:5}")
exten => _*2000Z.,n,Dial,SIP/${EXTEN:3}@20_yesss21|45|r
 
Probier mal
Code:
exten => _*20Z.,1,Set(enumresult=${ENUMLOOKUP(+431${EXTEN:4})},sip,,1,e164.org)
exten => _*20Z.,n,Dial,SIP/${enumresult}|55|r
exten => _*20Z.,n,Dial,SIP/00431${EXTEN:3}@20_yesss21|55|r

Gruß,
Wichard
 
Danke für deine Antwort, aber ich habe deinen Vorschlag noch nicht verstanden.

Müsste die Vorgehensweise nicht so sein, dass man zuerst aus der gewählten Rufnummer einen Zeichenkette baut die für eine ENUM-Abfrage brauchbar ist? Also für den Fall, dass nicht 00Land-Ortsvorwahl-Nummer gewählt wurde, entsprechend zu ergänzen? Dabei scheitere ich nämlich schon unter der Voraussetzung, dass nach extern keine 0 vrogewählt wird. Es ist zB alles extern, das nicht 20-29 bzw.40-49 ist.

Du gehst davon aus, dass mit 431 ergänzt wird, das ist aber natürlich nicht immer so.

Möchtest du, dass ich deinen Code teste, ob es grundsätzlich funktioniert? Mir ist es wichtig, dass ich die Idee verstehe, die dahinter steckt.
 
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.