Table of Contents
de NDO à PNP
Contributed by Yannig Perré
Comment utiliser ce script
Le but de ce script est d'importer le contenu de votre base de données NDO dans PNP4nagios. Pour se faire, nous utilisons un script d'export (ndo2pnp.pl) qui peut se connecter à la base MySQL de NDO et en exporter le contenu dans le format perfdata de nagios. Nous prenons ensuite cette extraction que nous injectons dans pnp4nagios en utilisant le mode bulk de pnp4nagios.
$ ./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.
Étape à suivre pour l'import de votre base ndo dans pnp4nagios
Voici les principales étapes à suivre :
- tout d'abord vérifier la connection à votre base de données NDO en listant vos 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
- A présent, exportons une partie du contenu dans un fichier perfdata :
$ ./ndo2pnp.pl --user <MYSQL_USER> -p <MYSQL_PASS> --export-as-pnp > /tmp/perfdata.bulk
Attention les enfants ! L'extraction peut durer très longtemps !
Ci-dessous un extrait du résultat de l'extraction :
$ more /tmp/perfdata.bulk DATATYPE::SERVICEPERFDATA TIMET::1277405698[...]SERVICESTATE::WARNING SERVICESTATETYPE::HARD
- A présent, il faut utiliser process_perfdata.pl (en tant qu'utilisateur nagios) de façon à importer notre extraction :
nagios@nagioshost:~$ /usr/share/pnp4nagios/libexec/process_perfdata.pl -b /tmp/perfdata.bulk --timeout 0
NB1: Ne pas oublier l'option –timeout 0. Si vous ne la mettez pas, vous allez avoir un timeout pendant l'insertion d'une grosse quantité de données de performance.
NB2: pensez à positionner l'option LOG_LEVEL dans le fichier de configuration process_perfdata.cfg
pour avoir des traces dans le fichier perfdata.log en cas de soucis.
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]."\n"; } } sub show_service { $request = "SELECT name1, name2 FROM $object_table WHERE objecttype_id = 2"; print STDERR "Hostname | Service\n"; print STDERR "-------------------------------+-------------------\n"; my $sth = $dbh->prepare($request); $sth->execute(); while(my @result = $sth->fetchrow_array()) { printf("%-30s | %s\n", $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\n" 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]}."\n"; } } 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\n"; exit; }