Удалённое управление питанием большого количества устройств

()

Очень часто возникает необходимость управлять питанием большого количества устройств. Например в лабораториях или в дата-центрах. Для удалённого управления питанием можно использовать устройства NetPing PWR220 v2, о которых мы уже писали ранее или подобные им.

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

Решать задачу мы будем на примере большого количества устройств NetPing PWR220 v2. При решении задачи будем опираться на то, что выбранные устройства поддерживают управление по SNMP. Напишем несложный скрипт на PHP, который легко настраивается и может работать на любом веб-сервере с поддержкой PHP, и включенной в PHP поддержкой PCRE и SNMP.

Мы не будем останавливаться на деталях работы скрипта, поскольку он достаточно прост и разобраться в нём сможет даже не очень опытный программист. Просто приведём его листинг:

<?php
/*
 * Скрипт для управления устройствами NetPing Power220 (http://netping.ru)
 * Для работы скрита требуется PHP версии не ниже 4.3, собранный с поддержкой PCRE и SNMP
 */
?>
<html>
<head>
<title>NetPing Power220 Control Script</title>
</head>
<body bgcolor="#444444" text="#BBBBBB" link="#FFFFFF" alink="#FFFFFF" vlink="#FFFFFF">
<table cellspacing=0 cellpadding=5 border=1>
<tr>
        <th>Description</th>
        <th>Status</th>
        <th>Control</th>
</tr>
<?php
/*
 * Массив ключей.
 * В качестве ключа массива нужно указать уникальный идентификатор ключа внутри скрипта.
 * Каждый элемент содержит следующие параметры:
 * description - описание ключа
 * host - адрес устройства
 * community - SNMP Community
 * oid - OID, используемый для управления этим сенсором
 */
$keys = array(
        'sensor_01' => array(
                'description' => 'Power 01_1',
                'host' => '192.168.3.9',
                'community' => 'SWITCH',
                'oid' => '1.3.6.1.4.1.25728.52.1.5801.1.2',
        ),
        'sensor_02' => array(
                'description' => 'Power 01_2',
                'host' => '192.168.3.9',
                'community' => 'SWITCH',
                'oid' => '1.3.6.1.4.1.25728.52.1.5801.2.2',
        ),
        'sensor_03' => array(
                'description' => 'Power 02_1',
                'host' => '192.168.3.10',
                'community' => 'SWITCH',
                'oid' => '1.3.6.1.4.1.25728.52.1.5801.1.2',
        ),
        'sensor_04' => array(
                'description' => 'Power 02_2',
                'host' => '192.168.3.10',
                'community' => 'SWITCH',
                'oid' => '1.3.6.1.4.1.25728.52.1.5801.2.2',
        )
);

// Отключаем вывод сообщений об ошибках
error_reporting(0);

// Если нужно выполнить какое-то действие
if (isset($_POST['action'])) {
        // Получаем действие, которое нужно выполнить
        $action = $_POST['action'];
        // Получаем идентификатор ключа
        $key_id = $_POST['key'];
        // Детальная информация о ключе
        $key = $keys[$key_id];
        
        // Новое состояние ключа:
        $new_status = $action == 'on' ? 1 : 0;
        
        // Устанавлием новое значение
        snmpset($key['host'], $key['community'], $key['oid'], 'i', $new_status);
}


// Имя скрипта
$scriptname = $_SERVER['PHP_SELF'];

// Перебираем ключи
foreach (array_keys($keys) as $key_id) {
        // ПОлучаем детальную информацию о ключе
        $key = $keys[$key_id];
        
        // Получаем состояние Ключа
        $status = snmpget($key['host'], $key['community'], $key['oid']);
        
        // В $status содержится строка вида "INTEGER: 0". Нужно извлечь отсюда число
        // Функция intval гарантируем что мы получим числовое значение в любом случае
        $status = intval(preg_replace('/^.+?(\d+)$/', "$1", $status));
        
        
        
        // Отображаем строку таблицы для этого ключа
        print "<tr>\n";
        
        // Отображаем описание
        print "\t<td>{$key['description']}</td>\n";
        
        // Отображаем статус
        print "\t<td>" . ($status ? "On" : "Off") . "</td>\n";
        
        // Отображаем кнонку включения (или выключения) ключа
        print "\t<td><form action=\"$scriptname\" method=POST>";
        print "<input type=\"hidden\" name=\"action\" value=\"".($status ? "off" : "on")."\">";
        print "<input type=\"hidden\" name=\"key\" value=\"{$key_id}\">";
        print "<input type=\"submit\" name=\"submit\" value=\"".($status ? "Turn off" : "Turn on")."\">";
        print "</form></td>";
        
        print "</tr>\n";
}

?>
</table>
<p><i>Copyright &copy; 2010 Vadim V. Kalinnikov aka MooSE<br>
E-Mail: <a href="mailto:moose@ylsoftware.com">moose@ylsoftware.com</a><br>
Web: <a href="http://www.ylsoftware.com">www.ylsoftware.com</a></i></p>
</body>
</html>

Работа со скриптом максимально проста. Он отображает таблицу с именами электронных ключей, их статусами и кнопки включения/выключения этих ключей. В браузере скрипт выглядит примерно вот так:

Пример работы скрипта

Единственным существенным недостатком этого скрипта является отсутствие нормальной обработки ошибок. Это не критично если связь между сервером и всеми устройствами достаточно надёжна и сами устройства работают в штатном режиме.

Если всё же нужен контроль ошибок то можно закомментировать или вообще убрать строку:

error_reporting(0);

В этом случае при возникновении проблем на экран будут выдаваться стандартные ошибки PHP. Более сложный контроль ошибок читателю предлагается реализовать самому.

На этом всё. Приятной работы!

Ключевые слова: netping, php, snmp, script.

Комментарии:

Новый комментарий



© 2006-2016 Вадим Калинников aka MooSE