Как за два дня установить 80 новых IP-телефонов или история одного костыля

в 3:39, , рубрики: bash, curl, escene, ip-телефония, linux, voip, костыль, системное администрирование, системные извращения, трэш, угар, чад

Здравствуйте, читатели!
Недавно в компании, в которой я работаю, было принято решение о переходе на VoIP-телефонию, чтобы связать наконец-то наши многочисленные офисы в единую телефонную сеть. В качестве SIP-сервера был выбран очень интересный продукт Communigate Pro. Долго определялись с абонентскими устройствами, одним из основных критериев, при выборе ТА, было наличие встроенного гигабитного свитча. В итоге выбор пал на телефонные аппараты (далее ТА) ESCENE GS330-PEN. Все бы ничего, но произошло страшное — подвел поставщик, поэтому внедрение сервиса перенеслось почти на пол года. Когда партия телефонов наконец была получена, нам был установлен жесткий дедлайн. Тут-то и возник вопрос: как быстро сконфигурировать и расставить на рабочих местах 80 ТА. Под катом вас ожидает несколько скриптов и алгоритм действий

Прикладная археология

Мы быстро прикинули, что на распаковку, подключение и конфигурирование одного ТА уходит около 30 минут, таким образом на всю работу придется потратить 5 человекодней, и это еще не считая времени, необходимое на то, чтобы дойти до конкретного рабочего места и подключить устройство. Такой роскоши мы себе не могли позволить, что заставило нас придумывать способ автоматизировать процесс. GS330, как любой приличный IP-телефон, имеет на борту WEB-консоль, и возможность подключения по telnet. «Под капотом» оказался, как не трудно догадаться, linux, что обнадеживало: уж линуксов то навидались всяких. Серфинг по каталогам показал, что в /mnt лежит пара интересных каталогов: sip и system — и в /mnt/sip таки было найдено искомое — конфиг, который представляет собой XML-файл ESConfig.xml, со всеми настройками, в том числе и персональными да еще и в UTF8 кодировке. Ну что может быть прекраснее?! Кстати, уже позже сообразил, что можно было просто сделать резервную копию настроек в WEB-консоли.

Автоматизируй это

В общем что делать стало понятно, остался вопрос «как?». Настроив один ТА, и убедившись в его работоспособности, мы получили эталонный конфиг, в котором оставалось только заменить следующее

  • Метку (строка, которая выводится напротив конфигурируемой линии)
  • Номер пользователя (номер является цифровым алиасом для учетной записи пользователя)
  • Имя пользователя
  • Пароль

Некогда было выдумывать изящные решения, поэтому в эталонном конфиге просто заменили эти сущности на _TELNUM_, _SIPPASSWD_, _REALNAME_. Кстати, в качестве метки выступает так же номер телефона, поэтому и _TELNUM_ используем дважды.

Дальше — дело техники. Призвав excel сформировали CSV файл (TAB в качестве разделителя) с данными пользователей, в таком виде: IP-адрес, номер телефона, пароль, реальное имя пользователя. Как видите, было принято решение закрепить за каждым пользователем определенный IP-адрес.

Дело за малым — скрипт, который подготовит нам N конфигурационных файлов, вот он:

$ cat ./genconf

#!/bin/sh

OIFS="$IFS"
IFS='   '

cat $1|while read ipaddr telnum sippasswd realname do
    cat ./ESConfig.tmpl | sed 's/_TELNUM_/'$telnum'/g'|sed 's/_SIPPASSWD_/'$sippasswd'/g'|sed 's/_REALNAME_/'$realname'/g'> ./confs/$ipaddr.xml
done

IFS="$OIFS"

запускаем его, в параметре указывая имя CSV-файла с данными пользователей

$ ./genconf ./users.csv

после чего в папке confs появится куча конфигов вида ipaddr.xml

Резервируй это

ТА из коробки настроены на получение IP-адреса от DHCP сервера, что для нас в условиях жесткого цейтнота явилось несомненным благом. Памятуя о том, что мы решили закрепить за каждым пользователем свой IP-адрес, логично будет создать в DHCP резервирования для каждого ТА, надо только не забыть собрать все MAC-адреса устройств в один файл, и снова с разделителями. Файл будет такого вида telnumber,ip_addr,mac_addr. Мы используем Active Directory, и DHCP у нас тоже на виндовом сервере. Выяснилась внезапная но неприятная вещь — в MMC оснастке не нашлось функции импорта, поэтому пришлось использовать инфернальное детище скриптовые средства Windows:

@echo off

for /f "delims=, tokens=1,2,3" %%i in (mac.csv) do (
	netsh dhcp server \192.168.1.8 Scope 192.168.255.0 Add reservedip %%j %%k "T%%i" "DHCP"
)

IP-адрес DHCP-сервера, конечно, нужно подставить ваш собственный.

Летите, голуби, летите!

Все готово, осталось только разослать конфигурационные файлы по своим ТА. Используем немного магии и средства WEB-разработчика из Google Chrome. Потыкав в WEB-консольке ТА, и почитав исходники генерируемых страниц, были выяснены URL-ы, на которые посылаются запросы при аплоаде конфигов и при перезагрузке (к сожалению конфиг без перезагрузки применяется только частично). В итоге родился следующий скрипт (я разместил его в /opt/VoIP):

#!/bin/sh

cd /opt/VoIP
confs="./confs"         # path to confs directory

echo `date +"%d/%m/%y %H:%M:%S: "` "Sending confs">>/var/log/sendconf.log

for file in `ls $confs`;
do
    ipaddr=${file%.*}

    if ping -W 1 -c 1 $ipaddr > /dev/null; # Availability check
    then
        reply=`curl --user root:root --form binary=@$confs/$file --form httploadConfig=OK http://$ipaddr/goform/upldForm_Config`

        if echo $reply | grep --quiet netchanged_reboot.asp ; then
            curl --user root:Pa$$w0rd --form RebootNOW=OK http://$ipaddr/goform/Reboot
            rm $confs/$file
            echo `date +"%d/%m/%y %H:%M:%S: "` "$ipaddr.xml is deleted">>/var/log/sendconf.log
        else
            echo `date +"%d/%m/%y %H:%M:%S: "` "New configuration is not upload to $ipaddr">>/var/log/sendconf.log
        fi
    else
        echo `date +"%d/%m/%y %H:%M:%S: "` "Host is unreachable">>/dev/null
    fi
done

echo `date +"%d/%m/%y %H:%M:%S: "` "-----">>/var/log/sendconf.log

Для пущей няшности заставим работать скрипт по cron-у, каждые три минуты:

*/3     *       * * *   root    /opt/VoIP/sendconf

Думаю здесь надо дать пару комментариев. Скрипт читает содержимое каталога ./confs и вычленяет из названия файлов IP-адрес, на который нужно передавать XML-ку. Для передачи будем использовать curl, предварительно проверяя ТА на доступность пингом. Обратите внимание, что при посылке конфига для авторизации используется пара root:root — это заводские значения, и если аплоад прошел успешно, то отправляем ТА в перезагрузку, но для авторизации уже используем новый пароль root:Pa$$w0rd — эта настройка применяется сразу (Pa$$w0rd — это пароль, который у нас уже содержится в эталонном конфиге). Для отлавливания багов и чтобы совсем было труъ добавили логирование основных этапов в /var/log/sendconf. Остается перезапустить cron, и, поплевывая, наблюдать как весело моргают индикаторами ТА на столах сотрудников при перезагрузке.

Вместо заключения

Вот так в очередной раз, при помощи палок и синей изоленты мы автоматизировали еще одно внедрение, которое по мнению производителя и автоматизировать-то не нужно. Честно говоря непонятно, почему многие вендоры не предоставляют средств быстрого массового деплоя своих устройств. Буду чертовски счастлив, если наше решение облегчит жизнь кому-то еще. По большому счету, такую технологию можно применять и к другим устройствам, но скрипты придется либо сильно дорабатывать напильником, либо вообще — писать собственные, но в любом случае технология должна быть понятна.

Ну и как сказал бы Нолик
image

Автор: zorgzerg

Источник

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


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