Как перезагрузить VOIP шлюз из консоли

Posted by

В подконтрольной инфраструктуре всегда имеются устройства которым просто необходима стандартная перезагрузка (профилактика), от длительной работы они начинаю подтупливать, терять соединения (в моем случае это с облачной АТС Манго, либо Asterisk(FreePBX)). Так исторически сложилось, что организация до сих пор использует аналоговые и цифровые VOIP аппараты и их большое множество:

на одной площадке:

на другой площадке чуточку меньше, но все же:

  • GrandStream GP715 — 3шт
  • DVG-5008SG — 4шт
  • DVG-5004S — 1шт

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

telnet и посредством встроенных команд (а они есть как правило) перезагрузить устройство. Но даже заходить на каждый аппарат так не комильфо, поэтому этим делом перезагрузки устройств займется система .5 Server amd64 с любым сервисом, мне лишь потребуется написать достаточно простые скрипты и поставить их в планировщик на необходимый период запуска.

Первым делом приводим все устройства GrandStream GP715 к единому паролю который знаете только Вы или единый который у Вас заведено назначен на оборудование. Да процесс однообразный но сделать это придется лишь один раз задействовав Web-интерфейс обращения к VOIP устройству.

Далее на системе Ubuntu 12.04.5 устанавливаем из дефолтных репозитариев следующую утилиту:

ekzorchik@srv-mon:~$ apt-cache search -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.

2 комментария

  1. Здравствуйте. Ваш скрипт отлично отработал, огромное спасибо!
    Есть устройство DVG5004S и регулярно на нем отваливается соединение с провайдером. Как сделать так, чтобы скрипт проверял состояние соединения по запросу current_status и по получению ответа Current_Status OK скрипт завершался, а при получении отличного от него ответа запускал перезагрузку?

    1. Хорошо что помогло. Я что за Вас буду решать Вашу задачу, Вы же системный администратор так и ищите решение.

Leave a Reply

Ваш e-mail не будет опубликован. Обязательные поля помечены *

восемь − 2 =