#!/usr/bin/perl -T use strict; use warnings; use VServer; use Nagios::Plugin; our $VERSION = '1.6'; our %desc = ( vm => 'virtual memory', rss => 'resident set size', anon => 'anonymous memory', vml => 'locked memory', ); sub init_nagios_plugin() { my $plugin = Nagios::Plugin->new( usage => "Usage: %s [-h|--help] [-w|--warnings=...] " . "[-c|--critical=...] [-d|--domain=...] [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 differnet memory types (VM, RSS, ANON, LOCK).", label => "RANGE[,RANGE[,RANGE[,RANGE]]]", ); $plugin->add_arg( spec => 'c|critical=s', help => "Critical thresholds for the differnet memory types (VM, RSS, ANON, LOCK).", label => "RANGE[,RANGE[,RANGE[,RANGE]]]", ); $plugin->add_arg( spec => 'd|domain=s', help => 'Domainname to append in bulk mode or to stip ' . 'in single host mode.', label => "DOMAIN", ); return $plugin; } sub parse_thresholds($) { my $arg = shift; if ($arg) { if ($arg =~ m/^([-:@~0-9]*),([-:@~0-9]*),([-:@~0-9]*),([-:@~0-9]*)$/) { return ($1, $2, $3, $4); } if ($arg =~ m/^([-:@~0-9]*),([-:@~0-9]*),([-:@~0-9]*)$/) { return ($1, $2, $3, $3); } if ($arg =~ m/^([-:@~0-9]*),([-:@~0-9]*)$/) { return ($1, $2, $2, $2); } if ($arg =~ m/^([-:@~0-9]*)$/) { return ($1, $1, $1, $1); } } return undef; } sub handle_vserver($$$$) { my $id = shift; my $warn = shift; my $crit = shift; my $name = shift; my $n = init_nagios_plugin(); my $mem = VServer::get_mem($id); if ($mem) { my @status = [ UNKNOWN ]; my $output = ""; for my $key (qw(vm rss anon vml)) { $n->add_perfdata(label => $key, value => $mem->{$key}, warning => $warn->{$key}, critical => $crit->{$key}, min => 0, ); push(@status, $n->check_threshold(check => $mem->{$key}, warning => $warn->{$key}, critical => $crit->{$key} ) ); my $mb = sprintf "%.2f", ($mem->{$key} / 1024) / 1024; $output .= " - $desc{$key}: ${mb}MB"; } $n->nagios_exit($n->max_state(@status), "used memory$output"); } } # 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{'vm'}, $warn{'rss'}, $warn{'anon'}, $warn{'vml'}) = parse_thresholds($n->opts->w); ($crit{'vm'}, $crit{'rss'}, $crit{'anon'}, $crit{'vml'}) = parse_thresholds($n->opts->c); my $vserver = shift; unless ($vserver) { $n->nagios_exit(UNKNOWN, "vserver name required"); } my $domain = ''; $domain = ('.' . $n->opts->d) if $n->opts->d; $domain = quotemeta $domain; $vserver =~ s/$domain$//; my $context = VServer::get_context_id($vserver); unless ($context) { $n->nagios_exit(UNKNOWN, "vserver '$vserver' not found"); } handle_vserver($context, \%warn, \%crit, $vserver); $n->nagios_exit(UNKNOWN, 'unable to parse memory statistics');