Задний план
Я привык перезагружать свои серверы по расписанию. Теперь я хочу то же самое для моего ADSL-роутера.
Это моя причина: когда происходит случайный сбой, я обычно пытаюсь перезагрузить серверы, интерфейсы и связанное оборудование (если возможно) в качестве первого шага перед любым другим устранением неполадок (например, изменение конфигурации и т. Д.). На самом деле бывают случаи, когда это решает проблему (служба начинает работать должным образом). Это может быть связано с тем, что, когда система находится в рабочем состоянии долгое время (иногда, в зависимости от программного обеспечения и служб), она может перестать отвечать или работать с ошибками. Возможно, программное обеспечение не может освободить часть памяти, разблокировать некоторые ресурсы и т. Д.
Теперь для некоторых служб, время простоя которых приемлемо в нерабочее время, я планирую автоматический перезапуск. Таким образом, проблемы такого типа возникают реже. И теперь, если проблема возникает в рабочее время, мне не нужно перезапускать всю службу, вместо этого я возобновлю устранение неполадок, как после того, как перезапустил их.
Что мы имеем
Это маршрутизатор серии Billion 5000, поддерживающий TELNET, HTTP и SNMP для управления.
Метод Telnet (обновлено)
Роутер можно перезагрузить с помощью команды telnet:
C:\>telnet 192.168.1.1
Password:********
router>set reboot
Так близко, просто нужен скрипт, который автоматически устанавливает телетайпы, вставляет символы пароля и выдает 'установить перезагрузкукоманда. [Подход использования ожидать предложено SvenW]
HTTP метод
Приятно отметить, что я использую программное обеспечение[1] для мониторинга скорости моего ADSL-соединения и запаса помехоустойчивости через HTTP-интерфейс (само программное обеспечение, а не приложение браузера, подключается, регистрируется автоматически и считывает значения из HTTP-интерфейса и отображает их на графике!).
Интересно, можно ли добиться SysRestart с помощью аналогичного подхода (сценарий, который автоматически входит в систему и нажимает кнопку SysRestart!)
Страница перезапуска:
Исходный HTML-код страницы:
<html><head>
<meta http-equiv=Content-Script-Type content=text/javascript>
<meta http-equiv=Content-Style-Type content=text/css>
<meta http-equiv=Content-Type content="text/html; charset=
iso-8859-1">
<link rel="stylesheet" href="../css/style.css" type="text/css">
<script language="JavaScript">
function doRefresh()
{
alert("Reboot Complete"); parent.navigation.location.href = "/navigation-status.html";
window.location.href = "../status/status_deviceinfo.htm";
}
function doLoad()
{
}
</script>
</head><body onload="doLoad()">
<FORM METHOD="POST" ACTION="/Forms/tools_system_1" name="System_Restore">
<table width="760" border="0" align=center cellpadding="0" cellspacing="0" bgcolor="#FFFFFF">
<tr>
<td height="5" class="light-orange" colspan="5"> </td></tr><tr>
<td width="150" height="30" class="title-main">
<font color="#FFFFFF">System Restart</font> </td><td width="10" class="black"> </td><td width="150"></td><td width="10"> </td><td width="440"></td></tr><tr>
<td class="light-orange"> </td><td class="light-orange"></td><td class="tabdata"><div align=right>
<font color="#000000">System Restart with</font> </div></td><td class="tabdata"><div align=center>:</div></td><td class="tabdata">
<INPUT TYPE="RADIO" NAME="restoreFlag" VALUE="0" CHECKED> <font color="#000000">Current Settings</font> </td></tr><tr>
<td class="light-orange"> </td><td class="light-orange"></td><td class="tabdata"> </td><td class="tabdata"> </td><td class="tabdata">
<INPUT TYPE="RADIO" NAME="restoreFlag" VALUE="1"> <font color="#000000">Factory Default Settings</font> </td></tr><tr>
<td class="light-orange"> </td><td class="light-orange"></td><td width="150"> </td><td width="10"> </td><td width="440"> </td></tr></table><table width="760" border="0" align=center cellpadding="0" cellspacing="0" bgcolor="#FFFFFF">
<tr>
<td width="160" class="black" height="42" > </td><td width="160" class="orange"> </td><td width="440" class="orange">
<INPUT TYPE="SUBMIT" NAME="Restart" VALUE="RESTART"> </td></tr></table></div></form>
</body></html>
Метод SNMP
Маршрутизатор также поддерживает сообщества чтения и записи SNMP v2. Я подумал, что можно было бы так сделать.
Фактически, поиском я нашел[2], что некоторые люди используют SNMP для перезапуска своих устройств (но я не могу найти OID, который мой маршрутизатор мог бы передать для выполнения сброса)
Например, похоже, что те, у кого есть одно из этих устройств, могут перезагрузить их, используя эти OID:
'.1.3.6.1.4.1.207.8.4.4.3.2.0', # Allied Telesyn restart
'.1.3.6.1.4.1.11.2.14.11.1.4.1.0', # Hewlett-Packard hpicfReset
'.1.3.6.1.4.1.9.5.1.1.9.0', # Cisco CatOS sysReset
'.1.3.6.1.4.1.9.2.9.9.0', # Cisco IOS tsMsgSend
'.1.3.6.1.4.1.529.9.8.0.0' # Ascend sysReset
SNMP Walk
Используя SNMP walk, я смог получить список из более чем пятисот OID, таких как:
.1.3.6.1.4.1.16972.5.1.1.0
.1.3.6.1.4.1.16972.4.10.0
...etc (568 more)...
Но в настоящее время я не знаю, как мне выбрать один из них (особенно боялся тестировать на них snmp-write!).
Дополнительная информация
Некоторые другие (пройденные) OID и значения, которые могут помочь:
.1.3.6.1.4.1.16972.1.3.0; Trendchip TC3162 T14F7_3.0
.1.3.6.1.4.1.16972.5.1.1.0; www.huawei.com
.1.3.6.1.4.1.16972.1.6.0; Ras Ver:2.10.4.0(UE0.C2C)3.6.0.0 DMT Ver:3.6.0.0
Как ты можешь помочь?
Сноски:
Без надлежащего файла MIB для SNMP лучше всего найти команду telnet, которая выполняет перезапуск, и, возможно, использовать ее с помощью expect
инструмент или использовать что-то вроде curl
использовать веб-интерфейс.
Использование curl может потребовать нескольких вызовов для первого входа в систему и сохранения файлов cookie сеанса, а затем для фактического перезапуска.
Мне все же интересно - есть ли у вас настоящая проблема с устройством, которое вы пытаетесь исправить с помощью обычного перезапуска? Если нет, то я не вижу причин для этого.
Редактировать:
Базовый пример сценария ожидания. Назовите это с scriptname hostname password
или измените назначения переменных, чтобы они содержали фактическое имя хоста и пароль:
#!/usr/bin/expect
set timeout 15
set hostname [lindex $argv 0]
set password [lindex $argv 1]
spawn telnet $hostname
expect "Password:"
send "$password "
expect "router>"
send "set reboot "