Как стать автором
Обновить

Комментарии 14

Не делайте так, используйте queue_log.

Также астериск вообще говоря не гарантирует запись CDR в таблицу до запуска h-exten. Вы вроде как решили это через sleep 7, НО астериск не гарантирует и за 7 секунд вообще говоря.
А еше на нагруженной системе скрипты с sleep 7 будут убиваться случайно.

Корректным решением был бы скрипт, который мониторит в mysql queue_logs и по записи ABANDON шлет сообщение.
а еще queue_log можно писать в mysql и там настроить триггер на ABANDON
Правильно, писать в mysql и потом писать тригер.
Тригеры mysql както странно работают на внешние скрипты. Я просто проверяю табличку.
А зачем писать в mysql еще что-то, если имеющихся в нём данных и так достаточно для решения задачи?

простите, а почему select | grep, а не добавить в where условие? думаю, что при наличии индекса на поле, будет быстрее. проверяли ли этот вариант?

Согласен с вами полностью, просмотрели. Считаю, что так действительно будет быстрее:
res_sql="SELECT disposition FROM cdr WHERE uniqueid = '$1' AND disposition = 'ANSWERED'"
answer=`mysql -u freepbxuser -pPassword_freepbxuser -D asteriskcdrdb -B -N -e "$res_sql" | head -n 1`
Не пользуйтесь postfix если вам надо просто отправлять почту… есть ssmtp
конфигурация из 5 строк.
И используйте mutt при отправке письма
Отлавливание пропущенных делается проще. Добавляете в Dial вызов gosub при ответе вызова.
В gosub ставите метку что вызов отвечен.
По hangupcause проверяете наличие метки.
Отправляете почту при отсутствии.

Очередь, не очередь, группа, номер… везде работает.
И не надо в mysql лезь и bash изобретать
А почему не сделать проще?
У команды QUEUE есть ключ 'c', при котором диалплан продолжается после того, как вызывающий положил трубку, и переменная ABANDONED, которая выставляется в TRUE, если никто из агентов не ответил на вызов.
same => n,Queue(callcenter,CcRt,,,,,,callcenter-queue-connected)
same => n,GotoIf($["${ABANDONED}"="TRUE"]?send-email)

Очень сложное решение и непрактичное решение. Понятное дело, что нехватку практического опыта надо компенсировать и это похвально, решение все же работает :) Rsa97 выше предложил очень хорошее решение :) на практике мы что-то подобное используем уже довольно долго, и поток из тысяч звонков в день показывают его надежность и эффективность.

Спасибо за комментарий! На самом деле очень приятно, что коллеги, подсказывают дельные решения. На некоторые комментарии пока не могу ответить, потому что для этого нужно изучить объемный пласт информации. Собственно этим сейчас и занимаюсь.
Откажитесь от вызова System. Любой внешний вызов через System/Exec и тд очень сильно грузит систему, что особенно заметно при хорошей нагрузке.
Если нужно выполнение внешнего скрипта в любой задаче — пишите нормальный демон скрипта и кидайте ему данные через curl, например, или слушайте астериск через AMI/ARI.
Тоже болел внешними скриптами. Наступил на грабли, скрипт не смог подключиться к базе и завис в фоне, в итоге получит 1000* запущенных процессов одного и того же скрипта. Так было до бесконечности пока сервер не упал.

Если уже пользуете скрипты то добавляйте таймаут на исполнение.

Я перешел на использование хендлеров.
wiki.asterisk.org/wiki/display/AST/Hangup+Handlers
Про хендлеры почитаем. Спасибо за замечание про таймаут! Заменили в «extensions_override_freepbx.conf» строку на:
exten => h,1,System(timeout 30 /home/asterisk/scripts/noanswer.sh ${CDR(uniqueid)} ${CALLERID(num)} ${NODEST} &)
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории