phpday 2025 - Call For Papers

La classe SNMP

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

Introduction

Représente une session SNMP.

Synopsis de la classe

class SNMP {
/* Constantes */
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;
/* Propriétés */
public readonly array $info;
public ?int $max_oids;
/* Méthodes */
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
}

Propriétés

max_oids

Nombre maximal de OID par demande GET/SET/GETBULK

valueretrieval

Contrôle la façon dont les valeurs SNMP seront retournées

SNMP_VALUE_LIBRARY Les valeurs retournées le seront de la même façon que par la bibliothèque Net-SNMP.
SNMP_VALUE_PLAIN Les valeurs retournées le seront en valeur pleine, sans l'information de type SNMP.
SNMP_VALUE_OBJECT Les valeurs retournées le seront sous forme d'objets avec les propriétés "value" et "type", où le type pourra être une constante SNMP_OCTET_STR, SNMP_COUNTER etc... La façon dont la "value" est retournée est basée suivant la constante définie : SNMP_VALUE_LIBRARY ou SNMP_VALUE_PLAIN.
quick_print

Valeur du paramètre quick_print dans la bibliothèque NET-SNMP

Définit la valeur du paramètre quick_print dans la bibliothèque NET-SNMP. Lorsqu'il est défini (1), la bibliothèque SNMP retournera des valeurs rapidement imprimables. Cela signifie uniquement que les valeurs seront imprimées. Lorsque le paramètre quick_print n'est pas défini (par défaut), la bibliothèque NET-SNMP imprimera des informations additionnelles incluant le type de la valeur (i.e. IpAddress ou OID). De plus, si quick_print n'est pas activé, la bibliothèque imprimera les valeurs hexadécimales pour toutes les chaînes contenant jusqu'à 3 caractères.

enum_print

Contrôle la façon dont les valeurs enum sont imprimées.

Permet d'indiquer à walk/get etc. s'ils doivent automatiquement chercher les valeurs enum dans le MIIB et les retourner en plus de leurs chaînes humainement lisibles.

oid_output_format

Contrôle le format de sortie OID

Représentation OID .1.3.6.1.2.1.1.3.0 pour diverses valeurs de oid_output_format
SNMP_OID_OUTPUT_FULLLa forme complète, comme "iso.org.dod...."
SNMP_OID_OUTPUT_NUMERICLa forme numérique, comme ".1.3.6.1.4.1.8072.3.2.10"
SNMP_OID_OUTPUT_MODULELa forme courte, comme "NET-SNMP-TC::linux"
SNMP_OID_OUTPUT_SUFFIXTBD
SNMP_OID_OUTPUT_UCDTBD
SNMP_OID_OUTPUT_NONETBD
oid_increasing_check

Contrôle la vérification de la désactivation pour l'augmentation de l'OID lors du parcours de l'arbre OID

Quelques agents SNMP sont connus pour retourner des OIDs dans la mauvais ordre, mais peuvent malgré tout continuer le parcours. D'autres agents retournent des OIDs dans la mauvais ordre et peuvent conduire la méthode SNMP::walk() dans une boucle infinie tant que la limite de mémoire n'est pas atteinte. La bibliothèque PHP SNMP, par défaut, effectue la vérification de l'augmentation de l'OID et stoppe le parcours sur l'arbre OID lorsqu'elle détecte une possible boucle en émettant une alerte. Définissez la variable oid_increasing_check à false pour désactiver cette vérification.

exceptions_enabled

Contrôle quelle exception SNMPException sera émise au lieu des alertes. Utiliser l'opérateur OR des constantes SNMP::ERRNO_*. Par défaut, toutes les exceptions SNMP sont désactivées.

info

Propriété en lecture seul contenant la configuration de l'agent distant : nom d'hôte, port, délai d'expiration par défaut, nombre de récupération par défaut

Constantes pré-définies

Types d'erreurs SNMP

SNMP::ERRNO_NOERROR

Aucune erreur spécifique SNMP n'est survenue.

SNMP::ERRNO_GENERIC

Une erreur SNMP générique est survenue.

SNMP::ERRNO_TIMEOUT

Demande à l'agent SNMP d'atteindre le délai d'expiration.

SNMP::ERRNO_ERROR_IN_REPLY

L'agent SNMP retourne une erreur dans la réponse.

SNMP::ERRNO_OID_NOT_INCREASING

L'agent SNMP n'incrémente plus l'OID lors de l'exécution de la commande WALK (BULK). Ceci indique qu'un problème survient avec l'agent SNMP.

SNMP::ERRNO_OID_PARSING_ERROR

La bibliothèque échoue lors de l'analyse de l'OID (et/ou le type pour la commande SET). Aucune requête n'est effectuée.

SNMP::ERRNO_MULTIPLE_SET_QUERIES

La bibliothèque utilisera plusieurs requêtes pour l'opération SET demandée. Cela signifie que l'opération sera effectuée de façon non transactionnelle et que les morceaux suivants pourront échouer si un mauvais type ou une mauvaise valeur est fourni.

SNMP::ERRNO_ANY

Tous les codes opérateur OR des constantes SNMP::ERRNO_*.

Sommaire

add a note

User Contributed Notes 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