File Coverage

blib/lib/Monitoring/GLPlugin/Commandline.pm
Criterion Covered Total %
statement 33 318 10.3
branch 6 242 2.4
condition 1 100 1.0
subroutine 9 26 34.6
pod 0 21 0.0
total 49 707 6.9


line stmt bran cond sub pod time code
1             package Monitoring::GLPlugin::Commandline;
2 2     2   9 use strict;
  2         3  
  2         64  
3 2     2   8 use IO::File;
  2         3  
  2         351  
4 2     2   9 use constant { OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3, DEPENDENT => 4 };
  2         2  
  2         7430  
5             our %ERRORS = (
6             'OK' => OK,
7             'WARNING' => WARNING,
8             'CRITICAL' => CRITICAL,
9             'UNKNOWN' => UNKNOWN,
10             'DEPENDENT' => DEPENDENT,
11             );
12              
13             our %STATUS_TEXT = reverse %ERRORS;
14             our $AUTOLOAD;
15              
16              
17             sub new {
18 3     3 0 9 my ($class, %params) = @_;
19             require Monitoring::GLPlugin::Commandline::Getopt
20 3 100       944 if ! grep /BEGIN/, keys %Monitoring::GLPlugin::Commandline::Getopt::;
21 3         37 my $self = {
22             perfdata => [],
23             messages => {
24             ok => [],
25             warning => [],
26             critical => [],
27             unknown => [],
28             },
29             args => [],
30             opts => Monitoring::GLPlugin::Commandline::Getopt->new(%params),
31             modes => [],
32             statefilesdir => undef,
33             };
34 3         7 foreach (qw(shortname usage version url plugin blurb extra
35             license timeout)) {
36 27         34 $self->{$_} = $params{$_};
37             }
38 3         6 bless $self, $class;
39 3   33     25 $self->{plugin} ||= $Monitoring::GLPlugin::pluginname;
40 3         8 $self->{name} = $self->{plugin};
41 3         13 $Monitoring::GLPlugin::plugin = $self;
42             }
43              
44             sub AUTOLOAD {
45 6     6   10 my ($self, @params) = @_;
46 6 50       16 return if ($AUTOLOAD =~ /DESTROY/);
47             $self->debug("AUTOLOAD %s\n", $AUTOLOAD)
48 6 50       16 if $self->{opts}->verbose >= 2;
49 6 50       26 if ($AUTOLOAD =~ /^.*::(add_arg|override_opt|create_opt)$/) {
50 6         24 $self->{opts}->$1(@params);
51             }
52             }
53              
54             sub DESTROY {
55 1     1   9 my ($self) = @_;
56             # ohne dieses DESTROY rennt nagios_exit in obiges AUTOLOAD rein
57             # und fliegt aufs Maul, weil {opts} bereits nicht mehr existiert.
58             # Unerklaerliches Verhalten.
59             }
60              
61             sub debug {
62 0     0 0 0 my ($self, $format, @message) = @_;
63 0         0 my $tracefile = "/tmp/".$Monitoring::GLPlugin::pluginname.".trace";
64 0 0       0 $self->{trace} = -f $tracefile ? 1 : 0;
65 0 0 0     0 if ($self->opts->verbose && $self->opts->verbose > 10) {
66 0         0 printf("%s: ", scalar localtime);
67 0         0 printf($format, @message);
68 0         0 printf "\n";
69             }
70 0 0       0 if ($self->{trace}) {
71 0         0 my $logfh = IO::File->new();
72 0         0 $logfh->autoflush(1);
73 0 0       0 if ($logfh->open($tracefile, "a")) {
74 0         0 $logfh->printf("%s: ", scalar localtime);
75 0         0 $logfh->printf($format, @message);
76 0         0 $logfh->printf("\n");
77 0         0 $logfh->close();
78             }
79             }
80             }
81              
82             sub opts {
83 350     350 0 279 my ($self) = @_;
84 350         1106 return $self->{opts};
85             }
86              
87             sub getopts {
88 2     2 0 5 my ($self) = @_;
89 2         6 $self->opts->getopts();
90             }
91              
92             sub add_message {
93 31     31 0 62 my ($self, $code, @messages) = @_;
94 31 50       201 $code = (qw(ok warning critical unknown))[$code] if $code =~ /^\d+$/;
95 31         57 $code = lc $code;
96 31         32 push @{$self->{messages}->{$code}}, @messages;
  31         130  
97             }
98              
99             sub selected_perfdata {
100 0     0 0   my ($self, $label) = @_;
101 0 0 0       if ($self->opts->can("selectedperfdata") && $self->opts->selectedperfdata) {
102 0           my $pattern = $self->opts->selectedperfdata;
103 0 0         return ($label =~ /$pattern/i) ? 1 : 0;
104             } else {
105 0           return 1;
106             }
107             }
108              
109             sub add_perfdata {
110 0     0 0   my ($self, %args) = @_;
111             #printf "add_perfdata %s\n", Data::Dumper::Dumper(\%args);
112             #printf "add_perfdata %s\n", Data::Dumper::Dumper($self->{thresholds});
113             #
114             # wenn warning, critical, dann wird von oben ein expliziter wert mitgegeben
115             # wenn thresholds
116             # wenn label in
117             # warningx $self->{thresholds}->{$label}->{warning} existiert
118             # dann nimm $self->{thresholds}->{$label}->{warning}
119             # ansonsten thresholds->default->warning
120             #
121              
122 0           my $label = $args{label};
123 0           my $value = $args{value};
124 0   0       my $uom = $args{uom} || "";
125 0           my $format = '%d';
126              
127 0 0 0       if ($self->opts->can("morphperfdata") && $self->opts->morphperfdata) {
128             # 'Intel [R] Interface (\d+) usage'='nic$1'
129 0           foreach my $key (keys %{$self->opts->morphperfdata}) {
  0            
130 0 0         if ($label =~ /$key/) {
131 0           my $replacement = '"'.$self->opts->morphperfdata->{$key}.'"';
132 0           my $oldlabel = $label;
133 0           $label =~ s/$key/$replacement/ee;
  0            
134 0 0         if (exists $self->{thresholds}->{$oldlabel}) {
135 0           %{$self->{thresholds}->{$label}} = %{$self->{thresholds}->{$oldlabel}};
  0            
  0            
136             }
137             }
138             }
139             }
140 0 0         if ($value =~ /\./) {
141 0 0         if (defined $args{places}) {
142 0           $value = sprintf '%.'.$args{places}.'f', $value;
143             } else {
144 0           $value = sprintf "%.2f", $value;
145             }
146             } else {
147 0           $value = sprintf "%d", $value;
148             }
149 0           my $warn = "";
150 0           my $crit = "";
151 0 0         my $min = defined $args{min} ? $args{min} : "";
152 0 0         my $max = defined $args{max} ? $args{max} : "";
153 0 0 0       if ($args{thresholds} || (! exists $args{warning} && ! exists $args{critical})) {
      0        
154 0 0         if (exists $self->{thresholds}->{$label}->{warning}) {
    0          
155 0           $warn = $self->{thresholds}->{$label}->{warning};
156             } elsif (exists $self->{thresholds}->{default}->{warning}) {
157 0           $warn = $self->{thresholds}->{default}->{warning};
158             }
159 0 0         if (exists $self->{thresholds}->{$label}->{critical}) {
    0          
160 0           $crit = $self->{thresholds}->{$label}->{critical};
161             } elsif (exists $self->{thresholds}->{default}->{critical}) {
162 0           $crit = $self->{thresholds}->{default}->{critical};
163             }
164             } else {
165 0 0         if ($args{warning}) {
166 0           $warn = $args{warning};
167             }
168 0 0         if ($args{critical}) {
169 0           $crit = $args{critical};
170             }
171             }
172 0 0         if ($uom eq "%") {
173 0           $min = 0;
174 0           $max = 100;
175             }
176 0 0         if (defined $args{places}) {
177             # cut off excessive decimals which may be the result of a division
178             # length = places*2, no trailing zeroes
179 0 0         if ($warn ne "") {
180             $warn = join("", map {
181 0           s/\.0+$//; $_
  0            
182             } map {
183 0           s/(\.[1-9]+)0+$/$1/; $_
  0            
184             } map {
185 0 0         /[\+\-\d\.]+/ ? sprintf '%.'.2*$args{places}.'f', $_ : $_;
  0            
186             } split(/([\+\-\d\.]+)/, $warn));
187             }
188 0 0         if ($crit ne "") {
189             $crit = join("", map {
190 0           s/\.0+$//; $_
  0            
191             } map {
192 0           s/(\.[1-9]+)0+$/$1/; $_
  0            
193             } map {
194 0 0         /[\+\-\d\.]+/ ? sprintf '%.'.2*$args{places}.'f', $_ : $_;
  0            
195             } split(/([\+\-\d\.]+)/, $crit));
196             }
197 0 0         if ($min ne "") {
198             $min = join("", map {
199 0           s/\.0+$//; $_
  0            
200             } map {
201 0           s/(\.[1-9]+)0+$/$1/; $_
  0            
202             } map {
203 0 0         /[\+\-\d\.]+/ ? sprintf '%.'.2*$args{places}.'f', $_ : $_;
  0            
204             } split(/([\+\-\d\.]+)/, $min));
205             }
206 0 0         if ($max ne "") {
207             $max = join("", map {
208 0           s/\.0+$//; $_
  0            
209             } map {
210 0           s/(\.[1-9]+)0+$/$1/; $_
  0            
211             } map {
212 0 0         /[\+\-\d\.]+/ ? sprintf '%.'.2*$args{places}.'f', $_ : $_;
  0            
213             } split(/([\+\-\d\.]+)/, $max));
214             }
215             }
216 0 0         push @{$self->{perfdata}}, sprintf("'%s'=%s%s;%s;%s;%s;%s",
  0            
217             $label, $value, $uom, $warn, $crit, $min, $max)
218             if $self->selected_perfdata($label);
219             }
220              
221             sub add_html {
222 0     0 0   my ($self, $line) = @_;
223 0           push @{$self->{html}}, $line;
  0            
224             }
225              
226             sub suppress_messages {
227 0     0 0   my ($self) = @_;
228 0           $self->{suppress_messages} = 1;
229             }
230              
231             sub clear_messages {
232 0     0 0   my ($self, $code) = @_;
233 0 0         $code = (qw(ok warning critical unknown))[$code] if $code =~ /^\d+$/;
234 0           $code = lc $code;
235 0           $self->{messages}->{$code} = [];
236             }
237              
238             sub reduce_messages_short {
239 0     0 0   my ($self, $message) = @_;
240 0   0       $message ||= "no problems";
241 0 0 0       if ($self->opts->report && $self->opts->report eq "short") {
242 0           $self->clear_messages(OK);
243 0 0         $self->add_message(OK, $message) if ! $self->check_messages();
244             }
245             }
246              
247             sub reduce_messages {
248 0     0 0   my ($self, $message) = @_;
249 0   0       $message ||= "no problems";
250 0           $self->clear_messages(OK);
251 0 0         $self->add_message(OK, $message) if ! $self->check_messages();
252             }
253              
254             sub check_messages {
255 0     0 0   my ($self, %args) = @_;
256              
257             # Add object messages to any passed in as args
258 0           for my $code (qw(critical warning unknown ok)) {
259 0   0       my $messages = $self->{messages}->{$code} || [];
260 0 0         if ($args{$code}) {
261 0 0         unless (ref $args{$code} eq 'ARRAY') {
262 0 0         if ($code eq 'ok') {
263 0           $args{$code} = [ $args{$code} ];
264             }
265             }
266 0           push @{$args{$code}}, @$messages;
  0            
267             } else {
268 0           $args{$code} = $messages;
269             }
270             }
271 0           my %arg = %args;
272 0 0         $arg{join} = ' ' unless defined $arg{join};
273              
274             # Decide $code
275 0           my $code = OK;
276 0 0 0       $code ||= CRITICAL if @{$arg{critical}};
  0            
277 0 0 0       $code ||= WARNING if @{$arg{warning}};
  0            
278 0 0 0       $code ||= UNKNOWN if @{$arg{unknown}};
  0            
279 0 0         return $code unless wantarray;
280              
281             # Compose message
282 0           my $message = '';
283 0 0         if ($arg{join_all}) {
284             $message = join( $arg{join_all},
285 0 0         map { @$_ ? join( $arg{'join'}, @$_) : () }
286             $arg{critical},
287             $arg{warning},
288             $arg{unknown},
289 0 0         $arg{ok} ? (ref $arg{ok} ? $arg{ok} : [ $arg{ok} ]) : []
    0          
290             );
291             }
292              
293             else {
294 0 0 0       $message ||= join( $arg{'join'}, @{$arg{critical}} )
  0            
295             if $code == CRITICAL;
296 0 0 0       $message ||= join( $arg{'join'}, @{$arg{warning}} )
  0            
297             if $code == WARNING;
298 0 0 0       $message ||= join( $arg{'join'}, @{$arg{unknown}} )
  0            
299             if $code == UNKNOWN;
300 0           $message ||= ref $arg{ok} ? join( $arg{'join'}, @{$arg{ok}} ) : $arg{ok}
301 0 0 0       if $arg{ok};
    0          
302             }
303              
304 0           return ($code, $message);
305             }
306              
307             sub status_code {
308 0     0 0   my ($self, $code) = @_;
309 0 0         $code = (qw(ok warning critical unknown))[$code] if $code =~ /^\d+$/;
310 0           $code = uc $code;
311 0 0 0       $code = $ERRORS{$code} if defined $code && exists $ERRORS{$code};
312 0 0 0       $code = UNKNOWN unless defined $code && exists $STATUS_TEXT{$code};
313 0           return "$STATUS_TEXT{$code}";
314             }
315              
316             sub perfdata_string {
317 0     0 0   my ($self) = @_;
318 0 0         if (scalar (@{$self->{perfdata}})) {
  0            
319 0           return join(" ", @{$self->{perfdata}});
  0            
320             } else {
321 0           return "";
322             }
323             }
324              
325             sub html_string {
326 0     0 0   my ($self) = @_;
327 0 0         if (scalar (@{$self->{html}})) {
  0            
328 0           return join(" ", @{$self->{html}});
  0            
329             } else {
330 0           return "";
331             }
332             }
333              
334             sub nagios_exit {
335 0     0 0   my ($self, $code, $message, $arg) = @_;
336 0 0 0       $code = $ERRORS{$code} if defined $code && exists $ERRORS{$code};
337 0 0 0       $code = UNKNOWN unless defined $code && exists $STATUS_TEXT{$code};
338 0 0         $message = '' unless defined $message;
339 0 0 0       if (ref $message && ref $message eq 'ARRAY') {
340 0           $message = join(' ', map { chomp; $_ } @$message);
  0            
  0            
341             } else {
342 0           chomp $message;
343             }
344 0 0         if ($self->opts->negate) {
345 0           my $original_code = $code;
346 0           foreach my $from (keys %{$self->opts->negate}) {
  0            
347 0 0 0       if ((uc $from) =~ /^(OK|WARNING|CRITICAL|UNKNOWN)$/ &&
348             (uc $self->opts->negate->{$from}) =~ /^(OK|WARNING|CRITICAL|UNKNOWN)$/) {
349 0 0         if ($original_code == $ERRORS{uc $from}) {
350 0           $code = $ERRORS{uc $self->opts->negate->{$from}};
351             }
352             }
353             }
354             }
355 0           my $output = "$STATUS_TEXT{$code}";
356 0 0 0       $output .= " - $message" if defined $message && $message ne '';
357 0 0 0       if ($self->opts->can("morphmessage") && $self->opts->morphmessage) {
358             # 'Intel [R] Interface (\d+) usage'='nic$1'
359             # '^OK.*'="alles klar" '^CRITICAL.*'="alles hi"
360 0           foreach my $key (keys %{$self->opts->morphmessage}) {
  0            
361 0 0         if ($output =~ /$key/) {
362 0           my $replacement = '"'.$self->opts->morphmessage->{$key}.'"';
363 0           $output =~ s/$key/$replacement/ee;
  0            
364             }
365             }
366             }
367 0 0         $output =~ s/\|/!/g if $output;
368 0 0         if (scalar (@{$self->{perfdata}})) {
  0            
369 0           $output .= " | ".$self->perfdata_string();
370             }
371 0           $output .= "\n";
372 0 0 0       if ($self->opts->can("isvalidtime") && ! $self->opts->isvalidtime) {
373 0           $code = OK;
374 0           $output = "OK - outside valid timerange. check results are not relevant now. original message was: ".
375             $output;
376             }
377 0 0         if (! exists $self->{suppress_messages}) {
378 0           print $output;
379             }
380 0           exit $code;
381             }
382              
383             sub set_thresholds {
384 0     0 0   my ($self, %params) = @_;
385 0 0         if (exists $params{metric}) {
386 0           my $metric = $params{metric};
387             # erst die hartcodierten defaultschwellwerte
388 0           $self->{thresholds}->{$metric}->{warning} = $params{warning};
389 0           $self->{thresholds}->{$metric}->{critical} = $params{critical};
390             # dann die defaultschwellwerte von der kommandozeile
391 0 0         if (defined $self->opts->warning) {
392 0           $self->{thresholds}->{$metric}->{warning} = $self->opts->warning;
393             }
394 0 0         if (defined $self->opts->critical) {
395 0           $self->{thresholds}->{$metric}->{critical} = $self->opts->critical;
396             }
397             # dann die ganz spezifischen schwellwerte von der kommandozeile
398 0 0         if ($self->opts->warningx) { # muss nicht auf defined geprueft werden, weils ein hash ist
399             # Erst schauen, ob einer * beinhaltet. Von denen wird vom Laengsten
400             # bis zum Kuerzesten probiert, ob die matchen. Der laengste Match
401             # gewinnt.
402 0           my @keys = keys %{$self->opts->warningx};
  0            
403 0           my @stringkeys = ();
404 0           my @regexkeys = ();
405 0           foreach my $key (sort { length($b) > length($a) } @keys) {
  0            
406 0 0         if ($key =~ /\*/) {
407 0           push(@regexkeys, $key);
408             } else {
409 0           push(@stringkeys, $key);
410             }
411             }
412 0           foreach my $key (@regexkeys) {
413 0 0         next if $metric !~ /$key/;
414 0           $self->{thresholds}->{$metric}->{warning} = $self->opts->warningx->{$key};
415 0           last;
416             }
417             # Anschliessend nochmal schauen, ob es einen nicht-Regex-Volltreffer gibt
418 0           foreach my $key (@stringkeys) {
419 0 0         next if $key ne $metric;
420 0           $self->{thresholds}->{$metric}->{warning} = $self->opts->warningx->{$key};
421 0           last;
422             }
423             }
424 0 0         if ($self->opts->criticalx) {
425 0           my @keys = keys %{$self->opts->criticalx};
  0            
426 0           my @stringkeys = ();
427 0           my @regexkeys = ();
428 0           foreach my $key (sort { length($b) > length($a) } @keys) {
  0            
429 0 0         if ($key =~ /\*/) {
430 0           push(@regexkeys, $key);
431             } else {
432 0           push(@stringkeys, $key);
433             }
434             }
435 0           foreach my $key (@regexkeys) {
436 0 0         next if $metric !~ /$key/;
437 0           $self->{thresholds}->{$metric}->{critical} = $self->opts->criticalx->{$key};
438 0           last;
439             }
440             # Anschliessend nochmal schauen, ob es einen nicht-Regex-Volltreffer gibt
441 0           foreach my $key (@stringkeys) {
442 0 0         next if $key ne $metric;
443 0           $self->{thresholds}->{$metric}->{critical} = $self->opts->criticalx->{$key};
444 0           last;
445             }
446             }
447             } else {
448             $self->{thresholds}->{default}->{warning} =
449 0 0         defined $self->opts->warning ? $self->opts->warning : defined $params{warning} ? $params{warning} : 0;
    0          
450             $self->{thresholds}->{default}->{critical} =
451 0 0         defined $self->opts->critical ? $self->opts->critical : defined $params{critical} ? $params{critical} : 0;
    0          
452             }
453             }
454              
455             sub force_thresholds {
456 0     0 0   my ($self, %params) = @_;
457 0 0         if (exists $params{metric}) {
458 0           my $metric = $params{metric};
459 0   0       $self->{thresholds}->{$metric}->{warning} = $params{warning} || 0;
460 0   0       $self->{thresholds}->{$metric}->{critical} = $params{critical} || 0;
461             } else {
462 0   0       $self->{thresholds}->{default}->{warning} = $params{warning} || 0;
463 0   0       $self->{thresholds}->{default}->{critical} = $params{critical} || 0;
464             }
465             }
466              
467             sub get_thresholds {
468 0     0 0   my ($self, @params) = @_;
469 0 0         if (scalar(@params) > 1) {
470 0           my %params = @params;
471 0           my $metric = $params{metric};
472             return ($self->{thresholds}->{$metric}->{warning},
473 0           $self->{thresholds}->{$metric}->{critical});
474             } else {
475             return ($self->{thresholds}->{default}->{warning},
476 0           $self->{thresholds}->{default}->{critical});
477             }
478             }
479              
480             sub check_thresholds {
481 0     0 0   my ($self, @params) = @_;
482 0           my $level = $ERRORS{OK};
483 0           my $warningrange;
484             my $criticalrange;
485 0           my $value;
486 0 0         if (scalar(@params) > 1) {
487 0           my %params = @params;
488 0           $value = $params{value};
489 0           my $metric = $params{metric};
490 0 0         if ($metric ne 'default') {
491             $warningrange = exists $self->{thresholds}->{$metric}->{warning} ?
492             $self->{thresholds}->{$metric}->{warning} :
493 0 0         $self->{thresholds}->{default}->{warning};
494             $criticalrange = exists $self->{thresholds}->{$metric}->{critical} ?
495             $self->{thresholds}->{$metric}->{critical} :
496 0 0         $self->{thresholds}->{default}->{critical};
497             } else {
498             $warningrange = (defined $params{warning}) ?
499 0 0         $params{warning} : $self->{thresholds}->{default}->{warning};
500             $criticalrange = (defined $params{critical}) ?
501 0 0         $params{critical} : $self->{thresholds}->{default}->{critical};
502             }
503             } else {
504 0           $value = $params[0];
505 0           $warningrange = $self->{thresholds}->{default}->{warning};
506 0           $criticalrange = $self->{thresholds}->{default}->{critical};
507             }
508 0 0         if (! defined $warningrange) {
    0          
    0          
    0          
    0          
    0          
509             # there was no set_thresholds for defaults, no --warning, no --warningx
510             } elsif ($warningrange =~ /^([-+]?[0-9]*\.?[0-9]+)$/) {
511             # warning = 10, warn if > 10 or < 0
512             $level = $ERRORS{WARNING}
513 0 0 0       if ($value > $1 || $value < 0);
514             } elsif ($warningrange =~ /^([-+]?[0-9]*\.?[0-9]+):$/) {
515             # warning = 10:, warn if < 10
516             $level = $ERRORS{WARNING}
517 0 0         if ($value < $1);
518             } elsif ($warningrange =~ /^~:([-+]?[0-9]*\.?[0-9]+)$/) {
519             # warning = ~:10, warn if > 10
520             $level = $ERRORS{WARNING}
521 0 0         if ($value > $1);
522             } elsif ($warningrange =~ /^([-+]?[0-9]*\.?[0-9]+):([-+]?[0-9]*\.?[0-9]+)$/) {
523             # warning = 10:20, warn if < 10 or > 20
524             $level = $ERRORS{WARNING}
525 0 0 0       if ($value < $1 || $value > $2);
526             } elsif ($warningrange =~ /^@([-+]?[0-9]*\.?[0-9]+):([-+]?[0-9]*\.?[0-9]+)$/) {
527             # warning = @10:20, warn if >= 10 and <= 20
528             $level = $ERRORS{WARNING}
529 0 0 0       if ($value >= $1 && $value <= $2);
530             }
531 0 0         if (! defined $criticalrange) {
    0          
    0          
    0          
    0          
    0          
532             # there was no set_thresholds for defaults, no --critical, no --criticalx
533             } elsif ($criticalrange =~ /^([-+]?[0-9]*\.?[0-9]+)$/) {
534             # critical = 10, crit if > 10 or < 0
535             $level = $ERRORS{CRITICAL}
536 0 0 0       if ($value > $1 || $value < 0);
537             } elsif ($criticalrange =~ /^([-+]?[0-9]*\.?[0-9]+):$/) {
538             # critical = 10:, crit if < 10
539             $level = $ERRORS{CRITICAL}
540 0 0         if ($value < $1);
541             } elsif ($criticalrange =~ /^~:([-+]?[0-9]*\.?[0-9]+)$/) {
542             # critical = ~:10, crit if > 10
543             $level = $ERRORS{CRITICAL}
544 0 0         if ($value > $1);
545             } elsif ($criticalrange =~ /^([-+]?[0-9]*\.?[0-9]+):([-+]?[0-9]*\.?[0-9]+)$/) {
546             # critical = 10:20, crit if < 10 or > 20
547             $level = $ERRORS{CRITICAL}
548 0 0 0       if ($value < $1 || $value > $2);
549             } elsif ($criticalrange =~ /^@([-+]?[0-9]*\.?[0-9]+):([-+]?[0-9]*\.?[0-9]+)$/) {
550             # critical = @10:20, crit if >= 10 and <= 20
551             $level = $ERRORS{CRITICAL}
552 0 0 0       if ($value >= $1 && $value <= $2);
553             }
554 0           return $level;
555             }
556              
557             1;
558              
559             __END__