.titleBar { margin-bottom: 5px!important; }

Fragen zu Trunks/Outbound Routing/DID

Dieses Thema im Forum "FreePBX, TrixBox (Asterisk@Home)" wurde erstellt von Darkstar23483, 25 Juli 2005.

  1. Hallo an alle,

    momentan versuche ich mich durch die Einstellungen für Sipgate in Asterisk zu lesen, verbringe auch schon mind. 6 Std. allein schon heute in dem Portal also geht davon aus das ich passende Beiträge schon gelesen habe :)

    Ich hab versucht die Einstellungen aus Sipgate zu übernehmen mit meinen passenden Daten und diese in Trunks eingerichtet. Ich bekomme nun bei ausgehenden Anrufen "circuit busy", was auch im asterisk log file steht, mehr kann ich zum Fehler nicht sagen, allerdings weis ich auch nicht ob ich richtig konfiguriert habe....(siehe unten)

    1) Bevor ich näher auf die Problematik an sich eingehe habe ich zunächst folgendes Problem. Hier wird oft bezüglich der Einstellungen für Sipgate die sip.conf und die extension.conf gezeigt mit den jeweiligen Einstellungen. Wenn ich allerdings z.B über GUI des * arbeite und beispielsweise Quellcode in Outgoing und incoming bei Trunks eingebe sind diese später in sip_additional.conf gespeichert und nicht in der sip.conf, und bei 80% der hier geziegten beiträge steht der Quellcode unter => [general] bei der sip.conf. Nun frag, wo gebe ich es richtig ein...Soll ich mit den Configurationsdateien direkt arbeiten oder kann ich das auch über die grafische oberfläsche einrichten (wäre ja eigentlich vorteilhaft, das is ja grad das benutzerfreundliche an *)

    2) ich finde bei sipgate eine Anleitung um den Trunk für Asterisk einzurichten, was wie folgt aussieht...


    sip.conf

    Code:
    
    [general] 
    port = 5060 
    bindaddr = 0.0.0.0 
    context = sip-out 
    qualify=no 
    disable=all 
    allow=alaw 
    allow=alaw 
    allow=ulaw 
    allow=g729 
    allow=gsm 
    allow=slinear 
    srvlookup=yes 
    canreinvite=yes 
    language=de 
    register => SIPID:PASSWD@sipgate.de/SIPID 
    
    [sipgate-out] 
    type=friend 
    insecure=very ; otherwise I get authentication errors 
    nat=yes 
    username=SIPID 
    fromuser=SIPID 
    fromdomain=sipgate.de 
    secret=SIPPW 
    host=sipgate.de 
    qualify=yes 
    
    
    extension.conf

    Code:
    
    [sipout] 
    exten => _X.,1,SetCallerId,SIPID 
    exten => _X.,2,Dial(SIP/${EXTEN}@sipgate-out,30,trg) 
    exten => _X.,3,Hangup 
    
    
    Wenn ich die Schritte der Reihe nach verfolge, Frage ich mich zunächst wieder wegen [general] ob ich das überhaupt über GUI eingeben kann, denn dann landet ja wie gesagt alles in der sip_additional.conf. Gebe ich den Part nämlich ins GUI ein so landet es in der sip_additional unter dem Eintrag ["OutboundTrunkName", z.B die Nummer]

    Der nächste Schritt ist [Sipgate-Out]...wo soll der Part eingegeben werden?

    Und beim letzten Teil, der Extension finde ich ehrlich gesagt in der GUI überhaupt keine Möglichkeit diesbezüglich etwas einzugeben.
     
  2. Holg

    Holg Neuer User

    Registriert seit:
    17 Sep. 2004
    Beiträge:
    139
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Hi Darkstar23483,

    Also unter [general] brauchst du nur die Einstellungen vorzunehmen, die generell für alle SIP Zugänge gelten.

    Wenn du nur einen SIP-Zugang hast, dann ist es im Prinzip egal, wo du Einstellungen wie z.B. serverlookup oder disallow und allow setzt. Prinzipiell ist aber besser, Account spezifische Einstellungen unter einen TRUNK zu packen.

    Zu den Trunks:

    Ein Trunk wird in 4 Teile unterteilt:

    1) Outgoing:

    Hier werden alle Einstellungen getroffen, die beim heraustelefonieren über diesen Trunk / Account wichtig sind. So z.B. username, host, secret, insecure etc. Dieser Teil benötigt keinen context, da es sich ja um abgehende Verbindungen handelt.

    2) Incomming:
    Hier sollte man definieren können, was passiert (in welchen context geprungen wird), wenn ein Anruf über diesen Trunk hereinkommt. Ich persönlich nutze diesen Teil nicht, da ich meine reinkommenden Gespräche über die DIDs konfiguriere. Dazu aber später mehr.

    3) Dialroutes:
    Hier wird definiert, für welche gewählten Nummern der Trunk rauswählen soll. Bsp:

    030+ZXX.
    hier würde er für jede Nummer die nicht mit einer Null anfängt, noch die 030 vorne dran setzten. Das bedeutet ich wähle 123456 und der Trunk macht daraus 030123456. Das ist sinnvoll für Ortsgespräche (in diesem Fall Berlin)

    [0]X.
    Hier lässt der Trunk alle Nummern passieren, die mit einer 0 Anfangen.
    0163123456, 02212345678
    Dieser Punkt darf nicht vergessen werden, sonst tut sich, wenn du eine Nummer mit einer Null am Anfang wählst gar nichts auf dem *chen und du wunderst dich.

    4) Registry-String
    Der "wichtigste" Teil um angerufen zu werden. Hier wird der Registrierungsstring angegeben. Wichtig ohne 'register =>'
    Du hast geschrieben, dass du dein Registerstring in sip.conf gesetzt hast. Das macht wegen der dynamischen Verwaltung vom AMP nicht sonderlich Sinn, da du jedes Mal erst in die Config gehen müsstest, um den Register-Eintrag zu setzten. Also viel einfacher im Trunk selber.

    Algemeines:
    Die angelegten Trunks werden in sip_additional.conf abgelegt. Diese Datei wird in der sip.conf durch die Zeile "#include sip_additional.conf" eingebungen und steht praktisch (man kann es sich zumindest so vorstellen) zur Laufzeit auch in sip.conf.
    Wenn du in deinem Trunk unter incomming die User-Details angibst, dann nenn den "User Context" so wie deine SIP-ID.

    Nicht dadurch verwirren lassen, dass in sip_additional.conf sowohl für incomming als auch für outgoing eine eigene Konfiguration angelegt wird.

    Wichtig ist in diesem Zusammenhang noch vielleicht, dass man den Unterschied zwischen peer, user und friend kennt.

    Peer - das kann man sich so vorstellen wie eine Möglichkeit heraus zu telefonieren

    User - Ist die Möglichekeit sich als "User" anzumelden, um Gespräche entgegen zu nehmen

    Friend - Beinhaltet beides (empfangen und senden)

    Also sollte man es in dem Trunk auch gleich richtig einstellen und dem Incoming Teil ein type=user mitgeben und dem Outgoing ein type=peer.
    Es funktioniert (vor allem beim outgoing) zwar auch mit friend, ist dann aber nicht ganz korrekt.


    Den nächsten wichtigen Punkt, damit man AMP verstehen und richtig konfigurieren kann sind die Unterschiedlichen config-Dateien.

    Prinzipiell: Soweit ich das mitbekommen habe (man darf mich an dieser Stelle auch gerne verbessern ist es so:

    In den Standard-confs, also z.B. sip.conf und extension.conf kann man etwas Handarbeit anlegen. Sollte man aber nicht zu sehr tun, da bei einem Upgrade möglicher Weise allet wech is.

    In den additional.confs kann man nichts ändern, zumindest nicht sehr lange, da sich diese oft dynamisch aus der Datenbank generieren.

    die custom-confs können beliebig geändert werden, wichtig ist nur hier, dass in dem Titel eines context die zeichen -custom vorkommen. Also z.B. [mein-toller-context-custom]

    In den Additional-conf, sind immer custom-confs mit eingebunden (include), damit man den Context nach seinem Ermessen erweitern kann. Wichtig vor allem für das Outbound-Routing. Mehr dazu weiter unten.

    Der wohl wichtigste Context ist der Einstiegs-Kontext, der entweder über die generellen Sip-Einstellungen (sip.conf), die trunkspezifischen Incoming-Setting oder die DIDs gesetzt wird.

    Eingehenden Gespräche entgegennehme:

    1. Möglichkeit

    Wenn du nur ein sipgate Account hast, dann kannst du in der sip.conf einfach als context den "from-sip-external" angeben. Wenn du das machst, musst du noch über Config-Edit in der extensions.conf unter "from-sip-external" (Shortcut am linken Rand) daruaf achten, dass deine Gepräche auch weitergeleitet werden. Im Normalfall steht da nähmlich folgendes:

    [from-sip-external]

    give external sip users congestion and hangup
    exten => _.,1,AbsoluteTimeout(15)
    exten => _.,2,Congestion
    exten => _.,3,Hangup

    es sollte aber folgendes da stehen:

    [from-sip-external]

    ;give external sip users congestion and hangup
    ;exten => _.,1,AbsoluteTimeout(15)
    ;exten => _.,2,Congestion
    ;exten => _.,3,Hangup

    exten => _.,1,NoOp(Test)
    exten => _.,2,Goto(from-pstn,s,1)

    Nachteil, wenn du alle eingehenden SIP-Gespräche über from-sip-external entgegen nimmst, ist es nicht ohne großen Aufwand möglich Anrufe auf verschiedene Nummern zu unterscheiden.
    Bsp:
    Ich habe zwei Nummern 030123456789 und 030987654321. Mit der eben beschriebenen Methode kann man nicht ohne relativ hohen Aufwand verschiedene Telefone den Nummern zuorden... ja ich weiss es geht, aber der Aufwand lohnt nicht, da man mit den DIDs eine sehr einfache Möglichkeit bekommt

    2.Möglichkeit

    DIDs.
    Das sieht kompliziert aus ist aber eigenlich ganz einfach. Hierfür musst du deine Benutzerkennung von sipgate in das Feld DID Number eintragen. Jetzt noch unten Angeben, was passieren soll, wenn der Anruf aufgespürt wird. Hier empfielt es sich eine Ring-Group anzugeben (anzulegen), selbst wenn man nur eine Extension klingeln lassen will. Vorteil man hat über die Ring-Group Einstellungen mehr und individueller Möglichkeiten AB-Antwortzeiten zu setzten etc.

    Damit das ganze funktioniert musst du in der sip.conf als context den ext-did angeben. Also:

    context = ext-did

    Bei den DIDs kann es sein, das man ein wenig mit der DID Nummer rumprobieren muss. Bei mir (ich habe eine alte sipgate userid, wo die userid noch teil der rufnummer ist) musste ich einfach nur die userid angeben. Andere Möglichkeiten sind noch die Rufnummer, dann muss man aber glaube ich ein s/ oder etwas anderes davor sezten.

    Zum Testen würde ich wiederunter extensions.conf folgendes zurück ändern:

    [from-sip-external]

    give external sip users congestion and hangup
    exten => _.,1,AbsoluteTimeout(15)
    exten => _.,2,Congestion
    exten => _.,3,Hangup

    und in der sip.conf context=from-sip-external setzten, dann sieht man nämlich, ob die DID-Nummer stimmt. Fall das nicht der Fall ist führt das *chen immer den Abschnitt unter [from-sip-external] aus. Wenn die DID Nummer stimmt, dann sollte es klingeln.

    [edit] Die DID-Nummer müsste eigentlich dem Teil hinter dem letzten Schrägstrich aus dem Registrierungsstring entsprechen.
    Bsp.: 1234567:geheim@sipgate.de/1234567
    also in diesem Falle 1234567
    [/edit]

    3.Möglichkeit (hab ich selbst noch nicht probiert)

    Es müsste theoretisch auch möglich sein, die Anrufe über die incoming Settings des Trunks zu definieren. Dann einfach unter user-details context=ext-did, from-sip-external oder irgenwas -custom mäßiges setzten.


    Outbound-Routes:

    Standardmäßig wird immer die erste eingetragene und funktionierende Outbound-Route zum rauswählen benutzt. Mehrere Outbound-Routes machen nur Sinn wenn man verschiedene abgehende Rufnummern den extensions zuweisen will und wenn man ein ISDN-Telefon hinter dem *chen betreibt:

    Beispiel:

    Ich habe wieder meine beiden Nummern

    030123456789
    und
    030987654321

    desweiteren besitze ich zwei Telefone einmal extension 11 und einmal 12, dabei ist es egal ob SIP oder ZAP extensions.

    Ich hätte gerne das die 11 für 030123456789 klingelt und die 12 für 030987654321.

    Das kann ich über die Outbound-Routes verwirklichen. Ich lege mir einfach für jede Rufnummer eine Outbound-Route an ung gebe unter Trunk Sequence einfach den Trunk an, der die Nummer 030123456789 besitz.
    Jetzt muss ich unter der extension 11 noch den context outrt-ReihenfolgeDerOutBoundRoute-NameDerOutboundRoute (also bspw.: outrt-001-Sipgate123456789) angeben, damit die extension auch immer die richtige Outbound-Route benutzt. Lasse ich hier im Feld context den Wert from-interal stehen, dann wird, wie bereits erwähnt die erste passende Outbount-Route zum rauswählen benutzt. (Die eigentliche Auswahl wird dann übrigens über den include Eintrag "include => outbound-allroutes" eingebunden. Dieser context bindet alle outbound-Routes in der extensions_additional.conf ein und da sequentiell abgearbeitet wird, wird die erste passende Outbound-Route zum rauswählen benutzt)


    Allgemeines zu den Outbound-Routes
    Der erste Blick gilt den Dial Patterns. Hier reicht eigentlich ein einfaches X., damit alle Nummern durchgelassen werden.

    Man kann auch auf verschiedene Trunks hinzufügen, die beim rauswählen sequentiell im Falle von Besetzt oder Ausfall benutzen werden sollen.

    Der wichtigste Teil und leider verborgene Teil steckt aber in extensions_additional.conf. Hier findet man unter outrt-XXX-NameDerOutboundRoute das Rauswähl-Verhalten.

    Diesen etwas "kryptischen" context muss man in der jeweiligen extension unter Setup->Extension->Context angeben. Dann benutzt asterisk zum rauswählen für die ausgewählte Extension die angebenen Outboud-Route, der man einen Trunk und somit eine Rufnummer zuordnen kann.

    Willst du alle tolle Sachen wie zum Beispiel Mailbox usw. auch über die Outbound-Route erreichen, bedarf es eines kleinen manuellen Eingriffes.

    Ich habe dazu in der extensions_custom.conf ein extra context outbound-internal-custom eingtragen der alle Funktionen des *chens bereit stellt. Das ganze sieht dann in etwa so aus:

    [outbound-internal-custom]
    ;allow phones to use applications
    include => app-directory
    include => app-dnd
    include => app-callforward
    include => app-callwaiting
    include => app-messagecenter
    include => app-calltrace
    include => parkedcalls
    include => from-internal-custom
    ;allow phones to dial other extensions
    include => ext-fax
    include => ext-local
    include => ext-group
    include => ext-queues
    include => ext-zapbarge
    include => ext-meetme
    include => ext-record
    include => ext-test

    dieser context muss jetzt noch über den custom context, der bei jeder outbound-route eingebunden wird (egal ob vorhanden oder nicht) eingebunden werden. Dazu ergänzt man einfach wieder in der extensions_custom.conf einen weiteren context, der wie der [outrt-XXX-NameDerOutboundRoute] aussieht, lediglich um den Zusatz '-custom' erweitert wird. Also [outrt-XXX-NameDerOutboundRoute-custom]

    darin sollte dann der oben erstellte context eingebunden werden, also wie folgt:
    [outrt-XXX-NameDerOutboundRoute-custom]
    include => outbound-internal-custom

    damit seht der ganze Kladeradatsch der unter outbound-internal-custom steht auch unter outrt-XXX-NameDerOutboundRoute zur Verfügung. Und somit muss man auch nicht auf seine Mailbox, die Wetter- oder Zeitansage über die Outbound-Routes verzichten.

    Soweit zu dem Allgemeinen Überblick....

    Zu deinem konkreten Problemen noch einmal:

    1) sip.conf
    meine sieht so aus

    meine Trunk Einstellungen sind folgende

    dabei darauf achten, dass das Passwort und der username stimmt, das hat mich schon einmal fast einen ganzen Tag Haare raufen gekostet....

    bei context musst du das setzten was am besten zu deinem Anschluss passt, entweder ext-did, dann DID definieren oder aber eben from-sip-external, dann unter [from-sip-external] in extensions.conf die Einträge wie oben beschrieben ändern.

    Den Eintrag [sipout] kannst du demnach auch gleich wieder raushauen, da er durch ext-did oder from-external-sip nicht mehr benötigt wird.

    Generell vielleicht noch einmal zum Unterschied zwischen asterisk und asterisk@home. Unter asterisk muss man sich seine extensions.conf selber zusammen bauen. Unter asterisk@home ist das nicht der Fall. Hier sind schon ziemlich viele Sachen "implementiert", die zum Teil etwas verändert werden müssen.

    Mann kann es ein wenig mit der Erfindung des Rads vergleichen, wenn ich asterisk neu aufsetzte, dann erfinde ich praktisch das Rad neu und es dauert wirklich eine Ewigkeit bis das Rad rund läuft. Unter asterisk@home wurde das Rad bereits erfunden und ich muss es nur ein wenig justieren. Dieses Justieren kann sicherlich auch in einigen Fällen sehr lange dauern, aber meistens geht es sehr schnell.
    Probleme hat man vor allem wenn man nicht weiss, dass ein Rad rund ist, dann ist es auch egal ob man eins erfinden oder justieren muss - beides saumäßig schwierig. Wenn man sich aber das Grundverständnis aneignet, durch probieren, fragen, lesen und helfen, dann kann man sich auch irgendwann relativ entspannt auf seinen asterisk-Karren setzt und durch die Weltgeschichte fahren.


    Hoffe ich konnte dir weiterhelfen...

    Gruß
    Holle
     
  3. Erstmal vielen vielen Dank für deine Anleitung, großes Lob. Ich werd jetzt mal die nächsten paar Stunden die einzelnen Punkte genauer bearbeiten in meiner Konfiguration und dann mal posten, was Sache ist :).
     
  4. Also...

    ich habe mich nun mal die letzten Stunden mit deinen Anweisungen und einer anderen Forendiskussion (Thema: Basiskonfig/Sipgate/IP-Routing) auseinander gesetzt. Zunächst einmal hat sich mein Fehler verändert...

    ...die freundliche Frauenstimme teilt mir bei ausgehenden anrufen nun nicht mehr "all circuits are busy" mit, sondern etwas in der Art: "call forward(ing) are busy for extension 201 (die mit der ich versuche zu wählen)", danach wiederholt sie dann noch die Nummer die ich wählen wollte.

    Ich bin folgendermaßen vorgegangen.

    1) Bei dem anderen Thema (siehe oben) ist von Routern die Rede gewesen und diesbezüglich hab ich dann erstmal Prot-forwarding für den Asterisk Server am Router konfiguriert. Ebenso habe ich ein paar sip.conf Einträge geändert und die Trunk Einstellungen mal nach dem dortigen
    Schema geändert.

    2) Danach bin ich dann mal deine ganzen Punkte durchgegangen und habe alles so weit ich es nachvollziehen konnte, und möglichst nur das was nötig war geändert.

    Ich hoffe ich habe inzwischen nicht den Überblick verloren und um dumme Fehler auszuschliesen und den aktuellen Stand der Dinge mal zu zeigen Poste ich mal die ganzen sip und ext. Konfigs.

    extension.conf

    Code:
    
    ; Asterisk Management Portal (AMP)
    ; Copyright (C) 2004 Coalescent Systems Inc
    
    ; dialparties.agi (http://www.sprackett.com/asterisk/)
    ; Asterisk::AGI (http://asterisk.gnuinter.net/)
    ; gsm (http://www.ibiblio.org/pub/Linux/utils/compress/!INDEX.short.html)
    ; loligo sounds (http://www.loligo.com/asterisk/sounds/)
    ; mpg123 (http://voip-info.org/wiki-Asterisk+config+musiconhold.conf)
    
    
    ; include extension contexts generated from AMP
    #include extensions_additional.conf
    
    ; Customizations to this dialplan should be made in extensions_custom.conf
    ; See extensions_custom.conf.sample for an example
    #include extensions_custom.conf
    
    [from-trunk]							; just an alias since VoIP shouldn't be called PSTN
    include => from-pstn
    
    [from-pstn]
    include => from-pstn-custom			; create this context in extensions_custom.conf to include customizations
    include => ext-did
    include => from-pstn-timecheck 		; this has to be included otherwise it overrides ext-did
    
    [from-pstn-timecheck]
    exten => .,1,Goto(s,1)		; catch-all matching for calls that have DID info (if a DID route hasn't matched them)
    exten => s,1,GotoIf($[${IN_OVERRIDE} = forcereghours]?from-pstn-reghours,s,1:)
    exten => s,2,GotoIf($[${IN_OVERRIDE} = forceafthours]?from-pstn-afthours,s,1:)
    exten => s,3,GotoIfTime(${REGTIME}|${REGDAYS}|*|*?from-pstn-reghours,s,1:)
    exten => s,4,Goto(from-pstn-afthours,s,1)
    
    [from-pstn-reghours]
    exten => s,1,GotoIf($[${FAX_RX} = disabled]?from-pstn-reghours-nofax,s,1:2)	; if fax detection is disabled, then jump to from-pstn-nofax - else continue
    exten => s,2,Answer	
    exten => s,3,Wait(1)
    exten => s,4,SetVar(intype=${INCOMING})
    exten => s,5,Cut(intype=intype,-,1) 
    exten => s,6,GotoIf($[${intype} = EXT]?7:9)		; If INCOMING starts with EXT, then assume its an extension
    exten => s,7,Wait(3) 							;wait 3 more second to make sure this isn't a fax before dialing someone
    exten => s,8,Goto(ext-local,${INCOMING:4},1)
    exten => s,9,GotoIf($[${intype} = GRP]?10:12) 	; If INCOMING starts with GRP, then assume its a ring group
    exten => s,10,Wait(3)
    exten => s,11,Goto(ext-group,${INCOMING:4},1)
    exten => s,12,GotoIf($[${intype} = QUE]?13:15)
    exten => s,13,Wait(3)
    exten => s,14,Goto(ext-queues,${INCOMING:4},1)
    exten => s,15,Goto(${INCOMING},s,1) 			; not EXT or GR1 - it's an auto attendant
    exten => fax,1,Goto(ext-fax,in_fax,1)
    exten => h,1,Hangup
    
    [from-pstn-reghours-nofax]
    exten => s,1,SetVar(intype=${INCOMING})
    exten => s,2,Cut(intype=intype,-,1) 
    exten => s,3,GotoIf($[${intype} = EXT]?4:5)		; If INCOMING starts with EXT, then assume its an extension
    exten => s,4,Goto(ext-local,${INCOMING:4},1)
    exten => s,5,GotoIf($[${intype} = GRP]?6:7) 	; If INCOMING starts with GRP, then assume its a ring group
    exten => s,6,Goto(ext-group,${INCOMING:4},1)
    exten => s,7,GotoIf($[${intype} = QUE]?8:11) ;queue
    exten => s,8,Answer        						; answer call before queue
    exten => s,9,Wait(1)
    exten => s,10,Goto(ext-queues,${INCOMING:4},1)
    exten => s,11,Answer        						; answer call before auto attendant
    exten => s,12,Wait(1)							
    exten => s,13,Goto(${INCOMING},s,1) 				; not EXT or GR1 - it's an auto attendant
    exten => fax,1,Goto(ext-fax,in_fax,1)
    exten => h,1,Hangup
    
    [from-pstn-afthours]
    exten => s,1,GotoIf($[${FAX_RX} = disabled]?from-pstn-afthours-nofax,s,1:2)	; if fax detection is disabled, then jump to from-pstn-nofax - else continue
    exten => s,2,Answer	
    exten => s,3,Wait(1)
    exten => s,4,SetVar(intype=${AFTER_INCOMING})
    exten => s,5,Cut(intype=intype,-,1) 
    exten => s,6,GotoIf($[${intype} = EXT]?7:9)		; If INCOMING starts with EXT, then assume its an extension
    exten => s,7,Wait(3) 							;wait 3 more second to make sure this isn't a fax before dialing someone
    exten => s,8,Goto(ext-local,${AFTER_INCOMING:4},1)
    exten => s,9,GotoIf($[${intype} = GRP]?10:12) 	; If INCOMING starts with GRP, then assume its a ring group
    exten => s,10,Wait(3)
    exten => s,11,Goto(ext-group,${AFTER_INCOMING:4},1)
    exten => s,12,GotoIf($[${intype} = QUE]?13:15)
    exten => s,13,Wait(3)
    exten => s,14,Goto(ext-queues,${AFTER_INCOMING:4},1)
    exten => s,15,Goto(${AFTER_INCOMING},s,1) 			; not EXT or GR1 - it's an auto attendant
    exten => fax,1,Goto(ext-fax,in_fax,1)
    exten => h,1,Hangup
    
    [from-pstn-afthours-nofax]
    exten => s,1,SetVar(intype=${AFTER_INCOMING})
    exten => s,2,Cut(intype=intype,-,1) 
    exten => s,3,GotoIf($[${intype} = EXT]?4:5)		; If INCOMING starts with EXT, then assume its an extension
    exten => s,4,Goto(ext-local,${AFTER_INCOMING:4},1)
    exten => s,5,GotoIf($[${intype} = GRP]?6:7) 	; If INCOMING starts with GRP, then assume its a ring group
    exten => s,6,Goto(ext-group,${AFTER_INCOMING:4},1)
    exten => s,7,GotoIf($[${intype} = QUE]?8:11) ;queue
    exten => s,8,Answer        						; answer call before queue
    exten => s,9,Wait(1)
    exten => s,10,Goto(ext-queues,${AFTER_INCOMING:4},1)
    exten => s,11,Answer        						; answer call before auto attendant
    exten => s,12,Wait(1)							
    exten => s,13,Goto(${AFTER_INCOMING},s,1) 				; not EXT or GR1 - it's an auto attendant
    exten => fax,1,Goto(ext-fax,in_fax,1)
    exten => h,1,Hangup
    
    ; ############################################################################
    ; Macros [macro]
    ; ############################################################################
    
    ; Rings one or more extensions.  Handles things like call forwarding and DND
    ; We don't call dial directly for anything internal anymore.
    ; ARGS: $TIMER, $OPTIONS, $EXT1, $EXT2, $EXT3, ...
    ; Use a Macro call such as the following: 
    ;  Macro(dial,$DIAL_TIMER,$DIAL_OPTIONS,$EXT1,$EXT2,$EXT3,...)
    [macro-dial]
    exten => s,1,AGI,dialparties.agi
    exten => s,10,Dial(${ds})   				; dialparties will set the priority to 10 if $ds is not null
    exten => s,20,Wait(1)						; dialparties will set priority to 22 if was direct call and caller is on phone
    exten => s,21,Voicemail(b${ARG3})           ; The call was internal to extension, and was busy
    exten => o,1,Background(one-moment-please)	; 0 during vm message will hangup
    exten => o,2,goto(from-pstn,s,1)
    
    ; Ring an extension, if the extension is busy or there is no answer send it
    ; to voicemail
    ; ARGS: $VMBOX, $EXT
    [macro-exten-vm]
    exten => s,1,Setvar(FROMCONTEXT=exten-vm)
    exten => s,2,GotoIf($[${CHANNEL:0:5} = Local]?novm,1:3)  ; if the channel is Local, then do not go to voicemail.  This is primarily to avoid vm for call-forwarded extensions in ring groups
    exten => s,3,GotoIf($[${ARG1} = novm]?novm,1)
    exten => s,4,Macro(dial,${RINGTIMER},${DIAL_OPTIONS},${ARG2})
    exten => s,5,Wait(1)
    exten => s,6,Voicemail(u${ARG1})      ; no answer to voicemail
    exten => s,7,Macro(hangupcall)
    exten => s,106,Wait(1)
    exten => s,107,Voicemail(b${ARG1})
    exten => o,1,Background(one-moment-please)	; 0 during vm message will hangup
    exten => o,2,goto(from-pstn,s,1)
    exten => a,1,Goto(app-directory,*411,1)
    exten => a,2,Hangup
    exten => novm,1,Macro(dial,120,${DIAL_OPTIONS},${ARG2})
    exten => novm,2,Wait(1)
    exten => novm,3,Playback(vm-nobodyavail)
    exten => novm,4,Playback(allison7/pls-try-call-later)
    exten => novm,5,Hangup
    
    [macro-vm]
    exten => s,1,Voicemail(u${ARG1})      ; no answer to voicemail
    exten => s,2,Hangup
    exten => o,1,Background(one-moment-please)	; 0 during vm message will hangup
    exten => o,2,goto(from-pstn,s,1)
    exten => a,1,Goto(app-directory,*411,1)
    exten => a,2,Hangup
    
    ; For some reason, if I don't run setCIDname, CALLERIDNAME will be blank in my AGI
    ; ARGS: none
    [macro-fixcid]
    exten => s,1,SetCIDName(${CALLERIDNAME})
    
    ; Ring groups of phones
    ; ARGS: comma separated extension list
    [macro-rg-group];
    exten => s,1,Setvar(GRP=${GROUP})   ;my original choice of variable GROUP is now overwritten by SetGroup.  Copy contents to GRP
    exten => s,2,SetGroup(${CALLERIDNUM})
    exten => s,3,Setvar(FROMCONTEXT=rg-group)
    exten => s,4,SetCIDName(${PRE}${CALLERIDNAME})
    exten => s,5,Macro(dial,${RINGTIMER},${DIAL_OPTIONS},${GRP})
    
    ;
    ; Outgoing channel(s) are busy ... inform the client
    ;
    [macro-outisbusy]
    exten => s,1,Playback(allison7/all-circuits-busy-now)
    exten => s,2,Playback(allison7/pls-try-call-later)
    exten => s,3,Macro(hangupcall)
    
    ; What to do on hangup.
    [macro-hangupcall]
    exten => s,1,ResetCDR(w)
    exten => s,2,NoCDR()
    exten => s,3,Wait(5)
    exten => s,4,Hangup
    
    [macro-faxreceive]
    exten => s,1,SetVar(FAXFILE=/var/spool/asterisk/fax/${UNIQUEID}.tif)
    exten => s,2,SetVar(EMAILADDR=${FAX_RX_EMAIL})
    exten => s,3,rxfax(${FAXFILE})
    exten => s,103,SetVar(EMAILADDR=${FAX_RX_EMAIL})
    exten => s,104,Goto(3)
    
    ; dialout and strip the prefix
    [macro-dialout]
    exten => s,1,GotoIf($[foo${ECID${CALLERIDNUM}} = foo]?4) 	;check for CID override for exten
    exten => s,2,SetCallerID(${ECID${CALLERIDNUM}})
    exten => s,3,Goto(6)
    exten => s,4,GotoIf($[foo${OUTCID_${ARG1}} = foo]?6) 		;check for CID override for trunk
    exten => s,5,SetCallerID(${OUTCID_${ARG1}})
    exten => s,6,SetVar(length=${LEN(${DIAL_OUT_${ARG1}})})
    exten => s,7,Dial(${OUT_${ARG1}}/${ARG2:${length}})
    exten => s,8,Congestion
    exten => s,108,Macro(outisbusy)
    
    
    ; dialout using default OUT trunk - no prefix
    [macro-dialout-default]
    exten => s,1,GotoIf($[foo${ECID${CALLERIDNUM}} = foo]?4) 	;check for CID override for exten
    exten => s,2,SetCallerID(${ECID${CALLERIDNUM}})
    exten => s,3,Goto(6)
    exten => s,4,GotoIf($[foo${OUTCID} = foo]?6) 	;check for CID override for trunk
    exten => s,5,SetCallerID(${OUTCID})
    exten => s,6,Dial(${OUT}/${ARG1})
    exten => s,7,Congestion
    exten => s,107,Macro(outisbusy)
    
    ; dialout using a trunk, using pattern matching (don't strip any prefix)
    ; arg1 = trunk number, arg2 = number
    [macro-dialout-trunk]
    exten => s,1,GotoIf($[foo${ECID${CALLERIDNUM}} = foo]?4)        ;check 
    for CID override for exten
    exten => s,2,SetCallerID(${ECID${CALLERIDNUM}})
    exten => s,3,Goto(6)
    exten => s,4,GotoIf($[foo${OUTCID_${ARG1}} = foo]?6)            ;check 
    for CID override for trunk
    exten => s,5,SetCallerID(${OUTCID_${ARG1}})
    exten => s,6,SetGroup(OUT_${ARG1})
    exten => s,7,CheckGroup(${OUTMAXCHANS_${ARG1}})
    ; if we've used up the max channels, continue at 108 (n+101)
    exten => s,8,SetVar(DIAL_NUMBER=${ARG2})
    exten => s,9,SetVar(DIAL_TRUNK=${ARG1})
    exten => s,10,AGI(fixlocalprefix) ; this sets DIAL_NUMBER to the proper dial string for this trunk
    exten => s,11,Dial(${OUT_${ARG1}}/${OUTPREFIX_${ARG1}}${DIAL_NUMBER})
    ; if dial fails (ie, all channels are busy), continue at 112 (n+101)
    
    ; we should only get here if the call was successful (?)
    exten => s,9,Congestion
    
    ; exit points for macro
    exten => s,108,NoOp(max channels used up)
    exten => s,112,NoOp(dial failed)
    
    [macro-agent-add]
    exten => s,1,Wait(1)
    exten => s,2,GotoIf($[foo${ARG2} = foo]?4:3))
    exten => s,3,Authenticate(${ARG2})
    exten => s,4,AddQueueMember(${ARG1})
    exten => s,5,Wait(1)
    exten => s,6,Playback(agent-loginok)
    exten => s,7,Hangup()
    
    [macro-agent-del]
    exten => s,1,Wait(1)
    exten => s,2,RemoveQueueMember(${ARG1})
    exten => s,3,Wait(1)
    exten => s,4,Playback(agent-loggedoff)
    exten => s,5,Hangup()
    
    ; arg1 = trunk number, arg2 = number
    [macro-dialout-enum]
    exten => s,1,GotoIf($[foo${ECID${CALLERIDNUM}} = foo]?4)        ;check for CID override for exten
    exten => s,2,SetCallerID(${ECID${CALLERIDNUM}})
    exten => s,3,Goto(6)
    exten => s,4,GotoIf($[foo${OUTCID_${ARG1}} = foo]?6)            ;check for CID override for trunk
    exten => s,5,SetCallerID(${OUTCID_${ARG1}})
    exten => s,6,SetGroup(OUT_${ARG1})
    exten => s,7,CheckGroup(${OUTMAXCHANS_${ARG1}})		; if we've used up the max channels, continue at 108 (n+101)
    exten => s,8,SetVar(DIAL_NUMBER=${ARG2})
    exten => s,9,SetVar(DIAL_TRUNK=${ARG1})
    exten => s,10,AGI(fixlocalprefix) 						; this sets DIAL_NUMBER to the proper dial string for this trunk
    exten => s,11,EnumLookup(${DIAL_NUMBER})
    exten => s,12,GotoIf($[$[${ENUM:0:3} = SIP] | $[${ENUM:0:3} = IAX]]?13:62)
    exten => s,13,Dial(${ENUM})
    exten => s,14,Dial(${OUT_${ARG1}}/${OUTPREFIX_${ARG1}}${DIAL_NUMBER})
    ; if dial fails (ie, all channels are busy), continue at 112 (n+101)
    
    ; exit points for macro
    exten => s,62,NoOp(EnumLookup failed)
    exten => s,108,NoOp(max channels used up)
    exten => s,115,NoOp(dial failed)
    
    ; ############################################################################
    ; Applications [app]
    ; ############################################################################
    ;
    [app-directory]
    ;DIR-CONTEXT set in Digital Receptionist
    exten => #,1,Wait(1)
    exten => #,2,AGI(directory,${DIR-CONTEXT},ext-local,${DIRECTORY:0:1}${DIRECTORY_OPTS}o)
    exten => #,3,Playback(vm-goodbye)
    exten => #,4,Hangup
    ; *411 will access the entire directory (not just a single context)
    exten => *411,1,Answer
    exten => *411,2,Wait(1)
    exten => *411,3,AGI(directory,general,ext-local,${DIRECTORY:0:1}${DIRECTORY_OPTS})
    exten => *411,4,Playback(vm-goodbye)
    exten => *411,5,Hangup
    exten => h,1,Hangup
    exten => o,1,goto(from-pstn,s,1)
    
    [app-dnd]
    exten => *78,1,Answer
    exten => *78,2,Wait(1)
    exten => *78,3,DBput(DND/${CALLERIDNUM}=YES)
    exten => *78,4,Playback(allison7/do-not-disturb)
    exten => *78,5,Playback(activated)
    exten => *78,6,Macro(hangupcall)
    exten => *79,1,Answer
    exten => *79,2,Wait(1)
    exten => *79,3,DBdel(DND/${CALLERIDNUM})
    exten => *79,4,Playback(allison7/do-not-disturb)
    exten => *79,5,Playback(de-activated)
    exten => *79,6,Macro(hangupcall)
    
    [app-messagecenter]
    exten => *98,1,Answer
    exten => *98,2,Wait(1)
    exten => *98,3,VoiceMailMain(default)
    exten => *98,4,Macro(hangupcall)
    exten => _*98X.,1,Answer			; can dial *98<exten> to skip 'mailbox' prompt.  Useful for speedial.
    exten => _*98X.,2,Wait(1)
    exten => _*98X.,3,VoiceMailMain(${EXTEN:3}@default)
    exten => _*98X.,4,Macro(hangupcall)
    exten => *97,1,Answer
    exten => *97,2,Wait(1)
    exten => *97,3,VoicemailMain(${CALLERIDNUM}@default)
    exten => *97,4,Macro(hangupcall)
    
    [app-callwaiting]
    exten => *70,1,Answer
    exten => *70,2,Wait(1)
    exten => *70,3,DBput(CW/${CALLERIDNUM}=ENABLED)
    exten => *70,4,Playback(callwaiting)
    exten => *70,5,Playback(activated)
    exten => *70,6,Macro(hangupcall)
    exten => *71,1,Answer
    exten => *71,2,Wait(1)
    exten => *71,3,DBdel(CW/${CALLERIDNUM})
    exten => *71,4,Playback(callwaiting)
    exten => *71,5,Playback(de-activated)
    exten => *71,6,Macro(hangupcall)
    
    [app-callforward]
    ; dialed call forward app - forwards calling extension
    exten => _*72.,1,DBput(CF/${CALLERIDNUM}=${EXTEN:3})
    exten => _*72.,2,Answer
    exten => _*72.,3,Wait(1)
    exten => _*72.,4,Playback(loligo/call-fwd-unconditional)
    exten => _*72.,5,Playback(loligo/for)
    exten => _*72.,6,Playback(loligo/extension)
    exten => _*72.,7,SayDigits(${CALLERIDNUM})
    exten => _*72.,8,Playback(loligo/is-set-to)
    exten => _*72.,9,SayDigits(${EXTEN:3})
    exten => _*72.,10,Macro(hangupcall)
    ; prompting call forward app - forwards entered extension
    exten => *72,1,Answer
    exten => *72,2,Wait(1)
    exten => *72,3,BackGround(allison7/please-enter-your)
    exten => *72,4,Playback(extension)
    exten => *72,5,Read(fromext,then-press-pound)
    exten => *72,6,Wait(1)
    exten => *72,7,BackGround(ent-target-attendant)
    exten => *72,8,Read(toext,then-press-pound)
    exten => *72,9,Wait(1)
    exten => *72,10,DBput(CF/${fromext}=${toext})
    exten => *72,11,Playback(call-fwd-unconditional)
    exten => *72,12,Playback(for)
    exten => *72,13,Playback(extension)
    exten => *72,14,SayDigits(${fromext})
    exten => *72,15,Playback(is-set-to)
    exten => *72,16,SayDigits(${toext})
    exten => *72,17,Macro(hangupcall)
    ; cancels dialed extension call forward
    exten => _*73.,1,DBdel(CF/${EXTEN:3})
    exten => _*73.,2,Answer
    exten => _*73.,3,Wait(1)
    exten => _*73.,4,SayDigits(${EXTEN:3})
    exten => _*73.,5,Playback(call-fwd-cancelled)
    exten => _*73.,6,Macro(hangupcall)
    ; cancels call forward for calling extension
    exten => *73,1,DBdel(CF/${CALLERIDNUM})
    exten => *73,2,Answer
    exten => *73,3,Wait(1)
    exten => *73,4,Playback(loligo/call-fwd-cancelled)
    exten => *73,5,Macro(hangupcall)
    ; dialed call forward on busy app - forwards calling extension when busy
    exten => _*90.,1,DBput(CFB/${CALLERIDNUM}=${EXTEN:3})
    exten => _*90.,2,Answer
    exten => _*90.,3,Wait(1)
    exten => _*90.,4,Playback(loligo/call-fwd-on-busy)
    exten => _*90.,5,Playback(loligo/for)
    exten => _*90.,6,Playback(loligo/extension)
    exten => _*90.,7,SayDigits(${CALLERIDNUM})
    exten => _*90.,8,Playback(loligo/is-set-to)
    exten => _*90.,9,SayDigits(${EXTEN:3})
    exten => _*90.,10,Macro(hangupcall)
    ; cancels call forward on busy for calling extension
    exten => *91,1,DBdel(CFB/${CALLERIDNUM})
    exten => *91,2,Answer
    exten => *91,3,Wait(1)
    exten => *91,4,Playback(call-fwd-on-busy)
    exten => *91,5,Playback(de-activated)
    exten => *91,6,Macro(hangupcall)
    exten => h,1,Hangup
    
    [app-calltrace]
    ; We can't have our timeouts or dial digits collide with other applications
    ; or extensions, so we build the app in pieces
    exten => *69,1,Goto(app-calltrace-perform,s,1)
    
    [app-calltrace-perform]
    exten => s,1,Answer
    exten => s,2,Wait(1)
    exten => s,3,Background(allison7/info-about-last-call)
    exten => s,4,Background(allison7/telephone-number)
    exten => s,5,Dbget(lastcaller=CALLTRACE/${CALLERIDNUM})
    exten => s,6,GotoIf($[${lastcaller}]?7:13)
    exten => s,7,SayDigits(${lastcaller})
    exten => s,8,DigitTimeout(3)
    exten => s,9,ResponseTimeout(7)
    exten => s,10,Background(loligo/to-call-this-number)
    exten => s,11,Background(allison7/press-1)
    exten => s,12,Goto(15)
    exten => s,13,Playback(loligo/from-unknown-caller)
    exten => s,14,Macro(hangupcall)
    exten => s,15,NoOp
    exten => 1,1,Goto(from-internal,${lastcaller},1);
    exten => i,1,Playback(vm-goodbye)
    exten => i,2,Macro(hangupcall)
    exten => t,1,Playback(vm-goodbye)
    exten => t,2,Macro(hangupcall)
    
    
    ; ############################################################################
    ; Outbound Trunk Contexts [outbound]
    ; ############################################################################
    
    [outbound-local]
    exten => _NXXXXXX,1,Macro(dialout-default,${EXTEN})
    exten => _NXXNXXXXXX,1,Macro(dialout-default,${EXTEN})
    
    [outbound-tollfree]
    exten => _1800NXXXXXX,1,Macro(dialout-default,${EXTEN})
    exten => _1888NXXXXXX,1,Macro(dialout-default,${EXTEN})
    exten => _1877NXXXXXX,1,Macro(dialout-default,${EXTEN})
    exten => _1866NXXXXXX,1,Macro(dialout-default,${EXTEN})
    
    [outbound-ld]
    exten => _1NXXNXXXXXX,1,Macro(dialout-default,${EXTEN})
    
    [outbound-international]
    exten => _011.,1,Macro(dialout-default,${EXTEN})
    
    [outbound-emerg]
    exten => 911,1,Macro(dialout-default,${EXTEN})
    
    [outbound-info]
    exten => 411,1,Macro(dialout-default,${EXTEN})
    exten => 311,1,Macro(dialout-default,${EXTEN})
    
    
    ; ############################################################################
    ; Inbound Contexts [from]
    ; ############################################################################
    
    [from-sip-external]
    
    ;give external sip users congestion and hangup
    exten => _.,1,AbsoluteTimeout(15)
    exten => _.,2,Congestion 
    exten => _.,3,Hangup
    
    [from-internal]
    ;allow phones to use applications
    include => app-directory
    include => app-dnd
    include => app-callforward
    include => app-callwaiting
    include => app-messagecenter
    include => app-calltrace
    include => parkedcalls
    include => from-internal-custom
    ;allow phones to dial other extensions
    include => ext-fax
    include => ext-local
    include => ext-group
    include => ext-queues
    include => ext-zapbarge
    include => ext-meetme
    include => ext-record
    include => ext-test
    ;allow phones to access trunks
    include => outbound-allroutes
    exten => s,1,Macro(hangupcall)
    exten => h,1,Macro(hangupcall)
    
    ; ############################################################################
    ; Extension Contexts [ext]
    ; ############################################################################
    
    [ext-zapbarge]
    exten => 888,1,SetGroup(${CALLERIDNUM})
    exten => 888,2,Answer
    exten => 888,3,Wait(1)
    exten => 888,4,ZapBarge
    exten => 888,5,Hangup
    
    [ext-meetme]
    exten => _8X,1,Answer
    exten => _8X,2,Wait(1)
    exten => _8X,3,GotoIf($[${CALLERIDNUM} = ${EXTEN:1}]?5:4)
    exten => _8X,4,MeetMe(${EXTEN}|sM)
    exten => _8X,5,MeetMe(${EXTEN}|asM)
    
    exten => _8XX,1,Answer
    exten => _8XX,2,Wait(1)
    exten => _8XX,3,GotoIf($[${CALLERIDNUM} = ${EXTEN:1}]?5:4)
    exten => _8XX,4,MeetMe(${EXTEN}|sM)
    exten => _8XX,5,MeetMe(${EXTEN}|asM)
    
    exten => _8XXX,1,Answer
    exten => _8XXX,2,Wait(1)
    exten => _8XXX,3,GotoIf($[${CALLERIDNUM} = ${EXTEN:1}]?5:4)
    exten => _8XXX,4,MeetMe(${EXTEN}|sM)
    exten => _8XXX,5,MeetMe(${EXTEN}|asM)
    
    exten => _8XXXX,1,Answer
    exten => _8XXXX,2,Wait(1)
    exten => _8XXXX,3,GotoIf($[${CALLERIDNUM} = ${EXTEN:1}]?5:4)
    exten => _8XXXX,4,MeetMe(${EXTEN}|sM)
    exten => _8XXXX,5,MeetMe(${EXTEN}|asM)
    
    
    [ext-fax]
    exten => s,1,Answer
    exten => s,2,Goto(in_fax,1)
    exten => in_fax,1,GotoIf($[${FAX_RX} = system]?2:analog_fax,1)
    exten => in_fax,2,Macro(faxreceive)
    exten => in_fax,3,system(tiff2ps -2eaz -w 8.5 -h 11 ${FAXFILE} | ps2pdf - ${FAXFILE}.pdf)
    exten => in_fax,4,system(mime-construct --to ${EMAILADDR} --subject "Fax from ${CALLERIDNUM} ${CALLERIDNAME}" --attachment ${CALLERIDNUM}.pdf --type application/pdf --file ${FAXFILE}.pdf)
    exten => in_fax,5,system(rm ${FAXFILE} ${FAXFILE}.pdf)
    exten => in_fax,6,Hangup
    exten => analog_fax,1,GotoIf($[${FAX_RX} = disabled]?3:2)  ;if fax is disabled, just hang up
    exten => analog_fax,2,Dial(${FAX_RX},20,d)
    exten => analog_fax,3,Hangup
    ;exten => out_fax,1,wait(7)
    exten => out_fax,1,txfax(${TXFAX_NAME}|caller)
    exten => out_fax,2,Hangup
    exten => h,1,Hangup()
    
    [ext-record]
    exten => *77,1,Wait(2)
    exten => *77,2,Record(${CALLERIDNUM}ivrrecording:wav) 
    exten => *77,3,Wait(2)
    exten => *77,4,Hangup
    exten => *99,1,Playback(${CALLERIDNUM}ivrrecording) 
    exten => *99,2,Wait(2) 
    exten => *99,3,Hangup 
    
    ;this is where parked calls go if they time-out.  Should probably re-ring
    [default]
    include => ext-local
    exten => s,1,Playback(vm-goodbye)
    exten => s,2,Macro(hangupcall)
    
    [ext-test]
    exten => 7777,1,Goto(from-pstn,s,1)
    exten => 666,1,Goto(ext-fax,in_fax,1)
    exten => h,1,Macro(hangupcall)
    
    ;echo test
    exten => *43,1,Answer
    exten => *43,2,Wait(2)
    exten => *43,3,Playback(demo-echotest)
    exten => *43,4,Echo
    exten => *43,5,Playback(demo-echodone)
    exten => *43,6,Hangup
    
    
    [sip-out]
    exten => _X.,1,SetCallerId,5551042 
    exten => _X.,2,Dial(SIP/${EXTEN}@sipgate-out,30,trg) 
    exten => _X.,3,Hangup 
    
    
    
    extensions_additional.conf

    Code:
    
    [globals]
    RINGTIMER = 15
    REGTIME = 7:55-17:05
    REGDAYS = mon-fri
    RECORDEXTEN = ""
    PARKNOTIFY = SIP/200
    OUT_2 = SIP/sipgate
    OUT_1 = ZAP/g0
    OUTPREFIX_2 = *9
    OUTMAXCHANS_2 = 2
    OUTCID_2 = 5551042
    OPERATOR = 
    NULL = ""
    IN_OVERRIDE = forcereghours
    INCOMING = EXT-201
    FAX_RX_EMAIL = [email]fax@mydomain.com[/email]
    FAX_RX = system
    FAX = 
    E201 = SIP
    E200 = SIP
    DIRECTORY_OPTS = 
    DIRECTORY = last
    DIAL_OUT = 9
    DIAL_OPTIONS = tr
    DIALOUTIDS = 1/2/
    CALLFILENAME = ""
    AFTER_INCOMING = EXT-201
    
    [ext-did]
    include => ext-did-custom
    exten => 5551042,1,Goto(ext-group,1,1)	; 
    
    [ext-group]
    include => ext-group-custom
    exten => 1,1,Setvar(GROUP=201)	; 
    exten => 1,2,Setvar(RINGTIMER=)	; 
    exten => 1,3,Setvar(PRE=)	; 
    exten => 1,4,Macro(rg-group)	; 
    
    [ext-local]
    include => ext-local-custom
    exten => 200,1,Macro(exten-vm,200@default,200)
    exten => 201,1,Macro(exten-vm,201@default,201)
    
    [outbound-allroutes]
    include => outbound-allroutes-custom
    include => outrt-001-Out
    
    [outrt-001-Out]
    include => outrt-001-Out-custom
    exten => _X,1,Macro(dialout-trunk,2,${EXTEN})
    exten => _X,2,Macro(outisbusy)	; No available circuits
    
    
    
    
    extensions_custom.conf

    Code:
    
    ; This file contains example extensions_custom.conf entries.
    ; extensions_custom.conf should be used to include customizations
    ; to AMP's Asterisk dialplan.
    
    ; All custom context should contain the string 'custom' in it's name 
    
    ; Extensions in AMP have access to the 'from-internal' context.
    ; The context 'from-internal-custom' is included in 'from-internal' by default
    
    [from-internal-custom]				
    ;1234,1,Playback(demo-congrats)		; extensions can dial 1234
    ;1234,2,Hangup()
    ;h,1,Hangup()
    ;include => custom-recordme			; extensions can also dial 5678 
    
    exten => *60,1,Answer
    exten => *60,2,Playback(at-tone-time-exactly)
    exten => *60,3,SayUnixTime(,,IMp)
    exten => *60,4,Playback(beep)
    exten => *60,5,Hangup
    
    exten => *61,1,Answer
    exten => *61,2,AGI(weather.agi)
    exten => *61,3,Hangup
    
    exten => *62,1,Answer 
    exten => *62,2,AGI(wakeup.php) 
    exten => *62,3,Hangup 
    
    exten => *65,1,Answer
    exten => *65,2,AGI(festival-script.pl|Your phone number is ${CALLERIDNUM}.)
    exten => *65,3,Hangup
    
    [custom-meetme]
    include => ext-meetme		
    exten => s,1,BackGround(enter-conf-call-number)
    exten => h,1,Hangup()
    
    [custom-wakeupext] 
    exten => s,1,Answer 
    exten => s,2,AGI(wakeup-ext.php); 
    exten => s,3,Hangup 
    
    ; custom-count2four,s,1 can be used as a custom target for
    ; a Digital Receptionist menu or a Call Group
    ;[custom-count2four]		
    ;s,1,SayDigits(1234)
    ;s,2,Hangup
    
    ; custom-recordme,5678,1 can be used as a custom target for
    ; a Digital Receptionist menu or a Call Group
    ;[custom-recordme]
    ;exten => 5678,1,Wait(2)
    ;exten => 5678,2,Record(/tmp/asterisk-recording:gsm)
    ;exten => 5678,3,Wait(2)
    ;exten => 5678,4,Playback(/tmp/asterisk-recording)
    ;exten => 5678,5,Wait(2)
    ;exten => 5678,6,Hangup 
    
    
    sip.conf

    Code:
    
    ; Note: If your SIP devices are behind a NAT and your Asterisk
    ;  server isn't, try adding "nat=1" to each peer definition to
    ;  solve translation problems.
    
    [general]
    
    port = 5060           ; Port to bind to (SIP is 5060)
    bindaddr = 0.0.0.0    ; Address to bind to (all addresses on machine)
    disallow=all
    allow=ulaw
    allow=alaw
    context = from-sip-external; send unknown sip callers to this context
    callerid = unknown
    
    localnet="asteriskip"/255.255.255.0
    externhost=sipgate.de
    externip="accountname".dyndns.org
    srvlookup=yes
    externrefresh=10
    nat=yes
    canreinvite=no
    
    tos=lowdelay
    maxexpirey=1200
    defaultexpirey
    
    context=from-sip-external
    
    #include sip_nat.conf
    #include sip_additional.conf
    
    
    sip_additional.conf

    Code:
    
    register="7-stellige Sipgate ID":KJEPMR4W@sipgate.de/"7-stellige Sipgate ID"
    
    [200]
    username=200
    type=friend
    secret=pw
    qualify=no
    port=5060
    pickupgroup=
    nat=never
    mailbox=200@default
    host=dynamic
    dtmfmode=rfc2833
    disallow=
    context=from-internal
    canreinvite=no
    callgroup=
    callerid="extensionname" <200>
    allow=
    
    [201]
    username=201
    type=friend
    secret=pw
    qualify=no
    port=5060
    pickupgroup=
    nat=never
    mailbox=201@default
    host=dynamic
    dtmfmode=rfc2833
    disallow=
    context=outrt-XXX-out
    canreinvite=no
    callgroup=
    callerid="extensionname2" <201>
    allow=
    
    ["7-stellige Sipgate ID"]
    username="7-stellige Sipgate ID"
    user="7-stellige Sipgate ID"
    type=user
    secret="sip-passwort"
    qualify=1200
    insecure=very
    host=sipgate.de
    fromuser="7-stellige Sipgate ID"
    fromdomain=sipgate.de
    dtmfmode=info
    context=from-pstn
    callerid="7-stellige Sipgate ID"
    
    [sipgate]
    username="7-stellige Sipgate ID"
    type=peer
    secret="sip-passwort"
    insecure=very
    host=sipgate.de
    
    
    Ich hab jetz einfach mal alles reingesetzt, falls ich irgendwas wichtiges vergessen sollte. Ich weis ja nicht wo überall wichtige Kriterien sind. Ansonsten hab ich auch nich großartig in den Konfigs rumgebastelt, außer die ein oder anderen Ratschläge der beiden Diskussionsbeiträge.

    Wie gesagt, ich kommer wer raus noch kann jemand man von außen reintelefonieren(siehe Fehlermeldung oben). Die Kommunikation untereinander im LAN ist aber gewährleistet. Die Extensions 200 und 201 können untereinander telefonieren.

    Nebenbei noch erwähnt, hab ich momentan mal "*9" zum rauswählen Konfiguriert, also das wähl ich dann auch immer davor nicht das ich das vergessen würde :), ebenso habe ich auch [0]x in die Dial Rules gesetzt, so das ich auch alle Nummern wählen darf.

    So jetz wart ich am besten mal auf deine Antwort bzw. freue mich natürlich auch auf jede weitere Hilfe

    Grüße, Darkstar a.k.a hilfloser AZUBI @ Asterisk Projekt :)
     
  5. Holg

    Holg Neuer User

    Registriert seit:
    17 Sep. 2004
    Beiträge:
    139
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Hi Darkstar23483,

    Damit du angerufen werden kannst, versuch mal folgendes:

    1) Schmeiss mal den context [sip-out] in extensions.conf komplett raus

    2) Ändere die extensions.conf unter [from-sip-external] wie folgt:

    [from-sip-external]

    ;give external sip users congestion and hangup
    ;exten => _.,1,AbsoluteTimeout(15)
    ;exten => _.,2,Congestion
    ;exten => _.,3,Hangup

    exten => _.,1,Goto(from-pstn,s,1)

    3) externip und externhost in sip.conf müssen gleich heissen. Und zwar wird da deine externe IP-ADresse gesetzt. Brauchst du aber soweit ich das bei mir bisher gemerkt habe unter asterisk@home (und nur da) nicht setzten.

    4) Wenn du noch immer nicht angerufen werden kannst, dann überprüf mal ob dein asterisk sich registrieren kann: sip show registry

    Um raus zu telefonieren probier mal folgendes:

    1) bei den dial-patterns den Punkt nicht vergessen [0]X.

    2) das mit der *9 ist keine so gute Idee, da in asterisk das call forwarding mit *90. Am besten du benutzt die Möglichekeiten von |. damit kannst du in den Dial-Patterns ein Ziffernfolge definieren, die beim durchwählen abgeschnitten werden soll. Also:

    du wählst auf deinem Telefon 123456789
    hast in den dial pattern folgendes stehen 123|456789
    asterisk übergibt an das Dial-Komando 456789

    3) definier in den extensions-settings für jede extension den context als from-internal

    Hoffe ein paar Probleme sind weg ;)

    Wichtig: Du musst bei der Konfiguration (also auch beim Suchen nach einer Möglichen konfiguration) unterscheiden zwischen asterisk und asterisk@home. Sonst kommst du da völlig durcheinander...

    Gruß
    Holg
     
  6. @ holg

    also dien ersten Schritte habe ich genauso verändert wie du beschrieben hast und ich bin jetz erreichbar....wunderbar und schonmal DANKE.

    Bei extern host und externip steht bei mir nur noch

    externhost=
    externip=

    ich denke mal das kann so bleiben.

    Leider kann ich immer noch nicht raus telefonieren. Im X-Lite steht nun...



    Trying

    (gewählte Nummer)
    Calltimer etc.


    (er bleibt die ganze Zeit so stehn als ob er noch Verbindung aufbauen würde...bleibt so stehn und weiter gescheiht nix)

    *ergänzend...wenn ich 123(Nummer ohne Vorwahl) also nicht mit o beginne, kommt wieder die Frauenstimme mit "all circuits are busy now"

    123=dial patterns siehe unten

    nochmal schaun ob ich das klar verstanden habe.

    1) Die Felder "Dial Rules" und "Outbound Dial Prefix" bleiben in meiner Trunkeinstellung von Sipgate leer?

    2) in meinen Outbount Routing gibts eine Route namens Out.

    Dort unter Dial Patterns:

    [0]x
    123|x (ich wähle also 123(gewünschte Rufnummer samt Vorwahl))



    ansonsten hab ich weiterhin nichts verändert.


    Vielleicht hab ich jetz vor lauter Aufregung ja einen dummen Fehler gemacht. :) Wenigstens kommen schonmal Anrufe an...*puh*
     
  7. Holg

    Holg Neuer User

    Registriert seit:
    17 Sep. 2004
    Beiträge:
    139
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Hi Darkstar23483,

    Erreichbar zu sein... na das ist doch schon mal etwas... ;)
    Aber ich denke das mit dem raustelefonieren bekommen wir auch noch hin

    Oubound Dial Prefix kann leer bleiben.

    Aber du solltest in deinem Trunk (von sipgate) in den dial-patterns etwas definieren. Am einfachsten so etwas (darauf achten, dass der Punkt am Ende dabei steht):

    Outgoing dial routes
    Dial rules:

    030+ZXX.
    [0]X.

    wobei du 030 durch deine Vorwahl ersetzen solltest...

    Noch einmal zu den unterschiedlichen Möglichkeiten

    X - entspricht jeder Ziffer
    Z - entspricht 1-9
    N - entspricht 2-9
    [1237-9] - damit kannst du definieren welche Ziffern alle betroffen sind: , in diesem Falle 123 und 7 bis 9

    mit einem . werden x-beliebige Stellen beachtet
    mit einem | werden die Ziffern die davor stehen weggelöscht.
    mit einem + werden die Ziffern die davor stehen hinzugefügt.

    Beispiele:

    XXX - bedeutet sind alle Ziffernfolgen von 000 bis 111 (nicht aber 0000 das wäre XXXX)

    X. sind also beliebig viele Ziffern
    NX. sind alle Ziffernfolgen, die mit einer 2 anfange
    ZX sind alle Ziffernfolgen, bestehend aus 2 Ziffern die mit 1-9 anfangen also alles von 10 - 99 (nicht aber 08)

    030 + ZX. setzt vor alle Zifferfolgen die mit einer Zahl >= 1 anfangen eine 030 vorne dran.

    du wählst 123456 und asterisk macht daraus 030123456

    123|X. entfernt bei allen Ziffernfolgen die mit 123 anfangen genau diese Folge. Also:

    du wählst 123456789 und asterisk macht daraus 456789.

    Hoffe das war einigermaßen klar.
    Du solltest nachdem du die dial rules in deinem sipgate trunk gesetzt hast, noch in deiner Outbound-route in den dial rules ein X. setzten, dass hier auch alle Nummern durchgeschleift werden.

    Die Fehlermeldung "all circuits are busy now" bekommst du übrigens, weil sipgate die eine Fehlermeldung ich tippe mal die 408 zurückgibt. Das liegt daran, dass sipgate mit der nummer die es von asterisk bekommt nichts anfangen kann.

    Gruß
    Holg
     
  8. Also irgendwie klappts noch nich so ganz :) also hier nochmal die Einstellungen, wie sie in der GUI stehen...

    Trunk/sipgate:

    In use by 1 route (info)

    General Settings:

    Outbaound Caller ID: "7-stellige Sipgate Nr."
    Maximum Channels: 2

    Outgoing Dial rules:

    Dial rules:
    0241+ZXX.
    [0]X.

    Outbound Dial Prefix: leer


    Outbound Routing

    Route name: out

    Dial Patterns:

    X.

    (hab versuchs weise auch noch 123|x. reingesetzt)


    Vielleicht als Hinweis: Im X_Lite steht bei callerid die gewählte nummer und dahinter ein @("IP.Asterisk) weis nich ob das normal is oder deutet das ebenfalls darauf hin das er nicht rauswählt.

    (Mir ist zusätzlich grad noch aufgefallen das ich meinen Siptrung als Extension habe...is das korrekt?

    PS: Wenn du möchtest können wir uns auch im Teamspeak treffen da bin ich online heut nachmittag (ab jetz) bzw. skypen.
     
  9. So....es funktionier :)

    Allerdings hatte ich in den Outbound-Settings von sipgate/trunk einige zeilen ausgelassen...hmm naja jedenfalls funktioniert es jetzt.

    Das war jetzt mehr oder weniger die erste Hürde..Als nächstes werde ich jetzt 2 ISDN Karten morgen oder übermorgen einbauen und dann will ich das ganze mit ner Elmeg TK Anlage Koppeln so das ich die Telefone hier nutzen kann und z.B die ersten beiden Anrufe nach außen über den Asterisk laufen. Ebenso sollen alle Telefone nachher klingeln wenn auf die sipgate nummer angerufen wird(so das die Firma quasi ne allgemeine VoIP Rufnummer hat)...(ich erklär das nur mal grob da ich am besten ein neuen Beitrag Poste wenn es aktuell ist)

    thx an holg für deine Bemühungen...Hoffe, das du mir auch weiterhin Hilfestellung geben kannst.

    PS: Der nächste Thread kommt ziemlich Bald :)

    Also danke schonmal für die ersten Schritte