Asterisk и Lua. Очень быстрый старт

Астериск из коробки может исползовать язык программирования LUA для написания диалплана. И это прекрасно! В диалплане можно подключить любую установленную lua-библиотеку и получить доступ к базе данных (SQLite, MySQL, PostgreSQL), работать с сетью, читать-записывать файлики. Причем, делается это все довольно просто.
Зная любой язык программирования и вооружившись справочником по синтаксису LUA, а так же прочитав пару абзацев ниже можно без проблем начать использовать всю мощь этой связки.

Диалплан находится (как не сложно догадаться) в файле extensions.lua и представляет собой таблицу extensions состоящую из таблиц-контекстов, которые в свою очередь состоят из экстеншенов-функций. Код выглядит не так страшно, как описание:

extensions = {
    ["context"] = {
        ["_1XX"] = function(context, exten) app.dial("SIP/" .. exten); end
    };
}

Функция-экстеншен принимает два параметра — context и exten и само-собой не обязательно должна быть анонимной:

fuction office_dial(context, exten)
    app.dial("SIP/" .. exten);
end;
 
extensions = {
    ["office"] = {
        ["_1XX"] = office_dial;
    }
}

Доступ ко всем командам asterisk (dial, wait, answer, playback и т.д.) осуществляется через таблицу app:

app.verbose("Hello there!")
app.wait(1)
app.answer()
app.playback("beep")
app.noop()
app.hangup()

А доступ к канальным переменным (CALLERID, CDR, DEVICE_STATE и т.д.) через таблицу channel:

local cid_number = channel.CALLERID["number"]:get()
channel.CALLERID["name"]:set("Test User")
if channel.DEVICE_STATE("SIP/100"):get()) == "NOT_INUSE" then
    -- что-то делаем
end

не забывает про методы get() и set() у канальных переменных.