Is there a way to determine whether a call went to voicemail from within a hangup handler?
https://wiki.asterisk.org/wiki/display/AST/Hangup+Handlers
(Searching has turned up nothing. Not surprising as I don’t know what terms to search “for”
Is there a way to determine whether a call went to voicemail from within a hangup handler?
https://wiki.asterisk.org/wiki/display/AST/Hangup+Handlers
(Searching has turned up nothing. Not surprising as I don’t know what terms to search “for”
The first few lines of vmx@macro-vm looks like this:
exten => vmx,1,Set(MEXTEN=${ARG1})
exten => vmx,n,Set(MMODE=${ARG2})
exten => vmx,n,Set(RETVM=${ARG3})
Checking the value of the channel variable ${MEXTEN} looks like it might be a good way to check. I have not done any testing, so you want to make sure this variable is set under all conditions. Also this variable will be set regardless of whether a message is left or not.
Thanks for the response. I checked and the value is blank. Are those variables supposed to be accessible from outside the hang-up handler context? I thought they were some sort of context “local” variable (for lack of a better term).
VERBOSE[26270][C-0000051d] pbx.c: -- Executing [s@hangup-handler:5] Verbose("xxxxx", "3, MEXTEN=") in new stack
[2014-05-21 13:49:43] VERBOSE[26270][C-0000051d] app_verbose.c: -- MEXTEN=
from outside the hang-up handler context?
Sorry meant to say “from within the hangup handler”.
Not sure what to tell you. I just tested my solution, and confirmed that if a call first goes to voicemail and then to the hangup handler, the MEXTEN channel variable is set. How are you calling the hangup handler?
My setup is a little different, which probably explains it. I’m using FollowMe to redirect incoming calls to an external number. Here’s an overview:
same => n,Set(CHANNEL(hangup_handler_push)=hangup-handler,s,1)
Looking at the logs, the voicemail process seems to start before the hangup handler kicks in, but … seems to continue on after the handler has finished. Not sure if that’s what’s supposed to happen here …
....
VERBOSE[16967][C-0000051c] pbx.c: -- Executing [s-NOANSWER@macro-vm:2] VoiceMail("SIP/fpbx-xxxxxxxx", "xxxxxx@default,u") in new stack
VERBOSE[16971][C-0000051c] pbx.c: -- Executing [s@hangup-handler:8] Return("Local/1NPANXXXXXX@from-internal-00000068;2", "") in new stack
VERBOSE[16971][C-0000051c] app_stack.c: == Spawn extension (from-internal, h, 1) exited non-zero on 'Local/1NPANXXXXXX@from-internal-00000068;2'
...
VERBOSE[16967][C-0000051c] app_voicemail.c: -- Recording the message
Yeah, I think it’s definitely the FollowMe stuff. It creates a separate Local channel for the outgoing call. I think that’s why I can’t read the variable, because it was created on a different channel.
I think you are probably correct. I think the solution is to call the hangup handler before the follow me channel is set up.
Not sure I follow you. Are you suggesting I attach the hangup handler to the original channel, rather than the Local channel created by FollowMe? Where would that be done? Currently, I’m using [macro-dialout-trunk-predial-hook] in extensions_custom.conf to add a handler for outgoing calls, but obviously that won’t work for incoming.
Incoming calls that arrive on any of the traditional trunk contexts can be caught with the context [from-pstn-custom]. However, if it was me and if this hangup handler is only meant to check vm status, I might be tempted to alter the [macro-vm] context slightly by copying the relevant section from extensions_additional.conf and adding lines to /etc/asterisk/extensions_override_freepbx.conf like this:
[macro-vm]
include => macro-vm-custom
exten => s,1,Macro(user-callerid,SKIPTTL)
exten => s,n,noop(entering [macro-vm] override context defined in /etc/asterisk/extensions_override_freepbx.conf)
exten => s,n,Set(CHANNEL(hangup_handler_push)=hangup-handler,s,1)
exten => s,n,Set(VMGAIN=${IF($[“foo${VM_GAIN}”!=“foo”]?“g(${VM_GAIN})”: )})
exten => s,n,Macro(blkvm-check,)
exten => s,n,GotoIf($["${GOSUB_RETVAL}" != “TRUE”]?vmx,1)
exten => s,n,Hangup
This above is a bit of a hack because there is always the possibility that it will conflict with some future update. I always add a noop line when using override because a year from now if funny things happen, it is easy to forget it is there.
Great. I was doing some more research after I posted, and just read about [from-pstn-custom]. I tried it out and it works perfectly.
I have to run out, but for my own edification I’ll give macro-vm-custom a try too. (Understood about the caveats).
Thanks a lot for your help!