Fragen zu Trunks/Outbound Routing/DID

D

Darkstar23483

Guest
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:[email protected]/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.
 
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:[email protected]/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

; 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)
tos=quality
nat=yes
dtmfmode=info
Localnet = 192.168.1.0/255.255.255.0
srvlookup = yes
disallow=all
allow=ulaw
allow=alaw
allow=gsm
insecure=very
context = ext-did; Send unknown SIP callers to this context


#include sip_nat.conf
#include sip_custom.conf
#include sip_additional.conf

meine Trunk Einstellungen sind folgende

canreinvite=no
fromdomain=sipgate.de
fromuser=1234567
host=sipgate.de
insecure=very
qualify=yes
secret=*********
type=peer
username=123456

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
 
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 :).
 
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][email protected][/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":[email protected]/"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 :)
 
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
 
@ 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*
 
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
 
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.
 
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
 

Zurzeit aktive Besucher

Statistik des Forums

Themen
244,839
Beiträge
2,219,264
Mitglieder
371,543
Neuestes Mitglied
Brainbanger
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.