mindsellers
74 subscribers
25 photos
8 files
32 links
Практики из жизни Linux-админа. Asterisk, Bash, Python и черная магия.

Сайт http://mindsellers.ru
Группа VK https://vk.com/mindsellers
ТыТруба https://www.youtube.com/channel/UC7LUJgzIUL4VGiOWctoa0fw
По всяким вопросам обращаться @alex_dmit
Download Telegram
Учет переведенных звонков в FREEPBX

Возникла задача - быстро получить статистику во FREEPBX по звонкам, которые были переведены. Как известно, в CDR перевод можно опознать только по косвенным признакам, а морочиться с CEL нет никакого желания.

В файле /etc/asterisk/extensions_additional.conf видим строку

TRANSFER_CONTEXT = from-internal-xfer

При этом сам по себе контекст включает в себя

Include =>        'from-internal-custom'                       
Include => 'from-internal-additional'

что добавляет проблем при попытке что-то в нем дописать или переписать. Поэтому создадим файл /etc/asterisk/globals_custom.conf
c содержимым

TRANSFER_CONTEXT = custom_transfer

а в /etc/asterisk/extensions_custom.conf

добавим

[custom-test_transfer]
exten => _.,1,Noop(XFER from ${BLINDTRANSFER:4:3} callerid ${CALLERID(num)} to ${EXTEN} uniqueid ${CDR(uniqueid)})
exten => _.,n,Set(CDR(userfield)=XFER from ${BLINDTRANSFER:4:3} to ${EXTEN})
exten => _.,n,Goto(from-internal-xfer,${EXTEN},1)

Тут внимания заслуживает переменная ${BLINDTRANSFER}, которая является следствием "слепого перевода" и содержит в себе наименование канала, который собственно и инициировал перевод звонка. В моем случае внутренние номера трехзначные, и переменная выглядит примерно так: SIP/123-a124423

В контексте мы ее "подрезаем", чтобы вычленить именно номер переводившего и записываем в userfield таблицы cdr, что позволяет однозначно определить переведенные звонки и понять, кто его переводил.


#asterisk #freepbx
Как быстро отдать внешней системе статус абонента Asterisk

Дисклеймер: так делать нежелательно по куче причин, но если надо "вотпрямсейчас" - то допустимо

Правильный путь получения статуса устройства в Asterisk - это, конечно, подключение через AMI, запрос-ответ-обработка. А еще более правильный - получение статусов всех устройств через одно обращение раз в n миллисекунд, хранение оных и отдача их внешним потребителям уже без "дергания" астера.
Однако, правильный путь не всегда доступен. Буквально только что моим героическим друзьям-1с-никам потребовалось налету узнавать статус оператора. Они у меня прикормленные, к лотку приученные, и вообще няшки, так что я уверен, что запросами они мне систему не завалят. Поэтому родился следующий бред: получаем от них через php-скрипт GET-запрос, вызываем астер с нужными параметрами, отдаем результат, а они пусть обрабатывают.

У меня стоит FreePBX, так что апач и астер уже работают под одним пользователем, а exec() в php разрешен. Пишем скрипт, достойный просто пера Шекспира:

<?php
$num=$_GET['num'];
$a="asterisk -x 'core show hint " . $num . "' | grep State | cut -f4 -d':' | cut -f1 -d' '";
echo exec($a);
?>

1с обращается GET-запросом вида

http://10.10.10.10/devstate.php?num=106

и получает в ответ Unavailable, Ringing, InUse или Idle, в зависимости от текущего состояния устройства.


Вот и все, малята! Но помните, что так безобразничать можно только в том случае, если те, кто будут получать статусы, более-менее адекватные.

#asterisk #onestringscript #freepbx #php