Auto provisioning для grandstream или вынимаем и вкладываем душу в GXP1165

в 18:53, , рубрики: auto provisioning, bash, grandstream, ip-телефония, provisioning, voip, метки: , , , ,

До недавнего времени в качестве VoIP аппаратов мы использовали продукцию Fanvil. И в целом всем были довольны. Управление из единой точки есть, качество связи удовлетворительное, но оставалось ощущение какой-то незаконченности или даже недосказанности (понимайте как хотите :))) В общем поиск «идеального телефона» в фоновом режиме, но все время продолжался. И вот мне в руки попал Grandstream GXP1165. Имея более именитого производителя данная модель находится в той же ценовой категории, что и китайские Fanvil-ы. Обладает всеми необходимыми функциями и имеет более интуитивное обозначение на кнопках и портах подключения. Кроме того, с некоторых пор, одним из решающих факторов при выборе IP телефона для меня является функция авто провижинга. Данная модель grandstream его обещала. Об этом дальше и пойдет речь.

Мой опыт работы с функцией auto provisioning основывался на уже упомянутой китайской продукции. И я наивно полагал, что с Grandstream все будет выглядеть примерно также. В общем-то так и вышло. Но я не предполагал насколько примерно все окажется. Чтобы не быть голословным приведу два куска настроек с одного и другого аппарата. Настройки получены путем экспорта файла.
Fanvil:

Static IP       :192.168.1.179
Static NetMask     :255.255.255.0
Static GateWay     :192.168.1.1
Default Protocol   :2
Primary DNS        :202.96.134.133
Alter DNS          :202.96.128.68
DHCP Mode          :1
DHCP Dns           :1
Domain Name        :
Host Name          :VOIP
Pppoe Mode         :0
HTL Start Port     :10000
HTL Port Number    :200
SNTP Server        :209.81.9.7

А теперь держитесь. Кусок настроек из конфига grandstream:

P335=2
P90=0
P91=0
P212=1
P92=0
P93=0
P338=0
P1339=0
P94=0
P2340=0
P95=0
P2341=0
P2342=0
P96=97
P2343=0
P97=1
P99=0
P10=168
P11=0
P2346=0
P2347=0
P12=160
P13=255
P2348=0
P14=255

А! Как вам?! Впечатлены? По правде говоря я вас немножко обманул. Рабочий конфиг телефона выглядит иначе. Но зато вы можете представить мою растерянность, когда я увидел конфигурацию которую скачал с аппарата.
Сразу видны плюсы и минусы одного и другого собрата. Китайцы сделали настройки более приближенные к человеческому пониманию. Зато американцев выручает хорошее количество документации. В конечном итоге выручило оно и меня.
Файл конфигурации для grandstream можно создать двумя способами. При помощи утилит на сайте производителя (инструменты есть для Windows и для Linux) и в ручную, через XML файл. С первым способом у меня не сложилось. Поэтому опишу второй.
Как вы уже поняли, названия полей конфигурации зашифрованы и найти их описание не то чтобы сложно, но порыть инет пришлось. Что-то взял тут, что-то здесь и в целом получился вот такой файл.

<?xml version="1.0" encoding="UTF-8" ?> 
<gs_provision version="1"> 
<mac>000a91547c9c</mac> 
<config version="1"> 
<!-- Admin Password --> 
<P2>PasswordQWER</P2> 
<P3>Grandstream</P3> 
<!-- SIP Registration. 0-no,1-yes --> 
<P31>1</P31> 
<!-- Register Expiration (in minutes. default 1 hour, max 45 days) --> 
<P32>60</P32> 
<!-- Authenticate password --> 
<P34>SIPassword</P34> 
<!-- SIP User ID --> 
<P35>111</P35> 
<!-- Authenticate ID --> 
<P36>111</P36> 
<P40>5561</P40> 
<!-- SIP Server --> 
<P47>sip.address.ru:5561</P47> 
<!-- DNS Mode. 0-A Record, 1-SRV, 2-NAPTR/SRV, 3-Use Configured IP --> 
<P103>0</P103> 
<!-- Time Format 0-12, 1-24 --> 
<P122>1</P122> 
<P148>Grandstream Provisioning</P148> 
<P237>config.address.ru</P237> 
<!-- Account Name. Cannot be empty. --> 
<P270>TestConfig</P270> 
<!-- Account 1 --> 
<!-- Account Active (In Use). 0-no, 1-yes --> 
<P271>1</P271> 
<!-- Enable Phonebook. 0(Disabled)/1(HTTP)/2(TFTP)/3(HTTPS) --> 
<P330>1</P330> 
<!-- Phone Book XML Server Path --> 
<P331>config.address.ru</P331> 
<!-- Phone Book Download Interval (in minutes) --> 
<P332>5</P332> 
<!-- Remove Manually-edited entries on Download. Possible values: 0(No)/1(Yes) --> 
<P333>1</P333> 
<!-- XML FILE ENCRYPTION --> 
<P1349>password123</P1349> 
<P1362>ru</P1362> 
<!-- Degree Unit. auto - Automatic, f - Fahrenheit, c - Celsius. Default is auto --> 
<P1379>c</P1379> 
</config> 
</gs_provision> 

Данный конфиг позволяет зарегистрировать аппарат на SIP сервере работающем по не стандартному порту 5561. Также включены незначительные особенности вроде отображения погоды в Цельсиях и настройки пути к адресной книге. Параметры которые не указаны, будут установлены по умолчанию.
Готовый файл необходимо зашифровать.

openssl enc -e -aes-256-cbc -k password123 -in basefile.xml -out cfg000d91447b9b.xml 

Имя файла должно иметь вид cfg[macaddress].xml. Раздавать файл будем через HTTP, поэтому просто выкладываем его в /var/www/ (Установку apache в виде apt-get install apache2, извините, описывать не буду :))
Далее по аналогии с Fanvil-ами автоматизируем этот процесс.
Создадим файл users со следующим содержимым:

000a91547c9c 111 SIPassword User Grand

Обратите внимание, mac адрес должен быть написан маленькими буквами.

… и bash файл который будет брать настройки из users

#!/bin/bash
uspath=/opt/neoflex/gxp1165
usfile=(`cat $uspath/users`)
macdir=/var/www/
a=0 #macaddrr
b=1 #number
c=2 #pass
d=3 #2name
e=4 #1name
while [ ${usfile[$a]} ]
do
dfile=$macdir'cfg'${usfile[$a]}
cat <<EOF >>$dfile
<?xml version="1.0" encoding="UTF-8" ?>
<gs_provision version="1">
<mac>${usfile[$a]}</mac>
<config version="1">
<!-- Admin Password -->
<P2>PasswordQWER</P2>
<P3>DisplayTest</P3>
<!-- SIP Registration. 0 - no, 1 - yes -->
<P31>1</P31>
<!-- Register Expiration (in minutes. default 1 hour, max 45 days) -->
<P32>60</P32>
<!-- Authenticate password -->
<P34>${usfile[$c]}</P34>
<!-- SIP User ID -->
<P35>${usfile[$b]}</P35>
<!-- Authenticate ID -->
<P36>${usfile[$b]}</P36>
<P40>5561</P40>
<!-- SIP Server -->
<P47>sip.server.ru:5561</P47>
<!-- DNS Mode. 0 - A Record, 1 - SRV, 2 - NAPTR/SRV, 3 - Use Configured IP. Default is 0 -->
<P103>0</P103>
<!-- Time Format -->
<P122>1</P122>
<P148>Grandstream Provisioning</P148>
<!-- HTTP Firmware Update Server -->
<P192>config.server.ru</P192>
<P237>config.server.ru</P237>
<!-- Account Name. Cannot be empty. -->
<P270>${usfile[$d]} ${usfile[$e]}</P270>
<!-- Account 1 -->
<!-- Account Active (In Use). 0 - no, 1 - yes -->
<P271>1</P271>
<!-- Enable Phonebook0(Disabled)/1(HTTP)/2(TFTP)/3(HTTPS) -->
<P330>1</P330>
<!-- Phone Book XML Server Path -->
<P331>sip.server.ru</P331>
<!-- Phone Book Download Interval (in minutes) -->
<P332>60</P332>
<!-- Remove Manually-edited entries on Download. Possible values: 0 (No) / 1 (Yes) -->
<P333>1</P333>
<!-- XML FILE ENCRYPTION -->
<P1349>password</P1349>
<P1362>ru</P1362>
<!-- Update Interval.Default is 15 -->
<P1378>60</P1378>
<!-- Degree Unit. auto - Automatic, f - Fahrenheit, c - Celsius. Default is auto -->
<P1379>c</P1379>
</config>
</gs_provision>
EOF
openssl enc -e -aes-256-cbc -k password -in $dfile -out $dfile.xml
rm $dfile
a=`expr $a + 5`
b=`expr $b + 5`
c=`expr $c + 5`
d=`expr $d + 5`
e=`expr $e + 5`
done

Все. На выходе /var/www/ получаем зашифрованный XML-ник cfg000a91547c9c.xml
В настройках самого аппарата достаточно прописать путь к серверу конфигурации и пароль для расшифровки конфиг файла.

image
Внизу нажимаем кнопку «Сохранить и применить» и отправляем в ребут кнопкой «Перезагрузка» в верхнем правом углу экрана.

Но на этом я не успокоился. В процессе рытья в документации мне попалось описание настройки адресной книги для телефона. И я, не долго думая, забабахал скрипт который генерит phonebook.xml собирая его из sip конфигов.
Важно! У меня параметр callerid имеет вид SecondName FirsName<111>. То есть все экстеншены должны иметь поле callerid и именно с тремя значениями.

#!/bin/bash
a=0
b=1
c=2
book=phonebook.xml
echo | sed -n '/callerid=/p' /etc/asterisk/sip*.conf| sed s'/callerid=//'g | sed s'/</ /'g | sed s'/>//'g | sed s'/;//'g >> tmp.file
spisok=(`cat tmp.file`)
echo '<?xml version="1.0" encoding="UTF-8"?>' >> $book
echo "<AddressBook>" >> $book
while [ ${spisok[a]} ];do
cat <<EOF >>$book
    <Contact>
        <LastName>${spisok[a]}</LastName>
        <FirstName>${spisok[b]}</FirstName>
        <Phone>
            <phonenumber>${spisok[c]}</phonenumber>
            <accountindex>1</accountindex>
            <downloaded>0</downloaded>
        </Phone>
        <Groups>
            <groupid>2</groupid>
        </Groups>
    </Contact>
EOF
a=`expr $a + 3`
b=`expr $b + 3`
c=`expr $c + 3`
done
echo "</AddressBook>" >>$book
cp phonebook.xml /var/www/
rm tmp.file

Если путь к адресной книге прописан правильно, то после перезагрузки справочник будет подтянут на аппарат. Убедиться в этом можно будет нажав кнопку с телефонной книгой на корпусе телефона или в настройках через web интерфейс.

image

Но и этого мне было мало. Итак. Финальный аккорд.
Пожалуй единственным минусом аппарата можно назвать скудный выбор рингтонов. Всего три да и те какие-то страшненькие. Но! Рингтоны можно залить свои!
Описан способ для Linux. Уилита для Windows здесь.
Скачиваем и распаковываем утилиту

wget http://www.grandstream.com/tools/Ring_Tone_Generator/linux_music_ring_tone_gen.zip
unzip linux_music_ring_tone_gen.zip

Переименовываем sox.linux в просто sox и назначаем права

mv sox.linux sox
chmod 755 sox

Читаем readme.
./sox sound.wav ring1.ring
Все просто. На входе wav файл на выходе ring1.ring. Файлов может быть не более трех — ring1.ring, ring2.ring и ring3.ring соответственно. Размер не более 100 Кб, сами авторы рекомендуют не более 70Кб для каждого файла. Получившимся ring-ам необходимо поменять расширение на .bin и залить например туда же где и конфиг файлы.
Для заливки рингтонов в конфиг файле служит поле <P192>. Оно описывает путь к файлам обновления.
Все. Пускаем телефон в ребут и командой tail -f /var/log/apache/access.log смотрим чего происходит. Выглядеть будет примерно вот так.

192.168.0.16 -- [05/Nov/2013:17:15:52 +0400] "GET /language.txt HTTP/1.1" 404 480 "-" "Grandstream Model HW GXP1165 SW 1.0.5.26 DevId 000a91547c9c"
192.168.0.16 -- [05/Nov/2013:17:16:10 +0400] "GET /cfg000a91547c9c HTTP/1.0" 200 1787 "-" "Grandstream Model HW GXP1165 SW 1.0.5.26 DevId 000a91547c9c"
192.168.0.16 -- [05/Nov/2013:17:16:14 +0400] "GET /cfg000a91547c9c.xml HTTP/1.0" 200 1849 "-" "Grandstream Model HW GXP1165 SW 1.0.5.26 DevId 000a91547c9c"
192.168.0.16 -- [05/Nov/2013:17:16:32 +0400] "GET /gxp1160fw.bin HTTP/1.0" 404 537 "-" "Grandstream Model HW GXP1165 SW 1.0.5.26 DevId 000a91547c9c"
192.168.0.16 -- [05/Nov/2013:17:16:36 +0400] "GET /gxp1160fw.bin HTTP/1.0" 404 537 "-" "Grandstream Model HW GXP1165 SW 1.0.5.26 DevId 000a91547c9c"
192.168.0.16 -- [05/Nov/2013:17:16:38 +0400] "GET /ring1.bin HTTP/1.0" 200 65847 "-" "Grandstream Model HW GXP1165 SW 1.0.5.26 DevId 000a91547c9c"
192.168.0.16 -- [05/Nov/2013:17:16:39 +0400] "GET /ring2.bin HTTP/1.0" 200 39388 "-" "Grandstream Model HW GXP1165 SW 1.0.5.26 DevId 000a91547c9c"
192.168.0.16 -- [05/Nov/2013:17:16:42 +0400] "GET /ring3.bin HTTP/1.0" 404 533 "-" "Grandstream Model HW GXP1165 SW 1.0.5.26 DevId 000a91547c9c"

Автор: Bansher

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js