Настройка FSK в Asterisk для определения номеров

Чтобы определялся номер, с аналоговых линий, нужно в контексте для транка каждого канала Dahdi указать:

usecallerid = yes
hidecallerid=no
cidstart = ring
cidsignalling = bell
callerid = asreceived

asreceived — означает что номер нужно передавать в виде, в каком он есть.
Я использовал китайскую плату TDM410P.
Также необходимо подать заявку оператору телефонной связи чтобы они включили не старый АОН, а CallerID, то есть FSK (Bellcore).
Я написал сообщение в техническую поддержку на сайта Укртелеком, и на следующий день на стационарный телефон перезвонил местный инженер.
Мы были подключены к АТС SI 3000, спустя еще день с нескольких попыток нам все же включили FSK и номера начали определяться еще до снятия трубки, мобильные, стационарные и т.д., хотя иногда бывали случаи что номер был не определен.

Если у провайдера телефонной связи не включен FSK, то в консоли Asterisk при звонках можно увидеть ошибки:

WARNING[21790][C-00000000]: chan_dahdi.c:1842 my_get_callerid: Failed to decode CallerID
ERROR[21790][C-00000000]: callerid.c:566 callerid_feed: No start bit found in fsk data.

Записать для анализа звук с канала телефонной линии можно командой:

dahdi_monitor 1 -v -r streamrx.wav

Также можно включить(on)/отключить(off) режим отладки звонков открыв консоль Asterisk и набрав команду:

sudo asterisk -rvvvvvv
sip set debug on
sip set debug off

Сгенерированный /etc/asterisk/dahdi-channels.conf я оставил без изменений (на всякий случай приведу его содержимое):

; Span 1: WCTDM/0 "Wildcard TDM410P" (MASTER)
;;; line="1 WCTDM/0/0 FXSKS"
signalling=fxs_ks
callerid=asreceived
group=0
context=from-pstn
channel => 1
callerid=
group=
context=default

;;; line="2 WCTDM/0/1 FXSKS"
signalling=fxs_ks
callerid=asreceived
group=0
context=from-pstn
channel => 2
callerid=
group=
context=default

;;; line="3 WCTDM/0/2 FXSKS"
signalling=fxs_ks
callerid=asreceived
group=0
context=from-pstn
channel => 3
callerid=
group=
context=default

;;; line="4 WCTDM/0/3 FXSKS"
signalling=fxs_ks
callerid=asreceived
group=0
context=from-pstn
channel => 4
callerid=
group=
context=default

Увеличение громкости звонков в Asterisk

Чтобы увеличить громкость разговора при звонках, необходимо в файле /etc/asterisk/extensions.conf, в начале каждого диалплана добавить пару строк (на которых нужно увеличить громкость):

exten => X.,1,Set(VOLUME(TX)=5)
exten => X.,n,Set(VOLUME(RX)=5)

Минимальное значение 0, а максимальное 10.

Если используется Dahdi, то можно усилить громкость на плате прописав в /etc/asterisk/chan_dahdi.conf или в контексте нужного транка:

rxgain=2.0
txgain=2.0

Тут стандартное значение 0.0, а максимальное 6.0, где rx (receive) — входящая громкость, tx (transmit) — исходящая от Asterisk.

Скрипт быстрой настройки IPTables

Иногда нужно например удалить все правила IPTables и прописать только нужное, так вот для удобства можно указать их в скрипте, после чего выполнить его.

Переключимся на root пользователя, в Ubuntu это можно сделать так:

sudo -i

Сначала посмотрим существующие правила (возможно некоторые будут нужны и их можно будет скопировать в скрипт):

iptables -nvL

И собственно ниже приведу пример скрипта с набросанными правилами IPTables:

#!/bin/sh
# Пример очистки и удаления всех существующие правил и цепочек
iptables -t filter -F
iptables -t nat -F
iptables -t mangle -F
iptables -F
iptables -t filter -X
iptables -t nat -X
iptables -t mangle -X
iptables -X
# Запретим все входящие и проходящие соединения, разрешим все исходящие от сервера
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# Разрешим локальный интерфейс
iptables -A INPUT -i lo -j ACCEPT
# Не трогаем уже установленные соединения
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Откроем порты SSH, HTTP для всех если нужно
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# При необходимости можно разрешить все входящие соединения конкретному IP-адресу
iptables -A INPUT -s 192.168.10.101 -j ACCEPT
# Пример разрешения PING
iptables -A INPUT -p icmp -j ACCEPT
iptables -A OUTPUT -p icmp -j ACCEPT
# и т.д.

Сделаем файл скрипт исполняемым:

chmod  rules.sh

Выполним его:

./rules.sh

Для удобного сохранения правил в Ubuntu, чтобы они не сбросились после перезапуска системы, можно установить iptables-persistent:

apt-get install iptables-persistent

После чего сохранять правила командой:

service iptables-persistent save

Можно такте сохранить текущие активные правила командами:

iptables-save >/etc/firewall.conf
ip6tables-save >/etc/firewall6.conf

Создать файл например через редактор nano (Ctrl+X для выхода из редактор, y/n и Enter для сохранения или отмены изменений):

nano -w /etc/network/if-up.d/00-iptables

Добавить в него содержимое:

#!/bin/sh
iptables-restore < /etc/firewall.conf
ip6tables-restore < /etc/firewall6.conf

И сделать файл выполняемым:

chmod 744 /etc/network/if-up.d/00-iptables

Смотрите также:
Настройка IPTables

Маршрутизация звонков по времени в Asterisk

Приведу пример маршрутизации звонков по времени в Asterisk.
Допустим в файле /etc/asterisk/extensions.conf есть настроенный контекст для транка со следующими параметрами:

[Trunk_2]
exten => s,1,DIAL(SIP/6004&SIP/6003,19)
exten => s,2,Hangup()

И чтобы разрулить звонки по времени на разные телефоны укажем для контекста этого транка только вложенные контексты:

[Trunk_2]
include => daytime,8:00-18:00,mon-sat,*,*
include => nighttime,18:00-8:00,mon-sun,*,*
include => sunday,8:00-22:00,sun,*,*

По сути daytime, nighttime, sunday это только названия контекстов, для которых прописано время в контексте [Trunk_2], их можно называть как угодно.

И потом в этих отдельных контекстах уже пропишем нужные екстеншены.
То есть, днем:

[daytime]
exten => s,1,DIAL(SIP/6004&SIP/6003,19)
exten => s,2,Hangup()

Ночью:

[nighttime]
exten => s,1,DIAL(SIP/6002,19)
exten => s,2,Hangup()

И в воскресенье:

[sunday]
exten => s,1,DIAL(SIP/6002,19)
exten => s,2,Hangup()

Можно также например создать контекст holiday с праздничными днями:

include => holiday,*,*,1,jan
include => holiday,*,*,8,mar

и т.д.

Для тех кто хочет расписать подробнее по дням, приведу список дней на английском:
mon — Monday — Понедельник
tue — Tuesday — Вторник
wed — Wednesday — Среда
thu — Thursday — Четверг
fri — Friday — Пятница
sat — Saturday — Суббота
sun — Sunday — Воскресенье

Аналогично сокращаются до трех букв и названия месяцев.

Создание RAID при установке Ubuntu

На тесте при установке Ubuntu Server 14.04 LTS создам программный RAID1.
Замечу что, при создании RAID будет автоматически использоваться mdadm.
Подключу к серверу два одинаковых диска (аналогично можно попробовать создать RAID на виртуальной машине например созданной в VirtualBox).

И так, начинаем установку Ubuntu Server, доходим до этапа разметки дисков в котором выберем метод разметки «вручную«.
Выберем первый диск и согласимся «Создать новую пустую таблицу разделов на этом устройстве«, потом аналогично сделаем со вторым.

Вверху появится «Настройка программного RAID«, выберем, согласимся записать изменения на диске которые делали выше.

Выберем «Создать MD устройство»
Далее тип устройства программного RAID, в моем случае RAID1.

Укажем что Активных 2, и резервных 0.
Выберем активные, согласимся сохранить изменения, и жмем «Закончить»

Далее выберем «Автоматическая разметка» и «Авто — Использовать весь диск«, диск для разметки выберем RAID.
Далее выберем «Закончить разметку и записать изменения на диск«, в следующем окне соглашаемся записать изменения.

Все, процесс установки системы продолжится как обычно, но уже на RAID.
В конце установки загрузчик установится на оба диска.

Рекомендую посмотреть статью — mdadm — утилита управления программными RAID массивами.

mdadm — утилита управления программными RAID массивами

Рекомендую прочитать мою статью Описание типов RAID.

Установить mdadm в Ubuntu можно командой:

sudo aptitude install mdadm

В CentOS:

yum install mdadm

На тесте соберу RAID в Ubuntu 14.04, сразу переключусь на root пользователя (далее команды пойдут аналогичны для других операционных систем):

sudo -i

В начале посмотрим список дисков командами (у меня их два несмонтированых одинакового размера /dev/sdb и /dev/sdc):

fdisk -l
df -h
lsblk -o NAME,SIZE,FSTYPE,TYPE,MOUNTPOINT

Создадим RAID 1:

mdadm --create --verbose /dev/md0 --level=1 --raid-devices=2 /dev/sdb /dev/sdc

Проверить статус массива и его компонентов можно командами:

cat /proc/mdstat
mdadm --detail /dev/md0
mdadm -E /dev/sdb
mdadm -E /dev/sdc

Создадим файловую систему:

mkfs.ext4 -F /dev/md0

Чтобы примонтировать созданный RAID к текущей системе, создадим директорию и выполним монтирование в нее:

mkdir -p /mnt/md0
mount /dev/md0 /mnt/md0

Посмотрим детали RAID:

mdadm --verbose --detail --scan

Сохраним изменения:

mdadm --detail --scan | sudo tee -a /etc/mdadm/mdadm.conf
update-initramfs -u
echo '/dev/md0 /mnt/md0 ext4 defaults,nofail,discard 0 0' | tee -a /etc/fstab

Все, после перезагрузки системы, RAID будет автоматически смонтирован.

Чтобы получать уведомления на электронную почту о состоянии RAID, в файле конфигурации mdadm.conf укажем на какой адрес слать и с какого (чтобы почта отправлялась в системе должен быть установлен например postfix):

MAILADDR email@example.com
MAILFROM mdadm@example.com

Перезапустим сервис мониторинга:

service mdadm restart

Можно настроить некоторые параметры ответив на вопросы командой:

dpkg-reconfigure mdadm

Решение ошибки при компиляции Asterisk «‘pjsip_tcp_transport_cfg’ has no member named ‘sockopt_params’»

Компилировал однажды Asterisk версии 13.13.1 и при выполнении make заметил следующую ошибку:

‘pjsip_tcp_transport_cfg’ has no member named ‘sockopt_params’

pjproject-2.2.1 уже был скомпилирован.

Решил проблему собрав поновее версию pjproject-2.4.5

cd /usr/src
wget http://www.pjsip.org/release/2.4.5/pjproject-2.4.5.tar.bz2
tar -xjvf pjproject-2.4.5.tar.bz2
cd pjproject-2.4.5
CFLAGS='-DPJ_HAS_IPV6=1' ./configure --prefix=/usr --enable-shared --disable-sound --disable-resample --disable-video --disable-opencore-amr
make dep
make
make install

После этого, ошибка исчезла.