3.08.2019

MySQL ORDER BY / LIMIT performance: late row lookups

Оптимизация запросов, для большой выборки и исключения повторений крайне полезная статья.

вкраце можно использовать вот такую конструкцию:

SELECT  distinctl.id
FROM    (
SELECT  id
FROM    t_limit
WHERE columnA='53'
) o
JOIN    t_limit l
ON      l.id = o.id

15.07.2019

zoiper IOS ANDROID PUSH notification

чтобы получить push уведомления, необходимо на своем телефоне при установке Zoiper

1. разрешить использовать сервис push уведомлений

2. разрешить на своём SIP сервере подсети
IP – 185.117.83.192/27 , port 443

У zoiper Это стоит 75 рублей в месяц., других способов отправить push уведомление на чужое приложение я не вижу.

Статья zoiper.

6.07.2019

Приложение supervisor для контроля выполнения скриптов.

Работа AMI скриптов может быть не стабильна, особенно когда вы не обладаете большим опытом. Подсмотрел хорошее приложение supervisor, которое устанавливается из репозиториев и включается за пять секунд. Опять же ваш скрипт будет запускаться автоматически. А управление выглядит очень удобным:

Бонусы это автозапуск, логи в определенные папки.

старт: supervisorctl start pami.php
стоп: supervisorctl stop pami-hangup.php

Логи лежат в /var/log/pami

[program:pami]
user = root
command = php pami.php 127.0.0.1 5038 testuser passwd 10000 10000
directory = /var/lib/asterisk/agi-bin
numprocs = 1
autorestart = true
autostart = true
stdout_logfile = /var/log/pami/pami.log
stderr_logfile = /var/log/pami/pami_errors.log
stopwaitsecs = 60
startsecs=5
startretries=10000000

ну, прекрасно же. Примеры и статья

3.07.2019

Asterisk as Wholesale. PAMI instead of AGI. Stable AMI connection.

Во время выполнения диалплана необходимо уточнять маршруты для звонка и делать то нужно из базы Mysql. Классический вариант использовать AGI Либо FastAGI, Но здесь я рассмотрю вариант запуска в фоне скрипта который, получая информацию о звонке, будет устанавливать переменную обратно в диалплан.

Asterisk адаптированный для wholesale, кстати, достаточно быстро всё обрабатывает используя минимум модулей и запросы в базу через ODBC. на удивление. Но всё равно с Opensips И Kamailio не сравнится.

Используем: PAMI library при установке пришлось повозиться т.к. не очень знаком с composer, но почитав про него – всё получилось. библиотеки ставятся в текущую директорию agi-bin, тогда будет доступ.

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

  1. read timeout\read error – возникает на стороне скрипта, нужно обрабатывать такие события, в скрипте для этого будет try { } catch {}.
  2. Снизить поток событий из Астериска. В manager.conf Использовать eventfilter=Event: Newchannel тогда пользователю будет прилетать только определенный события.
  3. Не подключаться каждый раз при чтении и записи. В рамках библиотеки PAMI пришлось разбираться с классами в php.
  4. Астериск должен подождать в диалплане пока AMI скрипт установит переменную в канал, вот тут я не нашел ничего лучше чем просто подвесить его на 1500 циклов присвоения переменной – это ужасно я знаю.

Пример pami.php

Пример extensions.conf

Пример manager.conf

1.07.2019

Autostart python script

Замечательная статьяо том как запускать python скрипты, стандартными командами sytsemctl.

28.06.2019

Freepbx – Google Speech API – Directory recognition

Задача: При входящем звонке распознавать Имя или Фамилию сотрудника и переводить на него.

Особенностью является то, что распознавание имён удалось улучшить подключив параметры:

 model:phone,
useEnhanced: true,
phrases: [{"слово1", "Фраза из слов"}],

Используемые статьи:

  1. Приложение на базе node.js и bash скрипта которое позволяет быстро развернуть систему и провести первые тесты: https://github.com/phsultan/asterisk-eagi-google-speech-recognition
  2. процесс подключения телефона есть много разных статей но самая удобная и работающая у меня вот эта: Распознавание речи в Asterisk – Voxlink
  3. Докуметация от гугла

Проблемы: 1. установка окружения Node.js для меня в новинку была поэтому, пришлось сначала понять как устроено приложение Node.js.

отладка:

  1. asterisk -r – покажет исполнение скрипта и распознанные слова, если распознанных слов нет, то пункт 2
  2. в папке /usr/local/node_programs/node_speech/samples выполнить: “node recognize.js listen”.
  3. если выдаст “Error: Could not load the default credentials.” то выполнить команду “export GOOGLE_APPLICATION_CREDENTIALS=/usr/local/node_programs/service_account_file.json” – Она добавит данные по авторизации. и снова выполнить пункт 2.
  4. Если выдаст ошибку “invalid_grant: Invalid JWT Signature” то у вас проблемы с ключем от гугла. Решение создать ключ в JSON формате для вашего проекта через https://console.cloud.google.com

19.06.2019

PUSH NOTIFICATIONS API

От вас необходим ключ .p8 от apple, id ключа, и team id.

Посылаете к нам HTTP запрос, мы отправляем его в эппл.

Полная статистика в реальном времени запросов и ответов.

2.05.2019

custom script AGI freepbx per each call

to do any custom dialplan per call (inbound from trunk to extensions) use

macro-dialout-one-predial-hook

to do any custom macro action for outgoing from trunk use:

macro-dialout-trunk-predial-hook

Tags: ,
| Posted in Asterisk | No Comments »
1.05.2019

Черный список ip адресов для voip

sh скрипт который

!/bin/bash
BADIPSFILE="badips.list"
BADIPSFILETEMP="$BADIPSFILE".temp
ADDLISTFILE="$BADIPSFILE".load
# get new list
wget https://www.badips.com/get/list/voip/0 -O $BADIPSFILETEMP
# sort new list
sort $BADIPSFILETEMP -o $BADIPSFILETEMP
# touch to be sure that file exist
touch $BADIPSFILE
# diff old ans new file
diff $BADIPSFILE $BADIPSFILETEMP | grep -Po '\d+.\d+.\d+.\d+' > $ADDLISTFILE
# copy new file to old for next ips going fast
cp -f $BADIPSFILETEMP $BADIPSFILE
cp -f drop_temp.xml drop_temp_.xml
BLOCKED_IP=$ADDLISTFILE
IPTABLES="iptables"
if [ -f $BLOCKED_IP ]; then
while read BLOCKED; do
$IPTABLES -A INPUT_direct -i ens192 -s $BLOCKED -p udp -j DROP
done < $BLOCKED_IP
fi

10.04.2019

opensips. dispatcher. loadbalancing. wrong destination.

По установке по умолчания, если вы добавите несколько шлюзов в dispatcher то про запросе авторизации, Opensips будет пересылать новый invite на новый шлюз.

решается выставлением hash механизма ‘0’ в функции ds_select_dst который учитывает callid.