#!/usr/bin/perl ############################################################################ # # # This file is part of the IPCop Firewall. # # # # IPCop is free software; you can redistribute it and/or modify # # it under the terms of the GNU General Public License as published by # # the Free Software Foundation; either version 2 of the License, or # # (at your option) any later version. # # # # IPCop is distributed in the hope that it will be useful, # # but WITHOUT ANY WARRANTY; without even the implied warranty of # # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # # GNU General Public License for more details. # # # # You should have received a copy of the GNU General Public License # # along with IPCop; if not, write to the Free Software # # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # # # Copyright (C) 2004-01-19 Mark Wormgoor . # # # ############################################################################ use strict; #use warnings; use RRDs; require "/var/ipfire/general-functions.pl"; require "${General::swroot}/lang.pl"; # Settings $ENV{PATH}="/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin"; my $temp = ''; my $rrdlog = '/var/log/rrd'; my $ERROR; my $path_smartctl = "/usr/sbin/smartctl"; my %color = (); my %mainsettings = (); &General::readhash("${General::swroot}/main/settings", \%mainsettings); &General::readhash("/srv/web/ipfire/html/themes/".$mainsettings{'THEME'}."/include/colors.txt", \%color); sub updatehdddata { my $disk = $_[0]; my $standby; my @array = split(/\//,$disk); if ( ! -e "$rrdlog/hddshutdown-".$array[$#array].".rrd"){ # database did not exist -> create RRDs::create ("$rrdlog/hddshutdown-".$array[$#array].".rrd", "--step=300", "DS:standby:GAUGE:600:0:1", "RRA:AVERAGE:0.5:1:576", "RRA:AVERAGE:0.5:6:672", "RRA:AVERAGE:0.5:24:732", "RRA:AVERAGE:0.5:144:1460"); $ERROR = RRDs::error; print "Error in RRD::create for hddshutdown-".$array[$#array].": $ERROR\n" if $ERROR; } if (-e "/tmp/hddshutdown-".$array[$#array]) {$standby = 1;} else {$standby = 0;} RRDs::update ("$rrdlog/hddshutdown-".$array[$#array].".rrd", "-t", "standby", "N:$standby"); $ERROR = RRDs::error; print "Error in RRD::update for hddshutdown-".$array[$#array].": $ERROR\n" if $ERROR; if ( ! -e "$rrdlog/hddtemp-".$array[$#array].".rrd"){ # database did not exist -> create RRDs::create ("$rrdlog/hddtemp-".$array[$#array].".rrd", "--step=300", "DS:temperature:GAUGE:600:0:100", "RRA:AVERAGE:0.5:1:576", "RRA:AVERAGE:0.5:6:672", "RRA:AVERAGE:0.5:24:732", "RRA:AVERAGE:0.5:144:1460"); $ERROR = RRDs::error; print "Error in RRD::create for hdd-".$array[$#array].": $ERROR\n" if $ERROR; } # Temperaturlesen w�rde die Platte aufwecken!!! if (!$standby){ $temp = 0; my $smart_output = ''; system("$path_smartctl -iHA -d ata /dev/$disk > /var/log/smartctl_out_hddtemp-$disk"); if ( -e "/var/log/smartctl_out_hddtemp-".$array[$#array] ){ my $hdd_output = `cat /var/log/smartctl_out_hddtemp-$array[$#array] | grep Temperature_`; my @t = split(/\s+/,$hdd_output); $temp = $t[9]; }else{$temp = 0;} print "Temperature for ".$array[$#array]."->".$temp."<-\n"; # Nur ins RDD wenn nicht 0 (sonst klappt die min Anzeige nicht) if ($temp){ RRDs::update ("$rrdlog/hddtemp-".$array[$#array].".rrd", "-t", "temperature", "N:$temp"); $ERROR = RRDs::error; print "Error in RRD::update for hdd-".$array[$#array].": $ERROR\n" if $ERROR; } } } ## Update ipac logs #system ('/usr/sbin/fetchipac'); my @disks = `kudzu -qps -c HD | grep device: | cut -d" " -f2 | sort | uniq`; system("unlink /tmp/hddstatus && touch /tmp/hddstatus"); foreach (@disks){ my $disk = $_; chomp $disk; print "Working on disk ".$disk.".\n"; my $status = ""; my $diskstats = ""; my $newdiskstats = ""; my @array = split(/\//,$disk); $diskstats = `cat /tmp/hddstats-$array[$#array]`; chomp $diskstats; my $newdiskstats = `/usr/bin/iostat -d -t $disk | tail -2 | head -1 | awk '{ print \$5","\$6}'`; chomp $newdiskstats; my $status = `hdparm -C /dev/$disk | tail -1 | cut -d: -f2`; chomp $status; if ($status !~/standby/ || $diskstats ne $newdiskstats){ if (-e "/tmp/hddshutdown-".$array[$#array]){system("unlink /tmp/hddshutdown-".$array[$#array]);} } if (-e "/tmp/hddshutdown-".$array[$#array]){$status = " standby\n";} else{$status = " active\n";} open(DATEI, ">>/tmp/hddstatus") || die "Datei nicht gefunden"; print DATEI $disk."-".$status; close(DATEI); updatehdddata($disk); }