Здравствуйте, читатели!
Недавно в компании, в которой я работаю, было принято решение о переходе на 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, и, поплевывая, наблюдать как весело моргают индикаторами ТА на столах сотрудников при перезагрузке.
Вместо заключения
Вот так в очередной раз, при помощи палок и синей изоленты мы автоматизировали еще одно внедрение, которое по мнению производителя и автоматизировать-то не нужно. Честно говоря непонятно, почему многие вендоры не предоставляют средств быстрого массового деплоя своих устройств. Буду чертовски счастлив, если наше решение облегчит жизнь кому-то еще. По большому счету, такую технологию можно применять и к другим устройствам, но скрипты придется либо сильно дорабатывать напильником, либо вообще — писать собственные, но в любом случае технология должна быть понятна.
Ну и как сказал бы Нолик
Автор: zorgzerg