|
|
@@ -11,11 +11,11 @@ Disk::SMART - Provides an interface to smartctl
|
|
|
|
|
|
=head1 VERSION
|
|
|
|
|
|
-Version 0.01
|
|
|
+Version 0.03
|
|
|
|
|
|
=cut
|
|
|
|
|
|
-our $VERSION = '0.01';
|
|
|
+our $VERSION = '0.03';
|
|
|
|
|
|
=head1 SYNOPSIS
|
|
|
|
|
|
@@ -42,20 +42,16 @@ C<DEVICE> - Device identifier of SSD / Hard Drive
|
|
|
|
|
|
sub new {
|
|
|
my ( $class, @devices ) = @_;
|
|
|
- confess "Valid device identifier not supplied to constructor.\n" if ( !@devices );
|
|
|
-
|
|
|
my $smartctl = '/usr/sbin/smartctl';
|
|
|
- if ( !-f $smartctl ) {
|
|
|
- confess "smartctl binary was not found on your system, are you running as root?\n";
|
|
|
- }
|
|
|
-
|
|
|
my $self = bless {}, $class;
|
|
|
|
|
|
+ croak "Valid device identifier not supplied to constructor for $class.\n" if ( !@devices );
|
|
|
+ croak "smartctl binary was not found on your system, are you running as root?\n" if !-f $smartctl;
|
|
|
+
|
|
|
foreach my $device (@devices) {
|
|
|
my $out = qx($smartctl -a $device);
|
|
|
if ( $out =~ /No such device/i ) {
|
|
|
- confess "Device $device could not be found\n";
|
|
|
- next;
|
|
|
+ croak "Smartctl couldn't poll device $device\n";
|
|
|
}
|
|
|
$self->{'devices'}->{$device}->{'SMART_OUTPUT'} = $out;
|
|
|
}
|
|
|
@@ -79,6 +75,7 @@ C<DEVICE> - Device identifier of SSD / Hard Drive
|
|
|
|
|
|
sub get_disk_temp {
|
|
|
my ( $self, $device ) = @_;
|
|
|
+ $self->_validate_param($device);
|
|
|
my $smart_output = $self->{'devices'}->{$device}->{'SMART_OUTPUT'};
|
|
|
my ($temp_c) = $smart_output =~ /(Temperature_Celsius.*\n)/;
|
|
|
|
|
|
@@ -90,7 +87,6 @@ sub get_disk_temp {
|
|
|
$temp_c =~ s/ //g;
|
|
|
$temp_c =~ s/.*-//;
|
|
|
$temp_c =~ s/\(.*\)//;
|
|
|
- }
|
|
|
|
|
|
my $temp_f = round( ( $temp_c * 9 ) / 5 + 32 );
|
|
|
return ( $temp_c, $temp_f );
|
|
|
@@ -109,10 +105,11 @@ C<DEVICE> - Device identifier of SSD / Hard Drive
|
|
|
|
|
|
sub get_disk_health {
|
|
|
my ( $self, $device ) = @_;
|
|
|
+ $self->_validate_param($device);
|
|
|
my $smart_output = $self->{'devices'}->{$device}->{'SMART_OUTPUT'};
|
|
|
my ($health) = $smart_output =~ /(SMART overall-health self-assessment.*\n)/;
|
|
|
|
|
|
- if ( !defined $health or $health !~ /PASSED|FAILED/x ) {
|
|
|
+ if ( (!defined $health) or $health !~ /PASSED|FAILED/x ) {
|
|
|
return 'N/A';
|
|
|
}
|
|
|
|
|
|
@@ -123,7 +120,7 @@ sub get_disk_health {
|
|
|
|
|
|
=head2 B<get_disk_model (DEVICE)>
|
|
|
|
|
|
-Returns the model of the device. Output is "<device>: <model>" or "N/A". eg. "/dev/sda: ST3250410AS"
|
|
|
+Returns the model of the device. eg. "ST3250410AS".
|
|
|
|
|
|
C<DEVICE> - Device identifier of SSD / Hard Drive
|
|
|
|
|
|
@@ -133,18 +130,50 @@ C<DEVICE> - Device identifier of SSD / Hard Drive
|
|
|
|
|
|
sub get_disk_model {
|
|
|
my ( $self, $device ) = @_;
|
|
|
+ $self->_validate_param($device);
|
|
|
my $smart_output = $self->{'devices'}->{$device}->{'SMART_OUTPUT'};
|
|
|
my ($model) = $smart_output =~ /(Device\ Model.*\n)/;
|
|
|
|
|
|
if ( !defined $model ) {
|
|
|
- return "$device: N/A";
|
|
|
+ return 'N/A';
|
|
|
}
|
|
|
|
|
|
$model =~ s/.*:\ //;
|
|
|
$model =~ s/^\s+|\s+$//g; #trim beginning and ending whitepace
|
|
|
- return "$device: $model";
|
|
|
+ return $model;
|
|
|
}
|
|
|
|
|
|
+=head2 B<get_disk_errors (DEVICE)>
|
|
|
+
|
|
|
+Returns any listed errors
|
|
|
+
|
|
|
+C<DEVICE> - DEvice identifier of SSD/ Hard Drive
|
|
|
+
|
|
|
+ my $disk_errors = $smart->get_disk_errors('/dev/sda');
|
|
|
+
|
|
|
+=cut
|
|
|
+
|
|
|
+sub get_disk_errors {
|
|
|
+ my ( $self, $device ) = @_;
|
|
|
+ $self->_validate_param($device);
|
|
|
+
|
|
|
+ my $smart_output = $self->{'devices'}->{$device}->{'SMART_OUTPUT'};
|
|
|
+ my ($errors) = $smart_output =~ /SMART Error Log Version: [1-9](.*)SMART Self-test log/s;
|
|
|
+
|
|
|
+ if ( !defined $errors ) {
|
|
|
+ return 'N/A';
|
|
|
+ }
|
|
|
+
|
|
|
+ $errors =~ s/^\s+|\s+$//g; #trim beginning and ending whitepace
|
|
|
+ return $errors;
|
|
|
+}
|
|
|
+
|
|
|
+sub _validate_param {
|
|
|
+ my ( $self, $device ) = @_;
|
|
|
+ croak "$device not found in object, You probably didn't enter it right" if ( !exists $self->{'devices'}->{$device} );
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
1;
|
|
|
|
|
|
__END__
|