From d73f5c8d7e35515f0c99a2e79fb1aa5308d1ae71 Mon Sep 17 00:00:00 2001 From: Guillaume Bougard Date: Fri, 24 May 2024 15:19:44 +0200 Subject: [PATCH] fix: Enhanced disk storage serialnumber support on Windows Closes #680 --- Changes | 1 + .../Agent/Task/Inventory/Win32/Storages.pm | 12 ++++--- .../wmi/latitude-7480-MSFT_PhysicalDisk.wmi | Bin 0 -> 2140 bytes .../wmi/latitude-7480-Win32_DiskDrive.wmi | Bin 0 -> 2452 bytes t/tasks/inventory/windows/storages.t | 34 +++++++++++++++--- 5 files changed, 38 insertions(+), 9 deletions(-) create mode 100644 resources/win32/wmi/latitude-7480-MSFT_PhysicalDisk.wmi create mode 100644 resources/win32/wmi/latitude-7480-Win32_DiskDrive.wmi diff --git a/Changes b/Changes index 1f79aa289..cb859276f 100644 --- a/Changes +++ b/Changes @@ -9,6 +9,7 @@ Inventory: * fix #673: Fix support of network port type on MacOSX * fix #675: Enhanced MSSQL database inventory on Windows by discovering installed instances. +* fix #680: Enhanced disk storage serialnumber support on Windows netdiscovery/netinventory: * fix #642: Support snmp-retries configuration parameter to set snmp requests diff --git a/lib/GLPI/Agent/Task/Inventory/Win32/Storages.pm b/lib/GLPI/Agent/Task/Inventory/Win32/Storages.pm index 84061078d..5f01f57ec 100644 --- a/lib/GLPI/Agent/Task/Inventory/Win32/Storages.pm +++ b/lib/GLPI/Agent/Task/Inventory/Win32/Storages.pm @@ -127,7 +127,7 @@ sub _getDrives { FirmwareRevision SerialNumber Size SCSIPort SCSILogicalUnit SCSITargetId BusType FriendlyName DeviceId /; - push @properties, qw(FirmwareVersion PhysicalLocation) + push @properties, qw(FirmwareVersion PhysicalLocation AdapterSerialNumber) if $params{class} eq 'MSFT_PhysicalDisk'; foreach my $object (getWMIObjects( @@ -154,12 +154,16 @@ sub _getDrives { $drive->{DISKSIZE} = int($object->{Size} / 1_000_000) if $object->{Size}; - if ($object->{SerialNumber} && $object->{SerialNumber} !~ /^ +$/) { + # First use AdapterSerialNumber as SerialNumber + my $serial = trimWhitespace($object->{AdapterSerialNumber}); + ($serial) = $serial =~ /^(\S+)/ unless empty($serial); + $serial = trimWhitespace($object->{SerialNumber}) if empty($serial); + unless (empty($serial)) { # Try to decode serial only for known case if ($drive->{MODEL} =~ /VBOX HARDDISK ATA/) { - $drive->{SERIAL} = _decodeSerialNumber($object->{SerialNumber}); + $drive->{SERIAL} = _decodeSerialNumber($serial); } else { - $drive->{SERIAL} = $object->{SerialNumber}; + $drive->{SERIAL} = $serial; } } diff --git a/resources/win32/wmi/latitude-7480-MSFT_PhysicalDisk.wmi b/resources/win32/wmi/latitude-7480-MSFT_PhysicalDisk.wmi new file mode 100644 index 0000000000000000000000000000000000000000..f48d69ca5fa378f835045575cf3012dda32b94ad GIT binary patch literal 2140 zcmbW2TW=CU7>2)V6aT}e*PtAGFyW#n6kCLpwrXNRwy?D*Ex16nlKyq|d1rQPx20Z~ z$qvIe?{_}T?_baDnd#fMp~W_}xh0lb&+Q{9V|!-{yRor3}u&^w<@9#WVQP;@ooDc zwQLi%3pI5pNo|mqBRk3Bcu3qn!!J2wv?ZM8&{RwLOiNlD)D^az^DCT>Vw&lacSE@1 zdzr5}E80jLax3ls7n2TteaWozIbBj!xAuwEwhq=FlM&TO6Q2+8@FO=VdR1#L!N^Db zSEZdh+Iwiq*@SG*z$n)8JSHLu|GN&aN|NoWf!}V875%t>bu(ifqeaTUS?_l2@EjJ@HcjufmWg~JNFoB63&C zD2h>-bkSdG6PzYp$lTpc{ t$lY`nT%vi7)=d}7J4^K1it7~lvU34Wo$F_kcooelcZ!Q7_(+IH-ydm7Sh)ZI literal 0 HcmV?d00001 diff --git a/resources/win32/wmi/latitude-7480-Win32_DiskDrive.wmi b/resources/win32/wmi/latitude-7480-Win32_DiskDrive.wmi new file mode 100644 index 0000000000000000000000000000000000000000..9c3e65274da53a08f64835d98e460439e35ea822 GIT binary patch literal 2452 zcmbW3ZBH6e5QXP+ll}+N4^5kx#y8NW*$;x+5*3MHjfn}Npp=McV11!Y|9ac!%w@TY zO4Bx*UDkVN&Yd}DX4YRnU)l@Py=8aSw!RH`e(~SFr8cp|cgwt`c5Y*<^Bh@&XNQ$* z-V-a@imkd`1@D_VguZ(v_TAQO$=2=10=tQAyJZK&J{T#_Ya4Q+d|%lSs6*?rc4Y;k z?QkicF?&ng4ZFqb#v@8uE!c@831?_MEb=F3=n45$h-{gwU^V+}2cQ-}+vE9_tcUnN z@E&sfXys}AisOb8LJT2R`KEYX6KCM9;yGM^(F0i-w0RSQJKQ6WRyJMM5@L`Ni+zsC zOTKxF#CBn0pNMy+-ioO`XZ}Cpa zc|eREtQy#SbBxSt%=)}y$qchVUXM}lK#+1(tP(rpddFS2Pj(7=mE4rgHhNc4V`s`q zo~;4iZE(+LEXUpFYbaJ|DGKRZ0_yh8hBGNds)?Xv%SZp*o|Hk(lFd!aew~v=FV&t(_v>z(!c8Zds zmRM0oz5zpLD=Kl-rGmSj#ihSxs*LTepCqJ*g*t~_u_lc6qbi8&`!LkTCMeTH!{cdH zMw^(an0|0ub=uP?uV&|kT-C>mD)C_2Lj!XEzmAUG@wYWuBR*w1MzK(nniZNgLFF2H zTro?f$RQd<4(4Z7tmC?~pxKnoCr!VSD^#a{>(o)G#@Inwy_~UEMVUQ&4T@&d2k)O6 zJs#%TPHv};Hivk$a%@GrmgBU%C(oFC5wXOy*`?;ownJG_s@fSm?|JipDj~ORr6cB@Vn&ByYYtCor z@r#&!C7U3$eQrv{HP=yJPIaHo&R0mnG^x-n>u9pdZ;5Ye%ie>otHre0 63, }, ], + 'latitude-7480' => [ + { + DESCRIPTION => 'PCI Slot 12 : Bus 60 : Device 0 : Function 0 : Adapter 0', + DISKSIZE => 512110, + FIRMWARE => '20007A00', + INTERFACE => 'NVMe', + MANUFACTURER => undef, + MODEL => 'PC300 NVMe SK hynix 512GB', + NAME => 'PhysicalDisk0', + SCSI_COID => undef, + SCSI_LUN => undef, + SCSI_UNID => undef, + SERIAL => 'FJ68NXXXXXXXXXXXX', + TYPE => 'SSD' + } + ], ); plan tests => (2 * scalar keys %tests) + 1; @@ -364,11 +381,18 @@ foreach my $test (sort keys %tests) { ); push @storages, @{$storages}; - cmp_deeply( - \@storages, - $tests{$test}, - "$test: parsing" - ); + if (ref($tests{$test}) eq 'ARRAY' && scalar(@{$tests{$test}})) { + cmp_deeply( + \@storages, + $tests{$test}, + "$test: parsing" + ); + } else { + my $dumper = Data::Dumper->new([\@storages], [$test])->Useperl(1)->Indent(1)->Quotekeys(0)->Sortkeys(1)->Pad(" "); + $dumper->{xpad} = " "; + print STDERR $dumper->Dump(); + fail "$test: still no result integrated"; + } lives_ok { $inventory->addEntry(section => 'STORAGES', entry => $_) foreach @storages;