Вполне простая задача.... Решается (как выше верно упомянули) правильней всего AGI и БД.
У меня так сделано: есть в БД таблица направлений. В ней я указываю шаблон дозвона, уровень доступа (cor - class of restriction. Тэрмин честно стырил у Авайи
))), статус направления. (всего около 802 записи).
К этой таблице соотношением один ко многим привязана другая таблица, где прописаны доступные исходящие операторы и их цены (на каждое конкретное направление). Есть таблица cor - в ней я создал градации уровня доступа (всего получилось около 20 шт: только экстренные службы, только город, только область, Россия, СНГ, ближнее зарубежье ну и др). таблица пересечений cor: с каких на какие можно звонить.
В начале каждого звонка:
-проверятся право абонента звонить на конкретный номер
- выбирается наиболее недорогой провайдер для этого направления
а диалплан выглядит почти так :
exten => _X.,1,AGI(do-some-cool-magic.pl)
same => n,Dial(SIP/${provider}/${to_exten},60,${dial_opts})
Начать, в общем то не так сложно (если есть базовые навыки программмирования.
Для парсинга и манипуляции с данными телефонии хорошо подходит perl. И не надо устанавливать. Уже встроен в любой linux.
Начинаем так: Берем класс:
http://search.cpan.org/~jamesgol/asteri ... isk/AGI.pm
прикручиваем к системе: cpan install Asterisk::AGI
Хотим ходить в БД? Не вопрос:
http://search.cpan.org/~timb/DBI-1.640/DBI.pm
cpan install DBI (+DBD::Pg для postgres, для других хз. Читать доку.)
Хотим отправлять в процессе звонка сообщения? к примеру, в Jabber, пфф, легко:
http://search.cpan.org/~dapatrick/Net-X ... et/XMPP.pm
Хотим стильно, модно, молодежно? Не вопрос! Telegram:
http://search.cpan.org/~robertof/WWW-Te ... /BotAPI.pm
Хотим не говнокодить и вынести нужные вещи в аккуратный конфиг? ОК:
http://search.cpan.org/~sherzodr/Config ... /Simple.pm
Ну и конечно, думаю бессысленно напоминать про всю мощь регулярных выражений в Perl
test.pl:
Код: Выделить всё
...
use strict;
...
use Asterisk::AGI;
...
my $AGI = new Asterisk::AGI; # создаем экземпляр класса
my $exten = $AGI->get_variable('EXTEN') # Читаем из диалплана переменную EXTEN;
my $callerid = $AGI->get_variable('CALLERID(num)'); # Читаем из диалплана номер звонящего
...
# Читаем миллион других переменных
# Творим с этими переменными что-то невероятное
my $dbh = DBI->connect("dbi:Pg:dbname=$dbname;host=$host","$username","$password", {PrintError => 0});
# Подключились к БД. Запросы и прочее см. Доку (ссылка выше)
# Идем в БД
# И пишем обратно в диалплан:
$AGI->set_variable('new_caiilng_num',$callerid);
...