Asterisk - Macro not available - asterisk

I need some help here.
I try to configure dolibarr's plugin "Calling" on my asterisk.
I need to configure my extensions.conf so that all incoming calls on my asterisk return information to my dolibarr in order to have call notifications...
When I call from outside my softphone rings correctly, but as soon as I get off I get the following error message:
WARNING[3314][C-0000000d]: app.c:326 ast_app_exec_macro: Cannot run 'Macro(dolinotif)'. The application is not available.
Here my Extensions.conf :
[Entrant] exten => s,1,Goto(dolibarr_notification,s,1) ;Redirection
exten => _X.,1,NoOp()
exten => _X.,n,Set(__DOLI_CALLER=${CUT(CUT(SIP_HEADER(From),#,1),:, 2)})
exten => _X.,n,Set(__DOLI_CALLE=${CUT(CUT(SIP_HEADER(To),#,1),:, 2)})
[macro-dolinotif]
exten => s,1,SET(${CURL(https://url.com/htdocs/custom/calling/calling.php?account=${EXTEN}&caller=${DOLI_CALLER}&callee=${DOLI_CALLE}&type=CONNECT&callref=${DOLI_CALLER}&version=1)})
[dolibarr_notification]
exten => s,1,SET(CALLERID(name)=${CURL(https://url.com/htdocs/custom/calling/calling.php?account=${USERNAME}&caller=${DOLI_CALLER}&callee=${DOLI_CALLE}&type=SETUP&callref=${DOLI_CALLER}&version=1)})
exten => s,n,Answer()
exten => s,n,Dial(SIP/MY_NUMBER,60,etTrM(dolinotif))
exten => h,1,SET(CALLERID(name)=${CURL(https://url.com/htdocs/custom/calling/calling.php?account=${USERNAME}&caller=${DOLI_CALLER}&callee=${DOLI_CALLE}&type=RELEASE&callref=${DOLI_CALLER}&version=1)})
exten => h,2,Hangup(16)
I'm a begineer on Asterisk, maybe it's just a dumb problem... If you need more informations ask me.
Thank a lot.

Use older asterisk version or rewrite your dialplan to use Gosub instead of macros.

Related

Call a landline from Asterisk

Situation : I made a trunk between a landline and my server so that whenever someone calls my landline he goes through the dialplan I made in extensions.conf.
Question : Now, taking into account that I have credits on that landline, is it possible to redirect the call to another landline ?
When using command Dial() I have to specify a technology (IAX, SIP,ZAP etc) but in order to redirect the call to a landline (landline2 in the following example) I don't know which one should be used.
Here's what I have so far :
[test]
exten => *mylandlinenumber*,1,Answer()
exten => *mylandlinenumber*,2,MixMonitor(${STRFTIME(${EPOCH},,%d%m%Y-%H:%M:%S)}.wav)
exten => *mylandlinenumber*,3,Goto(langue_select,s,1)
[langue_select]
exten => s,1,Background(/var/lib/asterisk/sounds/intro2168000) ; ce fichier a une fréquence de 8000. Export ->Wav -> Microsoft 16bit
exten => s,2,WaitExten(5)
exten => 1,1,Goto(francais,s,1)
exten => 2,1,Goto(english,s,1)
[francais]
exten => s,1,Background(/var/lib/asterisk/sounds/FrancaisSlowNew168000)
exten => 1,1,Goto(call_forward,s,1)
;EDIT : What follows what added
[call_forward]
exten => s,1,Set(temp=${DB(CFIM/41XXXXXXXXX)}) ; with 41XXXXXXXXX as landline 1
exten => s,n,GotoIf(${temp}?cfim:nocfim)
exten => s,n(cfim),Dial(Local/${temp}#default/n) ; Unconditional forward
exten => s,n(nocfim),NoOp
exten => s,n,Dial(41YYYYYYYYY,15) ; with 41YYYYYYYYY as landline 2
exten => s,n,Set(temp=${DB(CFBS/41XXXXXXXXX)})
exten => s,n,GotoIf(${temp}?cfbs:nocfbs)
exten => s,n(cfbs),Dial(Local/${temp}#default/n) ; Forward on busy or unavailable
exten => s,n(nocfbs),Busy
When calling here I get this error in the debug :
WARNING[466][C-0001c8c7]: app_dial.c:2467 dial_exec_full: Dial argument takes format (technology/resource)
== Spawn extension (call_forward, s, 5) exited non-zero on 'SIP/95.128.80.93-00000015'
If you have dahdi card, type is DADHI.
If you have sip FXO/FXS adapter, type is SIP.
It greatly depend of what you use to connect landline.

How to execute an AGI script during a call by pressing a key

I want to trigger an AGI script (to activate a door opener) while calling. Preferably the script executes on pressing the #-key.
How to embed this behavior in a dialplan? All examples I have found are not dependent on a key press.
I am using FreePBX 2.8.1.4. This is what I have tried:
exten => s,1,Wait(1)
exten => s,n,AGI(test.py)
exten => s,n,Dial(SIP/mk55/203,20,tr)
exten => #,n,AGI(/home/pi/.scripts/dooropen.py)
exten => s,n,Hangup()
and this:
exten => s,n,Read(inPut,,1)
exten => s,n,Dial(console/dsp)
exten => s,n,GotoIf($["${inPut}" = "#"]?keypressed,1)
exten => keypressed,1,AGI(/home/pi/.scripts/dooropen.py)
exten => s,4,Hangup
In deed AGI(script_name, args...) is the right application to use https://wiki.asterisk.org/wiki/display/AST/Application_AGI
To retrieve a DTMF press you can use WaitExten https://wiki.asterisk.org/wiki/display/AST/Application_WaitExten
You can find here a sample of WaitExten usage
Seek Help concerning IVR Menu in Asterisk
Regards

Asterisk "monitor" command records calls but throws away recorded files on premature hangup

I am using the "monitor" command to record full calls. This works well, but only when the user goes through the entire callflow. I tried monitoring the recorded file size as the call progresses. Once the call starts, the file sizes start increasing (of both the "in" and "out" sides of the call). However, if the user hangs up prematurely in the middle of the call, whatever has been recorded thus far is inexplicably dropped and stubs (44 bytes) are left in its place. Any insight into why this behavior occurs will be appreciated.
I am reproducing a snippet from the dialplan I used in my extensions.conf file below:
exten => 7611,1,Answer()
exten => 7611,n,Playback(/var/lib/asterisk/sounds/custom/transferring_with_record_wa rning)
exten => 7611,n,Set(GROUP()=outgoing)
exten => 7611,n,NoOp(The current group count : ${GROUP_COUNT(outgoing)})
exten => 7611,n,GotoIf($[${GROUP_COUNT(outgoing)}>1]?15)
exten => 7611,n,Set(GLOBAL(current_timestamp_7611)=${STRFTIME(${EPOCH},GMT+1,%s)})
exten => 7611,n,Set(GLOBAL(current_full_format_timestamp_7611)=${STRFTIME(${EPOCH},G MT-8,%d%m%Y_%H%M%S)})
exten => 7611,n,NoOp(The current timestamp : ${current_timestamp_7611})
exten => 7611,n,NoOp(The last timestamp : ${last_timestamp_7611})
exten => 7611,n,GotoIf($[(${last_timestamp_7611}+20>${current_timestamp_7611})]?15)
exten => 7611,n,NoOp(All cases passed)
exten => 7611,n,Ringing()
exten => 7611,n,Wait(2)
exten => 7611,n,Monitor(wav,HALEF_audio_ext_7611_${current_full_format_timestamp_761 1})
exten => 7611,n,Dial(SIP/1200#JVXML97,,XgF(default^7611^14))
exten => 7611,n,Set(GLOBAL(last_timestamp_7611)=${STRFTIME(${EPOCH},GMT+1,%s)})
exten => 7611,n,Hangup()
exten => 7611,n,Ringing()
exten => 7611,n,Wait(2)
exten => 7611,n,Playback(/var/lib/asterisk/sounds/custom/busy_later)
exten => 7611,n,Wait(1)
exten => 7611,n,Hangup()
I understand that the "record" command has a "k" parameter which keeps the recorded file upon hangup, but I'm not able to find any similar functionality with the Monitor command. (I'd use "record", but I'd like to record the full call (duplex) and do it automatically, without any user input requirement).
Thanks!
Use MixMonitor command.
Check you have permissions needed for write files.
Check debug if you unsure.
PS. using diaplan WITH n, without labels and goto to EXACT priority is very bad practice, can result hard-catchable bugs. Using GLOBAL variables without need also not so nice idea.

Waiting for extra digit when it's clear that there's no other matching rule

I'm a beginner on Asterisk, but already have my PBX working connected to the PSTN. The issue I'm having is that I have this rule
exten => _*X.*,1,Log(DEBUG, Calling through provider one to ${EXTEN:1:-1})
same => n,Dial(SIP/${EXTEN:1:-1}#oneProvider,60)
There are no other extensions that start with *. What I want to achieve is to dial out as soon as the second * is pressed (and there's nothing the user can press to go to a valid extension), right now it waits a few seconds and dial. I also tried adding ! at the end of the extension, but nothing changed.
Am I missing something? Is this feasible?
Thanks!
This task is not doable in current asterisk.
It will not work beacuase * matched .(dot) in your dialplan.
Except dialplan like this(very ugly one beacuase it will go dialplan for every new digit)
[originalcontext]
exten => *,1,Goto(collect_number,s,1)
[collect_number]
exten => s,1,WaitExten(); wait for single digit
exten => *,1,Set(stars=${stars}*);save stars
exten => *,2,GotoIF($[ "${stars}" == "**" ]?dial,1); if 2 star already,go dial.
exten =>_X,1,Set(digits=${digits}${EXTEN});save digits
exten => _.,3,WaitExten(); wait enother input;
exten => _.,4,Goto(dial,1); go dial if no new digits
exten => dial,1,Dial(SIP/${digits}#oneProvider,60)
Correct solution - use Read application and ask user use # to end number instead of *.
You also can try dialplan like this:
exten => _*X*!,1,Goto(dial,${EXTEN:1:-1},1)
exten => _*XXX*!,1,Goto(dial,${EXTEN:1:-1},1)
exten => _*XXXX*!,1,Goto(dial,${EXTEN:1:-1},1)
exten => _*XXXXX*!,1,Goto(dial,${EXTEN:1:-1},1)
exten => _*XXXXXX*!,1,Goto(dial,${EXTEN:1:-1},1)
exten => _*XXXXXXX*!,1,Goto(dial,${EXTEN:1:-1},1)
exten => _*XXXXXXXX*!,1,Goto(dial,${EXTEN:1:-1},1); continue upto max number length
[dial]
exten =>_.,1,Dial(SIP/${EXTEN}#oneProvider,,);
But i not fully sure that will work. If works, will be less load(but more lines)

Reconfiguring Asterisk server to add in an error message

I have an Asterisk server that I need to reconfigure. It was built by an outside contractor, and I need to make some changes to it. Right now, all it does is answer a call, accept a 7-digit code, and hang up. On the back end, it records the timestamp of the call, the caller id, and the 7-digit code.
What we are running into is that some people do not enter in the 7-digit password, or they take too long. Then the system just restarts, and will continue in an endless loop, until they enter in 7-digits. The callers are, as of late, thinking that the system is broken, when they do not enter in a 7-digit code.
What I'm trying to figure out how to do is that when the system has to return to the beginning, it might say something like "you only entered 6 digits. pleas try again." Or something to that effect. I'm not 100% sure how to add this into the current configuration. Below is what we currently have:
[inbound]
exten => 1234567890,1,Answer
exten => 1234567890,2,Set(COUNTER=4)
exten => 1234567890,3,Set(COUNTER=$[${COUNTER} -1 ])
exten => 1234567890,4,NoOp(${COUNTER})
exten => 1234567890,5,GotoIf($[${COUNTER} > 0 ]?10:122)
exten => 1234567890,10,Wait(1)
exten => 1234567890,11,read(SCODE,EnterCode,7,)
exten => 1234567890,12,GotoIf($[${LEN(${SCODE})}=7]?13:3)
exten => 1234567890,13,Playback(YouEntered)
exten => 1234567890,n,SayDigits(${SCODE})
exten => 1234567890,n,read(SCHOICE,correctpressone,1,)
exten => 1234567890,n,Gotoif($[ ${SCHOICE} = 1 ]?20:1)
exten => 1234567890,20,NoOp(${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)} ${SCODE} ${CALLERID(num)})
exten => 1234567890,n,TrySystem(/bin/echo ${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)}, ${SCODE}, ${CALLERID(num)} >> /opt/codes.log)
exten => 1234567890,n,Playback(SuccessfullyActivate)
exten => 1234567890,n,Hangup()
exten => 1234567890,122,Playback(tt-somethingwrong)
exten => 1234567890,n,Hangup()
Thanks for any help with this issue...
Something like this:
exten => 1234567890,12,GotoIf($[${LEN(${SCODE})}=7]?13:200)
exten => 1234567890,200,Playback(your_inpout_too_short)
exten => 1234567890,201,Goto(3)
Btw, you dialplan is poor quality,looks like person who did it also have no experience.

Resources