Для этого потребуется:
- Asterisk с настроенными пирами в realtime (в моем случае это Posgresql)
- DHCP, TFTP и WEB серверы
Я не буду касаться настройки Asterisk. Единственное, необходимо модифицировать таблицу sippeers, добавив поле mac (в него мы будем записывать мак-адреса телефонов).
Информацию о том, где получать конфигурацию, мы будем передавать с помощью DHCP options.
По умолчанию, на телефоне активирована DHCP option 66 (получение конфигов через TFTP).
TFTP нам понадобиться ТОЛЬКО для того, чтобы при первой загрузке изменить параметр загрузки телефона, указав ему в дальнейшем использовать DHCP option 43.
На DHCP сервере настраиваем два параметра:
option 66 где указываем адрес TFTP сервера: pbx.domain.ru
option 43 где указываем адрес веб сервера конфигураций
http://pbx.domain.ru
на TFTP сервере редактируем файл f0F0052H000.cfg (имя файла — уникальный номер модели телефона, можно узнать заглянув в лог TFTP сервера).
<<VOIP CONFIG FILE>>Version:2.0003
<AUTOUPDATE CONFIG MODULE>
DHCP Option :43
<<END OF FILE>>
Теперь, при первом включении телефона в сеть, он скачает f0F0052H000.cfg с TFTP сервера, применит его, и перезагрузится. Все, теперь этому телефону TFTP больше не нужен. С этого момента он будет запрашивать файлы конфигурации c сервера полученного через option 43.
Во время загрузки, телефон запрашивает два файла:
http://pbx.domain.ru/f0F0052H000.cfg
— общий для данной модели телефона файл. Статический файл со всеми настройками за исключением настроек SIP.
http://pbx.domin.ru//mac.cfg
где mac = mac адрес телефона. Второй запрос обрабатывает php-скриптом index.php, который подключается к базе, получает необходимые настройки для конкретного телефона и отдает их ему. Или, если телефон новый, регистрирует его в БД. Таким образом процедура настройки телефона от начала и до конца полностью автоматизирована.
<?php
$pbx = 'pbx.domain.ru';
$host = 'localhost';
$dbname = 'asterisk';
$dbuser = 'asterisk';
$dbpassword = 'password;
$mac= substr(split('\.', $_SERVER["REQUEST_URI"])[0],1);
if (strlen($mac) != 12 ) {
print "goodbye"; // Если длина mac-а меньше 12 ничего не делать.
exit;
}
$db = pg_connect("host=$host dbname=$dbname user=$dbuser password=$dbpassword")
or die('Could not connect: ' . pg_last_error());
function print_conf($name,$secret,$pbx)
{
header('Content-Type:application/txt');
echo "<<VOIP CONFIG FILE>>
<SIP CONFIG MODULE>
--SIP Line List-- :
SIP1 Phone Number :$name
SIP1 Display Name :$name
SIP1 Sip Name :$name
SIP1 Register Addr :$pbx
SIP1 Register User :$name
SIP1 Register Pswd :$secret
SIP1 Enable Reg :1
SIP1 DTMF Mode :2
SIP1 VoiceCodecMap :G711A,G711U,G722,G729
SIP2 line attachmen:1
<PHONE CONFIG MODULE>
LCD Title :$name
<<END OF FILE>>
";
}
function query_sql($db,$mac,$pbx)
{
$result = pg_query($db, "SELECT name,secret FROM sippeers WHERE mac = '$mac';");
if (!$result) { // Что-то пошло не так
return 2;
}
if ( pg_num_rows($result) == 0 ){
// В базе нет зарегистрированного телефона с этим MAC-ом
return 1;
}else {
// Получаем настройки для телефона
while ( $row = pg_fetch_row($result)){
$name = $row[0];
$secret = $row[1];
}
print_conf($name,$secret,$pbx);
}
}
// Получение свободного номера и привязка его к новому телефону
function update_sql($db,$mac)
{
$result = pg_query($db, "SELECT name,secret FROM sippeers WHERE mac IS NULL;");
if ( pg_num_rows($result) == 0 ){
return 2;
} else {
$result = pg_query($db,"UPDATE sippeers SET mac = '$mac' WHERE id IN (SELECT id FROM sippeers WHERE mac IS NULL LIMIT 1);");
if ($res) {
return 0;
}
}
}
if (query_sql($db,$mac,$pbx) == 1) { // Новый телефон, необходимо выбрать свободный номер и закрепить его за ним
if (update_sql($db,$mac,$pbx) == 0) { // Регистрация нового телефона
query_sql($db,$mac,$pbx); // Запрос конфига для вновь зарегестрированого телефона
}
}
pg_close($db);
?>
Комментарии (6)
eyt5297
22.03.2017 07:32ИМХО не тянет на полную автоматизацию. О плюса и минусах динамической генерации конфигурационных файлов хорошо рассказал igorg на последней конференции. Также ничего не рассказано про provisioning по HTTPS.
borisovEvg
22.03.2017 09:16Что же по вашему не хватает для того чтобы была полная автоматизация? Расскажите пожалуйста о чем там была речь, я не был на последней конференции. Кстати, что за конференция? Использование HTTPS это частный случай. Есть еще PnP, TR069 о которых можно написать. Но это, по моему никак не влияет на то что мой пример является вполне себе законченным.
eyt5297
22.03.2017 10:18https://www.youtube.com/watch?v=ImDYsiErVkE&t=1299s
Полная, это когда решены «все» проблемы. Например у вас написан код php, если в него внести изменения (улучшения) может привести к ошибкам и все телефоны могут автоматически перестать работать после перезагрузки. Раз так, то для полной автоматизации нужно сделать тесты. Также, тут не реализован механизм обновления конфигурации.borisovEvg
22.03.2017 12:22честно говоря не услышал почему динамическая генерация конфига это плохо. По пункту обновления конфигурации согласен, пока еще не актуально для меня(для моих телефонов), но думаю над этим. Написание кода и его отладка это кмк из другой области, не имеющей отношения к автоматизации настройки телефонов.
dronmaxman
Я счастливый обладатель телефонов FoxGate. Судя по конфигурации мне кажется что это одно и тоже ОЕМ производство.
Тоже использую автопровижен, но немного не так. Я генерирую для каждого телефона файлик (имя = mac) на основании данных из АД и выкладываю на TFTP потом по telnet перезагружаю телефоны.
Есть вопрос. Мои телефоны не принимают новую конфигурации если не повысить номер версии
<>Version:2.0003.
Как Ваши телефоны понимаю что необходимо обновить конфиг?
borisovEvg
Согласно документации, телефон скачивает файл с сервера, сравнивает его с тем что у него в памяти (подозреваю сравнивает их хэши), и в случае ели они различаются, применяет новый файл и перезагружается. Ровно такое поведение у моих телефонов. Версии же нужны (опять же согласно документации) для визуального отображения того, с каким конфигом на данный момент работает телефон.