SNMP (англ. Simple Network Management Protocol — простой протокол сетевого управления) — стандартный интернет-протокол для управления устройствами в IP-сетях на основе TCP/UDP. К поддерживающим SNMP устройствам относятся маршрутизаторы, коммутаторы, серверы, рабочие станции, принтеры и другие. Протокол обычно используется в системах сетевого управления для контроля подключённых к сети устройств на предмет условий, которые требуют внимания администратора (выдержка из Википедии https://ru.wikipedia.org/wiki/SNMP ).
Простыми словами, используя протокол SNMP, мы можем быстро получить сведения о состоянии оборудования и произвести его настройку. Наиболее часто используется для мониторинга оборудования.
Для работы с SNMP в PHP существует расширение php-snmp, которое в большинстве случаев не устанавливается вместе с стандартными, необходимыми для полноценной работы.
1. Установка
Для ОС Ubuntu
sudo apt-get install php-snmp
sudo phpenmod snmp
sudo service apache2 reload
Для FreeBSD
В зависимости от установленный версии PHP, выбираем необходимый порт
cd /usr/ports/net-mgmt/php5-snmp/
cd /usr/ports/net-mgmt/php70-snmp/
make install clean
/usr/local/etc/rc.d/apache24 restart
После этого можно приступать к работе.
2. Использование
Если Вы работаете в IDE NetBeans, рекомендую скачать https://searchcode.com/codesearch/view/66887100/ и сохранить по адресу ...NetBeans 8.2\php\phpstubs\phpruntime\snmp.php это позволит Вам получать подсказки и автодополнение кода при работе с методами SNMP.
Основные функции, которые используются при работе с SNMP:
- snmpget — Получение значение объекта SNMP.
- snmpgetnext — Получение значения объекта SNMP следующего за указанным в аргументах функции.
- snmpset — Устанавливает значение объекта SNMP.
- snmpwalk — Получение всех объектов SNMP, начиная от OID, указанного в аргументах функции. Результат получаем в виде массива.
- snmpwalkoid - Получение всех объектов SNMP, начиная от OID, указанного в аргументах функции. Результат получаем в виде ассоциативного массива.
Пример PHP - кода
$host='10.0.0.1';
$community='public';
$community_write='private';
snmp_set_quick_print (0); #Изменение формата вывода на полный
$uptime=snmpget($host,$community, '.1.3.6.1.2.1.1.3.0');
echo "UPTIME: ". $uptime. "n</br>";
snmp_set_quick_print (1); #Изменение формата вывода на сокращенный
$uptime=snmpget($host,$community, '.1.3.6.1.2.1.1.3.0');
echo "UPTIME: ". $uptime. "n</br>";
# Получаем следующий объект после UPTIME
$sys_contact= snmpgetnext($host,$community, '.1.3.6.1.2.1.1.3.0');
echo "SYS_CONTACT: ". $sys_contact. "n</br>";
#Для примера использования snmpset() Изменим System Name и выведем его
snmpset($host, $community_write, '.1.3.6.1.2.1.1.5.0', 's', 'New_sys_name');
$sys_contact= snmpget($host,$community, '.1.3.6.1.2.1.1.5.0');
echo "SYSTEM_NAME: ". $sys_contact. "n</br>";
#Для демонстрации snmpwalk() привожу код для вывода состояния всех портов оборудования
$port_status= snmpwalk($host, $community, '.1.3.6.1.2.1.2.2.1.8');
echo '<table><tr><td>PORT</td><td>STATUS</td></tr>';
foreach ($port_status as $k=>$v){
$port=$k+1;
switch ($v) {
case 1: $status='UP';
break;
case 2: $status='DOWN';
break;
default:$status='OTHER';
break;
}
echo "<tr><td>$port</td><td>$status</td></tr>";
}
echo '</table>';
# Предыдущий вариант вывода данных меня не совсем устраивает.
# Так, как я не имею понятия о "ключевом" значении,
# в конкретном примере - о номере порта. В ряде других ситуаций,
# это может быть, например, MAC-адрес, номер правила или любое значение,
# которое можно представить в числовом виде.
# Для того, чтобы знать, какой ключ отвечает какому значению,
# предлагаю использовать метод snmpwalkoid()
# Предыдущий пример (получения состояния портов) можно переписать следующим образом:
snmp_set_oid_output_format(SNMP_OID_OUTPUT_NUMERIC); #Преобразовываем OID в числовой формат.
$port_status= snmpwalkoid($host, $community, '.1.3.6.1.2.1.2.2.1.8');
echo '<table><tr><td>PORT</td><td>STATUS</td></tr>';
foreach ($port_status as $k=>$v){
$port= str_replace('.1.3.6.1.2.1.2.2.1.8.', '', $k);
switch ($v) {
case 1: $status='UP';
break;
case 2: $status='DOWN';
break;
default:$status='OTHER';
break;
}
echo "<tr><td>$port</td><td>$status</td></tr>";
}
echo '</table>';
Результат выполнения
UPTIME: Timeticks: (3120551348) 361 days, 4:11:53.48
UPTIME: 361:4:11:53.48
SYS_CONTACT: "Contact_name"
SYSTEM_NAME: "New_sys_name"
PORT STATUS
1 DOWN
2 DOWN
3 DOWN
4 DOWN
5 UP
6 DOWN
7 DOWN
8 DOWN
9 DOWN
10 DOWN
11 UP
12 DOWN
13 DOWN
14 DOWN
15 UP
16 UP
17 DOWN
18 DOWN
19 DOWN
20 DOWN
21 DOWN
22 DOWN
23 UP
24 DOWN
25 UP
26 UP
27 DOWN
28 UP
29 UP
30 UP
31 UP
32 UP
33 UP
34 UP
35 UP
PORT STATUS
1 DOWN
2 DOWN
3 DOWN
4 DOWN
5 UP
6 DOWN
7 DOWN
8 DOWN
9 DOWN
10 DOWN
11 UP
12 DOWN
13 DOWN
14 DOWN
15 UP
16 UP
17 DOWN
18 DOWN
19 DOWN
20 DOWN
21 DOWN
22 DOWN
23 UP
24 DOWN
25 UP
26 UP
27 DOWN
28 UP
2003 UP
3028 UP
3029 UP
3034 UP
3040 UP
3041 UP
5121 UP
Я описал пример базового применения. Дальше все в Ваших руках
Рекомендую ознакомиться со справкой по работе http://php.net/manual/ru/book.snmp.php
Если у Вас возникли вопросы, задавайте в комментариях.
Комментариев нет:
Отправить комментарий