El objetivo de este plugin de Nagios es comprobar que una pantalla nos muestra algún contenido específico. No es la panacea, porque se basa en OCR, pero en nuestro caso sirvió perfectamente puesto que permite la monitorización de pantallas de información para comprobar si están funcionando y mostrando la info que queremos o no.
La instalación requiere tesseract-ocr e imagemagick, así como algún módulo de perl adicional.
Instrucciones de prerequisitos (Debian Based distro)
apt-get install tesseract-ocr
apt-get install imagemagick
perl -MCPAN -eshell
cpan shell -- CPAN exploration and modules installation (v1.9402)
Enter 'h' for help.
cpan[1]> install Image::OCR::Tesseract
cpan[1]> install Net::VNC
Es recomendable hacer el siguiente cambio en el módulo de tesseract de perl para evitar ciertas salidas en medio de nuestro script:
Localizamos Tesserat.pm normalmente ubicado en
/usr/local/share/perl/X.Y.Z/Image/OCR/Tesseract.pm (en Debian)
donde X.Y.Z es la versión de perl que corresponda
Modificamos la línea donde se ejecuta el tessaract y añadir una redir del STDOUT a /dev/null
Es decir donde pone
my $cmd =
( sprintf '%s %s %s',
$WHICH_TESSERACT,
shell_quote($abs_image),
shell_quote($abs_image)
) .
( defined $lang ? " -l $lang" : '' ) .
" 2>/dev/null";
añadir >/dev/null tal que esto
my $cmd =
( sprintf '%s %s %s',
$WHICH_TESSERACT,
shell_quote($abs_image),
shell_quote($abs_image)
) .
( defined $lang ? " -l $lang" : '' ) .
" 2>/dev/null >/dev/null";
Código fuente del Script
#!/usr/bin/perl
use strict;
use warnings;
use Getopt::Std;
use Image::OCR::Tesseract 'get_ocr';
use File::Which 'which';
my $prg_n = "verificapantallas.pl";
my $prg_v = "v1.0";
my %opts;
my $vncc=which('vnccapture');
my $timeout="30";
my $retval = {
OK => 0,
WARNING => 1,
CRITICAL => 2,
UNKNOWN => 3
};
sub uso {
print @_ if @_;
print <<"EOF";
Uso: $prg_n -H <hostname|ip>
-H Hostname o IP de la pantalla a monitorizar
-P Clave de acceso VNC
-S Cadena a buscar
-U Realiza la comparación con todo e mayúsculas
-h Muestra esta ayuda
EOF
print "$prg_n $prg_v by Clean75" unless @_;
exit $retval->{UNKNOWN};
}
getopts('H:P:S:h:U', \%opts);
uso if defined $opts{h};
uso("Introduzca un nombre de host o IP!\n") unless defined $opts{H};
uso("Introduzca la clave del VNC!\n") unless defined $opts{P};
uso("Introduzca la cadena a comprobar!\n") unless defined $opts{S};
my $srv=$opts{H};
my $clave=$opts{P};
my $cadena=$opts{S};
my $flag_mayus = $opts{U};
my $P1="/tmp/$srv$$.png";
if(!-e $vncc)
{
uso("No se ha encontrado el $vncc\n");
}
$SIG{ALRM} = sub {
print "Error de timeout. Puedes incrementarlo (actual: $timeout)";
exit $retval->{CRITICAL};
};
`$vncc -H $srv -P $clave -o $P1`;
my $texto;
$texto=get_ocr($P1);
if($flag_mayus)
{
$cadena=uc($cadena);
$texto=uc($texto);
}
`/bin/rm -f $P1`;
if($texto=~/$cadena/)
{
print "OK: Pantalla $srv\n";
exit $retval->{OK};
}
else
{
print "CRITICAL: Pantalla $srv está malita\n";
exit $retval->{CRITICAL};
}
Prueba del script
(datos de parámetros ficticios, cada uno que ponga los que necesite)
/usr/lib/nagios/plugins/verificapantallas.pl -H 100.100.100.100 -P Clave -S Texto