Класс SNMP

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

Введение

Представляет сессию протокола SNMP.

Обзор класса

class SNMP {
/* Константы */
public const int VERSION_1;
public const int VERSION_2c;
public const int VERSION_2C;
public const int VERSION_3;
public const int ERRNO_NOERROR;
public const int ERRNO_ANY;
public const int ERRNO_GENERIC;
public const int ERRNO_TIMEOUT;
/* Свойства */
public readonly array $info;
public ?int $max_oids;
/* Методы */
public __construct(
    int $version,
    string $hostname,
    string $community,
    int $timeout = -1,
    int $retries = -1
)
public close(): bool
public get(array|string $objectId, bool $preserveKeys = false): mixed
public getErrno(): int
public getError(): string
public getnext(array|string $objectId): mixed
public set(array|string $objectId, array|string $type, array|string $value): bool
public setSecurity(
    string $securityLevel,
    string $authProtocol = "",
    string $authPassphrase = "",
    string $privacyProtocol = "",
    string $privacyPassphrase = "",
    string $contextName = "",
    string $contextEngineId = ""
): bool
public walk(
    array|string $objectId,
    bool $suffixAsKey = false,
    int $maxRepetitions = -1,
    int $nonRepeaters = -1
): array|false
}

Свойства

max_oids

Максимальный идентификатор OID для запросов GET, SET или GETBULK

valueretrieval

Управляет методом возврата SNMP-значений

SNMP_VALUE_LIBRARYВозвращаемые значения будут такими, как будто их вернула библиотека Net-SNMP.
SNMP_VALUE_PLAINВозвращаемые значения будут простыми, без информации о типах SNMP.
SNMP_VALUE_OBJECT Возвращаемые значения будут объектами со свойствами value и type, где type будет содержать одну из констант: SNMP_OCTET_STR, SNMP_COUNTER и т. д., а value будет зависеть от того, установили SNMP_VALUE_LIBRARY или SNMP_VALUE_PLAIN.
quick_print

Значение параметра quick_print в библиотеке NET-SNMP

Устанавливает значение quick_print в библиотеке NET-SNMP. если задали как (1), библиотека SNMP будет возвращать значения «quick printed». То есть будут напечатаны только значения. Если параметр quick_print не разрешён (по умолчанию), библиотека NET-SNMP будет печатать дополнительную информацию, включая тип значения (то есть IpAddress или OID). Дополнительно, если параметр quick_print не разрешён, библиотека будет печатать шестнадцатеричные значения для каждой строки короче четырёх символов.

enum_print

Контролирует способ, которым будут печататься значения перечислений

Параметр переключает поведение walk или get и т. д., чтобы они автоматически смотрели значения перечислений в MIB и возвращали их вместе с понятным человеку текстом.

oid_output_format

Контролирует формат вывода OID

OID-представление .1.3.6.1.2.1.1.3.0 для различных значений oid_output_format
SNMP_OID_OUTPUT_FULL.iso.org.dod.internet.mgmt.mib-2.system.sysUpTime.sysUpTimeInstance
SNMP_OID_OUTPUT_NUMERIC.1.3.6.1.2.1.1.3.0
SNMP_OID_OUTPUT_MODULEDISMAN-EVENT-MIB::sysUpTimeInstance
SNMP_OID_OUTPUT_SUFFIXsysUpTimeInstance
SNMP_OID_OUTPUT_UCDsystem.sysUpTime.sysUpTimeInstance
SNMP_OID_OUTPUT_NONEUndefined
oid_increasing_check

Контролирует запрет на проверку увеличения идентификатора OID при обходе дерева OID

Некоторые агенты SNMP известны тем, что возвращают OID-идентификатор объекта не по порядку, но всё равно завершают проход. Другие агенты, возвращают OID не по порядку и иногда вызывают бесконечное зацикливание метода SNMP::walk(), пока не закончится память. PHP-модуль SNMP по умолчанию предпринимает проверку увеличения OID и прекращает обход дерева, если определяет возможную закольцовку, выдавая соответствующее предупреждение. Для переменной oid_increasing_check устанавливают значение false, чтобы запретить эту проверку.

exceptions_enabled

Определяет, какие сбои будут выбрасывать исключение SNMPException вместо предупреждения. Принимает константы семейства SNMP::ERRNO_* через побитовое ИЛИ. По умолчанию SNMP не выбрасывает исключения.

info

Свойство только для чтения, которое содержит конфигурацию удалённого агента: имя хоста, порт, время ожидания по умолчанию, количество повторов по умолчанию.

Предопределённые константы

Типы ошибок SNMP

SNMP::ERRNO_NOERROR

Ошибки SNMP отсутствуют.

SNMP::ERRNO_GENERIC

Общая ошибка SNMP.

SNMP::ERRNO_TIMEOUT

Превышено время ожидания запроса к SNMP-агенту.

SNMP::ERRNO_ERROR_IN_REPLY

SNMP-агент вернул ошибку в ответ.

SNMP::ERRNO_OID_NOT_INCREASING

SNMP-агент обнаружил возможную закольцовку из-за неувеличения OID-идентификатора объекта при выполнении команд (BULK)WALK. Это говорит о том, что удалённый SNMP-агент фиктивный.

SNMP::ERRNO_OID_PARSING_ERROR

Библиотека не разобрала OID-идентификатор объекта (и (или) тип для команды SET). Запросов не было.

SNMP::ERRNO_MULTIPLE_SET_QUERIES

Библиотека использует множественные запросы для операции SET. Это означает, что операция будет выполняться без транзакции, и, если возникнет ошибка типа или значения, второй или последующие фрагменты иногда завершаются ошибкой.

SNMP::ERRNO_ANY

Все коды SNMP::ERRNO_* объединённые побитовым ИЛИ.

Версии протокола SNMP

SNMP::VERSION_1

SNMP::VERSION_2C, SNMP::VERSION_2c

SNMP::VERSION_3

Содержание

  • SNMP::close — Закрывает сессию SNMP
  • SNMP::__construct — Создаёт экземпляр класса SNMP, который представляет сеанс удалённому SNMP-агенту
  • SNMP::get — Получает объект SNMP
  • SNMP::getErrno — Получает код последней ошибки
  • SNMP::getError — Получает последнее сообщение об ошибке
  • SNMP::getnext — Получить объект SNMP, который следует за данным идентификатором объекта
  • SNMP::set — Устанавливает значение объекта SNMP
  • SNMP::setSecurity — Настраивает связанные с безопасностью параметры сессии SNMPv3
  • SNMP::walk — Получает поддерево объекта SNMP
Добавить

Примечания пользователей 2 notes

up
0
swannie at swannie dot net
3 years ago
Hopefully this helps someone else out because this was driving be bonkers for a good two hours. It looks like valueretrieval and enum_print work together in a way that I wasn't expecting, and after re-reading may be by design but I'm not sure. If you can't get enums to print, this might be why.

<?php
$snmp
= new SNMP(SNMP::VERSION_2C,'192.168.1.9','test');
$snmp->oid_output_format = SNMP_OID_OUTPUT_SUFFIX;
$snmp->valueretrieval = SNMP_VALUE_PLAIN;
$snmp->enum_print = 0;
echo
$snmp->get('IF-MIB::ifOperStatus.10110') . "\n";
$snmp->enum_print = 1;
echo
$snmp->get('IF-MIB::ifOperStatus.10110') . "\n";
$snmp->quick_print = 1;
echo
$snmp->get('IF-MIB::ifOperStatus.10110') . "\n";
$snmp->valueretrieval = SNMP_VALUE_LIBRARY;
echo
$snmp->get('IF-MIB::ifOperStatus.10110') . "\n";
$snmp->enum_print = 0;
echo
$snmp->get('IF-MIB::ifOperStatus.10110') . "\n";
?>

Output:
1
1
1
1
up
up
-1
madjev1990 at gmail dot com
8 years ago
Part of my diploma thesis was to create web interface to command device via SNMP. So I create my own level of abstraction over SNMP class:

<?php

/**
* Snmp library which add one level of abstraction to snmp native library.
* It adds functionality to work with module PicoIP.With this library you can:
* 1.Activate/deactive defined pin;
* 2.Get status of all pins.
*
* When make an instance you should pass to the constructor key word which will
* make the library create an object with necessary properetis and access permissions.
*
* Private properties set some of configurations:
* Host is IP address of the divece which we will command.
* Two passwords are set for reading and writing.
* Version of snmp protocol that we will use is version 1.
*
* @author Radoslav Madjev
* @year 2016
* @version 1.0 beta
*
*
*/
class snmp_lib {

private
$snmpInstance;
private
$VERSION = SNMP::VERSION_1;
private
$HOST = '192.168.0.150';
private
$passwordRead = '000000000000';
private
$passwordWrite = 'private';
private
$releys = array(1 => '1.3.6.1.4.1.19865.1.2.1.1.0',
2 => '1.3.6.1.4.1.19865.1.2.1.2.0');
private
$allPorts = array('3' => '1.3.6.1.4.1.19865.1.2.1.33.0',
'5' => '1.3.6.1.4.1.19865.1.2.2.33.0');

/**
* Create instance of SNMP native class, based on actions that we will
* perform.
*
* @param string $action
*/
public function __construct($action) {
if (
in_array($action, array('read', 'write'))) {
if (
strcmp($action, 'read') === 0) {
$this->_read();
} else {
$this->_write();
}
}
}

/**
* Create instance with reading permissions.
*/
private function _read() {
$this->snmpInstance = new SNMP($this->VERSION, $this->HOST, $this->passwordRead);
}

/**
* Create instance with writing permissions.
*/
private function _write() {
$this->snmpInstance = new SNMP($this->VERSION, $this->HOST, $this->passwordWrite);
}

/**
* Close snmp session.
*
* @return boolean
*/
public function closeSession() {
return
$this->snmpInstance->close();
}

/**
* Set integer 1 as value of defined pin.
*/
public function activate($relay) {
$this->snmpInstance->set($this->releys[$relay], 'i', '1');
}

/**
* Set integer 0 as value of defined pin.
*/
public function deactivate($relay) {
$this->snmpInstance->set($this->releys[$relay], 'i', '0');
}

/**
* Get pin status of all ports of the module.
*
* @return array
*/
public function getAllPortsStatus() {
$allPins = array();
foreach (
$this->allPorts as $number => $port) {
//get active pins as 8-bit integer of defined port
$getbits = $this->snmpInstance->get($port);
$bits = str_replace('INTEGER: ', '', $getbits);
//get pins status
$pinsStatus = $this->_getActivePins($bits);
$allPins[$number] = $pinsStatus;
}

return
$allPins;
}

/**
* Make bitwise operation which will determine,
* which are active pins.
*
* @param int $bits
* @return array
*/
private function _getActivePins($bits) {

$bitMapping = array(
1 => 1,
2 => 2,
3 => 4,
4 => 8,
5 => 16,
6 => 32,
7 => 64,
8 => 128
);

$pinsStatus = array();

foreach (
$bitMapping as $int => $bit) {
if ((
$bits & $bit) == $bit) {
$pinsStatus[$int] = true;
continue;
}
$pinsStatus[$int] = false;
}

return
$pinsStatus;
}

}

?>

I have one module that receive SNMP request and send a command to relays. Also these are example scripts that use this lib:
Turn on script:
<?php
require_once 'snmp_lib.php';

$snmp = new snmp_lib('write');
$snmp->activate($getRelayNumber);
$snmp->closeSession();
?>

Turn off script:
<?php
require_once 'snmp_lib.php';

$snmp = new snmp_lib('write');
$snmp->deactivate($getRelayNumber);
$snmp->closeSession();
?>

Script that get all ports status:
<?php
require_once 'snmp_lib.php';

$snmp = new snmp_lib('read');
$getActive = $snmp->getAllPortsStatus();
?>
To Top