08.12.2017

Работа по SNMP протоколу через PHP

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

Если у Вас возникли вопросы, задавайте в комментариях.

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

Отправить комментарий