[Freeswitch-users] Re- End Lua script after HangupHook handled without all the extra code to handle the return to the function

Abaci B abaci64 at gmail.com
Fri Mar 4 20:19:00 MSK 2016


The question is not how to figure out when to exit the lua script, the
question is *how to exit the lua script*, and that can sometimes be tricky
or complicated as return "exit" only works from hangup hook.

On Fri, Mar 4, 2016 at 11:56 AM, Chad Phillips <chad at apartmentlines.com>
wrote:

> In cases where I've run Lua scripts on startup, I'll use a global
> variable, and periodically check it like so:
>
>   kill_script = api:executeString("global_getvar custom_lua_kill_script")
>
> If the variable is set to a specified value, then I take steps to end the
> script, which usually just means breaking out of an infinite loop.
>
> This variable can be adjusted in a number of ways, including another Lua
> script, directly from CLI, or even by setting a timer using the schedule
> API in the same script:
>
>   command = string.format([[sched_api %d none
> global_setvar custom_lua_kill_script=true]], shutdown_stamp)
>   api:executeString(command)
>
> Not the most elegant solution, but it works.
>
> On Fri, Mar 4, 2016 at 5:55 AM, Abaci B <abaci64 at gmail.com> wrote:
>
>> I still think there should be a way to exit a lua script without calling
>> a hangup hook, this is needed for lua scripts with no session and even in
>> some scenarios where there is a session.
>> I think I'll open a feature request on Jira for that, unless someone
>> knows a way to do this?
>>
>> On Mon, Feb 29, 2016 at 5:09 PM, Andrew Keil <andrew.keil at visytel.com>
>> wrote:
>>
>>> Abaci B,
>>>
>>>
>>>
>>> Thanks so much for sourcing the JIRA topic!
>>>
>>>
>>>
>>> You were right, by placing the return “exit” inside the hanguphook
>>> handler then the sript does stop and abort with an error.  I have made this
>>> cleaner by adding debug.traceback=nil just prior.
>>>
>>>
>>>
>>> So now my hangup hook handler looks like this:
>>>
>>>
>>>
>>> function myHangupHook(s, status, arg)
>>>
>>>     session:hangup()
>>>
>>>     CleanUp() -- Run CleanUp function now since the caller has
>>> disconnected
>>>
>>>     debug.traceback=nil
>>>
>>>     return "exit"
>>>
>>> end
>>>
>>>
>>>
>>> Obviously this generates the message: “2016-03-01 09:01:18.625809 [ERR]
>>> mod_lua.cpp:203 exit”
>>>
>>> in the console, but this I can live with especially to avoid the goto
>>> statements throughout the code after every audio related function.
>>>
>>>
>>>
>>> Thanks again.
>>>
>>>
>>>
>>> Andrew Keil
>>>
>>> *Visytel Pty Ltd*
>>>
>>>
>>>
>>> *From:* freeswitch-users-bounces at lists.freeswitch.org [mailto:
>>> freeswitch-users-bounces at lists.freeswitch.org] *On Behalf Of *Abaci B
>>> *Sent:* Tuesday, 1 March 2016 3:16 AM
>>>
>>> *To:* FreeSWITCH Users Help <freeswitch-users at lists.freeswitch.org>
>>> *Subject:* Re: [Freeswitch-users] Re- End Lua script after HangupHook
>>> handled without all the extra code to handle the return to the function
>>>
>>>
>>>
>>> I don't see in your example above where you have a return "exit" in your
>>> hangup hook function
>>>
>>> see https://freeswitch.org/jira/browse/FS-3841
>>>
>>> seems like the "exit" or "die" needs to be returned directly from the
>>> hanguphook function so try from that function (not cleanup function) to
>>> return "exit" or "dye", also it seems
>>>
>>>
>>>
>>> On Mon, Feb 29, 2016 at 10:53 AM, Abaci B <abaci64 at gmail.com> wrote:
>>>
>>> That's exactly what I noticed, it breaks out of the current function,
>>> why not open a Jira? I don't think it's supposed to behave this way.
>>>
>>>
>>>
>>> On Mon, Feb 29, 2016 at 1:37 AM, Andrew Keil <andrew.keil at visytel.com>
>>> wrote:
>>>
>>> Thanks for your response.
>>>
>>>
>>>
>>> I have gone through these with no luck.   Like I said the
>>> session:destroy(“…”) crashes FreeSWITCH, which is therefore off the list.
>>> The rest simply interrupt the current function and do no end the script.
>>>
>>>
>>>
>>> I guess my next move is to see why session:destroy() crashes FreeSWITCH,
>>> however I am a little snowed under at the moment so if anyone has some time
>>> to replicate this (only needs one line of code in a Lua script) and pass
>>> this on to the developers that would be great.
>>>
>>>
>>>
>>> Andrew
>>>
>>>
>>>
>>> *From:* freeswitch-users-bounces at lists.freeswitch.org [mailto:
>>> freeswitch-users-bounces at lists.freeswitch.org] *On Behalf Of *Abaci B
>>> *Sent:* Saturday, 27 February 2016 1:29 AM
>>> *To:* FreeSWITCH Users Help <freeswitch-users at lists.freeswitch.org>
>>> *Subject:* Re: [Freeswitch-users] Re- End Lua script after HangupHook
>>> handled without all the extra code to handle the return to the function
>>>
>>>
>>>
>>> See
>>> https://freeswitch.org/confluence/display/FREESWITCH/Lua+API+Reference#LuaAPIReference-session:setHangupHook
>>> for a few ways to exit the lua script (error(), return "exit", return
>>> "die", s:destroy("error message")). I personally tried return "exit" but it
>>> seems to me that it only exits the calling function, haven't had a chance
>>> to look further, it's possible that the calling it from the within a
>>> function is different. if you play around and figure out please report back.
>>>
>>>
>>>
>>> On Thu, Feb 25, 2016 at 9:33 PM, Andrew Keil <andrew.keil at visytel.com>
>>> wrote:
>>>
>>> To FreeSWITCH Users,
>>>
>>>
>>>
>>> See below for a sample template for a Lua Service Script running inside
>>> FreeSWITCH.
>>>
>>>
>>>
>>> The issue I have is fairly straightforward.
>>>
>>>
>>>
>>> I need a function to run when hangup is detected (ie. at the end of the
>>> call) however I understand this must not delay ending the script.  This
>>> function is CleanUp().  Then I would like the service to end.
>>>
>>>
>>>
>>> The problem I am having is if the caller hangs up during the playback of
>>> “intro.wav” (as shown inside the MainService() function below), then the
>>> code jumps to the myHangupHook which calls CleanUp() perfectly, the issue
>>> is once CleanUp() is complete I would like the Lua script to end there and
>>> then (ie. at the bottom of CleanUp()).  What actually happens is it returns
>>> to MainService() and continues to try and play “info.wav”, unless I either
>>> check for session:ready() everywhere or add a goto as shown below under
>>> each streamFile() function call.
>>>
>>>
>>>
>>> My aim is to reduce extra code and to make the Lua script simpler and
>>> easier to read.  Also I would like to try and avoid goto statements, which
>>> I know can be done with if (session:ready()) etc….
>>>
>>>
>>>
>>> So is there a way to stop a Lua script running inside FreeSWITCH
>>> cleanly?  I have tried the os.exit() this is barred from use by
>>> FreeSWITCH.  I have also tried session:destroy() which crashes FreeSWITCH
>>> (version 1.6.5 on CentOS 6.7, CentOS 7 and windows) 100% of the time!
>>>
>>>
>>>
>>> I could look further into the Lua additions done by the FreeSWITCH team
>>> in the source code, however if someone has already solved this then that
>>> would be the best solution.
>>>
>>>
>>>
>>> FYI: Obviously the script below is simple, however I am sure that you
>>> understand if the script was complicated having to use “*if
>>> (session:ready()) then ….”* or “*if (not session:ready()) then goto
>>> HANGUPEXIT end”* makes the code ugly.
>>>
>>>
>>>
>>> Thanks in advance,
>>>
>>>
>>>
>>> Andrew Keil
>>>
>>> *Visytel Pty Ltd*
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>> ------------------------------------------------------------------------------
>>> Sample Lua Service
>>> -----------------------------------------------------------------------
>>>
>>>
>>>
>>> -- Lua template for FreeSWITCH service
>>>
>>> -- By: Andrew Keil (Visytel Pty Ltd)
>>>
>>> -- Email: support at visytel.com
>>>
>>>
>>>
>>> -- Setup script wide variables here
>>>
>>>
>>>
>>> function PreAnswer()
>>>
>>>                 freeswitch.consoleLog("INFO", "PRE ANSWER SECTION\n");
>>>
>>>                 -- Add your pre answer code from here
>>>
>>>
>>>
>>>                 -- End of your pre answer code
>>>
>>>                 freeswitch.consoleLog("INFO", "PRE ANSWER SECTION
>>> COMPLETE\n");
>>>
>>> end
>>>
>>>
>>>
>>> function AnswerCaller()
>>>
>>>                 session:answer()
>>>
>>>                 session:sleep(1000)
>>>
>>> end
>>>
>>>
>>>
>>> function MainService()
>>>
>>>                 freeswitch.consoleLog("INFO", "MAIN SERVICE
>>> SECTION\n");
>>>
>>>                 if (session:ready()) then
>>>
>>>                                 -- Note (1): If you wish to end the call
>>> then simply use: goto ENDSERVICE
>>>
>>>                                 -- Note (2): To terminate the service
>>> sooner when HANGUP is detected use: if (not session:ready()) then goto
>>> HANGUPEXIT end
>>>
>>>                                 -- Add your main service code from
>>> here               (caller would have been answered)
>>>
>>>
>>>
>>>                                 session:streamFile("intro.wav")
>>>
>>>                                 if (not session:ready()) then goto
>>> HANGUPEXIT end
>>>
>>>                                 session:streamFile("info.wav")
>>>
>>>                                 if (not session:ready()) then goto
>>> HANGUPEXIT end
>>>
>>>
>>> session:streamFile("outro.wav")
>>>
>>>                                 if (not session:ready()) then goto
>>> HANGUPEXIT end
>>>
>>>
>>>
>>>                                 -- End of your main service code
>>>
>>>                 end
>>>
>>>                 ::ENDSERVICE::
>>>
>>>                 if (session:ready()) then
>>>
>>>                                 -- End of service so hangup
>>>
>>>                                 session:hangup()  -- Should
>>> automatically jump to CleanUp() via hangup handler if caller still online
>>> at this stage
>>>
>>>                 end
>>>
>>>                 goto END
>>>
>>>                 ::HANGUPEXIT::
>>>
>>>                 freeswitch.consoleLog("INFO", "END OF SERVICE (HANGUP
>>> DETECTED)\n");
>>>
>>>                 ::END::
>>>
>>>                 freeswitch.consoleLog("INFO", "MAIN SERVICE SECTION
>>> COMPLETE\n");
>>>
>>> end
>>>
>>>
>>>
>>> function CleanUp()
>>>
>>>                 freeswitch.consoleLog("INFO", "CLEANUP SECTION\n");
>>>
>>>                 -- Add your cleanup code from here (caller would have
>>> been disconnected)
>>>
>>>
>>>
>>>                 -- End of your cleanup code
>>>
>>>                 freeswitch.consoleLog("INFO", "CLEANUP SECTION
>>> COMPLETE\n");
>>>
>>> end
>>>
>>>
>>>
>>> function myHangupHook(s, status, arg)
>>>
>>>                 session:hangup()
>>>
>>>                 CleanUp() -- Run CleanUp function now since the caller
>>> has disconnected
>>>
>>> end
>>>
>>>
>>>
>>> -- Setup Hangup event handler here
>>>
>>> v_hangup = "HANGUP"
>>>
>>> session:setHangupHook("myHangupHook", "v_hangup")
>>>
>>>
>>>
>>> -- Call service functions in order
>>>
>>> PreAnswer()
>>>
>>> AnswerCaller()
>>>
>>> MainService()
>>>
>>> -- End of Lua service
>>>
>>>
>>>
>>>
>>>
>>>
>>> _________________________________________________________________________
>>> Professional FreeSWITCH Consulting Services:
>>> consulting at freeswitch.org
>>> http://www.freeswitchsolutions.com
>>>
>>> Official FreeSWITCH Sites
>>> http://www.freeswitch.org
>>> http://confluence.freeswitch.org
>>> http://www.cluecon.com
>>>
>>> FreeSWITCH-users mailing list
>>> FreeSWITCH-users at lists.freeswitch.org
>>> http://lists.freeswitch.org/mailman/listinfo/freeswitch-users
>>> UNSUBSCRIBE:http://lists.freeswitch.org/mailman/options/freeswitch-users
>>> http://www.freeswitch.org
>>>
>>>
>>>
>>>
>>> _________________________________________________________________________
>>> Professional FreeSWITCH Consulting Services:
>>> consulting at freeswitch.org
>>> http://www.freeswitchsolutions.com
>>>
>>> Official FreeSWITCH Sites
>>> http://www.freeswitch.org
>>> http://confluence.freeswitch.org
>>> http://www.cluecon.com
>>>
>>> FreeSWITCH-users mailing list
>>> FreeSWITCH-users at lists.freeswitch.org
>>> http://lists.freeswitch.org/mailman/listinfo/freeswitch-users
>>> UNSUBSCRIBE:http://lists.freeswitch.org/mailman/options/freeswitch-users
>>> http://www.freeswitch.org
>>>
>>>
>>>
>>>
>>>
>>>
>>> _________________________________________________________________________
>>> Professional FreeSWITCH Consulting Services:
>>> consulting at freeswitch.org
>>> http://www.freeswitchsolutions.com
>>>
>>> Official FreeSWITCH Sites
>>> http://www.freeswitch.org
>>> http://confluence.freeswitch.org
>>> http://www.cluecon.com
>>>
>>> FreeSWITCH-users mailing list
>>> FreeSWITCH-users at lists.freeswitch.org
>>> http://lists.freeswitch.org/mailman/listinfo/freeswitch-users
>>> UNSUBSCRIBE:http://lists.freeswitch.org/mailman/options/freeswitch-users
>>> http://www.freeswitch.org
>>>
>>
>>
>> _________________________________________________________________________
>> Professional FreeSWITCH Consulting Services:
>> consulting at freeswitch.org
>> http://www.freeswitchsolutions.com
>>
>> Official FreeSWITCH Sites
>> http://www.freeswitch.org
>> http://confluence.freeswitch.org
>> http://www.cluecon.com
>>
>> FreeSWITCH-users mailing list
>> FreeSWITCH-users at lists.freeswitch.org
>> http://lists.freeswitch.org/mailman/listinfo/freeswitch-users
>> UNSUBSCRIBE:http://lists.freeswitch.org/mailman/options/freeswitch-users
>> http://www.freeswitch.org
>>
>
>
> _________________________________________________________________________
> Professional FreeSWITCH Consulting Services:
> consulting at freeswitch.org
> http://www.freeswitchsolutions.com
>
> Official FreeSWITCH Sites
> http://www.freeswitch.org
> http://confluence.freeswitch.org
> http://www.cluecon.com
>
> FreeSWITCH-users mailing list
> FreeSWITCH-users at lists.freeswitch.org
> http://lists.freeswitch.org/mailman/listinfo/freeswitch-users
> UNSUBSCRIBE:http://lists.freeswitch.org/mailman/options/freeswitch-users
> http://www.freeswitch.org
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.freeswitch.org/pipermail/freeswitch-users/attachments/20160304/dc0e69e4/attachment-0001.html 


Join us at ClueCon 2016 Aug 8-12, 2016
More information about the FreeSWITCH-users mailing list