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

[Gelöst] Eingehende ISDN-Anrufe werden nicht erkannt

Dieses Thema im Forum "Asterisk ISDN mit CAPI (chan_capi, chan_capi_cm)" wurde erstellt von Palm_Maniac, 29 Dez. 2006.

  1. Palm_Maniac

    Palm_Maniac Neuer User

    Registriert seit:
    21 März 2006
    Beiträge:
    80
    Zustimmungen:
    0
    Punkte für Erfolge:
    6
    Ort:
    Gießen / Hessen
    #1 Palm_Maniac, 29 Dez. 2006
    Zuletzt bearbeitet: 5 Jan. 2007
    Hallo und ein großes HILFE!!!!

    Ich verzeifel hier fast, weil ich einfach nicht mehr weiß, wo ich suchen soll.

    Ich habe mein System auf neue Hardware aufgesetzt. Der Asterisk läuft nun unter Suse 10.2 und wird mit Freepbx 2.2.0rc3 verwaltet. Es läuft Asterisk 1.2.14 mit chan_capi 0.6.5 und einer Fritzcard PCI.

    Die Installation lief wie immer fast perfekt. Nach dem wieder einrichten haben si alle Telefone angemeldet, Anrufe über ISDN oder Sip gehen raus, Sip Anrufe kommen rein, aber wenn über ISDN ein Anruf rein kommt, bleibt alles stumm.

    Laut den diversen Beiträgen hier im Forum habe ich alles angetestet um zu sehen, ob capi geladen ist und funktioniert. Meiner Meinung nach ist alles ok. Gehe ich nun auf die Asterisk-Konsole per asterisk -r, sehe ich schon wie alles reagiert, wenn ich einen Anruf per Sip bekomme oder einer raus geht. Kommt aber wieder ein Anruf per ISDN rein, reagiert Asterisk nicht. Absolut keine Reaktion.

    Starte ist Asterisk per asterisk -vvvv, dann sehe ich die Meldung ISDN1: Incoming Call from 0017xxxxxxx > 11, das wars. Wegend er 11, vor der Asterisk hängt noch eine ISDN-Anlage von Auerswald. Die selbe Konfig hat aber unter Suse 10.1 perfekt funktioniert. Ich versteh das nicht.

    Wo habe ich nen Fehler drin, weshalb Asterisk aber rein garnicht auf ISDN reagiert?

    Hat irgendwer erfolgreich unter Suse 10.2 einen Asterisk in Betrieb genommen und nen Tip für mich?

    HILFE bitte, wir sind schon seid 2 Tagen ohne Telefonanrufe.


    Vielen Dank im vorraus,

    Thomas.
     
  2. Palm_Maniac

    Palm_Maniac Neuer User

    Registriert seit:
    21 März 2006
    Beiträge:
    80
    Zustimmungen:
    0
    Punkte für Erfolge:
    6
    Ort:
    Gießen / Hessen
    Eingehende ISDN-Anrufe werden nicht erkannt

    Hallo und ein großes HILFE!!!!

    Ich verzeifel hier fast, weil ich einfach nicht mehr weiß, wo ich suchen soll.

    Ich habe mein System auf neue Hardware aufgesetzt. Der Asterisk läuft nun unter Suse 10.2 und wird mit Freepbx 2.2.0rc3 verwaltet. Es läuft Asterisk 1.2.14 mit chan_capi 0.6.5 und einer Fritzcard PCI.

    Die Installation lief wie immer fast perfekt. Nach dem wieder einrichten haben si alle Telefone angemeldet, Anrufe über ISDN oder Sip gehen raus, Sip Anrufe kommen rein, aber wenn über ISDN ein Anruf rein kommt, bleibt alles stumm.

    Laut den diversen Beiträgen hier im Forum habe ich alles angetestet um zu sehen, ob capi geladen ist und funktioniert. Meiner Meinung nach ist alles ok. Gehe ich nun auf die Asterisk-Konsole per asterisk -r, sehe ich schon wie alles reagiert, wenn ich einen Anruf per Sip bekomme oder einer raus geht. Kommt aber wieder ein Anruf per ISDN rein, reagiert Asterisk nicht. Absolut keine Reaktion.

    Starte ist Asterisk per asterisk -vvvv, dann sehe ich die Meldung ISDN1: Incoming Call from 0017xxxxxxx > 11, das wars. Wegend er 11, vor der Asterisk hängt noch eine ISDN-Anlage von Auerswald. Die selbe Konfig hat aber unter Suse 10.1 perfekt funktioniert. Ich versteh das nicht.

    Wo habe ich nen Fehler drin, weshalb Asterisk aber rein garnicht auf ISDN reagiert?

    Hat irgendwer erfolgreich unter Suse 10.2 einen Asterisk in Betrieb genommen und nen Tip für mich?

    HILFE bitte, wir sind schon seid 2 Tagen ohne Telefonanrufe.


    Vielen Dank im vorraus,

    Thomas.
     
  3. Palm_Maniac

    Palm_Maniac Neuer User

    Registriert seit:
    21 März 2006
    Beiträge:
    80
    Zustimmungen:
    0
    Punkte für Erfolge:
    6
    Ort:
    Gießen / Hessen
    Anbei ein Log mit set verbose 5 und capi debug:

    Code:
    CONNECT_IND ID=003 #0x001e LEN=0044
      Controller/PLCI/NCCI            = 0x101
      CIPValue                        = 0x10
      CalledPartyNumber               = <81>11
      CallingPartyNumber              = <21 80>01739256353
      CalledPartySubaddress           = default
      CallingPartySubaddress          = default
      BC                              = <80 90 a3>
      LLC                             = default
      HLC                             = <91 81>
      AdditionalInfo                  = default
    
        -- CONNECT_IND (PLCI=0x101,DID=11,CID=01739256353,CIP=0x10,CONTROLLER=0x1)
           > ISDN1: msn='*' DNID='11' MSN
      == ISDN1: Incoming call '001739256353' -> '11'
    INFO_IND ID=003 #0x001f LEN=0018
      Controller/PLCI/NCCI            = 0x101
      InfoNumber                      = 0x70
      InfoElement                     = <81>11
    
    INFO_RESP ID=003 #0x001f LEN=0012
      Controller/PLCI/NCCI            = 0x101
    
        -- ISDN1: info element CALLED PARTY NUMBER
           > ISDN1: INFO_IND DID digits not used in this state.
    INFO_IND ID=003 #0x0020 LEN=0016
      Controller/PLCI/NCCI            = 0x101
      InfoNumber                      = 0x18
      InfoElement                     = <89>
    
    INFO_RESP ID=003 #0x0020 LEN=0012
      Controller/PLCI/NCCI            = 0x101
    
        -- ISDN1: info element CHANNEL IDENTIFICATION 89
    INFO_IND ID=003 #0x0023 LEN=0018
      Controller/PLCI/NCCI            = 0x101
      InfoNumber                      = 0x70
      InfoElement                     = <81>11
    
    INFO_RESP ID=003 #0x0023 LEN=0012
      Controller/PLCI/NCCI            = 0x101
    
        -- ISDN1: info element CALLED PARTY NUMBER
           > ISDN1: INFO_IND DID digits not used in this state.
    INFO_IND ID=003 #0x0024 LEN=0016
      Controller/PLCI/NCCI            = 0x101
      InfoNumber                      = 0x18
      InfoElement                     = <89>
    
    INFO_RESP ID=003 #0x0024 LEN=0012
      Controller/PLCI/NCCI            = 0x101
    
        -- ISDN1: info element CHANNEL IDENTIFICATION 89
    DISCONNECT_IND ID=003 #0x0025 LEN=0014
      Controller/PLCI/NCCI            = 0x101
      Reason                          = 0x0
    
    DISCONNECT_RESP ID=003 #0x0025 LEN=0012
      Controller/PLCI/NCCI            = 0x101
    
        -- ISDN1: DISCONNECT_IND on incoming without pbx, doing hangup.
      == ISDN1: CAPI Hangingup
      == ISDN1: Interface cleanup PLCI=0x101
           > CAPI devicestate requested for ISDN1/11
    
    Hier meine Capi.conf

    Code:
    ;
    ; CAPI config
    ;
    ;
    
    ; general section
    
    [general]
    nationalprefix=0
    internationalprefix=00
    rxgain=1.2
    txgain=1.2
    language=de      ;set default language
    ;ulaw=yes        ;set this, if you live in u-law world instead of a-law
    
    ; interface sections ...
    
    [ISDN1]          ;this example interface gets name 'ISDN1' and may be any
                     ;name not starting with 'g' or 'contr'.
    ;ntmode=yes      ;if isdn card operates in nt mode, set this to yes
    isdnmode=msn     ;'MSN' (point-to-multipoint) or 'DID' (direct inward dial)
                     ;when using NT-mode, 'DID' should be set in any case
    incomingmsn=*    ;allow incoming calls to this list of MSNs/DIDs, * = any
    ;defaultcid=123  ;set a default caller id to that interface for dial-out,
                     ;this caller id will be used when dial option 'd' is set.
    ;controller=0    ;ISDN4BSD default
    ;controller=7    ;ISDN4BSD USB default
    controller=1     ;capi controller number to use
    group=1          ;dialout group
    ;prefix=0        ;set a prefix to calling number on incoming calls
    softdtmf=on      ;enable/disable software dtmf detection, recommended for AVM cards
    relaxdtmf=on     ;in addition to softdtmf, you can use relaxed dtmf detection
    accountcode=     ;Asterisk accountcode to use in CDRs
    context=from-trunk  ;context for incoming calls
    ;holdtype=hold   ;when Asterisk puts the call on hold, ISDN HOLD will be used. If
                     ;set to 'local' (default value), no hold is done and Asterisk may
                     ;play MOH.
    ;immediate=yes   ;DID: immediate start of pbx with extension 's' if no digits were
                     ;     received on incoming call (no destination number yet)
                     ;MSN: start pbx on CONNECT_IND and don't wait for SETUP/SENDING-COMPLETE.
                     ;     info like REDIRECTINGNUMBER may be lost, but this is necessary for
                     ;     drivers/pbx/telco which does not send SETUP or SENDING-COMPLETE.
    echosquelch=1   ;_VERY_PRIMITIVE_ echo suppression
    echocancel=yes  ;EICON DIVA SERVER (CAPI) echo cancelation
                     ;(possible values: 'no', 'yes', 'force', 'g164', 'g165') 
    echocancelold=yes;use facility selector 6 instead of correct 8 (necessary for older eicon drivers)
    ;echotail=64     ;echo cancel tail setting
    ;bridge=yes      ;native bridging (CAPI line interconnect) if available
    ;callgroup=1     ;Asterisk call group
    ;language=de     ;set language for this device (overwrites default language)
    devices=2        ;number of concurrent calls on this controller
                     ;(2 makes sense for single BRI, 30 for PRI)
    
    
    
    und die modulkes.conf

    Code:
    ;
    ; Asterisk configuration file
    ;
    ; Module Loader configuration file
    ;
    
    [modules]
    autoload=yes
    ;
    ; If you want, load the GTK console right away.  
    ; Don't load the KDE console since
    ; it's not as sophisticated right now.
    ;
    noload => pbx_gtkconsole.so
    ;load => pbx_gtkconsole.so
    noload => pbx_kdeconsole.so
    ;
    ; Intercom application is obsoleted by
    ; chan_oss.  Don't load it.
    ;
    noload => app_intercom.so
    ;
    ; DON'T load the chan_modem.so, as they are obsolete in * 1.2
    
    noload => chan_modem.so
    noload => chan_modem_aopen.so
    noload => chan_modem_bestdata.so
    noload => chan_modem_i4l.so
    
    ; Trunkisavail is a broken module supplied by Trixbox
    noload => app_trunkisavail.so
    
    ; Ensure that format_* modules are loaded before res_musiconhold
    ;load => format_ogg_vorbis.so
    load => format_wav.so
    load => format_pcm.so
    load => format_au.so
    ; This isn't part of 'asterisk' iteslf, it's part of asterisk-addons. If this isn't
    ; installed, asterisk will fail to start. But it does need to go here for native MOH
    ; to work using mp3's. 
    load => format_mp3.so
    load => res_musiconhold.so
    ;
    ; Load either OSS or ALSA, not both
    ; By default, load OSS only (automatically) and do not load ALSA
    ;
    noload => chan_alsa.so
    noload => chan_oss.so
    load => chan_capi.so
    ;
    ; Module names listed in "global" section will have symbols globally
    ; exported to modules loaded after them.
    ;
    [global]
    
    chan_capi.so=yes
    
    Irgendwann sieht man den Wald vor lauter Bäumen nicht mehr, aber ich kann einfach keinen Fehler finden.

    Liegt es eventuell am neuen Suse? Liegt es an PHP5? Ich hoffe, es kann mir jemand helfen.
     
  4. blauerpeti

    blauerpeti Mitglied

    Registriert seit:
    28 Juni 2005
    Beiträge:
    723
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    also wenn "raus" geht und "rein" nicht dann sollte das problem in der extensions.conf liegen.
    ..nur diese "sehen" wir hier nicht
     
  5. Palm_Maniac

    Palm_Maniac Neuer User

    Registriert seit:
    21 März 2006
    Beiträge:
    80
    Zustimmungen:
    0
    Punkte für Erfolge:
    6
    Ort:
    Gießen / Hessen
    Kommt sofort:

    Code:
    ; FreePBX
    ; Copyright (C) 2004 Coalescent Systems Inc (Canada)
    ; Copyright (C) 2006 Why Pay More 4 Less Pty Ltd (Australia)
    ; Released under the GNU GPL Licence version 2.
    
    ; 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-direct		; MODIFICATOIN (PL) put before ext-did to take precedence
    include => ext-did
    include => from-did-direct		; MODIFICATOIN (PL) for findmefollow if enabled, should be bofore ext-local
    exten => fax,1,Goto(ext-fax,in_fax,1)
    
    ; MODIFICATION (PL) 
    ;
    ; Required to assure that direct dids go to personal ring group before local extension.
    ; This could be auto-generated however I it is prefered to be put here and hard coded
    ; so that it can be modified if ext-local should take precedence in certain situations.
    ; will have to decide what to do later.
    ;
    [from-did-direct]
    include => ext-findmefollow
    include => ext-local
    
    
    
    ; ############################################################################
    ; 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,DeadAGI(dialparties.agi)
    exten => s,2,NoOp(Returned from dialparties with no extensions to call)
    exten => s,3,NoOp(DIALSTATUS is '${DIALSTATUS}')
    
    exten => s,10,Dial(${ds})                               ; dialparties will set the priority to 10 if $ds is not null
    
    exten => s,20,NoOp(Returned from dialparties with hunt groups to dial )
    exten => s,21,Set(HuntLoop=0)
    exten => s,22,GotoIf($[${HuntMembers} >= 1]?30 )  ; if this is from rg-group, don't strip prefix
    exten => s,23,NoOp(Returning there are no members left in the hunt group to ring)
    
    exten => s,30,Set(HuntMember=HuntMember${HuntLoop})
    exten => s,31,GotoIf($[$["${CALLTRACE_HUNT}" != "" ] & $["${RingGroupMethod}" = "hunt" ]]?32:35 )  ; Set CAll Trace for Hunt member we are going to call
    exten => s,32,Set(CT_EXTEN=${CUT(ARG3,,$[${HuntLoop} + 1])})
    exten => s,33,Set(DB(CALLTRACE/${CT_EXTEN})=${CALLTRACE_HUNT})
    exten => s,34,Goto(s,42)
    
    exten => s,35,GotoIf($[$["${CALLTRACE_HUNT}" != "" ] & $["${RingGroupMethod}" = "memoryhunt" ]]?36:50 )  ;Set Call Trace for each hunt member we are going to call "Memory groups have multiple members to set CALL TRACE For hence the loop
    exten => s,36,Set(CTLoop=0)
    exten => s,37,GotoIf($[${CTLoop} > ${HuntLoop}]?42 )  ; if this is from rg-group, don't strip prefix
    exten => s,38,Set(CT_EXTEN=${CUT(ARG3,,$[${CTLoop} + 1])})
    exten => s,39,Set(DB(CALLTRACE/${CT_EXTEN})=${CALLTRACE_HUNT})
    exten => s,40,Set(CTLoop=$[1 + ${CTLoop}])
    exten => s,41,Goto(s,37)
            
    exten => s,42,Dial(${${HuntMember}}${ds} ) ; dialparties will set the priority to 20 if $ds is not null and its a hunt group
    exten => s,43,Set(HuntLoop=$[1 + ${HuntLoop}])
    exten => s,44,Set(HuntMembers=$[${HuntMembers} - 1])
    exten => s,45,Goto(s,22)
    exten => s,50,DBdel(CALLTRACE/${CT_EXTEN})
    exten => s,51,Goto(s,42)
    
    ; make sure hungup calls go here so that proper cleanup occurs from call confirmed calls and the like
    ;
    exten => h,1,Macro(hangupcall)
    
    ; 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,Macro(user-callerid)
    
    exten => s,n,Set(FROMCONTEXT=exten-vm)
    exten => s,n,Set(VMBOX=${ARG1})
    exten => s,n,Set(EXTTOCALL=${ARG2})
    exten => s,n,Set(CFUEXT=${DB(CFU/${EXTTOCALL})})
    exten => s,n,Set(RT=${IF($[$["${VMBOX}"!="novm"] | $["foo${CFUEXT}"!="foo"]]?${RINGTIMER}:"")})
    exten => s,n,Macro(record-enable,${EXTTOCALL},IN)
    
    exten => s,n,Macro(dial,${RT},${DIAL_OPTIONS},${EXTTOCALL})
    exten => s,n,GosubIf($[$["${DIALSTATUS}"="NOANSWER"] & $["foo${CFUEXT}"!="foo"]]?docfu,1) ; check for CFU in use on no answer
    exten => s,n,NoOp(Voicemail is '${VMBOX}')
    exten => s,n,GotoIf($["${VMBOX}" = "novm"]?s-${DIALSTATUS},1) ; no voicemail in use for this extension
    exten => s,n,NoOp(Sending to Voicemail box ${EXTTOCALL})
    exten => s,n,Macro(vm,${VMBOX},${DIALSTATUS})
    
    ; Try the Call Forward on No Answer / Unavailable number
    exten => docfu,1,Set(RTCFU=${IF($["${VMBOX}"!="novm"]?${RINGTIMER}:"")})
    exten => docfu,n,Dial(Local/${CFUEXT}@from-internal/n,${RTCFU},${DIAL_OPTIONS})
    exten => docfu,n,Return
    
    ; Extensions with no Voicemail box reporting BUSY come here
    exten => s-BUSY,1,NoOp(Extension is reporting BUSY and not passing to Voicemail)
    exten => s-BUSY,n,Playtones(busy)
    exten => s-BUSY,n,Busy(20)
    
    ; Anything but BUSY comes here
    exten => _s-.,1,Playtones(congestion)
    exten => _s-.,n,Congestion(10)
    
    [macro-vm]
    exten => s,1,Macro(user-callerid,SKIPTTL)
    exten => s,n,Set(VMGAIN=${IF($["foo${VM_GAIN}"!="foo"]?"g(${VM_GAIN})":"")})
    ;
    ; If BLKVM_OVERRIDE is set, then someone told us to block calls from going to
    ; voicemail. This variable is reset by the answering channel so subsequent
    ; transfers will properly function.
    ;
    exten => s,n,GotoIf($["foo${DB(${BLKVM_OVERRIDE})}" != "fooTRUE"]?s-${ARG2},1)
    ;
    ; we didn't branch so block this from voicemail
    ;
    exten => s,n,Noop(CAME FROM: ${NODEST} - Blocking VM cause of key: ${DB(BLKVM_OVERRIDE)})
    
    exten => s-BUSY,1,NoOp(BUSY voicemail)
    exten => s-BUSY,n,Macro(get-vmcontext,${ARG1})
    exten => s-BUSY,n,Voicemail(${ARG1}@${VMCONTEXT}|${VM_OPTS}b${VMGAIN})   ; Voicemail Busy message
    exten => s-BUSY,n,Goto(exit-${VMSTATUS},1)
    
    exten => s-DIRECTDIAL,1,NoOp(DIRECTDIAL voicemail)
    exten => s-DIRECTDIAL,n,Macro(get-vmcontext,${ARG1})
    exten => s-DIRECTDIAL,n,Voicemail(${ARG1}@${VMCONTEXT}|${VM_OPTS}${VM_DDTYPE}${VMGAIN})
    exten => s-DIRECTDIAL,n,Goto(exit-${VMSTATUS},1)
    
    exten => _s-.,1,Macro(get-vmcontext,${ARG1})
    exten => _s-.,n,Voicemail(${ARG1}@${VMCONTEXT}|${VM_OPTS}u${VMGAIN})     ; Voicemail Unavailable message
    exten => _s-.,n,Goto(exit-${VMSTATUS},1)
    
    exten => o,1,Background(one-moment-please)      ; 0 during vm message will hangup
    exten => o,n,GotoIf($["x${OPERATOR_XTN}"="x"]?nooper:from-internal,${OPERATOR_XTN},1)
    exten => o,n(nooper),GotoIf($["x${FROM_DID}"="x"]?nodid)
    exten => o,n,Dial(Local/${FROM_DID)@from-pstn)
    exten => o,n,Macro(hangup)
    exten => o,n(nodid),Dial(Local/s@from-pstn)
    exten => o,n,Macro(hangup)
    
    exten => a,1,Macro(get-vmcontext,${ARG1})
    exten => a,n,VoiceMailMain(${ARG1}@${VMCONTEXT})
    exten => a,n,Hangup
    
    exten => exit-FAILED,1,Playback(im-sorry&an-error-has-occured)
    exten => exit-FAILED,n,Hangup()
    
    exten => exit-SUCCESS,1,Playback(goodbye)
    exten => exit-SUCCESS,n,Hangup()
    
    exten => exit-USEREXIT,1,Playback(goodbye)
    exten => exit-USEREXIT,n,Hangup()
    
    exten => t,1,Hangup()
    
    ;------------------------------------------------------------------------
    ; [macro-simple-dial]
    ;------------------------------------------------------------------------
    ; This macro was derived from macro-exten-vm, which is what is normally used to
    ; ring an extension. It has been simplified and designed to never go to voicemail
    ; and always return regardless of the DIALSTATUS for any incomplete call.
    ;
    ; It's current primary purpose is to allow findmefollow ring an extension prior
    ; to trying the follow-me ringgroup that is provided.
    ;
    ; Ring an extension, if the extension is busy or there is no answer, return
    ; ARGS: $EXTENSION, $RINGTIME
    ;------------------------------------------------------------------------
    [macro-simple-dial]
    exten => s,1,Macro(user-callerid,SKIPTTL) ; already called from follow-me
    
    ; FROMCONTEXT was in the original macro-exten-vm where this macro was derived from. A
    ; search through all the modules does not come up with any place using this
    ; variable, but it is left here as a reminder in case there is functionality
    ; that eventually behaves in a certain way as a result of this variable being set
    ; and this macro has to masquerade as exten-vm.
    ;
    exten => s,n,Set(EXTTOCALL=${ARG1})
    exten => s,n,Set(RT=${ARG2})
    exten => s,n,Set(CFUEXT=${DB(CFU/${EXTTOCALL})})
    exten => s,n,Macro(record-enable,${EXTTOCALL},IN)
    
    exten => s,n,Macro(dial,${RT},${DIAL_OPTIONS},${EXTTOCALL})
    
    exten => s,n,Set(PR_DIALSTATUS=${DIALSTATUS})
    
    ; if we return, thus no answer, and they have a CFU setting, then  we try that next
    ;
    exten => s,n,GosubIf($[$["${DIALSTATUS}"="NOANSWER"] & $["foo${CFUEXT}"!="foo"]]?docfu,1) ; check for CFU in use on no answer
    
    ; Nothing yet, then go to the end (which will just return, but in case we decide to do something with certain
    ; return situations, this is left in.
    ;
    exten => s,n,Goto(s-${DIALSTATUS},1)
    
    ; Try the Call Forward on No Answer / Unavailable number.
    ; We want to try CFU if set, but we want the same ring timer as was set to our call (or do we want the
    ; system ringtimer? - probably not). Then if no answer there (assuming it doesn't drop into their vm or
    ; something we return, which will have the net effect of returning to the followme setup.)
    ;
    ; want to avoid going to other follow-me settings here. So check if the CFUEXT is a user and if it is
    ; then direct it straight to ext-local (to avoid getting intercepted by findmefollow) otherwise send it
    ; to from-internal since it may be an outside line.
    ;
    exten => docfu,1,GotoIf( $[ "foo${DB(AMPUSER/${CFUEXT}/device)}" = "foo" ], chlocal)
    exten => docfu,n,Dial(Local/${CFUEXT}@ext-local,${RT},${DIAL_OPTIONS})
    exten => docfu,n,Return
    exten => docfu,n(chlocal),Dial(Local/${CFUEXT}@from-internal/n,${RT},${DIAL_OPTIONS})
    exten => docfu,n,Return
    
    ; In all cases of no connection, come here and simply return, since the calling dialplan will
    ; decide what to do next
    exten => _s-.,1,NoOp(Extension is reporting ${EXTEN})
    ;------------------------------------------------------------------------
    
    
    ; get the voicemail context for the user in ARG1
    [macro-get-vmcontext]
    exten => s,1,Set(VMCONTEXT=${DB(AMPUSER/${ARG1}/voicemail)})
    exten => s,2,GotoIf($["foo${VMCONTEXT}" = "foo"]?200:300)
    exten => s,200,Set(VMCONTEXT=default)
    exten => s,300,NoOp()
    
    ; For some reason, if I don't run setCIDname, CALLERID(name) will be blank in my AGI
    ; ARGS: none
    [macro-fixcid]
    exten => s,1,Set(CALLERID(name)=${CALLERID(name)})
    
    ; Ring groups of phones
    ; ARGS: comma separated extension list
    ; 1 - Ring Group Strategy
    ; 2 - ringtimer
    ; 3 - prefix
    ; 4 - extension list
    [macro-rg-group]
    exten => s,1,Macro(user-callerid,SKIPTTL) ; already called from ringgroup
    exten => s,2,GotoIf($["${CALLERID(name):0:${LEN(${RGPREFIX})}}" != "${RGPREFIX}"]?4:3)  ; check for old prefix
    exten => s,3,Set(CALLERID(name)=${CALLERID(name):${LEN(${RGPREFIX})}}) ; strip off old prefix
    exten => s,4,Set(RGPREFIX=${ARG3})  ; set new prefix
    exten => s,5,Set(CALLERID(name)=${RGPREFIX}${CALLERID(name)})  ; add prefix to callerid name
    exten => s,6,Set(RecordMethod=Group)  ; set new prefix
    exten => s,7,Macro(record-enable,${MACRO_EXTEN},${RecordMethod})
    exten => s,8,Set(RingGroupMethod=${ARG1})     ;
    exten => s,9,Macro(dial,${ARG2},${DIAL_OPTIONS},${ARG4})
    exten => s,10,Set(RingGroupMethod='')     ;
    
    
    ;
    ; Outgoing channel(s) are busy ... inform the client
    ; but use noanswer features like ringgroups don't break by being answered
    ; just to play the message.
    ;
    [macro-outisbusy]
    exten => s,1,Playback(all-circuits-busy-now,noanswer)
    exten => s,n,Playback(pls-try-call-later,noanswer)
    exten => s,n,Macro(hangupcall)
    
    ; What to do on hangup.                                         
    [macro-hangupcall]
    exten => s,1,ResetCDR(w)
    exten => s,n,NoCDR()
     
    ; Cleanup any remaining RG flag
    ;
    exten => s,n,GotoIf($[ "foo${USE_CONFIRMATION}" = "foo" | "foo${RINGGROUP_INDEX}" = "foo" | "${CHANNEL}" != "${UNIQCHAN}"]?skiprg)
    exten => s,n,Noop(Cleaning Up Confirmation Flag: RG/${RINGGROUP_INDEX}/${CHANNEL})
    exten => s,n,DBDel(RG/${RINGGROUP_INDEX}/${CHANNEL})
    
    ; Cleanup any remaining BLKVM flag
    ;
    exten => s,n(skiprg),GotoIf($[ "foo${BLKVM_BASE}" = "foo" | "BLKVM/${BLKVM_BASE}/${CHANNEL}" != "${BLKVM_OVERRIDE}" ]?theend)
    exten => s,n,Noop(Cleaning Up Block VM Flag: ${BLKVM_OVERRIDE})
    exten => s,n,DBDel(${BLKVM_OVERRIDE})
    
    exten => s,n(theend),Wait(5)
    exten => s,n,Hangup
    
    [macro-faxreceive]
    exten => s,1,Set(FAXFILE=/var/spool/asterisk/fax/${UNIQUEID}.tif)
    exten => s,2,Set(EMAILADDR=${FAX_RX_EMAIL})
    exten => s,3,rxfax(${FAXFILE})
    exten => s,103,Set(EMAILADDR=${FAX_RX_EMAIL})
    exten => s,104,Goto(3)
    
    ; dialout and strip the prefix
    [macro-dialout]
    exten => s,1,Macro(user-callerid,SKIPTTL)
    exten => s,2,GotoIf($["${ECID${CALLERID(number)}}" = ""]?5) 	;check for CID override for exten
    exten => s,3,Set(CALLERID(all)=${ECID${CALLERID(number)}})
    exten => s,4,Goto(7)
    exten => s,5,GotoIf($["${OUTCID_${ARG1}}" = ""]?7) 		;check for CID override for trunk
    exten => s,6,Set(CALLERID(all)=${OUTCID_${ARG1}})
    exten => s,7,Set(length=${LEN(${DIAL_OUT_${ARG1}})})
    exten => s,8,Dial(${OUT_${ARG1}}/${ARG2:${length}})
    exten => s,9,Playtones(congestion)
    exten => s,10,Congestion(5)
    exten => s,109,Macro(outisbusy)
    
    
    ; dialout using default OUT trunk - no prefix
    [macro-dialout-default]
    exten => s,1,Macro(user-callerid,SKIPTTL)
    exten => s,2,Macro(record-enable,${CALLERID(number)},OUT)
    exten => s,3,Macro(outbound-callerid,${ARG1})
    exten => s,4,Dial(${OUT}/${ARG1})
    exten => s,5,Playtones(congestion)
    exten => s,6,Congestion(5)
    exten => s,105,Macro(outisbusy)
    
    ; dialout using a trunk, using pattern matching (don't strip any prefix)
    ; arg1 = trunk number, arg2 = number, arg3 = route password
    ;
    ; MODIFIED (PL)
    ;
    ; Modified both Dial() commands to include the new TRUNK_OPTIONS from the general
    ; screen of AMP
    ;
    [macro-dialout-trunk]
    exten => s,1,Set(DIAL_TRUNK=${ARG1})
    
    ; If NODEST is set, clear it. No point in remembering since dialout-trunk will just end in the
    ; bit bucket. But if answered by an outside line with transfer capability, we want NODEST to be
    ; clear so a subsequent transfer to an internal extension works and goes to voicmail or other
    ; destinations.
    ;
    exten => s,n,Set(_NODEST=)
    
    exten => s,n,Set(DIAL_NUMBER=${ARG2})
    exten => s,n,Set(ROUTE_PASSWD=${ARG3})
    exten => s,n,Set(DIAL_TRUNK_OPTIONS=${DIAL_OPTIONS}) // will be reset to TRUNK_OPTIONS if not intra-company
    exten => s,n,GotoIf($["${ROUTE_PASSWD}" = ""]?noauth) ; arg3 is pattern password
    exten => s,n(auth),Authenticate(${ROUTE_PASSWD})
    exten => s,n(noauth),Set(GROUP()=OUT_${DIAL_TRUNK})
    exten => s,n,Macro(user-callerid,SKIPTTL)
    exten => s,n,Macro(record-enable,${CALLERID(number)},OUT)
    exten => s,n,GotoIf($["${INTRACOMPANYROUTE}" = "YES"]?skipoutcid) ;Set to YES if treated like internal
    exten => s,n,Set(DIAL_TRUNK_OPTIONS=${TRUNK_OPTIONS})
    exten => s,n,Macro(outbound-callerid,${DIAL_TRUNK})
    exten => s,n(skipoutcid),GotoIf($["${OUTMAXCHANS_${DIAL_TRUNK}}foo" = "foo"]?nomax)
    exten => s,n(checkmax),GotoIf($[ ${GROUP_COUNT()} > ${OUTMAXCHANS_${DIAL_TRUNK}} ]?chanfull)
    exten => s,n(nomax),DeadAGI(fixlocalprefix) ; this sets DIAL_NUMBER to the proper dial string for this trunk
    exten => s,n,Set(OUTNUM=${OUTPREFIX_${DIAL_TRUNK}}${DIAL_NUMBER}) ; OUTNUM is the final dial number
    exten => s,n,Set(custom=${CUT(OUT_${DIAL_TRUNK},:,1)}) ; Custom trunks are prefixed with "AMP:"
    exten => s,n,GotoIf($["${custom}" = "AMP"]?customtrunk)
    exten => s,n,Dial(${OUT_${DIAL_TRUNK}}/${OUTNUM},300,${DIAL_TRUNK_OPTIONS}) ; Regular Trunk Dial
    exten => s,n,Goto(s-${DIALSTATUS},1)
    exten => s,n(customtrunk),Set(pre_num=${CUT(OUT_${DIAL_TRUNK},$,1)})
    exten => s,n,Set(the_num=${CUT(OUT_${DIAL_TRUNK},$,2)}) ; this is where we expect to find string OUTNUM
    exten => s,n,Set(post_num=${CUT(OUT_${DIAL_TRUNK},$,3)})
    exten => s,n,GotoIf($["${the_num}" = "OUTNUM"]?outnum:skipoutnum) ; if we didn't find "OUTNUM", then skip to Dial
    exten => s,n(outnum),Set(the_num=${OUTNUM}) ; replace "OUTNUM" with the actual number to dial
    exten => s,n(skipoutnum),Dial(${pre_num:4}${the_num}${post_num},300,${DIAL_TRUNK_OPTIONS})
    exten => s,n,Goto(s-${DIALSTATUS},1)
    
    exten => s,n(chanfull),Noop(max channels used up)
    
    exten => s-BUSY,1,NoOp(Dial failed due to trunk reporting BUSY - giving up)
    exten => s-BUSY,2,Busy(20)
    
    exten => s-NOANSWER,1,NoOp(Dial failed due to trunk reporting NOANSWER - giving up)
    exten => s-NOANSWER,2,Playtones(congestion)
    exten => s-NOANSWER,3,Congestion(20)
    
    exten => s-CANCEL,1,NoOp(Dial failed due to trunk reporting CANCEL - giving up)
    exten => s-CANCEL,2,Playtones(congestion)
    exten => s-CANCEL,3,Congestion(20)
    
    exten => _s-.,1,NoOp(Dial failed due to ${DIALSTATUS} - failing through to other trunks)
    
    exten => h,1,Macro(hangupcall)
    
    ; Adds a dynamic agent/member to a Queue
    ; Prompts for call-back number - in not entered, uses CIDNum
    [macro-agent-add]
    exten => s,1,Wait(1)
    exten => s,2,Macro(user-callerid,SKIPTTL)
    exten => s,3,Read(CALLBACKNUM,agent-user)  	; get callback number from user
    exten => s,4,GotoIf($["${CALLBACKNUM}" = ""]?5:7)	; if user just pressed # or timed out, use cidnum
    exten => s,5,Set(CALLBACKNUM=${CALLERID(number)})
    exten => s,6,GotoIf($["${CALLBACKNUM}" = ""]?2)	; if still no number, start over
    exten => s,7,GotoIf($["${ARG2}" = ""]?9:8)	; arg2 is queue password
    exten => s,8,Authenticate(${ARG2})
    exten => s,9,AddQueueMember(${ARG1}|Local/${CALLBACKNUM}@from-internal/n)	; using chan_local allows us to have agents over trunks
    exten => s,10,UserEvent(Agentlogin|Agent: ${CALLBACKNUM})
    exten => s,11,Wait(1)
    exten => s,12,Playback(agent-loginok)
    exten => s,13,Hangup()
    
    ; Removes a dynamic agent/member from a Queue
    ; Prompts for call-back number - in not entered, uses CIDNum
    [macro-agent-del]
    exten => s,1,Wait(1)
    exten => s,2,Macro(user-callerid,SKIPTTL)
    exten => s,3,Read(CALLBACKNUM,agent-user)  	; get callback number from user
    exten => s,4,GotoIf($["${CALLBACKNUM}" = ""]?5:7)	; if user just pressed # or timed out, use cidnum
    exten => s,5,Set(CALLBACKNUM=${CALLERID(number)})
    exten => s,6,GotoIf($["${CALLBACKNUM}" = ""]?2)	; if still no number, start over
    exten => s,7,RemoveQueueMember(${ARG1}|Local/${CALLBACKNUM}@from-internal/n)
    exten => s,8,UserEvent(RefreshQueue)
    exten => s,9,Wait(1)
    exten => s,10,Playback(agent-loggedoff)
    exten => s,11,Hangup()
    
    ; arg1 = trunk number, arg2 = number
    [macro-dialout-enum]
    ; This has been violently beaten upon by Rob Thomas, xrobau@gmail.com
    ; to 1: Be compliant with all the depreciated bits in asterisk 1.2 and
    ; above, and 2: to give a good shot at attempting to be compliant with
    ; RFC3761 by honouring the order in which records are returned.
    exten => s,1,GotoIf($["${ARG3}" = ""]PASSWD?NOPASSWD); arg3 is pattern password 
    exten => s,n(PASSWD),Authenticate(${ARG3}) 
    exten => s,n(NOPASSWD),Macro(user-callerid,SKIPTTL) 
    exten => s,n,Macro(record-enable,${CALLERID(number)},OUT)
    exten => s,n,Macro(outbound-callerid,${ARG1})
    exten => s,n,Set(GROUP()=OUT_${ARG1})
    exten => s,n,GotoIf($[ ${GROUP_COUNT()} > ${OUTMAXCHANS_${ARG1}} ]?nochans)
    exten => s,n,Set(DIAL_NUMBER=${ARG2})
    exten => s,n,Set(DIAL_TRUNK=${ARG1})
    exten => s,n,DeadAGI(fixlocalprefix)  ; this sets DIAL_NUMBER to the proper dial string for this trunk
    exten => s,n,Set(E164NETWORKS=e164.arpa-e164.info-e164.org) ; enum networks to check
    exten => s,n,GotoIf($["${DIAL_NUMBER:0:1}" = "+"]?begin) ; Skip next line if it already is prefixed by a plus
    exten => s,n,Set(DIAL_NUMBER=+${DIAL_NUMBER}) ; Add a plus to the start, becasue ENUMLOOKUP needs it.
    
    ; start of main network loop
    exten => s,n(begin),NoOp(E164NETWORKS is ${E164NETWORKS})
    exten => s,n,GotoIf($["${E164NETWORKS:1:2}"=""]?failedtotally)
    exten => s,n,Set(ENUMNET=${CUT(E164NETWORKS,-,1)})
    exten => s,n,Set(E164NETWORKS=${CUT(E164NETWORKS,-,2-)})
    
    exten => s,n,NoOp(E164NETWORKS is now ${E164NETWORKS})
    exten => s,n,NoOp(ENUMNET is ${ENUMNET})
    
    exten => s,n,Set(ENUMCOUNT=${ENUMLOOKUP(${DIAL_NUMBER},all,c,${ENUMNET})})
    exten => s,n,Set(ENUMPTR=0)
    exten => s,n,Set(LOOKUPBUG=0)
    
    ; start of main lookup loop
    exten => s,n(startloop),GotoIf($["${ENUMPTR}"<"${ENUMCOUNT}"]?continue:failed)
    
    ; Now, let's start through them.
    exten => s,n(continue),Set(ENUMPTR=$[${ENUMPTR}+1])
    exten => s,n,NoOp(Doing ENUMLOOKUP(${DIAL_NUMBER},all,${ENUMPTR},${ENUMNET}))
    exten => s,n,Set(ENUM=${ENUMLOOKUP(${DIAL_NUMBER},all,${ENUMPTR},${ENUMNET})})
    
    ; Deal with reponse
    exten => s,n,GotoIf($["${ENUM:0:3}" = "sip" ]?sipuri)
    exten => s,n,GotoIf($["${ENUM:0:3}" = "iax" ]?iaxuri)
    ; It doesn't matter if you don't have h323 enabled, as when it tries to dial, it cares
    ; about dialstatus and retries if there are any enum results left.
    exten => s,n,GotoIf($["${ENUM:0:3}" = "h32" ]?h323uri)
    
    ; e164.org can return 'ADDRESS' lines. Because of *'s poor handling of Enum 
    ; lookups, we want to DECREMENT the enum pointer. Yes. That means we try more
    ; times than there actually exists entries. 
    exten => s,n,GotoIf($["${ENUM:0:3}" = "ADD" ]?enumbug)
    
    ; OK. If we're here, we've still got some enum entries to go through. Back to 
    ; the start with you!
    exten => s,n,Goto(startloop)
    
    ; We're here because of the poor implementation of ENUMLOOKUP in Asterisk. It
    ; is quite possible to do three ENUMLOOKUPS and get the same entry each time.
    ; The only workaround I can think of is when we hit an invalid entry, do a 
    ; DECREMENT of the pointer, and keep trying. 
    exten => s,n(enumbug),Set(ENUMPTR=$[${ENUMPTR}-1])
    exten => s,n,NoOp(If this is looping with the same ENUM value, The ENUMLOOKUP function is fixed!)
    exten => s,n,Set(LOOKUPBUG=$[${LOOKUPBUG}+1])
    ; If we've done this more than, ooh, 5 times, then give up on this network. Sorry.
    exten => s,n,GotoIf($["${LOOKUPBUG}" > 5 ]?failed)
    exten => s,n,Goto(continue)
    
    ; If the prefix is 'sip:'...
    exten => s,n(sipuri),Set(DIALSTR=SIP/${ENUM:4})
    exten => s,n,Goto(dodial)
    
    ; If it's IAX2...
    exten => s,n(iaxuri),Set(DIALSTR=IAX2/${ENUM:5})
    exten => s,n,Goto(dodial)
    
    ; Or even if it's H323.
    exten => s,n(h323uri),Set(DIALSTR=H323/${ENUM:5})
    
    exten => s,n(dodial),Dial(${DIALSTR})
    exten => s,n,NoOp(Dial exited in macro-enum-dialout with ${DIALSTATUS})
    
    ; Now, if we're still here, that means the Dial failed for some reason. 
    ; If it's CONGESTION or CHANUNAVAIL we probably want to try again on a
    ; different channel. However, if it's the last one, we don't have any
    ; left, and I didn't keep any previous dialstatuses, so hopefully 
    ; someone looking throught the logs would have seen the NoOp's
    exten => s,n,GotoIf($["${ENUMPTR}"<"${ENUMCOUNT}"]?maybemore:dialfailed)
    exten => s,n(maybemore),GotoIf($[ $[ "${DIALSTATUS}" = "CHANUNAVAIL" ] | $[ "${DIALSTATUS}" = "CONGESTION" ] ]?continue)
    
    ; If we're here, then it's BUSY or NOANSWER or something and well, deal with it.
    exten => s,n(dialfailed),Goto(s-${DIALSTATUS},1)
    
    ; Here are the exit points for the macro.
    exten => s,n(failed),NoOp(EnumLookup failed on network ${ENUMNET})
    exten => s,n,Goto(begin)
    
    exten => s,n(failedtotally),NoOp(EnumLookup failed -- no more networks to try)
    exten => s,n,Goto(end)
    
    exten => s,n(nochans),NoOp(max channels used up)
    
    exten => s,n(end),NoOp(Exiting macro-dialout-enum)
    
    exten => s-BUSY,1,NoOp(Trunk is reporting BUSY)
    exten => s-BUSY,2,Busy(20)
    
    exten => _s-.,1,NoOp(Dial failed due to ${DIALSTATUS})
    
    [macro-record-enable]
    exten => s,1,GotoIf(${LEN(${BLINDTRANSFER})} > 0?2:4)
    exten => s,2,ResetCDR(w)
    exten => s,3,StopMonitor()
    ; I haven't figured out how, but occasionally a hung up
    ; call can end up here. If you don't use DeadAGI (which does
    ; work fine as a normal AGI), asterisk deadlocks a thread,
    ; and ends up grumpy.
    exten => s,4,DeadAGI(recordingcheck,${TIMESTAMP},${UNIQUEID})
    exten => s,5,Noop(No recording needed) 
    exten => s,999,MixMonitor(${CALLFILENAME}.wav)
    
    ;exten => s,3,BackGround(for-quality-purposes)
    ;exten => s,4,BackGround(this-call-may-be)
    ;exten => s,5,BackGround(recorded)
    
    ; This macro is for dev purposes and just dumps channel/app variables.  Useful when designing new contexts. 
    [macro-dumpvars]
    exten => s,1,Noop(ACCOUNTCODE=${ACCOUNTCODE})
    exten => s,2,Noop(ANSWEREDTIME=${ANSWEREDTIME})
    exten => s,3,Noop(BLINDTRANSFER=${BLINDTRANSFER})
    exten => s,4,Noop(CALLERID=${CALLERID(all)})
    exten => s,5,Noop(CALLERID(name)=${CALLERID(name)})
    exten => s,6,Noop(CALLERID(number)=${CALLERID(number)})
    exten => s,7,Noop(CALLINGPRES=${CALLINGPRES})
    exten => s,8,Noop(CHANNEL=${CHANNEL})
    exten => s,9,Noop(CONTEXT=${CONTEXT})
    exten => s,10,Noop(DATETIME=${DATETIME})
    exten => s,11,Noop(DIALEDPEERNAME=${DIALEDPEERNAME})
    exten => s,12,Noop(DIALEDPEERNUMBER=${DIALEDPEERNUMBER})
    exten => s,13,Noop(DIALEDTIME=${DIALEDTIME})
    exten => s,14,Noop(DIALSTATUS=${DIALSTATUS})
    exten => s,15,Noop(DNID=${DNID})
    exten => s,16,Noop(EPOCH=${EPOCH})
    exten => s,17,Noop(EXTEN=${EXTEN})
    exten => s,18,Noop(HANGUPCAUSE=${HANGUPCAUSE})
    exten => s,19,Noop(INVALID_EXTEN=${INVALID_EXTEN})
    exten => s,20,Noop(LANGUAGE=${LANGUAGE})
    exten => s,21,Noop(MEETMESECS=${MEETMESECS})
    exten => s,22,Noop(PRIORITY=${PRIORITY})
    exten => s,23,Noop(RDNIS=${RDNIS})
    exten => s,24,Noop(SIPDOMAIN=${SIPDOMAIN})
    exten => s,25,Noop(SIP_CODEC=${SIP_CODEC})
    exten => s,26,Noop(SIPCALLID=${SIPCALLID})
    exten => s,27,Noop(SIPUSERAGENT=${SIPUSERAGENT})
    exten => s,28,Noop(TIMESTAMP=${TIMESTAMP})
    exten => s,29,Noop(TXTCIDNAME=${TXTCIDNAME})
    exten => s,30,Noop(UNIQUEID=${UNIQUEID})
    exten => s,31,Noop(TOUCH_MONITOR=${TOUCH_MONITOR})
    exten => s,32,Noop(MACRO_CONTEXT=${MACRO_CONTEXT})
    exten => s,33,Noop(MACRO_EXTEN=${MACRO_EXTEN})
    exten => s,34,Noop(MACRO_PRIORITY=${MACRO_PRIORITY})
    
    [macro-user-logon]
    ; check device type
    exten => s,1,Set(DEVICETYPE=${DB(DEVICE/${CALLERID(number)}/type)})
    exten => s,2,GotoIf($["${DEVICETYPE}" = "fixed"]?s-FIXED,1)
    ; get user's extension
    exten => s,3,Set(AMPUSER=${ARG1})
    exten => s,4,GotoIf($["${AMPUSER}" = ""]?5:9)
    exten => s,5,BackGround(please-enter-your)
    exten => s,6,Playback(extension)
    exten => s,7,Read(AMPUSER,then-press-pound)
    ; get user's password and authenticate
    exten => s,8,Wait(1)
    exten => s,9,Set(AMPUSERPASS=${DB(AMPUSER/${AMPUSER}/password)})
    exten => s,10,GotoIf($[${LEN(${AMPUSERPASS})} = 0]?s-NOPASSWORD,1)
    ; do not continue if the user has already logged onto this device
    exten => s,11,Set(DEVICEUSER=${DB(DEVICE/${CALLERID(number)}/user)})
    exten => s,12,GotoIf($["${DEVICEUSER}" = "${AMPUSER}"]?s-ALREADYLOGGEDON,1)
    exten => s,13,Authenticate(${AMPUSERPASS})
    ; devices can only be mapped to one user - loggoff anyone else who is here
    exten => s,14,Macro(user-logoff)
    ; map user to device
    exten => s,15,Set(AMPUSERDEVICES=${DB(AMPUSER/${AMPUSER}/device)})
    exten => s,16,GotoIf($[${LEN(${AMPUSERDEVICES})} = 0]?18) 
    exten => s,17,Set(AMPUSERDEVICES=${AMPUSERDEVICES}&)
    exten => s,18,Set(AMPUSERDEVICES=${AMPUSERDEVICES}${CALLERID(number)})
    exten => s,19,Set(DB(AMPUSER/${AMPUSER}/device)=${AMPUSERDEVICES})
    ; map device to user
    exten => s,20,Set(DB(DEVICE/${CALLERID(number)}/user)=${AMPUSER})
    ; create symlink from dummy device mailbox to user's mailbox
    exten => s,21,System(/bin/ln -s /var/spool/asterisk/voicemail/default/${AMPUSER}/ /var/spool/asterisk/voicemail/device/${CALLERID(number)})
    
    exten => s-FIXED,1,NoOp(Device is FIXED and cannot be logged into)
    exten => s-FIXED,2,Playback(ha/phone)
    exten => s-FIXED,3,SayDigits(${CALLERID(number)})
    exten => s-FIXED,4,Playback(is-curntly-unavail)
    exten => s-FIXED,5,Playback(vm-goodbye)
    exten => s-FIXED,6,Hangup ;TODO should play msg indicated device cannot be logged into 
    
    exten => s-ALREADYLOGGEDON,1,NoOp(This device has already been logged into by this user)
    exten => s-ALREADYLOGGEDON,2,Playback(vm-goodbye)
    exten => s-ALREADYLOGGEDON,3,Hangup ;TODO should play msg indicated device is already logged into 
    
    exten => s-NOPASSWORD,1,NoOp(This extension does not exist or no password is set)
    exten => s-NOPASSWORD,2,Playback(an-error-has-occured)
    exten => s-NOPASSWORD,3,Playback(vm-goodbye)
    exten => s-NOPASSWORD,4,Hangup ;TODO should play msg indicated device is already logged into 
    
    [macro-user-logoff]
    ; check device type
    exten => s,1,Set(DEVICETYPE=${DB(DEVICE/${CALLERID(number)}/type)})
    exten => s,2,GotoIf($["${DEVICETYPE}" = "fixed"]?s-FIXED,1)
    ; remove entry from user's DEVICE key
    ; delete the symlink to user's voicemail box
    exten => s,3,System(rm -f /var/spool/asterisk/voicemail/device/${CALLERID(number)})
    exten => s,4,Set(DEVAMPUSER=${DB(DEVICE/${CALLERID(number)}/user)})
    exten => s,5,Set(AMPUSERDEVICES=${DB(AMPUSER/${DEVAMPUSER}/device)})
    exten => s,6,DeadAGI(list-item-remove.php,${AMPUSERDEVICES},${CALLERID(number)},AMPUSERDEVICES,&)
    ; reset user -> device mapping
    ; users can log onto multiple devices, need to just remove device from value
    exten => s,7,Set(DB(AMPUSER/${DEVAMPUSER}/device)=${AMPUSERDEVICES})
    ; reset device -> user mapping
    exten => s,8,Set(DB(DEVICE/${CALLERID(number)}/user)=none)
    exten => s,9,Playback(vm-goodbye)
    
    exten => s-FIXED,1,NoOp(Device is FIXED and cannot be logged out of)
    exten => s-FIXED,2,Playback(an-error-has-occured)
    exten => s-FIXED,3,Playback(vm-goodbye)
    exten => s-FIXED,4,Hangup ;TODO should play msg indicated device cannot be logged into 
    
    [macro-systemrecording]
    exten => s,1,Goto(${ARG1},1)
    
    exten => dorecord,1,Record(/tmp/${CALLERID(number)}-ivrrecording:wav)
    exten => dorecord,n,Wait(1)
    exten => dorecord,n,Goto(confmenu,1)
    
    exten => docheck,1,Playback(/tmp/${CALLERID(number)}-ivrrecording)
    exten => docheck,n,Wait(1)
    exten => docheck,n,Goto(confmenu,1)
    
    exten => confmenu,1,Background(to-listen-to-it&press-1&to-rerecord-it&press-star|m||macro-systemrecording)
    exten => confmenu,n,Read(RECRESULT||1|||4)
    exten => confmenu,n,GotoIf($["x${RECRESULT}"="x*"]?dorecord,1)
    exten => confmenu,n,GotoIf($["x${RECRESULT}"="x1"]?docheck,1)
    exten => confmenu,n,Goto(1)
    
    exten => 1,1,Goto(docheck,1)
    exten => *,1,Goto(dorecord,1)
    
    exten => t,1,Playback(goodbye)
    exten => t,n,Hangup
    
    exten => i,1,Playback(pm-invalid-option)
    exten => i,n,Goto(confmenu,1)
    
    exten => h,1,Hangup
    
    
    ;
    ; ############################################################################
    ; CallerID Handling
    ; ############################################################################
    
    ;sets the callerid of the device to that of the logged in user
    [macro-user-callerid]
    exten => s,1,Noop(user-callerid: ${CALLERID(name)} ${CALLERID(number)})
    exten => s,n,GotoIf($["${CHANNEL:0:5}" = "Local"]?report) 
    exten => s,n,GotoIf($["${REALCALLERIDNUM:1:2}" != ""]?start)
    exten => s,n,Set(REALCALLERIDNUM=${CALLERID(number)})
    exten => s,n(start),NoOp(REALCALLERIDNUM is ${REALCALLERIDNUM})
    exten => s,n,Set(AMPUSER=${DB(DEVICE/${REALCALLERIDNUM}/user)})
    exten => s,n,Set(AMPUSERCIDNAME=${DB(AMPUSER/${AMPUSER}/cidname)})
    exten => s,n,GotoIf($["x${AMPUSERCIDNAME:1:2}" = "x"]?report) 
    exten => s,n,Set(CALLERID(all)=${AMPUSERCIDNAME} <${AMPUSER}>)
    exten => s,n,Set(REALCALLERIDNUM=${DB(DEVICE/${REALCALLERIDNUM}/user)})
    exten => s,n(report),Noop(TTL: ${TTL} ARG1: ${ARG1})
    exten => s,n,GotoIf($[ "${ARG1}" = "SKIPTTL" ]?continue)
    exten => s,n(report2),Set(_TTL=${IF($["foo${TTL}" = "foo"]?64:$[ ${TTL} - 1 ])})
    exten => s,n,GotoIf($[ ${TTL} > 0 ]?continue)
    exten => s,n,Wait(${RINGTIMER}) ; wait for a while, to give it a chance to be picked up by voicemail
    exten => s,n,Answer()
    exten => s,n,Wait(2)
    exten => s,n,Playback(im-sorry&an-error-has-occured&with&call-forwarding)
    exten => s,n,Macro(hangupcall)
    exten => s,n,Congestion()
    exten => s,n(continue),NoOp(Using CallerID ${CALLERID(all)})
    exten => h,1,Macro(hangupcall)
    
    ; overrides callerid out trunks
    ; arg1 is trunk
    ; macro-user-callerid should be called _before_ using this macro
    [macro-outbound-callerid]
    ; Keep the original CallerID number, for failover to the next trunk.
    exten => s,1,GotoIf($["${REALCALLERIDNUM:1:2}" != ""]?start)
    exten => s,n,Set(REALCALLERIDNUM=${CALLERID(number)})
    exten => s,n(start),NoOp(REALCALLERIDNUM is ${REALCALLERIDNUM})
    
    ; If this came through a ringgroup or CF, then we want to retain original CID unless
    ; OUTKEEPCID_${trunknum} is set.
    ;
    exten => s,n,GotoIf($["${KEEPCID}" != "TRUE"]?normcid) ;Set to TRUE if coming from ringgroups, CF, etc.
    exten => s,n,GotoIf($["x${OUTKEEPCID_${ARG1}}" = "xon"]?normcid)
    exten => s,n,GotoIf($["foo${REALCALLERIDNUM}" = "foo"]?normcid) ;if not set to anything, go through normal processing
    exten => s,n,Set(USEROUTCID=${REALCALLERIDNUM})
    
    ; We now have to make sure the CID is valid. If we find an AMPUSER with the same CID, we assume it is an internal 
    ; call (would be quite a conincidence if not) and go through the normal processing to get that CID. If a device 
    ; is set for this CID, then it must be internal 
    ; 
    exten => s,n,GotoIf($["foo${DB(AMPUSER/${REALCALLERIDNUM}/device)}" = "foo"]?bypass:normcid) 
    
    exten => s,n(normcid),Set(USEROUTCID=${DB(AMPUSER/${REALCALLERIDNUM}/outboundcid)})
    exten => s,n(bypass),Set(EMERGENCYCID=${DB(DEVICE/${REALCALLERIDNUM}/emergency_cid)})
    exten => s,n,Set(TRUNKOUTCID=${OUTCID_${ARG1}})
    exten => s,n,GotoIf($["${EMERGENCYROUTE:1:2}" = ""]?trunkcid) ; check EMERGENCY ROUTE
    exten => s,n,GotoIf($["${EMERGENCYCID:1:2}" = ""]?trunkcid) ; empty EMERGENCY CID, so default back to trunk
    exten => s,n,Set(CALLERID(all)=${EMERGENCYCID}) ; emergency cid for device
    exten => s,n,Goto(report)
    exten => s,n(trunkcid),GotoIf($["${TRUNKOUTCID:1:2}" = ""]?usercid)  ;check for CID override for trunk (global var)
    exten => s,n,Set(CALLERID(all)=${TRUNKOUTCID})
    exten => s,n(usercid),GotoIf($["${USEROUTCID:1:2}" = ""]?report) ; check CID override for extension
    exten => s,n,Set(CALLERID(all)=${USEROUTCID})
    exten => s,n,GotoIf($["x${CALLERID(name)}"!="xhidden"]?report:hidecid) ; check CID blocking for extension
    exten => s,n(hidecid),SetCallerPres(prohib_passed_screen) ; Only works with ISDN (T1/E1/BRI)
    exten => s,n(report),NoOp(CallerID set to ${CALLERID(all)})
    
    ; Privacy Manager Macro makes sure that any calls that don't pass the privacy manager are presented
    ; with congestion since there have been observed cases of the call continuing if not stopped with a 
    ; congestion, and this provides a slightly more friendly 'sorry' message in case the user is
    ; legitamately trying to be cooperative. 
    ;
    ; Note: the following options are configurable in privacy.conf:
    ;
    ;	maxretries = 3 ; default value, number of retries before failing
    ;	minlength = 10 ; default value, number of digits to be accepted as valid CID
    ;
    [macro-privacy-mgr]
    exten => s,1,Set(KEEPCID=${CALLERID(num)})
    exten => s,n,GotoIf($["foo${CALLERID(num):0:1}"="foo+"]?CIDTEST2:CIDTEST1)
    exten => s,n(CIDTEST1),Set(TESTCID=${MATH(1+${CALLERID(num)})})
    exten => s,n,Goto(TESTRESULT)
    exten => s,n(CIDTEST2),Set(TESTCID=${MATH(1+${CALLERID(num):1})})
    exten => s,n(TESTRESULT),GotoIf($["foo${TESTCID}"="foo"]?CLEARCID:PRIVMGR)
    exten => s,n(CLEARCID),Set(CALLERID(num)=)
    exten => s,n(PRIVMGR),PrivacyManager()
    exten => s,n,SetCallerPres(allowed_passed_screen); stop gap until app_privacy.c clears unavailble bit
    exten => s,PRIVMGR+101,Noop(STATUS: ${PRIVACYMGRSTATUS} CID: ${CALLERID(num)} ${CALLERID(name)} CALLPRES: ${CALLLINGPRES})
    exten => s,n,Playback(sorry-youre-having-problems)
    exten => s,n,Playback(goodbye)
    exten => s,n,Playtones(congestion)
    exten => s,n,Congestion(5)
    
    
    ;
    ; ############################################################################
    ; Inbound Contexts [from]
    ; ############################################################################
    
    [from-sip-external]
    ;give external sip users congestion and hangup
    ; Yes. This is _really_ meant to be _. - I know asterisk whinges about it, but 
    ; I do know what I'm doing. This is correct.
    exten => _.,1,NoOp(Received incoming SIP connection from unknown peer to ${EXTEN})
    exten => _.,n,Set(DID=${IF($["${EXTEN:1:2}"=""]?s:${EXTEN})})
    exten => _.,n,Goto(s,1)
    exten => s,1,Ringing
    exten => s,n,GotoIf($["${ALLOW_SIP_ANON}"="yes"]?from-trunk,${DID},1)
    exten => s,n,Set(TIMEOUT(absolute)=15)
    exten => s,n,Answer
    exten => s,n,Wait(2)
    exten => s,n,Playback(ss-noservice)
    exten => s,n,Playtones(congestion)
    exten => s,n,Congestion(5)
    exten => h,1,NoOp(Hangup)
    exten => i,1,NoOp(Invalid)
    exten => t,1,NoOp(Timeout)
    
    [from-internal]
    ; applications are now mostly all found in from-internal-additional in _custom.conf
    include => parkedcalls
    include => from-internal-custom
    ;allow phones to dial other extensions
    include => ext-fax
    ;allow phones to access generated contexts
    ;
    ; MODIFIED (PL)
    ;
    ; Currently the include for findmefollow is being auto-generated before ext-local which is the desired behavior.
    ; However, I haven't been able to do anything that I know of to force this. We need to determine if it should
    ; be hardcoded into here to make sure it doesn't change with some configuration. For now I will leave it out
    ; until we can discuss this.
    ;
    include => from-internal-additional
    include => ext-local-confirm
    ; This causes grief with '#' transfers, commenting out for the moment.
    ; include => bad-number
    exten => s,1,Macro(hangupcall)
    exten => h,1,Macro(hangupcall)
    
    ;------------------------------------------------------------------------
    ; [bad-number]
    ;------------------------------------------------------------------------
    ; This is where all calls go that don't have any other destination provided
    ;
    ;------------------------------------------------------------------------
    [bad-number]
    exten => _X.,1,Wait(1)
    exten => _X.,n,Playback(silence/1&cannot-complete-as-dialed&check-number-dial-again,noanswer)
    exten => _X.,n,Wait(1)
    exten => _X.,n,Congestion(20)
    exten => _X.,n,Hangup()
    
    exten => _*.,1,Wait(1)
    exten => _*.,n,Playback(silence/1&feature-not-avail-line&silence/1&cannot-complete-as-dialed&check-number-dial-again,noanswer)
    exten => _*.,n,Wait(1)
    exten => _*.,n,Congestion(20)
    exten => _*.,n,Hangup()
    ;------------------------------------------------------------------------
    
    [from-zaptel]
    exten => _X.,1,Set(DID=${EXTEN})
    exten => _X.,n,Goto(s,1)
    exten => s,1,NoOp(Entering from-zaptel with DID == ${DID})
    ; Some trunks _require_ a RINGING be sent before an Answer. 
    exten => s,n,Ringing()
    ; If ($did == "") { $did = "s"; }
    exten => s,n,Set(DID=${IF($["${DID}"= ""]?s:${DID})})
    exten => s,n,NoOp(DID is now ${DID})
    exten => s,n,GotoIf($["${CHANNEL:0:3}"="Zap"]?zapok:notzap)
    exten => s,n(notzap),Goto(from-pstn,${DID},1)
    ; If there's no ext-did,s,1, that means there's not a no did/no cid route. Hangup.
    exten => s,n,Macro(hangup)
    exten => s,n(zapok),NoOp(Is a Zaptel Channel)
    exten => s,n,Set(CHAN=${CHANNEL:4})
    exten => s,n,Set(CHAN=${CUT(CHAN,-,1)})
    exten => s,n,Macro(from-zaptel-${CHAN},${DID},1)
    ; If nothing there, then treat it as a DID
    exten => s,n,NoOp(Returned from Macro from-zaptel-${CHAN})
    exten => s,n,Goto(from-pstn,${DID},1)
    exten => fax,1,Goto(ext-fax,in_fax,1)
    
    ; ##########################################
    ; ## Ring Groups with Confirmation macros ##
    ; ##########################################
    ; Used by followme and ringgroups
    
    ;------------------------------------------------------------------------
    ; [macro-dial-confirm]
    ;------------------------------------------------------------------------
    ; This has now been incorporated into dialparties. It still only works with ringall
    ; and ringall-prim strategies. Have not investigated why it doesn't work with
    ; hunt and memory hunt.
    ;
    ;------------------------------------------------------------------------
    [macro-dial-confirm]
    ; This was written to make it easy to use macro-dial-confirm instead of macro-dial in generated dialplans.
    ; This takes the same paramaters, with an additional paramater of the ring group Number
    ; ARG1 is the timeout
    ; ARG2 is the DIAL_OPTIONS
    ; ARG3 is a list of xtns to call - 203-222-240-123123123#-211
    ; ARG4 is the ring group number
    
    ; This sets a unique value to indicate that the channel is ringing. This is used for warning slow
    ; users that the call has already been picked up.
    ;
    exten => s,1,Set(DB(RG/${ARG4}/${CHANNEL})=RINGING)
    
    ; We need to keep that channel variable, because it'll change when we do this dial, so set it to
    ; fallthrough to every sibling.
    ;
    exten => s,n,Set(__UNIQCHAN=${CHANNEL})
    
    ; The calling ringgroup should have set RingGroupMethod appropriately. We need to set two
    ; additional parameters:
    ;
    ; USE_CONFIRMATION, RINGGROUP_INDEX
    ;
    ; Thse are passed to inform dialparties to place external calls through the [grps] context
    ;
    exten => s,n,Set(USE_CONFIRMATION=TRUE)
    exten => s,n,Set(RINGGROUP_INDEX=${ARG4})
    exten => s,n,Set(ARG4=) ; otherwise it gets passed to dialparties.agi which processes it (prob bug) 
    
    exten => s,n,Macro(dial,${ARG1},${ARG2},${ARG3})
    
    exten => s,n,Set(USE_CONFIRMATION=)
    exten => s,n,Set(RINGGROUP_INDEX=)
    
    ; delete the variable, if we are here, we are done trying to dial and it may have been left around
    ;
    exten => s,n,DBDel(RG/${ARG4}/${CHANNEL})
    ;------------------------------------------------------------------------
    
    ;------------------------------------------------------------------------
    ; [macro-auto-confirm]
    ;------------------------------------------------------------------------
    ; This macro is called from ext-local-confirm to auto-confirm a call so that other extensions
    ; are aware that the call has been answered.
    ;
    ;------------------------------------------------------------------------
    [macro-auto-confirm]
    exten => s,1,Set(__MACRO_RESULT=)
    exten => s,n,DBDel(${BLKVM_OVERRIDE})
    exten => s,n,DBDel(RG/${ARG1}/${UNIQCHAN})
    
    ;------------------------------------------------------------------------
    ; [macro-auto-blkvm]
    ;------------------------------------------------------------------------
    ; This macro is called for any extension dialed form a queue, ringgroup
    ; or followme, so that the answering extension can clear the voicemail block
    ; override allow subsequent transfers to properly operate.
    ;
    ;------------------------------------------------------------------------
    [macro-auto-blkvm]
    exten => s,1,Set(__MACRO_RESULT=)
    exten => s,n,DBDel(${BLKVM_OVERRIDE})
    
    ;------------------------------------------------------------------------
    ; [ext-local-confirm]
    ;------------------------------------------------------------------------
    ; If call confirm is being used in a ringgroup, then calls that do not require confirmation are sent
    ; to this extension instead of straight to the device.
    ;
    ; The sole purpose of sending them here is to make sure we run Macro(auto-confirm) if this
    ; extension answers the line. This takes care of clearing the database key that is used to inform
    ; other potential late comers that the extension has been answered by someone else.
    ;
    ;------------------------------------------------------------------------
    [ext-local-confirm]
    exten => _LC-.,1,Noop(IN ext-local-confirm with - RT: ${RT}, RG_IDX: ${RG_IDX})
    exten => _LC-.,n,dial(${DB(DEVICE/${EXTEN:3}/dial)},${RT},M(auto-confirm^${RG_IDX})${DIAL_OPTIONS})
    
    ;------------------------------------------------------------------------
    ; [macro-confirm]
    ;------------------------------------------------------------------------
    ; CONTEXT:      macro-confirm                                                                                                              
    ; PURPOSE:      added default message if none supplied
    ;
    ; Follom-Me and Ringgroups provide an option to supply a message to be
    ; played as part of the confirmation. These changes have added a default
    ; message if none is supplied.
    ;
    ;------------------------------------------------------------------------
    [macro-confirm]
    exten => s,1,Set(LOOPCOUNT=0)
    exten => s,n,Noop(CALLCONFIRMCID: ${CALLCONFIRMCID})
    
    ; We set ABORT rather than CONTINUE, as we want the server to forget about this channel 
    ; if it's declined, hung up, or timed out. We don't want it to continue on to the next
    ; step in the dialplan, which could be anything!
    exten => s,n,Set(__MACRO_RESULT=ABORT)
    
    ; ARG1 is the announcement to play to tell the user that they've got a call they need
    ; to confirm. Something along the lines of 'You have an incoming call. Press 1 to accept, 9 to reject'
    exten => s,n,Set(MSG1=${IF($["foo${ARG1}" != "foo"]?${ARG1}:"incoming-call-1-accept-2-decline")})
    exten => s,n(start),Read(INPUT|${MSG1}|1||1|5)
    
    ; So. We've now read something, or nothing. We should check to make sure that the call hasn't
    ; already been answered by someone else. If it has, send this call to toolate
    exten => s,n,GotoIf(${DB_EXISTS(RG/${ARG3}/${UNIQCHAN})}?check:toolate)
    
    ; We passed that test, so it means the call hasn't been answered. Has this user pushed 1? If so,
    ; then go to OK.
    exten => s,n(check),GotoIf($["${INPUT}"="1"]?ok)
    
    ; If they've pushed 9, then they definately don't want the call. Just pretend there was no response
    ; and go to noanswer (or 2 since that will be default for asterisk)
    exten => s,n,GotoIf($["${INPUT}"="9"]?noanswer)
    exten => s,n,GotoIf($["${INPUT}"="2"]?noanswer)
    exten => s,n,GotoIf($["${INPUT}"="3"]?playcid)
    
    ; Increment LOOPCOUNT, and check to make sure we haven't played it 5 times by now. We assume that
    ; the person is able to push '1' in a reasonably short time.
    exten => s,n,Set(LOOPCOUNT=$[ ${LOOPCOUNT} + 1 ])
    exten => s,n,GotoIf($[ ${LOOPCOUNT} < 5 ]?start)
    
    ; If we're here, that means we've played it MORE than 5 times. Set __MACRO_RESULT=ABORT, well, just 
    ; coz, and goto fin, which is the last line, meaning it returns to the previous Dial, and pretends as
    ; if nothing has happened.
    exten => s,n(noanswer),Set(__MACRO_RESULT=ABORT)
    exten => s,n,Goto(fin)
    
    ; Test play callerid
    ;
    exten => s,n(playcid),Noop(Playing CID: ${CALLCONFIRMCID})
    exten => s,n,SayDigits(${CALLCONFIRMCID})
    exten => s,n,Goto(start)
    
    ; If we're here, it's because the call was already accepted by someone else.
    exten => s,n(toolate),Set(MSG2=${IF($["foo${ARG2}" != "foo"]?${ARG2}:"incoming-call-no-longer-avail")})
    exten => s,n,Playback(${MSG2})
    exten => s,n,Goto(noanswer)
    
    ; If we made it here, it's because the call _WAS_ accepted, AND it's still ringing. We delete the
    ; database entry (so that the DB_EXISTS line above will trigger a 'toolate' jump), and set the 
    ; MACRO_RESULT variable to NOTHING. This is the magic string that joins both legs of the call together
    exten => s,n(ok),DBDel(RG/${ARG3}/${UNIQCHAN})
    exten => s,n,DBDel(${BLKVM_OVERRIDE})
    exten => s,n,Set(__MACRO_RESULT=)
    
    ; The end.
    exten => s,n(fin),NoOp(Finished)
    exten => h,1,Noop(Hangup Extension in macro-confirm)
    exten => h,n,Macro(hangupcall)
    
    ;------------------------------------------------------------------------
    
    ; ############################################################################
    ; Extension Contexts [ext]
    ; ############################################################################
    
    [ext-fax]
    exten => s,1,Answer
    exten => s,2,Goto(in_fax,1)
    exten => in_fax,1,StopPlayTones  
    exten => in_fax,2,GotoIf($["${FAX_RX}" = "system"]?3:analog_fax,1)
    exten => in_fax,3,Macro(faxreceive)
    exten => in_fax,4,Hangup
    exten => analog_fax,1,GotoIf($["${FAX_RX}" = "disabled"]?4:2)  ;if fax is disabled, just hang up
    exten => analog_fax,2,Set(DIAL=${DB(DEVICE/${FAX_RX}/dial)});
    exten => analog_fax,3,Dial(${DIAL},20,d)
    exten => analog_fax,4,Hangup
    ;exten => out_fax,1,wait(7)
    exten => out_fax,1,txfax(${TXFAX_NAME}|caller)
    exten => out_fax,2,Hangup
    exten => h,1,system(/var/lib/asterisk/bin/fax-process.pl --to ${EMAILADDR} --from ${FAX_RX_FROM} --subject "Fax from ${URIENCODE(${CALLERID(number)})} ${URIENCODE(${CALLERID(name)})}" --attachment fax_${URIENCODE(${CALLERID(number)})}.pdf --type application/pdf --file ${FAXFILE});
    exten => h,2,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)
    
    An der hatte ich nie rumgebastelt, auch als es ging.

    Wie gesagt, komisch ist, das Asterisk gar keine Reaktionen zeigt, wenn ein Anruf rein kommt. Wenn es wenigstens zucken würde... Bei ISDN, wie gesagt.
     
  6. blauerpeti

    blauerpeti Mitglied

    Registriert seit:
    28 Juni 2005
    Beiträge:
    723
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    ...deine extensions.conf hat es ja in sich.
    mit eingehenden ISDN-Anrufen landest du im Context [from-trunk] und da ist ja nun wieder einiges mit include gemacht. du wirst wohl den ganzen Context mal durchgehen müssen, wo letzlich ISDN-Anrufe ankommen sollen
     
  7. Palm_Maniac

    Palm_Maniac Neuer User

    Registriert seit:
    21 März 2006
    Beiträge:
    80
    Zustimmungen:
    0
    Punkte für Erfolge:
    6
    Ort:
    Gießen / Hessen
    Die exttension-conf ist so, wie sie asterisk mit installiert. Bei der Installation habe ich mich immer nach den Anleitungen von Freepbx und Ott-Service gehalten, was auch immer geklappt hat. Irgendwie habe ich das Gefühl, beim Installieren von Suse hat das System etwas vergessen.

    Auch wenn es lange dauert, aber ich werde nächste Woche noch einmal alles neu installieren in der Hoffnung, daß dann alles glatt geht. Ich könnte schwören, es ging schon mal.

    Wenn ich nur wüßte, woran das liegen könnte....
     
  8. Hupe

    Hupe Aktives Mitglied

    Registriert seit:
    8 Apr. 2004
    Beiträge:
    2,586
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Dann würde es allerdings ein immenser Zufall, wenn das laufen würde! Die mit Asterisk mitgelieferte extensions.conf ist nur ein Beispiel, und deswegen nicht für die Nutzung geeignet. Du solltest Dich besser mal damit beschäftigen, wie man Asterisk konfiguriert. Neu installieren nützt da nix!
     
  9. yoli

    yoli Neuer User

    Registriert seit:
    2 Jan. 2007
    Beiträge:
    2
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Hallo Thomas

    Es sieht so aus, dass Deine contexts in der extensions.conf gar nicht existieren ...

    [from-trunk] inkludiert [from-pstn], dieser wiederum [from-pstn-custom], [ext-did-direct], [ext-did] und [from-did-direct], alle zusammen nicht in der extensions.conf zu finden! Oder hast Du nicht den gesamten Inhalt gepostet?

    [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-direct ; MODIFICATOIN (PL) put before ext-did to take precedence
    include => ext-did
    include => from-did-direct ; MODIFICATOIN (PL) for findmefollow if enabled, should be bofore ext-local
    exten => fax,1,Goto(ext-fax,in_fax,1)

    Viele Gruesse,
    Yoli
     
  10. Palm_Maniac

    Palm_Maniac Neuer User

    Registriert seit:
    21 März 2006
    Beiträge:
    80
    Zustimmungen:
    0
    Punkte für Erfolge:
    6
    Ort:
    Gießen / Hessen
    Hallo!

    War ein paar Tage im Urlaub, deshalb erst jetzt die Antwort.

    Im Eifer des Gefechts hatte ich noch eine Konfig vergessen. Wie ich schon erwähnte, administriere ich das System mit Freepbx, und das legt ja noch eine eigene Konfig an, die dann von Asterisk ebenfalls mit geladen wird. Hier ist sie:

    Code:
    ; do not edit this file, this is an auto-generated file by freepbx
    ; all modifications must be done from the web gui
    
    
    [globals]
    #include globals_custom.conf
    CALLFILENAME = ""
    DIAL_OPTIONS = tr
    TRUNK_OPTIONS = 
    DIAL_OUT = 9
    FAX = 
    FAX_RX = system
    FAX_RX_EMAIL = fax@Server.server
    FAX_RX_FROM = kuhn-thomas@arcor.de
    INCOMING = group-all
    NULL = ""
    OPERATOR = 
    OPERATOR_XTN = 
    PARKNOTIFY = SIP/200
    RECORDEXTEN = ""
    RINGTIMER = 30
    DIRECTORY = last
    AFTER_INCOMING = 
    IN_OVERRIDE = forcereghours
    REGTIME = 7:55-17:05
    REGDAYS = mon-fri
    DIRECTORY_OPTS = 
    DIALOUTIDS = 1/2/3/4/
    OUT_1 = ZAP/g0
    VM_PREFIX = *
    VM_OPTS = 
    VM_GAIN = 1
    VM_DDTYPE = u
    TIMEFORMAT = kM
    TONEZONE = de
    ALLOW_SIP_ANON = no
    OUTKEEPCID_2 = off
    OUTCID_2 = 1976626
    OUTMAXCHANS_2 = 
    OUTPREFIX_2 = 
    OUT_2 = SIP/Sipgate Thomas
    OUTKEEPCID_3 = off
    OUTCID_3 = 3305145
    OUTMAXCHANS_3 = 
    OUTPREFIX_3 = 
    OUT_3 = SIP/Sipgate Kuhnerin
    OUTKEEPCID_4 = off
    OUTCID_4 = 
    OUTMAXCHANS_4 = 2
    OUTPREFIX_4 = 
    OUT_4 = AMP:CAPI/ISDN1/$OUTNUM$
    
    
    ;end of [globals]
    
    
    [app-pbdirectory]
    include => app-pbdirectory-custom
    exten => 411,1,Answer
    exten => 411,n,Wait(1)
    exten => 411,n,Goto(pbdirectory,1)
    exten => pbdirectory,1,AGI(pbdirectory)
    exten => pbdirectory,n,GotoIf($["${dialnumber}"=""]?hangup,1)
    exten => pbdirectory,n,Noop(Got number to dial: ${dialnumber})
    exten => pbdirectory,n,Dial(Local/${dialnumber}@from-internal/n,)
    exten => hangup,1,Hangup
    
    ; end of [app-pbdirectory]
    
    
    [app-dialvm]
    include => app-dialvm-custom
    exten => *98,1,Answer
    exten => *98,n,Wait(1)
    exten => *98,n,VoiceMailMain()
    exten => *98,n,Macro(hangupcall,)
    exten => _*98.,1,Answer
    exten => _*98.,n,Wait(1)
    exten => _*98.,n,Macro(get-vmcontext,${EXTEN:3})
    exten => _*98.,n,VoiceMailMain(${EXTEN:3}@${VMCONTEXT})
    exten => _*98.,n,Macro(hangupcall,)
    
    ; end of [app-dialvm]
    
    
    [app-vmmain]
    include => app-vmmain-custom
    exten => *97,1,Answer
    exten => *97,n,Wait(1)
    exten => *97,n,Macro(user-callerid,)
    exten => *97,n,Macro(get-vmcontext,${CALLERID(num)})
    exten => *97,n,VoiceMailMain(${CALLERID(num)}@${VMCONTEXT})
    exten => *97,n,Macro(hangupcall,)
    
    ; end of [app-vmmain]
    
    
    [app-blacklist-check]
    include => app-blacklist-check-custom
    exten => s,1,LookupBlacklist()
    exten => s,n,GotoIf($["${LOOKUPBLSTATUS}"="FOUND"]?blacklisted)
    exten => s,n,Return()
    exten => s,n(blacklisted),Answer
    exten => s,n,Wait(1)
    exten => s,n,Zapateller()
    exten => s,n,Zapateller()
    exten => s,n,Playback(ss-noservice)
    exten => s,n,Hangup
    
    ; end of [app-blacklist-check]
    
    
    [app-blacklist]
    include => app-blacklist-custom
    exten => *30,1,Goto(app-blacklist-add,s,1)
    exten => *32,1,Goto(app-blacklist-last,s,1)
    exten => *31,1,Goto(app-blacklist-remove,s,1)
    
    ; end of [app-blacklist]
    
    
    [app-blacklist-add]
    include => app-blacklist-add-custom
    exten => s,1,Answer
    exten => s,n,Wait(1)
    exten => s,n,Playback(enter-num-blacklist)
    exten => s,n,Set(TIMEOUT(digit)=5)
    exten => s,n,Set(TIMEOUT(response)=60)
    exten => s,n,Read(blacknr,then-press-pound,,,,)
    exten => s,n,SayDigits(${blacknr})
    exten => s,n,Playback(if-correct-press)
    exten => s,n,Playback(digits/1)
    exten => s,n(end),Noop(Waiting for input)
    exten => 1,1,Set(DB(blacklist/${blacknr})=1)
    exten => 1,n,Playback(num-was-successfully)
    exten => 1,n,Playback(added)
    exten => 1,n,Wait(1)
    exten => 1,n,Hangup
    
    ; end of [app-blacklist-add]
    
    
    [app-blacklist-last]
    include => app-blacklist-last-custom
    exten => s,1,Answer
    exten => s,n,Wait(1)
    exten => s,n,Set(lastcaller=${DB(CALLTRACE/${CALLERID(number)})})
    exten => s,n,GotoIf($[ $[ "${lastcaller}" = "" ] | $[ "${lastcaller}" = "unknown" ] ]?noinfo)
    exten => s,n,Playback(privacy-to-blacklist-last-caller)
    exten => s,n,Playback(telephone-number)
    exten => s,n,SayDigits(${lastcaller})
    exten => s,n,Set(TIMEOUT(digit)=3)
    exten => s,n,Set(TIMEOUT(response)=7)
    exten => s,n,Playback(if-correct-press)
    exten => s,n,Playback(digits/1)
    exten => s,n,Goto(end)
    exten => s,n(noinfo),Playback(unidentified-no-callback)
    exten => s,n,Hangup
    exten => s,n(end),Noop(Waiting for input)
    exten => 1,1,Set(DB(blacklist/${lastcaller})=1)
    exten => 1,n,Playback(num-was-successfully)
    exten => 1,n,Playback(added)
    exten => 1,n,Wait(1)
    exten => 1,n,Hangup
    
    ; end of [app-blacklist-last]
    
    
    [app-blacklist-remove]
    include => app-blacklist-remove-custom
    exten => s,1,Answer
    exten => s,n,Wait(1)
    exten => s,n,Playback(entr-num-rmv-blklist)
    exten => s,n,Set(TIMEOUT(digit)=5)
    exten => s,n,Set(TIMEOUT(response)=60)
    exten => s,n,Read(blacknr,then-press-pound,,,,)
    exten => s,n,SayDigits(${blacknr})
    exten => s,n,Playback(if-correct-press)
    exten => s,n,Playback(digits/1)
    exten => s,n(end),Noop(Waiting for input)
    exten => 1,1,dbDel(blacklist/${blacknr})
    exten => 1,n,Playback(num-was-successfully)
    exten => 1,n,Playback(removed)
    exten => 1,n,Wait(1)
    exten => 1,n,Hangup
    
    ; end of [app-blacklist-remove]
    
    
    [app-recordings]
    include => app-recordings-custom
    exten => *77,1,Macro(user-callerid,)
    exten => *77,n,Wait(2)
    exten => *77,n,Macro(systemrecording,dorecord)
    exten => *99,1,Macro(user-callerid,)
    exten => *99,n,Wait(2)
    exten => *99,n,Macro(systemrecording,docheck)
    
    ; end of [app-recordings]
    
    
    [cidlookup]
    include => cidlookup-custom
    exten => cidlookup_1,1,LookupCIDName
    exten => cidlookup_1,n,Return()
    exten => cidlookup_return,1,LookupCIDName
    exten => cidlookup_return,n,Return()
    
    ; end of [cidlookup]
    
    
    [ext-group]
    include => ext-group-custom
    exten => 600,1,Macro(user-callerid,)
    exten => 600,n,GotoIf($["foo${BLKVM_OVERRIDE}" = "foo"]?skipdb)
    exten => 600,n,GotoIf($["${DB(${BLKVM_OVERRIDE})}" = "TRUE"]?skipov)
    exten => 600,n(skipdb),Set(__NODEST=)
    exten => 600,n,Set(__BLKVM_OVERRIDE=BLKVM/${EXTEN}/${CHANNEL})
    exten => 600,n,Set(__BLKVM_BASE=${EXTEN})
    exten => 600,n,Set(DB(${BLKVM_OVERRIDE})=TRUE)
    exten => 600,n(skipov),Set(RRNODEST=${NODEST})
    exten => 600,n(skipvmblk),Set(__NODEST=${EXTEN})
    exten => 600,n,GotoIf($["foo${RGPREFIX}" = "foo"]?REPCID)
    exten => 600,n,Noop(Current RGPREFIX is ${RGPREFIX}....stripping from Caller ID)
    exten => 600,n,Set(CALLERID(name)=${CALLERID(name):${LEN(${RGPREFIX})}})
    exten => 600,n,Set(RGPREFIX=)
    exten => 600,n(REPCID),Noop(CALLERID(name) is ${CALLERID(name)})
    exten => 600,n,Set(RecordMethod=Group)
    exten => 600,n,Macro(record-enable,106-107,${RecordMethod})
    exten => 600,n,Set(RingGroupMethod=ringall)
    exten => 600,n(DIALGRP),Macro(dial,20,${DIAL_OPTIONS},106-107)
    exten => 600,n,Set(RingGroupMethod=)
    exten => 600,n,GotoIf($["foo${RRNODEST}" != "foo"]?nodest)
    exten => 600,n,Set(__NODEST=)
    exten => 600,n,dbDel(${BLKVM_OVERRIDE})
    exten => 600,n,Goto(ext-local,${VM_PREFIX}106,1)
    exten => 600,n(nodest),Noop(SKIPPING DEST, CALL CAME FROM Q/RG: ${RRNODEST})
    
    ; end of [ext-group]
    
    
    [app-userlogonoff]
    include => app-userlogonoff-custom
    exten => *12,1,Macro(user-logoff,)
    exten => *12,n,Hangup
    exten => *11,1,Macro(user-logon,)
    exten => *11,n,Hangup
    exten => _*11.,1,Macro(user-logon,${EXTEN:3},)
    exten => _*11.,n,Hangup
    
    ; end of [app-userlogonoff]
    
    
    [app-pickup]
    include => app-pickup-custom
    exten => _**.,1,Noop(Attempt to Pickup ${EXTEN:2} by ${CALLERID(num)})
    exten => _**.,n,Pickup(${EXTEN:2})
    
    ; end of [app-pickup]
    
    
    [app-zapbarge]
    include => app-zapbarge-custom
    exten => 888,1,Macro(user-callerid,)
    exten => 888,n,Set(GROUP()=${CALLERID(number)})
    exten => 888,n,Answer
    exten => 888,n,Wait(1)
    exten => 888,n,ZapBarge()
    exten => 888,n,Hangup
    
    ; end of [app-zapbarge]
    
    
    [app-chanspy]
    include => app-chanspy-custom
    exten => 555,1,Macro(user-callerid,)
    exten => 555,n,Answer
    exten => 555,n,Wait(1)
    exten => 555,n,ChanSpy()
    exten => 555,n,Hangup
    
    ; end of [app-chanspy]
    
    
    [ext-test]
    include => ext-test-custom
    exten => 7777,1,Goto(from-pstn,s,1)
    exten => 666,1,Goto(ext-fax,in_fax,1)
    exten => h,1,Macro(hangupcall,)
    
    ; end of [ext-test]
    
    
    [ext-did]
    include => ext-did-custom
    exten => fax,1,Goto(ext-fax,in_fax,1)
    exten => 11,1,Set(FROM_DID=11)
    exten => 11,n,Gosub(cidlookup,cidlookup_1,1)
    exten => 11,n,Gosub(app-blacklist-check,s,1)
    exten => 11,n,Goto(ext-local,101,1)
    exten => 1976626,1,Set(FROM_DID=1976626)
    exten => 1976626,n,Gosub(cidlookup,cidlookup_1,1)
    exten => 1976626,n,Gosub(app-blacklist-check,s,1)
    exten => 1976626,n,Goto(ext-local,100,1)
    exten => 21,1,Set(FROM_DID=21)
    exten => 21,n,Gosub(cidlookup,cidlookup_1,1)
    exten => 21,n,Gosub(app-blacklist-check,s,1)
    exten => 21,n,Goto(ext-group,600,1)
    exten => 22,1,Set(FROM_DID=22)
    exten => 22,n,Gosub(cidlookup,cidlookup_1,1)
    exten => 22,n,Gosub(app-blacklist-check,s,1)
    exten => 22,n,Goto(ext-group,600,1)
    exten => 25,1,Set(FROM_DID=25)
    exten => 25,n,Gosub(cidlookup,cidlookup_1,1)
    exten => 25,n,Gosub(app-blacklist-check,s,1)
    exten => 25,n,Goto(ext-local,102,1)
    exten => 3305145,1,Set(FROM_DID=3305145)
    exten => 3305145,n,Gosub(cidlookup,cidlookup_1,1)
    exten => 3305145,n,Gosub(app-blacklist-check,s,1)
    exten => 3305145,n,Goto(ext-group,600,1)
    exten => s,1,Noop(No DID or CID Match)
    exten => s,n,Answer
    exten => s,n,Wait(2)
    exten => s,n,Playback(ss-noservice)
    exten => s,n,SayAlpha(${FROM_DID})
    exten => _[*#X].,1,Set(FROM_DID=${EXTEN})
    exten => _[*#X].,n,Noop(Received an unknown call with DID set to ${EXTEN})
    exten => _[*#X].,n,Goto(ext-did,s,1)
    
    ; end of [ext-did]
    
    
    [ext-did-direct]
    include => ext-did-direct-custom
    exten => fax,1,Goto(ext-fax,in_fax,1)
    exten => 1976626,1,Set(FROM_DID=1976626)
    exten => 1976626,n,Goto(from-did-direct,100,1)
    exten => 11,1,Set(FROM_DID=11)
    exten => 11,n,Goto(from-did-direct,101,1)
    exten => 25,1,Set(FROM_DID=25)
    exten => 25,n,Goto(from-did-direct,102,1)
    
    ; end of [ext-did-direct]
    
    
    [ext-local]
    include => ext-local-custom
    exten => 100,1,Macro(exten-vm,novm,100)
    exten => 100,n,Hangup
    exten => 100,hint,SIP/100
    exten => 101,1,Macro(exten-vm,novm,101)
    exten => 101,n,Hangup
    exten => 101,hint,SIP/101
    exten => 102,1,Macro(exten-vm,novm,102)
    exten => 102,n,Hangup
    exten => 102,hint,SIP/102
    exten => 106,1,Macro(exten-vm,106,106)
    exten => 106,n,Hangup
    exten => 106,hint,SIP/106
    exten => ${VM_PREFIX}106,1,Macro(vm,106,DIRECTDIAL)
    exten => ${VM_PREFIX}106,n,Hangup
    exten => 107,1,Macro(exten-vm,novm,107)
    exten => 107,n,Hangup
    exten => 107,hint,SIP/107
    
    ; end of [ext-local]
    
    
    [outbound-allroutes]
    include => outbound-allroutes-custom
    include => outrt-001-9_outside
    include => outrt-002-Sip 1
    include => outrt-003-Sip 2
    include => outrt-004-AusgehendISDN
    exten => foo,1,Noop(bar)
    
    ; end of [outbound-allroutes]
    
    
    [outrt-001-9_outside]
    include => outrt-001-9_outside-custom
    exten => _9.,1,Macro(dialout-trunk,1,${EXTEN:1},)
    exten => _9.,n,Macro(outisbusy,)
    
    ; end of [outrt-001-9_outside]
    
    
    [outrt-002-Sip 1]
    include => outrt-002-Sip 1-custom
    exten => _8.,1,Macro(dialout-trunk,2,${EXTEN:1},,)
    exten => _8.,n,Macro(outisbusy,)
    
    ; end of [outrt-002-Sip 1]
    
    
    [outrt-003-Sip 2]
    include => outrt-003-Sip 2-custom
    exten => _9.,1,Macro(dialout-trunk,3,${EXTEN:1},,)
    exten => _9.,n,Macro(outisbusy,)
    
    ; end of [outrt-003-Sip 2]
    
    
    [outrt-004-AusgehendISDN]
    include => outrt-004-AusgehendISDN-custom
    exten => 110,1,Macro(dialout-trunk,4,${EXTEN},,)
    exten => 110,n,Macro(outisbusy,)
    exten => _XXXX.,1,Macro(dialout-trunk,4,${EXTEN},,)
    exten => _XXXX.,n,Macro(outisbusy,)
    exten => _[1-3]X,1,Macro(dialout-trunk,4,${EXTEN},,)
    exten => _[1-3]X,n,Macro(outisbusy,)
    
    ; end of [outrt-004-AusgehendISDN]
    
    
    [app-blackhole]
    include => app-blackhole-custom
    exten => hangup,1,Noop(Blackhole Dest: Hangup)
    exten => hangup,n,Hangup
    exten => zapateller,1,Noop(Blackhole Dest: Play SIT Tone)
    exten => zapateller,n,Answer
    exten => zapateller,n,Zapateller()
    exten => musiconhold,1,Noop(Blackhole Dest: Put caller on hold forever)
    exten => musiconhold,n,Answer
    exten => musiconhold,n,MusicOnHold()
    exten => congestion,1,Noop(Blackhole Dest: Congestion)
    exten => congestion,n,Answer
    exten => congestion,n,Playtones(congestion)
    exten => congestion,n,Congestion
    exten => congestion,n,Hangup
    exten => busy,1,Noop(Blackhole Dest: Busy)
    exten => busy,n,Answer
    exten => busy,n,Playtones(busy)
    exten => busy,n,Busy
    exten => busy,n,Hangup
    
    ; end of [app-blackhole]
    
    
    [from-internal-additional]
    include => from-internal-additional-custom
    include => app-pbdirectory
    include => ext-meetme
    include => app-dialvm
    include => app-vmmain
    include => app-blacklist
    include => app-recordings
    include => ext-queues
    include => ext-group
    include => grps
    include => app-userlogonoff
    include => app-pickup
    include => app-zapbarge
    include => app-chanspy
    include => ext-test
    include => ext-local
    include => outbound-allroutes
    exten => h,1,Hangup
    
    ; end of [from-internal-additional]
    
    
    
    Hier sollte alles drin sein, was sich dann auch auf ISDN bezieht. Eins ist mir auch noch eingefallen. Da ich den Server auch noch als Webserver benutze, habe ich etwas mehr an z.B. der php.ini rumgeschraubt als für Asterisk notwenig. Ist es möglich, daß sich eine Einstellung der ini negativ auf Freepbx auswirkt und dadurch die Kongis nicht richtig geschrieben werden? Immerhin kann ich durch einige Punkte sogar Freepbx dazu bringen, das es plötzlich eigenen Settings nicht mehr findet.

    Wenn das der Fall sein könnte, kann mir dann mal jemand seine php.ini von PHP5 posten, damit ich sie vergleichen kann?
     
  11. yoli

    yoli Neuer User

    Registriert seit:
    2 Jan. 2007
    Beiträge:
    2
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Hallo Thomas

    Das ist ja ein Riesensalat! Man braucht fast 2 Tage Urlaub, um da durchzublicken. Es geht auch einfacher:

    Mach einfach eine Kopie von Deinen extensions.conf und stell Dir eine Minimalversion zusammen, nach einem der vielen Asterisk Tutorials. Falls Du das nicht hinkriegen solltest, kannst Du wieder die alte Konfig zurückkopieren.

    Was die php.ini betrifft, spielt es keine Rolle - die Konfigs werden entweder geschrieben oder nicht.
     
  12. Palm_Maniac

    Palm_Maniac Neuer User

    Registriert seit:
    21 März 2006
    Beiträge:
    80
    Zustimmungen:
    0
    Punkte für Erfolge:
    6
    Ort:
    Gießen / Hessen
    Kann es sein, daß Suse10.2 und Asterisk mit chan_capi ein Problem haben? Jetzt habe ich das ganze System neu installiert, habe es mal mit dem mitgelieferten Asterisk versucht und ich schaffe es einfach nicht, daß ich ankommende ISDN-Anrufe annehmen kann. Der Capi reagiert aber Asterisk bekommt nichts mit. Die selbe Konfiguration unter Suse 10.0 klappt wunderbar. Alle Konfigs sind da absolut identisch. Kann das jemand nachvollziehen? Ich nicht.

    Nachdem, was ich so im Internet gefunden habe, hat wohl auch noch keiner Asterisk unter Suse10.2 installiert mit FreePBX als Oberfläche. Wenn ich nur wüßte, wo ich suchen muß.
     
  13. Hupe

    Hupe Aktives Mitglied

    Registriert seit:
    8 Apr. 2004
    Beiträge:
    2,586
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Du hast aber schon die Antworten gelesen, oder? Wenn Du die Beispiel-Configs nicht Deinen Begebenheiten anpasst, dann wird Asterisk nicht mit chan_capi zusammenarbeiten! Das bedingt natürlich, dass Du verstehst, was Du da umkonfigurierst. Einfacher ist es, wenn du eine neue extensions.conf erstellst.
    Also, nimm Dir den Asterisk-Kurs und sieh Dir an, wie das geht!
     
  14. Palm_Maniac

    Palm_Maniac Neuer User

    Registriert seit:
    21 März 2006
    Beiträge:
    80
    Zustimmungen:
    0
    Punkte für Erfolge:
    6
    Ort:
    Gießen / Hessen
    Juhu, ich habs geschafft!!!!!! Es geht wieder!!!!

    In der Capi.conf steht der isdnmode auf msn. Nachdem ich ihn mal zum Testen auf did umgestellt hatte ging es endlich.

    komisch ist nur, daß ich es vorhger mit MSN laufen hatte. Naja, egal, nun geht es. :-D

    Vielen Dank an alle für die Hilfsversuche. Nun da es endlich wieder geht, werde ich mir mal die diversen Anelitungen zu Asterisk vornehmen und schauen wie ich auch noch eine Fax-Option einbauen kann.


    Nochmals vielen Dank für die Hilfe. :-D
     
  15. cibi

    cibi Mitglied

    Registriert seit:
    6 Apr. 2005
    Beiträge:
    561
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Ort:
    Ba-Wü
    Ich hatte meinen Beitrag schon gelöscht in dem ich danach Fragte (mehr oder weniger :)

    Funktioniert die AVM FritzKarte überhaupt an einem Anlagenschluss?
    Wie ist den der Anschluss in der Anlage konfiguriert?
     
  16. armincm

    armincm Aktives Mitglied

    Registriert seit:
    3 Aug. 2005
    Beiträge:
    1,006
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Du solltest wieder auf MSN umstellen, aber auch
    immediate=yes
    in der capi.conf.
    Dein Anschluss sendet kein 'SETUP', deshalb reagiert chan-capi nicht darauf, was mit immediate=yes umgangen werden kann.

    Armin
     
  17. Palm_Maniac

    Palm_Maniac Neuer User

    Registriert seit:
    21 März 2006
    Beiträge:
    80
    Zustimmungen:
    0
    Punkte für Erfolge:
    6
    Ort:
    Gießen / Hessen
    Vielen Dank, hab wieder auf MSN und immediate=yes umgestellt und es klappt immer noch!!! Jetzt läuft es also wieder richtig.

    Danke armincm für den Tip. :)