Pull to refresh

Comments 22

Добрый день, спасибо за статью.
мне понравилось использование npm для быстрой разработки и распространения приложения
на мой взгляд весьма сомнительное преимущество, особенно если не имели опыта работы с Node.js. в своих проектах использую библиотеку pyst для работы с AGI и AMI на python.
Т.е. если бы астериск умел записать файл, а потом его передать по AGI
вообщем-то файл записать можно, да и передать файл тоже можно, правда не силами AGI(собственно для этого протокол и не предназначен), а например через sftp(не знаю, имеет ли node.js библиотеки для работы с sftp) скопировать записанный файл на удаленный сервер.
Я имел опыт с Node.js, поэтому пишу о своих мироощущениях. В целом, согласен, что кто чем умеет, тем и рисует.

По поводу передачи файла: в voicer'е у меня было также разделение по машинам — одна с астериском, вторая с приложением, обошлись пока просто монтированием sshfs. там пришлось правда сделать отдельные настройки директории с файлами для астериска и для приложения.

Почему все забили на lua? Это же намного быстрее чем AGI. Ну в 1.8 я еще понимаю, на в 12-13 версиях AGI уже как костыль смотрится честно говоря…
Я AEL использую, вполне удобно и читабельно.
lua это lua, а agi хочешь perl,python,php,c,java,lua…
AGI тяжелее за счет того что это внешний интерфейс… Гораздо тяжелее. И не важно в каком исполнении он будет — сетевом или файловом.
Меня интересовала минимальное взаимодействие астериска и дополнительного сервиса. Поэтому FastAGI. Плюс то, что я знаю и понимаю, поэтому node.js. К тому же, активно у меня используемый сервис — это для определения входящих по регионам на 8800, там несколько сотен звонков в час, что для AGI вполне по силам.

Диалплан на lua? Может быть. Вот в недавней статье приводится инфо, что работает все очень хорошо и быстро. Я писал, что можно поделить диалплан на маршрутизацию звонка и допвычисления. Вот для маршрутизации может быть стоит использовать.

А еще вопрос: можно ли часть диалплана использовать из lua, а часть нативного диалплана, который может вызывать куски диалплана на lua? Типа, макросы написать на lua, а затем при необходимости их использовать в диалплане.
Да. Можно. Смешивается все отлично. Читаются переменные и тд. Я вообще всю работу с базади данных (mysql, redis) вынес в lua. быстрые и удобные коннекторы + работа с функциями диалплана сразу из ядра- очень достойное решение.
Спасибо, вот теперь я точно хочу это попробовать сделать.
в продолжение темы пара вопросов:
как вы организуете extensions.lua? Т.е. не все же лежит в одном файле? как-то делится на модули?
не понял тему Long Running Operations (Autoservice). После 10-го астериска надо заморачиваться?
каким lua модулем вы цепляетесь к mysql, mongo?
пробовали делать какое-то динамическое добавление extensions? типа в веб-интерфейсе добавли абонента: добавили параметры в sip.conf, а затем прописали ему внутренний номер в extensions.

простейший диалплан я набросал, работает: )
забавно было в консоли астериска дебажить lua скрипт
Ну у меня на данный момент инклюдов файлов нет. Но вообще реорганизация предстоит естественно.

Long Running Operations (Autoservice) как раз таки после 10 астериска -заморачиваться не надо, а до 10 — как раз нужно.

По поводу конфигурирования екстеншнов — я не пишу диалпаны для каждого екстеншна. Я как правило пишу набор функций и храню екстеншны и соответсвие функций (или контекстов, когда как) в базе. Универсальней получается. Не люблю я эти все деревянные хардкодинговые решения.

Mongo не пользую. Пользую в основном redis
моудль redis-lua
и mysql
модуль LuaSQL

вообще набор библиотек у lua очень широк. Делать можно очень многое.
>>Я как правило пишу набор функций и храню екстеншны и соответсвие функций (или контекстов, когда как) в базе.
А можно пример кода этого момента?

>>вообще набор библиотек у lua очень широк.
да, я уже заценил luarocks, на стандартные нужды хватает: )

а как делаете отладку? Ну, т.е. постоянно app.noop() используете? или можно как-то более развернуто посмотреть значения таблиц lua?

а не в курсе как происходит работа с диалпланом lua в астериске? Т.е. астериск при загрузке pbx_lua.so парсит extensions.lua в диалплан и далее его держит в памяти, проводя каждый звонок по диалплану? Меня интересует, можно ли держать в памяти какие-то данные, а какие-то данные можно выставлять для каждого звонка?
А можно пример кода этого момента?

Коммерческая тайна. Не могу разглашать. как нить статью напишу по этому поводу)) чтобы без кода проектного. обобщить.

по отладке когда как — если это не диалплан как таковой то сначала скрип стандартным способом тестирую а потом заливаю его как часть диалплана. в dialplan да. Через NoOp

Астериск не парсит lua. он его проверяет изначально на ошибки обычным интерпритатором и потом при вхождении звонка — запускает скрипт его обработки, коим является extensions.lua
Все что можно держать в памяти обычным диалпланом — то можно держать в памяти и с помощью lua.
Ну либо я не совсем понял ваш вопрос)))

>>как нить статью напишу по этому поводу)) чтобы без кода проектного. обобщить.
киньте, пожалуйста, потом ссылку

по отладке, в wiki астериска нашел пример для замены стандартного print — print через консоль астериска: )

extensions.lua частично таки парсится, т.к. таблица extensions добавляется в диалплан, видно dialplan show

Память еще потестирую, но в целом, наверное для этого лучше использовать redis.
А еще вот особенность заметил: чуть что-то в extensions.lua не так, то при перезагрузке module reload pbx_lua.so астериск вылетает тут же. У вас так же? Это мне кажется как-то не очень нормальное поведение. Астериск 11.18, lua 5.2
В память заносится только табличка с еxtensions
Нет. У меня не вылетает. Но я использую 5.1 и астериск 13.
Возможно дело в кривой омпиляции модуля на 11 астериске. Помню при подключении сторонних модулей lua в 12 была проблема что не видел астериск этих модулей. Приходилось в ручную переписывать кусок кода chan_sip по-моему. Точнее в ручную выставлять значение флага одного.
В 13 это уже было решено. Так что вполне возможно проблема связана как то с этим.
А у тебя точно работают контексты из extensions.conf c контекстами в extensions.lua?
Я пробую сделать
extensions = {
		["local"] = {
			include = {'inner', 'outbound'}
		};
		["inner"] =inner(conf);
	};

где outbound описан в extensions.conf, а подключить его хочу чтобы во вне звонили по направлениям из outbound. У абонента назначен local, на inner внутренние номера уходят.
да. Точно. Главное чтобы они не дублировались.
Попробуй include прописать для каждого контекста, а не как таблицу его формировать
И возможно у тебя регулярки для екстеншнов в inner подходят для звонка в outbound И тогда естественно звонок останется на inner
fastAGI который сетевой совсем ничего. или у Вас были реальные а не теоретические проблеммы с перформансом fastAGI?
Я бы сказал так — в любом случае на lua нагрузка будет меньше потому что функции работают напрямую с ядром. Не через какие либо интерфейсы. Я не говорю что fastAGI плох. Просто отпала необходимость в подобных интефейсах когда появилась возможность прямого кодинга. + lua сам по себе очень быстрый язык и у него очень много плюшек вплоть до впиливания функций напрямую на C.

P. S. Я как бы не против чего либо другого ине настаиваю. Прсото факт констатирую что это очень удобный интерфейс.
Подходы разные нужны. Я против 'Ну в 1.8 я еще понимаю, на в 12-13 версиях AGI уже как костыль смотрится честно говоря'.
— Мешать все в кучу не красиво. IMHO.
— Есть конфиг телефонии — отдельно, есть бизнес логика — отдельно.
— Разработчик и админ-телефонист в одном лице встречаются реже чем по отдельности.
— Если что то тяжелое то через fastAGI замасштабировать легче.
Согласен по всем пунктам.

По пункту 3 — вот поэтому, наверное, так мало пользуются lua для диалпланов.

Также какие-то проблемы, то с lua ты разбираешься сам, а с традиционным диалпланом — можно пойти на форуме спросить.
Sign up to leave a comment.

Articles