В компании, где я работаю было принять решение перевезти все наши магазины, а их почти 500, на IP-телефонию. Центральный и региональные офисы уже давно используют для этих целей решения от Panasonic. В центральном офисе это KX-NS1000, в региональных в основном KX-NS500.
Но для перевода магазинов на ip-телефонию было принято решение использовать Asterisk.
Если интересно, как реализовать «Asterisk provisioning» с помощью bash скриптов работающих с mysql, как настроить Asterisk RealTime, dhcp, tftp, а так-же процесс генерации и подписания запроса на подпись ssl сертификата для работы https provisioning у Cysco — добро пожаловать под кат!
В следующей статье немного про настройку KX-NS1000 и KX-NS500 для связи с Asterisk.
Asterisk берёт список sip пользователей в базе данных mysql, этот механизм называется Asterisk RealTime. Это позволяет на лету создавать/удалять/редактировать учетные записи для SIP клиентов не заставляя Asterisk перечитывать sip.conf или users.conf.
Таблица из которой Asterisk берет sip аккаунты называется "sip_users" и она практически стандартна для механизма Asterisk RealTime.
Таблицы в которых пользователь производит привязку голосового шлюза к sip-аккаунту называются «redaction_gateway_and_phone» и «gateway_and_phone_info»:
При желании можно объединить обе таблицы в одну. я же разделил их, чтоб не плодить в одной таблице кучу записей с одинаковыми полями.
То есть в первой таблице описаны учётные записи для добавления в таблицу sip_users, а во второй какая модель шлюза будет настроена и где она стоит.
Вся логика настройки шлюзов заключается в том, что пользователь вносит mac-адрес голосового шлюза, номер используемого порта и желаемый номер телефона в обе эти таблицы, а точнее через web-интерфейс, а два скрипта создают соответствующую запись в таблице «sip_users» и генерируют конфигурационные файлы. Таким образом одновременно создается sip-аккаунт для Asterisk и соответствующий ей конфигурационный файл в директории tftp сервера для железки с данным mac-адресом.
Логика обработки базы данных и логика создания конфигурационных файлов разделена на две части. Они независимы друг от друга и позволяют путем создания новых скриптов делать авто-настройку для любых других шлюзов/телефонов.
За работу с базой данных отвечает скрипт
Потом скрипт опрашивает таблицу
На выходе скрипт выдает строчки вида: флаг_дублирования;mac-адрес;имя_пользователя;номер_порта;пароль
например:
Пароль генерируется отдельным скриптом passGen.sh.
Второй скрипт называется «gen_prov.sh». Он запускает «AutoProvision_all.sh», получает от него список всех записей и генерирует конфигурационные файлы для SPA112, TAU2-2M.IP и TAU-8.IP. К сожалению для Элтексов не реализовал настройку отдельных портов т.е. на них настраиваются все порты и в WEB-интерфейсе это проверяется.
Так же этот скрипт подойдет для генерации файлов для PAP2T-na, SPA8000 и теоретически для любых голосовых шлюзов от Cisco и Linksys.
Совсем не элегантное решение с TAU8, тут просится цикл перебора. Как и писал выше, TAU-8.IP приходится настраивать ручками прописывая путь до конфигурационного файла. Двух портовые TAU-2M.IP так-же приходится настраивать ручками, но это из-за того, что у нас настроена 150 и 66 опции и не настроена 43 опция на DHCP сервере.
Все скрипты лежат в директории
gen_prov.sh запускается раз в 1 минуту по крону.
Шлюзы SPA112 из коробки пытаются скачать конфигурационный файл с HTTPS сервера, соответственно на сервере должен быть актуальный сертификат ssl сертификат.
Как сгенерировать запрос на SSL сертификат неплохо описано вот тут, если кому лень читать то опишу всё тут:
1. Генерируем ключ 1 раз, сохраняем его.
2. Генерируем файл запроса сертификата.
3. Забираем сервера файл srv-shop-aster.csr, у вас конечно будет другое имя вобщем файл «имя_сервера.csr»
4. Идем на сервис подписывания сертификатов Выбираем продукт, время жизни сертификата и подписываем его нажав на кнопку «Sign Certificate Request», затем сохраняем себе на диск уже подписанный сертификат. Кстати надо зарегистрироваться на сайте Cisco.
5. Настроить HTTPS в Apache, неплохо написано вот тут.
У меня сертификат и ключ лежит в директории
И я не запрещал использование устаревшего протокола SSLv2, т.е. # SSLProtocol all -SSLv2
Не забудьте положить ключ с подписанным сертификатом в соответствующую директорию и перезапустить Apache.
В следующей статье опишу как подружить Asterisk с KX-NS1000, Про WEB-интерфейс и про настройку DHCP на маршрутизаторах.
Но для перевода магазинов на ip-телефонию было принято решение использовать Asterisk.
Если интересно, как реализовать «Asterisk provisioning» с помощью bash скриптов работающих с mysql, как настроить Asterisk RealTime, dhcp, tftp, а так-же процесс генерации и подписания запроса на подпись ssl сертификата для работы https provisioning у Cysco — добро пожаловать под кат!
В следующей статье немного про настройку KX-NS1000 и KX-NS500 для связи с Asterisk.
Техзадание:
- Автоматическая настройка должна полностью исключить участие человека в настройке как шлюзов так и самой Asterisk. Процесс настройки должен включать в себя только «привязку» портов шлюза к определенному номеру телефона.
- Настройка должна осуществляться через единый web-интерфейс
- В любой момент любой шлюз может быть удалён, перенесен номер телефона с одного шлюза на другой или переназначен порт на шлюзе
- Возможность расширить список поддерживаемого оборудования
Выбор голосовых шлюзов:
Главный критерием при выборе шлюза была корректная работа автоматической настройки т.к. шлюзов будет много, их надо настраивать. В любой момент, любой шлюз может выйти из строя и на его место придет новый шлюз или, что кажется ещё хуже, шлюз может переехать из одного магазина на другой, может смениться внутренний номер телефона на самом шлюзе или номер используемого порта.
Естественно мы несколько месяцев тестировали все шлюзы намышах тестовых магазинах, воевали с кодеками, провайдерами и параметрами qos, настраивали свои пограничные шлюзы и т.д.
На выбор мы взяли несколько шлюзов у Элтекса, и Cisco.
**Элтекс:**
Плюсы — я раньше с ним работал, хорошие шлюзы, много чего умеют, на борту замечательная OpenWRT,
Минусы: крайне неудобная автоматическая настройка, например нельзя сделать один общий файл для всех шлюзов и вынести в отдельные файлы индивидуальные настройки.
На разных версиях прошивки шлюзы по разному делают запрос конфигурационного файла т.е. где-то мак написан с точками, где слитно. Восьми портовые TAU-8.IP тянут конфигурационный файл только с корня tftp сервера. По этой причине полноценной автоматической настройки для этих шлюзов реализовать так и не получилось, приходится заходить на WEB-интерфейс шлюза и указывать путь до tftp сервера. Причем TAU-2M.IP отлично понимает переменные в пути до файла:
В WEB-интерфейсе автонастройки добавили генерацию этого пути после настройки. Я отлично понимаю, что если в DHCP сервере указать все параметры для 43 опции, то скорее все заработает, но у нас эта опция занята.
**Cisco**
Плюсы — я сними тоже раньше работал, замечательные шлюзы, с великолепной системой автоматической настройки.
Минусы: нет настройки QOS.
В итоге решили использовать SPA112, т.к. нам предложили очень вкусный ценник плюс у нас практически везде используется оборудование от Cisco.
Естественно мы несколько месяцев тестировали все шлюзы на
На выбор мы взяли несколько шлюзов у Элтекса, и Cisco.
**Элтекс:**
Плюсы — я раньше с ним работал, хорошие шлюзы, много чего умеют, на борту замечательная OpenWRT,
правда толку от этой замечательности ноль
производитель не выкладывает исходники драйверов как того требует лицензия OpenWRT и соответственно собрать свою версию прошивки не выйдет, как и установить какой-то сторонний пакет.
Минусы: крайне неудобная автоматическая настройка, например нельзя сделать один общий файл для всех шлюзов и вынести в отдельные файлы индивидуальные настройки.
На разных версиях прошивки шлюзы по разному делают запрос конфигурационного файла т.е. где-то мак написан с точками, где слитно. Восьми портовые TAU-8.IP тянут конфигурационный файл только с корня tftp сервера. По этой причине полноценной автоматической настройки для этих шлюзов реализовать так и не получилось, приходится заходить на WEB-интерфейс шлюза и указывать путь до tftp сервера. Причем TAU-2M.IP отлично понимает переменные в пути до файла:
tftp://10.0.15.9/Eltex/$PN/config/$MA.tar.gz
чего не скажешь про TAU-8.IP где в пути приходится писать мак-адрес шлюза.В WEB-интерфейсе автонастройки добавили генерацию этого пути после настройки. Я отлично понимаю, что если в DHCP сервере указать все параметры для 43 опции, то скорее все заработает, но у нас эта опция занята.
**Cisco**
Плюсы — я сними тоже раньше работал, замечательные шлюзы, с великолепной системой автоматической настройки.
Минусы: нет настройки QOS.
В итоге решили использовать SPA112, т.к. нам предложили очень вкусный ценник плюс у нас практически везде используется оборудование от Cisco.
Механизм создания конфигурационных файлов
Asterisk берёт список sip пользователей в базе данных mysql, этот механизм называется Asterisk RealTime. Это позволяет на лету создавать/удалять/редактировать учетные записи для SIP клиентов не заставляя Asterisk перечитывать sip.conf или users.conf.
Таблица из которой Asterisk берет sip аккаунты называется "sip_users" и она практически стандартна для механизма Asterisk RealTime.
Таблицы в которых пользователь производит привязку голосового шлюза к sip-аккаунту называются «redaction_gateway_and_phone» и «gateway_and_phone_info»:
redaction_gateway_and_phone
скачать в формате sql
— «mac» — мак адрес шлюза
— «name» — sip имя пользователя он же номер телефона
— «port_id» — номер физического порта на VoIp-шлюзе. т.е порта куда будет подключен аналоговый телефон
— «actual» — флаг указывающий надо ли создать/переписать конфигурационный файл и запись в таблице sip_users
И дата добавления, редактирования:
— «data» — автоматически добавляется дата создания/редактирования записи
— «mac» — мак адрес шлюза
— «name» — sip имя пользователя он же номер телефона
— «port_id» — номер физического порта на VoIp-шлюзе. т.е порта куда будет подключен аналоговый телефон
— «actual» — флаг указывающий надо ли создать/переписать конфигурационный файл и запись в таблице sip_users
И дата добавления, редактирования:
— «data» — автоматически добавляется дата создания/редактирования записи
gateway_and_phone_info
скачать в формате sql
gateway_and_phone_info нужна для добавления информации по тому, какой шлюз настраивается, так-же в ней указывается регион нахождения шлюза, идентификационный номер магазина и имя учетной записи из AD того, кто настраивал/редактировал.
— «region» — для удобства определения из какого региона идет исходящий звонок(ниже подробнее).
— «model» — модель шлюза, все модели хранятся в дрогой таблице
— «cfu» — идентификационный номер магазина
— «region» — регион нахождения шлюза т.е. город, село и т.п.
— «last_modified» — Перед входом в WEB-интерфейс апач спрашивает имя/пасс которое потом сверяет с группой в АД.
— «mac» — мак
gateway_and_phone_info нужна для добавления информации по тому, какой шлюз настраивается, так-же в ней указывается регион нахождения шлюза, идентификационный номер магазина и имя учетной записи из AD того, кто настраивал/редактировал.
— «region» — для удобства определения из какого региона идет исходящий звонок(ниже подробнее).
— «model» — модель шлюза, все модели хранятся в дрогой таблице
— «cfu» — идентификационный номер магазина
— «region» — регион нахождения шлюза т.е. город, село и т.п.
— «last_modified» — Перед входом в WEB-интерфейс апач спрашивает имя/пасс которое потом сверяет с группой в АД.
— «mac» — мак
При желании можно объединить обе таблицы в одну. я же разделил их, чтоб не плодить в одной таблице кучу записей с одинаковыми полями.
То есть в первой таблице описаны учётные записи для добавления в таблицу sip_users, а во второй какая модель шлюза будет настроена и где она стоит.
Вся логика настройки шлюзов заключается в том, что пользователь вносит mac-адрес голосового шлюза, номер используемого порта и желаемый номер телефона в обе эти таблицы, а точнее через web-интерфейс, а два скрипта создают соответствующую запись в таблице «sip_users» и генерируют конфигурационные файлы. Таким образом одновременно создается sip-аккаунт для Asterisk и соответствующий ей конфигурационный файл в директории tftp сервера для железки с данным mac-адресом.
Логика обработки базы данных и логика создания конфигурационных файлов разделена на две части. Они независимы друг от друга и позволяют путем создания новых скриптов делать авто-настройку для любых других шлюзов/телефонов.
За работу с базой данных отвечает скрипт
AutoProvision_all.sh
. Первым делом скрипт опрашивает таблицу gateway_and_phone
на наличие записей с уникальным mac-адресом и с флагом No
в поле actual
. То есть находит не актуальные, с точки зрения Asterisk, шлюзы/телефоны где будет настроен один аккаунт на один голосовой шлюз(или VoIp-телефон). Далее скрипт меняет флаг с No
на Yes
в поле actual
, поочередно выдает данные по каждой записи одновременно создавая запись в таблице sip_users
.Потом скрипт опрашивает таблицу
gateway_and_phone_info
на наличие записей с флагом No
в поле actual
и повторяющимися mac-адресами. То есть находит не актуальные, с точки зрения Asterisk, шлюзы/телефоны где будут настроены несколько аккаунтов на один голосовой шлюз(или VoIp-телефон). И так-же меняет флаг, создает запись и выводит данные.На выходе скрипт выдает строчки вида: флаг_дублирования;mac-адрес;имя_пользователя;номер_порта;пароль
например:
duble;00da55b729e8;8888;1;2DJKjH3XTx1osjI1
no_duble;00da55b729e8;8888;1;d5xfDwKG3UNdywgY
Пароль генерируется отдельным скриптом passGen.sh.
AutoProvision_all.sh
#!/bin/bash
#echo START
ROOT_PATH=$(cd $(dirname $0) && pwd) # Определяем директорию, где сейчас находимся.
# Переменная "sql" содержащую имя с паролем и название базы данных.
sql='mysql -uprovisioning -pxkYyNFuyc3nEKsFj -Dasterisk -e'
sql_gateway='redaction_gateway_and_phone' # Имя базы данных, откуда будем брать мак-адреса
sql_sip_users='sip_users' # Имя базы данных asterisk
test=""
test=no_test # Закоментировать для работы скрипа в режиме чтения бызы данных т.е.
# выключает изменение флага "actual" и инсерт в таблицу Asterisk.
#del_old_user=""
#del_old_user=delete # Закоментировать чтоб отключить удаление старых учеток па маске
###################################################################################
###################################################################################
### ###
### Функция для инсерта в базу и вывода данных по пользователям: ###
### ###
###################################################################################
###################################################################################
insert_update_sql () {
local f_name
local d_name
for f_name in "$@"
do
#Запускаем цикл для перебора пользователей:
# Исключим флаг дублирования запросов в базу, т.к. оне не является маком.
# он прилетает вконце каждого массива с маками
#echo f_name $f_name
if [ "$f_name" != "no_duble" ] && [ "$f_name" != "duble" ]
then
# Делаем запрос к базе данных и пихаем результат в массив "array_users"
array_users=($($sql "SELECT mac,name,port_id FROM $sql_gateway WHERE name like '$f_name'"| awk 'NR>1'))
mac=${array_users[0]}
name=${array_users[1]}
secret=$(${ROOT_PATH}/passGen.sh)
port_id=${array_users[2]}
region=($($sql "SELECT region FROM gateway_and_phone_info WHERE mac like (SELECT mac FROM $sql_gateway WHERE name like '$name')"| awk 'NR>1'))
model=($($sql "SELECT model FROM gateway_and_phone_info WHERE mac like '$mac'"| awk 'NR>1'))
# Меняем флаг с "no" на "yes"
if [ -n "$test" ]; then $sql "UPDATE $sql_gateway SET actual = 'yes' WHERE name like '$name'" | awk 'NR>1';fi
# Делаем новую запись или переписываем старую в таблице "sip_users".
# Кстати для "REPLACE INTO" нужен индекс UNIQUE в поле "name" иначе старая запись не будет переписана.
# Удаляем старых пользователей, которые подходят под маску имя пользователя без последней цифры. Дабы не плодить мертвые учетки.
#d_name=($(echo -n $@|sed -r 's/[^0-9 ]//gi'))
#echo d_name $d_name
#$sql "DELETE FROM sip_users WHERE sip_users.name not in ($d_name) and sip_users.name like '${name%?}%'" | awk 'NR>1'
if [ -n "$test" ]; then $sql "REPLACE INTO $sql_sip_users (id,name,defaultuser,context,secret,region) VALUES (NULL, '$name', '$name', 'default', '$secret', '$region')" | awk 'NR>1'; fi
# Отдельное эхо для дудлированных и не дублированных маков, тут как-раз проверяем нужный нам флаг.
# if [ "${!#}" == "no_duble" ]; then echo no_duble\;$mac\;$name\;$port_id\;$secret; fi
if [ "${!#}" == "no_duble" ]; then echo "no_duble"\;"$mac"\;"$name"\;"$port_id"\;"$secret"\;"$model"; fi
# if [ "${!#}" == "duble" ]; then echo duble\;$mac\;$name\;$port_id\;$secret; fi
if [ "${!#}" == "duble" ]; then echo "duble"\;"$mac"\;"$name"\;"$port_id"\;"$secret"\;"$model"; fi
fi
done
}
####################################################################################
####################################################################################
### ***конец функции*** ###
####################################################################################
####################################################################################
# Создаем масиив со списком не дублированных маков c флагом "no"
array_no_duble_user=($($sql "SELECT name FROM $sql_gateway WHERE mac IN (SELECT mac FROM $sql_gateway GROUP BY mac HAVING count(*)=1) and actual like 'no'" | awk 'NR>1'))
#echo Количество пользователей с не дублированными маками - ${#array_no_duble_mac[@]}
#echo Список пользователей с не дублированными маками -- ${array_no_duble_mac[@]}
# Передаем массив в функцию
insert_update_sql "${array_no_duble_user[@]}" "no_duble"
# Далее идет разбор дублированных маков.
# Создаем масиив "array_duble_mac" со списком дублированных маков с флагом "no"
array_duble_mac=($($sql "SELECT distinct mac FROM $sql_gateway WHERE mac IN (SELECT mac FROM $sql_gateway GROUP BY mac HAVING count(*)>1) and actual like 'no'" | awk 'NR>1'))
# echo Количество дублированных маков - ${#array_duble_mac[@]}
# echo Список дублированных маков -- ${array_duble_mac[@]}
# Запускаем цикл для перебора всех пользователей с дублированными маками:
for (( duble_mac_num=0; $duble_mac_num<${#array_duble_mac[@]}; duble_mac_num++ ))
do
# Создаем массив "array_duble_user" с именами пользователей с дублированными маками.
array_duble_user=($($sql "SELECT name FROM $sql_gateway WHERE mac like '${array_duble_mac[$duble_mac_num]}'"| awk 'NR>1'))
# echo Количество пользователей с дублированными маками - ${#array_duble_mac_user[@]}
# echo Список пользователей с дублированными маками -- ${array_duble_mac_user[@]}
# Передаем массив со списком дублированных маков в функцию "insert_update_sql".
insert_update_sql "${array_duble_user[@]}" "duble"
done
exit 0
Второй скрипт называется «gen_prov.sh». Он запускает «AutoProvision_all.sh», получает от него список всех записей и генерирует конфигурационные файлы для SPA112, TAU2-2M.IP и TAU-8.IP. К сожалению для Элтексов не реализовал настройку отдельных портов т.е. на них настраиваются все порты и в WEB-интерфейсе это проверяется.
Так же этот скрипт подойдет для генерации файлов для PAP2T-na, SPA8000 и теоретически для любых голосовых шлюзов от Cisco и Linksys.
gen_prov.sh
#!/bin/bash
ROOT_PATH=$(cd $(dirname $0) && pwd)
# Объявляем ассоциативный массив. Крайне важно объявить именно ассоциативный массив,
# это позволить использовать в качестве ключа имена мак адресов!!!
declare -A array_duble_file_out
declare -A array_duble_out_eltex
declare -A array_duble_out_eltex_tau8
tmp_dir=`/bin/mktemp -d`
# Создаем массив "array_users" со списком пользователей содержащий в каждом поле данные пользователей "flag,mac,name,port,password":
array_users=($(${ROOT_PATH}/AutoProvision_all.sh))
#echo array_users--- ${#array_users[@]}
#echo Весь массив array_users--- ${array_users[@]}
# Запускаем цикл для разбора списка пользователей
for (( array_users_num=0; array_users_num<${#array_users[@]}; array_users_num++ ))
do
# Создаем массив "array_user_data" содержащий данные пользователей "flag;mac;name;port;password;model":
array_user_data=($(echo -n ${array_users[$array_users_num]}|tr -s ';' '\ ' ))
# # Запускаем цикл для разбора данных пользователей:
# for (( array_usersc_data_num=0; array_usersc_data_num<${#array_users_data[@]}; array_usersc_data_num++ ))
# do
flag=${array_user_data[0]}
mac=${array_user_data[1]}
name=${array_user_data[2]}
port=${array_user_data[3]}
password=${array_user_data[4]}
model=${array_user_data[5]}
if [ "$model" == "TAU-2M.IP" ]
then
# Создаем массив двух портовых этексов
array_duble_out_eltex[$mac]=$(echo -n "${array_duble_out_eltex[$mac]} $name;$password ")
fi
###########################################################################
if [ "$model" == "TAU-8.IP" ]
then
# Создаем массив восьми портовых этексов
array_duble_out_eltex_tau8[$mac]=$(echo -n "${array_duble_out_eltex_tau8[$mac]} $name;$password ")
fi
###########################################################################
if [ "$model" == "SPA112" ]
then
mac=$(echo -n ${array_user_data[1]}|sed 's/.*/\L&/')
rm -f /srv/tftp/Cisco/config/*$mac\*
# Создаем ассоциативный массив в качестве ключа используем мак адрес.
array_duble_file_out[$mac]=$(echo -en "${array_duble_file_out[$mac]}\n\n<Line_Enable_${port}_ ua=\"na\">Yes</Line_Enable_${port}_>
<Display_Name_${port}_ ua=\"na\">$name</Display_Name_${port}_>
<User_ID_${port}_>$name</User_ID_${port}_>
<Password_${port}_>$password</Password_${port}_>")
fi
###########################################################################
done
# После наполнения массивов приступим к обработки этих массивов
# Генерируем в цикле TAU-8.IP
for array_duble_out_key_eltex_tau8 in ${!array_duble_out_eltex_tau8[@]}; do
cp -R $ROOT_PATH/template/TAU-8.IP/tmp/ $tmp_dir
# echo !array_duble_out_eltex_tau8 ключи т.е. маки ${!array_duble_out_eltex_tau8[@]}
# echo array_duble_out_eltex_tau8 содержимое по порядку ${array_duble_out_eltex_tau8[$array_duble_out_key_eltex_tau8]}
# echo array_duble_out_key_eltex_tau8 мак по порядку $mac -- $array_duble_out_key_eltex_tau8
mac_tau8=$array_duble_out_key_eltex_tau8
array_users_eltex_tau8=($(echo ${array_duble_out_eltex_tau8[$array_duble_out_key_eltex_tau8]}|tr -s ';' '\ ' ))
#########################################################
# FXS1
name_eltex_tau8_1=${array_users_eltex_tau8[0]}
password_eltex_tau8_1=${array_users_eltex_tau8[1]}
# FXS2
name_eltex_tau8_2=${array_users_eltex_tau8[2]}
password_eltex_tau8_2=${array_users_eltex_tau8[3]}
# FXS3
name_eltex_tau8_3=${array_users_eltex_tau8[4]}
password_eltex_tau8_3=${array_users_eltex_tau8[5]}
# FXS4
name_eltex_tau8_4=${array_users_eltex_tau8[6]}
password_eltex_tau8_4=${array_users_eltex_tau8[7]}
# FXS5
name_eltex_tau8_5=${array_users_eltex_tau8[8]}
password_eltex_tau8_5=${array_users_eltex_tau8[9]}
# FXS6
name_eltex_tau8_6=${array_users_eltex_tau8[10]}
password_eltex_tau8_6=${array_users_eltex_tau8[11]}
# FXS7
name_eltex_tau8_7=${array_users_eltex_tau8[12]}
password_eltex_tau8_7=${array_users_eltex_tau8[13]}
# FXS8
name_eltex_tau8_8=${array_users_eltex_tau8[14]}
password_eltex_tau8_8=${array_users_eltex_tau8[15]}
#########################################################
/bin/sed " # FXS_1
s/%fxs1_phone%/$name_eltex_tau8_1/g; s/%fxs1_username%/$name_eltex_tau8_1/g; s/%fxs1_auth_name%/$name_eltex_tau8_1/g; s/%fxs1_auth_pass%/$password_eltex_tau8_1/g; # FXS_2
s/%fxs2_phone%/$name_eltex_tau8_2/g; s/%fxs2_username%/$name_eltex_tau8_2/g; s/%fxs2_auth_name%/$name_eltex_tau8_2/g; s/%fxs2_auth_pass%/$password_eltex_tau8_2/g; # FXS_3
s/%fxs3_phone%/$name_eltex_tau8_3/g; s/%fxs3_username%/$name_eltex_tau8_3/g; s/%fxs3_auth_name%/$name_eltex_tau8_3/g; s/%fxs3_auth_pass%/$password_eltex_tau8_3/g; # FXS_4
s/%fxs4_phone%/$name_eltex_tau8_4/g; s/%fxs4_username%/$name_eltex_tau8_4/g; s/%fxs4_auth_name%/$name_eltex_tau8_4/g; s/%fxs4_auth_pass%/$password_eltex_tau8_4/g; # FXS_5
s/%fxs5_phone%/$name_eltex_tau8_5/g; s/%fxs5_username%/$name_eltex_tau8_5/g; s/%fxs5_auth_name%/$name_eltex_tau8_5/g; s/%fxs5_auth_pass%/$password_eltex_tau8_5/g; # FXS_6
s/%fxs6_phone%/$name_eltex_tau8_6/g; s/%fxs6_username%/$name_eltex_tau8_6/g; s/%fxs6_auth_name%/$name_eltex_tau8_6/g; s/%fxs6_auth_pass%/$password_eltex_tau8_6/g; # FXS_7
s/%fxs7_phone%/$name_eltex_tau8_7/g; s/%fxs7_username%/$name_eltex_tau8_7/g; s/%fxs7_auth_name%/$name_eltex_tau8_7/g; s/%fxs7_auth_pass%/$password_eltex_tau8_7/g; # FXS_8
s/%fxs8_phone%/$name_eltex_tau8_8/g; s/%fxs8_username%/$name_eltex_tau8_8/g; s/%fxs8_auth_name%/$name_eltex_tau8_8/g; s/%fxs8_auth_pass%/$password_eltex_tau8_8/g" $ROOT_PATH/template/TAU-8.IP/tmp/etc/config/pbx > $tmp_dir/tmp/etc/config/pbx;
sed "s/%mac%/$mac_tau8/g" $ROOT_PATH/template/TAU-8.IP/tmp/etc/config/system > $tmp_dir/tmp/etc/config/system
cd $tmp_dir/;
tar zcf $mac_tau8.tar.gz tmp;
rm -rf /srv/tftp/Eltex/TAU-8.IP/config/$mac_tau8.tar.gz
mv $tmp_dir/$mac_tau8.tar.gz /srv/tftp/Eltex/TAU-8.IP/config/
done # end TAU-8.IP
# Генерируем в цикле TAU-2M.IP
for array_duble_out_key_eltex in ${!array_duble_out_eltex[@]}; do
# echo array_duble_out_eltex ключи т.е. маки ${!array_duble_out_eltex[@]}
# echo array_duble_out_eltex содержимое по порядку ${array_duble_out_eltex[$array_duble_out_key_eltex]}
mac_tau2=$array_duble_out_key_eltex #Для 13 прошивок
mac_tau2_now=$(echo -n $mac | sed -r 's/(..)/\1./gi ; s/.$//gi') # для 14 прошивок
array_users_eltex=($(echo ${array_duble_out_eltex[$array_duble_out_key_eltex]}|tr -s ';' '\ ' ))
name_eltex_1=${array_users_eltex[0]}
password_eltex_1=${array_users_eltex[1]}
name_eltex_2=${array_users_eltex[2]}
password_eltex_2=${array_users_eltex[3]}
/bin/sed " s/%fxs0_Enable%/1/g; s/%fxs0_Number%/$name_eltex_1/g; s/%fxs0_AuthUsername%/$name_eltex_1/g; s/%fxs0_AuthPassword%/$password_eltex_1/g; s/%fxs1_Enable%/1/g; s/%fxs1_Number%/$name_eltex_2/g; s/%fxs1_AuthUsername%/$name_eltex_2/g; s/%fxs1_AuthPassword%/$password_eltex_2/g" $ROOT_PATH/template/TAU-2M.IP/cfg.yaml > $tmp_dir/cfg.yaml;
cd $tmp_dir
tar zcf $mac_tau2.tar.gz cfg.yaml;
# echo tmp tau2 $mac_tau2 $tmp_dir
rm -rf /srv/tftp/Eltex/TAU-2M.IP/config/$mac_tau2.tar.gz
cp $tmp_dir/$mac_tau2.tar.gz /srv/tftp/Eltex/TAU-2M.IP/config/
rm -rf /srv/tftp/Eltex/TAU-2M.IP/config/$mac_tau2_now.tar.gz
cp $tmp_dir/$mac_tau2.tar.gz /srv/tftp/Eltex/TAU-2M.IP/config/$mac_tau2_now.tar.gz
#echo $tmp_dir
#echo $mac_tau2
#echo $mac_tau2_now
# Конец генерации TAU-2M.IP"
done
# Генерируем в цикле SPA112
for array_duble_file_out_key in ${!array_duble_file_out[@]}; do
echo -e "<flat-profile>${array_duble_file_out[$array_duble_file_out_key]}\n\n</flat-profile>" > /srv/tftp/Cisco/config/spa$array_duble_file_out_key.xml
done
trap "rm -rf $tmp_dir" EXIT INT QUIT ABRT TERM
exit 0
Совсем не элегантное решение с TAU8, тут просится цикл перебора. Как и писал выше, TAU-8.IP приходится настраивать ручками прописывая путь до конфигурационного файла. Двух портовые TAU-2M.IP так-же приходится настраивать ручками, но это из-за того, что у нас настроена 150 и 66 опции и не настроена 43 опция на DHCP сервере.
Все скрипты лежат в директории
/etc/asterisk/scripts
, там же необходимо создать каталог "template" в котором должны лежать шаблоны конфигурационных файлов для шлюзов, а для TAU-8.IP ещё и дерево каталогов т.к. у этого шлюза несколько конфигурационных файлов, которые лежат каждый в своей директории и вся эта кухня собирается в один архив.gen_prov.sh запускается раз в 1 минуту по крону.
Шлюзы SPA112 из коробки пытаются скачать конфигурационный файл с HTTPS сервера, соответственно на сервере должен быть актуальный сертификат ssl сертификат.
Как сгенерировать запрос на SSL сертификат неплохо описано вот тут, если кому лень читать то опишу всё тут:
1. Генерируем ключ 1 раз, сохраняем его.
openssl genrsa -out server.key 2048
2. Генерируем файл запроса сертификата.
openssl req -new -key srv-shop-aster.key -out srv-shop-aster.csr -subj "/C=RU/ST=Novosibirskaya Oblast/L=Kolcovo/O=Roga_and_Kopita_Company Ltd./OU=IT Department/CN=srv-shop-aster/emailAddress=admin_user@RogKop.ru/"
3. Забираем сервера файл srv-shop-aster.csr, у вас конечно будет другое имя вобщем файл «имя_сервера.csr»
4. Идем на сервис подписывания сертификатов Выбираем продукт, время жизни сертификата и подписываем его нажав на кнопку «Sign Certificate Request», затем сохраняем себе на диск уже подписанный сертификат. Кстати надо зарегистрироваться на сайте Cisco.
5. Настроить HTTPS в Apache, неплохо написано вот тут.
У меня сертификат и ключ лежит в директории
/etc/apache2/ssl/
в файле /etc/apache2/sites-enabled/default-ssl.conf
прописаны пути к сертификату и ключу:SSLCertificateFile /etc/apache2/ssl/srv-shop-aster.crt
SSLCertificateKeyFile /etc/apache2/ssl/srv-shop-aster.key
И я не запрещал использование устаревшего протокола SSLv2, т.е. # SSLProtocol all -SSLv2
Не забудьте положить ключ с подписанным сертификатом в соответствующую директорию и перезапустить Apache.
В следующей статье опишу как подружить Asterisk с KX-NS1000, Про WEB-интерфейс и про настройку DHCP на маршрутизаторах.
PbIXTOP
А в чем проблема переназначить эту опцию для отдельных клиентов или групп клиентов на основе MAC. Большинство DHCP серверов это позволяют.