|
Packit |
57988d |
|
|
Packit |
57988d |
##########################################################################
|
|
Packit |
57988d |
# $Id$
|
|
Packit |
57988d |
##########################################################################
|
|
Packit |
57988d |
|
|
Packit |
57988d |
#######################################################
|
|
Packit |
57988d |
## Copyright (c) 2008 Jaco Botha <jaco_botha@hotmail.com>
|
|
Packit |
57988d |
## Covered under the included MIT/X-Consortium License:
|
|
Packit |
57988d |
## http://www.opensource.org/licenses/mit-license.php
|
|
Packit |
57988d |
## All modifications and contributions by other persons to
|
|
Packit |
57988d |
## this script are assumed to have been donated to the
|
|
Packit |
57988d |
## Logwatch project and thus assume the above copyright
|
|
Packit |
57988d |
## and licensing terms. If you want to make contributions
|
|
Packit |
57988d |
## under your own copyright or a different license this
|
|
Packit |
57988d |
## must be explicitly stated in the contribution an the
|
|
Packit |
57988d |
## Logwatch project reserves the right to not accept such
|
|
Packit |
57988d |
## contributions. If you have made significant
|
|
Packit |
57988d |
## contributions to this script and want to claim
|
|
Packit |
57988d |
## copyright please contact logwatch-devel@lists.sourceforge.net.
|
|
Packit |
57988d |
#########################################################
|
|
Packit |
57988d |
|
|
Packit |
57988d |
use strict;
|
|
Packit |
57988d |
|
|
Packit |
57988d |
my ($Device, $Msg, $Test);
|
|
Packit |
57988d |
my %ParamChanges = ();
|
|
Packit |
57988d |
my %TempChanges = ();
|
|
Packit |
57988d |
my %TempLimit = ();
|
|
Packit |
57988d |
my %TempCritLimit = ();
|
|
Packit |
57988d |
my %Pendsectors = ();
|
|
Packit |
57988d |
my %NumPendsectors = ();
|
|
Packit |
57988d |
my %Offsectors = ();
|
|
Packit |
57988d |
my %NumOffsectors = ();
|
|
Packit |
57988d |
my %Warnings = ();
|
|
Packit |
57988d |
my %UnableToReg = ();
|
|
Packit |
57988d |
my $ShutdownFailed = 0;
|
|
Packit |
57988d |
my $StartupFailed = 0;
|
|
Packit |
57988d |
my %NotInDatabase = ();
|
|
Packit |
57988d |
my %CantMonitor = ();
|
|
Packit |
57988d |
my $UnableToMonitor = 0;
|
|
Packit |
57988d |
my %DriveTest = ();
|
|
Packit |
57988d |
my %Failed = ();
|
|
Packit |
57988d |
my %OtherList = ();
|
|
Packit |
57988d |
my $DLine = 0;
|
|
Packit |
57988d |
my %UnavailableDev = ();
|
|
Packit |
57988d |
my %SataDisk = ();
|
|
Packit |
57988d |
my %CheckFailed = ();
|
|
Packit |
57988d |
my %Monitoring = ();
|
|
Packit |
57988d |
my %DeviceInfo = ();
|
|
Packit |
57988d |
|
|
Packit |
57988d |
my $Detail = $ENV{'LOGWATCH_DETAIL_LEVEL'} || 0;
|
|
Packit |
57988d |
my $IgnoreUnmatched = $ENV{'smartd_ignore_unmatched'} || 0;
|
|
Packit |
57988d |
|
|
Packit |
57988d |
while (defined(my $ThisLine = <STDIN>)) {
|
|
Packit |
57988d |
chomp($ThisLine);
|
|
Packit |
57988d |
if ( ($Device,$Msg) = ($ThisLine =~ /^Device: ([^,]+), No such device(?: or address)?, open\(\) failed/ )) {
|
|
Packit |
57988d |
# ignore
|
|
Packit |
57988d |
} elsif ( ($Device,$Msg) = ($ThisLine =~ /^Device: ([^,]+), open\(\) failed: No such device(?: or address)?/ )) {
|
|
Packit |
57988d |
# ignore
|
|
Packit |
57988d |
} elsif ( ($Device,$Msg) = ($ThisLine =~ /^Device: ([^,]+), found in smartd database./ )) {
|
|
Packit |
57988d |
# ignore
|
|
Packit |
57988d |
} elsif ( ($Device,$Msg) = ($ThisLine =~ /^Device: ([^,]+), not found in smartd database./ )) {
|
|
Packit |
57988d |
# ignore
|
|
Packit |
57988d |
} elsif ( ($Device,$Msg) = ($ThisLine =~ /^Device: ([^,]+), opened/)) {
|
|
Packit |
57988d |
# ignore
|
|
Packit |
57988d |
} elsif ( ($Device,$Msg) = ($ThisLine =~ /^Device: ([^,]+), appears to lack SMART*/ )) {
|
|
Packit |
57988d |
# ignore
|
|
Packit |
57988d |
} elsif ( ($Device) = ($ThisLine =~ /^Device: ([^,]+), enabled autosave \(cleared GLTSD bit\)\./ )) {
|
|
Packit |
57988d |
# ignore
|
|
Packit |
57988d |
} elsif ( ($Device) = ($ThisLine =~ /^Device: ([^,]+), enabled SMART Attribute Autosave/ )) {
|
|
Packit |
57988d |
# ignore
|
|
Packit |
57988d |
} elsif ( ($Device) = ($ThisLine =~ /^Device: ([^,]+), enabled SMART Automatic Offline Testing/ )) {
|
|
Packit |
57988d |
# ignore
|
|
Packit |
57988d |
} elsif ( ($Device) = ($ThisLine =~ /^Device: ([^,]+), Self-Test Log error count increased from \d+ to \d+/ )) {
|
|
Packit |
57988d |
# ignore
|
|
Packit |
57988d |
} elsif ( ($Device,$Msg) = ($ThisLine =~ /^Device: ([^,]+), new Self-Test Log error at hour timestamp \d+/ )) {
|
|
Packit |
57988d |
# ignore
|
|
Packit |
57988d |
} elsif ( ($Device,$Msg) = ($ThisLine =~ /^Device: ([^,]+), same Attribute has different ID numbers:/ )) {
|
|
Packit |
57988d |
# ignore
|
|
Packit |
57988d |
} elsif ( ($Device,$Msg) = ($ThisLine =~ /^Num *Test_Description *Status *Remaining *LifeTime/ )) {
|
|
Packit |
57988d |
# ignore
|
|
Packit |
57988d |
} elsif ( ($Device,$Msg) = ($ThisLine =~ /^# *[0-9]+ Short offline *Completed:/ )) {
|
|
Packit |
57988d |
# ignore
|
|
Packit |
57988d |
} elsif ( ($Device,$Msg) = ($ThisLine =~ /^# *[0-9]+ Extended offline *Completed:/ )) {
|
|
Packit |
57988d |
# ignore
|
|
Packit |
57988d |
} elsif ( ($Device,$Msg) = ($ThisLine =~ /^# *[0-9]+ Offline *Fatal or unknown error/ )) {
|
|
Packit |
57988d |
# ignore
|
|
Packit |
57988d |
} elsif ( ($Device) = ($ThisLine =~ /^Device: ([^,]+), not capable of SMART (Health Status |self-)check/ )) {
|
|
Packit |
57988d |
# ignore
|
|
Packit |
57988d |
} elsif ( ($Device) = ($ThisLine =~ /^Device: ([^,]+), is in STANDBY mode, skipping checks/ )) {
|
|
Packit |
57988d |
# ignore
|
|
Packit |
57988d |
} elsif ( ($Device) = ($ThisLine =~ /^Device: ([^,]+), self-test in progress, [0-9]+% remaining/ )) {
|
|
Packit |
57988d |
# ignore
|
|
Packit |
57988d |
} elsif ( ($Device) = ($ThisLine =~ /^Device: ([^,]+), previous self-test completed without error/ )) {
|
|
Packit |
57988d |
# ignore
|
|
Packit |
57988d |
} elsif ( ($Device) = ($ThisLine =~ /^Device: ([^,]+), type changed from \'\w+\' to \'\w+\'/ )) {
|
|
Packit |
57988d |
# ignore
|
|
Packit |
57988d |
} elsif ( ($Device) = ($ThisLine =~ /^Device: ([^,]+), state (?:read from|written to)/ )) {
|
|
Packit |
57988d |
# ignore
|
|
Packit |
57988d |
} elsif ( ($Device) = ($ThisLine =~ /^Device: ([^,]+), CHECK POWER STATUS spins up disk/ )) {
|
|
Packit |
57988d |
# ignore
|
|
Packit |
57988d |
} elsif ( ($Device) = ($ThisLine =~ /^Device: ([^,]+), STANDBY mode ignored due to reached limit of skipped checks/ )) {
|
|
Packit |
57988d |
# ignore
|
|
Packit |
57988d |
} elsif ( ($Device) = ($ThisLine =~ /^Device: ([^,]+), is back in ACTIVE or IDLE mode, resuming checks/ )) {
|
|
Packit |
57988d |
# ignore
|
|
Packit |
57988d |
} elsif ( $ThisLine =~ /^file \/var\/run\/smartd.pid written containing PID [0-9]+/ ) {
|
|
Packit |
57988d |
# ignore
|
|
Packit |
57988d |
} elsif ( ($Device,$Msg) = ($ThisLine =~ /^ *$/ )) {
|
|
Packit |
57988d |
# ignore empty lines
|
|
Packit |
57988d |
} elsif ( ($ThisLine =~ /^smartd version/)
|
|
Packit |
57988d |
|| ($ThisLine =~ /^smartd [0-9.]+ [0-9-]+ r[0-9]+ \[.*\]/)
|
|
Packit |
57988d |
|| ($ThisLine =~ /^Home page/)
|
|
Packit |
57988d |
|| ($ThisLine =~ /Copyright \(C\) [0-9-]+(?: by|,) Bruce Allen/)
|
|
Packit |
57988d |
|| ($ThisLine =~ /configuration file/i)
|
|
Packit |
57988d |
|| ($ThisLine =~ /\[trip Temperature is \d+ Celsius\]/)
|
|
Packit |
57988d |
|| ($ThisLine =~ /^Monitoring/)
|
|
Packit |
57988d |
|| ($ThisLine =~ /smartd received signal 15: Terminated/)
|
|
Packit |
57988d |
|| ($ThisLine =~ /smartd is exiting \(exit status 0\)/)
|
|
Packit |
57988d |
|| ($ThisLine =~ /smartd has fork/)
|
|
Packit |
57988d |
|| ($ThisLine =~ /smartd (startup|shutdown) succeeded/)
|
|
Packit |
57988d |
|| ($ThisLine =~ /Unable to register device (.*) \(no Directive -d removable\). Exiting/)
|
|
Packit |
57988d |
|| ($ThisLine =~ /Device (.*), SATA disks accessed via libata are not currently supported by smartmontools./)
|
|
Packit |
57988d |
|| ($ThisLine =~ /Device: (.*), IE \(SMART\) not enabled, skip device/)
|
|
Packit |
57988d |
|| ($ThisLine =~ /^Try '.*' to turn on SMART features/)
|
|
Packit |
57988d |
|| ($ThisLine =~ /Device: (.*), Bad IEC (SMART) mode page, err=-5, skip device/)
|
|
Packit |
57988d |
|| ($ThisLine =~ /Drive: DEVICESCAN, implied '-a' Directive on line [\d]+ of file/)
|
|
Packit |
57988d |
|| ($ThisLine =~ /packet devices \[this device CD\/DVD\] not SMART capable/)
|
|
Packit |
57988d |
|| ($ThisLine =~ /System clock time adjusted to the past/) )
|
|
Packit |
57988d |
{
|
|
Packit |
57988d |
# ignore
|
|
Packit |
57988d |
|
|
Packit |
57988d |
} elsif ( ($Device,$Msg) = ($ThisLine =~ /^Device: ([^,]+), is SMART capable. Adding to "monitor" list./ )) {
|
|
Packit |
57988d |
$Monitoring{$Device} = 1;
|
|
Packit |
57988d |
} elsif ( ($Device,$Msg) = ($ThisLine =~ /^Device: ([^,]+), ([^,]+, S\/N:[^,]+,.* FW:.*)/ )) {
|
|
Packit |
57988d |
$DeviceInfo{$Device} = $Msg;
|
|
Packit |
57988d |
} elsif ( ($Device,$Msg) = ($ThisLine =~ /^Device: ([^,]+), (\[[^,]+, lu id: .*)/ )) {
|
|
Packit |
57988d |
$DeviceInfo{$Device} = $Msg;
|
|
Packit |
57988d |
# } elsif ( ($Device,$Msg) = ($ThisLine =~ /^Device: ([^,]+), (.*)$/)) {
|
|
Packit |
57988d |
# $ParamChanges{$Device}{$Msg}++;
|
|
Packit |
57988d |
} elsif ( ($Device) = ($ThisLine =~ /^Device: ([^,]+), not found in smartd database./ )) {
|
|
Packit |
57988d |
$NotInDatabase{$Device}++;
|
|
Packit |
57988d |
} elsif ( my ($Device,$AttribType,$Code,$Name,undef,undef,undef,$RawVal) = ($ThisLine =~ /^Device: ([^,]+), SMART ([A-Za-z]+) Attribute: ([0-9]+) (Temperature_Celsius) changed from ([0-9]+) (\[Raw [0-9]+(?: \([0-9]+\s[0-9]+\s[0-9]+\s[0-9]+(?:\s[0-9])?\))?\]) to ([0-9]+) \[Raw ([0-9]+)(?: \([0-9]+\s[0-9]+\s[0-9]+\s[0-9]+(?:\s[0-9])?\))?\]/)) {
|
|
Packit |
57988d |
push @{$TempChanges{$Device}}, $RawVal;
|
|
Packit |
57988d |
# smartd reports temperature changes this way only for SCSI disks
|
|
Packit |
57988d |
} elsif ( my ($Device,$AttribType,$Code,$Name,undef,undef,$NewVal) = ($ThisLine =~ /^Device: ([^,]+), SMART ([A-Za-z]+) Attribute: ([0-9]+) ([A-Za-z_]+) changed from ([0-9]+) (\[Raw [0-9]+\] )?to ([0-9]+)/)) {
|
|
Packit |
57988d |
push (@{$ParamChanges{$Device}{"$AttribType: $Name ($Code)"}}, $NewVal);
|
|
Packit |
57988d |
} elsif ( my ($Device,$Name,undef,$NewVal) = ($ThisLine =~ /^Device: ([^,]+), (.*) increased from ([0-9]+) to ([0-9]+)/) ) {
|
|
Packit |
57988d |
push (@{$ParamChanges{$Device}{"information: $Name"}}, $NewVal);
|
|
Packit |
57988d |
} elsif ( my ($Device,$NewVal) = ($ThisLine =~ /^Device: ([^,]+), initial Temperature is (\d+) Celsius/)) {
|
|
Packit |
57988d |
push @{$TempChanges{$Device}},$NewVal;
|
|
Packit |
57988d |
} elsif ( my ($Device,$Limit) = ($ThisLine =~ /^Device: ([^,]+), Temperature \d+ Celsius reached limit of (\d+) Celsius/)) {
|
|
Packit |
57988d |
# Device: /dev/sda, Temperature 37 Celsius reached limit of 10 Celsius (Min/Max 37/37)
|
|
Packit |
57988d |
$TempLimit{"$Device,$Limit"}++;
|
|
Packit |
57988d |
} elsif ( my ($Device,$Limit) = ($ThisLine =~ /^Device: ([^,]+), Temperature \d+ Celsius reached critical limit of (\d+) Celsius/)) {
|
|
Packit |
57988d |
# Device: /dev/sda, Temperature 38 Celsius reached critical limit of 15 Celsius (Min/Max 38!/39)
|
|
Packit |
57988d |
$TempCritLimit{"$Device,$Limit"}++;
|
|
Packit |
57988d |
} elsif ( my ($Device,$NewVal) = ($ThisLine =~ /^Device: ([^,]+), Temperature changed [-+]?\d+ Celsius to (\d+) Celsius/)) {
|
|
Packit |
57988d |
push @{$TempChanges{$Device}},$NewVal;
|
|
Packit |
57988d |
} elsif ( my ($Device, $Num) = ($ThisLine =~ /^Device: ([^,]+), (\d+) Currently unreadable \(pending\) sectors/) ) {
|
|
Packit |
57988d |
$Pendsectors{$Device}++;
|
|
Packit |
57988d |
$NumPendsectors{$Device} = $Num;
|
|
Packit |
57988d |
} elsif ( my ($Device, $Num) = ($ThisLine =~ /^Device: ([^,]+), (\d+) Offline uncorrectable sectors/) ) {
|
|
Packit |
57988d |
$Offsectors{$Device}++;
|
|
Packit |
57988d |
$NumOffsectors{$Device} = $Num;
|
|
Packit |
57988d |
} elsif ( my ($Device,$TestType) = ($ThisLine =~ /^Device: ([^,]+), starting scheduled ((?:Short|Long|Conveyance|Selective) Self-|Offline Immediate )Test/) ) {
|
|
Packit |
57988d |
$DriveTest{$Device}{$TestType}++;
|
|
Packit |
57988d |
} elsif ( my ($Device,$AttribType,$Code,$Name) = ($ThisLine =~ /^Device: ([^,]+), Failed SMART ([A-Za-z]+) Attribute: ([0-9]+) ([A-Za-z_]+)/)) {
|
|
Packit |
57988d |
$Failed{$Device}{"$AttribType attribute: $Name ($Code)"}++;
|
|
Packit |
57988d |
} elsif ( my ($Device, $Text) = ($ThisLine =~ /^Device: ([^,]+), failed (.*)$/) ) {
|
|
Packit |
57988d |
$Failed{$Device}{"$Text"}++;
|
|
Packit |
57988d |
} elsif ( ( $ThisLine =~ /warning/i ) ) {
|
|
Packit |
57988d |
$Warnings{$ThisLine}++;
|
|
Packit |
57988d |
} elsif ( my ($Device, $Text) = ( $ThisLine =~ /^Device: ([^,]+), (can't monitor.*)$/i ) ) {
|
|
Packit |
57988d |
$CantMonitor{$Device}{$Text}++;
|
|
Packit |
57988d |
} elsif ( ($ThisLine =~ /smartd startup failed/ ) ) {
|
|
Packit |
57988d |
$StartupFailed++;
|
|
Packit |
57988d |
} elsif ( ($ThisLine =~ /smartd shutdown failed/ ) ) {
|
|
Packit |
57988d |
$ShutdownFailed++;
|
|
Packit |
57988d |
} elsif ( my ($Device,$DLine) = ($ThisLine =~ /Unable to register SCSI device (.*) at line ([0-9]*) of file/) ) {
|
|
Packit |
57988d |
$UnableToReg{"$Device,$DLine"}++
|
|
Packit |
57988d |
} elsif ( ($Device) = ($ThisLine =~ /Device ([^ ]+) not available/)) {
|
|
Packit |
57988d |
$UnavailableDev{$Device}++;
|
|
Packit |
57988d |
} elsif ( my ($Device) = ($ThisLine =~ /Device (.*): SATA disks accessed via libata are supported by Linux kernel versions 2.6.15-rc1 and above/) ) {
|
|
Packit |
57988d |
$SataDisk{"$Device"}++;
|
|
Packit |
57988d |
} elsif ($ThisLine =~ /Unable to monitor any SMART enabled devices\. Try debug \(-d\) option\. Exiting/) {
|
|
Packit |
57988d |
$UnableToMonitor++;
|
|
Packit |
57988d |
} elsif ( my ($Device) = ($ThisLine =~ /Device: ([^,]+), FAILED SMART self-check/) ) {
|
|
Packit |
57988d |
$CheckFailed{$Device}++;
|
|
Packit |
57988d |
} else {
|
|
Packit |
57988d |
# Report any unmatched entries...
|
|
Packit |
57988d |
$OtherList{$ThisLine}++;
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
if (keys %CheckFailed) {
|
|
Packit |
57988d |
print "\nFAILED SMART self-check !!!";
|
|
Packit |
57988d |
print "\n---------------------------";
|
|
Packit |
57988d |
foreach my $Device (sort keys %CheckFailed) {
|
|
Packit |
57988d |
printf "\n %s: BACK UP DATA NOW!", $Device;
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
print "\n====================================\n";
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
if ($UnableToMonitor > 0) {
|
|
Packit |
57988d |
print "\nUnable to monitor any SMART enabled devices.";
|
|
Packit |
57988d |
print "\n Try debug (-d) option: $UnableToMonitor Time(s)\n";
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
if (keys %NotInDatabase) {
|
|
Packit |
57988d |
print "\n";
|
|
Packit |
57988d |
foreach my $Device (sort keys %NotInDatabase) {
|
|
Packit |
57988d |
print "$Device not in smartd database.\n";
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
if (keys %CantMonitor and $Detail) {
|
|
Packit |
57988d |
foreach my $Device (sort keys %CantMonitor) {
|
|
Packit |
57988d |
print "\n$Device :\n";
|
|
Packit |
57988d |
foreach my $Line (sort keys %{$CantMonitor{$Device}}) {
|
|
Packit |
57988d |
print " $Line - " . $CantMonitor{$Device}{$Line} . " Time(s)\n";
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
if (keys %ParamChanges) {
|
|
Packit |
57988d |
foreach my $Device (sort keys %ParamChanges) {
|
|
Packit |
57988d |
print "\n$Device :\n";
|
|
Packit |
57988d |
foreach my $Msg (sort keys %{$ParamChanges{$Device}}) {
|
|
Packit |
57988d |
print " $Msg changed to ";
|
|
Packit |
57988d |
my $count=0;
|
|
Packit |
57988d |
foreach (@{$ParamChanges{$Device}{$Msg}}) {
|
|
Packit |
57988d |
# print 12 values to each line
|
|
Packit |
57988d |
if ($count % 12 == 0) {
|
|
Packit |
57988d |
print "\n ";
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
print "$_, ";
|
|
Packit |
57988d |
$count++;
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
print "\n";
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
if (keys %TempChanges) {
|
|
Packit |
57988d |
print "Temperature Changes\n==================\n";
|
|
Packit |
57988d |
my (@min,@max);
|
|
Packit |
57988d |
foreach my $Device (sort keys %TempChanges) {
|
|
Packit |
57988d |
if($Detail < 10) {
|
|
Packit |
57988d |
my @sorttemp = sort @{$TempChanges{$Device}};
|
|
Packit |
57988d |
push @min, $sorttemp[0];
|
|
Packit |
57988d |
push @max, $sorttemp[$#sorttemp];
|
|
Packit |
57988d |
} elsif($Detail < 20) {
|
|
Packit |
57988d |
my @sorttemp = sort @{$TempChanges{$Device}};
|
|
Packit |
57988d |
print "$Device : $sorttemp[0] - $sorttemp[$#sorttemp]\n";
|
|
Packit |
57988d |
} else {
|
|
Packit |
57988d |
print "$Device : ";
|
|
Packit |
57988d |
print join ", ",@{$TempChanges{$Device}};
|
|
Packit |
57988d |
print "\n";
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
if($Detail < 10) {
|
|
Packit |
57988d |
my @sorttemp = sort @min;
|
|
Packit |
57988d |
my $mint = $sorttemp[0];
|
|
Packit |
57988d |
my @sorttemp = sort @max;
|
|
Packit |
57988d |
my $maxt = $sorttemp[$#sorttemp];
|
|
Packit |
57988d |
print "All devices: $mint - $maxt\n";
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
if (keys %TempCritLimit) {
|
|
Packit |
57988d |
printf "\nReached critical temperature limit:\n";
|
|
Packit |
57988d |
foreach (keys %TempCritLimit) {
|
|
Packit |
57988d |
my ($Device,$Limit)=split ",";
|
|
Packit |
57988d |
print "\t" . $Device . ": reached limit of " . $Limit . " Celsius: ". $TempCritLimit{"$Device,$Limit"} . " Time(s)\n";
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
if (keys %TempLimit) {
|
|
Packit |
57988d |
printf "\nReached temperature limit:\n";
|
|
Packit |
57988d |
foreach (keys %TempLimit) {
|
|
Packit |
57988d |
my ($Device,$Limit)=split ",";
|
|
Packit |
57988d |
print "\t" . $Device . ": reached limit of " . $Limit . " Celsius: ". $TempLimit{"$Device,$Limit"} . " Time(s)\n";
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
|
|
Packit |
57988d |
if (keys %Pendsectors){
|
|
Packit |
57988d |
print "\nCurrently unreadable (pending) sectors detected:\n";
|
|
Packit |
57988d |
foreach my $Device (sort keys %Pendsectors) {
|
|
Packit |
57988d |
print "\t" . $Device . " - " . $Pendsectors{$Device} . " Time(s)\n";
|
|
Packit |
57988d |
print "\t" . $NumPendsectors{$Device} . " unreadable sectors detected\n";
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
if (keys %Offsectors){
|
|
Packit |
57988d |
print "\nOffline uncorrectable sectors detected:\n";
|
|
Packit |
57988d |
foreach my $Device (sort keys %Offsectors) {
|
|
Packit |
57988d |
print "\t" . $Device . " - " . $Offsectors{$Device} . " Time(s)\n";
|
|
Packit |
57988d |
print "\t" . $NumOffsectors{$Device} . " offline uncorrectable sectors detected\n";
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
if (keys %Failed) {
|
|
Packit |
57988d |
foreach my $Device (sort keys %Failed) {
|
|
Packit |
57988d |
print "\n$Device :\n";
|
|
Packit |
57988d |
foreach my $Msg (sort keys %{$Failed{$Device}}) {
|
|
Packit |
57988d |
print " Failed $Msg " . $Failed{$Device}{$Msg} . " Time(s)\n";
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
if (keys %DriveTest) {
|
|
Packit |
57988d |
foreach my $Device (sort keys %DriveTest) {
|
|
Packit |
57988d |
print "\n$Device :\n";
|
|
Packit |
57988d |
foreach my $Type (sort keys %{$DriveTest{$Device}}) {
|
|
Packit |
57988d |
print " started scheduled ${Type}Test " . $DriveTest{$Device}{$Type} . " Time(s)\n";
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
if ( (keys %Warnings) ) {
|
|
Packit |
57988d |
print "\nWarnings:\n";
|
|
Packit |
57988d |
foreach my $Line (sort {$Warnings{$b} <=> $Warnings{$a}} keys %Warnings) {
|
|
Packit |
57988d |
print "\t" . $Line . " - ". $Warnings{$Line} . " Time(s)\n";
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
if ($StartupFailed) {
|
|
Packit |
57988d |
print "\n Smartd startup failed: " . $StartupFailed . " Time(s)\n";
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
if ($ShutdownFailed) {
|
|
Packit |
57988d |
print "\n Smartd shutdown failed: " . $ShutdownFailed . " Time(s)\n";
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
if ( (keys %UnableToReg) ) {
|
|
Packit |
57988d |
print "\n Wrong configuration for devices:\n";
|
|
Packit |
57988d |
foreach (sort keys %UnableToReg) {
|
|
Packit |
57988d |
($Device,$DLine) = split ",";
|
|
Packit |
57988d |
print " " . $Device . (" (line ") . $DLine . ") : ". $UnableToReg{"$Device,$DLine"} . " Time(s)\n";
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
if (%UnavailableDev) {
|
|
Packit |
57988d |
print "\nUnavailable device:\n";
|
|
Packit |
57988d |
foreach my $Device (sort keys %UnavailableDev) {
|
|
Packit |
57988d |
print " Device " . $Device . " : " . $UnavailableDev{$Device} . " Time(s)\n";
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
if (%SataDisk) {
|
|
Packit |
57988d |
print "\nSATA disk(s) supported by Linux kernel >= 2.6.15-rc1:\n";
|
|
Packit |
57988d |
foreach my $Device (sort keys %SataDisk) {
|
|
Packit |
57988d |
print " " .$Device .": Try adding '-d ata' or '-d sat' to the smartd.conf config file line\n";
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
print "\n";
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
if (keys %Monitoring and $Detail > 7) {
|
|
Packit |
57988d |
print "\nMonitoring:\n";
|
|
Packit |
57988d |
foreach my $Device (sort keys %Monitoring) {
|
|
Packit |
57988d |
print "\t$Device";
|
|
Packit |
57988d |
if (defined($DeviceInfo{$Device})) {
|
|
Packit |
57988d |
print ": $DeviceInfo{$Device}\n";
|
|
Packit |
57988d |
} else {
|
|
Packit |
57988d |
print "\n";
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
if ((%OtherList) and (not $IgnoreUnmatched)){
|
|
Packit |
57988d |
print "\n**Unmatched Entries**\n";
|
|
Packit |
57988d |
foreach my $line (sort keys %OtherList) {
|
|
Packit |
57988d |
print $line." : " .$OtherList{$line}." time(s)\n";
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
exit(0);
|
|
Packit |
57988d |
|
|
Packit |
57988d |
# vi: shiftwidth=3 tabstop=3 syntax=perl et
|
|
Packit |
57988d |
# Local Variables:
|
|
Packit |
57988d |
# mode: perl
|
|
Packit |
57988d |
# perl-indent-level: 3
|
|
Packit |
57988d |
# indent-tabs-mode: nil
|
|
Packit |
57988d |
# End:
|