diff options
Diffstat (limited to 'contrib/check_hprsc.pl')
-rwxr-xr-x | contrib/check_hprsc.pl | 215 |
1 files changed, 215 insertions, 0 deletions
diff --git a/contrib/check_hprsc.pl b/contrib/check_hprsc.pl new file mode 100755 index 00000000..23e6261f --- /dev/null +++ b/contrib/check_hprsc.pl | |||
@@ -0,0 +1,215 @@ | |||
1 | #!/usr/bin/perl -wT | ||
2 | # | ||
3 | # Copyright (c) 2000 Hugo Gayosso | ||
4 | # | ||
5 | # Description: | ||
6 | # Nagios plug-in that monitors the resources on an HP-UX machine | ||
7 | # by querying the SNMP daemon | ||
8 | # | ||
9 | # License: General Public License (GPL) | ||
10 | # http://www.gnu.org/copyleft/gpl.txt | ||
11 | # | ||
12 | # ChangeLog | ||
13 | # | ||
14 | |||
15 | # Requirements: Perl 5.005 or higher | ||
16 | |||
17 | # Variable initialization | ||
18 | $ENV{'PATH'}=""; | ||
19 | $ENV{'ENV'}=""; | ||
20 | $ENV{'BASH_ENV'}=""; | ||
21 | |||
22 | |||
23 | if (-e "/usr/bin/snmpwalk") { | ||
24 | $snmpwalk = "/usr/bin/snmpwalk"; | ||
25 | } elsif (-e "/usr/local/bin/snmpwalk") { | ||
26 | $snmpwalk = "/usr/local/snmpwalk"; | ||
27 | } | ||
28 | |||
29 | |||
30 | # HP-UX SNMP OIDs | ||
31 | $filesystemID1_OID = ".1.3.6.1.4.1.11.2.3.1.2.2.1.1"; | ||
32 | $mounted_OID = ".1.3.6.1.4.1.11.2.3.1.2.2.1.3"; | ||
33 | $totalspace_OID = ".1.3.6.1.4.1.11.2.3.1.2.2.1.4"; | ||
34 | $freespace_OID = ".1.3.6.1.4.1.11.2.3.1.2.2.1.6"; | ||
35 | $path_OID = ".1.3.6.1.4.1.11.2.3.1.2.2.1.10"; | ||
36 | $cpu_5min_OID = ".1.3.6.1.4.1.11.2.3.1.1.4"; | ||
37 | |||
38 | use Getopt::Long; | ||
39 | |||
40 | GetOptions( "check-filesystem" => \$chk_fs, | ||
41 | "show-filesystems" => \$show_fs, | ||
42 | "check-filesystemID" => \$chk_fsid, | ||
43 | "check-cpu" => \$chk_cpu, | ||
44 | "host=s" => \$target_host, | ||
45 | "community=s" => \$target_community, | ||
46 | "filesystemID1=i" => \$fsid1_opt, | ||
47 | "filesystem=s" => \$fs_opt, | ||
48 | "warning=i" => \$warning_opt, | ||
49 | "critical=i" => \$critical_opt); | ||
50 | |||
51 | if ($chk_fs) { | ||
52 | walk_data($snmpwalk, $target_host, $target_community, $mounted_OID ); | ||
53 | walk_data($snmpwalk, $target_host, $target_community, $totalspace_OID ); | ||
54 | walk_data($snmpwalk, $target_host, $target_community, $freespace_OID ); check_filesystem($fs_opt, $warning_opt, $critical_opt); | ||
55 | } elsif ($show_fs) { | ||
56 | walk_data($snmpwalk, $target_host, $target_community, $filesystemID1_OID); | ||
57 | walk_data($snmpwalk, $target_host, $target_community, $mounted_OID ); | ||
58 | walk_data($snmpwalk, $target_host, $target_community, $path_OID); | ||
59 | show_filesystem(); | ||
60 | } elsif ($chk_fsid){ | ||
61 | $totalspace_fsID_OID = "$totalspace_OID.$fsid1_opt"; | ||
62 | $freespace_fsID_OID = "$freespace_OID.$fsid1_opt"; | ||
63 | walk_data($snmpwalk, $target_host, $target_community, $totalspace_fsID_OID); | ||
64 | walk_data($snmpwalk, $target_host, $target_community, $freespace_fsID_OID); | ||
65 | check_filesystemID1($fsid1_opt, $warning_opt, $critical_opt); | ||
66 | } elsif ($chk_cpu) { | ||
67 | get_cpu_load($snmpwalk, $target_host, $target_community, $cpu_5min_OID); | ||
68 | check_cpu_5min($cpu, $warning_opt, $critical_opt); | ||
69 | } else { | ||
70 | print "\n\nUsage:\n"; | ||
71 | print "Checking 5-min CPU Load:\n"; | ||
72 | print " $0 --check-cpu -warning <threshold> --critical <threshold> --host <yourhost> --community <SNMP community>\n\n"; | ||
73 | print "Checking local filesystem mounted on a host:\n"; | ||
74 | print " $0 --show-filesystems --host <hostname> --community <SNMP community>\n\n"; | ||
75 | print "Checking by filesystem name:\n"; | ||
76 | print " $0 --check-filesystem --filesystem </dev/vg00/lvol1> --warning <% used space> --critical <% used space> --host <hostname> --community <SNMP community>\n\n"; | ||
77 | print "Checking by filesystem ID:\n"; | ||
78 | print " $0 --check-filesystemID --filesystemID <filesystemID1> --warning <% used space> --critical <% used space> --host <hostname> --community <SNMP community>\n\n"; | ||
79 | } | ||
80 | |||
81 | sub get_cpu_load { | ||
82 | my ($snmpwalk, $target_host, $target_community, $OID) = @_; | ||
83 | die "cannot fork: $!" unless defined($pid = open(SNMPWALK, "-|")); | ||
84 | |||
85 | if ($pid) { # parent | ||
86 | while (<SNMPWALK>) { | ||
87 | my @snmpdata = split(/:/,$_); | ||
88 | $cpu = $snmpdata[1]/100; | ||
89 | } | ||
90 | close(SNMPWALK) or warn "kid exited $?"; | ||
91 | } else { # child | ||
92 | exec($snmpwalk,$target_host,$target_community,$OID) or die "can't exec program: $!"; | ||
93 | } | ||
94 | } | ||
95 | |||
96 | sub walk_data { | ||
97 | #This function queries the SNMP daemon for the specific OID | ||
98 | my ($snmpwalk, $target_host, $target_community, $OID) = @_; | ||
99 | |||
100 | die "cannot fork: $!" unless defined($pid = open(SNMPWALK, "-|")); | ||
101 | |||
102 | if ($pid) { # parent | ||
103 | while (<SNMPWALK>) { | ||
104 | $output = $_; | ||
105 | sort_walk_data($output); | ||
106 | } | ||
107 | close(SNMPWALK) or warn "kid exited $?"; | ||
108 | } else { # child | ||
109 | exec($snmpwalk,$target_host,$target_community,$OID) or die "can't exec program: $!"; | ||
110 | } | ||
111 | } | ||
112 | |||
113 | sub sort_walk_data { | ||
114 | my ($snmp_data) = @_; | ||
115 | @fields = split(/\./,$snmp_data); | ||
116 | $item = $fields[8]; | ||
117 | $filesystemID1 = $fields[9]; | ||
118 | @fields2 = split(/=/,$fields[10]); | ||
119 | # $filesystemID2 = $fields2[0]; | ||
120 | $value = $fields2[1]; | ||
121 | chomp($value); | ||
122 | if ($value =~ /"/) { | ||
123 | @fields3 = split(/"/,$value); | ||
124 | $value = $fields3[1]; | ||
125 | } | ||
126 | if ($item == 3) { | ||
127 | $mounted{$filesystemID1} = "$value"; | ||
128 | } elsif ($item == 4) { | ||
129 | $totalspace{$filesystemID1} = "$value"; | ||
130 | } elsif ($item == 6) { | ||
131 | $freespace{$filesystemID1} = "$value"; | ||
132 | } elsif ($item == 10) { | ||
133 | $filesystempath{$filesystemID1} = "$value"; | ||
134 | } | ||
135 | } | ||
136 | |||
137 | sub show_filesystem { | ||
138 | print "\n\nfilesystemID1\tmounted filesystem\tfilesystem path\n"; | ||
139 | foreach $element (keys %mounted) { | ||
140 | print "$element\t$mounted{$element}\t\t$filesystempath{$element}\n"; | ||
141 | } | ||
142 | print "\n\n"; | ||
143 | } | ||
144 | |||
145 | sub check_filesystem { | ||
146 | |||
147 | # Warning = percentage of used space >= $warning and < $critical | ||
148 | # Critical = percentage of used space > $warning and >= $critical | ||
149 | # OK = percentage of used space < $warning and < $critical | ||
150 | |||
151 | my ($mounted_filesystem, $warning, $critical) = @_; | ||
152 | foreach $element (keys %mounted) { | ||
153 | if ($mounted{$element} eq $mounted_filesystem) { | ||
154 | my $warning_result = $totalspace{$element}*(100-$warning)/100; | ||
155 | my $critical_result = $totalspace{$element}*(100-$critical)/100; | ||
156 | my $result_percent = $freespace{$element}*100/$totalspace{$element}; | ||
157 | if (($freespace{$element} <= $warning_result) && ($freespace{$element} > $critical_result)) { | ||
158 | printf "Only %d M (%d%s) free\n",$freespace{$element}/1024,$result_percent,"%"; | ||
159 | exit 1; | ||
160 | } elsif ($freespace{$element} <= $critical_result) { | ||
161 | printf "Only %d M (%d%s) free\n",$freespace{$element}/1024,$result_percent,"%"; | ||
162 | exit 2; | ||
163 | } else { | ||
164 | printf "Disk ok - %d M (%d%s) free\n",$freespace{$element}/1024,$result_percent,"%"; | ||
165 | exit 0; | ||
166 | } | ||
167 | } | ||
168 | } | ||
169 | print "$mounted_filesystem doesn't exist in $target_host\n\n"; | ||
170 | exit -1; | ||
171 | } | ||
172 | |||
173 | sub check_filesystemID1{ | ||
174 | # Warning = percentage of used space >= $warning and < $critical | ||
175 | # Critical = percentage of used space > $warning and >= $critical | ||
176 | # OK = percentage of used space < $warning and < $critical | ||
177 | |||
178 | my ($fsid1, $warning, $critical) = @_; | ||
179 | foreach $element (keys %totalspace) { | ||
180 | if ($element eq $fsid1) { | ||
181 | my $warning_result = $totalspace{$element}*(100-$warning)/100; | ||
182 | my $critical_result = $totalspace{$element}*(100-$critical)/100; | ||
183 | my $result_percent = $freespace{$element}*100/$totalspace{$element}; | ||
184 | if (($freespace{$element} <= $warning_result) && ($freespace{$element} >= $critical_result)) { | ||
185 | printf "Only %d M (%d%s) free\n",$freespace{$element}/1024,$result_percent,"%"; | ||
186 | exit 1; | ||
187 | } elsif ($freespace{$element} <= $critical_result) { | ||
188 | printf "Only %d M (%d%s) free\n",$freespace{$element}/1024,$result_percent,"%"; | ||
189 | exit 2; | ||
190 | } else { | ||
191 | printf "Disk ok - %d M (%d%s) free\n",$freespace{$element}/1024,$result_percent,"%"; | ||
192 | exit 0; | ||
193 | } | ||
194 | } | ||
195 | } | ||
196 | print "$fsid1 doesn't exist in $target_host\n\n"; | ||
197 | exit -1; | ||
198 | } | ||
199 | |||
200 | sub check_cpu_5min { | ||
201 | my ($cpu, $warn, $crit) = @_; | ||
202 | if ($cpu >= $crit) { | ||
203 | print "Critical- 5-min load: $cpu\n"; | ||
204 | exit 2; | ||
205 | } elsif ($cpu >= $warn) { | ||
206 | print "Warning - 5-min load: $cpu\n"; | ||
207 | exit 1; | ||
208 | } else { | ||
209 | print "Load ok - 5-min load: $cpu\n"; | ||
210 | exit 0; | ||
211 | } | ||
212 | } | ||
213 | |||
214 | |||
215 | |||