Same problem again. But this time it was just a bit more complex. This time the platform to be monitored is a Sun Fire 12K. Even for a small configuration like ours, the command showenvironment -p temps returned 198 temperatures from different sensors! Since there are many sensors on the same board, we needed to aggregate the temperatures and report the resulting minimum and maximum.

But wait, there is more :-) showenvironment also returns a status code, that indicates if the parameter is in a safe range or if you should start worrying -or if it wasn't simply possible to read the temperature at all.

So I came out with the following script, that does the job. Luckily Unfortunately I don't know what comes out in case an INVALID status is returned, so I just had to guess. Since we are going to send alerts around if an INVALID pops up, it is not a big problem if it returns crap instead of temperatures, anyway if you know the output format in that case, please send a patch and I'll be happy to apply it!

The code reads the output of showenvironment -p temps from standard input and outputs in a format suitable for the monitoring tool we currently use. The code could be neither beautiful nor elegant, but I wrote it in a very short time. Feel free to improve it and publish your improvements on PM!

Enough talking, here is the code!

#!/usr/local/bin/perl # $Id:,v 1.1 2005/01/04 15:32:50 bronto Exp bronto $ use strict ; use warnings ; my %locations ; my %levels = ( OK => 0, LOW_WARN => 10, HIGH_WARN => 10, LOW_CRIT => 20, HIGH_CRIT => 20, OVERLIMIT => 100, INVALID => 500, ) ; while (<>) { my ($location,$device,$sensor,$value,$age,$status) = /^(\S+ at \S+)\s+(\S+)\s+(\S+) Temp\s+(\S+)\s+C\s+(\S+)\s+sec\s+(\ +S+)/ ; unless (defined $location or defined $value or defined $status) { next ; } unless (exists $locations{$location}) { $locations{$location}{min} = $value ; $locations{$location}{max} = $value ; $locations{$location}{status} = $status ; } unless ($status eq 'INVALID') { $locations{$location}{min} = $value if $locations{$location}{min} > $value ; $locations{$location}{max} = $value if $locations{$location}{max} < $value ; } if ($levels{$status} > $levels{$locations{$location}{status}}) { $locations{$location}{status} = $status ; } } print "TABLE temperature\nSTART_SAMPLE_PERIOD\n" ; my @samples ; foreach my $loc (sort keys %locations) { push @samples,"location=$loc\nmin=$locations{$loc}{min}\nmax=$locati +ons{$loc}{max}\nstatus=$locations{$loc}{status}\n" ; } print join ("NEXT_SAMPLE\n",@samples),"END_SAMPLE_PERIOD\nEND_TABLE\nS +LEEP\n" ;


In theory, there is no difference between theory and practice. In practice, there is.