Surveiller LPRng
LPRng est un serveur d'impression BSD amélioré. Il implémente le protocole Line Printer Daemon (1179) et utilise le traditionnel fichier printcap(5)
.
Méthode du pauvre
$ watch lpc status all
Avec Monit
Installer Monit. Mettre dans le fichier monit.d/lprng
(évidemment dans monitrc
on trouve la directive : include “/path/to/monit.d/*”
) :
check process lpd with pidfile /var/run/lpd.515 start program = "/etc/rc.d/LPRng start" stop program = "/usr/bin/pkill -KILL lpd" if failed host proxy-lpr port 515 type tcp with timeout 30 seconds then restart if 3 restarts within 5 cycles then timeout
Avec Syslog-NG
Pour commencer, régler les imprimantes pour quelles récupèrent leur adresse par DHCP. Dans la configuration du serveur DHCP, définir une option log-servers
et renseigner le serveur d'impression lpr.example.com
:
host prcompta { hardware ethernet 0:25:b3:fb:d7:c8; fixed-address 192.0.2.207; option log-servers lpr.example.com; }
Passons aux journaux.
Avec Syslog-NG : dans le fichier de configuration syslog-ng.conf
, ajouter :
- une source :
source impr { udp(ip(172.17.13.253) port(514)); };
- des filtres :
filter f_lpr { facility(lpr) and level(info..emerg); }; filter f_all_impr { level(debug..emerg); };
- une destination :
destination d_impr { file("/var/log/impr.log" create_dirs(yes)); };
et finalement journaliser depuis les sources et suivant les filtres :
log { source(impr); filter(f_all_impr); destination(d_impr); }; log { source(local); filter(f_lpr); destination(d_impr); };
Voilà, dans le fichier /var/log/impr.log
, on va maintenant trouver :
- les messages envoyés par le daemon
lpd(8)
, - les journaux envoyés par les imprimantes.
Reste à filtrer ces messages intelligemment, par exemple pour les afficher dans une interface Web ou plus utilement pour y chercher des expressions comme :
<printer>: offline or intervention needed <printer>: paper out ... <printer>: offline or intervention needed <printer>: error cleared ... <printer>: toner/ink low ... <printer>: peripheral low-power state
(il s'agit ici des messages standard des modules HP JetDirect).
MRTG, Perl et un peu d'huile de coude
Soit le script suivant snmp_count_pages.pl
:
#!/usr/pkg/bin/perl # use strict; use lib "/usr/local/filters"; use Printing; my $pages_oid = "1.3.6.1.2.1.43.10.2.1.4.1.1"; my %queues = Printing::parse_printcap(); foreach my $p (sort keys %queues) { if (Printing::ping ($p)) { open (SNMP, "snmpget -v 1 -c 'public' $p $pages_oid |"); while (<SNMP>) { chomp; s/^.+Counter32:\s+(\d+)/\1/; print "[snmp-stat] $p: $_ pages\n"; } close SNMP; } else { print "[ping-stat] $p is down\n"; } }
On peut facilement éviter l'appel à la commande snmpget(1)
en utilisant Net::SNMP
. Les détails sur mon module Printing.pm
sont inutiles pour cet exposé, il suffit de comprendre que :
Printing::parse_printcap()
renvoie un hachage contenant les noms des imprimantes définies dans le fichierprintcap(5)
,Printing::ping()
renvoie1
si l'imprimante dont le nom est passé en argument répond aux requêtes ICMPecho_request
,0
sinon. La seule chose intéressante ici est l'OID1.3.6.1.2.1.43.10.2.1.4.1.1
: il indique le nombre de pages imprimées.
Ajoutons dans la crontab(5)
d'un utilisateur :
*/5 * * * * /usr/local/scripts/snmp_count_pages.pl 2>/dev/null |logger -p lpr.info
et notre journal est plus complet encore.
Passons à MRTG. Soir le script snmpprinters2mrtg
:
#!/usr/pkg/bin/perl # use strict; my $pages_oid = "1.3.6.1.2.1.43.10.2.1.4.1.1"; sub uptime { open(UP, "uptime|"); while(my $line = <UP>) { chop $line; if ($line =~ m|^.*up\s+(.+),\s+\d+\suser.*|) { print "$1\n"; } } close(UP); } sub end { &uptime; open(HOST, "hostname -s|"); while (<HOST>) { print $_; } exit(0); } my $state = 1; open (PING, "/usr/pkg/sbin/fping -B 1 -t 100 $ARGV[0] |"); while (<PING>) { $state = 0 if (/unreachable/); } close PING; if ($state > 0) { open (SNMP, "/usr/pkg/bin/snmpget -v 1 -c 'public' $ARGV[0] $pages_oid |"); while (<SNMP>) { chomp; s/^.+Counter32:\s+(\d+)/\1/; print "$_\n"; } close SNMP; } else { print "0\n"; } &end();
Le envoie bien les données attendues par MRTG :
$ ./snmpprinters2mrtg printer 12456 82 days, 6:23 lpr
soit une ligne avec une donnée, une ligne avec l'uptime(1)
et une dernière ligne avec le nom d'hôte.
Pour chaque imprimante, ajouter dans mrtg.conf
des lignes sur le modèle suivant en changeant le nom de l'imprimante (ici printer
) :
Target[printer]: `/usr/local/eila/snmpprinters2mrtg printer` Title[printer]: Nombre de pages sur printer PageTop[printer]: <h1>Nombre de pages sur <tt>printer</tt></h1>
Filtrage des journaux
En travaux
Swatch permet de filtrer des journaux comme le font tail(1)
et grep(1)
.