hddtemp, smart-intercept-spindown: handle idle, add --numeric, --no-device
Filter out temperature=255 at this stage rather than in clients who use us Allow hddtemp to output a simpler format if --no-device --numeric is requested Ignore idle disks as well in order not to bring them out of idle mode and thus reset timer
This commit is contained in:
parent
7c831f1f52
commit
00413326be
2 changed files with 51 additions and 11 deletions
58
hddtemp
58
hddtemp
|
|
@ -20,30 +20,70 @@ use warnings;
|
||||||
|
|
||||||
$ENV{PATH}="$ENV{PATH}:/usr/sbin:/sbin";
|
$ENV{PATH}="$ENV{PATH}:/usr/sbin:/sbin";
|
||||||
|
|
||||||
|
sub usage {
|
||||||
|
print STDERR "@_\n" if @_;
|
||||||
|
print STDERR "Usage: hddtemp [-n|--numeric] [--no-device] <devices>\n";
|
||||||
|
exit 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
# FIXME: consider using megaclisas-status if it's available, although
|
||||||
|
# finding the mapping might be interesting...
|
||||||
|
|
||||||
|
my $units="°C";
|
||||||
|
my $print_device=1;
|
||||||
|
while (@ARGV and $ARGV[0] =~ /^-/) {
|
||||||
|
if ($ARGV[0] eq "--numeric" or $ARGV[0] eq "-n") {
|
||||||
|
shift @ARGV;
|
||||||
|
$units="";
|
||||||
|
} elsif ($ARGV[0] eq "--no-device") {
|
||||||
|
shift @ARGV;
|
||||||
|
$print_device=0;
|
||||||
|
} else {
|
||||||
|
usage;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
usage "Supply device name(s)" if (!@ARGV);
|
||||||
|
|
||||||
my $last_exit=0;
|
my $last_exit=0;
|
||||||
foreach my $drive (@ARGV) {
|
foreach my $drive (@ARGV) {
|
||||||
my $output=`/usr/local/bin/smart-intercept-spindown -A -i $drive`;
|
my $output=`/usr/local/bin/smart-intercept-spindown -A -i $drive`;
|
||||||
$last_exit = $?>>8;
|
$last_exit = $?>>8;
|
||||||
if (!($output =~ /Standby condition/)) {
|
if (!($output =~ /(Standby|Idle) condition/)) {
|
||||||
my $model="";
|
my $model = "";
|
||||||
|
my $temp = "";
|
||||||
if ($output =~ /(Model Number|Device Model):\s*(.*)/) {
|
if ($output =~ /(Model Number|Device Model):\s*(.*)/) {
|
||||||
$model="$2: ";
|
$model = "$2: ";
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($output =~ /Current Drive Temperature:\s*(\d+)/) {
|
if ($output =~ /Current Drive Temperature:\s*(\d+)/) {
|
||||||
print "$drive: $model$1°C\n";
|
$temp = $1;
|
||||||
} elsif ($output =~ /^(194 Temperature_(Celsius|Internal).*)/m) {
|
} elsif ($output =~ /^(194 Temperature_(Celsius|Internal).*)/m) {
|
||||||
my @F = split /\s+/, $1;
|
my @F = split /\s+/, $1;
|
||||||
print "$drive: $model$F[9]°C\n";
|
$temp = $F[9];
|
||||||
} elsif ($output =~ /^(231 Temperature_Celsius.*)/m) {
|
} elsif ($output =~ /^(231 Temperature_Celsius.*)/m) {
|
||||||
my @F = split ' ', $1;
|
my @F = split ' ', $1;
|
||||||
print "$drive: $model$F[9]°C\n";
|
$temp = $F[9];
|
||||||
} elsif ($output =~ /^(190 (Airflow_Temperature_Cel|Temperature_Case).*)/m) {
|
} elsif ($output =~ /^(190 (Airflow_Temperature_Cel|Temperature_Case).*)/m) {
|
||||||
my @F = split ' ', $1;
|
my @F = split ' ', $1;
|
||||||
print "$drive: $model$F[9]°C\n";
|
$temp = $F[9];
|
||||||
} elsif ($output =~ /Temperature:\s*(\d+) Celsius/) {
|
} elsif ($output =~ /Temperature:\s*(\d+) Celsius/) {
|
||||||
print "$drive: $model$1°C\n";
|
$temp = $1;
|
||||||
} else {
|
} else {
|
||||||
print "$drive: Smart not available\n";
|
print "$drive: SMART not available\n";
|
||||||
|
next;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Some devices permanently return a *temperature* of 255, so
|
||||||
|
# ignore them too
|
||||||
|
if ($temp == 255) {
|
||||||
|
print "$drive: ${model}Temperature not available through SMART\n";
|
||||||
|
} else {
|
||||||
|
if ($print_device) {
|
||||||
|
print "$drive: $model$temp$units\n";
|
||||||
|
} else {
|
||||||
|
print "$temp$units\n";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
print "$drive: Sleeping. Temperature not available\n";
|
print "$drive: Sleeping. Temperature not available\n";
|
||||||
|
|
|
||||||
|
|
@ -98,14 +98,14 @@ if [ "1" = --version ] ; then
|
||||||
exec smartctl "$@"
|
exec smartctl "$@"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if sdparm --command=sense "$final_arg" 2>/dev/null | grep Standby; then
|
if sdparm --command=sense "$final_arg" 2>/dev/null | grep -e "Standby condition" -e "Idle condition" ; then
|
||||||
# exit code success rather than code 2 like smartctl by default
|
# exit code success rather than code 2 like smartctl by default
|
||||||
# Could do similar output with hdparm -C, but smartctl
|
# Could do similar output with hdparm -C, but smartctl
|
||||||
# --nocheck=standby,0 correctly detects that
|
# --nocheck=standby,0 correctly detects that
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
smart_output=$( smartctl --nocheck=standby,0 "$@" )
|
smart_output=$( smartctl --nocheck=idle,0 "$@" )
|
||||||
exit_code=$?
|
exit_code=$?
|
||||||
|
|
||||||
case "$smart_output" in
|
case "$smart_output" in
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue