NDO to PNP( ndoutils to PNP4Nagios)

51872 ワード

How to use this script
The aim of this script is to import your ndo database directly into PNP4nagios. To do so, we use an exporter (ndo2pnp.pl) that can connect throught MySQL database and export contents into the same format as perfdata expected from nagios. Then we plug this into pnp4nagios using bulk option.
  $ ./ndo2pnp.pl --help   Usage :     -h  --help            Display this message.         --version         Display version then exit.     -v  --verbose         Verbose run.     -u  --user <NDOUSER>  Log on to database with <NDOUSER> (default root).     -p  --pass <PASSWD>   Use <PASSWD> to logon (default gbu2kfe).     -t  --type <DBTYPE>   Change database type (default mysql).         --host <DBHOST>   Use <DBHOST> (default localhost).         --dbname <DB>     Use <DB> for ndo database name (default ndoutils).         --list-machine    Display machine definition in ndo database.         --list-service    Show services defined.         --export-as-pnp   Export ndo content as a bulk file used by process_perfdata.pl.

Main step to import ndo database into pnp4nagios
Here's the main step you can follow :
first, check your database connectivity by listing your services :
  $ ./ndo2pnp.pl --user <MYSQL_USER> -p <MYSQL_PASS> --list-service   Hostname                       | Service   -------------------------------+-------------------   gateway                        | PING   localhost                      | Current Load   localhost                      | Current Users   localhost                      | Disk Space   localhost                      | HTTP   localhost                      | SSH   localhost                      | Total Processes

then, export database contents into perfdata file :
  $ ./ndo2pnp.pl --user <MYSQL_USER> -p <MYSQL_PASS> --export-as-pnp > /tmp/perfdata.bulk

Beware children ! This extraction can take a huge slice of time !
Here's a small extraction of this export :
  $ more /tmp/perfdata.bulk    DATATYPE::SERVICEPERFDATA       TIMET::1277405698[...]SERVICESTATE::WARNING   SERVICESTATETYPE::HARD

Now, use process_perfdata.pl (as nagios user) in order to import your extraction :
  nagios@nagioshost:~$ /usr/share/pnp4nagios/libexec/process_perfdata.pl -b /tmp/perfdata.bulk --timeout 0

NB1: don't forget the --timeout 0. If you forget this option, you'll get timeout while importing big chunks of services.
NB2: use the LOG_LEVEL option in the config file  process_perfdata.cfg  to get a feedback in the perfdata.log file.
ndo2pnp.pl
ndo2pnp.pl
#!/usr/bin/perl   use strict; use warnings; use Getopt::Long; use File::Basename;   my $version       = 0.1; my $verbose       = 0; my $show_help     = 0; my $show_machine  = 0; my $show_service  = 0; my $type          = "mysql"; my $db_name       = "ndoutils"; my $user          = "root"; my $password      = "root"; my $host          = "localhost"; my $export_as_pnp = 0;   my $service_table = "nagios_servicechecks"; my $object_table  = "nagios_objects"; my $start_time = 0; my $end_time = 0; my $filter_machine = 0; my $filter_service = 0;   sub usage {   print "Usage :   -h  --help            Display this message.       --version         Display version then exit.   -v  --verbose         Verbose run.   -u  --user <NDOUSER>  Log on to database with <NDOUSER> (default $user).   -p  --pass <PASSWD>   Use <PASSWD> to logon (default $password).   -t  --type <DBTYPE>   Change database type (default $type).       --host <DBHOST>   Use <DBHOST> (default $host).       --dbname <DB>     Use <DB> for ndo database name (default $db_name).       --list-machine    Display machine definition in ndo database.       --list-service    Show services defined.       --export-as-pnp   Export ndo content as a bulk file used by process_perfdata.pl.   "; }   GetOptions(     "version"       => \$version,     "v"             => \$verbose,     "verbose"       => \$verbose,     "h"             => \$show_help,     "help"          => \$show_help,     "u=s"           => \$user,     "user=s"        => \$user,     "username=s"    => \$user,     "p=s"           => \$password,     "pass=s"        => \$password,     "password=s"    => \$password,     "type=s"        => \$type,     "dbname=s"      => \$db_name,     "host=s"        => \$host,     "list-machine"  => \$show_machine,     "list-service"  => \$show_service,     "export-as-pnp" => \$export_as_pnp,     "machines=s"    => \$filter_machine,     "services=s"    => \$filter_service, );   if($show_help) {   usage ; exit(); }   use DBI; my $dbh = 0;   sub connect_db {   $dbh = DBI->connect("DBI:$type:$db_name;host=$host", $user, $password) || die "Could not connect to database: $DBI::errstr"; }   my $request = 0;   sub show_machine {   $request = "SELECT name1 FROM $object_table WHERE objecttype_id = 1";   my $sth = $dbh->prepare($request);   $sth->execute();   while(my @result = $sth->fetchrow_array()) {     print $result[0]."
"
; } }   sub show_service { $request = "SELECT name1, name2 FROM $object_table WHERE objecttype_id = 2"; print STDERR "Hostname | Service
"
; print STDERR "-------------------------------+-------------------
"
; my $sth = $dbh->prepare($request); $sth->execute(); while(my @result = $sth->fetchrow_array()) { printf("%-30s | %s
"
, $result[0], $result[1]); } }   sub export_as_pnp { my %status = (0, "OK", "1", "WARNING", 2, "CRITICAL", 3, "UNKNOWN"); my %state_type = (0, "SOFT", 1 , "HARD"); my $request_filter = "1"; if($start_time) { $request_filter .= " AND $service_table.start_time > '$start_time' "; } if($end_time) { $request_filter .= " AND $service_table.start_time <= '$end_time' "; } if($filter_machine) { my @machines = split(/\s*,\s*/, $filter_machine); $request_filter .= " AND $object_table.name1 IN ('".join("','", @machines)."') "; } if($filter_service) { my @services = split(/\s*,\s*/, $filter_service); $request_filter .= " AND $object_table.name2 IN ('".join("','", @services)."') "; } $request = "SELECT UNIX_TIMESTAMP(start_time), name1, name2, perfdata, command_line, command_args, output, state, state_type FROM $service_table, $object_table WHERE $service_table.service_object_id = $object_table.object_id AND length(perfdata) > 0 AND $request_filter ORDER BY $service_table.start_time "; print "$request
"
if($verbose); my $sth = $dbh->prepare($request); $sth->execute(); while(my @r = $sth->fetchrow_array()) { basename($r[4]) =~ /^(\w+).*/; my $cmd = "$1"; $cmd .= ($r[5] ? "!".$r[5] : ""); print "DATATYPE::SERVICEPERFDATA\tTIMET::".$r[0]."\tHOSTNAME::".$r[1]."\tSERVICEDESC::".$r[2]."\tSERVICEPERFDATA::".$r[3]. "\tSERVICECHECKCOMMAND::$cmd\tHOSTSTATE::OK\tHOSTSTATETYPE::HARD\tSERVICESTATE::".$status{$r[7]}."\tSERVICESTATETYPE::".$state_type{$r[8]}."
"
; } }   my $format = "%s"; if($show_machine) { connect_db(); show_machine(); } elsif($show_service) { connect_db(); show_service(); } elsif($export_as_pnp) { connect_db(); export_as_pnp(); } else { print "Nothing to do
"
; exit; }

 
https://docs.pnp4nagios.org/pnp-0.6/ndo2pnp