X-Git-Url: http://git.ipfire.org/?a=blobdiff_plain;f=src%2Fscripts%2Fhddshutdown;h=056adf37545d03ded376d95a7b601c028c06ee0d;hb=5384809bf8c50e5e06e7b001dd92d584ab0cce2d;hp=ebd525710711bfe1d45b2546b0c95828cefdd503;hpb=6c666a3b18d7be66ac62c3cfef389745a6eed0a4;p=ipfire-2.x.git diff --git a/src/scripts/hddshutdown b/src/scripts/hddshutdown index ebd5257107..056adf3754 100644 --- a/src/scripts/hddshutdown +++ b/src/scripts/hddshutdown @@ -1,117 +1,61 @@ #!/usr/bin/perl # -# IPFire HDD Shutdown +# IPFire HDD Shutdown state reader # # This code is distributed under the terms of the GPL # -# 13.05.2006 Arne Fitzenreiter -# +# 18.09.2007 Maniacikarus - IPFire.org - maniacikarus@ipfire.org +# 22.09.2007 Arne_F - fitzenreiter.de - arne@fitzenreiter.de # begin -sub shutdown_hdd { - - my $hdd = $_[0]; - my $hdddev = "/dev/$_[0]"; - - my ($dev, $ino, $mode, $nlink, $uid, $gid, $rdev, $size, - $atime, $mtime, $ctime, $blksize, $blocks) = stat($hdddev); - - my $major = $rdev >> 8; - my $minor = ($rdev & 0xFF) >> 6; - - open STAT, "/tmp/hddshutdown-stat"; - my @diskstat = ; - close (STAT); - foreach my $line (@diskstat) - { - chomp ($line); - my @temp = split(/\:\ /,$line); - if ($temp[1]) { - my @devicestat = split(/\ /,$temp[1]); - foreach my $stats (@devicestat) - { - chomp ($stats); - my @fields = split(/\((\d+),(\d+)\):\((\d+),(\d+),(\d+),(\d+),(\d+)/,$stats); - if ($major eq $fields[1] and $minor eq $fields[2]) - { - $lastreadwritereq = $fields[3]; - } - } - } +my @devices = `kudzu -qps -c HD | grep device: | cut -d" " -f2 | sort | uniq`; +my $diskstats = ""; +my $newdiskstats = ""; +my $debug = 1; +my $status = ""; + +if ($debug){print "### Searching for available Disks ###\n";} + +foreach (@devices){ + chomp $_; + my @array = split(/\//,$_); + $diskstats = `cat /tmp/hddstats-$array[$#array]`; + chomp $diskstats; + $newdiskstats = `iostat -d -t $_ | tail -2 | head -1 | awk '{ print \$5","\$6}'`; + chomp $newdiskstats; + $status = `hdparm -C /dev/$_ | tail -1 | cut -d: -f2`; + chomp $status; + + if ($debug){print "Device ".$_." IDE Power status:".$status."\n";} + if (-e "/tmp/hddshutdown-$array[$#array]" && $status !~/standby/) + { + if ($debug){print "Remove wrong standby marking\n";} + if ( -e "/tmp/hddshutdown-$array[$#array]" ) { system("unlink /tmp/hddshutdown-$array[$#array]"); } + } + + if ($debug){print "Device ".$_." has ".$newdiskstats." write and read Requests, was ".$diskstats." at last run.\n";} + if ($diskstats eq $newdiskstats && (! -e "/tmp/hddshutdown-$array[$#array]") ) + { + if ($debug){print "Setting Device ".$_." to standby ... ";} + $status = `hdparm -y /dev/$_ 2>&1`; + chomp $status; + if ($status !~/Invalid/) + { + if ($debug){print "OK\n";} + system("touch /tmp/hddshutdown-$array[$#array]"); } - - open STAT, "/proc/stat"; - my @diskstat = ; - close (STAT); - foreach my $line (@diskstat) + else { - chomp ($line); - my @temp = split(/\:\ /,$line); - if ($temp[1]) { - my @devicestat = split(/\ /,$temp[1]); - foreach my $stats (@devicestat) - { - chomp ($stats); - my @fields = split(/\((\d+),(\d+)\):\((\d+),(\d+),(\d+),(\d+),(\d+)/,$stats); - if ($major eq $fields[1] and $minor eq $fields[2]) - { - $readwritereq = $fields[3]; - } - } - } + if ($debug){print "FAIL\n";} } - - if (! -e "/tmp/hddshutdown-$hdd" ) { system("echo 0 > /tmp/hddshutdown-$hdd"); } - - if ($readwritereq==$lastreadwritereq) { - open STAT,"/tmp/hddshutdown-$hdd"; - my $lastsleepstate = ; - close (STAT); - if (! ($lastsleepstate==$readwritereq)) { - system("hdparm -y $hdddev"); - system("logger -t ipcop Shuting down $hdddev !"); - system("echo $readwritereq > /tmp/hddshutdown-$hdd"); - } - } - -} - -if ( -e "/tmp/hddshutdown-stat" ) { - if (open STAT,"/dev/hda") { - close STAT; - shutdown_hdd("hda"); - } - if (open STAT,"/dev/hdb") { - close STAT; - shutdown_hdd("hdb"); - } - if (open STAT,"/dev/hdc") { - close STAT; - shutdown_hdd("hdc"); - } - if (open STAT,"/dev/hdd") { - close STAT; - shutdown_hdd("hdd"); - } - if (open STAT,"/dev/hde") { - close STAT; - shutdown_hdd("hde"); - } - if (open STAT,"/dev/hdf") { - close STAT; - shutdown_hdd("hdf"); - } - if (open STAT,"/dev/hdg") { - close STAT; - shutdown_hdd("hdg"); - } - if (open STAT,"/dev/hdh") { - close STAT; - shutdown_hdd("hdh"); - } - + } + if ($diskstats ne $newdiskstats) + { + if ($debug){print "Device ".$_." is active.\n";} + if ( -e "/tmp/hddshutdown-$array[$#array]" ) { system("unlink /tmp/hddshutdown-$array[$#array]"); } + } + system("echo $newdiskstats > /tmp/hddstats-$array[$#array]"); } -system("cp /proc/stat /tmp/hddshutdown-stat"); # end