[Fusioninventory-commit] [fusinv/fusioninventory-agent] 409c05: turn getSerialNumber into a generic function

Guillaume Rousse guillomovitch at gmail.com
Thu May 3 18:14:14 UTC 2012


  Branch: refs/heads/2.2.x
  Home:   https://github.com/fusinv/fusioninventory-agent
  Commit: 409c0577b7242493dcc8ec5860e6a792e01eac2f
      https://github.com/fusinv/fusioninventory-agent/commit/409c0577b7242493dcc8ec5860e6a792e01eac2f
  Author: Guillaume Rousse <guillomovitch at gmail.com>
  Date:   2012-05-03 (Thu, 03 May 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Tools/Linux.pm

  Log Message:
  -----------
  turn getSerialNumber into a generic function

smartctl is able to return far more information than just the serial
number


diff --git a/lib/FusionInventory/Agent/Tools/Linux.pm b/lib/FusionInventory/Agent/Tools/Linux.pm
index 983a329..6e8f5bc 100644
--- a/lib/FusionInventory/Agent/Tools/Linux.pm
+++ b/lib/FusionInventory/Agent/Tools/Linux.pm
@@ -16,7 +16,7 @@ our @EXPORT = qw(
     getDevicesFromHal
     getDevicesFromProc
     getCPUsFromProc
-    getSerialnumber
+    getInfoFromSmartctl
     getInterfacesFromIfconfig
     getInterfacesFromIp
 );
@@ -243,17 +243,39 @@ sub _getValueFromSysProc {
     return $value;
 }
 
-sub getSerialnumber {
+sub getInfoFromSmartctl {
     my (%params) = @_;
 
-    my ($serial) = getFirstMatch(
+    my $handle = getFileHandle(
+        %params,
         command => $params{device} ? "smartctl -i $params{device}" : undef,
-        file    => $params{file},
-        logger  => $params{logger},
-        pattern => qr/^Serial Number:\s+(\S*)/
     );
+    return unless $handle;
+
+    my $info = {
+        TYPE        => 'disk',
+        DESCRIPTION => 'SATA',
+    };
+
+    while (my $line = <$handle>) {
+        if ($line =~ /^Transport protocol: +(\S+)/i) {
+            $info->{DESCRIPTION} = $1;
+            next;
+        }
+
+        if ($line =~ /^Device type: +(\S+)/i) {
+            $info->{TYPE} = $1;
+            next;
+        }
+
+        if ($line =~ /^Serial number: +(\S+)/i) {
+            $info->{SERIALNUMBER} = $1;
+            next;
+        }
+    }
+    close $handle;
 
-    return $serial;
+    return $info;
 }
 
 sub getInterfacesFromIfconfig {
@@ -440,9 +462,9 @@ Availables parameters:
 
 =back
 
-=head2 getSerialnumber(%params)
+=head2 getInfoFromSmartctl(%params)
 
-Returns the serial number of a drive, using smartctl.
+Returns some informations about a drive, using smartctl.
 
 Availables parameters:
 


================================================================
  Commit: 6bf7ffca419910da3db2ba206c7fe3f59b7403b7
      https://github.com/fusinv/fusioninventory-agent/commit/6bf7ffca419910da3db2ba206c7fe3f59b7403b7
  Author: Guillaume Rousse <guillomovitch at gmail.com>
  Date:   2012-05-03 (Thu, 03 May 2012)

  Changed paths:
    A resources/linux/smartctl/sample2
    A resources/linux/smartctl/sample3
    A resources/linux/smartctl/sample4

  Log Message:
  -----------
  new samples


diff --git a/resources/linux/smartctl/sample2 b/resources/linux/smartctl/sample2
new file mode 100644
index 0000000..0ad69b3
--- /dev/null
+++ b/resources/linux/smartctl/sample2
@@ -0,0 +1,7 @@
+smartctl version 5.38 [x86_64-redhat-linux-gnu] Copyright (C) 2002-8 Bruce Allen
+Home page is http://smartmontools.sourceforge.net/
+
+Device: ServeRA  Drive 1          Version: V1.0
+scsiModePageOffset: response length too short, resp_len=4 offset=4 bd_len=0
+>> Terminate command early due to bad response to IEC mode page
+A mandatory SMART command failed: exiting. To continue, add one or more '-T permissive' options.
diff --git a/resources/linux/smartctl/sample3 b/resources/linux/smartctl/sample3
new file mode 100644
index 0000000..b23d4a4
--- /dev/null
+++ b/resources/linux/smartctl/sample3
@@ -0,0 +1,10 @@
+smartctl version 5.38 [x86_64-redhat-linux-gnu] Copyright (C) 2002-8 Bruce Allen
+Home page is http://smartmontools.sourceforge.net/
+
+Device: IBM-ESXS ST3300655SS      Version: BA23
+Serial number: 3LM0L0FJ00009733Y46W
+Device type: disk
+Transport protocol: SAS
+Local Time is: Sat Apr 28 12:03:55 2012 MSK
+Device supports SMART and is Enabled
+Temperature Warning Enabled
diff --git a/resources/linux/smartctl/sample4 b/resources/linux/smartctl/sample4
new file mode 100644
index 0000000..6b3db52
--- /dev/null
+++ b/resources/linux/smartctl/sample4
@@ -0,0 +1,7 @@
+smartctl version 5.38 [x86_64-redhat-linux-gnu] Copyright (C) 2002-8 Bruce Allen
+Home page is http://smartmontools.sourceforge.net/
+
+Device: IBM-ESXS VSC7160          Version: 1.06
+Device type: enclosure
+Local Time is: Sat Apr 28 12:03:57 2012 MSK
+Device does not support SMART


================================================================
  Commit: bfbe965ceb26a0d8acd258227c5ce1e01290ce7f
      https://github.com/fusinv/fusioninventory-agent/commit/bfbe965ceb26a0d8acd258227c5ce1e01290ce7f
  Author: Guillaume Rousse <guillomovitch at gmail.com>
  Date:   2012-05-03 (Thu, 03 May 2012)

  Changed paths:
    R resources/linux/smartctl/dell-xt2
    A resources/linux/smartctl/sample1

  Log Message:
  -----------
  rename existing sample


diff --git a/resources/linux/smartctl/dell-xt2 b/resources/linux/smartctl/dell-xt2
deleted file mode 100644
index ba063ab..0000000
--- a/resources/linux/smartctl/dell-xt2
+++ /dev/null
@@ -1,15 +0,0 @@
-smartctl 5.40 2010-10-16 r3189 [x86_64-mandriva-linux-gnu] (local build)
-Copyright (C) 2002-10 by Bruce Allen, http://smartmontools.sourceforge.net
-
-=== START OF INFORMATION SECTION ===
-Device Model:     SAMSUNG SSD PM800 TM 128GB
-Serial Number:    DFW1W11002SE002B3117
-Firmware Version: VBM24D1Q
-User Capacity:    128 035 676 160 bytes
-Device is:        Not in smartctl database [for details use: -P showall]
-ATA Version is:   7
-ATA Standard is:  ATA/ATAPI-7 T13 1532D revision 1
-Local Time is:    Thu Dec 23 15:15:06 2010 CET
-SMART support is: Available - device has SMART capability.
-SMART support is: Enabled
-
diff --git a/resources/linux/smartctl/sample1 b/resources/linux/smartctl/sample1
new file mode 100644
index 0000000..ba063ab
--- /dev/null
+++ b/resources/linux/smartctl/sample1
@@ -0,0 +1,15 @@
+smartctl 5.40 2010-10-16 r3189 [x86_64-mandriva-linux-gnu] (local build)
+Copyright (C) 2002-10 by Bruce Allen, http://smartmontools.sourceforge.net
+
+=== START OF INFORMATION SECTION ===
+Device Model:     SAMSUNG SSD PM800 TM 128GB
+Serial Number:    DFW1W11002SE002B3117
+Firmware Version: VBM24D1Q
+User Capacity:    128 035 676 160 bytes
+Device is:        Not in smartctl database [for details use: -P showall]
+ATA Version is:   7
+ATA Standard is:  ATA/ATAPI-7 T13 1532D revision 1
+Local Time is:    Thu Dec 23 15:15:06 2010 CET
+SMART support is: Available - device has SMART capability.
+SMART support is: Enabled
+


================================================================
  Commit: 8ab7f8a825b742e90a259f397d32e47af2f9d3be
      https://github.com/fusinv/fusioninventory-agent/commit/8ab7f8a825b742e90a259f397d32e47af2f9d3be
  Author: Guillaume Rousse <guillomovitch at gmail.com>
  Date:   2012-05-03 (Thu, 03 May 2012)

  Changed paths:
    M t/tools/linux.t

  Log Message:
  -----------
  test new function


diff --git a/t/tools/linux.t b/t/tools/linux.t
index 9ca970d..94276cc 100755
--- a/t/tools/linux.t
+++ b/t/tools/linux.t
@@ -533,7 +533,24 @@ my %hal_tests = (
 );
 
 my %smartctl_tests = (
-    'dell-xt2' => 'DFW1W11002SE002B3117'
+    sample1 => {
+        TYPE         => 'disk',
+        DESCRIPTION  => 'SATA',
+        SERIALNUMBER => 'DFW1W11002SE002B3117'
+    },
+    sample2 => {
+        TYPE         => 'disk',
+        DESCRIPTION  => 'SATA'
+    },
+    sample3 => {
+        TYPE         => 'disk',
+        DESCRIPTION  => 'SAS',
+        SERIALNUMBER => '3LM0L0FJ00009733Y46W',
+    },
+    sample4 => {
+        TYPE         => 'enclosure',
+        DESCRIPTION  => 'SATA'
+    },
 );
 
 my %ifconfig_tests = (
@@ -879,8 +896,8 @@ foreach my $test (keys %hal_tests) {
 
 foreach my $test (keys %smartctl_tests) {
     my $file = "resources/linux/smartctl/$test";
-    my $result = getSerialnumber(file => $file);
-    is($result, $smartctl_tests{$test}, "$test smartctl parsing");
+    my $result = getInfoFromSmartctl(file => $file);
+    is_deeply($result, $smartctl_tests{$test}, "$test smartctl parsing");
 }
 
 foreach my $test (keys %ifconfig_tests) {


================================================================
  Commit: b00187101465b6a9733f20e1f77283e818b567f0
      https://github.com/fusinv/fusioninventory-agent/commit/b00187101465b6a9733f20e1f77283e818b567f0
  Author: Guillaume Rousse <guillomovitch at gmail.com>
  Date:   2012-05-03 (Thu, 03 May 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Storages/Adaptec.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Storages/Lsilogic.pm
    M t/inventory/linux/storages/adaptec.t
    M t/inventory/linux/storages/lsilogic.t

  Log Message:
  -----------
  replace getSerialNumber with getInfoFromSmartctl

This allow to get more than serial number.


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Storages/Adaptec.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Storages/Adaptec.pm
index b036683..8976d61 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Storages/Adaptec.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Storages/Adaptec.pm
@@ -30,8 +30,12 @@ sub doInventory {
                 controller => 'scsi' . $device->{SCSI_COID},
                 name       => $device->{NAME},
                 logger     => $logger
-            )) {
-            $disk->{SERIALNUMBER} = getSerialnumber(device => $disk->{device});
+        )) {
+            # merge with smartctl info
+            my $info = getInfoFromSmartctl(device => $disk->{device});
+            foreach my $key (qw/SERIALNUMBER DESCRIPTION TYPE/) {
+                $disk->{$key} = $info->{$key};
+            }
             delete $disk->{device};
             $inventory->addEntry(section => 'STORAGES', entry => $disk);
         }
@@ -60,8 +64,6 @@ sub _getDisksFromProc {
                 # that's the controller we're looking for
                 $disk = {
                     NAME        => $params{name},
-                    DESCRIPTION => 'SATA',
-                    TYPE        => 'disk',
                 };
             } else {
                 # that's another controller
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Storages/Lsilogic.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Storages/Lsilogic.pm
index 73b4c49..bb42ae2 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Storages/Lsilogic.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Storages/Lsilogic.pm
@@ -24,7 +24,11 @@ sub doInventory {
             logger  => $logger,
             command => "mpt-status -n -i $device->{SCSI_UNID}"
         )) {
-            $disk->{SERIALNUMBER} = getSerialnumber(device => $disk->{device});
+            # merge with smartctl info
+            my $info = getInfoFromSmartctl(device => $disk->{device});
+            foreach my $key (qw/SERIALNUMBER DESCRIPTION TYPE/) {
+                $disk->{$key} = $info->{$key};
+            }
             delete $disk->{device};
             $inventory->addEntry(section => 'STORAGES', entry => $disk);
         }
@@ -51,8 +55,6 @@ sub _getDiskFromMptStatus {
 
         my $disk = {
             NAME         => $params{name},
-            DESCRIPTION  => 'SATA',
-            TYPE         => 'disk',
             device       => "/dev/sg$1",
             MODEL        => $2,
             MANUFACTURER => getCanonicalManufacturer($2),
diff --git a/t/inventory/linux/storages/adaptec.t b/t/inventory/linux/storages/adaptec.t
index 790c99e..ca154da 100644
--- a/t/inventory/linux/storages/adaptec.t
+++ b/t/inventory/linux/storages/adaptec.t
@@ -13,8 +13,6 @@ my %tests = (
         disks   => [
             {
                 NAME         => 'foo',
-                DESCRIPTION  => 'SATA',
-                TYPE         => 'disk',
                 MODEL        => 'SAMSUNG SSD PM80',
                 MANUFACTURER => 'Samsung',
                 FIRMWARE     => 'VBM2',
@@ -28,8 +26,6 @@ my %tests = (
         disks      => [
             {
                 NAME         => 'foo',
-                DESCRIPTION  => 'SATA',
-                TYPE         => 'disk',
                 MODEL        => 'HUS151436VL3800',
                 MANUFACTURER => 'Hitachi',
                 FIRMWARE     => 'S3C0',
@@ -37,8 +33,6 @@ my %tests = (
             },
             {
                 NAME         => 'foo',
-                DESCRIPTION  => 'SATA',
-                TYPE         => 'disk',
                 MODEL        => 'HUS151436VL3800',
                 MANUFACTURER => 'Hitachi',
                 FIRMWARE     => 'S3C0',
@@ -52,8 +46,6 @@ my %tests = (
         disks      => [
             {
                 NAME         => 'foo',
-                DESCRIPTION  => 'SATA',
-                TYPE         => 'disk',
                 MODEL        => 'UJDA782 DVD/CDRW',
                 MANUFACTURER => 'UJDA782 DVD/CDRW',
                 FIRMWARE     => 'VA13',
@@ -70,8 +62,6 @@ my %tests = (
                 FIRMWARE     => 'V1.0',
                 MANUFACTURER => 'Drive 1',
                 MODEL        => 'Drive 1',
-                DESCRIPTION  => 'SATA',
-                TYPE         => 'disk',
                 device       => '/dev/sg0'
             },
             {
@@ -79,8 +69,6 @@ my %tests = (
                 FIRMWARE     => 'V1.0',
                 MANUFACTURER => 'Drive 2',
                 MODEL        => 'Drive 2',
-                DESCRIPTION  => 'SATA',
-                TYPE         => 'disk',
                 device       => '/dev/sg1'
             },
             {
@@ -88,8 +76,6 @@ my %tests = (
                 FIRMWARE     => 'BA23',
                 MANUFACTURER => 'Seagate',
                 MODEL        => 'ST3300655SS',
-                DESCRIPTION  => 'SATA',
-                TYPE         => 'disk',
                 device       => '/dev/sg2'
                 },
                 {
@@ -97,8 +83,6 @@ my %tests = (
                 FIRMWARE     => 'BA23',
                 MANUFACTURER => 'Seagate',
                 MODEL        => 'ST3300655SS',
-                DESCRIPTION  => 'SATA',
-                TYPE         => 'disk',
                 device       => '/dev/sg3'
             },
             {
@@ -106,8 +90,6 @@ my %tests = (
                 FIRMWARE     => 'BA23',
                 MANUFACTURER => 'Seagate',
                 MODEL        => 'ST3300655SS',
-                DESCRIPTION  => 'SATA',
-                TYPE         => 'disk',
                 device       => '/dev/sg4'
             },
             {
@@ -115,8 +97,6 @@ my %tests = (
                 FIRMWARE     => 'BA23',
                 MANUFACTURER => 'Seagate',
                 MODEL        => 'ST3300655SS',
-                DESCRIPTION  => 'SATA',
-                TYPE         => 'disk',
                 device       => '/dev/sg5'
             },
             {
@@ -124,8 +104,6 @@ my %tests = (
                 FIRMWARE     => 'BA23',
                 MANUFACTURER => 'Seagate',
                 MODEL        => 'ST3300655SS',
-                DESCRIPTION  => 'SATA',
-                TYPE         => 'disk',
                 device       => '/dev/sg6'
             },
             {
@@ -133,8 +111,6 @@ my %tests = (
                 FIRMWARE     => 'BA23',
                 MANUFACTURER => 'Seagate',
                 MODEL        => 'ST3300655SS',
-                DESCRIPTION  => 'SATA',
-                TYPE         => 'disk',
                 device       => '/dev/sg7'
             },
             {
@@ -142,8 +118,6 @@ my %tests = (
                 FIRMWARE     => '1.06',
                 MANUFACTURER => 'VSC7160',
                 MODEL        => 'VSC7160',
-                DESCRIPTION  => 'SATA',
-                TYPE         => 'disk',
                 device       => '/dev/sg8'
             }
         ]
diff --git a/t/inventory/linux/storages/lsilogic.t b/t/inventory/linux/storages/lsilogic.t
index fefa13a..115845f 100755
--- a/t/inventory/linux/storages/lsilogic.t
+++ b/t/inventory/linux/storages/lsilogic.t
@@ -15,9 +15,7 @@ my %tests = (
                 FIRMWARE     => 'D',
                 MANUFACTURER => 'Seagate',
                 MODEL        => 'ST3160815AS',
-                DESCRIPTION  => 'SATA',
                 device       => '/dev/sg1',
-                TYPE         => 'disk'
             },
             {
                 SIZE         => '152576',
@@ -25,9 +23,7 @@ my %tests = (
                 FIRMWARE     => 'D',
                 MANUFACTURER => 'Seagate',
                 MODEL        => 'ST3160815AS',
-                DESCRIPTION  => 'SATA',
                 device       => '/dev/sg0',
-                TYPE         => 'disk'
           }
         ]
     },
@@ -40,9 +36,7 @@ my %tests = (
                 FIRMWARE     => 'C610',
                 MANUFACTURER => 'CBRCA146C3ETS0 N',
                 MODEL        => 'CBRCA146C3ETS0 N',
-                DESCRIPTION  => 'SATA',
                 device       => '/dev/sg5',
-                TYPE         => 'disk'
             },
             {
                 SIZE         => '139264',
@@ -50,9 +44,7 @@ my %tests = (
                 FIRMWARE     => 'C610',
                 MANUFACTURER => 'CBRCA146C3ETS0 N',
                 MODEL        => 'CBRCA146C3ETS0 N',
-                DESCRIPTION  => 'SATA',
                 device       => '/dev/sg4',
-                TYPE         => 'disk'
             },
             {
                 SIZE         => '139264',
@@ -60,9 +52,7 @@ my %tests = (
                 FIRMWARE     => 'B53C',
                 MANUFACTURER => 'Seagate',
                 MODEL        => 'ST9146803SS',
-                DESCRIPTION  => 'SATA',
                 device       => '/dev/sg3',
-                TYPE         => 'disk'
             },
             {
                 SIZE         => '139264',
@@ -70,9 +60,7 @@ my %tests = (
                 FIRMWARE     => 'C610',
                 MANUFACTURER => 'CBRCA146C3ETS0 N',
                 MODEL        => 'CBRCA146C3ETS0 N',
-                DESCRIPTION  => 'SATA',
                 device       => '/dev/sg2',
-                TYPE         => 'disk'
             },
             {
                 SIZE         => '139264',
@@ -80,9 +68,7 @@ my %tests = (
                 FIRMWARE     => 'C610',
                 MANUFACTURER => 'CBRCA146C3ETS0 N',
                 MODEL        => 'CBRCA146C3ETS0 N',
-                DESCRIPTION  => 'SATA',
                 device       => '/dev/sg1',
-                TYPE         => 'disk'
             },
             {
                 SIZE         => '139264',
@@ -90,9 +76,7 @@ my %tests = (
                 FIRMWARE     => 'C610',
                 MANUFACTURER => 'CBRCA146C3ETS0 N',
                 MODEL        => 'CBRCA146C3ETS0 N',
-                DESCRIPTION  => 'SATA',
                 device       => '/dev/sg0',
-                TYPE         => 'disk'
             }
         ]
     }


================================================================
Compare: https://github.com/fusinv/fusioninventory-agent/compare/161a58e...b001871


More information about the Fusioninventory-commit mailing list