]> git.ipfire.org Git - ipfire-2.x.git/blob - src/scripts/hddshutdown
HinzugefĆ¼gt:
[ipfire-2.x.git] / src / scripts / hddshutdown
1 #!/usr/bin/perl
2 #
3 # IPFire HDD Shutdown
4 #
5 # This code is distributed under the terms of the GPL
6 #
7 # 13.05.2006 Arne Fitzenreiter
8 #
9
10 # begin
11
12 sub shutdown_hdd {
13
14 my $hdd = $_[0];
15 my $hdddev = "/dev/$_[0]";
16
17 my ($dev, $ino, $mode, $nlink, $uid, $gid, $rdev, $size,
18 $atime, $mtime, $ctime, $blksize, $blocks) = stat($hdddev);
19
20 my $major = $rdev >> 8;
21 my $minor = ($rdev & 0xFF) >> 6;
22
23 open STAT, "/tmp/hddshutdown-stat";
24 my @diskstat = <STAT>;
25 close (STAT);
26 foreach my $line (@diskstat)
27 {
28 chomp ($line);
29 my @temp = split(/\:\ /,$line);
30 if ($temp[1]) {
31 my @devicestat = split(/\ /,$temp[1]);
32 foreach my $stats (@devicestat)
33 {
34 chomp ($stats);
35 my @fields = split(/\((\d+),(\d+)\):\((\d+),(\d+),(\d+),(\d+),(\d+)/,$stats);
36 if ($major eq $fields[1] and $minor eq $fields[2])
37 {
38 $lastreadwritereq = $fields[3];
39 }
40 }
41 }
42 }
43
44 open STAT, "/proc/stat";
45 my @diskstat = <STAT>;
46 close (STAT);
47 foreach my $line (@diskstat)
48 {
49 chomp ($line);
50 my @temp = split(/\:\ /,$line);
51 if ($temp[1]) {
52 my @devicestat = split(/\ /,$temp[1]);
53 foreach my $stats (@devicestat)
54 {
55 chomp ($stats);
56 my @fields = split(/\((\d+),(\d+)\):\((\d+),(\d+),(\d+),(\d+),(\d+)/,$stats);
57 if ($major eq $fields[1] and $minor eq $fields[2])
58 {
59 $readwritereq = $fields[3];
60 }
61 }
62 }
63 }
64
65 if (! -e "/tmp/hddshutdown-$hdd" ) { system("echo 0 > /tmp/hddshutdown-$hdd"); }
66
67 if ($readwritereq==$lastreadwritereq) {
68 open STAT,"/tmp/hddshutdown-$hdd";
69 my $lastsleepstate = <STAT>;
70 close (STAT);
71 if (! ($lastsleepstate==$readwritereq)) {
72 system("hdparm -y $hdddev");
73 system("logger -t ipcop Shuting down $hdddev !");
74 system("echo $readwritereq > /tmp/hddshutdown-$hdd");
75 }
76 }
77
78 }
79
80 if ( -e "/tmp/hddshutdown-stat" ) {
81 if (open STAT,"/dev/hda") {
82 close STAT;
83 shutdown_hdd("hda");
84 }
85 if (open STAT,"/dev/hdb") {
86 close STAT;
87 shutdown_hdd("hdb");
88 }
89 if (open STAT,"/dev/hdc") {
90 close STAT;
91 shutdown_hdd("hdc");
92 }
93 if (open STAT,"/dev/hdd") {
94 close STAT;
95 shutdown_hdd("hdd");
96 }
97 if (open STAT,"/dev/hde") {
98 close STAT;
99 shutdown_hdd("hde");
100 }
101 if (open STAT,"/dev/hdf") {
102 close STAT;
103 shutdown_hdd("hdf");
104 }
105 if (open STAT,"/dev/hdg") {
106 close STAT;
107 shutdown_hdd("hdg");
108 }
109 if (open STAT,"/dev/hdh") {
110 close STAT;
111 shutdown_hdd("hdh");
112 }
113
114 }
115
116 system("cp /proc/stat /tmp/hddshutdown-stat");
117 # end