Surveillance SNMP sur les Imprimantes

Toutes nos imprimantes ont la possibilité d’être surveillées en SNMP. Il devient intéressant d’avoir une vue d’ensemble sur une page web.

Au départ j’ai utilisé le PHP pour récupérer les numéros MIB utiles à la configuration de Nagios pour ajouter les imprimantes à notre monitoring. Puis il s’est avéré plus utile de garder la page PHP lorsque Canon nous appelait pour savoir si telle ou telle imprimante fonctionnait bien (ils sont capables de recevoir des messages pour le début de pannes, mais pas pour leur fin… vive le 21e siècle chez Canon).

Donc j’utilise la commande suivante sous linux

snmpwalk -Oa -v1 -c public x.x.x.x mib-2.43.18.1.1.8

x.x.x.x étant l’adresse IP ou le nom DNS de l’imprimante.

Cela m’a donné un code PHP ressemblant à ceci (bien sûr c’est un code écrit rapidement que j’améliorerais à l’usage) :

$printers = array(
“impr-irc2880-01”,
“impr-irc2880-02”,
“impr-irc2880-03”,
“impr-irc2880-04”,
“impr-irc2880-05”,
“impr-c1-01”,
“impr-c1-02”,
“impr-tech-01”);

$html = “”;

//recupération des messages dans un tableau $printers_tab
foreach($printers as $printer){

//on echape d’éventuelles commandes shell
$printer = escapeshellcmd($printer);

//-Oa permet d’éviter d’avoir des messages en Hexa
//mib-2.43.18.1.1.8 semble dans notre cas rassembler tous les messages d’erreurs
$cmd = “snmpwalk -Oa -v1 -c public $printer mib-2.43.18.1.1.8”;

//$output n’est pas correctement vidé à chaque usage de exec
unset($output);
exec($cmd,$output,$retourne);

//si la commande Shell a retourné une erreur on l’affiche (parfois juste une erreur dans l’adresse)
if($retourne != 0)
$printers_tab[$printer][0] = “erreur({$retourne})<br/>\n”;

//sinon, s’il n’y a aucun message on place un message indiquant que tout est “OK”
else{
$nbmsg = count($output);
if($nbmsg == 0) $printers_tab[$printer][0] = “OK”;
//et sinon on récupère tous les messages
else
for($i=0; $i < $nbmsg; $i++)
$printers_tab[$printer][$i] = $output[$i];
}
}

/****************************************************************************
* $printers_tab[“nom_imprimante”][0-n] contient tous les messages à afficher par imprimante
***************************************************************************/

//affichage dans une liste
$html.= ”
<!– liste des imprimantes –>
<div id=’imprimantes’>
<ul id=’liste_imprimantes’>
“;

//pour chaque imprimante
foreach($printers_tab as $name=>$messages){

$html.= ”
<li ><a href=’http://$name/’ target=’_blank’>$name</a><ul>”;

//pour chaque message correspondant à l’imprimante $name
foreach($messages as $message){

$message = trim($message);

//les 30 premieres caractère correpondent à SNMPv2-SMI::mib-2.43.18.1.1.8.
//je garde les derniers numéros pour tenter d’en comprendre la logique
$afficher = substr($message, 30);
//moins de 30 caractères correspond à un message non attendu qu’on affichera
if(empty($afficher))
$afficher = $message;

$html.= ”
<li class=’message_impr’>$afficher</li>”;
}
$html.= ”
</ul></li>”;
}

$html.= ”
</ul><br style=’clear:both;’ />
<p>(Interrogation de SNMPv2-SMI::mib-2.43.18.1.1.8)
</p>
</div>
“;

J’obtiens un affichage de ce genre :

*           impr-irc2880-01
o             1.191 = STRING: “The M toner is low.”

*           impr-irc2880-02
o             OK

*           impr-irc2880-03
o             1.279 = STRING: “The M toner is low.”
o             1.280 = STRING: “Paper is out.”

*           impr-irc2880-04
o             1.206 = STRING: “Paper is out.”

*           impr-irc2880-05
o             OK

*           impr-c1-01
o             OK

*           impr-c1-02
o             OK

*           impr-tech-01
o             1.56 = STRING: “Powersave activ..”
(Interrogation de SNMPv2-SMI::mib-2.43.18.1.1.8)

Leave a Reply

Your email address will not be published. Required fields are marked *