Tonerstand von HP Laserjets mit SNMP auslesen

Hier im Geschäft haben wir insgesamt vier HP Laserdrucker. Inzwischen wissen die meisten wir man die Toner selber wechselt, aber für die Bestellung bin immer noch ich zu ständig. Meistens funktioniert es auch, dass die leeren Toner an mich zurück kommen. Denn so habe ich einen Überblick wieviele Toner wir noch haben. Allerdings ist es auch schon ab und zu passiert, dass die Toner (fast) ausgegangen sind, ohne dass ich es wusste. Eine Möglichkeit um dem entgegen zu wirken, ist die Überwachung des Tonerstandes und was liegt da näher als SNMP. Also mal einen snmpwalk auf den Drucker machen. Und siehe da, irgendwo versteckt sind die Daten zu Toner, Fixier- und Transporteinheit. Diese Daten sind von einem HP Color Laserjet 4650. Wie es bei anderen Druckern aussieht weiss ich nicht, aber bei den Laserjets siehts überall ähnlich aus.
root@serv02:~# snmpwalk -c public -v 2c 192.168.1.*
SNMPv2-SMI::mib-2.43.11.1.1.6.1.1 = STRING: "Black Print Cartridge HP C9720A"
SNMPv2-SMI::mib-2.43.11.1.1.6.1.2 = STRING: "Cyan Print Cartridge HP C9721A"
SNMPv2-SMI::mib-2.43.11.1.1.6.1.3 = STRING: "Magenta Print Cartridge HP C9723A"
SNMPv2-SMI::mib-2.43.11.1.1.6.1.4 = STRING: "Yellow Print Cartridge HP C9722A"
SNMPv2-SMI::mib-2.43.11.1.1.6.1.5 = STRING: "Image Transfer Kit HP Q3675A"
SNMPv2-SMI::mib-2.43.11.1.1.6.1.6 = STRING: "Image Fuser Kit HP 110V-Q3676A, 220V-Q3677A"
SNMPv2-SMI::mib-2.43.11.1.1.8.1.1 = INTEGER: 9000
SNMPv2-SMI::mib-2.43.11.1.1.8.1.2 = INTEGER: 8000
SNMPv2-SMI::mib-2.43.11.1.1.8.1.3 = INTEGER: 8000
SNMPv2-SMI::mib-2.43.11.1.1.8.1.4 = INTEGER: 8000
SNMPv2-SMI::mib-2.43.11.1.1.8.1.5 = INTEGER: 120000
SNMPv2-SMI::mib-2.43.11.1.1.8.1.6 = INTEGER: 150000
SNMPv2-SMI::mib-2.43.11.1.1.9.1.1 = INTEGER: 5580
SNMPv2-SMI::mib-2.43.11.1.1.9.1.2 = INTEGER: 5200
SNMPv2-SMI::mib-2.43.11.1.1.9.1.3 = INTEGER: 6480
SNMPv2-SMI::mib-2.43.11.1.1.9.1.4 = INTEGER: 1520
SNMPv2-SMI::mib-2.43.11.1.1.9.1.5 = INTEGER: 38727
SNMPv2-SMI::mib-2.43.11.1.1.9.1.6 = INTEGER: 111571

Aber das bringt ja noch nicht allzu viel. Was kann man denn mit diesen Daten anfangen?
Nun mal zum schwarzen Toner. Hier haben wir die folgenden Daten.
SNMPv2-SMI::mib-2.43.11.1.1.6.1.1 = STRING: "Black Print Cartridge HP C9720A"
SNMPv2-SMI::mib-2.43.11.1.1.8.1.1 = INTEGER: 9000
SNMPv2-SMI::mib-2.43.11.1.1.9.1.1 = INTEGER: 5580

Die erste Zeilt zeigt, wie unschwer zu erkennen ist, den Namen des Toners an. So kommt man auch relativ schnell drauf, was es ist. Die nächste Zeile zeigt den maximalen Wert des Toners an, welche Einheit das ist, weiss ich nicht, aber das ist hier auch nicht so wichtig. Die letzte Zeile zeigt dann noch den aktuellen Stand des Toners an. Mit diesen Daten ist es nun keine Hexerei aus zurechnen wie voll der Toner noch ist.
100 * 5580 / 9000 = 62

Die Daten noch schnell mit dem Webinterface vergleichen und siehe da: Es stimmt.

Nun kann man das ganze auch noch ein wenig Automatisieren. Ich habe dazu ein kleines Script geschrieben, welches den aktuellen Stand der Toner und Einheiten anzeigt.
#!/bin/bash

# CONFIG
ip="192.168.1.*"
community="public"

num=1;
while [ ${num} -le 6 ]
do
    name=`snmpwalk -v 2c -c ${community} ${ip} SNMPv2-SMI::mib-2.43.11.1.1.6.1.${num} | cut -d "\"" -f 2`
    max=`snmpwalk -v 2c -c ${community} ${ip} SNMPv2-SMI::mib-2.43.11.1.1.8.1.${num} | cut -d " " -f 4`
    current=`snmpwalk -v 2c -c ${community} ${ip} SNMPv2-SMI::mib-2.43.11.1.1.9.1.${num} | cut -d " " -f 4`

    echo "${name} $((100 * $current /$max))%"

    ((num++))
done

Dieses Script gibt nun das folgende aus:
Black Print Cartridge HP C9720A 62%
Cyan Print Cartridge HP C9721A 65%
Magenta Print Cartridge HP C9723A 81%
Yellow Print Cartridge HP C9722A 19%
Image Transfer Kit HP Q3675A 32%
Image Fuser Kit HP 110V-Q3676A, 220V-Q3677A 74%

Und wenn man das mit dem Webinterface vergleicht:
http://images.t-error.ch/news/363/toner_lj4650.jpg

Nur so als Shellscript, macht das natürlich wenig sinn, man könnte ja gleich auf das Webinterface. Wenn man die Daten aber ins RRDTool speist, oder sonst irgendwie zusammenfasst, kann man sich so einen schönen Überblick über den Tonerstand der Drucker verschaffen. Wenn ich Zeit habe, baue ich vielleicht mal so ein Tool mit PHP.

Drucker mit MRTG überwachen

Das Programm MRTG von Tobias Oetiker ist inzwischen ja schon sehr bekannt. Es eignet sich perfekt um Router per SNMP zu überwachen. Allerdings kann man damit auch Drucker, die SNMP unterstützen überwachen.
Im Geschäft habe ich nun einen Linux Server mit Ubuntu 6.06 und mit diesem möchte ich auch die Netzwerk-Auslastung unserer Drucker Monitoren. An diesem Beispiel zeige ich die Installation von MRTG und die Konfiguration für einen HP Laserjet 2500. Allerdings gibt es keinen (grossen) unterschied vom Laserjet 2500 zu anderen Druckern. Solange diese SNMP unterstützen.

Installation

Mit apt-get habe ich MRTG nicht gefunden. Also habe ich das DEB File heruntergeladen und installiert.
dpkg --install mrtg_2.12.2-1_i386.deb

Mit dem folgenden Befehl habe ich noch die zusätzlich benötigte Software installiert
apt-get -f install

Nun sollte MRTG Installiert sein.

Konfiguration

MRTG wird nicht über eine zentrale Konfigurationsdatei verwaltet. Man kann pro Gerät eine eigene Datei erstellen und diese dann als Parameter angeben. Die Konfigurationsdateien kann man mit dem Befehl cfgmaker erstellen. Als Parameter gibt man die IP Adresse des Gerätes an. Natürlich kann man noch zusätzliche Parameter angeben, aber die Standardvorgaben sind eigentlich ganz gut.
cfgmaker *.*.*.230 > /root/scripts/mrtg/lj2500.jpg

Ich lege die Konfigurationsdatei im Ordner /root/scripts/mrtg/. Dort kann ich auch noch andere Konfigurationsdateien ablegen. Die soeben erstelle Konfigurationsdatei sieht nun so aus. (Die auskommentierten Dateien habe ich entfernt)
cat /root/scripts/mrtg/lj2500.cfg
#  for Debian
WorkDir: /var/www/mrtg
EnableIPv6: no

Target[*.*.*.230_1]: 1:public@*.*.*.230:
SetEnv[*.*.*.230_1]: MRTG_INT_IP="*.*.*.230" MRTG_INT_DESCR=""
MaxBytes[*.*.*.230_1]: 1250000
Title[*.*.*.230_1]: Traffic Analysis for 1 -- NPI821398
PageTop[*.*.*.230_1]: <h1>Traffic Analysis for 1 -- NPI821398</h1>
                <div id="sysdetails">
                        <table>
                                <tr>
                                        <td>System:</td>
                                        <td>NPI821398 in </td>
                                </tr>
                                <tr>
                                        <td>Maintainer:</td>
                                        <td></td>
                                </tr>
                                <tr>
                                        <td>Description:</td>
                                        <td>  </td>
                                </tr>
                                <tr>
                                        <td>ifType:</td>
                                        <td>ethernetCsmacd (6)</td>
                                </tr>
                                <tr>
                                        <td>ifName:</td>
                                        <td></td>
                                </tr>
                                <tr>
                                        <td>Max Speed:</td>
                                        <td>1250.0 kBytes/s</td>
                                </tr>

                                <tr>
                                        <td>Ip:</td>
                                        <td>*.*.*.230 ()</td>
                                </tr>

                        </table>
                </div>

Damit die neuen Daten auf der rechten Seite der Grafik angezeigt werden füge ich die folgende Zeile oben in die Konfigurationsdatei ein.
Options[_]: growright

Da ich schlussendlich mehrere Drucker überwachen will, erstelle ich ein kleines Script, dass den MRTG aufruft. Dort kann ich dann auch noch zusätzliche Zeilen einfügen
cat /root/scripts/mrtg/update.sh
#!/bin/bash
env LANG=C mrtg /root/scripts/mrtg/lj2500.cfg -logging /var/log/mrtg/lj2500.log

Damit man das Script nun auch ausführen kann, muss man die Benutzerrechte noch ändern.
chmod 755 /root/scripts/mrtg/update.sh


Nun ja. Dann wollen wir mal sehen, ob alles funktioniert.
/root/scripts/mrtg/update.sh

Bei den ersten beiden Malen kam bei mir eine Fehlermeldung. Beim dritten mal war aber alles OK.

Jetzt das Script noch in den Cron installieren. Es reicht, wenn das Script alle 10 Minuten ausgeführt wird.
# MRTG
*/10 * * * *    root    /root/scripts/mrtg/update.sh

Jetzt sind die Dateien im Ordner /var/www/mrtg/ gespeichert. Da auf meinem Server noch ein Webserver läuft, kann man die Dateien über den Browser ansehen. Das sollte etwa so aussehen:
http://images.t-error.ch/news/321/mrtg.png

Auf der MRTG Homepage steht auch, dass man die Daten vom MRTG als RRD speichern kann. Also sollte eine Auswertung mit dem RRDTool möglich sein. Mal sehen wie das funktioniert.