пятница, 7 ноября 2014 г.

Изменение пароля GUI-пользователя в Elastix 2 и Elastix 3

Пароль меняется в базе SQlite консольной командой

/usr/bin/sqlite3 /var/www/db/acl.db "UPDATE acl_user SET md5_password = '`echo -n newpass|md5sum|cut -d ' ' -f 1`' WHERE name = 'admin'"

где newpass - новый пароль, а name - имя пользователя.


UPD:
Недавно вышел релиз Elastix 3.0, на нем вышеописанная инструкция не работает. Сменить пароль можно командой

/usr/bin/elastix-admin-passwords --change

Ну и не забываем что теперь пользователь у нас superadmin и у пароля есть большие ограничения по сложности (не менее 10 разнокалиберных символов и цифр).

вторник, 28 октября 2014 г.

Бэкап и восстановление Freebsd


Хочу рассказать, как относительно быстро восстановить работоспособность умершего freebsd сервера, либо перенести полностью сервер с одной машины на другую. Для этого нам понадобится программа для архивации fsbackup и live-cd с freebsd. Сразу предупреждаю, что это не how to, нужен некоторый уровень знания и понимания freebsd.

Первым делом сделаем сам архив. Для архивирования любых данных я использую простую и удобную программу fsbackup. Подробнее о ней можно узнать тут. В конфиге комментарии на русском языке, так что с настройкой проблем быть не должно. Архив можно хранить локально, на удаленном ftp, либо заливать через ssh на другой сервер. Поддерживается шифрование, создание инкрементных бэкапов. Программа живет в портах /usr/ports/sysutils/fsbackup Для бэкапа системы я использую следующий конфиг:

$cfg_backup_name = «srv12_domain_local»;
$cfg_cache_dir = "/usr/local/fsbackup/cache";
$prog_md5sum = «md5sum -b»;
$prog_tar = "/usr/bin/tar";
$prog_ssh = "/usr/bin/ssh";
$prog_rm = "/bin/rm";
$prog_gzip = "/usr/bin/gzip";
$prog_pgp = «gpg»;
$cfg_checksum = «timesize»;
$cfg_backup_style = «backup»;
$cfg_increment_level = 7;
$cfg_save_old_backup = 1;
$cfg_type = «remote_ftp»;
$cfg_remote_ftp_mode = 0;
$cfg_remote_password = «password»;
$cfg_local_path = "/mnt/backup/srv12/system";
$cfg_time_limit = 0;
$cfg_size_limit = 0;
$cfg_maximum_archive_size = 0;
$cfg_root_path = "/";
$cfg_verbose = 2;
$cfg_stopdir_prune=0;

1;

__DATA__

#Архивируем весь сервер с корня
/
#Указываем папки исключения, которые бэкапить не нужно
!/dev
!/mail
!/mnt
!/usr/ports
!/var/db/portsnap
!/usr/local/fsbackup/cache
!/web/squidcache
!/web/mysql
!/usr/src
!/usr/local/www/data-dist/netams


Я архивирую весь сервер, за исключением некоторых папок, которые указаны отдельно.

Архив мы получили, теперь нужно подготовить сервер, на который будет осуществляться перенос. Для этого на исходном сервере необходимо открыть /etc/fstab

/dev/ar0s1b none swap sw 0 0
/dev/ar0s1a / ufs rw 1 1
/dev/ar0s1f /mail ufs rw 2 2
/dev/ar0s1d /tmp ufs rw 2 2
/dev/ar0s1e /usr ufs rw 2 2
/dev/ar0s1g /var ufs rw 2 2
/dev/ar0s1h /web ufs rw,suiddir,noatime 2 2
/dev/acd0 /cdrom cd9660 ro,noauto 0 0


запомнить существующие разделы и затем создать такие же разделы на другом сервере. Размер разделов может не совпадать, достаточно просто наличие таких же разделов. Я разбиваю диск с помощью установочного диска freebsd и custom install на нем: разбиваю непосредственно диск и ставлю загрузчик freebsd. После того, как создали разделы, копируем наш бэкап куда-нибудь, чтобы потом можно было его забрать на второй сервер, загрузившись с live-cd. Можно скопировать на ftp, можно на флешку, можно просто в виндовую шару положить и потом ее подмонтировать. Вместе с архивом нужно скопировать скрипт fsrestore.sh, который лежит в /usr/local/fsbackup/scripts. Этот скрипт будет выполнять непосредственно восстановление системы.

Теперь берем live-cd, я использую Frenzy, и грузимся с него. В принципе, пользоваться можно чем угодно, любым live-cd с freebsd, но мне нравится именно Frenzy. После загрузки имеем полноценную систему, которая автоматически подмонтировала созданные нами ранее разделы. Подмонтированы они в режиме чтения, так что сначала отмонтируем их.

umount /dev/ad4s1a

и так далее со всеми разделами.

Затем в папке /mnt создадим папки с именами разделов нашей системы, которую мы переносим. В моем случае это папки /mnt/tmp, /mnt/usr, /mnt/var, /mnt/web, /mnt/mail.

Далее монтируем разделы в только что созданные папки, при этом раздел / монтируем в /mnt

mount /dev/ad4s1a /mnt
mount /dev/ad4s1f /mnt/mail
mount /dev/ad4s1d /mnt/tmp
mount /dev/ad4s1e /mnt/usr
mount /dev/ad4s1g /mnt/var
mount /dev/ad4s1h /mnt/web


Теперь нужно подмонтировать флешку с архивом:

mount_ntfs /dev/da0s1 /mnt/backup

Не забываем заменить /dev/da0s1 на то устройство, каким является флешка у вас.

Можно вместо флешки подмонтировать виндовую шару. Перед монтированием шары стоит не забыть настроить сеть либо через sysinstall, либо сразу c помощью ifconfig:

ifconfig eth0 192.168.0.15 netmask 255.255.255.0
ifconfig eth0 up


Монтируем шару:

mount_smbfs -I 192.168.0.2 -E koi8-r:cp866 //user@comp/shara /mnt/backup

user – имя пользователя шары, comp – имя компьютера в сети shara – имя шары

Итак, у нас есть бэкап, есть подмонтированные разделы будущей системы. Теперь можно начать восстановление. Для этого редактируем скрипт fsrestore.sh. В нем нужно изменить только две строчки:

# Директория где находится бэкап.
backup_path="/mnt/backup"
# Корневая директория куда будут помещены данные восстановленные из бэкапа.
restore_path="/mnt"


После этого запускаем скрипт и ждем завершения. Лучше бэкап скопировать куда-нибудь локально, и затем запускать восстановление. Так будет быстрее и надежнее. После завершения восстановления, проверяем файлы. В данный момент в папке /mnt должна находиться копия нашего сервера.

Сейчас нужно внести некоторые изменения в конфигурацию. Первым делом обязательно нужно отредактировать файл /mnt/etc/fstab так как имена дисков в разных серверах могут быть разными. На исходном сервере у меня было зеркало ar0, перенес же я на одиночный хард ad4. Соответственно, меняем в fstab ar0 на ad4. Тут же можно поменять сетевые и прочие настройки в rc.conf но это уже не критично. Все остальное можно будет изменить загрузившись в системе. Если же не отредактировать fstab, то, скорее всего, мы не загрузимся.

После восстановления перезагружаем компьютер, вытаскиваем live-cd, логинимся в систему. Осталось выполнить последнее действие. Вместе с непосредственно архивом fsbackup создает файлик с правами доступа и владельцами на все файлы и папки в архиве. Файл этот имеет расширение .dir Во время восстановления скрипт не отработал и не расставил нужные права, так как путь восстановления был не в / а в /mnt, поэтому пути в файле не совпадали с путем восстановления. Так что теперь нам нужно вручную исполнить этот файл, чтобы полностью восстановить все права и владельцев. Для этого ставим ему права на исполнение и запускаем. После его исполнения мы имеем точную копию системы.

За статью спасибо хаброюзеру

UPD:
При бэкапировании баз данных MySQL 5.5 происходит ошибка, связано это с опцией --all в скрипте mysql_backup.sh (она вроде как не используется в этой версии MySQL). Всё что нужно сделать - удалить в скрипте все эти опции. После чего бэкапирование баз данных производится без каких либо проблем.

четверг, 23 октября 2014 г.

Настройка Grandstream HT503 для FreePBX (Asterisk, Trixbox, Elastix)

Нужен был шлюз с 1 FXO портом, ещё один FXS в этом случае приятно дополнение, ну и lifeline конечно пригодится при отключении электричества. D-link покупать не хотелось, а linksys в продаже отсутствует, поэтому выбор пал на Grandstream, заранее скажу не понравилось, даже нелюбимый мной дэлинк ведёт себя и то более предсказуемо.

Я убил целый день из-за него на настройку, на прошивках 11.3 и 12.1 невозможно совершить исходящий звонок через FXO порт - астериск показывает что всё в порядке, а звонок не проходит - тишина в трубке. Вот невозможно и всё тут, поэтому если вам нужен FXO для звонков то вам нужна прошивка 10.9. Если у кого-то возникнут сложности с прошивкой пишите в комментариях, дополню статью.

Скачать прошивку 1.0.10.9 для HT503 можно здесь или с официального сайта.



Это было отступление, неприятное, но необходимое. Пока посмотрю как будет себя вести эта штука в бою, позже дополню статью.

Статья состоит из нескольких частей, это сетевые настройки, настройки FXS порта (внутренний) и настройки FXO порта (городской).

Сетевые настройки.

Внимание! Данный класс устройств не предназначен для того что бы их выставляли в интернет! Заранее позаботтесь о том что бы доступ к этому устройству имел только ограниченный круг лиц, в идеальном случае никто кроме администраторов и самого астериска доступа к устройству иметь не должен, в противном случае вы рискуете тем что злоумышленник сможет звонить через ваш HandyTone за ваши деньги.
Итак, если вы подключаетесь к порту LAN устройства то там по умолчанию включен DHCP сервер, а IP адрес устройства - 192.168.2.1. Собственно так и надо доступ получать к вебке, потому что WAN порт по дефолту закрыт от всего, и настроен на получение IP по DHCP.

Значит заходим по адресу http://192.168.2.1 пароль админа по умолчанию - admin. Первым делом когда входим, в целях безопасности меняем пароль User и настроить статический IP адрес. Всё это делается в разделе Basic Settings. Разделение на user и admin в ht503 происходит исключительно по паролю, поэтому ставьте для user и admin разные пароли!

ht503 network settings
Не забываем нажимать кнопку Apply для сохранения настроек. Далее идём в Advanced Settings и меняем пароль админа.
ht503 admin pass
Далее, если мы уверены что у нас в сети никто не станет ломать эту железку, можно открыть доступ к настройкам и icmp пакетам (читай пингу) с Wan порта, делается это в Basic Settings
ht503 wan side access

Настройки FXS порта.

Эта самая пожалуй простая часть, для начала создаём пользователя в интерфейсе FreePBX, делаем аналогично SPA 8000 только DTMF режим ставим rfc2833. Переходим в раздел FXS порт, заполняем адрес сервера (Primary SIP Server), имя пользователя (SIP User ID) и пароль (Authenticate Password аналогично экстеншену в астере).
sip fxs settings ht503 freepbx
Спускаем ниже, настраиваем Dial Plan что бы набор номера происходил без задержек, хотя будет работать и без этого.
ht503 dialplan fxs


Пояснения о том как работает диалплан есть в инструкции:

Разрешённые символы: 1,2,3,4,5,6,7,8,9,0 , *, #, A,a,B,b,C,c,D,d

x - любая цифра от 0 до 9;
хх+ - как минимум любые две цифры;
^ - запрет набора номера;
[3-5] - цифры от 3 до 5;
[147] - цифры 1, 4 или 7;
<2=011> - заменить 2 на 011;
< =1> - добавить цифру 1 перед номером;
| - разделитель между правилами.

Примеры из инструкции:

{[369]11 | 1617xxxxxxx} - позволяет набрать 311, 611, 911 и любые 10 цифр начинающиеся с 1617;
{^1900x+ | <=1617>xxxxxxx} - блокирует набор любого номера начинающего с 1900 и добавляет префикс 1617 перед любыми 7 набранными цифрами;

и диал план который использую я - {*xx|1xx|7xx|2xxxxxx|9xxxxxx|8xxxxxxxxxx|0[1-4]}
можно набрать номера от *01 до *99 - для функций астериска
от 100 до 199, от 700 до 799 - внутренняя нумерация
от 2000000 до 2999999 и от 900000 до 999999 - городская нумерация
любые 11 цифр начинающиеся с 8ки - межгород и мобильники
01,02,03,04 - номера экстренных служб.

Все махинации с правилами набора номера, такие как добавление префикса или наоборот замену каких-то цифр я рекомендую делать в астериске.

Переходим к настройкам линии, в параметре Slic Setting по умолчанию стоит USA, но в этом режиме трубка какие-то странные звуки издаёт, поэтом я выбрал Belgium.

На этом же скрине видно параметр Gain - регулировка громкости, меня устроили первоначальные параметры.
fxs settings ht503

На этом настройка FXS порта закончена. Жмём Apply, ждём пока перезагрузится шлюз и проверяем, всё должно работать.

Настройки FXO порта

Хотелось бы передать привет разработчикам ПО на это устройство, настройки FXO порта настолько не очевидны, насколько это вообще возможно, нюансов я считаю много.

Сначала будем настраивать входящий звонок. DID на HT503 прописывается в разделе Basic Settings - параметрUnconditional Call Forward to VOIP (здравствуй логика).
did ht503 freepbx


Здесь читаем где прописать DID на FreePBX. Не забываем Apply нажимать.

Следующим шагом надо будет создать транк в интерфейсе FreePBX. Выбираем раздел Trunks (Транки). Добавляем транк Add Trunk.

Trunk Name - имя транка, то как вы его хотите видеть, не на что в общем-то особо не влияет .
Outbound CallerID - номер телефона который вы будете видеть в отчёте при исходящих звонках.
Dialed Number Manipulation Rules - сопоставление набранных номеров с шаблоном, можно не заполнять, но если заполнили номер который астериск пустит в транк не совпадающий с шаблоном набран не будет. prefix это то что откидывается из переданного номера в транк, prepend - то что добавляется перед номером. т.е. если в транк астериск например передаёт 79181234567, а вам надо что бы шлюз набрал 891812345678 правило должно быть (8)+7|918XXXXXXX. Впринципе такое можно делать в разделе исходящая маршрутизация у астериска. Опять таки статейка есть по этому вопросу, где я постарался максимально этот момент описать.
Trunk Name - не проверял, на HT503 но на некоторых шлюзах если указать имя транка отличное от имя пользователя могут не проходить входящие, поэтому рекомендую транк называть так же как имя пользователя.
PEER Details - самая интересная часть, здесь прописываются основные настройки.

username=gs-ht-503 ;Имя пользователя для порта, то что мы указывали в SIP User ID на шлюзе
type=friend ;Позволяет и принимать и отправлять вызовы
secret=Sw0rdfish ;Пароль
qualify=yes ;Разрешает серверу определять доступность VoIP шлюза
port=5062 ;SIP порт VoIP шлюза, параметр который указан шлюзе
nat=never ;Мы же не используем nat?
host=dynamic ;Для работы VoIP шлюз должен зарегистрироваться
dtmfmode=rfc2833 ;Режим который рекомендуется использовать.
context=from-pstn ;Контекст указывает обработчик входящих вызовов
canreinvite=no ;Запрещает передачу медиатрафика минуя астериск

Картинка для проверки.
freepbx trunk ht503
Теперь аналогично созданному транку заполняем Primary SIP Server, SIP User ID, Authenticate Password.
sip fxo settings ht503 freepbx
для того что бы протестировать приём входящих звонков осталось ещё пару настроек:

AC Termination Model выбираем Impedance-based.
Impedance-based оставляем 600ом,
Number of Rings если у нас на номере включён Caller ID то ставим 2 что бы шлюз мог определить номер, если нет ставим 1 что бы трубку шлюз поднимал быстрее.
PSTN Ring Thru FXS: ставим No, в противном случае звонок из города сначала будет приходить на FXS порт, а уже через таймаут уходить на астер, но нам этого не надо.
ht503 AC Termination Model

Жмём Apply - звоним проверяем.

Следующим шагом будем заполнять Disconnect Tone подсказка что к чему есть прямо в вебинтерфейсе. Чтобы правильно заполнить шаблон нам надо будет записать короткие гудки и проанализировать. Для анализа я использую бесплатный аудиоредактор Audacity.
Открываем записанный файл, выделяем нужный нам отрезок короткого гудка и выбираем Анализ - Построить график спектра

Наводим курсор на пик и видим что у нас написано Пик: 426 гц, -26,6дб. В данном случае сигнал одночастотный (а бывают и двухчастотные, для них будет два пика).

Дальше смотрим длительность между гудками и длительность самих гудков.

в моём случае это 256мс, округлим до 250. Итак исходные данные мы собрали, теперь пишем шаблон:

Формула выглядит так:

f1=X@-Y,f2=Z@-Y,c=A/B;

где:
X - частота (у меня 426 Герца)
Z - частота второго пика, если сигнал одночастотный ставим тоже что и в X.
Y - громкость в dB, на графике 26, но можно оставить дефолтные 32
A - период сигнала гудка (0.250 с)
B - период тишины (0.250 с)

получаем - f1=426@-26,f2=426@-26,c=250/250;

Настраиваем раздел FXO Termination.
Enable Current Disconnect - No;
Enable PSTN Disconnect Tone Detection - Yes;
PSTN Disconnect Tone - f1=426@-26,f2=426@-26,c=250/250.

Настраиваем исходящие звонки. Для этого нам нужно будет в частности диалплан настроить, принцип работы такой же как в FXS повторяться не буду. У меня выглядит так:
ht503 fxo dial plan

Дальше идут два немного выбивающихся из общепринятых настроек параметра, по крайней мере на других шлюзах я с этим не сталкивался.

Во-первых: необходимо выставить Wait for Dial-Tone - No иначе звонок никуда не пойдёт.

Во-вторых: этот шлюз умеет звонить в город в два этапа и в один, в случае если мы используем правила набора номера FreePBX то нам нужен один этап, а это значит что Stage Method (1/2) надо указать 1, по умолчанию стоит 2. Если выбрать 2 то при попытке позвонить в город через HT503 Астериску будет приходить Forbidden, а в логе шлюза будет ошибка - ATACtrl::processFxoOutgoingCallInitiated, Invalid User Id
Dispatching event: 17 (CALL_FAILED) on port 1:0
Тоже времени порядочно пришлось потратить что бы эту фичу понять (и снова привет разработчикам).

Проверочная картинка:
Жмём Apply - пробуем звонить. Спасибо за внимание.

За статью спасибо Trustore

понедельник, 13 октября 2014 г.

Elastix и 3G-модем



Когда стоит задача поднять asterisk и мы знаем о том что будут использоваться USB-3G-модемы для голоса, это не проблема, достаточно поставить его на дистрибютиве с новым ядром и потом можно прикрутить панель типа FreePBX или asterisk-gui. Но что делать когда уже стоит готовая сборка Elastix, с кучей настроек и в продакшене, а прикрутить chan_datacard просто необходимо. В этой статье я опишу всю процедуру от начала и до конца для Elastix 2.3.

Первая проблема это старое ядро 2.6.18 в Elastix, а chan_datacard обещает работать нормально с ядром не меньше 2.6.33. Можно конечно взять исходники необходимого ядра и скомпилировать его, но учитывая то, что Elastix был установлен на дохленький Atom и предвидя 2-3 часа компиляции, я отказался от этого варианта (мы ведь помним, АТС в продакшене, и простой должен быть минимальным) и пошел другим путем, установив новое ядро из добавленного репозитария.

Добавляем репозитарий ELRepo:
# rpm --import http://elrepo.org/RPM-GPG-KEY-elrepo.org
# rpm -Uvh http://elrepo.org/elrepo-release-5-4.el5.elrepo.noarch.rpm


проверяем в /etc/yum.repos.d/elrepo.repo в разделе [elrepo-kernel] — enabled=1

Актуальное ядро в этом репозитории на момен написания этой статьи 3.0.88, нам вполне подходит.

Устанавливаем необходимые пакеты и новое ядро:
# yum install gcc glibc-devel glibc-headers subversion
# yum install --skip-broken kernel-lt kernel-lt-devel kernel-lt-headers


Я добавил —skip-broken потому что ругалось на kernel-lt-headers.

меняем в /boot/grub/menu.lst:
default=1
на
default=0

видим что у нас появилось там новое ядро:
title CentOS (3.0.88-1.el5.elrepo)
root (hd0,0)
kernel /vmlinuz-3.0.88-1.el5.elrepo ro root=LABEL=/
initrd /initrd-3.0.88-1.el5.elrepo.img


обновляем grub — подставляем свой диск вместо /dev/sda:
# grub-install /dev/sda

Ядро установили, но перезагружаться рано, надо скачать все необходимое и подготовить, что бы после перезагрузки сразу начать компиляцию необходимых модулей, так как после загрузки в новое ядро не будет работать dahdi (если Вы не используете этот модуль можно смело перезагружаться и продолжать).

необходимо скачать dahdi отсюда — на момент написания актуальная версия 2.7:
# cd /usr/src
# wget http://downloads.asterisk.org/pub/telephony/dahdi-linux-complete/dahdi-linux-complete-current.tar.gz
# tar -xzvf dahdi-linux-complete-current.tar.gz
# ln -s dahdi-linux-complete-2.7.0+2.7.0 dahdi


так же нам понадобиться поддержка oslec для DAHDI(модуль эхо-подавления), скачиваем:
# svn co http://svn.astfin.org/software/oslec/trunk/ oslec

далее переходим к подготовке DAHDI:
# mkdir -p /usr/src/dahdi/linux/drivers/staging/echo
# cp -fR /usr/src/oslec/kernel-test/* /usr/src/dahdi/linux/drivers/staging/echo/
# cp -fR /usr/src/kernels/3.0.88-1.el5.elrepo-x86_64/drivers/staging/echo/* /usr/src/dahdi/linux/drivers/staging/echo/


Скачиваем исходники chan_datacard
# svn co http://www.makhutov.org/svn/chan_datacard/trunk/ /usr/src/chan_datacard

Собственно, мы все подготовили, можем перезагружаться в новое ядро.
сразу после перезагрузки надо скомпилировать DAHDI:
# cd /usr/src/dahdi
# make
# make install
# make config

# /etc/init.d/asterisk stop
# /etc/init.d/dahdi restart
# /etc/init.d/asterisk start


все должно пройти без проблем, смотрим:
# asterisk -vvvvr
CLI> dahdi show channels


получаем примерно такое:


На данный момент мы поставили новое ядро и драйвера DAHDI, то есть вернули систему в рабочее состояние но с новым ядром. Теперь необходимо установить chan_datacard:
# cd /usr/src/chan_datacard
# ./configure
# make
# make install
# cp etc/datacard.conf /etc/asterisk/


на 64-битной системе установка не произошла, потому как была попытка произвести установку в /usr/lib/asterisk/modules , а такого пути нет, копируем модуль ручками:
# cp chan_datacard.so /usr/lib64/asterisk/modules/

Я использовал модем huawei E1750 не привязанный к оператору, девственный как слеза Стоит упомянуть, что перед использование модем необходимо переключить в режим «только модем», отправив ему команду AT^U2DIAG=0, через minicom например.

Переходим к настройке chan_datacard:
в файле /etc/asterisk/datacard.conf комментируем или удаляем все после строки:
;-----------------------------------------------------------------------------------
и вставляем:
[datacard1]
context=from-gsm ; context для входящих звонков
audio=/dev/ttyUSB1 ; tty порт для аудио подключения
data=/dev/ttyUSB2 ; tty порт для управляющих AT комманд модема
group=4 ; Группа вызова
rxgain=6 ; Изменение громкости динамика
txgain=6 ; Изменение громкости микрофона
resetdatacard=yes ; Перезагрузка модема при перезапуске модуля
autodeletesms=yes ; Удаление смс с симкарты при перезапуске
usecallingpres=yes ; use the caller ID presentation or not
callingpres=allowed_passed_screen ; set caller ID presentation


сохраняем и закрываем файл.
переходим к редактированию файла /etc/asterisk/extensions_custom.conf , добавляем в конец файла:
[from-gsm]
exten => s,1,goto(from-trunk,${IMEI},1)
exten => sms,1,Verbose(Incoming SMS from ${CALLERID(num)} ${SMS})
exten => sms,n,System(echo '${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)} -%- ${DATACARD} -%- ${CALLERID(num)} -%- ${SMS} -%-' >> /var/log/asterisk/sms.txt)
exten => sms,n,Hangup()
exten => ussd,1,Verbose(Incoming USSD: ${USSD})
exten => ussd,n,System(echo '${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)} -%- ${DATACARD} -%- USSD -%- ${USSD} -%-' >> /var/log/asterisk/ussd.txt)
exten => ussd,n,Hangup()




Этот context будет принимать звонки и подставлять IMEI модема вместо DID, так что мы запросто сможем создавать правила входящих звонков прямо в панели управления Elastix. Так же будут приниматься смс и ussd и складываться в файлы /var/log/asterisk/sms.txt и /var/log/asterisk/ussd.txt соответственно. Позже мы будем обрабатывать данные файлы и посылать письма с пришедшими sms и ussd.

Осталось перезапустить asterisk:
# /etc/init.d/asterisk restart
заходим в консоль asterisk-а и проверяем:
# asterisk -vvvr
CLI> datacard show device datacard1



получим примерно следующее, не торопитесь, карта должна успеть инициализироваться 1-2 минуты:


Осталось прикрутить исходящие звонки, для этого заходим в панель Elastix-а , добавляем Custom Trunk:


И добавляем в Outbound Routes новое правило для звонков:


Теперь при выходе через 8, мы будем звонить через наш 3G-модем.

для настройки входящих звонков, делаем правило, используя в качестве DID IMEI-номер модема, и принимаем звонки по своему желанию, на номер, группу или очередь.

Следующим этапом будет настройка отправки пришедших смс и ussd на почту. Здесь я воспользовался скриптом отсюда, чуть изменив.

Создаем файл /var/www/html/sms.php следующего содержания — не забудьте изменить адрес отправки:
<?php
// путь до файла с смс
$file_name = '/var/log/asterisk/sms.txt';
// если размер файла больше 0 переходим к его обрботке
if (filesize($file_name)>0) {
// открываем файл для чтения и записи
$fobj = fopen($file_name,"r+");
$text = fread($fobj, filesize($file_name));
// в файл смс записываются в следуюшем формате
// дата и время -%- datacard -%- номер отправителя -%- текст смс
// формат и разделитель можно сменить в конфиг файле
// преобразовываем содержимое в массив используя -%- как разделитель
$text1 = explode("-%-", $text);
// делим массив а части по 4 элемента
$array = array_chunk($text1, 4);
// рисуем таблицу в которой будут выводится наши смс
$mes1 = "<table border='1' bordercolor='#000000' cellspacing='0' cellpadding='2'>";
$mes2 = "<tr align='center' valign='middle
'><td width='160'>Дата и время сообщения</td><td width='140'>Номер отправителя</td><td width='230'>Сообщение</td></tr>";
for ($i = 0; $i <= count($array)-2; $i++)
{
$sms = $array[$i];
$sms1[] = "<tr valign='middle
'><td align='center'>".$sms[0]."</td><td align='center'>".$sms[2]."</td><td align='left'>".$sms[3]."</td></tr>";
}
for ($mes3 = '', $j = 0; $j <= count($sms1); $j++)
{
$mes3 = $mes3.$sms1[$j];
}
$mes4 = "</table>";
// Теперь перейдем к отправке
// отправлять будем используя встроенную функцию mail()
// получаем текущую дату
$date = date("d.m.Y");
// получаем текущее время
$time = date("H:i:s");
// адрес куда будем отправлять письмо
$to = "your@email.com";
// тема письма
$subject = "New SMS Message(s) - ".$date." - ".$time;
// текст письма
$message = $mes1.$mes2.$mes3.$mes4;
// дополнительные заголовки письма
// кодировка письма
$headers = "Content-type: text/html; charset=utf-8 \r\n";
// отправитель письма
$headers .= "From: SMS Gate <sms@your-domain.org>\r\n";
// отправляем письмо, если отправка прошла успешно
// выводим сообщение иочищаем файл с смс
if (mail($to, $subject, $message, $headers)) {
echo "Soobshenie ojidaet otpravki";
ftruncate ($fobj, 0);
} else {
// если ошибка выводим это сообщение
echo "Oshibka pri otpravke";
}
// закрываем файл
fclose($file_name);
}
// если файл пустой выводим это сообщение
else { echo "Sms soobshenii net..."; }
?>

ставим задание в cron, каждые 5 минут делать проверку:
*/5 * * * * /usr/bin/wget --no-check-certificate -O /dev/null -q https://192.168.10.190/sms.php



Посылаем sms на вставленный в модем номер и ждем пока нам придем сообщение на почту. Всё должно пройти успешно.
Аналогичный файл создаем для ussd, меняя тему письма, например. Теперь Вы можете полноценно использовать свой номер в модеме, звонить и принимать звонки, принимать смс. Отправлять смс можно командой в панели Elastix-а или в asterisk-cli, либо написать свой фротн-энд для этого, но текст должен содержать только латиницу. Входящие же sms могут быть и на кириллице.
Отправить sms или ussd можно следующим образом, из asterisk-cli или панели Elastix-а (PBX->Tools->Asterisk-Cli)

После пары дней тестов, я заметил, что один раз модем завис, посему наваял простенький скрипт для проверки регистрации модема и сброса его в случае её отсутствия, создаем файл /root/bin/test-restart-dc со следующим содержимым:
#!/bin/bash

dclogfile=/root/bin/dc.log
dcdate=`/bin/date "+%Y-%m-%d %H:%M:%S"`
dcstatus=`/usr/sbin/asterisk -rx "datacard show device datacard1"|grep "GSM Registration Status"|grep "Registered"`
RES1=$?

if [ $RES1 -ne 0 ];then
 /usr/sbin/asterisk -rx "datacard reset datacard1"
 echo "Reset "$dcdate >>$dclogfile
 echo $dcdate" -%- datacard1 -%- RESET -%- Datacard Resetted -%-" >> /var/log/asterisk/ussd.txt
 exit 1
else
        echo "OK "$dcdate >>$dclogfile
        exit 0
fi


выставляем ему права на выполнение chmod a+x /root/bin/test-restart-dc ,и ставим в крон, проверку каждый час:
3 * * * */root/bin/test-restart-dc

В случае, если скрип отработает reset карты, Вам придет письмо на почту, для этого просто добавляется строка в файл /var/log/asterisk/ussd.txt , который мы обрабатываем выше. Так же результаты проверки пишутся в лог — /root/bin/dc.log , с указанием даты и времени.

Вот и всё!

Удачи в настройках.
© shadow_alone




UPD: Я так и не смог собрать chan_datacard на Elastix 2.4 с обновленным ядром 3.2.63, пришлось искать другой метод. Помогла решить проблему статья ниже:

Написать сие чтиво меня побудило собственные мытарства по обтачиванию напильником АТС на основе Asteriska для собственных нужд предприятия . На сегодня проблема стоит уже не протягиванию дополнительных пар в соседние кабинеты для телефонов , а более глобально - например оперативная телефонная связь с отделом в другом городе .

Для связи с внешним миром и удешевления исходящих вызовов будем использовать GSM модемы типа Huawei 1550 и Huawei 153 . Хочется сказать , что заработали обе модели модемов , хотя информации по 153 хайвею о совместимости я признаться честно не нашел - наверное плохо искал . Качество голоса такого решения для транков в GSM сети получается не очень , но если учитывать стоимость одного GSM модема в размере до 30 у.е и стоимость аналогичных специализированных решений например от ATCOM c ценником , который начинается от 300 у.е , то выбор будет однозначен для многих в пользу дешевых модемов с активированной функцией передачи голоса .

При установке будем использовать дистрибутив Elastix 2.4.0 . В основе дистрибутива лежит CentOS 5 ветки с ядром 2.6.18 , которое не корректно работает с устройствами USB , что приводит к отсутствию звука в направлении Sip -> GSM или сильным искажениям звука до неразборчивости . На модемах предварительно следует отключить все устройства (CD и кардридер ) поскольку они будут мешать нормально определиться USB устройствам в системе под операционной системой Linux .

Мне лично было намного удобней отключить ненужные функции из под форточек , поскольку разлочить и активировать голосовые фунции все равно пришлось под управлением Windows . Предполагается , что у вас разлоченный модем с активированной функцией голоса . Отключим не нужные нам виртуальный CD-ROM и Card Reader модема . Для подключения используем Huper Terminal OS Windows .

Обновим ядро системы до 2.6.39 , проблемы с модемами исчезают по разным источникам от версии ядра выше 2.6.32 . Установим необходимые пакеты для обновления ядра
yum install -y ncurses-devel gcc make rpm-build redhat-rpm-config
Перейдем в каталог с исходниками
cd /usr/src
Загрузим исходники ядра 2.6.39
wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.39.tar.bz2
Разархивируем его
tar -xf linux-2.6.39.tar.bz2
Создадим симлинк на исходники ядра
ln -sf /usr/src/linux-2.6.39 /usr/src/linux
Скопируем конфиг от активного ядра
cd linux
cp /boot/config-`uname -r` .config
Запустим конфигуратор ядра
make menuconfig
И вносим небольшую корректировочку без которой новое ядро не взлетит:
- в разделе
"General setup --->"
активируем опцию
"enable deprecated sysfs features which may confuse old userspace tools"
и
"enable deprecated sysfs features by default" Выходим из кофигуратора

Создаем папки для rpm файла:
mkdir -p /usr/src/redhat/SRPMS
mkdir -p /usr/src/redhat/RPMS/{i386,x86_64}

Редактируем файл
nano scripts/package/mkspec
добавляя в его конец следующее:
echo "%post"
echo "/sbin/new-kernel-pkg --package kernel --mkinitrd --depmod --install "$KERNELRELEASE" || exit \$?"
echo ""
echo "%preun"
echo "/sbin/new-kernel-pkg --rminitrd --rmmoddep --remove "$KERNELRELEASE" || exit \$?"
echo ""

Сохраняемся {CLTR} X Подтверждаем Y и наконец {ENTER}

Собираем ядро (заодно контролируем время сборки):
time make rpm
На довольно слабой машинке типа селерона 2.6 это заняло около 2 часов :) .

По окончании устанавливаем новое свежее красивое ядро.
rpm -ihv /usr/src/redhat/RPMS/i386/kernel-2.6.39-1.i386.rpm
Проверяем правильно ли оно прописалась в настройк grub'а
[root@voip ~]# cat /boot/grub/menu.lst
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You have a /boot partition. This means that
# all kernel and initrd paths are relative to /boot/, eg.
# root (hd0,0)
# kernel /vmlinuz-version ro root=/dev/VolGroup00/LogVol00
# initrd /initrd-version.img
#boot=/dev/hdc
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.39)
root (hd0,0)
kernel /vmlinuz-2.6.39 ro root=/dev/VolGroup00/LogVol00
initrd /initrd-2.6.39.img
title Elastix (2.6.18-194.3.1.el5)
root (hd0,0)
kernel /vmlinuz-2.6.18-194.3.1.el5 ro root=/dev/VolGroup00/LogVol00
initrd /initrd-2.6.18-194.3.1.el5.img

Перезагружаемся , надеюсь все собралось удачно и паники ядра нет , хотя всегда можно загрузиться со старым ядром
reboot
После перезагрузки проверяем версию текущего ядра
[root@voip ~]# uname -a
На момент написания статьи проект chan_datacard http://code.google.com/p/datacard/ гласил , что он закрыт и переехал на chan_dongle . Загрузим chan_dongle

wget http://asterisk-chan-dongle.googlecode.com/files/chan_dongle-1.1.r14.tgz

Разархивируем
tar -xvfz chan_dongle-1.1.r14.tgz

Конфигурим
./configure

Установим
make install

Надеюсь у вас все собралось без ошибок

Копируем файл dongle.conf в папку /etc/asterisk/

Внесем секцию [incoming-datacard] в файл /etc/asterisk/extensions_custom.conf , которая описывает поведение наших модемов при входящих СМС и звонках , подробней об этом на форуме http://asteriskforum.ru/viewtopic.php?p=61558 .

[incoming-datacard]
exten => sms,1,Verbose(Incoming SMS from ${CALLERID(num)} ${SMS})
exten => sms,n,System(echo '${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)} - ${DATACARD} - ${CALLERID(num)}: ${SMS}' >> /var/log/asterisk/sms.txt)
exten => sms,n,Hangup()
exten => ussd,1,Verbose(Incoming USSD: ${USSD})
exten => ussd,n,System(echo '${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)} - ${DATACARD}: ${USSD}' >> /var/log/asterisk/ussd.txt)
exten => ussd,n,Hangup()
exten => s,1,Goto(from-pstn,${IMEI},1)

Обратите внимание на последнюю строку секции [incoming-datacard] , использование ее в таком виде обеспечит возможность обрабатывать звонки в очередях и прочих возможностях астериска с веб морды еластикса . В просторах инета валяется масса вариантов описания диалпланов , но к сожалению они не такие элегантные и как правило выглядят топорно .

В CentOS есть небольшая неприятность , связанная с правами на устройства USB , в результате чего пользователь asterisk не имеет прав на чтение файлов устройств
/dev/ttyUSB....

Для решения этой неприятности подправим напильником файл 50-udev.rules
nano /etc/udev/rules.d/50-udev.rules

Внесите в файл содержимое этих строк , не забыв удалить или закаментить соответствующий старый кусок в файле . Вопросы с правами на устройства USB будут решены
KERNEL=="ttyUSB*", SUBSYSTEMS=="usb", KERNELS=="1-2:1.0", SYMLINK+="hw-modem-0", MODE="0666", OWNER="asterisk", GROUP="uucp"
KERNEL=="ttyUSB*", SUBSYSTEMS=="usb", KERNELS=="1-2:1.1", SYMLINK+="hw-audio-0", MODE="0666", OWNER="asterisk", GROUP="uucp"
KERNEL=="ttyUSB*", SUBSYSTEMS=="usb", KERNELS=="1-2:1.2", SYMLINK+="hw-data-0", MODE="0666", OWNER="asterisk", GROUP="uucp"


Не забудьте отключить пин код с карточек :).

Перезагрузим систему
[root@asterisk ~]#reboot

Войдем в консоль астериска
[root@asterisk ~]#asterisk -r
asterisk*CLI> datacard show devices


© extime.vn.ua

среда, 14 мая 2014 г.

Звонок из cli asterisk

Для создания звонка из командной оболочки asterisk можно воспользоваться такой командой:

originate SIP/101 extension 79008007766@from-internal

При выполнении данной команды астериск наберет внутренний номер 101, а после взятия трубки наберет номер 79008007766, пользуясь транками и маршрутами, настроенными на данной станции.

Кратко пробегусь по структуре команды:

originate - сама команда
SIP/101 - протокол и внутренний номер абонента
extension - обозначение выполняемой операции (можно не только набирать номер, а к примеру использовать application и в качестве команды сделать проигрывание в канал какого-нибудь звукового файла)
79008007766 - номер вызываемого абонента (в данном случае абонент внешний)
@from-internal - контекст (зависит от ваших настроек, используйте свои названия контекстов, если они у вас называются по другому)

четверг, 10 апреля 2014 г.

Обновление прошивки Grandstream GXW4224

Постоянно забываю как обновлять шлюзы Grandstream со старой прошивкой до современной прошивки. Дело в том, что по TFTP это периодически вызывает большие проблемы - шлюз попросту отказывается обновляться.

Последовательность такая:
1. Сначала надо обновить шлюз до прошивки 1.0.4.9, делается это по протоколу HTTP, вписываем в адрес сервера firmware.grandstream.com/GXW42xx_1.0.4.9 (если нет возможности подать интернет на шлюз, можно по ссылке повыкачивать лоадеры и прочее под свой шлюз).
2. Можно обновляться до последней прошивки любым из доступных способов (так же может не всегда сработать. Если вызывает проблемы - заходим на шлюз по telnet, два раза командуем upgrade и подтверждаем обновление Y).

понедельник, 13 января 2014 г.

UTF-8 в консоли FreeBSD

FreeBSD 8.x и версии новее поддерживают UTF-8 в консоли. Полная отрисовка юникодных шрифтов выполняется в графическом режиме, разумеется (framebuffer).


Сам по себе графический режим консоли штатно доступен с версии 3.0 и появился в системе 13 лет назад. Для его поддержки в 8.x нужно в конфигурацию ядра добавить опции:
options SC_PIXEL_MODE
options VESA


Чтобы сделать графический режим консоли дефолтным, нужно в /boot/device.hints к стандартным флагам драйвера syscons 0x100 добавить значение 0x80:
hint.sc.0.flags="0x180"


Для режима UTF-8 тип терминала в консоли меняется с cons25 на xterm (начиная с 9.0 по умолчанию xterm и нужна только вторая опция из двух):
options TEKEN_XTERM # xterm-style terminal emulation
options TEKEN_UTF8 # UTF-8 output handling


Так как теперь консоль будет xterm, в /etc/ttys надо заменить cons25 (или cons25r) на xterm.

Установить из портов sysutils/jfbterm, который и будет заниматься отрисовкой шрифтов в графическом режиме консоли.

Переменную LANG вместо ru_RU.KOI8-R нужно сделать равной ru_RU.UTF-8 средствами login class или выставив её после перезагрузки и логина в консоли вручную. После логина и проверки, что LANG=ru_RU.UTF-8, запускаем jfbterm. Он у меня перевел экран из дефолтного режима 800x600x32 в режим 1024x768x16 (для проверки режимов есть команды
vidcontrol -i adapter </dev/ttyv0 и vidcontrol -i mode </dev/ttyv0)
Теперь UTF-8 в консоли отрисовывается юникодными шрифтами.

Без jfbterm отрисовки шрифтов не будет и вместо кириллицы выдаются знаки вопроса.

(c) dadv