Как все мы читали в новостях. с летним/зимним временем ожидается полный бардак.
Имея базу коммутаторов в количестве несколько тысяч, ручками не чень то и поменяешь им конфиги.
Потому был придумал вот такой велосипед.
Кстати, данный ввелосипед подходит не болько для настройки времени, но и для чего угодно, что настраивается через SNMP
Итак.
Имеем:
1. несколько тысяч коммутаторов (У меня dlink) примерно одно серии. А именно:
DES-1228/ME
DES-3200
DES-3526
DES-3010G
Данные коммутаторы имеют одинаковые oid для настройки времени, потому и программировать мы их будем пачками по 253 штуки за раз.
Подсети:
Неважно. пусть будет: 172.16.0.0/24
Подсеть размера /24 отрабатывалась в течении 5 минут, а так как наш скрипт будет на .php надо перенастроить сервер, чтоб он не дропал скрипт через 30 секунд или уменьшить размер отрабатываемой за раз подсети.
итак, наш конфиг (config.php):
<?
$startip = "172.16.0.2";
$endip = "172.16.0.254";
$ntp1 = "172.16.0.1";
$ntp2 = "172.16.0.1";
$gmt = "540";
$interval = "86400";
$community = "private";
$dissummertime = ".1.3.6.1.4.1.171.12.10.12.1.0"; //i
$enantp = ".1.3.6.1.4.1.171.12.10.11.1.0"; //i
$ntpupdateoid = ".1.3.6.1.4.1.171.12.10.11.5.0"; //i
$ntp1oid = ".1.3.6.1.4.1.171.12.10.11.3.0"; //a>
$ntp2oid = ".1.3.6.1.4.1.171.12.10.11.4.0"; //a
$gmtoid = ".1.3.6.1.4.1.171.12.10.10.4.0"; //i
$saveconfig = "";
?>
РАзберемся по пунктам:
$startip — НАчало нашего IP диапазона коммутаторов;
$endip — Последний коммутатор в диапазоне;
$ntp1 — Сервер синхронизации времени в вашей сети, доступный коммутаторам;
$ntp2 — Второй сервер синхронизации времени в вашей сети, доступный коммутаторам;
$gmt — Сдвиг часового пояса, у меня это +9, а значит я вписал 9*60*60=540;
$interval — Период, через который коммутаторы будут обновлять свое время. Дефолтное значение 720, я поставил раз в сутки: 60*60*24=86400;
$community — пароль коммунити с правами записи.
Теперь сам скрипт (ntp.php):
<?.
// Подгружаем конфиг
include_once('config.php');
// Превращаем IP адреса в число для того, чтоб запихать в цикл
$ip = ip2long($startip);
$ip2 = ip2long($endip);
// начинаем цикл перебора IP адресов
for($ip;$ip <= $ip2; $ip++)
{
// Превращаем значение IP в привычную нам форму xxx.xxx.xxx.xxx для того, чтобы отправить на него snmp комманду и вывести на экран в читабельном виде
$ipdec = long2ip($ip);
// проверяем доступность коммутатора открытием сокета на 80 порт
$fp = @fsockopen ($ipdec, "80", $errno, $errstr, 2);
// Если коммутатор не доступен, выводим на экран текст по шаблону: IP - Error - Текст ошибки (номер ошибки)
if (!$fp) {
echo $ipdec." - Error - $errstr ($errno)<br />";
// иначе отправляем на него snmp коммманду
} else {
// Выключаем летнее время
snmpset($ipdec, $community, $dissummertime, "i", "0");
// Включаем синхронизацию времени по ntp
snmpset($ipdec, $community, $enantp, "i", "3");
// Указываем интервал синхронизации времени
snmpset($ipdec, $community, $ntpupdateoid, "i", $interval);
// Указываем адрес первого ntp сервера
snmpset($ipdec, $community, $ntp1oid, "a", $ntp1);
// Указываем адрес второго ntp сервера
snmpset($ipdec, $community, $ntp2oid, "a", $ntp2);
// Указываем сдвиг часового пояса
snmpset($ipdec, $community, $gmtoid, "i", $gmt);
// Выводим на экран сообщение по шаблону: IP - OKe
echo $ipdec." - OKe<br />";
}
}
?>
После отправки данных значений на первый пул адресов можно в конфиге поменять пул на следующий и заного запустить скрипт.
Минусы скрипта:
1. Нужно открывать тело скрипта для изменения пула адресов.
В принципе можно сделать поле ввода.
2. У меня IP коммутаторов лежат в базе данных ERP, потому скрипт будет брать их от туда, чтобы можно было исключить пустые адреса.
3. Скрипт не отправляет команду на сохранение конфига коммутатора, т.е. после ребута (отключения электричества) данные настройки не сохранятся. Исправить эту ошибку остается Вам домашним заданием. Т.е. нужно найти oid сохранения конфиги и добавить строчку snmtset в тело скрипта.
Ну и как следует писать приличным людям: Метод не претендует на оригинальность и можете пользоваться им как хотите и на свой страх и риск.
P.S. для сохранения конфига нужно отпраивть строку: .1.3.6.1.4.1.171.12.1.2.6.0 i 2
Автор: DrDiza