В подконтрольной инфраструктуре всегда имеются устройства которым просто необходима стандартная перезагрузка (профилактика), от длительной работы они начинаю подтупливать, терять соединения (в моем случае это с облачной АТС Манго, либо Asterisk(FreePBX)). Так исторически сложилось, что организация до сих пор использует аналоговые и цифровые VOIP аппараты и их большое множество:
на одной площадке:
- GrandStream GP715 — 10шт
- D-Link DVG-5008SG — 2шт
- D-Link DVG-2024S = 2шт
на другой площадке чуточку меньше, но все же:
- GrandStream GP715 — 3шт
- DVG-5008SG — 4шт
- DVG-5004S — 1шт
и заходить на каждый VOIP аппарат и перезагружать в ручную его через Web-интерфейс, то еще дело, даже я бы сказал шаблонная монотонная работа. Внимательное изучение документации по ним натолкнуло меня на возможность зайти на них через
telnet и посредством встроенных команд (а они есть как правило) перезагрузить устройство. Но даже заходить на каждый аппарат так не комильфо, поэтому этим делом перезагрузки устройств займется система Ubuntu 12.04.5 Server amd64 с любым сервисом, мне лишь потребуется написать достаточно простые скрипты и поставить их в планировщик на необходимый период запуска.
Первым делом приводим все устройства GrandStream GP715 к единому паролю который знаете только Вы или единый который у Вас заведено назначен на оборудование. Да процесс однообразный но сделать это придется лишь один раз задействовав Web-интерфейс обращения к VOIP устройству.
Далее на системе Ubuntu 12.04.5 устанавливаем из дефолтных репозитариев следующую утилиту:
ekzorchik@srv-mon:~$ apt-cache search expect-lite
expect-lite – a quick and easy command line automation tool
ekzorchik@srv-mon:~$ sudo apt-get install expect-lite -y
Теперь когда утилита expect установлена произведу тестовое подключение к базовой станции 172.20.20.52 и перезагружу ее:
ekzorchik@srv-mon:~$ telnet 172.20.20.52
Trying 172.20.20.52…
Connected to 172.20.20.52.
Escape character is ‘^]’.
Grandstream DP715 Command Shell Copyright 2006-2014
Password: 712mbddr
GS> help
Supported commands:
config — Configure the device
status — Show device status
upgrade — Upgrade the device
reboot — Reboot the device
reset 0 — Factory reset
reset 1 — ISP Data reset
reset 2 — VOIP Data reset
help — Show this help text
exit — Exit this command shell
GS> status
Product Model: DP715
MAC Address: 00:0b:82:ХХ:ХХ:ХХ
Network:
IP Address — 172.20.20.52
Netmask — 255.255.255.0
Gateway — <GW>
DNS Server — <DNS-server№1>
DNS Server — <DNS-server№2>
Hardware Version: V1.2A Part Number — 961000ХХХХ
DECT: eu
Software Versions:
Program — 1.0.0.29
Boot — 1.0.0.1
Core — 1.0.0.5
Base — 1.0.0.17
Port Status:
Port 1: On Hook Registered
Port 2: On Hook Registered
Port 3: On Hook Not Registered
Port 4: On Hook Not Registered
Port 5: On Hook Registered
System uptime: 909
System load: 0.00, 0.03, 0.05
Memory Usage: 29556736/12079104/0/2371584
из вывода видно информацию по данному аппарату это так для ознакомления, теперь сделаю перезагрузку:
GS> reboot
Rebooting…
Connection closed by foreign host.
Как видно выше все просто, да и также просто автоматизировать данную последовательность, как перезагрузка устройства, делается это так:
(Создаю каталог где будут располагать скрипты)
ekzorchik@srv-mon:~$ sudo mkdir /etc/voip
ekzorchik@srv-mon:~$ sudo nano /etc/voip/gg715_52
#!/bin/bash
/usr/bin/expect - <<EOD
set timeout 10
spawn telnet 172.20.20.52
sleep 2
expect "Password:*"
sleep 2
send "712mbddr\r"
expect "GS>*"
send "reboot\r"
sleep 1
send "exit\r"
expect eof
EOD
echo "Base Station Grandstream GP715 - 172.20.20.52 Rebooting"
ekzorchik@srv-mon:~$ sudo chmod +x /etc/voip/gg715_52
Запускаю созданный скрипт с целью проверки:
ekzorchik@srv-mon:~$ sh /etc/voip/gg715_52
spawn telnet 172.20.20.52
Trying 172.20.20.52…
Connected to 172.20.20.52.
Escape character is ‘^]’.
Grandstream DP715 Command Shell Copyright 2006-2014
Password: 712mbddr
GS> reboot
Base Station Grandstream GP715 – 172.20.20.52 Rebooting
(устройство успешно перезагрузилось, мониторинг Zabbix тут не дремлет и радостно так сообщает мне уведомлением на почту)
Теперь по аналогии проделываю для VOIP шлюза: DVG-5008SG & DVG-2024S (синтаксис у них одинаковый):
ekzorchik@srv-mon:~$ sudo nano /etc/voip/dvg5008sg_20
#!/bin/bash
/usr/bin/expect -<<EOD
set timeout 10
spawn telnet 172.20.20.20
sleep 2
expect "User:*"
sleep 2
send "\r"
expect "Password:*"
sleep 2
send "\r"
expect ">*"
sleep 4
send "pwd\r"
sleep 2
send "bye\r"
sleep 2
expect "Disconnect Now? (Y/N):*"
sleep 2
send "y\r"
expect eof
EOD
echo "Base Station D-Link DWG-5008SG 172.20.20.20 Rebooting"
На заметку: если уже кто-то подключен через telnet к VOIP-шлюзу (D-Link серии) то зайти скриптом не получится, соединение будет просто висеть:
aollo@system:~> telnet 172.20.20.20
Trying 172.20.20.20…
Connected to 172.20.20.20.
Escape character is ‘^]’. – висит соединение, если другое соединение разорвется, то это успешно произведет подключение:
<< Command Line Interface V 3.6.3.0 >>
User:
Password:
<< Command Line Interface V 3.6.3.0 >>
Enter HELP for usage
[[/]]
> я успешно подключился.
На заметку: pwd заменяем на reboot, а bye и все что ниже до eof убираем.
На заметку: в части VOIP шлюза у меня вообще не используется пароль потому такой скрипт выше.
ekzorchik@srv-mon:~$ sudo chmod +x /etc/voip/dvg5008sg_20
Теперь с учетом моих VOIP устройств множу конфигурационные файлы заменяя лишь конечный октет IP адреса.
Далее нужно настроить задание на запуск подготовленных скриптов:
ekzorchik@srv-mon:~$ sudo crontab -e
# m h dom mon dow command
45 14 * * * /etc/voip/gg715_52 > /dev/null
Ожидаю и случилось следующее, позвонили мне на трубку c КоллЦентра, подключена к данной базовой станции, мол хотят с тобой поговорить на предметр взаимовыгодного сотрудничества, ну ладно соединяйте может чего нового узнаю (достали спамеры услуг). В итоге в трубке слышу гудки как будто она не видит базовую станцию и обращаю я тут внимание на время и понимаю, что как раз подкралась 45 минута — скрипт успешно отработал, базовая станция ушла в ребут.
Время же нужно в Вашем случае выбрать такое когда перезапуск базовый станций не приведет к простою работы сотрудников предприятия, допустим глубокой ночью или по воскресеньям — все зависит от графика работы офиса.
Еще допустим, Вы просто хотите вот прям сейчас перезагрузить несколько станций — сделать это можно следующим скриптом:
#!/bin/bash
echo "Base Grandstream"
echo "50,51,52,53,54,55,56,57,58,59"
echo "Pervaya Plotschadka"
while [ 1 ]
do
read -p "Enter BaseStation Grandstream: 172.20.20.*: " HOST
/usr/bin/expect -<<EOD
set timeout 2
spawn telnet 172.20.20.$HOST
sleep 2
expect "Password:*"
sleep 2
send "admin\r"
expect "GS>*"
send "reboot\r"
sleep 1
send "exit\r"
expect eof
EOD
echo "Base Station Rebooting"
done
Скрипт будет поочередно запрашивать ввод последнего октета IP адреса и проводить манипуляцию по перезагрузки, но он только для Grandream, для D-Link его необходимо переделать, может кто сильно дружит с bash’ем сможет скомбинировать две части expect в один большой интерактивно универсальный, я же пока свой вариант костыля не буду выкладывать. И так поставленная задача этой заметки выполнена пора прощаться, до новых встреч, с уваженим автор блога — ekzorchik.
Здравствуйте. Ваш скрипт отлично отработал, огромное спасибо!
Есть устройство DVG5004S и регулярно на нем отваливается соединение с провайдером. Как сделать так, чтобы скрипт проверял состояние соединения по запросу current_status и по получению ответа Current_Status OK скрипт завершался, а при получении отличного от него ответа запускал перезагрузку?
Хорошо что помогло. Я что за Вас буду решать Вашу задачу, Вы же системный администратор так и ищите решение.