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).

$ watch lpc status all

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

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).

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 fichier printcap(5),
  • Printing::ping() renvoie 1 si l'imprimante dont le nom est passé en argument répond aux requêtes ICMP echo_request, 0 sinon. La seule chose intéressante ici est l'OID 1.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>

En travaux

Swatch permet de filtrer des journaux comme le font tail(1) et grep(1).

  • user/pc/sysadmin/lprng-monitoring.txt
  • Dernière modification : 2011/07/25 03:24
  • de pc