summaryrefslogtreecommitdiffstats
path: root/lib/Nagios/Plugin/Range.pm
blob: 3d6f61316e921387947dd462cfe79390cda7a820 (plain)
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
124
125
126
package Nagios::Plugin::Range;

use 5.008004;

use strict;
use warnings;

use overload
        '""' => sub { shift->stringify };

use Class::Struct;
struct "Nagios::Plugin::Range" => {
	start => '$',
	end => '$',
	start_infinity => '$',	# TRUE / FALSE
	end_infinity => '$',	# TRUE / FALSE
	alert_on => '$',	# OUTSIDE 0, INSIDE 1
	};

my $outside = 0;
my $inside = 1;

sub stringify {
	my $self = shift;
	return (($self->alert_on) ? "@" : "") .
		(($self->start_infinity == 1) ? "~:" : (($self->start == 0)?"":$self->start.":")) . 
		(($self->end_infinity == 1) ? "" : $self->end);
}

sub set_range_start {
	my ($self, $value) = @_;
	$self->start($value+0);	# Force scalar into number
	$self->start_infinity(0);
}

sub set_range_end {
	my ($self, $value) = @_;
	$self->end($value+0);	# Force scalar into number
	$self->end_infinity(0);
}

# Returns a N::P::Range object if the string is a conforms to a Nagios Plugin range string, otherwise null
sub parse_range_string {
	my ($class, $string) = @_;
	my $valid = 0;
	my $range = $class->new( start => 0, start_infinity => 0, end => 0, end_infinity => 1, alert_on => $outside);

	if ($string =~ s/^\@//) {
		$range->alert_on($inside);
	}
	if ($string =~ s/^~//) {
		$range->start_infinity(1);
	}
	if (($_) = $string =~ /^([-\d\.]+)?:/) {
		$range->set_range_start($_) if defined $_;
		$string =~ s/^([-\d\.]+)?://;
		$valid++
	}
	if ($string =~ /^([-\d\.]+)$/) {
		$range->set_range_end($string);
		$valid++;
	}

	if ($valid && ($range->start_infinity == 1 || $range->end_infinity == 1 || $range->start <= $range->end)) {
		return $range;
	}
	return undef;
}

# Returns 1 if an alert should be raised, otherwise 0
sub check_range {
	my ($self, $value) = @_;
	my $false = 0;
	my $true = 1;
	if ($self->alert_on == $inside) {
		$false = 1;
		$true = 0;
	}
	if ($self->end_infinity == 0 && $self->start_infinity == 0) {
		if ($self->start <= $value && $value <= $self->end) {
			return $false;
		} else {
			return $true;
		}
	} elsif ($self->start_infinity == 0 && $self->end_infinity == 1) {
		if ($self->start <= $value) {
			return $false;
		} else {
			return $true;
		}
	} elsif ($self->start_infinity == 1 && $self->end_infinity == 0) {
		if ($value <= $self->end) {
			return $false;
		} else {
			return $true;
		}
	} else {
		return $false;
	}
}

1;
__END__

=head1 NAME

Nagios::Plugin::Range - Common range functions for Nagios::Plugin

=head1 DESCRIPTION

Handles common Nagios Plugin range data. See Nagios::Plugin for creation interfaces.

=head1 AUTHOR

Ton Voon, E<lt>ton.voon@altinity.comE<gt>

=head1 COPYRIGHT AND LICENSE

Copyright (C) 2006 by Altinity Limited

This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself, either Perl version 5.8.4 or,
at your option, any later version of Perl 5 you may have available.


=cut