Танцы С Роутером Dlink

Как же раздражают эти постоянные перебои с интернетом Укртелекома.

С линией вроде все в порядке, и роутер настроен правильно, но интернет отказывается работать стабильно.

Все было бы хорошо, если бы это не отразилось на моей непосредственной работе.

Я фрилансер, а это значит, что я проснулся и уже на работе.

То есть любые незапланированные сбои (в моем городе бывают и плановые сбои) мягко говоря не очень радуют и влияют на производительность.

Ну да ладно, не буду ныть - перейдем к делу.

Во время очередного удара моего роутера я решил автоматизировать процесс его перезагрузки, что обычно приводит к подключению ppp-соединения.

Я написал сценарий bash, который подключается к моему DLink, входит в систему и запрашивает файл restartinfo.cgi. Весь этот процесс удачно помещается в цикл «пока нет интернета», и соответственно я перемещаюсь на кухню пить чай.

Это просто.

Вим в руки — и поехали:

 
 #!/bin/bash
 host=${host:="4.2.2.2"}
 router_ip="192.168.1.1"
 router_reboot_path="/rebootinfo.cgi"
 router_user="admin"
 router_pw="pw_here"
 num_packets=4
 receiving=""
 reboots=1
 connect_wait=60
 while [ "$receiving" == "" ]
 do
         echo -ne `date +%T`"\t"
         echo "pinging $host with $num_packets packets"
         receiving=`ping $host -c $num_packets | grep "$num_packets received"`
         if [ "$receiving" != "" ]
         then
                 echo -ne `date +%T`"\t"
                 echo "$host is alive"
         else
                 echo -ne `date +%T`"\t"
                 echo "$host not responding"
                 echo -ne `date +%T`"\t"
                 echo -n "reboot router - attempt $reboots"
                 let "reboots += 1"
                 `curl -s -u $router_user:$router_pw " http://$router_ip$router_reboot_path " > /dev/null`
                 sleep 10
                 routerAlive=""
                 while [ "$routerAlive" == "" ]
                 do
                         routerAlive=`ping $router_ip -c $num_packets | grep "$num_packets received"`
                         if [ "$routerAlive" != "" ]
                         then
                                 echo "done. "
                                 echo -ne `date +%T`"\t"
                                 echo -n "waiting $connect_wait sec for possible connect"
                                 sec=0
                                 while [ "$sec" != $connect_wait ]
                                 do
                                         let "sec += 1"
                                         if [ "$sec" == $connect_wait ]
                                         then
                                                 echo ".

" else echo -n ".

" fi sleep 1 done else echo -n ".

" fi done fi done

Примерный результат:
 
 $ .

/routerReboot 23:25:48 pinging 4.2.2.2 with 4 packets 23:26:01 4.2.2.2 not responding 23:26:01 reboot router - attempt 1.done. 23:27:10 waiting 60 sec for possible connect. 23:28:11 pinging 4.2.2.2 with 4 packets 23:28:14 4.2.2.2 is alive

Правда, в bash пришлось разбираться без гугла — я сам в этом плохо разбираюсь, поэтому искал скрипты в /usr/lib, чтобы в качестве примера прочитать мануал.

В итоге скрипт заработал (хотя интернет появился быстрее :).

Через некоторое время мне это очень пригодилось.

Да, 4.2.2.2 - все время пингуется, поэтому вместо него можно использовать ya.ru. Кроме того, вы можете использовать его для проверки DNS. Счастливой пятницы! Теги: #Укртелеком #bash программирование #dlink #Чулан #потеря связи

Вместе с данным постом часто просматривают: