1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
|
#!/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=...] [-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 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]]",
);
$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]*)$/) {
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 undef;
}
# 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 (defined $crit{$load} && defined $warn{$load} && $crit{$load} < $warn{$load}) {
die("Parameter inconsistency: warning load is greater " .
"than critical load for '$load'");
}
}
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");
}
my $load = VServer::get_loadavg($id);
if (@load) {
my @status = [ UNKNOWN ];
my $output = "";
for my $key (qw( load1 load5 load15 )) {
$n->add_perfdata(label => $key,
value => $load->{$key},
warning => $warn{$key},
critical => $crit{$key},
min => 0,
);
push(@status,
$n->check_threshold(check => $load->{$key},
warning => $warn{$key},
critical => $crit{$key}
)
);
$output .= " $load->{$key}";
}
$n->nagios_exit($n->max_state(@status), "load average:$output");
}
$n->nagios_exit(UNKNOWN, 'unable to parse loadavg');
|