CUFP bronto <p>Same problem [id://407340|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 <code>showenvironment -p temps</code> 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.</p> <p>But wait, there is more <tt>:-)</tt> <code>showenvironment</code> 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.</p> <p>So I came out with the following script, that does the job. <strike>Luckily</strike> 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!</p> <p>The code reads the output of <code>showenvironment -p temps</code> 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. <em>Feel free to improve it and publish your improvements on PM!</em></p> <p>Enough talking, here is the code!</p> <readmore> <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=$locations{$loc}{max}\nstatus=$locations{$loc}{status}\n" ; } print join ("NEXT_SAMPLE\n",@samples),"END_SAMPLE_PERIOD\nEND_TABLE\nSLEEP\n" ; </code> </readmore> <!-- Node text goes above. Div tags should contain sig only --> <div class="pmsig"><div class="pmsig-175325"> <p>Ciao!<br><tt>--bronto</tt></p> <hr> <blockquote><small><i>In theory, there is no difference between theory and practice. In practice, there is.</i></small></blockquote> </div></div>