| 1 | #!/usr/bin/perl -w
|
|---|
| 2 | # HElog_smart: Write smartctl -a to file name built from Model.Serial.log HE: 18.2.2011
|
|---|
| 3 | # Copyright c 2010 according to GPL v.2 by H.Ellenberger, CH-3360 Herzogenbuchsee.
|
|---|
| 4 |
|
|---|
| 5 | use strict;
|
|---|
| 6 | use POSIX qw(strftime);
|
|---|
| 7 |
|
|---|
| 8 | my $log_dir = "/root/SMART"; # Files are created there
|
|---|
| 9 |
|
|---|
| 10 | sub trm { # Replace spaces, remove \n
|
|---|
| 11 | my $txt = shift; $txt =~ s/ /_/g; $txt =~ s/\n//g;
|
|---|
| 12 | return $txt
|
|---|
| 13 | }
|
|---|
| 14 |
|
|---|
| 15 | sub ck_one{ # Check one drive given by @_
|
|---|
| 16 | my $cmd = "smartctl -a @_";
|
|---|
| 17 | my @res = `$cmd`;
|
|---|
| 18 | my $stat = $?; $cmd="'$cmd' -> ";
|
|---|
| 19 | if ($stat) {print "$cmd ERROR= $stat\n"; return;}
|
|---|
| 20 | my $fnam;
|
|---|
| 21 | foreach (@res) {
|
|---|
| 22 | my $line = $_; # Split lines returned by smartctl
|
|---|
| 23 | if ($line =~ s/Device Model: //){
|
|---|
| 24 | $fnam = trm $line; # Extract Model
|
|---|
| 25 | }elsif ($line =~ s/Serial Number: //){
|
|---|
| 26 | $line = trm $line; # Extract Serial no.
|
|---|
| 27 | $fnam = "$log_dir/$fnam.$line.log"; # Build path/name
|
|---|
| 28 | }
|
|---|
| 29 | }
|
|---|
| 30 | my $dat = strftime("%d.%m.%Y-%H:%M",localtime(time()));
|
|---|
| 31 | my $health = `smartctl -H @_`; # Get health info
|
|---|
| 32 | $stat = $?;
|
|---|
| 33 |
|
|---|
| 34 | my $FIL; open($FIL, ">>", $fnam) or die "Error creating $fnam\n"; # Open result file and append
|
|---|
| 35 | print $FIL "**** $dat ***********************************************************\n";
|
|---|
| 36 | if ($stat) {
|
|---|
| 37 | print $FIL "Error $stat checking health of @_\n";
|
|---|
| 38 | $health = "DEFECTIVE";
|
|---|
| 39 | } else {
|
|---|
| 40 | if ($health =~ /PASSED/) {$health = "Health OK" }
|
|---|
| 41 | else {$health = "ERROR: $health"; }
|
|---|
| 42 | }
|
|---|
| 43 | print $FIL "$health\n";
|
|---|
| 44 | print $FIL @res;
|
|---|
| 45 | close $FIL;
|
|---|
| 46 | print "$cmd $health\n"; # Show progress
|
|---|
| 47 | }
|
|---|
| 48 |
|
|---|
| 49 | print "$0 v=18.2.2011 \n";
|
|---|
| 50 | my @res = `ls -l /dev/disk/by-id/scsi-*`; # Get only SCSI/SATA
|
|---|
| 51 | my $stat = $?;
|
|---|
| 52 | if ($stat){print "ERROR $stat: $!\n"; exit 1;}
|
|---|
| 53 | foreach (@res){
|
|---|
| 54 | my $line = $_;
|
|---|
| 55 | if (! ($line =~ /part/)){ # Skip those of partitions
|
|---|
| 56 | if ($line =~ /([^->])-> ..\/..\/(.+)/ ) { # Get drive only like 'sda'
|
|---|
| 57 | ck_one "/dev/$2";
|
|---|
| 58 | }
|
|---|
| 59 | }
|
|---|
| 60 | }
|
|---|
| 61 | print "Done.\n";
|
|---|
| 62 | # --- eof ---
|
|---|