1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#! /usr/bin/perl
# version: 0.2-GR (2008-03-19)
# Détection Utilisable des Médias Brisés
# Vérifie les disques SATA avec SMART pour le RTM de OVH,
# le script d'origine ne vérifiant que les disques SCSI et IDE.

use strict;
use IO::Select;

my %smartData;

sub parse_smartctl_line {
    my $line = shift;
    my $dev = shift;
    if ($line =~ /^196 Reallocated_Event_Count.*\s+(\d+)$/) {
        print "hINFO_HDD_$dev\_SMART_realocated-event-count|$1\n";
    }
    if ($line =~ /^197 Current_Pending_Sector.*\s+(\d+)$/) {
        print "hINFO_HDD_$dev\_SMART_current-pending-sector|$1\n";
    }
    if ($line =~ /^198 Offline_Uncorrectable.*\s+(\d+)$/) {
        print "hINFO_HDD_$dev\_SMART_offline-uncorrectable|$1\n";
    }
    if ($line =~ /^199 UDMA_CRC_Error_Count.*\s+(\d+)$/) {
        print "hINFO_HDD_$dev\_SMART_udma-crc-error|$1\n";
    }
    if ($line =~ /^200 Multi_Zone_Error_Rate.*\s+(\d+)$/) {
        print "hINFO_HDD_$dev\_SMART_multizone-error-rate|$1\n";
    }
    if ($line =~ /^209 Offline_Seek_Performnce.*\s+(\d+)$/) {
        print "hINFO_HDD_$dev\_SMART_offline-seek-performance|$1\n";
    }
    if ($line =~ /^read:.+(\d+)$/) {
        print "hINFO_HDD_$dev\_SMART_uncorrected-read-errors|$1\n";
    }
    if ($line =~ /^write:.+(\d+)$/) {
        print "hINFO_HDD_$dev\_SMART_uncorrected-write-errors|$1\n";
    }
}

sub check_sata {
    open my $PART, "/proc/partitions" or return;
    my @disks = ();
    while (<$PART>) {
        chomp;
        next unless /\b(sd\D+)\b/;
        push @disks, $1;
    }
    close $PART;
    return unless @disks > 0;

    foreach my $dev (@disks) {
        my @smartctlData = `smartctl -d ata -a /dev/$dev`;        
        foreach my $line (@smartctlData) {
            parse_smartctl_line($line, $dev);
        }
    }
}

check_sata();