diff options
-rwxr-xr-x | contrib/check_digitemp.pl | 252 |
1 files changed, 252 insertions, 0 deletions
diff --git a/contrib/check_digitemp.pl b/contrib/check_digitemp.pl new file mode 100755 index 00000000..d2b40a10 --- /dev/null +++ b/contrib/check_digitemp.pl | |||
@@ -0,0 +1,252 @@ | |||
1 | #!/usr/bin/perl -w | ||
2 | |||
3 | # check_digitemp.pl Copyright (C) 2002 by Brian C. Lane <bcl@brianlane.com> | ||
4 | # | ||
5 | # This is a NetSaint plugin script to check the temperature on a local | ||
6 | # machine. Remote usage may be possible with SSH | ||
7 | # | ||
8 | # Permission is hereby granted, free of charge, to any person obtaining a copy | ||
9 | # of this software and associated documentation files (the "Software"), to | ||
10 | # deal in the Software without restriction, including without limitation the | ||
11 | # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or | ||
12 | # sell copies of the Software, and to permit persons to whom the Software is | ||
13 | # furnished to do so, subject to the following conditions: | ||
14 | # | ||
15 | # The above copyright notice and this permission notice shall be included in | ||
16 | # all copies or substantial portions of the Software. | ||
17 | # | ||
18 | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
19 | # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
20 | # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
21 | # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
22 | # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | ||
23 | # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS | ||
24 | # IN THE SOFTWARE. | ||
25 | # | ||
26 | # =========================================================================== | ||
27 | # Howto Install in NetSaint (tested with v0.0.7) | ||
28 | # | ||
29 | # 1. Copy this script to /usr/local/netsaint/libexec/ or wherever you have | ||
30 | # placed your NetSaint plugins | ||
31 | # | ||
32 | # 2. Create a digitemp config file in /usr/local/netsaint/etc/ | ||
33 | # eg. digitemp -i -s/dev/ttyS0 -c /usr/local/netsaint/etc/digitemp.conf | ||
34 | # | ||
35 | # 3. Make sure that the webserver user has permission to access the serial | ||
36 | # port being used. | ||
37 | # | ||
38 | # 4. Add a command to /usr/local/netsaint/etc/commands.cfg like this: | ||
39 | # command[check-temp]=$USER1$/check_digitemp.pl -w $ARG1$ -c $ARG2$ \ | ||
40 | # -t $ARG3$ -f $ARG4$ | ||
41 | # (fold into one line) | ||
42 | # | ||
43 | # 5. Tell NetSaint to monitor the temperature by adding a service line like | ||
44 | # this to your hosts.cfg file: | ||
45 | # service[kermit]=Temperature;0;24x7;3;5;1;home-admins;120;24x7;1;1;1;; \ | ||
46 | # check-temp!65!75!1!/usr/local/netsaint/etc/digitemp.conf | ||
47 | # (fold into one line) | ||
48 | # 65 is the warning temperature | ||
49 | # 75 is the critical temperature | ||
50 | # 1 is the sensor # (as reported by digitemp -a) to monitor | ||
51 | # digitemp.conf is the path to the config file | ||
52 | # | ||
53 | # 6. If you use Centigrade instead of Fahrenheit, change the commands.cfg | ||
54 | # line to include the -C argument. You can then pass temperature limits in | ||
55 | # Centigrade in the service line. | ||
56 | # | ||
57 | # =========================================================================== | ||
58 | # Howto Install in Nagios (tested with v1.0b4) | ||
59 | # | ||
60 | # 1. Copy this script to /usr/local/nagios/libexec/ or wherever you have | ||
61 | # placed your Nagios plugins | ||
62 | # | ||
63 | # 2. Create a digitemp config file in /usr/local/nagios/etc/ | ||
64 | # eg. digitemp -i -s/dev/ttyS0 -c /usr/local/nagios/etc/digitemp.conf | ||
65 | # | ||
66 | # 3. Make sure that the webserver user has permission to access the serial | ||
67 | # port being used. | ||
68 | # | ||
69 | # 4. Add a command to /usr/local/nagios/etc/checkcommands.cfg like this: | ||
70 | # | ||
71 | # #DigiTemp temperature check command | ||
72 | # define command{ | ||
73 | # command_name check_temperature | ||
74 | # command_line $USER1$/check_digitemp.pl -w $ARG1$ -c $ARG2$ \ | ||
75 | # -t $ARG3$ -f $ARG4$ | ||
76 | # (fold above into one line) | ||
77 | # } | ||
78 | # | ||
79 | # 5. Tell NetSaint to monitor the temperature by adding a service line like | ||
80 | # this to your service.cfg file: | ||
81 | # | ||
82 | # #DigiTemp Temperature check Service definition | ||
83 | # define service{ | ||
84 | # use generic-service | ||
85 | # host_name kermit | ||
86 | # service_description Temperature | ||
87 | # is_volatile 0 | ||
88 | # check_period 24x7 | ||
89 | # max_check_attempts 3 | ||
90 | # normal_check_interval 5 | ||
91 | # retry_check_interval 2 | ||
92 | # contact_groups home-admins | ||
93 | # notification_interval 240 | ||
94 | # notification_period 24x7 | ||
95 | # notification_options w,u,c,r | ||
96 | # check_command check_temperature!65!75!1! \ | ||
97 | # /usr/local/nagios/etc/digitemp.conf | ||
98 | # (fold into one line) | ||
99 | # } | ||
100 | # | ||
101 | # 65 is the warning temperature | ||
102 | # 75 is the critical temperature | ||
103 | # 1 is the sensor # (as reported by digitemp -a) to monitor | ||
104 | # digitemp.conf is the path to the config file | ||
105 | # | ||
106 | # 6. If you use Centigrade instead of Fahrenheit, change the checkcommands.cfg | ||
107 | # line to include the -C argument. You can then pass temperature limits in | ||
108 | # Centigrade in the service line. | ||
109 | # | ||
110 | # =========================================================================== | ||
111 | |||
112 | # Modules to use | ||
113 | use strict; | ||
114 | use Getopt::Std; | ||
115 | |||
116 | # Define all our variable usage | ||
117 | use vars qw($opt_c $opt_f $opt_t $opt_w $opt_F $opt_C | ||
118 | $temperature $conf_file $sensor $temp_fmt | ||
119 | $crit_level $warn_level $null | ||
120 | %exit_codes | ||
121 | $percent $fmt_pct | ||
122 | $verb_err $command_line); | ||
123 | |||
124 | |||
125 | # Predefined exit codes for NetSaint | ||
126 | %exit_codes = ('UNKNOWN' ,-1, | ||
127 | 'OK' , 0, | ||
128 | 'WARNING' , 1, | ||
129 | 'CRITICAL', 2,); | ||
130 | |||
131 | # Default to Fahrenheit input and result (use -C to change this) | ||
132 | $temp_fmt = 3; | ||
133 | |||
134 | |||
135 | # Get the options | ||
136 | if ($#ARGV le 0) | ||
137 | { | ||
138 | &usage; | ||
139 | } else { | ||
140 | getopts('f:t:FCc:w:'); | ||
141 | } | ||
142 | |||
143 | # Shortcircuit the switches | ||
144 | if (!$opt_w or $opt_w == 0 or !$opt_c or $opt_c == 0) | ||
145 | { | ||
146 | print "*** You must define WARN and CRITICAL levels!"; | ||
147 | &usage; | ||
148 | } | ||
149 | |||
150 | # Check if levels are sane | ||
151 | if ($opt_w >= $opt_c) | ||
152 | { | ||
153 | print "*** WARN level must not be greater than CRITICAL when checking temperature!"; | ||
154 | &usage; | ||
155 | } | ||
156 | |||
157 | |||
158 | $warn_level = $opt_w; | ||
159 | $crit_level = $opt_c; | ||
160 | |||
161 | # Default sensor to read is #0 | ||
162 | if(!$opt_t) | ||
163 | { | ||
164 | $sensor = 0; | ||
165 | } else { | ||
166 | $sensor = $opt_t; | ||
167 | } | ||
168 | |||
169 | # Default config file is /etc/digitemp.conf | ||
170 | if(!$opt_f) | ||
171 | { | ||
172 | $conf_file = "/etc/digitemp.conf"; | ||
173 | } else { | ||
174 | $conf_file = $opt_f; | ||
175 | } | ||
176 | |||
177 | # Check for config file | ||
178 | if( !-f $conf_file ) { | ||
179 | print "*** You must have a digitemp.conf file\n"; | ||
180 | &usage; | ||
181 | } | ||
182 | |||
183 | |||
184 | if($opt_C) | ||
185 | { | ||
186 | $temp_fmt = 2; | ||
187 | } | ||
188 | |||
189 | # Read the output from digitemp | ||
190 | # Output in form 0\troom\tattic\tdrink | ||
191 | open( DIGITEMP, "/usr/local/bin/digitemp -c $conf_file -t $sensor -q -o $temp_fmt |" ); | ||
192 | |||
193 | # Process the output from the command | ||
194 | while( <DIGITEMP> ) | ||
195 | { | ||
196 | # print "$_\n"; | ||
197 | chomp; | ||
198 | |||
199 | if( $_ =~ /^nanosleep/i ) | ||
200 | { | ||
201 | print "Error reading sensor #$sensor\n"; | ||
202 | close(DIGITEMP); | ||
203 | exit $exit_codes{'UNKNOWN'}; | ||
204 | } else { | ||
205 | # Check for an error from digitemp, and report it instead | ||
206 | if( $_ =~ /^Error.*/i ) { | ||
207 | print $_; | ||
208 | close(DIGITEMP); | ||
209 | exit $exit_codes{'UNKNOWN'}; | ||
210 | } else { | ||
211 | ($null,$temperature) = split(/\t/); | ||
212 | } | ||
213 | } | ||
214 | } | ||
215 | close( DIGITEMP ); | ||
216 | |||
217 | if( $temperature and $temperature >= $crit_level ) | ||
218 | { | ||
219 | print "Temperature CRITICAL - Sensor #$sensor = $temperature "; | ||
220 | if( $temp_fmt == 3 ) { print "F\n"; } else { print "C\n"; } | ||
221 | exit $exit_codes{'CRITICAL'}; | ||
222 | } elsif ($temperature and $temperature >= $warn_level ) { | ||
223 | print "Temperature WARNING - Sensor #$sensor = $temperature "; | ||
224 | if( $temp_fmt == 3 ) { print "F\n"; } else { print "C\n"; } | ||
225 | exit $exit_codes{'WARNING'}; | ||
226 | } elsif( $temperature ) { | ||
227 | print "Temperature OK - Sensor #$sensor = $temperature "; | ||
228 | if( $temp_fmt == 3 ) { print "F\n"; } else { print "C\n"; } | ||
229 | exit $exit_codes{'OK'}; | ||
230 | } else { | ||
231 | print "Error parsing result for sensor #$sensor\n"; | ||
232 | exit $exit_codes{'UNKNOWN'}; | ||
233 | } | ||
234 | |||
235 | # Show usage | ||
236 | sub usage() | ||
237 | { | ||
238 | print "\ncheck_digitemp.pl v1.0 - NetSaint Plugin\n"; | ||
239 | print "Copyright 2002 by Brian C. Lane <bcl\@brianlane.com>\n"; | ||
240 | print "See source for License\n"; | ||
241 | print "usage:\n"; | ||
242 | print " check_digitemp.pl -t <sensor> -f <config file> -w <warnlevel> -c <critlevel>\n\n"; | ||
243 | print "options:\n"; | ||
244 | print " -f DigiTemp Config File\n"; | ||
245 | print " -t DigiTemp Sensor #\n"; | ||
246 | print " -F Temperature in Fahrenheit\n"; | ||
247 | print " -C Temperature in Centigrade\n"; | ||
248 | print " -w temperature temperature >= to warn\n"; | ||
249 | print " -c temperature temperature >= when critical\n"; | ||
250 | |||
251 | exit $exit_codes{'UNKNOWN'}; | ||
252 | } | ||