From dc1311cbe81dab52d1c49e0580c608ca4100cfa9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabian=20Gr=C3=BCnbichler?= Date: Mon, 3 Oct 2016 13:53:35 +0200 Subject: [PATCH] fix #1120: non-ATA disks with unstructured smart data simple parser as fallback for non-ATA disks, just collect all lines in the "SMART DATA" section. --- PVE/Diskmanage.pm | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/PVE/Diskmanage.pm b/PVE/Diskmanage.pm index 4cae46b..bfec6bb 100644 --- a/PVE/Diskmanage.pm +++ b/PVE/Diskmanage.pm @@ -74,7 +74,7 @@ sub get_smart_data { assert_blockdev($disk); my $smartdata = {}; - my $datastarted = 0; + my $type; my $returncode = 0; eval { @@ -84,7 +84,12 @@ sub get_smart_data { # ATA SMART attributes, e.g.: # ID# ATTRIBUTE_NAME FLAGS VALUE WORST THRESH FAIL RAW_VALUE # 1 Raw_Read_Error_Rate POSR-K 100 100 000 - 0 - if ($datastarted && $line =~ m/^([ \d]{2}\d)\s+(\S+)\s+(\S{6})\s+(\d+)\s+(\d+)\s+(\d+)\s+(\S+)\s+(.*)$/) { +# +# SAS and NVME disks, e.g.: +# Data Units Written: 5,584,952 [2.85 TB] +# Accumulated start-stop cycles: 34 + + if (defined($type) && $type eq 'ata' && $line =~ m/^([ \d]{2}\d)\s+(\S+)\s+(\S{6})\s+(\d+)\s+(\d+)\s+(\d+)\s+(\S+)\s+(.*)$/) { my $entry = {}; $entry->{name} = $2 if defined $2; $entry->{flags} = $3 if defined $3; @@ -99,7 +104,13 @@ sub get_smart_data { } elsif ($line =~ m/(?:Health Status|self\-assessment test result): (.*)$/ ) { $smartdata->{health} = $1; } elsif ($line =~ m/Vendor Specific SMART Attributes with Thresholds:/) { - $datastarted = 1; + $type = 'ata'; + delete $smartdata->{text}; + } elsif ($line =~ m/=== START OF (READ )?SMART DATA SECTION ===/) { + $type = 'text'; + } elsif (defined($type) && $type eq 'text') { + $smartdata->{text} = '' if !defined $smartdata->{text}; + $smartdata->{text} .= "$line\n"; } }); }; @@ -111,6 +122,9 @@ sub get_smart_data { if ((defined($returncode) && ($returncode & 0b00000011)) || $err) { die "Error getting S.M.A.R.T. data: Exit code: $returncode\n"; } + + $smartdata->{type} = $type; + return $smartdata; }