#!/usr/bin/perl -T use strict; use warnings; use VServer; use Nagios::Plugin; our $VERSION = '1.6'; sub init_nagios_plugin() { my $plugin = Nagios::Plugin->new( usage => "Usage: %s [-h|--help] [-w|--warnings=...] " . "[-c|--critical=...] vserver-name", version => $VERSION, blurb => "This plugin could monitor the load of single vserver guests." ); $plugin->add_arg( spec => 'w|warning=s', help => "Warning thresholds for the different load types.", label => "INTEGER[,INTEGER[,INTEGER]]", ); $plugin->add_arg( spec => 'c|critical=s', help => "Critical thresholds for the different load types.", label => "INTEGER[,INTEGER[,INTEGER]]", ); return $plugin; } sub parse_thresholds($) { my $arg = shift; if ($arg) { if ($arg =~ m/([0-9]+),([0-9]+),([0-9]+)/) { return ($1, $2, $3); } if ($arg =~ m/([0-9]+),([0-9]+)/) { return ($1, $2, $2); } if ($arg =~ m/([0-9]+)/) { return ($1, $1, $1); } } return (0, 0, 0); } sub get_load($$) { my $n = shift; my $context = shift; my $proc = VServer::get_proc_dir($context); unless ($proc) { $n->nagios_exit(UNKNOWN, "vserver not running"); } open(my $cvirt, "<", "$proc/cvirt") || $n->nagios_exit(UNKNOWN, "could not open '$proc/cvirt'"); my @load = undef; while (<$cvirt>) { if ($_ =~ m/^loadavg:\s*([0-9.]+)\s*([0-9.]+)\s*([0-9.]+)$/) { @load = ($1, $2, $3); last; } } close($cvirt); return @load; } # fix taint mode if ($0 =~ m/(\w[\w\/]*\w)/) { $ENV{'NAGIOS_PLUGIN'} = $1; } my $n = init_nagios_plugin(); $n->getopts(); alarm $n->opts->timeout; my (%warn, %crit); ($warn{'load1'}, $warn{'load5'}, $warn{'load15'}) = parse_thresholds($n->opts->w); ($crit{'load1'}, $crit{'load5'}, $crit{'load15'}) = parse_thresholds($n->opts->c); for my $load (qw( load1 load5 load15 )) { if ($crit{$load} < $warn{$load}) { $n->nagios_exit(UNKNOWN, "Parameter inconsistency: warning load" . "is greater than critical load for '$load'"); } } my $vserver = shift; unless ($vserver) { $n->nagios_exit(UNKNOWN, "vserver name required"); } my $context = VServer::get_context_id($vserver); unless ($context) { $n->nagios_exit(UNKNOWN, "vserver '$vserver' not found"); } my @load = get_load($n, $context); if (@load) { my %values; ($values{'load1'}, $values{'load5'}, $values{'load15'}) = @load; my @status = [ UNKNOWN ]; my $output = ""; for my $load (qw( load1 load5 load15 )) { $n->add_perfdata(label => $load, value => $values{$load}, warning => $warn{$load}, critical => $crit{$load}, min => 0, ); push(@status, $n->check_threshold(check => $values{$load}, warning => $warn{$load}, critical => $crit{$load} ) ); $output .= " $values{$load}"; } $n->nagios_exit($n->max_state(@status), "load average:$output"); } $n->nagios_exit(UNKNOWN, 'unable to parse loadavg');