среда, 25 сентября 2019 г.

FreePBX (памятка 2)

Копируем библиотеку для 3G модема chan_dongle.so.

Создаем файл 92-ttyUSB.rules со следующим содержимым:

# ustanowka praw ttyUSB* dlja asterisk
KERNEL=="ttyUSB*", MODE="0660", OWNER="asterisk", GROUP="dialout"

Создаем файл dongle.conf со следующим содержимым:

[general]

interval=15   ; Number of seconds between trying to connect to devices

;------------------------------ JITTER BUFFER CONFIGURATION --------------------------
;jbenable = yes   ; Enables the use of a jitterbuffer on the receiving side of a
    ; Dongle channel. Defaults to "no". An enabled jitterbuffer will
    ; be used only if the sending side can create and the receiving
    ; side can not accept jitter. The Dongle channel can't accept jitter,
    ; thus an enabled jitterbuffer on the receive Dongle side will always
    ; be used if the sending side can create jitter.

;jbforce = no   ; Forces the use of a jitterbuffer on the receive side of a Dongle
    ; channel. Defaults to "no".

;jbmaxsize = 200  ; Max length of the jitterbuffer in milliseconds.

;jbresyncthreshold = 1000 ; Jump in the frame timestamps over which the jitterbuffer is
    ; resynchronized. Useful to improve the quality of the voice, with
    ; big jumps in/broken timestamps, usually sent from exotic devices
    ; and programs. Defaults to 1000.

;jbimpl = fixed   ; Jitterbuffer implementation, used on the receiving side of a Dongle
    ; channel. Two implementations are currently available - "fixed"
    ; (with size always equals to jbmaxsize) and "adaptive" (with
    ; variable size, actually the new jb of IAX2). Defaults to fixed.

;jbtargetextra = 40  ; This option only affects the jb when 'jbimpl = adaptive' is set.
    ; The option represents the number of milliseconds by which the new jitter buffer
    ; will pad its size. the default is 40, so without modification, the new
    ; jitter buffer will set its size to the jitter value plus 40 milliseconds.
    ; increasing this value may help if your network normally has low jitter,
    ; but occasionally has spikes.

;jblog = no   ; Enables jitterbuffer frame logging. Defaults to "no".
;-----------------------------------------------------------------------------------

[defaults]
; now you can set here any not required device settings as template
;   sure you can overwrite in any [device] section this default values

;context=default   ; context for incoming calls
;context=from-trunk1-cust
context=from-trunk
group=0    ; calling group
rxgain=0   ; increase the incoming volume; may be negative
txgain=0   ; increase the outgoint volume; may be negative
autodeletesms=yes  ; auto delete incoming sms
resetdongle=yes   ; reset dongle during initialization with ATZ command
u2diag=-1   ; set ^U2DIAG parameter on device (0 = disable everything except modem function) ; -1 not use ^U2DIAG command
usecallingpres=yes  ; use the caller ID presentation or not
callingpres=allowed_passed_screen ; set caller ID presentation  by default use default network settings
disablesms=no   ; disable of SMS reading from device when received
    ;  chan_dongle has currently a bug with SMS reception. When a SMS gets in during a
    ;  call chan_dongle might crash. Enable this option to disable sms reception.
    ;  default = no

;language=en   ; set channel default language
language=ru
smsaspdu=yes   ; if 'yes' send SMS in PDU mode, feature implementation incomplete and we strongly recommend say 'yes'
mindtmfgap=45   ; minimal interval from end of previews DTMF from begining of next in ms
mindtmfduration=80  ; minimal DTMF tone duration in ms
mindtmfinterval=200  ; minimal interval between ends of DTMF of same digits in ms

callwaiting=auto  ; if 'yes' allow incoming calls waiting; by default use network settings
    ; if 'no' waiting calls just ignored
disable=no   ; OBSOLETED by initstate: if 'yes' no load this device and just ignore this section

initstate=start   ; specified initial state of device, must be one of 'stop' 'start' 'remote'
    ;   'remove' same as 'disable=yes'

exten=+123456789012  ; exten for start incoming calls, only in case of Subscriber Number not available!, also set to CALLERID(ndid)

dtmf=relax   ; control of incoming DTMF detection, possible values:
    ;   off    - off DTMF tones detection, voice data passed to asterisk unaltered
    ;              use this value for gateways or if not use DTMF for AVR or inside dialplan
    ;   inband - do DTMF tones detection
    ;   relax  - like inband but with relaxdtmf option
    ;  default is 'relax' by compatibility reason

; dongle required settings
[dongle0]
context=from-trunk-Mobile-v180e
audio=/dev/ttyUSB1  ; tty port for audio connection;  no default value
data=/dev/ttyUSB2  ; tty port for AT commands;   no default value

; or you can omit both audio and data together and use imei=123456789012345 and/or imsi=123456789012345
;  imei and imsi must contain exactly 15 digits !
;  imei/imsi discovery is available on Linux only
imei=123456789012345
imsi=123456789012345

; if audio and data set together with imei and/or imsi audio and data has precedence
;   you can use both imei and imsi together in this case exact match by imei and imsi required



редактируем файл extensions_custom.conf:

[from-trunk-Mobile]
exten => _X!,1,Noop(from-pstn-custom,${CALLERID(num)},${CHANNEL(linkedid)})
exten => _X!,n,System(echo ${CHANNEL(linkedid)}_${UNIQUEID}_${EXTEN} > /tmp/tr_${CHANNEL(linkedid)}.txt)
exten => _X!,n,System(echo ${CALLERID(num)} >> /tmp/tr_${CHANNEL(linkedid)}.txt)
exten => _X!,n,Set(__IN_CALLERID=${CALLERID(num)})
exten => _X!,n,Set(__IN_CALLERID=${IF($[${LEN(${IN_CALLERID})}=6]?375162${IN_CALLERID}:${IF($["${IN_CALLERID:0:2}"="80"]?375${IN_CALLERID:2}:${IF($["${IN_CALLERID:0:1}"="8"]?375${IN_CALLERID:1}:${IF($["${IN_CALLERID:0:4}"="+375"]?${IN_CALLERID:1}:${IN_CALLERID})})})})})
exten => _X!,n,Set(CALLERID(num)=${IN_CALLERID})
exten => _X!,n,Set(CALLERID(name)=${CALLERID(num)})
exten => _X!,n,System(echo ${CALLERID(num)} >> /tmp/tr_${CHANNEL(linkedid)}.txt)
exten => _X!,n,Goto(from-trunk,${EXTEN},1)

FreePBX (памятка 1)


extensions_override_freepbx.conf - правки через подключение по ssh или напрямую на сервере FreePBX. Скопировав готовые правила, добавим запуск своих скриптов:
 
[macro-dial-one]
include => macro-dial-one-custom
exten => s,1,Set(DEXTEN=${ARG3})
exten => s,n,Set(__CRM_SOURCE=${CALLERID(num)})
exten => s,n(setexttocall),ExecIf($[${LEN(${EXTTOCALL})}=0 & ${LEN(${DEXTEN})}>0]?Set(__EXTTOCALL=${DEXTEN}))
exten => s,n,Set(DIALSTATUS_CW=)
exten => s,n,GosubIf($["${FROM_DID}"!="" & "${SCREEN}"="" & "${SIGNORE}"="" & "${DB(AMPUSER/${DEXTEN}/screen)}"!=""]?screen,1())
exten => s,n,GosubIf($["${DB(CF/${DEXTEN})}"!=""]?cf,1())
exten => s,n,GotoIf($["${DEXTEN:-1}"="#" | "${DB(DND/${DEXTEN})}"=""]?skip1)
exten => s,n,Set(DEXTEN=)
exten => s,n,Set(DIALSTATUS=BUSY)
exten => s,n(skip1),GotoIf($["${DEXTEN}"=""]?nodial)
exten => s,n,GotoIf($["${DEXTEN:-1}"="#"]?continue)
exten => s,n,Set(EXTHASCW=${IF($["${CWIGNORE}"!=""]? :${DB(CW/${DEXTEN})})})
exten => s,n,GotoIf($["${EXTHASCW}"="" | "${DB(CFB/${DEXTEN})}"!="" | "${DB(CFU/${DEXTEN})}"!=""]?next1:cwinusebusy)
exten => s,n(next1),GotoIf($["${DB(CFU/${DEXTEN})}"!="" & ("${EXTENSION_STATE(${DEXTEN})}"="UNAVAILABLE" | "${EXTENSION_STATE(${DEXTEN})}"="UNKNOWN")]?docfu:skip3)
exten => s,n(docfu),Set(DEXTEN=)
exten => s,n,Set(DIALSTATUS=NOANSWER)
exten => s,n,Goto(nodial)
exten => s,n(skip3),GotoIf($["${EXTHASCW}"="" | "${DB(CFB/${DEXTEN})}"!=""]?next2:continue)
exten => s,n(next2),GotoIf($["${EXTENSION_STATE(${DEXTEN})}"="NOT_INUSE" | "${EXTENSION_STATE(${DEXTEN})}"="UNAVAILABLE" | "${EXTENSION_STATE(${DEXTEN})}"="UNKNOWN"]?continue)
exten => s,n,ExecIf($["${DB(CFB/${DEXTEN})}"!="" & "${CFIGNORE}"=""]?Set(DIALSTATUS=BUSY))
exten => s,n,GotoIf($["${EXTHASCW}"!="" | "${DEXTEN:-1}"="#"]?cwinusebusy)
exten => s,n,Set(DEXTEN=)
exten => s,n,Set(DIALSTATUS=BUSY)
exten => s,n,Goto(nodial)
exten => s,n(cwinusebusy),GotoIf($["${EXTHASCW}"!="" & "${CWINUSEBUSY}"="true"]?next3:continue)
exten => s,n(next3),ExecIf($["${EXTENSION_STATE(${DEXTEN})}"!="UNAVAILABLE" & "${EXTENSION_STATE(${DEXTEN})}"!="NOT_INUSE" & "${EXTENSION_STATE(${DEXTEN})}"!="UNKNOWN"]?Set(DIALSTATUS_CW=BUSY))
exten => s,n(continue),GotoIf($["${DEXTEN}"=""]?nodial)
exten => s,n,GosubIf($["${DEXTEN:-1}"!="#"]?dstring,1():dlocal,1())
exten => s,n,GotoIf($[${LEN(${DSTRING})}=0]?nodial)
exten => s,n,GotoIf($["${DEXTEN:-1}"="#"]?skiptrace)
exten => s,n,GosubIf($[${REGEX("^[\+]?[0-9]+$" ${CALLERID(number)})} = 1]?ctset,1():ctclear,1())
exten => s,n(skiptrace),Set(D_OPTIONS=${IF($["${NODEST}"!="" & ${REGEX("(M[(]auto-blkvm[)])" ${ARG2})} != 1]?${ARG2}M(auto-blkvm):${ARG2}M(my-1^${ARG1}^${CDR(cnam)}^${ARG3}))})
exten => s,n,GosubIf($["${ALERT_INFO}"!="" & "${HASH(SIPHEADERS,Alert-Info)}"=""]?func-set-sipheader,s,1(Alert-Info,${ALERT_INFO}))
exten => s,n,Noop(Blind Transfer: ${BLINDTRANSFER}, Attended Transfer: ${ATTENDEDTRANSFER}, User: ${AMPUSER}, Alert Info: ${ALERT_INFO})
exten => s,n,ExecIf($["${ALERT_INFO}"="" & ${LEN(${AMPUSER})}!=0 & ${LEN(${BLINDTRANSFER})}=0 & ${LEN(${ATTENDEDTRANSFER})}=0]?Set(ALERT_INFO=))
exten => s,n,ExecIf($[${LEN(${BLINDTRANSFER})}!=0]?Set(ALERT_INFO=))
exten => s,n,ExecIf($[${LEN(${ATTENDEDTRANSFER})}!=0]?Set(ALERT_INFO=))
exten => s,n,ExecIf($["${RVOL}"!=""]?Set(ALERT_INFO=${IF($["${ALERT_INFO}"!=""]?${ALERT_INFO}:Normal)}\;volume=${RVOL}))
exten => s,n,ExecIf($["${RVOL}"="" & "${DB(AMPUSER/${EXTTOCALL}/rvolume)}" != ""]?Set(ALERT_INFO=${IF($["${ALERT_INFO}"!=""]?${ALERT_INFO}:Normal)}\;volume=${DB(AMPUSER/${EXTTOCALL}/rvolume)}))
exten => s,n,GosubIf($["${ALERT_INFO}"!="" & "${ALERT_INFO}"!=" "]?func-set-sipheader,s,1(Alert-Info,${ALERT_INFO}))
exten => s,n,ExecIf($[("${MOHCLASS}"!="default") & ("${MOHCLASS}"!="")]?Set(CHANNEL(musicclass)=${MOHCLASS}))
exten => s,n,GosubIf($["${QUEUEWAIT}"!=""]?qwait,1())
exten => s,n,Set(__CWIGNORE=${CWIGNORE})
exten => s,n,Set(__KEEPCID=TRUE)
exten => s,n,GotoIf($["${USEGOTO}"="1"]?usegoto,1)
exten => s,n,GotoIf($["${DB(AMPUSER/${EXTTOCALL}/cidname)}" = "" || "${DB(AMPUSER/${AMPUSER}/cidname)}" = ""]?godial)
exten => s,n,Gosub(sub-presencestate-display,s,1(${EXTTOCALL}))
exten => s,n,Set(CONNECTEDLINE(name,i)=${DB(AMPUSER/${EXTTOCALL}/cidname)}${PRESENCESTATE_DISPLAY})
exten => s,n,Set(CONNECTEDLINE(num)=${EXTTOCALL})
exten => s,n,Set(D_OPTIONS=${D_OPTIONS}I)
exten => s,n(godial),Macro(dialout-one-predial-hook,)
exten => s,n,ExecIf($["${DIRECTION}" = "INBOUND"]?Set(D_OPTIONS=${STRREPLACE(D_OPTIONS,T)}I))
exten => s,n(dialapp),Noop()
exten => s,n,ExecIf($["${ivrreturn}" = "1"]?Set(D_OPTIONS=${D_OPTIONS}g))
exten => s,n(dial),Dial(${DSTRING},${ARG1},${D_OPTIONS}b(func-apply-sipheaders^s^1))
exten => s,n,ExecIf($["${DIALSTATUS}"="ANSWER" & "${CALLER_DEST}"!=""]?MacroExit())
exten => s,n,ExecIf($["${DIALSTATUS_CW}"!=""]?Set(DIALSTATUS=${DIALSTATUS_CW}))
exten => s,n,GosubIf($[("${SCREEN}"!=""&("${DIALSTATUS}"="TORTURE"|"${DIALSTATUS}"="DONTCALL"))|"${DIALSTATUS}"="ANSWER"]?s-${DIALSTATUS},1())
exten => s,n,MacroExit()
exten => s,n(nodial),Noop()
exten => s,n,ExecIf($["${DIALSTATUS}" = ""]?Set(DIALSTATUS=NOANSWER))
exten => s,n,Noop(Returned from dial-one with nothing to call and DIALSTATUS: ${DIALSTATUS})
exten => s,n,MacroExit()
exten => s,n,GotoIf($["${ZULU_RAW_TYPE}"!="Sangomacrm-url"]?crm-save)
exten => s,n,AGI(sangomacrm.agi,true)
exten => s,n,Goto(zulu-event)
exten => s,n(crm-save),AGI(sangomacrm.agi)
 
exten => h,1,Macro(hangupcall,)
 
exten => usegoto,1,Set(USEGOTO=)
exten => usegoto,n,Goto(from-internal,${DSTRING},1)
 
exten => screen,1,GotoIf($["${DB(AMPUSER/${DEXTEN}/screen)}"!="nomemory" | "${CALLERID(number)}"=""]?memory)
exten => screen,n,ExecIf($[${REGEX("^[0-9a-zA-Z ]+$" ${CALLERID(number)})} = 1]?System(rm -f ${ASTVARLIBDIR}/sounds/priv-callerintros/${CALLERID(number)}.*))
exten => screen,n(memory),Set(__SCREEN=${DB(AMPUSER/${DEXTEN}/screen)})
exten => screen,n,Set(__SCREEN_EXTEN=${DEXTEN})
exten => screen,n,Set(ARG2=${ARG2}p)
exten => screen,n,Return()
 
exten => cf,1,Set(CFAMPUSER=${IF($["${AMPUSER}"=""]?${CALLERID(number)}:${AMPUSER})})
exten => cf,n,ExecIf($["${DB(CF/${DEXTEN})}"="${CFAMPUSER}" | "${DB(CF/${DEXTEN})}"="${REALCALLERIDNUM}" | "${CUT(CUT(BLINDTRANSFER,-,1),/,1)}" = "${DB(CF/${DEXTEN})}" | "${DEXTEN}"="${DB(CF/${DEXTEN})}"]?Return())
exten => cf,n,ExecIf($["${DB(AMPUSER/${DEXTEN}/cfringtimer)}" != "0" & "${DB(AMPUSER/${DEXTEN}/cfringtimer)}" != ""]?Set(ARG1=${IF($["${DB(AMPUSER/${DEXTEN}/cfringtimer)}"="-1"]? : ${DB(AMPUSER/${DEXTEN}/cfringtimer)})}))
exten => cf,n,ExecIf($["${DB(AMPUSER/${DEXTEN}/cfringtimer)}" == "0"]?Set(ARG1=${IF($["${DB(FREEPBXCONF/CFRINGTIMERDEFAULT)}"="-1"]? : ${DB(FREEPBXCONF/CFRINGTIMERDEFAULT)})}))
exten => cf,n,Set(DEXTEN=${IF($["${CFIGNORE}"=""]?"${DB(CF/${DEXTEN})}#": )})
exten => cf,n,ExecIf($["${DEXTEN}"!=""]?Return())
exten => cf,n,Set(DIALSTATUS=NOANSWER)
exten => cf,n,Return()
 
exten => qwait,1,ExecIf($["${SAVEDCIDNAME}" = ""]?Set(__SAVEDCIDNAME=${CALLERID(name)}))
exten => qwait,n,Set(ELAPSED=${MATH($[${EPOCH}+30-${QUEUEWAIT}]/60,int)})
exten => qwait,n,Set(CALLERID(name)=M${ELAPSED}:${SAVEDCIDNAME})
exten => qwait,n,Return()
 
exten => ctset,1,Set(DB(CALLTRACE/${DEXTEN})=${CALLERID(number)})
exten => ctset,n,Return()
 
exten => ctclear,1,Noop(Deleting: CALLTRACE/${DEXTEN} ${DB_DELETE(CALLTRACE/${DEXTEN})})
exten => ctclear,n,Return()
 
exten => dstring,1,Set(DSTRING=)
exten => dstring,n,Set(DEVICES=${DB(AMPUSER/${DEXTEN}/device)})
exten => dstring,n,ExecIf($["${DEVICES}"=""]?Return())
exten => dstring,n,ExecIf($["${DEVICES:0:1}"="&"]?Set(DEVICES=${DEVICES:1}))
exten => dstring,n,Set(LOOPCNT=${FIELDQTY(DEVICES,&)})
exten => dstring,n,Set(ITER=1)
exten => dstring,n(begin),Set(THISDIAL=${DB(DEVICE/${CUT(DEVICES,&,${ITER})}/dial)})
exten => dstring,n,GosubIf($["${ASTCHANDAHDI}" = "1"]?zap2dahdi,1())
exten => dstring,n,GotoIf($["${THISDIAL:0:5}"!="PJSIP"]?docheck)
exten => dstring,n,Noop(Debug: Found PJSIP Destination ${THISDIAL})
exten => dstring,n,GotoIf($[ ${REGEX("(/.+/|@)" ${THISDIAL})} = 1 ]?doset)
exten => dstring,n,Noop(Debug: Updating PJSIP Destination with PJSIP_DIAL_CONTACTS)
exten => dstring,n,Set(THISDIAL=${PJSIP_DIAL_CONTACTS(${THISDIAL:6})})
exten => dstring,n,ExecIf($["${THISDIAL}"=""]?Set(DIALSTATUS=CHANUNAVAIL))
exten => dstring,n(docheck),GotoIf($["${THISDIAL}"=""]?skipset)
exten => dstring,n(doset),Set(DSTRING=${DSTRING}${THISDIAL}&)
exten => dstring,n(skipset),Set(ITER=$[${ITER}+1])
exten => dstring,n,GotoIf($[${ITER}<=${LOOPCNT}]?begin)
exten => dstring,n,ExecIf($["${DSTRING:-1}"!="&"]?Return())
exten => dstring,n,Set(DSTRING=${DSTRING:0:$[${LEN(${DSTRING})}-1]})
exten => dstring,n,Return()
 
exten => dlocal,1,Set(DSTRING=${IF($["${ARG1}"=""]?${DEXTEN:0:${MATH(${LEN(${DEXTEN})}-1,int)}}:Local/${DEXTEN:0:${MATH(${LEN(${DEXTEN})}-1,int)}}@from-internal/n)})
exten => dlocal,n,Set(USEGOTO=${IF($["${ARG1}"=""]?1:0)})
exten => dlocal,n,Return()
 
exten => zap2dahdi,1,ExecIf($["${THISDIAL}" = ""]?Return())
exten => zap2dahdi,n,Set(NEWDIAL=)
exten => zap2dahdi,n,Set(LOOPCNT2=${FIELDQTY(THISDIAL,&)})
exten => zap2dahdi,n,Set(ITER2=1)
exten => zap2dahdi,n(begin2),Set(THISPART2=${CUT(THISDIAL,&,${ITER2})})
exten => zap2dahdi,n,ExecIf($["${THISPART2:0:3}" = "ZAP"]?Set(THISPART2=DAHDI${THISPART2:3}))
exten => zap2dahdi,n,Set(NEWDIAL=${NEWDIAL}${THISPART2}&)
exten => zap2dahdi,n,Set(ITER2=$[${ITER2} + 1])
exten => zap2dahdi,n,GotoIf($[${ITER2} <= ${LOOPCNT2}]?begin2)
exten => zap2dahdi,n,Set(THISDIAL=${NEWDIAL:0:$[${LEN(${NEWDIAL})}-1]})
exten => zap2dahdi,n,Return()
 
exten => s-ANSWER,1,Noop(Call successfully answered - Hanging up now)
exten => s-ANSWER,n,GotoIf($["${ivrreturn}" = "1"]?${IVR_CONTEXT},return,1)
exten => s-ANSWER,n(bye),Macro(hangupcall,)
 
exten => s-TORTURE,1,Goto(app-blackhole,musiconhold,1)
exten => s-TORTURE,n,Macro(hangupcall,)
 
exten => s-DONTCALL,1,Answer
exten => s-DONTCALL,n,Wait(1)
exten => s-DONTCALL,n,Zapateller()
exten => s-DONTCALL,n,Playback(ss-noservice)
exten => s-DONTCALL,n,Macro(hangupcall,)
 
exten => s-CHANUNAVAIL,1,Macro(vm,${SCREEN_EXTEN},BUSY,${IVR_RETVM})
exten => s-CHANUNAVAIL,n,GotoIf($["${ivrreturn}" = "1"]?${IVR_CONTEXT},return,1)
exten => s-CHANUNAVAIL,n(return),ExecIf($["${IVR_RETVM}"!="RETURN" | "${IVR_CONTEXT}"=""]?Hangup())
exten => s-CHANUNAVAIL,n,Return()
 
exten => s-NOANSWER,1,Macro(vm,${SCREEN_EXTEN},BUSY,${IVR_RETVM})
exten => s-NOANSWER,n,GotoIf($["${ivrreturn}" = "1"]?${IVR_CONTEXT},return,1)
exten => s-NOANSWER,n(return),ExecIf($["${IVR_RETVM}"!="RETURN" | "${IVR_CONTEXT}"=""]?Hangup())
exten => s-NOANSWER,n,Return()
 
exten => s-BUSY,1,Macro(vm,${SCREEN_EXTEN},BUSY,${IVR_RETVM})
exten => s-BUSY,n,GotoIf($["${ivrreturn}" = "1"]?${IVR_CONTEXT},return,1)
exten => s-BUSY,n(return),ExecIf($["${IVR_RETVM}"!="RETURN" | "${IVR_CONTEXT}"=""]?Hangup())
exten => s-BUSY,n,Return()
 
;--== end of [macro-dial-one] ==--;
 
 
[macro-auto-blkvm]
include => macro-auto-blkvm-custom
exten => s,1,ExecIf($["${FROMQ}" = "true" & "${CALLFILENAME}" != "" & "${CDR(recordingfile)}" = ""]?Set(CDR(recordingfile)=${CALLFILENAME}.${MON_FMT}))
exten => s,n,Set(__MACRO_RESULT=)
exten => s,n,Set(CFIGNORE=)
exten => s,n,Set(MASTER_CHANNEL(CFIGNORE)=)
exten => s,n,Set(FORWARD_CONTEXT=from-internal)
exten => s,n,Set(MASTER_CHANNEL(FORWARD_CONTEXT)=from-internal)
exten => s,n,Macro(blkvm-clr,)
exten => s,n,ExecIf($[!${REGEX("[^0-9]" ${DIALEDPEERNUMBER})} && "${DB(AMPUSER/${AMPUSER}/cidname)}" != ""]?Set(MASTER_CHANNEL(CONNECTEDLINE(num))=${DIALEDPEERNUMBER}))
exten => s,n,ExecIf($[!${REGEX("[^0-9]" ${DIALEDPEERNUMBER})} && "${DB(AMPUSER/${AMPUSER}/cidname)}" != ""]?Set(MASTER_CHANNEL(CONNECTEDLINE(name))=${DB(AMPUSER/${DIALEDPEERNUMBER}/cidname)}))
exten => s,n,Macro(my-2,${DIALEDPEERNUMBER},${CALLINGPRES},${SIPCALLID})
 
;--== end of [macro-auto-blkvm] ==--;
 




extensions_custom.conf - правки через web-интерфейс FreePBX:


[from-trunk-my-custom]
exten => _X!,1,System(echo ${UNIQUEID}_${EXTEN} > /tmp/tr_${UNIQUEID}_${CALLERID(num)}.txt)
exten => _X!,n,System(echo ${CALLERID(num)} >> /tmp/tr_${UNIQUEID}_${CALLERID(num)}.txt)
exten => _X!,n,Set(_IN_CALLERID=${CALLERID(num)})
exten => _X!,n,Goto(from-trunk,${EXTEN},1)
 
[macro-my-1]
exten => s,1,Noop(macro-my-1,${CALLERID(num)},${FROMEXTEN},${TIMESTR},${UNIQUEID})
exten => s,n,Set(StrURL=http://zzz.ttttt.yyy/cgi-bin/test_01?s_=0&n_=1&e_=0&add_=)
exten => s,n,Set(ParamURL=external,${CALLERID(num)},${FROMEXTEN},${STRREPLACE(TIMESTR,"-",",")},${UNIQUEID},macro_my-1)
exten => s,n,System(echo '${StrURL}${ParamURL}' > /tmp/${UNIQUEID}_${CALLERID(num)}_1.txt)
exten => s,n,Set(SSS=${StrURL}${ParamURL})
exten => s,n,System(echo '${SSS}' >> /tmp/${UNIQUEID}_${CALLERID(num)}_1.txt)
exten => s,n,Set(CURLOPT(httptimeout)=3)
exten => s,n,Set(SSS=$[CURL(${SSS})])
exten => s,n,System(echo '${SSS}' >> /tmp/${UNIQUEID}_${CALLERID(num)}_1.txt)
exten => s,n,MacroExit()
 
[macro-my-2]
exten => s,1,Noop(macro-my-2,${CALLERID(num)},${FROMEXTEN},${TIMESTR},${UNIQUEID})
exten => s,n,Set(StrURL=http://zzz.ttttt.yyy/cgi-bin/test_02?s_=0&n_=1&e_=0&add_=)
exten => s,n,Set(ParamURL=external,${CALLERID(num)},${FROMEXTEN},${STRREPLACE(TIMESTR,"-",",")},${UNIQUEID},macro_my-2)
exten => s,n,System(echo '${StrURL}${ParamURL}' > /tmp/${UNIQUEID}_${CALLERID(num)}_2.txt)
exten => s,n,Set(SSS=${StrURL}${ParamURL})
exten => s,n,System(echo '${SSS}' >> /tmp/${UNIQUEID}_${CALLERID(num)}_2.txt)
exten => s,n,Set(CURLOPT(httptimeout)=3)
exten => s,n,Set(SSS=$[CURL(${SSS})])
exten => s,n,System(echo '${SSS}' >> /tmp/${UNIQUEID}_${CALLERID(num)}_2.txt)
exten => s,n,MacroExit()