line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
package JMX::Jmx4Perl::Nagios::CheckJmx4Perl; |
2
|
|
|
|
|
|
|
|
3
|
1
|
|
|
1
|
|
1522
|
use strict; |
|
1
|
|
|
|
|
1
|
|
|
1
|
|
|
|
|
25
|
|
4
|
1
|
|
|
1
|
|
4
|
use warnings; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
27
|
|
5
|
1
|
|
|
1
|
|
5
|
use JMX::Jmx4Perl::Nagios::SingleCheck; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
24
|
|
6
|
1
|
|
|
1
|
|
579
|
use JMX::Jmx4Perl::Nagios::MessageHandler; |
|
1
|
|
|
|
|
3
|
|
|
1
|
|
|
|
|
27
|
|
7
|
1
|
|
|
1
|
|
5
|
use JMX::Jmx4Perl; |
|
1
|
|
|
|
|
1
|
|
|
1
|
|
|
|
|
18
|
|
8
|
1
|
|
|
1
|
|
5
|
use JMX::Jmx4Perl::Request; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
64
|
|
9
|
1
|
|
|
1
|
|
6
|
use JMX::Jmx4Perl::Response; |
|
1
|
|
|
|
|
1
|
|
|
1
|
|
|
|
|
30
|
|
10
|
1
|
|
|
1
|
|
5
|
use Data::Dumper; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
41
|
|
11
|
1
|
|
|
1
|
|
5
|
use Monitoring::Plugin; |
|
1
|
|
|
|
|
1
|
|
|
1
|
|
|
|
|
55
|
|
12
|
1
|
|
|
1
|
|
4
|
use Monitoring::Plugin::Functions qw(:codes %ERRORS %STATUS_TEXT); |
|
1
|
|
|
|
|
3
|
|
|
1
|
|
|
|
|
156
|
|
13
|
1
|
|
|
1
|
|
833
|
use Time::HiRes qw(gettimeofday tv_interval); |
|
1
|
|
|
|
|
1400
|
|
|
1
|
|
|
|
|
5
|
|
14
|
1
|
|
|
1
|
|
141
|
use Carp; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
61
|
|
15
|
1
|
|
|
1
|
|
5
|
use Text::ParseWords; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
4811
|
|
16
|
|
|
|
|
|
|
|
17
|
|
|
|
|
|
|
our $AUTOLOAD; |
18
|
|
|
|
|
|
|
|
19
|
|
|
|
|
|
|
=head1 NAME |
20
|
|
|
|
|
|
|
|
21
|
|
|
|
|
|
|
JMX::Jmx4Perl::Nagios::CheckJmx4Perl - Module for encapsulating the functionality of |
22
|
|
|
|
|
|
|
L |
23
|
|
|
|
|
|
|
|
24
|
|
|
|
|
|
|
=head1 SYNOPSIS |
25
|
|
|
|
|
|
|
|
26
|
|
|
|
|
|
|
# One line in check_jmx4perl to rule them all |
27
|
|
|
|
|
|
|
JMX::Jmx4Perl::Nagios::CheckJmx4Perl->new()->execute(); |
28
|
|
|
|
|
|
|
|
29
|
|
|
|
|
|
|
=head1 DESCRIPTION |
30
|
|
|
|
|
|
|
|
31
|
|
|
|
|
|
|
The purpose of this module is to encapsulate a single run of L |
32
|
|
|
|
|
|
|
in a perl object. This allows for C to run within the embedded |
33
|
|
|
|
|
|
|
Nagios perl interpreter (ePN) wihout interfering with other, potential |
34
|
|
|
|
|
|
|
concurrent, runs of this check. Please refer to L for |
35
|
|
|
|
|
|
|
documentation on how to use this check. This module is probably I of |
36
|
|
|
|
|
|
|
general interest and serves only the purpose described above. |
37
|
|
|
|
|
|
|
|
38
|
|
|
|
|
|
|
Its main task is to set up one ore more L |
39
|
|
|
|
|
|
|
objects from command line arguments and optionally from a configuration file. |
40
|
|
|
|
|
|
|
|
41
|
|
|
|
|
|
|
=head1 METHODS |
42
|
|
|
|
|
|
|
|
43
|
|
|
|
|
|
|
=over |
44
|
|
|
|
|
|
|
|
45
|
|
|
|
|
|
|
=item $check = new $JMX::Jmx4Perl::Nagios::CheckJmx4Perl() |
46
|
|
|
|
|
|
|
|
47
|
|
|
|
|
|
|
Set up a object used for a single check. It will parse the command line |
48
|
|
|
|
|
|
|
arguments and any configuation file given. |
49
|
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
=cut |
51
|
|
|
|
|
|
|
|
52
|
|
|
|
|
|
|
sub new { |
53
|
1
|
|
|
1
|
1
|
590
|
my $class = shift; |
54
|
1
|
|
|
|
|
2
|
my $self = { }; |
55
|
1
|
|
33
|
|
|
9
|
bless $self,(ref($class) || $class); |
56
|
1
|
|
|
|
|
4
|
$self->{np} = $self->create_nagios_plugin(); |
57
|
1
|
|
|
|
|
3
|
$self->{cmd_args} = [ @ARGV ]; |
58
|
|
|
|
|
|
|
|
59
|
1
|
50
|
|
|
|
5
|
$self->_print_doc_and_exit($self->{np}->opts->{doc}) if defined $self->{np}->opts->{doc}; |
60
|
1
|
|
|
|
|
13
|
$self->_verify_and_initialize(); |
61
|
1
|
|
|
|
|
22
|
return $self; |
62
|
|
|
|
|
|
|
} |
63
|
|
|
|
|
|
|
|
64
|
|
|
|
|
|
|
=back |
65
|
|
|
|
|
|
|
|
66
|
|
|
|
|
|
|
=head1 $check->execute() |
67
|
|
|
|
|
|
|
|
68
|
|
|
|
|
|
|
Send the JMX request to the server monitored and print out a nagios output. |
69
|
|
|
|
|
|
|
|
70
|
|
|
|
|
|
|
=cut |
71
|
|
|
|
|
|
|
|
72
|
|
|
|
|
|
|
sub execute { |
73
|
0
|
|
|
0
|
0
|
0
|
my $self = shift; |
74
|
0
|
|
|
|
|
0
|
my $np = $self->{np}; |
75
|
0
|
|
|
|
|
0
|
eval { |
76
|
|
|
|
|
|
|
# Request |
77
|
0
|
|
|
|
|
0
|
my @optional = (); |
78
|
|
|
|
|
|
|
|
79
|
0
|
|
|
|
|
0
|
my $error_stat = { }; |
80
|
0
|
|
|
|
|
0
|
my $target_config = $self->target_config; |
81
|
|
|
|
|
|
|
my $jmx = JMX::Jmx4Perl->new(mode => "agent", url => $self->url, user => $self->user, |
82
|
|
|
|
|
|
|
password => $self->password, |
83
|
|
|
|
|
|
|
product => $self->product, |
84
|
|
|
|
|
|
|
proxy => $self->proxy_config, |
85
|
0
|
|
0
|
|
|
0
|
timeout => $np->opts->{timeout} || 180, |
86
|
|
|
|
|
|
|
target => $target_config, |
87
|
|
|
|
|
|
|
# For Jolokia agents < 1.0 |
88
|
|
|
|
|
|
|
'legacy-escape' => $self->legacy_escape); |
89
|
0
|
|
|
|
|
0
|
my @requests; |
90
|
0
|
|
|
|
|
0
|
for my $check (@{$self->{checks}}) { |
|
0
|
|
|
|
|
0
|
|
91
|
0
|
|
|
|
|
0
|
push @requests,@{$check->get_requests($jmx,\@ARGV)}; |
|
0
|
|
|
|
|
0
|
|
92
|
|
|
|
|
|
|
} |
93
|
0
|
|
|
|
|
0
|
my $responses = $self->_send_requests($jmx,@requests); |
94
|
|
|
|
|
|
|
#print Dumper($responses); |
95
|
0
|
|
|
|
|
0
|
my @extra_requests = (); |
96
|
0
|
|
|
|
|
0
|
my $nr_checks = scalar(@{$self->{checks}}); |
|
0
|
|
|
|
|
0
|
|
97
|
0
|
0
|
|
|
|
0
|
if ($nr_checks == 1) { |
98
|
0
|
|
|
|
|
0
|
eval { |
99
|
0
|
|
|
|
|
0
|
my @r = $self->{checks}->[0]->extract_responses($responses,\@requests,{ target => $target_config }); |
100
|
0
|
0
|
|
|
|
0
|
push @extra_requests,@r if @r; |
101
|
|
|
|
|
|
|
}; |
102
|
0
|
0
|
|
|
|
0
|
$self->nagios_die($@) if $@; |
103
|
|
|
|
|
|
|
} else { |
104
|
0
|
|
|
|
|
0
|
my $i = 1; |
105
|
0
|
|
|
|
|
0
|
for my $check (@{$self->{checks}}) { |
|
0
|
|
|
|
|
0
|
|
106
|
|
|
|
|
|
|
# A check can consume more than one response |
107
|
0
|
|
|
|
|
0
|
my $prefix = $self->_multi_check_prefix($check,$i++,$nr_checks); |
108
|
0
|
|
|
|
|
0
|
eval { |
109
|
0
|
|
|
|
|
0
|
my @r = $check->extract_responses($responses,\@requests, |
110
|
|
|
|
|
|
|
{ |
111
|
|
|
|
|
|
|
target => $target_config, |
112
|
|
|
|
|
|
|
prefix => $prefix, |
113
|
|
|
|
|
|
|
error_stat => $error_stat |
114
|
|
|
|
|
|
|
}); |
115
|
0
|
0
|
|
|
|
0
|
push @extra_requests,@r if @r; |
116
|
|
|
|
|
|
|
}; |
117
|
0
|
0
|
|
|
|
0
|
if ($@) { |
118
|
0
|
|
|
|
|
0
|
my $txt = $@; |
119
|
0
|
|
|
|
|
0
|
$txt =~ s/^(.*?)\n.*$/$1/s; |
120
|
0
|
0
|
|
|
|
0
|
my $code = $np->opts->{'unknown-is-critical'} ? CRITICAL : UNKNOWN; |
121
|
0
|
|
|
|
|
0
|
$check->update_error_stats($error_stat,$code); |
122
|
0
|
|
|
|
|
0
|
$prefix =~ s/\%c/$STATUS_TEXT{$code}/g; |
123
|
0
|
|
0
|
|
|
0
|
my $msg_handler = $np->{msg_handler} || $np; |
124
|
0
|
|
|
|
|
0
|
$msg_handler->add_message($code,$prefix . $txt); |
125
|
|
|
|
|
|
|
} |
126
|
|
|
|
|
|
|
} |
127
|
|
|
|
|
|
|
} |
128
|
|
|
|
|
|
|
# Send extra requests, e.g. for switching on the history |
129
|
0
|
0
|
|
|
|
0
|
if (@extra_requests) { |
130
|
0
|
|
|
|
|
0
|
$self->_send_requests($jmx,@extra_requests); |
131
|
|
|
|
|
|
|
} |
132
|
|
|
|
|
|
|
|
133
|
|
|
|
|
|
|
# Different outputs for multi checks/single checks |
134
|
0
|
|
|
|
|
0
|
$self->do_exit($error_stat); |
135
|
|
|
|
|
|
|
}; |
136
|
0
|
0
|
|
|
|
0
|
if ($@) { |
137
|
|
|
|
|
|
|
# p1.pl, the executing script of the embedded nagios perl interpreter |
138
|
|
|
|
|
|
|
# uses this tag to catch an exit code of a plugin. We rethrow this |
139
|
|
|
|
|
|
|
# exception if we detect this pattern. |
140
|
0
|
0
|
|
|
|
0
|
if ($@ !~ /^ExitTrap:/) { |
141
|
0
|
|
|
|
|
0
|
$self->nagios_die("Error: $@"); |
142
|
|
|
|
|
|
|
} else { |
143
|
0
|
|
|
|
|
0
|
die $@; |
144
|
|
|
|
|
|
|
} |
145
|
|
|
|
|
|
|
} |
146
|
|
|
|
|
|
|
} |
147
|
|
|
|
|
|
|
|
148
|
|
|
|
|
|
|
=head1 $check->exit() |
149
|
|
|
|
|
|
|
|
150
|
|
|
|
|
|
|
Write out result and exit. This method can be overridden to provide a custom |
151
|
|
|
|
|
|
|
output, which can be extracted from NagiosPlugin object. |
152
|
|
|
|
|
|
|
|
153
|
|
|
|
|
|
|
=cut |
154
|
|
|
|
|
|
|
|
155
|
|
|
|
|
|
|
sub do_exit { |
156
|
0
|
|
|
0
|
0
|
0
|
my $self = shift; |
157
|
0
|
|
|
|
|
0
|
my $error_stat = shift; |
158
|
0
|
|
|
|
|
0
|
my $np = $self->{np}; |
159
|
|
|
|
|
|
|
|
160
|
0
|
|
0
|
|
|
0
|
my $msg_handler = $np->{msg_handler} || $np; |
161
|
0
|
|
|
|
|
0
|
my ($code,$message) = $msg_handler->check_messages(join => "\n", join_all => "\n"); |
162
|
0
|
0
|
|
|
|
0
|
($code,$message) = $self->_prepare_multicheck_message($np,$code,$message,$error_stat) if scalar(@{$self->{checks}}) > 1; |
|
0
|
|
|
|
|
0
|
|
163
|
|
|
|
|
|
|
|
164
|
0
|
|
|
|
|
0
|
$np->nagios_exit($code, $message); |
165
|
|
|
|
|
|
|
} |
166
|
|
|
|
|
|
|
|
167
|
|
|
|
|
|
|
sub _prepare_multicheck_message { |
168
|
0
|
|
|
0
|
|
0
|
my $self = shift; |
169
|
0
|
|
|
|
|
0
|
my $np = shift; |
170
|
0
|
|
|
|
|
0
|
my $code = shift; |
171
|
0
|
|
|
|
|
0
|
my $message = shift; |
172
|
0
|
|
|
|
|
0
|
my $error_stat = shift; |
173
|
|
|
|
|
|
|
|
174
|
0
|
|
|
|
|
0
|
my $summary; |
175
|
0
|
|
0
|
|
|
0
|
my $labels = $self->{multi_check_labels} || {}; |
176
|
0
|
|
|
|
|
0
|
my $nr_checks = scalar(@{$self->{checks}}); |
|
0
|
|
|
|
|
0
|
|
177
|
0
|
|
|
|
|
0
|
$code = $self->_check_for_UNKNOWN($error_stat,$code); |
178
|
0
|
0
|
|
|
|
0
|
if ($code eq OK) { |
179
|
|
|
|
|
|
|
$summary = $self->_format_multicheck_ok_summary($labels->{summary_ok} || |
180
|
0
|
|
0
|
|
|
0
|
"All %n checks OK",$nr_checks); |
181
|
|
|
|
|
|
|
} else { |
182
|
|
|
|
|
|
|
$summary = $self->_format_multicheck_failure_summary($labels->{summary_failure} || |
183
|
0
|
|
0
|
|
|
0
|
"%e of %n checks failed [%d]", |
184
|
|
|
|
|
|
|
$nr_checks, |
185
|
|
|
|
|
|
|
$error_stat); |
186
|
|
|
|
|
|
|
} |
187
|
0
|
|
|
|
|
0
|
return ($code,$summary . "\n" . $message); |
188
|
|
|
|
|
|
|
} |
189
|
|
|
|
|
|
|
|
190
|
|
|
|
|
|
|
# UNKNOWN shadows everything else |
191
|
|
|
|
|
|
|
sub _check_for_UNKNOWN { |
192
|
0
|
|
|
0
|
|
0
|
my $self = shift; |
193
|
0
|
|
|
|
|
0
|
my $error_stat = shift; |
194
|
0
|
|
|
|
|
0
|
my $code = shift; |
195
|
0
|
0
|
0
|
|
|
0
|
return $error_stat->{UNKNOWN} && scalar(@$error_stat->{UNKNOWN}) ? UNKNOWN : $code; |
196
|
|
|
|
|
|
|
} |
197
|
|
|
|
|
|
|
|
198
|
|
|
|
|
|
|
sub _format_multicheck_ok_summary { |
199
|
0
|
|
|
0
|
|
0
|
my $self = shift; |
200
|
0
|
|
|
|
|
0
|
my $format = shift; |
201
|
0
|
|
|
|
|
0
|
my $nr_checks = shift; |
202
|
0
|
|
|
|
|
0
|
my $ret = $format; |
203
|
0
|
|
|
|
|
0
|
$ret =~ s/\%n/$nr_checks/g; |
204
|
0
|
|
|
|
|
0
|
return $ret; |
205
|
|
|
|
|
|
|
} |
206
|
|
|
|
|
|
|
|
207
|
|
|
|
|
|
|
sub _format_multicheck_failure_summary { |
208
|
0
|
|
|
0
|
|
0
|
my $self = shift; |
209
|
0
|
|
|
|
|
0
|
my $format = shift; |
210
|
0
|
|
|
|
|
0
|
my $nr_checks = shift; |
211
|
0
|
|
|
|
|
0
|
my $error_stat = shift; |
212
|
|
|
|
|
|
|
|
213
|
0
|
|
|
|
|
0
|
my $ret = $format; |
214
|
|
|
|
|
|
|
|
215
|
0
|
|
|
|
|
0
|
my $details = ""; |
216
|
0
|
|
|
|
|
0
|
my $total_errors = 0; |
217
|
0
|
|
|
|
|
0
|
for my $code (UNKNOWN,CRITICAL,WARNING) { |
218
|
0
|
0
|
|
|
|
0
|
if (my $errs = $error_stat->{$code}) { |
219
|
0
|
|
|
|
|
0
|
$details .= scalar(@$errs) . " " . $STATUS_TEXT{$code} . " (" . join (",",@$errs) . "), "; |
220
|
0
|
|
|
|
|
0
|
$total_errors += scalar(@$errs); |
221
|
|
|
|
|
|
|
} |
222
|
|
|
|
|
|
|
} |
223
|
0
|
0
|
|
|
|
0
|
if ($total_errors > 0) { |
224
|
|
|
|
|
|
|
# Cut off extra chars at the end |
225
|
0
|
|
|
|
|
0
|
$details = substr($details,0,-2); |
226
|
|
|
|
|
|
|
} |
227
|
|
|
|
|
|
|
|
228
|
0
|
|
|
|
|
0
|
$ret =~ s/\%d/$details/g; |
229
|
0
|
|
|
|
|
0
|
$ret =~ s/\%e/$total_errors/g; |
230
|
0
|
|
|
|
|
0
|
$ret =~ s/\%n/$nr_checks/g; |
231
|
0
|
|
|
|
|
0
|
return $ret; |
232
|
|
|
|
|
|
|
} |
233
|
|
|
|
|
|
|
|
234
|
|
|
|
|
|
|
# Create a formatted prefix for multicheck output |
235
|
|
|
|
|
|
|
sub _multi_check_prefix { |
236
|
0
|
|
|
0
|
|
0
|
my $self = shift; |
237
|
0
|
|
|
|
|
0
|
my $check = shift; |
238
|
0
|
|
|
|
|
0
|
my $idx = shift; |
239
|
0
|
|
|
|
|
0
|
my $max = shift; |
240
|
|
|
|
|
|
|
|
241
|
0
|
|
|
|
|
0
|
my $c = $check->{config}; |
242
|
|
|
|
|
|
|
|
243
|
0
|
|
|
|
|
0
|
my $l = length($max); |
244
|
|
|
|
|
|
|
|
245
|
|
|
|
|
|
|
return sprintf("[%$l.${l}s] %%c ",$idx) |
246
|
0
|
0
|
0
|
|
|
0
|
if (defined($c->{multicheckprefix}) && !length($c->{multicheckprefix})); |
247
|
|
|
|
|
|
|
|
248
|
0
|
|
0
|
|
|
0
|
my $label = $c->{multicheckprefix} || $c->{name} || $c->{key} || ""; |
249
|
0
|
|
|
|
|
0
|
return sprintf("[%$l.${l}s] %%c %s: ",$idx,$label); |
250
|
|
|
|
|
|
|
} |
251
|
|
|
|
|
|
|
|
252
|
|
|
|
|
|
|
|
253
|
|
|
|
|
|
|
# Send the requests via the build up agent |
254
|
|
|
|
|
|
|
sub _send_requests { |
255
|
0
|
|
|
0
|
|
0
|
my ($self,$jmx,@requests) = @_; |
256
|
0
|
|
|
|
|
0
|
my $o = $self->{opts}; |
257
|
|
|
|
|
|
|
|
258
|
0
|
|
|
|
|
0
|
my $start_time; |
259
|
0
|
0
|
|
|
|
0
|
if ($o->verbose) { |
260
|
|
|
|
|
|
|
# TODO: Print summary of request (GET vs POST) |
261
|
0
|
0
|
|
|
|
0
|
if ($self->user) { |
262
|
0
|
|
|
|
|
0
|
print "Remote User: ",$o->user,"\n"; |
263
|
|
|
|
|
|
|
} |
264
|
0
|
|
|
|
|
0
|
$start_time = [gettimeofday]; |
265
|
|
|
|
|
|
|
} |
266
|
|
|
|
|
|
|
# Detangle request for direct method calls and JMX requests to call: |
267
|
0
|
|
|
|
|
0
|
my $req_map = $self->_detangle_requests(\@requests); |
268
|
0
|
|
|
|
|
0
|
my @responses = (); |
269
|
|
|
|
|
|
|
|
270
|
0
|
|
|
|
|
0
|
$self->_execute_scripts(\@responses,$req_map); |
271
|
0
|
|
|
|
|
0
|
$self->_execute_requests(\@responses,$req_map,$jmx); |
272
|
|
|
|
|
|
|
|
273
|
0
|
0
|
|
|
|
0
|
if ($o->verbose) { |
274
|
0
|
|
|
|
|
0
|
print "Result fetched in ",tv_interval($start_time) * 1000," ms:\n"; |
275
|
0
|
|
|
|
|
0
|
print Dumper(\@responses); |
276
|
|
|
|
|
|
|
} |
277
|
0
|
|
|
|
|
0
|
return \@responses; |
278
|
|
|
|
|
|
|
} |
279
|
|
|
|
|
|
|
|
280
|
|
|
|
|
|
|
# Split up request for code-requests (i.e. scripts given in the configuration) |
281
|
|
|
|
|
|
|
# and 'real' requests. Remember the index, too so that the response can be |
282
|
|
|
|
|
|
|
# weave together |
283
|
|
|
|
|
|
|
sub _detangle_requests { |
284
|
0
|
|
|
0
|
|
0
|
my $self = shift; |
285
|
0
|
|
|
|
|
0
|
my $requests = shift; |
286
|
0
|
|
|
|
|
0
|
my $req_map = {}; |
287
|
0
|
|
|
|
|
0
|
my $idx = 0; |
288
|
0
|
|
|
|
|
0
|
for my $r (@$requests) { |
289
|
0
|
0
|
|
|
|
0
|
push @{$req_map->{ref($r) eq "CODE" ? "code" : "request"}},[$r,$idx]; |
|
0
|
|
|
|
|
0
|
|
290
|
0
|
|
|
|
|
0
|
$idx++; |
291
|
|
|
|
|
|
|
} |
292
|
0
|
|
|
|
|
0
|
return $req_map; |
293
|
|
|
|
|
|
|
} |
294
|
|
|
|
|
|
|
|
295
|
|
|
|
|
|
|
# Execute subrefs created out of scripts. Put it in the right place of the |
296
|
|
|
|
|
|
|
# result array according to the remembered index |
297
|
|
|
|
|
|
|
sub _execute_scripts { |
298
|
0
|
|
|
0
|
|
0
|
my $self = shift; |
299
|
0
|
|
|
|
|
0
|
my $responses = shift; |
300
|
0
|
|
|
|
|
0
|
my $req_map = shift; |
301
|
0
|
|
|
|
|
0
|
for my $e (@{$req_map->{"code"}}) { |
|
0
|
|
|
|
|
0
|
|
302
|
|
|
|
|
|
|
# Will die on error which will bubble up |
303
|
0
|
|
|
|
|
0
|
$responses->[$e->[1]] = &{$e->[0]}();; |
|
0
|
|
|
|
|
0
|
|
304
|
|
|
|
|
|
|
} |
305
|
|
|
|
|
|
|
} |
306
|
|
|
|
|
|
|
|
307
|
|
|
|
|
|
|
# Execute requests and put it in the received responses in the right place for |
308
|
|
|
|
|
|
|
# the returned array. The index has been extracted beforehand and stored in the |
309
|
|
|
|
|
|
|
# given req_map |
310
|
|
|
|
|
|
|
sub _execute_requests { |
311
|
0
|
|
|
0
|
|
0
|
my $self = shift; |
312
|
0
|
|
|
|
|
0
|
my $responses = shift; |
313
|
0
|
|
|
|
|
0
|
my $req_map = shift; |
314
|
0
|
|
|
|
|
0
|
my $jmx = shift; |
315
|
|
|
|
|
|
|
|
316
|
|
|
|
|
|
|
# Call remote JMX and weave in |
317
|
0
|
|
|
|
|
0
|
my $reqs2send = $req_map->{"request"}; |
318
|
0
|
0
|
|
|
|
0
|
if ($reqs2send) { |
319
|
0
|
|
|
|
|
0
|
my @resp_received = $jmx->request(map { $_->[0] } @$reqs2send); |
|
0
|
|
|
|
|
0
|
|
320
|
0
|
|
|
|
|
0
|
for my $r (@$reqs2send) { |
321
|
0
|
|
|
|
|
0
|
$responses->[$r->[1]] = shift @resp_received; |
322
|
|
|
|
|
|
|
} |
323
|
|
|
|
|
|
|
} |
324
|
|
|
|
|
|
|
} |
325
|
|
|
|
|
|
|
|
326
|
|
|
|
|
|
|
|
327
|
|
|
|
|
|
|
# Print online manual and exit (somewhat crude, I know) |
328
|
|
|
|
|
|
|
sub _print_doc_and_exit { |
329
|
0
|
|
|
0
|
|
0
|
my $self = shift; |
330
|
0
|
|
|
|
|
0
|
my $section = shift; |
331
|
0
|
0
|
|
|
|
0
|
if (!eval "require Pod::Usage; Pod::Usage->import(qw(pod2usage)); 1;") { |
332
|
0
|
|
|
|
|
0
|
print "Please install Pod::Usage for creating the online help\n"; |
333
|
0
|
|
|
|
|
0
|
exit 1; |
334
|
|
|
|
|
|
|
} |
335
|
0
|
0
|
|
|
|
0
|
if ($section) { |
336
|
0
|
|
|
|
|
0
|
my %sects = ( |
337
|
|
|
|
|
|
|
tutorial => "TUTORIAL", |
338
|
|
|
|
|
|
|
reference => "REFERENCE", |
339
|
|
|
|
|
|
|
options => "COMMAND LINE", |
340
|
|
|
|
|
|
|
config => "CONFIGURATION", |
341
|
|
|
|
|
|
|
); |
342
|
0
|
|
|
|
|
0
|
my $real_section = $sects{lc $section}; |
343
|
0
|
0
|
|
|
|
0
|
if ($real_section) { |
344
|
0
|
|
|
|
|
0
|
pod2usage(-verbose => 99, -sections => $real_section ); |
345
|
|
|
|
|
|
|
} else { |
346
|
0
|
|
|
|
|
0
|
print "Unknown documentation section '$section' (known: ",join (",",sort keys %sects),")\n"; |
347
|
0
|
|
|
|
|
0
|
exit 1; |
348
|
|
|
|
|
|
|
} |
349
|
|
|
|
|
|
|
} else { |
350
|
0
|
|
|
|
|
0
|
pod2usage(-verbose => 99); |
351
|
|
|
|
|
|
|
} |
352
|
|
|
|
|
|
|
} |
353
|
|
|
|
|
|
|
|
354
|
|
|
|
|
|
|
|
355
|
|
|
|
|
|
|
# Initialize this object and validate the mandatory parameters (obtained from |
356
|
|
|
|
|
|
|
# the command line or a configuration file). It will also build up |
357
|
|
|
|
|
|
|
# one or more SingleCheck which are later on sent as a bulk request to |
358
|
|
|
|
|
|
|
# the server. |
359
|
|
|
|
|
|
|
sub _verify_and_initialize { |
360
|
1
|
|
|
1
|
|
2
|
my $self = shift; |
361
|
1
|
|
|
|
|
2
|
my $np = $self->{np}; |
362
|
1
|
|
|
|
|
4
|
my $o = $np->opts; |
363
|
|
|
|
|
|
|
|
364
|
1
|
|
|
|
|
7
|
$self->{opts} = $self->{np}->opts; |
365
|
|
|
|
|
|
|
|
366
|
|
|
|
|
|
|
# Fetch configuration |
367
|
1
|
|
|
|
|
7
|
my $config = $self->_get_config($o->config); |
368
|
|
|
|
|
|
|
# Now, if a specific check is given, extract it, too. |
369
|
1
|
|
|
|
|
2
|
my $check_configs; |
370
|
|
|
|
|
|
|
#print Dumper($config); |
371
|
1
|
|
|
|
|
5
|
$check_configs = $self->_extract_checks($config,$o->check); |
372
|
|
|
|
|
|
|
#print Dumper($check_configs); |
373
|
1
|
50
|
|
|
|
4
|
if ($check_configs) { |
374
|
0
|
|
|
|
|
0
|
for my $c (@$check_configs) { |
375
|
0
|
|
|
|
|
0
|
my $s_c = new JMX::Jmx4Perl::Nagios::SingleCheck($np,$c); |
376
|
0
|
|
|
|
|
0
|
push @{$self->{checks}},$s_c; |
|
0
|
|
|
|
|
0
|
|
377
|
|
|
|
|
|
|
} |
378
|
|
|
|
|
|
|
} else { |
379
|
1
|
|
|
|
|
12
|
$self->{checks} = [ new JMX::Jmx4Perl::Nagios::SingleCheck($np) ]; |
380
|
|
|
|
|
|
|
} |
381
|
|
|
|
|
|
|
# If a server name is given, we use that for the connection parameters |
382
|
1
|
50
|
|
|
|
5
|
if ($o->server) { |
383
|
0
|
|
0
|
|
|
0
|
$self->{server_config} = $config->get_server_config($o->server) |
384
|
|
|
|
|
|
|
|| $self->nagios_die("No server configuration for " . $o->server . " found"); |
385
|
|
|
|
|
|
|
} |
386
|
|
|
|
|
|
|
|
387
|
|
|
|
|
|
|
# Sanity checks |
388
|
1
|
50
|
|
|
|
21
|
$self->nagios_die("No Server URL given") unless $self->url; |
389
|
|
|
|
|
|
|
|
390
|
1
|
|
|
|
|
14
|
for my $check (@{$self->{checks}}) { |
|
1
|
|
|
|
|
3
|
|
391
|
1
|
50
|
|
|
|
11
|
my $name = $check->name ? " [Check: " . $check->name . "]" : ""; |
392
|
1
|
0
|
33
|
|
|
17
|
$self->nagios_die("An MBean name and a attribute/operation must be provided " . $name) |
|
|
|
33
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
393
|
|
|
|
|
|
|
if ((!$check->mbean || (!$check->attribute && !$check->operation)) && !$check->alias && !$check->value && !$check->script); |
394
|
|
|
|
|
|
|
} |
395
|
|
|
|
|
|
|
} |
396
|
|
|
|
|
|
|
|
397
|
|
|
|
|
|
|
# Extract one or more check configurations which can be |
398
|
|
|
|
|
|
|
# simple s or s |
399
|
|
|
|
|
|
|
sub _extract_checks { |
400
|
1
|
|
|
1
|
|
10
|
my $self = shift; |
401
|
1
|
|
|
|
|
2
|
my $config = shift; |
402
|
1
|
|
|
|
|
3
|
my $check = shift; |
403
|
|
|
|
|
|
|
|
404
|
1
|
|
|
|
|
2
|
my $np = $self->{np}; |
405
|
1
|
50
|
|
|
|
4
|
if ($check) { |
406
|
0
|
0
|
|
|
|
0
|
$self->nagios_die("No configuration given") unless $config; |
407
|
0
|
0
|
|
|
|
0
|
$self->nagios_die("No checks defined in configuration") unless $config->{check}; |
408
|
|
|
|
|
|
|
|
409
|
0
|
|
|
|
|
0
|
my $check_configs; |
410
|
0
|
0
|
|
|
|
0
|
unless ($config->{check}->{$check}) { |
411
|
0
|
|
|
|
|
0
|
$check_configs = $self->_resolve_multicheck($config,$check,$self->{cmd_args}); |
412
|
0
|
|
|
|
|
0
|
$self->_retrieve_mc_summary_label($config,$check); |
413
|
|
|
|
|
|
|
} else { |
414
|
0
|
|
|
|
|
0
|
my $check_config = $config->{check}->{$check}; |
415
|
0
|
0
|
|
|
|
0
|
$check_configs = ref($check_config) eq "ARRAY" ? $check_config : [ $check_config ]; |
416
|
0
|
|
|
|
|
0
|
$check_configs->[0]->{key} = $check; |
417
|
|
|
|
|
|
|
} |
418
|
0
|
0
|
|
|
|
0
|
$self->nagios_die("No check configuration with name " . $check . " found") unless (@{$check_configs}); |
|
0
|
|
|
|
|
0
|
|
419
|
|
|
|
|
|
|
|
420
|
|
|
|
|
|
|
#print Dumper($check_configs); |
421
|
|
|
|
|
|
|
|
422
|
|
|
|
|
|
|
# Resolve parent values |
423
|
0
|
|
|
|
|
0
|
for my $c (@{$check_configs}) { |
|
0
|
|
|
|
|
0
|
|
424
|
|
|
|
|
|
|
#print "[A] ",Dumper($c); |
425
|
0
|
|
|
|
|
0
|
$self->_resolve_check_config($c,$config,$self->{cmd_args}); |
426
|
|
|
|
|
|
|
|
427
|
|
|
|
|
|
|
#print "[B] ",Dumper($c); |
428
|
|
|
|
|
|
|
# Finally, resolve any left over place holders |
429
|
0
|
|
|
|
|
0
|
for my $k (keys(%$c)) { |
430
|
0
|
0
|
|
|
|
0
|
$c->{$k} = $self->_replace_placeholder($c->{$k},undef) unless ref($c->{$k}); |
431
|
|
|
|
|
|
|
} |
432
|
|
|
|
|
|
|
#print "[C] ",Dumper($c); |
433
|
|
|
|
|
|
|
} |
434
|
0
|
|
|
|
|
0
|
return $check_configs; |
435
|
|
|
|
|
|
|
} else { |
436
|
1
|
|
|
|
|
2
|
return undef; |
437
|
|
|
|
|
|
|
} |
438
|
|
|
|
|
|
|
} |
439
|
|
|
|
|
|
|
|
440
|
|
|
|
|
|
|
# Resolve a multicheck configuration () |
441
|
|
|
|
|
|
|
sub _resolve_multicheck { |
442
|
0
|
|
|
0
|
|
0
|
my $self = shift; |
443
|
0
|
|
|
|
|
0
|
my $config = shift; |
444
|
0
|
|
|
|
|
0
|
my $check = shift; |
445
|
0
|
|
|
|
|
0
|
my $args = shift; |
446
|
0
|
|
|
|
|
0
|
my $np = $self->{np}; |
447
|
0
|
|
|
|
|
0
|
my $multi_checks = $config->{multicheck}; |
448
|
0
|
|
|
|
|
0
|
my $check_config = []; |
449
|
0
|
0
|
|
|
|
0
|
if ($multi_checks) { |
450
|
0
|
|
|
|
|
0
|
my $m_check = $multi_checks->{$check}; |
451
|
0
|
0
|
|
|
|
0
|
if ($m_check) { |
452
|
|
|
|
|
|
|
# Resolve all checks |
453
|
0
|
|
|
|
|
0
|
my $c_names = []; |
454
|
0
|
|
|
|
|
0
|
for my $type( qw(check multicheck)) { |
455
|
0
|
0
|
|
|
|
0
|
if ($m_check->{$type}) { |
456
|
0
|
0
|
|
|
|
0
|
push @$c_names, ref($m_check->{$type}) eq "ARRAY" ? @{$m_check->{$type}} : $m_check->{$type}; |
|
0
|
|
|
|
|
0
|
|
457
|
|
|
|
|
|
|
} |
458
|
|
|
|
|
|
|
} |
459
|
0
|
|
|
|
|
0
|
for my $name (@$c_names) { |
460
|
0
|
|
|
|
|
0
|
my ($c_name,$c_args) = $self->_parse_check_ref($name); |
461
|
0
|
|
|
|
|
0
|
my $args_merged = $self->_merge_multicheck_args($c_args,$args); |
462
|
|
|
|
|
|
|
$self->nagios_die("Unknown check '" . $c_name . "' for multi check " . $check) |
463
|
0
|
0
|
0
|
|
|
0
|
unless defined($config->{check}->{$c_name}) or defined($multi_checks->{$c_name}); |
464
|
0
|
0
|
|
|
|
0
|
if ($config->{check}->{$c_name}) { |
465
|
|
|
|
|
|
|
# We need a copy of the check hash to avoid mangling it up |
466
|
|
|
|
|
|
|
# if it is referenced multiple times |
467
|
0
|
|
|
|
|
0
|
my $check = { %{$config->{check}->{$c_name}} }; |
|
0
|
|
|
|
|
0
|
|
468
|
0
|
|
|
|
|
0
|
$check->{key} = $c_name; |
469
|
0
|
|
|
|
|
0
|
$check->{args} = $args_merged; |
470
|
0
|
|
|
|
|
0
|
push @{$check_config},$check; |
|
0
|
|
|
|
|
0
|
|
471
|
|
|
|
|
|
|
} else { |
472
|
|
|
|
|
|
|
# It's a multi check referenced via or .... |
473
|
0
|
|
|
|
|
0
|
push @{$check_config},@{$self->_resolve_multicheck($config,$c_name,$args_merged)}; |
|
0
|
|
|
|
|
0
|
|
|
0
|
|
|
|
|
0
|
|
474
|
|
|
|
|
|
|
} |
475
|
|
|
|
|
|
|
} |
476
|
|
|
|
|
|
|
} |
477
|
|
|
|
|
|
|
} |
478
|
0
|
|
|
|
|
0
|
return $check_config; |
479
|
|
|
|
|
|
|
} |
480
|
|
|
|
|
|
|
|
481
|
|
|
|
|
|
|
sub _retrieve_mc_summary_label { |
482
|
0
|
|
|
0
|
|
0
|
my $self = shift; |
483
|
0
|
|
|
|
|
0
|
my $config = shift; |
484
|
0
|
|
|
|
|
0
|
my $check = shift; |
485
|
|
|
|
|
|
|
|
486
|
0
|
|
|
|
|
0
|
my $multi_checks = $config->{multicheck}; |
487
|
0
|
0
|
|
|
|
0
|
if ($multi_checks) { |
488
|
0
|
|
|
|
|
0
|
my $m_check = $multi_checks->{$check}; |
489
|
0
|
0
|
0
|
|
|
0
|
if ($m_check && ($m_check->{summaryok} || $m_check->{summaryfailure})) { |
|
|
|
0
|
|
|
|
|
490
|
|
|
|
|
|
|
my $mc_labels = |
491
|
|
|
|
|
|
|
$self->{multi_check_labels} = { |
492
|
|
|
|
|
|
|
summary_ok => $m_check->{summaryok}, |
493
|
|
|
|
|
|
|
summary_failure => $m_check->{summaryfailure} |
494
|
0
|
|
|
|
|
0
|
}; |
495
|
|
|
|
|
|
|
} |
496
|
|
|
|
|
|
|
} |
497
|
|
|
|
|
|
|
} |
498
|
|
|
|
|
|
|
|
499
|
|
|
|
|
|
|
sub _merge_multicheck_args { |
500
|
0
|
|
|
0
|
|
0
|
my $self = shift; |
501
|
0
|
|
|
|
|
0
|
my $check_params = shift; |
502
|
0
|
|
|
|
|
0
|
my $args = shift; |
503
|
0
|
0
|
0
|
|
|
0
|
if (!$args || !$check_params) { |
504
|
0
|
|
|
|
|
0
|
return $check_params; |
505
|
|
|
|
|
|
|
} |
506
|
0
|
|
|
|
|
0
|
my $ret = [ @$check_params ]; # Copy it over |
507
|
0
|
|
|
|
|
0
|
for my $i (0 .. $#$check_params) { |
508
|
0
|
0
|
|
|
|
0
|
if ($check_params->[$i] =~ /^\$(\d+)$/) { |
509
|
0
|
|
|
|
|
0
|
my $j = $1; |
510
|
0
|
0
|
|
|
|
0
|
if ($j <= $#$args) { |
511
|
0
|
|
|
|
|
0
|
$ret->[$i] = $args->[$j]; |
512
|
0
|
|
|
|
|
0
|
next; |
513
|
|
|
|
|
|
|
} |
514
|
|
|
|
|
|
|
# Nothing to replace |
515
|
0
|
|
|
|
|
0
|
$ret->[$i] = $check_params->[$i]; |
516
|
|
|
|
|
|
|
} |
517
|
|
|
|
|
|
|
} |
518
|
0
|
|
|
|
|
0
|
return $ret; |
519
|
|
|
|
|
|
|
} |
520
|
|
|
|
|
|
|
|
521
|
|
|
|
|
|
|
# Resolve a singe configuration |
522
|
|
|
|
|
|
|
sub _resolve_check_config { |
523
|
0
|
|
|
0
|
|
0
|
my $self = shift; |
524
|
0
|
|
|
|
|
0
|
my $check = shift; |
525
|
0
|
|
|
|
|
0
|
my $config = shift; |
526
|
|
|
|
|
|
|
# Args can come from the outside, but also as part of a multicheck (stored |
527
|
|
|
|
|
|
|
# in $check->{args}) |
528
|
0
|
0
|
0
|
|
|
0
|
my $args = $check->{args} && @{$check->{args}} ? $check->{args} : shift; |
529
|
0
|
|
|
|
|
0
|
my $np = $self->{np}; |
530
|
0
|
0
|
|
|
|
0
|
if ($check->{use}) { |
531
|
|
|
|
|
|
|
# Resolve parents |
532
|
0
|
0
|
|
|
|
0
|
my $parents = ref($check->{use}) eq "ARRAY" ? $check->{use} : [ $check->{use} ]; |
533
|
0
|
|
|
|
|
0
|
my $parent_merged = {}; |
534
|
0
|
|
|
|
|
0
|
for my $p (@$parents) { |
535
|
0
|
|
|
|
|
0
|
my ($p_name,$p_args) = $self->_parse_check_ref($p); |
536
|
|
|
|
|
|
|
$self->nagios_die("Unknown parent check '" . $p_name . "' for check '" . |
537
|
|
|
|
|
|
|
($check->{key} ? $check->{key} : $check->{name}) . "'") |
538
|
0
|
0
|
|
|
|
0
|
unless $config->{check}->{$p_name}; |
|
|
0
|
|
|
|
|
|
539
|
|
|
|
|
|
|
# Clone it to avoid side effects when replacing checks inline |
540
|
0
|
|
|
|
|
0
|
my $p_check = { %{$config->{check}->{$p_name}} }; |
|
0
|
|
|
|
|
0
|
|
541
|
0
|
|
|
|
|
0
|
$p_check->{key} = $p_name; |
542
|
|
|
|
|
|
|
#print "::::: ",Dumper($p_check,$p_args); |
543
|
|
|
|
|
|
|
|
544
|
0
|
|
|
|
|
0
|
$self->_resolve_check_config($p_check,$config,$p_args); |
545
|
|
|
|
|
|
|
|
546
|
|
|
|
|
|
|
#$self->_replace_args($p_check,$config,$p_args); |
547
|
0
|
|
|
|
|
0
|
$parent_merged->{$_} = $p_check->{$_} for keys %$p_check; |
548
|
|
|
|
|
|
|
} |
549
|
|
|
|
|
|
|
# Replace inherited values |
550
|
0
|
|
|
|
|
0
|
for my $k (keys %$parent_merged) { |
551
|
0
|
0
|
|
|
|
0
|
my $parent_val = defined($parent_merged->{$k}) ? $parent_merged->{$k} : ""; |
552
|
0
|
0
|
|
|
|
0
|
if (defined($check->{$k})) { |
553
|
0
|
|
|
|
|
0
|
$check->{$k} =~ s/\$BASE/$parent_val/g; |
554
|
|
|
|
|
|
|
} else { |
555
|
0
|
|
|
|
|
0
|
$check->{$k} = $parent_val; |
556
|
|
|
|
|
|
|
} |
557
|
|
|
|
|
|
|
} |
558
|
|
|
|
|
|
|
} |
559
|
0
|
|
|
|
|
0
|
$self->_replace_args($check,$config,$args); |
560
|
0
|
|
|
|
|
0
|
return $check; |
561
|
|
|
|
|
|
|
} |
562
|
|
|
|
|
|
|
|
563
|
|
|
|
|
|
|
# Replace argument placeholders with a given list of arguments |
564
|
|
|
|
|
|
|
sub _replace_args { |
565
|
0
|
|
|
0
|
|
0
|
my $self = shift; |
566
|
0
|
|
|
|
|
0
|
my $check = shift; |
567
|
0
|
|
|
|
|
0
|
my $config = shift; |
568
|
0
|
|
|
|
|
0
|
my $args = shift; |
569
|
0
|
|
|
|
|
0
|
for my $k (keys(%$check)) { |
570
|
0
|
0
|
|
|
|
0
|
next if $k =~ /^(key|args)$/; # Internal keys |
571
|
|
|
|
|
|
|
$check->{$k} = |
572
|
|
|
|
|
|
|
$self->_replace_placeholder($check->{$k},$args) |
573
|
0
|
0
|
0
|
|
|
0
|
if ($args && @$args && !ref($check->{$k})); |
|
|
|
0
|
|
|
|
|
574
|
|
|
|
|
|
|
} |
575
|
|
|
|
|
|
|
} |
576
|
|
|
|
|
|
|
|
577
|
|
|
|
|
|
|
sub _replace_placeholder { |
578
|
0
|
|
|
0
|
|
0
|
my $self = shift; |
579
|
0
|
|
|
|
|
0
|
my $val = shift; |
580
|
0
|
|
|
|
|
0
|
my $args = shift; |
581
|
0
|
0
|
|
|
|
0
|
my $index = defined($args) ? join "|",0 ... $#$args : "\\d+"; |
582
|
|
|
|
|
|
|
|
583
|
0
|
|
|
|
|
0
|
my $regexp_s = <<'EOP'; |
584
|
|
|
|
|
|
|
^(.*?) # Start containing no args |
585
|
|
|
|
|
|
|
|
586
|
|
|
|
|
|
|
\$( # Variable starts with '$' |
587
|
|
|
|
|
|
|
($index) | # $0 without default value |
588
|
|
|
|
|
|
|
\{\s*($index)\s* # ${0:12300} with default value |
589
|
|
|
|
|
|
|
(?: :([^\}]+) )*\} # ?: --> clustering group, optional (${0} is also ok) |
590
|
|
|
|
|
|
|
) |
591
|
|
|
|
|
|
|
|
592
|
|
|
|
|
|
|
(.*|$) # The rest which will get parsed next |
593
|
|
|
|
|
|
|
EOP |
594
|
0
|
|
|
|
|
0
|
$regexp_s =~ s/\$index/$index/g; |
595
|
0
|
|
|
|
|
0
|
my $regexp = qr/$regexp_s/sx; |
596
|
0
|
0
|
|
|
|
0
|
die "Cannot create placeholder regexp" if $@; |
597
|
0
|
|
|
|
|
0
|
my $rest = $val; |
598
|
0
|
|
|
|
|
0
|
my $ret = ""; |
599
|
0
|
|
0
|
|
|
0
|
while (defined($rest) && length($rest) && $rest =~ $regexp) { |
|
|
|
0
|
|
|
|
|
600
|
|
|
|
|
|
|
# $1: start with no placeholder |
601
|
|
|
|
|
|
|
# $2: literal variable as it is defined |
602
|
|
|
|
|
|
|
# $3: variable name (0,1,2,3,...) |
603
|
|
|
|
|
|
|
# $4: same as $3, but either $3 or $4 is defined |
604
|
|
|
|
|
|
|
# $5: default value (if any) |
605
|
|
|
|
|
|
|
# $6: rest which is processed next in the loop |
606
|
0
|
0
|
|
|
|
0
|
my $start = defined($1) ? $1 : ""; |
607
|
0
|
|
|
|
|
0
|
my $orig_val = '$' . $2; |
608
|
0
|
0
|
|
|
|
0
|
my $i = defined($3) ? $3 : $4; |
609
|
0
|
|
|
|
|
0
|
my $default = $5; |
610
|
0
|
0
|
|
|
|
0
|
my $end = defined($6) ? $6 : ""; |
611
|
0
|
0
|
|
|
|
0
|
$default =~ s/^\s*(.*)+?\s*$/$1/ if $default; # Trim whitespace |
612
|
|
|
|
|
|
|
#print Dumper({start => $start, orig => $orig_val,end => $end, default=> $default, rest => $rest, i => $i}); |
613
|
0
|
0
|
|
|
|
0
|
if (defined($args)) { |
614
|
0
|
|
|
|
|
0
|
my $repl = $args->[$i]; |
615
|
0
|
0
|
|
|
|
0
|
if (defined($repl)) { |
616
|
0
|
0
|
|
|
|
0
|
if ($repl =~ /^\$(\d+)$/) { |
617
|
0
|
|
|
|
|
0
|
my $new_index = $1; |
618
|
|
|
|
|
|
|
#print "============== $val $new_index\n"; |
619
|
|
|
|
|
|
|
# Val is a placeholder itself |
620
|
0
|
0
|
|
|
|
0
|
if (defined($default)) { |
621
|
0
|
|
|
|
|
0
|
$ret .= $start . '${' . $new_index . ':' . $default . '}'; |
622
|
|
|
|
|
|
|
} else { |
623
|
0
|
|
|
|
|
0
|
$ret .= $start . '$' . $new_index; |
624
|
|
|
|
|
|
|
} |
625
|
|
|
|
|
|
|
} else { |
626
|
0
|
|
|
|
|
0
|
$ret .= $start . $repl; |
627
|
|
|
|
|
|
|
} |
628
|
|
|
|
|
|
|
} else { |
629
|
0
|
|
|
|
|
0
|
$ret .= $start . $orig_val; |
630
|
|
|
|
|
|
|
} |
631
|
|
|
|
|
|
|
} else { |
632
|
|
|
|
|
|
|
# We have to replace any left over placeholder either with its |
633
|
|
|
|
|
|
|
# default value or with an empty value |
634
|
0
|
0
|
0
|
|
|
0
|
if (defined($default)) { |
|
|
0
|
|
|
|
|
|
635
|
0
|
|
|
|
|
0
|
$ret .= $start . $default; |
636
|
|
|
|
|
|
|
} elsif (length($start) || length($end)) { |
637
|
0
|
|
|
|
|
0
|
$ret .= $start; |
638
|
|
|
|
|
|
|
} else { |
639
|
0
|
0
|
|
|
|
0
|
if (!length($ret)) { |
640
|
|
|
|
|
|
|
# No default value, nothing else for this value. We |
641
|
|
|
|
|
|
|
# consider it undefined |
642
|
0
|
|
|
|
|
0
|
return undef; |
643
|
|
|
|
|
|
|
} |
644
|
|
|
|
|
|
|
} |
645
|
|
|
|
|
|
|
} |
646
|
0
|
|
|
|
|
0
|
$rest = $end; |
647
|
|
|
|
|
|
|
#print "... $ret$rest\n"; |
648
|
|
|
|
|
|
|
} |
649
|
0
|
0
|
|
|
|
0
|
return $ret . (defined($rest) ? $rest : ""); |
650
|
|
|
|
|
|
|
} |
651
|
|
|
|
|
|
|
|
652
|
|
|
|
|
|
|
# Split up a 'Use' parent config reference, including possibly arguments |
653
|
|
|
|
|
|
|
sub _parse_check_ref { |
654
|
0
|
|
|
0
|
|
0
|
my $self = shift; |
655
|
0
|
|
|
|
|
0
|
my $check_ref = shift; |
656
|
0
|
0
|
|
|
|
0
|
if ($check_ref =~/^\s*(.+?)\((.*)\)\s*$/) { |
657
|
0
|
|
|
|
|
0
|
my $name = $1; |
658
|
0
|
|
|
|
|
0
|
my $args_s = $2; |
659
|
0
|
|
|
|
|
0
|
my $args = [ parse_line('\s*,\s*',0,$args_s) ]; |
660
|
0
|
|
|
|
|
0
|
return ($name,$args); |
661
|
|
|
|
|
|
|
} else { |
662
|
0
|
|
|
|
|
0
|
return $check_ref; |
663
|
|
|
|
|
|
|
} |
664
|
|
|
|
|
|
|
} |
665
|
|
|
|
|
|
|
|
666
|
|
|
|
|
|
|
# Get the configuration as a hash |
667
|
|
|
|
|
|
|
sub _get_config { |
668
|
1
|
|
|
1
|
|
15
|
my $self = shift; |
669
|
1
|
|
|
|
|
4
|
my $path = shift; |
670
|
1
|
|
|
|
|
5
|
my $np = $self->{np}; |
671
|
1
|
50
|
33
|
|
|
7
|
$self->nagios_die("No configuration file " . $path . " found") |
672
|
|
|
|
|
|
|
if ($path && ! -e $path); |
673
|
1
|
|
|
|
|
13
|
return new JMX::Jmx4Perl::Config($path); |
674
|
|
|
|
|
|
|
} |
675
|
|
|
|
|
|
|
|
676
|
|
|
|
|
|
|
# The global server config part |
677
|
|
|
|
|
|
|
sub _server_config { |
678
|
0
|
|
|
0
|
|
0
|
return shift->{server_config}; |
679
|
|
|
|
|
|
|
} |
680
|
|
|
|
|
|
|
|
681
|
|
|
|
|
|
|
# Create the nagios plugin used for preparing the nagios output |
682
|
|
|
|
|
|
|
sub create_nagios_plugin { |
683
|
1
|
|
|
1
|
0
|
2
|
my $self = shift; |
684
|
1
|
|
|
|
|
11
|
my $np = Monitoring::Plugin-> |
685
|
|
|
|
|
|
|
new( |
686
|
|
|
|
|
|
|
usage => |
687
|
|
|
|
|
|
|
"Usage: %s -u -m -a -c -w \n" . |
688
|
|
|
|
|
|
|
" [--alias ] [--value ] [--base ] [--delta ]\n" . |
689
|
|
|
|
|
|
|
" [--name ] [--label ] [--product ]\n". |
690
|
|
|
|
|
|
|
" [--user ] [--password ] [--proxy ]\n" . |
691
|
|
|
|
|
|
|
" [--target ] [--target-user ] [--target-password ]\n" . |
692
|
|
|
|
|
|
|
" [--legacy-escape]\n" . |
693
|
|
|
|
|
|
|
" [--config ] [--check ] [--server ] [-v] [--help]\n" . |
694
|
|
|
|
|
|
|
" arg1 arg2 ....", |
695
|
|
|
|
|
|
|
version => $JMX::Jmx4Perl::VERSION, |
696
|
|
|
|
|
|
|
url => "http://www.jmx4perl.org", |
697
|
|
|
|
|
|
|
plugin => "check_jmx4perl", |
698
|
|
|
|
|
|
|
blurb => "This plugin checks for JMX attribute values on a remote Java application server", |
699
|
|
|
|
|
|
|
extra => "\n\nYou need to deploy jolokia.war on the target application server or an intermediate proxy.\n" . |
700
|
|
|
|
|
|
|
"Please refer to the documentation for JMX::Jmx4Perl for further details.\n\n" . |
701
|
|
|
|
|
|
|
"For a complete documentation please consult the man page of check_jmx4perl or use the option --doc" |
702
|
|
|
|
|
|
|
); |
703
|
1
|
|
|
|
|
22951
|
$np->shortname(undef); |
704
|
1
|
|
|
|
|
9
|
$self->add_common_np_args($np); |
705
|
1
|
|
|
|
|
37
|
$self->add_nagios_np_args($np); |
706
|
1
|
|
|
|
|
44
|
$np->{msg_handler} = new JMX::Jmx4Perl::Nagios::MessageHandler(); |
707
|
1
|
|
|
|
|
5
|
$np->getopts(); |
708
|
1
|
|
|
|
|
6957
|
return $np; |
709
|
|
|
|
|
|
|
} |
710
|
|
|
|
|
|
|
|
711
|
|
|
|
|
|
|
sub add_common_np_args { |
712
|
1
|
|
|
1
|
0
|
2
|
my $self = shift; |
713
|
1
|
|
|
|
|
2
|
my $np = shift; |
714
|
|
|
|
|
|
|
|
715
|
1
|
|
|
|
|
6
|
$np->add_arg( |
716
|
|
|
|
|
|
|
spec => "url|u=s", |
717
|
|
|
|
|
|
|
help => "URL to agent web application (e.g. http://server:8080/jolokia/)", |
718
|
|
|
|
|
|
|
); |
719
|
1
|
|
|
|
|
50
|
$np->add_arg( |
720
|
|
|
|
|
|
|
spec => "product=s", |
721
|
|
|
|
|
|
|
help => "Name of app server product. (e.g. \"jboss\")", |
722
|
|
|
|
|
|
|
); |
723
|
1
|
|
|
|
|
39
|
$np->add_arg( |
724
|
|
|
|
|
|
|
spec => "alias=s", |
725
|
|
|
|
|
|
|
help => "Alias name for attribte (e.g. \"MEMORY_HEAP_USED\")", |
726
|
|
|
|
|
|
|
); |
727
|
1
|
|
|
|
|
38
|
$np->add_arg( |
728
|
|
|
|
|
|
|
spec => "mbean|m=s", |
729
|
|
|
|
|
|
|
help => "MBean name (e.g. \"java.lang:type=Memory\")", |
730
|
|
|
|
|
|
|
); |
731
|
1
|
|
|
|
|
37
|
$np->add_arg( |
732
|
|
|
|
|
|
|
spec => "attribute|a=s", |
733
|
|
|
|
|
|
|
help => "Attribute name (e.g. \"HeapMemoryUsage\")", |
734
|
|
|
|
|
|
|
); |
735
|
1
|
|
|
|
|
36
|
$np->add_arg( |
736
|
|
|
|
|
|
|
spec => "operation|o=s", |
737
|
|
|
|
|
|
|
help => "Operation to execute", |
738
|
|
|
|
|
|
|
); |
739
|
1
|
|
|
|
|
36
|
$np->add_arg( |
740
|
|
|
|
|
|
|
spec => "value=s", |
741
|
|
|
|
|
|
|
help => "Shortcut for specifying mbean/attribute/path. Slashes within names must be escaped with \\", |
742
|
|
|
|
|
|
|
); |
743
|
1
|
|
|
|
|
34
|
$np->add_arg( |
744
|
|
|
|
|
|
|
spec => "delta|d:s", |
745
|
|
|
|
|
|
|
help => "Switches on incremental mode. Optional argument are seconds used for normalizing.", |
746
|
|
|
|
|
|
|
); |
747
|
1
|
|
|
|
|
35
|
$np->add_arg( |
748
|
|
|
|
|
|
|
spec => "path|p=s", |
749
|
|
|
|
|
|
|
help => "Inner path for extracting a single value from a complex attribute or return value (e.g. \"used\")", |
750
|
|
|
|
|
|
|
); |
751
|
1
|
|
|
|
|
35
|
$np->add_arg( |
752
|
|
|
|
|
|
|
spec => "target=s", |
753
|
|
|
|
|
|
|
help => "JSR-160 Service URL specifing the target server" |
754
|
|
|
|
|
|
|
); |
755
|
1
|
|
|
|
|
34
|
$np->add_arg( |
756
|
|
|
|
|
|
|
spec => "target-user=s", |
757
|
|
|
|
|
|
|
help => "Username to use for JSR-160 connection (if --target is set)" |
758
|
|
|
|
|
|
|
); |
759
|
1
|
|
|
|
|
34
|
$np->add_arg( |
760
|
|
|
|
|
|
|
spec => "target-password=s", |
761
|
|
|
|
|
|
|
help => "Password to use for JSR-160 connection (if --target is set)" |
762
|
|
|
|
|
|
|
); |
763
|
1
|
|
|
|
|
35
|
$np->add_arg( |
764
|
|
|
|
|
|
|
spec => "proxy=s", |
765
|
|
|
|
|
|
|
help => "Proxy to use" |
766
|
|
|
|
|
|
|
); |
767
|
1
|
|
|
|
|
36
|
$np->add_arg( |
768
|
|
|
|
|
|
|
spec => "user=s", |
769
|
|
|
|
|
|
|
help => "User for HTTP authentication" |
770
|
|
|
|
|
|
|
); |
771
|
1
|
|
|
|
|
39
|
$np->add_arg( |
772
|
|
|
|
|
|
|
spec => "password=s", |
773
|
|
|
|
|
|
|
help => "Password for HTTP authentication" |
774
|
|
|
|
|
|
|
); |
775
|
1
|
|
|
|
|
38
|
$np->add_arg( |
776
|
|
|
|
|
|
|
spec => "name|n=s", |
777
|
|
|
|
|
|
|
help => "Name to use for output. Optional, by default a standard value based on the MBean ". |
778
|
|
|
|
|
|
|
"and attribute will be used" |
779
|
|
|
|
|
|
|
); |
780
|
1
|
|
|
|
|
38
|
$np->add_arg( |
781
|
|
|
|
|
|
|
spec => "legacy-escape!", |
782
|
|
|
|
|
|
|
help => "Use legacy escape mechanism for Jolokia agents < 1.0" |
783
|
|
|
|
|
|
|
); |
784
|
1
|
|
|
|
|
36
|
$np->add_arg( |
785
|
|
|
|
|
|
|
spec => "config=s", |
786
|
|
|
|
|
|
|
help => "Path to configuration file. Default: ~/.j4p" |
787
|
|
|
|
|
|
|
); |
788
|
1
|
|
|
|
|
36
|
$np->add_arg( |
789
|
|
|
|
|
|
|
spec => "server=s", |
790
|
|
|
|
|
|
|
help => "Symbolic name of server url to use, which needs to be configured in the configuration file" |
791
|
|
|
|
|
|
|
); |
792
|
1
|
|
|
|
|
35
|
$np->add_arg( |
793
|
|
|
|
|
|
|
spec => "check=s", |
794
|
|
|
|
|
|
|
help => "Name of a check configuration as defined in the configuration file" |
795
|
|
|
|
|
|
|
); |
796
|
1
|
|
|
|
|
34
|
$np->add_arg( |
797
|
|
|
|
|
|
|
spec => "method=s", |
798
|
|
|
|
|
|
|
help => "HTTP method to use. Either \"get\" or \"post\"" |
799
|
|
|
|
|
|
|
); |
800
|
1
|
|
|
|
|
35
|
$np->add_arg( |
801
|
|
|
|
|
|
|
spec => "doc:s", |
802
|
|
|
|
|
|
|
help => "Print the documentation of check_jmx4perl, optionally specifying the section (tutorial, args, config)" |
803
|
|
|
|
|
|
|
); |
804
|
|
|
|
|
|
|
} |
805
|
|
|
|
|
|
|
|
806
|
|
|
|
|
|
|
sub add_nagios_np_args { |
807
|
1
|
|
|
1
|
0
|
3
|
my $self = shift; |
808
|
1
|
|
|
|
|
2
|
my $np = shift; |
809
|
|
|
|
|
|
|
|
810
|
1
|
|
|
|
|
4
|
$np->add_arg( |
811
|
|
|
|
|
|
|
spec => "base|base-alias|b=s", |
812
|
|
|
|
|
|
|
help => "Base name, which when given, interprets critical and warning values as relative in the range 0 .. 100%. Must be given in the form mbean/attribute/path", |
813
|
|
|
|
|
|
|
); |
814
|
1
|
|
|
|
|
35
|
$np->add_arg( |
815
|
|
|
|
|
|
|
spec => "base-mbean=s", |
816
|
|
|
|
|
|
|
help => "Base MBean name, interprets critical and warning values as relative in the range 0 .. 100%. Requires a base-attribute, too", |
817
|
|
|
|
|
|
|
); |
818
|
1
|
|
|
|
|
34
|
$np->add_arg( |
819
|
|
|
|
|
|
|
spec => "base-attribute=s", |
820
|
|
|
|
|
|
|
help => "Base attribute for a relative check. Used together with base-mbean", |
821
|
|
|
|
|
|
|
); |
822
|
1
|
|
|
|
|
34
|
$np->add_arg( |
823
|
|
|
|
|
|
|
spec => "base-path=s", |
824
|
|
|
|
|
|
|
help => "Base path for relatie checks, where this path is used on the base attribute's value", |
825
|
|
|
|
|
|
|
); |
826
|
1
|
|
|
|
|
34
|
$np->add_arg( |
827
|
|
|
|
|
|
|
spec => "unit=s", |
828
|
|
|
|
|
|
|
help => "Unit of measurement of the data retreived. Recognized values are [B|KB|MN|GB|TB] for memory values and [us|ms|s|m|h|d] for time values" |
829
|
|
|
|
|
|
|
); |
830
|
1
|
|
|
|
|
34
|
$np->add_arg( |
831
|
|
|
|
|
|
|
spec => "null=s", |
832
|
|
|
|
|
|
|
help => "Value which should be used in case of a null return value of an operation or attribute. Is \"null\" by default" |
833
|
|
|
|
|
|
|
); |
834
|
1
|
|
|
|
|
35
|
$np->add_arg( |
835
|
|
|
|
|
|
|
spec => "string", |
836
|
|
|
|
|
|
|
help => "Force string comparison for critical and warning checks" |
837
|
|
|
|
|
|
|
); |
838
|
1
|
|
|
|
|
35
|
$np->add_arg( |
839
|
|
|
|
|
|
|
spec => "numeric", |
840
|
|
|
|
|
|
|
help => "Force numeric comparison for critical and warning checks" |
841
|
|
|
|
|
|
|
); |
842
|
1
|
|
|
|
|
35
|
$np->add_arg( |
843
|
|
|
|
|
|
|
spec => "critical|c=s", |
844
|
|
|
|
|
|
|
help => "Critical Threshold for value. " . |
845
|
|
|
|
|
|
|
"See http://nagiosplug.sourceforge.net/developer-guidelines.html#THRESHOLDFORMAT " . |
846
|
|
|
|
|
|
|
"for the threshold format.", |
847
|
|
|
|
|
|
|
); |
848
|
1
|
|
|
|
|
34
|
$np->add_arg( |
849
|
|
|
|
|
|
|
spec => "warning|w=s", |
850
|
|
|
|
|
|
|
help => "Warning Threshold for value.", |
851
|
|
|
|
|
|
|
); |
852
|
1
|
|
|
|
|
35
|
$np->add_arg( |
853
|
|
|
|
|
|
|
spec => "label|l=s", |
854
|
|
|
|
|
|
|
help => "Label to be used for printing out the result of the check. Placeholders can be used." |
855
|
|
|
|
|
|
|
); |
856
|
1
|
|
|
|
|
34
|
$np->add_arg( |
857
|
|
|
|
|
|
|
spec => "perfdata=s", |
858
|
|
|
|
|
|
|
help => "Whether performance data should be omitted, which are included by default." |
859
|
|
|
|
|
|
|
); |
860
|
1
|
|
|
|
|
34
|
$np->add_arg( |
861
|
|
|
|
|
|
|
spec => "unknown-is-critical", |
862
|
|
|
|
|
|
|
help => "Map UNKNOWN errors to errors with a CRITICAL status" |
863
|
|
|
|
|
|
|
); |
864
|
|
|
|
|
|
|
} |
865
|
|
|
|
|
|
|
|
866
|
|
|
|
|
|
|
# Access to configuration informations |
867
|
|
|
|
|
|
|
# Known config options (key: cmd line arguments, values: keys in config); |
868
|
|
|
|
|
|
|
my $SERVER_CONFIG_KEYS = { |
869
|
|
|
|
|
|
|
"url" => "url", |
870
|
|
|
|
|
|
|
"user" => "user", |
871
|
|
|
|
|
|
|
"password" => "password", |
872
|
|
|
|
|
|
|
"product" => "product", |
873
|
|
|
|
|
|
|
"legacy_escape" => "legacyconfig" |
874
|
|
|
|
|
|
|
}; |
875
|
|
|
|
|
|
|
|
876
|
|
|
|
|
|
|
# Get target configuration or undef if no jmx-proxy mode |
877
|
|
|
|
|
|
|
# is used |
878
|
|
|
|
|
|
|
sub target_config { |
879
|
0
|
|
|
0
|
0
|
0
|
return shift->_target_or_proxy_config("target","target-user","target-password"); |
880
|
|
|
|
|
|
|
} |
881
|
|
|
|
|
|
|
|
882
|
|
|
|
|
|
|
# Get proxy configuration or undef if no proxy configuration |
883
|
|
|
|
|
|
|
# is used |
884
|
|
|
|
|
|
|
sub proxy_config { |
885
|
0
|
|
|
0
|
0
|
0
|
return shift->_target_or_proxy_config("proxy","proxy-user","proxy-password"); |
886
|
|
|
|
|
|
|
} |
887
|
|
|
|
|
|
|
|
888
|
|
|
|
|
|
|
sub _target_or_proxy_config { |
889
|
0
|
|
|
0
|
|
0
|
my $self = shift; |
890
|
|
|
|
|
|
|
|
891
|
0
|
|
|
|
|
0
|
my $main_key = shift; |
892
|
0
|
|
|
|
|
0
|
my $user_opt = shift; |
893
|
0
|
|
|
|
|
0
|
my $password_opt = shift; |
894
|
|
|
|
|
|
|
|
895
|
0
|
|
|
|
|
0
|
my $np = $self->{np}; |
896
|
0
|
|
|
|
|
0
|
my $opts = $np->opts; |
897
|
0
|
|
|
|
|
0
|
my $server_config = $self->_server_config; |
898
|
0
|
0
|
0
|
|
|
0
|
if ($opts->{$main_key}) { |
|
|
0
|
|
|
|
|
|
899
|
|
|
|
|
|
|
# Use configuration from the command line: |
900
|
|
|
|
|
|
|
return { |
901
|
|
|
|
|
|
|
url => $opts->{$main_key}, |
902
|
|
|
|
|
|
|
user => $opts->{$user_opt}, |
903
|
0
|
|
|
|
|
0
|
password => $opts->{$password_opt} |
904
|
|
|
|
|
|
|
} |
905
|
|
|
|
|
|
|
} elsif ($server_config && $server_config->{$main_key}) { |
906
|
|
|
|
|
|
|
# Use configuration directly from the server definition: |
907
|
0
|
|
|
|
|
0
|
return $server_config->{$main_key} |
908
|
|
|
|
|
|
|
} else { |
909
|
0
|
|
|
|
|
0
|
return undef; |
910
|
|
|
|
|
|
|
} |
911
|
|
|
|
|
|
|
} |
912
|
|
|
|
|
|
|
|
913
|
|
|
|
|
|
|
# Autoloading is used to fetch the proper connection parameters |
914
|
|
|
|
|
|
|
sub AUTOLOAD { |
915
|
1
|
|
|
1
|
|
2
|
my $self = shift; |
916
|
1
|
|
|
|
|
3
|
my $np = $self->{np}; |
917
|
1
|
|
|
|
|
2
|
my $name = $AUTOLOAD; |
918
|
1
|
|
|
|
|
6
|
$name =~ s/.*://; # strip fully-qualified portion |
919
|
1
|
|
|
|
|
2
|
my $opts_name = $name; |
920
|
1
|
|
|
|
|
4
|
$opts_name =~ s/_/-/; |
921
|
|
|
|
|
|
|
|
922
|
1
|
50
|
|
|
|
5
|
if ($SERVER_CONFIG_KEYS->{$name}) { |
923
|
1
|
50
|
|
|
|
5
|
return $np->opts->{$opts_name} if $np->opts->{$opts_name}; |
924
|
0
|
|
|
|
|
|
my $c = $SERVER_CONFIG_KEYS->{$name}; |
925
|
0
|
0
|
|
|
|
|
if ($c) { |
926
|
0
|
|
|
|
|
|
my @parts = split "/",$c; |
927
|
0
|
|
0
|
|
|
|
my $h = $self->_server_config || |
928
|
|
|
|
|
|
|
return undef; |
929
|
0
|
|
|
|
|
|
while (@parts) { |
930
|
0
|
|
|
|
|
|
my $p = shift @parts; |
931
|
0
|
0
|
|
|
|
|
return undef unless $h->{$p}; |
932
|
0
|
|
|
|
|
|
$h = $h->{$p}; |
933
|
0
|
0
|
|
|
|
|
return $h unless @parts; |
934
|
|
|
|
|
|
|
} |
935
|
|
|
|
|
|
|
} else { |
936
|
0
|
|
|
|
|
|
return undef; |
937
|
|
|
|
|
|
|
} |
938
|
|
|
|
|
|
|
} else { |
939
|
0
|
|
|
|
|
|
$self->nagios_die("No config attribute \"" . $name . "\" known"); |
940
|
|
|
|
|
|
|
} |
941
|
|
|
|
|
|
|
} |
942
|
|
|
|
|
|
|
|
943
|
|
|
|
|
|
|
sub nagios_die { |
944
|
0
|
|
|
0
|
0
|
|
my $self = shift; |
945
|
0
|
|
|
|
|
|
my @args = @_; |
946
|
|
|
|
|
|
|
|
947
|
0
|
|
|
|
|
|
my $np = $self->{np}; |
948
|
0
|
0
|
|
|
|
|
$np->nagios_die(join("",@args),$np->opts->{'unknown-is-critical'} ? CRITICAL : UNKNOWN) |
949
|
|
|
|
|
|
|
} |
950
|
|
|
|
|
|
|
|
951
|
|
|
|
|
|
|
# Declared here to avoid AUTOLOAD confusions |
952
|
|
|
|
0
|
|
|
sub DESTROY { |
953
|
|
|
|
|
|
|
|
954
|
|
|
|
|
|
|
} |
955
|
|
|
|
|
|
|
|
956
|
|
|
|
|
|
|
=head1 LICENSE |
957
|
|
|
|
|
|
|
|
958
|
|
|
|
|
|
|
This file is part of jmx4perl. |
959
|
|
|
|
|
|
|
|
960
|
|
|
|
|
|
|
Jmx4perl is free software: you can redistribute it and/or modify |
961
|
|
|
|
|
|
|
it under the terms of the GNU General Public License as published by |
962
|
|
|
|
|
|
|
the Free Software Foundation, either version 2 of the License, or |
963
|
|
|
|
|
|
|
(at your option) any later version. |
964
|
|
|
|
|
|
|
|
965
|
|
|
|
|
|
|
jmx4perl is distributed in the hope that it will be useful, |
966
|
|
|
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of |
967
|
|
|
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
968
|
|
|
|
|
|
|
GNU General Public License for more details. |
969
|
|
|
|
|
|
|
|
970
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License |
971
|
|
|
|
|
|
|
along with jmx4perl. If not, see . |
972
|
|
|
|
|
|
|
|
973
|
|
|
|
|
|
|
=head1 AUTHOR |
974
|
|
|
|
|
|
|
|
975
|
|
|
|
|
|
|
roland@cpan.org |
976
|
|
|
|
|
|
|
|
977
|
|
|
|
|
|
|
=cut |
978
|
|
|
|
|
|
|
|
979
|
|
|
|
|
|
|
1; |