Pull to refresh

Если гора не идет к Магомеду… Как поддержать активным ADSL соединение у криворукого провайдера

Reading time2 min
Views1K
Так случилось, что переговоры с провайдером о том, что соединение иногда пропадает, и ADSL модем сей факт не замечает, ни к чему не привели. Пришлось искать другие пути.

Задача: Програмным путем перезапускать ADSL модем при пропадании соединения, чтобы форсировать переустановку PPPoE сессии.

Приведенное ниже решение опробовано на ADSL модеме D-link DSL 2640U, но думаю может быть легко адаптировано для любых иных моделей ADSL модемов.



Итак, решение — php скрипт, который каждые 5 минут проверяет наличие соединения пингуя сайт провайдера.
Если пинг отсутствует — посылаем ADSL модему команду перезагрузки.

Средствами Windows XP достаточно проблематично запускать скрипт каждые 5 минут. Поэтому в качестве System Sheduler'а был использован бесплатный System Scheduler компании Splinterware.

Для простоты предположим, что на компьютере установлен denwer и все файлы расположены в Z:\home\inet-keeper\www\

Решение:
В указанной выше директории располагаем

1) файл inet-keeper.bat, который запускается каждые 5 минут из System Scheduler
файл inet-keeper.bat запускает одноименный php скрипт:
z:\usr\bin\php -n -f inet-keeper.php >> inet-keeper.log


2) файл inet-keeper.php
содержание файла inet-keeper.php:
<?php
set_time_limit(60*5);

$res = exec("ping google.com -n 10", $output, $var);
$output = date('r');
$output .= " ## Ping result: $var"; // 0-ОК 1-Error
$output .= " ## $res";
if ($var || substr_count($res, '= 0ms') == 3) // In case like Minimum = 0ms, Maximum = 0ms, Average = 0ms
{
$error = true;
$output .= " ## Error detected!";
$output .= "\nRebooting modem...\n";
reboot_modem();
}
$output .= "\n";

if ($error) // or true)
echo $output;

function reboot_modem()
{
$log = send_request("getlog");
file_put_contents("logs\\" . date('Y-M-d_H-i-s') . ".html" ,$log);
send_request("reboot");
}

function send_request($r) {
$login = "admin";
$password = "admin";
$auth = base64_encode($login . ":" . $password);
$fp = fsockopen('192.168.1.1', 80, $errno, $errstr, 60);
if ($fp)
{
switch ($r) {
case "reboot":
$out = "GET /rebootinfo.cgi HTTP/1.0\r\n";
break;
case "getlog":
$out = "GET /logview.cmd HTTP/1.0\r\n";
break;
default:
return;
}
$out .= "Host: 192.168.1.1\r\n";
$out .= "Authorization: Basic $auth\r\n";
$out .= "Connection: Close\r\n\r\n";
// посылаем запрос
fwrite($fp, $out);
$html = "";

while (!feof($fp)){
$part=fgets($fp);
$html.=$part;
}
fclose($fp);
}
return $html;
}
?>


В случае, если сайт провайдера (в приведеноом примере google.com) перестанет пинговаться, скрипт запускает модем на перезагрузку, открывая страницу 192.168.1.1/rebootinfo.cgi

Поскольку модем требует авторизации, в функции send_request есть строки, задающие логин и пароль
$login = "admin";
$password = "admin";


При перезегрузке модема будет
1) запись об этом в файле inet-keeper.log
2) в подкаталоке log содержимое страницы системного лога модема (в моём случае — содержимое страницы 192.168.1.1/logview.cmd)
Tags:
Hubs:
+7
Comments41

Articles

Change theme settings