Translations of this page:

Nagios- und Hostinfos per script erzeugen

Vorraussetzungen:

  • ndo2fs oder livestatus
  • FTP-Server auf WikiServer
  • Changerooted FTP-User für den Transfer der infos zum WikiServer
  • NRPE bzw. NSClient++ auf den Hosts, die im Wiki dokumentiert werden sollen
  • Eine Hostgrouop NRPE bzw. NSClient zu der alle hosts gehören, die im Wiki dokumentiert werden

FTP-User

/etc/passwd:

WikiFTP:!:738:113:Wiki-FTP User:/usr/local/nagios/share/wiki/data/pages/nagios:/usr/bin/false

/etc/group:

nagios:!:113:nagios,apache,WikiFTP

Die UID und GID des Users sind wichtig, da ich diese in dem Perlscript verwende um den Owner und die Rechte zu setzen. Die Files im Wiki gehören normalerweise apache:nagios (Rechte 664). Um zu verhindern, daß die über das Script erzeugten Daten verändert werden, gehören diese Files WikiFTP:nagios (Rechte: 644). Username = Passwort

Konfiguration WINDOWS

NSC.ini

command[wikiupdate]=C:\Nagios\scripts\sys2wiki.bat

Die Batch-Datei sys2wiki.bat sieht so aus:

@echo off
cscript C:\Nagios\scripts\sys2wiki.vbs /H %COMPUTERNAME% /F host.txt /U blabla //Nologo
call ftp -i -s:"c:\temp\Wiki.cmd" {WikiServer} 1>NUL 2>NUL
del c:\temp\Wiki.cmd 1>NUL 2>NUL

:RC0
echo "Wikiupdate OK - %COMPUTERNAME%"
exit 0
goto ENDE
:RC1
echo "Warning - %1 warning"
exit 1
goto ENDE
:RC2
echo "Critical - %1 critical"
exit 2
goto ENDE
:RC3
echo "Unknown"
exit 3
goto ENDE

:ENDE

Der Hostname des WikiServers muß im FTP-Aufruf noch angepasst werden.

Das VB-Script sys2wiki.vbs von Dumps some windows hardware info in DokuWiki format habe ich nach dem wikifile.close um folgendes erweiter:

' Ausgabefile schliessen Objekte terminieren
wikifile.Close
Dim FTPcmd      : Set FTPcmd = objFs.CreateTextFile("c:\Temp\WIKI.cmd", True)
FTPcmd.WriteLine "WikiFTP"
FTPcmd.WriteLine "WikiFTP"
FTPcmd.WriteLine "cd " & LCase(strComputername) & "/"
FTPcmd.WriteLine "lcd c:\Nagios"
FTPcmd.WriteLine "put host hardware.txt"
FTPcmd.WriteLine "bye"
FTPcmd.close

Jetzt nur noch den NSClient neu starten damit die neue Konfiguration eingelsen wird.

Konfiguration AIX/Linux

Eintrag in der nrpe.cfg

command[wikiupdate]=/usr/local/nagios/tools/update-dokuwiki.sh

Das script update-dokuwiki.sh sieht so aus:

#!/usr/bin/ksh

case $(uname -s) in
  AIX|Linux)
    Hardware=/tmp/hardware.txt
    Server=$(hostname|tr '[:upper:]' '[:lower:]'|cut -f1 -d'.')
    /usr/local/nagios/tools/dokuwiki.sh >${Hardware}
    ftp -nv {WikiServer} <<EOFTP >/dev/null
user WikiFTP WikiFTP
lcd /tmp
cd /${Server}
put hardware.txt
bye
EOFTP
      rm -f ${Hardware}
      echo "Wikiupdate OK - ${Server}"
  ;;
  *)
    echo "No AIX or Linux Host"
  ;;
esac

Der Hostname des WikiServers muß im FTP-Aufruf noch angepasst werden.

Die Shell-Scripte sys2wiki.sh von Dumps some *unix hardware info in DokuWiki format für AIX und Linux habe ich nur umbenannt in dokuwiki.sh:

Perl-Script zum Sammeln der Daten für ndo2fs

update-wiki.pl

#!/usr/bin/perl

use Exporter;
use strict;
use JSON::XS;
use File::Path;

my $ndo2fsdir='/usr/local/nagios/var/VOLATILE/default';
my $wikidir='/usr/local/nagios/share/wiki/data/pages/nagios/';
my $hosts;
my $host;
my $hostlist=$ndo2fsdir.'/VIEWS/HOSTLIST';
my $services;
my $service;
my $servicelist=$ndo2fsdir.'/VIEWS/SERVICELIST';
my $file;

open ( FH, "<$hostlist" );
undef $/;
$hostlist = <FH> ;
close FH;
$hosts = decode_json $hostlist;

open ( FH, "<$servicelist" );
undef $/;
$servicelist = <FH> ;
close FH;
$services = decode_json $servicelist;


print "Updating Service-Infos for all monitored Services\n";
foreach $host (@{$hosts->{1400}})
{
  my $mydir=$wikidir.'/'.$host;
  mkpath($mydir,0,0775);
  chown(111,113,$mydir);
  chmod(0775,$mydir);
  $file = $ndo2fsdir.'/HOSTS/'.$host.'/CONFIG';
  open ( FH, "<$file" );
  undef $/;
  $file = <FH> ;
  close FH;
  my $hostdata = decode_json $file;

  my $svcout = $wikidir.'/'.$host.'/services.txt';
  open ( FOUT , ">$svcout" );
  foreach $service (@{$services->{$host}})
  {
     $service =~ tr/ /_/;
     $file = $ndo2fsdir.'/HOSTS/'.$host.'/'.$service.'/CONFIG';
     open ( FH, "<$file" );
     undef $/;
     $file = <FH> ;
     close FH;
     my $serviceconf = decode_json $file;
     $file = $ndo2fsdir.'/HOSTS/'.$host.'/'.$service.'/STATUS';
     open ( FH, "<$file" );
     undef $/;
     $file = <FH> ;
     close FH;
     my $servicedata = decode_json $file;
     if ($serviceconf->{ACTIONURL} ne "" ) {
       print FOUT "==== $service ====\n";
       print FOUT "\n";
       print FOUT "$servicedata->{OUTPUT}\n";
       print FOUT "\n";
       print FOUT "4 Stunden\n";
       print FOUT "\n";
       print FOUT "<html>\n";
       print FOUT '<img src="/nagios/pnp/index.php?display=image&srv='.$service.'&host='.$host.'&type=http&view=0">'."\n";
       print FOUT "</html>\n";
       print FOUT "\n";
       my $serviceout = $mydir.'/'.lc($service).'.txt';
       open ( SFOUT , ">$serviceout" );
       print SFOUT "==== $service ====\n";
       print SFOUT "\n";
       print SFOUT "$servicedata->{OUTPUT}\n";
       print SFOUT "\n";
       print SFOUT "4 Stunden\n";
       print SFOUT "\n";
       print SFOUT "<html>\n";
       print SFOUT '<img src="/nagios/pnp/index.php?display=image&srv='.$service.'&host='.$host.'&type=http&view=0">'."\n";
       print SFOUT "</html>\n";
       print SFOUT "\n";
       print SFOUT "24 Stunden\n";
       print SFOUT "\n";
       print SFOUT "<html>\n";
       print SFOUT '<img src="/nagios/pnp/index.php?display=image&srv='.$service.'&host='.$host.'&type=http&view=1">'."\n";
       print SFOUT "</html>\n";
       print SFOUT "\n";
       print SFOUT "1 Woche\n";
       print SFOUT "\n";
       print SFOUT "<html>\n";
       print SFOUT '<img src="/nagios/pnp/index.php?display=image&srv='.$service.'&host='.$host.'&type=http&view=2">'."\n";
       print SFOUT "</html>\n";
       print SFOUT "\n";
       print SFOUT "1 Monat\n";
       print SFOUT "\n";
       print SFOUT "<html>\n";
       print SFOUT '<img src="/nagios/pnp/index.php?display=image&srv='.$service.'&host='.$host.'&type=http&view=3">'."\n";
       print SFOUT "</html>\n";
       print SFOUT "\n";
       print SFOUT "1 Jahr\n";
       print SFOUT "\n";
       print SFOUT "<html>\n";
       print SFOUT '<img src="/nagios/pnp/index.php?display=image&srv='.$service.'&host='.$host.'&type=http&view=4">'."\n";
       print SFOUT "</html>\n";
       print SFOUT "\n";
       close SFOUT;
       chown(738,113,$serviceout);
       chmod(0644,$serviceout);
     } else {
       print FOUT "==== $service ====\n";
       print FOUT "\n";
       print FOUT "$servicedata->{OUTPUT}\n";
       print FOUT "\n";
     }
  }
  close FOUT;
  chown(738,113,$svcout);
  chmod(0644,$svcout);
}

print "Updating Hardware-Infos for UNIX-Clients\n";
my $hostlist=$ndo2fsdir.'/SERVICEGROUPS/NRPE/META';

open ( FH, "<$hostlist" );
undef $/;
$hostlist = <FH> ;
close FH;
$hosts = decode_json $hostlist;

foreach $host (@{$hosts->{"SERVICEGROUPMEMBER"}})
{
  my $h;
  my $s;
  ($h,$s)= split(/;/,$host,-1);
  system("/usr/local/nagios/libexec/check_nrpe -H ".$h." -n -c wikiupdate -t60 &");
}

print "Updating Hardware-Infos for Windows-Clients\n";
my $hostlist=$ndo2fsdir.'/SERVICEGROUPS/NSClient/META';

open ( FH, "<$hostlist" );
undef $/;
$hostlist = <FH> ;
close FH;
$hosts = decode_json $hostlist;

foreach $host (@{$hosts->{"SERVICEGROUPMEMBER"}})
{
  my $h;
  my $s;
  ($h,$s)= split(/;/,$host,-1);
  system("/usr/local/nagios/libexec/check_nrpe -H ".$h." -c wikiupdate -t60 &");
}

Perl-Script zum Sammeln der Daten für livestatus

update-wiki.pl

#!/usr/bin/perl

use strict;
use Monitoring::Livestatus;
my $nl = Monitoring::Livestatus->new( socket => '/usr/local/nagios/var/rw/live' );
my $host;

print "Updating Hardware-Infos for UNIX-Clients\n";
my $hosts = $nl->selectall_arrayref("GET servicegroups\nFilter: name = NRPE\nColumns: members");
foreach $host (@$hosts) {
  my @rechner = split(/,/,"@$host");
  my $r;
  foreach $r (@rechner) {
    my @pc = split(/\|/,$r);
    system("/usr/local/nagios/libexec/check_nrpe -H ".$pc[0]." -n -c wikiupdate -t60 &");
  }
}

print "Updating Hardware-Infos for Windows-Clients\n";
my $hosts = $nl->selectall_arrayref("GET servicegroups\nFilter: name = NSClient\nColumns: members");
foreach $host (@$hosts) {
  my @rechner = split(/,/,"@$host");
  my $r;
  foreach $r (@rechner) {
    my @pc = split(/\|/,$r);
    system("/usr/local/nagios/libexec/check_nrpe -H ".$pc[0]." -c wikiupdate -t60 &");
  }
}
nagios/howtos/wiki_create_inventory.txt · Zuletzt geändert: 2010/09/07 11:24 von little
CC Attribution-Noncommercial-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0