четверг, 23 апреля 2015 г.

Работа с хуками и стартап скриптами

Пример стартап скрипта
con = freeswitch.EventConsumer("CUSTOM","vm::maintenance")
for e in (function() return con:pop(1) end) do
        freeswitch.consoleLog("notice","event\n" .. e:serialize("xml") .. "\n")
        element = nil
        element = e:getHeader("VM-Action")
        if element then
                --
        end
end

Пример хук скрипта
freeswitch.consoleLog("notice","RECORD_STOP\n" .. event:serialize(""))
path = nil
path = event:getHeader("Record-File-Path")
итд.
То есть у нас изначально есть массив event, где лежат все значения ивента. Но при этом недоступны канальные переменные, только глобальные. Можно добавить свои поля в ивент через event:addHeader("API-FileSize", size), и даже сформировать новый ивент (читаем доку), но просто модификация полей не перенесет новые переменные в сессию.

Можно создать привязку к api так:
api = freeswitch.API()
и дальше делать запросы типа
req = urlencode(event:serialize("json"))
data = api:executeString("curl "..  url .. " content-type application/json post " .. req)
Опять же, сессионные переменные будут недоступны, то есть можно сделать eval на строку вида
path =  "$${base_dir}/recordings/archive/${strftime(%Y-%m-%d-%H-%M-%S)}_${caller_id_number}_${destination_number}.wav"
но ${caller_id_number}_${destination_number} будут пустые и на выходе останется только "_". Нужно подобрать подходящие поля в event. Что-то можно заранее в ивент (и сип заголовки) выставить через application=set data="sip_h_X-Caller=12345", появится поле X-Caller.

Есть ещё метод вызова, через lua или luarun, тогда доступны сессионные переменные через массив session, самый простой пример
session:execute("playback", mySound)
в отличии от api:execute, выполняется в контексте текущей сессии, где доступны все переменные.

Также нужно быть предельно аккуратными с freeswitch.EventConsumer -- если такая конструкция появится в хуке на ивент, фрисвич начнёт падать. Точно актуально для 1.4.15, и на момент выхода 1.4.18 никто даже не пытался понять причин. И что самое противное -- падать будет не сразу, а спустя N дней, и при этом КАК БЫ работать. То есть поступает звонок, в логе есть инвайт, есть ответ на него... и всё. ringing уже не будет. Но cancel примет и обработает!

Ну и помним, что стартап скрипты перечитываются ТОЛЬКО при рестарте всего фрисвича целиком! Увы, просто рестартовать модуль lua нельзя. А вот хуки - читаются при каждом обращении к ним, поэтому для повышения скорости их лучше помещать в tmpfs/shm

линки
https://freeswitch.org/confluence/display/FREESWITCH/mod_lua
https://freeswitch.org/confluence/display/FREESWITCH/Lua+API+Reference

Комментариев нет:

Отправить комментарий