diff --git a/.circleci/config.yml b/.circleci/config.yml new file mode 100644 index 0000000000..1ec5f9e2f5 --- /dev/null +++ b/.circleci/config.yml @@ -0,0 +1,30 @@ +version: 2 + +general: + branches: + only: + - develop + +jobs: + build: + macos: + xcode: "9.0" + + steps: + - checkout + - run: + name: Install cpanminus + command: | + curl -L https://cpanmin.us | perl - App::cpanminus + $HOME/perl5/bin/cpanm --local-lib=~/perl5 local::lib && eval $(perl -I ~/perl5/lib/perl5/ -Mlocal::lib) + echo 'export PERL5LIB="$HOME/perl5/lib/perl5"' >> $BASH_ENV + - run: + name: Install deps + command: | + echo $PERL5LIB + $HOME/perl5/bin/cpanm -L ~/perl5 Module::Install + touch Makefile.PL + $HOME/perl5/bin/cpanm -L ~/perl5 --installdeps --verbose --notest . + - run: perl Makefile.PL + - run: make + - run: make test diff --git a/.travis.yml b/.travis.yml index ce0a6017b7..1126178a4f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -25,4 +25,4 @@ notifications: branches: only: - master - - 2.4.x + - develop diff --git a/Changes b/Changes index 7efb53ac5d..31920dd5a1 100644 --- a/Changes +++ b/Changes @@ -1,5 +1,80 @@ Revision history for FusionInventory agent +2.4.2 Wed, 03 Oct 2018 + +core: +* Linux: fix agent not listening on http port when syslog logger is active + and Sys::Sylog module is too old + +inventory: +* Bump Inventory task version to 1.5 +* Fix physical memory error correction detection via WMI under win32 +* Fix #299: Added UWP/APPX/Windows Store software inventory +* win32 antivirus detection enhanced support: + - add support for few antivirus base versions (defender, kaspersky, + EST, avira, MSE, McAfee, F-Secure) + - try to set license expiration date for F-Secure, kaspersky & avira +* Fix #442: kaspersky not fully recognized in russia +* Fix #501: wrong status was reported when windows defender was disabled +* Enhanced software inventory under Arch Linux +* Fix #453: under MacOS, skip XML DTD validation for software inventory as + parsing may fail if a proxy is enabled +* Fix #473: fix arch detection under MacOS +* Fix #475: fix video cards support under MacOS +* Fix #504: support non-standard ssh port to report local ssh server pubkey +* Updated pci.ids to 2018.10.02 version +* Updated usb.ids to 2018.08.15 version + +deploy: +* Bump Deploy task version to 2.7 +* Fix deployment of private packages: their downloaded parts were not + fully found when download were too long (closes: #542) +* Handle retention duration differently for p2p and not p2p files +* P2p files have a default retention of 3 days by default +* P2p files have a default retention of 3 times the target prolog delay + after download, parts retention is reset to the same delay for all file parts, + so the retention duration applies at the time parts has been downloaded +* P2p file parts are now cleaned up after job success if retention duration + is null +* Fix WinKeyNotEquals audit check to also be true when the registry key is + simply missing +* Add support to "startjob" key for failing deploy audit check to permit + to skip remaining checks when a failing condition makes them obsolete. + +esx: +* Bump ESX task version to 2.4 +* Support 2 ServiceTags case to cover chassis & lame board S/N inventory +* Updated AssetTag support +* fix wrong cpu core computation when only one package is available + +netdiscovery/netinventory: +* Bump NetDiscovery task version to 2.7 +* Bump NetInventory task version to 3.1 +* Thanks to @QuickNerd357, Brocade devices will now show serial number and + firmware informations. +* Sanitize VLAN names. This fixes an issue with Cisco Small Business Switches. +* Get rid of unofficial Net::Ping::TimeStamp support to only use official + support if available. Net::Ping v2.67 is now mandatory to discover + devices thanks to timestamp ping. +* Fix #481: Add Synology NAS support +* Fix #480: Add CheckPoint support +* Fix #488: Update HP Printers support +* Updated LLDP/CDP connection match checks +* Updated sysobject.ids (tagged fia-2.4.2 tag on github repository) + +collect: +* Bump Collect task version to 2.5 +* Thanks to David Durieux, add support for dynamic pattern in registry key + collect under win32. The dynamic pattern is '**' to glob subkeys like in: + HKEY_USERS/**/Software/**/**/CurrentVersion + +maintenance: +* Bump Maintenance task version to 1.1 +* Disable Maintenance task if no maintenance module could be used + +test suite: +* Make snmp walk tests faster + 2.4.1 Fri, 29 Jun 2018 core: diff --git a/MANIFEST.SKIP b/MANIFEST.SKIP index bec8b09422..de0d70a4fa 100644 --- a/MANIFEST.SKIP +++ b/MANIFEST.SKIP @@ -7,6 +7,7 @@ CVS/ ^.travis.yml$ ^appveyor.yml$ ^circle.yml$ +.circleci .svn .merge diff --git a/README.Cron b/README.Cron index f7ef205fe5..34b79e3b14 100644 --- a/README.Cron +++ b/README.Cron @@ -5,13 +5,13 @@ WARNING: FusionInventory Agent would better be installed as systemd service and this is the recommanded way of doing. FusionInventory agent is expected to run its tasks on a regular basis and is better -installed as service. Its memory and load footprints are low enough for this mode. +installed as service. Its memory and load footprints are low enough for modern desktop computers. -To know better about the FusionInventory agent execution modes, you should be read -the our online Agent usage page: +To know better about the FusionInventory agent execution modes, you should read +the online Agent usage page: http://fusioninventory.org/documentation/agent/usage.html -Cron mode could be used if you don't want a fusioninventory-agent process to be running +You should use cron if you don't want a fusioninventory-agent process to be running all the time and if you don't need to trigger it remotely (from the server or manually, locally contacting the `http://localhost:62354/` page). @@ -32,16 +32,17 @@ to do the following as root: # time before really run its work 00 */4 * * * /usr/bin/fusioninventory-agent --wait=1800 >/var/lib/fusioninventory-agent/cron.log 2>&1 -For large companies, be aware, if you don't enable lazy option in cron mode and you schedule -many computer to make inventory at the same cron time, you can flood your GLPI server at the -scheduled time, even more if you forget to use `--wait` option. To avoid such missconfiguration, -you would prefer leave the agent started as systemd service and define a peaceful delay -on server. You may adjust scheduled time and wait command line only option to your needs. - -As a reminder, cron mode disables the httpd daemon listening feature permitting server -to manually and remotely trigger fusioninventory-agent to run its tasks. +For large companies, be aware you can lead to concurrent execution issues +if you don't enable agent `lazy` option with cron scheduling and even more if you forget to +use `--wait` option. To avoid such missconfiguration, you would prefer leave the agent +started as systemd service and define a peaceful delay on server. You may adjust scheduled +time and wait command line only option to your needs. +As a reminder, when launched without the daemonize configuration directive +as usually done from cron, the agent is a short-lived process, without +the ability to listen on the network for out-of-schedule activation requests +from the server. === -Review our mandatory agent cron mode page: +Review our mandatory 'schedule agent with cron' page: http://fusioninventory.org/documentation/agent/cron.html diff --git a/README.Packaging b/README.Packaging index d606cfa208..f03db8b0b3 100644 --- a/README.Packaging +++ b/README.Packaging @@ -51,7 +51,7 @@ package FusionInventory::Agent::Version; use strict; use warnings; -our $VERSION = "2.4-1"; +our $VERSION = "2.4.2-1"; our $PROVIDER = "FusionInventory"; our $COMMENTS = [ "My distro package built on some computer", "Built on that date" ]; diff --git a/README.md b/README.md index 0b479c6ece..8180362de6 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # FusionInventory Agent -[![Travis Build Status](https://travis-ci.org/fusioninventory/fusioninventory-agent.svg?branch=master)](https://travis-ci.org/fusioninventory/fusioninventory-agent) +[![Travis Build Status](https://travis-ci.org/fusioninventory/fusioninventory-agent.svg?branch=develop)](https://travis-ci.org/fusioninventory/fusioninventory-agent) [![Appveyor Build status](https://ci.appveyor.com/api/projects/status/f2oh6p3qnr2bck1b?svg=true)](https://ci.appveyor.com/project/fusioninventory/fusioninventory-agent) [![CircleCI Build status](https://circleci.com/gh/fusioninventory/fusioninventory-agent.svg?style=svg)](https://circleci.com/gh/fusioninventory/fusioninventory-agent) @@ -129,9 +129,9 @@ Please report any issues on project forge bugtracker. Copyright 2006-2010 [OCS Inventory contributors](https://www.ocsinventory-ng.org/) -Copyright 2010-2017 [FusionInventory Team](http://fusioninventory.org) +Copyright 2010-2018 [FusionInventory Team](http://fusioninventory.org) -Copyright 2011-2017 [Teclib Editions](http://www.teclib-edition.com/) +Copyright 2011-2018 [Teclib Editions](http://www.teclib-edition.com/) ## License diff --git a/appveyor.yml b/appveyor.yml index b0bc0c9805..f405bf892c 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,6 +1,6 @@ branches: only: - - 2.4.x + - develop notifications: - provider: Email diff --git a/bin/fusioninventory-netdiscovery b/bin/fusioninventory-netdiscovery index 95de8cec89..65748d09f2 100755 --- a/bin/fusioninventory-netdiscovery +++ b/bin/fusioninventory-netdiscovery @@ -111,6 +111,7 @@ $discovery->{client} = $discovery->run(); +## no critic (ProhibitMultiplePackages) package FusionInventory::Agent::Task::NetInventory::Client; sub new { diff --git a/bin/fusioninventory-netinventory b/bin/fusioninventory-netinventory index 919343db68..afb1707888 100755 --- a/bin/fusioninventory-netinventory +++ b/bin/fusioninventory-netinventory @@ -178,6 +178,7 @@ sub send { print $params{message}->getContent(); } +## no critic (ProhibitMultiplePackages) package FusionInventory::Agent::Task::NetInventory::Target; sub new { diff --git a/circle.yml b/circle.yml deleted file mode 100644 index 7b4a5f4c53..0000000000 --- a/circle.yml +++ /dev/null @@ -1,31 +0,0 @@ -general: - branches: - only: - - 2.4.x -# - master - -machine: - environment: - PERL5LIB: $HOME/perl5/lib/perl5 - -dependencies: - pre: - - curl -L https://cpanmin.us | perl - App::cpanminus - - $HOME/perl5/bin/cpanm --local-lib=~/perl5 local::lib && eval $(perl -I ~/perl5/lib/perl5/ -Mlocal::lib) - - echo $PERL5LIB - - override: - - $HOME/perl5/bin/cpanm -L ~/perl5 Module::Install - - touch Makefile.PL - - $HOME/perl5/bin/cpanm -L ~/perl5 --installdeps --verbose --notest . - - $HOME/perl5/bin/cpanm -L ~/perl5 Test::Deep - - $HOME/perl5/bin/cpanm -L ~/perl5 Test::More - - $HOME/perl5/bin/cpanm -L ~/perl5 UNIVERSAL::require - - $HOME/perl5/bin/cpanm -L ~/perl5 File::Copy::Recursive - - perl Makefile.PL - - make - -test: - override: - # Run the tests - - make test diff --git a/lib/FusionInventory/Agent/HTTP/Protocol/https.pm b/lib/FusionInventory/Agent/HTTP/Protocol/https.pm index 62f372f539..447b68c5c4 100644 --- a/lib/FusionInventory/Agent/HTTP/Protocol/https.pm +++ b/lib/FusionInventory/Agent/HTTP/Protocol/https.pm @@ -30,7 +30,8 @@ sub _extra_sock_opts { ## no critic (ProhibitMultiplePackages) package FusionInventory::Agent::HTTP::Protocol::https::Socket; -our @ISA = qw(Net::HTTPS LWP::Protocol::http::SocketMethods); +use parent qw(Net::HTTPS); +use parent -norequire, qw(LWP::Protocol::http::SocketMethods); 1; __END__ diff --git a/lib/FusionInventory/Agent/Inventory.pm b/lib/FusionInventory/Agent/Inventory.pm index 2019aebf09..f13cc66fb7 100644 --- a/lib/FusionInventory/Agent/Inventory.pm +++ b/lib/FusionInventory/Agent/Inventory.pm @@ -35,8 +35,8 @@ my %fields = ( ACCESSLOG => [ qw/USERID LOGDATE/ ], ANTIVIRUS => [ qw/COMPANY ENABLED GUID NAME UPTODATE VERSION - DATFILECREATION DATFILEVERSION ENGINEVERSION32 - ENGINEVERSION64/ ], + EXPIRATION BASE_CREATION BASE_VERSION + 32ENGINE_VERSION 64ENGINE_VERSION/ ], BATTERIES => [ qw/CAPACITY CHEMISTRY DATE NAME SERIAL MANUFACTURER VOLTAGE/ ], CONTROLLERS => [ qw/CAPTION DRIVER NAME MANUFACTURER PCICLASS VENDORID diff --git a/lib/FusionInventory/Agent/Logger/Syslog.pm b/lib/FusionInventory/Agent/Logger/Syslog.pm index 10688250ab..dc1a6ad4fb 100644 --- a/lib/FusionInventory/Agent/Logger/Syslog.pm +++ b/lib/FusionInventory/Agent/Logger/Syslog.pm @@ -27,6 +27,10 @@ sub new { openlog($syslog_name, 'cons,pid', $params{logfacility} || 'LOG_USER'); + # Fix agent not listening on http port issue when 'syslog' logger is + # active and Sys::Syslog is too old. Problem seen on CentOS 6.10 + Sys::Syslog::setlogsock('unix') if $Sys::Syslog::VERSION < 0.28 ; + return $self; } diff --git a/lib/FusionInventory/Agent/SNMP/Device.pm b/lib/FusionInventory/Agent/SNMP/Device.pm index 1286a5c581..11184f2ce3 100644 --- a/lib/FusionInventory/Agent/SNMP/Device.pm +++ b/lib/FusionInventory/Agent/SNMP/Device.pm @@ -232,7 +232,7 @@ sub _cleanHash { $keys++; next if defined($hashref->{$key}); delete $hashref->{$key}; - $keys--, + $keys--; } return $keys; @@ -440,7 +440,7 @@ sub setType { sub setManufacturer { my ($self) = @_; - # Permit mib support to reset type + # Permit mib support to reset manufacturer if ($self->{MIBSUPPORT}) { my $manufacturer = $self->{MIBSUPPORT}->getMethod('getManufacturer'); $self->{MANUFACTURER} = $manufacturer if $manufacturer; diff --git a/lib/FusionInventory/Agent/SNMP/MibSupport/Brocade.pm b/lib/FusionInventory/Agent/SNMP/MibSupport/Brocade.pm new file mode 100644 index 0000000000..0553552477 --- /dev/null +++ b/lib/FusionInventory/Agent/SNMP/MibSupport/Brocade.pm @@ -0,0 +1,45 @@ +package FusionInventory::Agent::SNMP::MibSupport::Brocade; + +use strict; +use warnings; + +use parent 'FusionInventory::Agent::SNMP::MibSupportTemplate'; + +use FusionInventory::Agent::Tools; +use FusionInventory::Agent::Tools::SNMP; + +use constant brocade => '.1.3.6.1.4.1.1991' ; +use constant serial => brocade .'.1.1.1.1.2.0' ; +use constant fw_pri => brocade . '.1.1.2.1.11.0' ; + +our $mibSupport = [ + { + name => "brocade-switch", + sysobjectid => getRegexpOidMatch(brocade) + } +]; + +sub getSerial { + my ($self) = @_; + + return $self->get(serial); +} + + +sub getFirmware { + my ($self) = @_; + + return $self->get(fw_pri); +} + +1; + +__END__ + +=head1 NAME + +Inventory module for Brocade Switches + +=head1 DESCRIPTION + +The module enhances Brocade Switches devices support. diff --git a/lib/FusionInventory/Agent/SNMP/MibSupport/Epson.pm b/lib/FusionInventory/Agent/SNMP/MibSupport/Epson.pm index decda6686d..7a695f431a 100644 --- a/lib/FusionInventory/Agent/SNMP/MibSupport/Epson.pm +++ b/lib/FusionInventory/Agent/SNMP/MibSupport/Epson.pm @@ -9,8 +9,8 @@ use FusionInventory::Agent::Tools; use FusionInventory::Agent::Tools::SNMP; use constant epson => '.1.3.6.1.4.1.1248' ; -use constant model => epson .'.1.2.2.1.1.1.2.1' ; -use constant serial => epson .'.1.2.2.1.1.1.5.1' ; +use constant model => epson . '.1.2.2.1.1.1.2.1' ; +use constant serial => epson . '.1.2.2.1.1.1.5.1' ; use constant fw_base => epson . '.1.2.2.2.1.1' ; our $mibSupport = [ diff --git a/lib/FusionInventory/Agent/SNMP/MibSupport/HPNetPeripheral.pm b/lib/FusionInventory/Agent/SNMP/MibSupport/HPNetPeripheral.pm index 3b7fd922f9..9f9fab99b3 100644 --- a/lib/FusionInventory/Agent/SNMP/MibSupport/HPNetPeripheral.pm +++ b/lib/FusionInventory/Agent/SNMP/MibSupport/HPNetPeripheral.pm @@ -11,7 +11,8 @@ use FusionInventory::Agent::Tools::SNMP; # See HP-LASERJET-COMMON-MIB / JETDIRECT3-MIB use constant hpPeripheral => '.1.3.6.1.4.1.11.2.3.9' ; # hp.nm.system.net-peripheral use constant hpOfficePrinter => '.1.3.6.1.4.1.29999' ; -use constant hpNetPrinter => hpPeripheral .'.1' ; +use constant hpSystem => '.1.3.6.1.4.1.11.1' ; +use constant hpNetPrinter => hpPeripheral . '.1' ; use constant hpDevice => hpPeripheral . '.4.2.1' ; # + netPML.netPMLmgmt.device use constant gdStatusId => hpNetPrinter . '.1.7.0' ; @@ -43,6 +44,10 @@ our $mibSupport = [ { name => "hp-office", sysobjectid => getRegexpOidMatch(hpOfficePrinter) + }, + { + name => "hp-system", + sysobjectid => getRegexpOidMatch(hpSystem) } ]; diff --git a/lib/FusionInventory/Agent/SNMP/MibSupport/LinuxAppliance.pm b/lib/FusionInventory/Agent/SNMP/MibSupport/LinuxAppliance.pm index 62b1946fde..41250c0bb9 100644 --- a/lib/FusionInventory/Agent/SNMP/MibSupport/LinuxAppliance.pm +++ b/lib/FusionInventory/Agent/SNMP/MibSupport/LinuxAppliance.pm @@ -11,14 +11,29 @@ use FusionInventory::Agent::Tools::SNMP; use constant enterprises => '.1.3.6.1.4.1' ; use constant linux => enterprises . '.8072.3.2.10' ; -use constant ucddavis => enterprises .'.2021' ; +use constant ucddavis => enterprises . '.2021' ; +use constant checkpoint => enterprises . '.2620' ; +use constant synology => enterprises . '.6574' ; -use constant ucdExperimental => ucddavis .'.13' ; +use constant ucdExperimental => ucddavis . '.13' ; # UCD-DLMOD-MIB DEFINITIONS -use constant ucdDlmodMIB => ucdExperimental .'.14' ; -use constant dlmodEntry => ucdDlmodMIB .'.2.1' ; -use constant dlmodName => dlmodEntry .'.2.1' ; +use constant ucdDlmodMIB => ucdExperimental . '.14' ; +use constant dlmodEntry => ucdDlmodMIB . '.2.1' ; +use constant dlmodName => dlmodEntry . '.2.1' ; + +# SYNOLOGY-SYSTEM-MIB +use constant dsmInfo => synology . '.1.5'; +use constant dsmInfo_modelName => dsmInfo . '.1.0'; +use constant dsmInfo_serialNumber => dsmInfo . '.2.0'; +use constant dsmInfo_version => dsmInfo . '.3.0'; + +# CHECKPOINT-MIB +use constant svnProdName => checkpoint . '.1.6.1.0'; +use constant svnVersion => checkpoint . '.1.6.4.1.0'; +use constant svnApplianceSerialNumber => checkpoint . '.1.6.16.3.0'; +use constant svnApplianceModel => checkpoint . '.1.6.16.7.0'; +use constant svnApplianceManufacturer => checkpoint . '.1.6.16.9.0'; our $mibSupport = [ { @@ -42,6 +57,26 @@ sub getType { }; return 'NETWORKING'; } + + # Synology detection + my $dsmInfo_modelName = $self->get(dsmInfo_modelName); + if ($dsmInfo_modelName) { + $device->{_Appliance} = { + MODEL => $dsmInfo_modelName, + MANUFACTURER => 'Synology' + }; + return 'STORAGE'; + } + + # CheckPoint detection + my $svnApplianceManufacturer = $self->get(svnApplianceManufacturer); + if ($svnApplianceManufacturer) { + $device->{_Appliance} = { + MODEL => $self->get(svnApplianceModel), + MANUFACTURER => 'CheckPoint' + }; + return 'NETWORKING'; + } } sub getModel { @@ -64,6 +99,53 @@ sub getManufacturer { return $device->{_Appliance}->{MANUFACTURER}; } +sub getSerial { + my ($self) = @_; + + my $manufacturer = $self->getManufacturer() + or return; + + my $serial; + + if ($manufacturer eq 'Synology') { + $serial = $self->get(dsmInfo_serialNumber); + } elsif ($manufacturer eq 'CheckPoint') { + $serial = $self->get(svnApplianceSerialNumber); + } + + return $serial; +} + +sub run { + my ($self) = @_; + + my $device = $self->device + or return; + + my $manufacturer = $self->getManufacturer() + or return; + + my $firmware; + if ($manufacturer eq 'Synology') { + $firmware = { + NAME => "$manufacturer DSM", + DESCRIPTION => "$manufacturer DSM firmware", + TYPE => "system", + VERSION => getCanonicalString($self->get(dsmInfo_version)), + MANUFACTURER => $manufacturer + }; + } elsif ($manufacturer eq 'CheckPoint') { + $firmware = { + NAME => getCanonicalString($self->get(svnProdName)), + DESCRIPTION => "$manufacturer SVN version", + TYPE => "system", + VERSION => getCanonicalString($self->get(svnVersion)), + MANUFACTURER => $manufacturer + }; + } + $device->addFirmware($firmware) if $firmware; +} + 1; __END__ diff --git a/lib/FusionInventory/Agent/SNMP/Mock.pm b/lib/FusionInventory/Agent/SNMP/Mock.pm index 427e8da389..8c1cb5023b 100644 --- a/lib/FusionInventory/Agent/SNMP/Mock.pm +++ b/lib/FusionInventory/Agent/SNMP/Mock.pm @@ -47,13 +47,16 @@ sub new { unless -f $params{file}; die "unreadable file '$params{file}'\n" unless -r $params{file}; - $self->{values} = _getIndexedValues($params{file}); - $self->{file} = $params{file}; + $self->{_file} = $params{file}; + $self->_setIndexedValues(); last SWITCH; } if ($params{hash}) { - $self->{values} = $params{hash}; + $self->{_walk} = {}; + foreach my $oid (keys(%{$params{hash}})) { + $self->_setValue($oid, $params{hash}->{$oid}); + } last SWITCH; } } @@ -64,27 +67,27 @@ sub new { sub switch_vlan_context { my ($self, $vlan_id) = @_; - $self->{oldvalues} = $self->{values} unless $self->{oldvalues}; + $self->{_oldwalk} = $self->{_walk} unless $self->{_oldwalk}; - my $file = $self->{file} . '@' . $vlan_id; + my $file = $self->{_file} . '@' . $vlan_id; if (-r $file && -f $file) { - $self->{values} = _getIndexedValues($file); + $self->_setIndexedValues($file); } else { - delete $self->{values}; + delete $self->{_walk}; } } sub reset_original_context { my ($self) = @_; - $self->{values} = $self->{oldvalues}; - delete $self->{oldvalues}; + $self->{_walk} = $self->{_oldwalk} if $self->{_oldwalk}; + delete $self->{_oldwalk}; } -sub _getIndexedValues { - my ($file) = @_; +sub _setIndexedValues { + my ($self, $file) = @_; - my $handle = getFileHandle(file => $file); + my $handle = getFileHandle(file => $file || $self->{_file}); # check first line my $first_line = <$handle>; @@ -93,136 +96,185 @@ sub _getIndexedValues { # check first line for safety die "invalid file format\n" unless $first_line =~ /^(\S+) = .*/; - my $values = substr($first_line, 0, 1) eq '.' ? - _readNumericalOids($handle) : - _readSymbolicOids($handle) ; - close ($handle); - - return $values; -} + my $numerical = substr($first_line, 0, 1) eq '.' ? 1 : 0 ; + my $last_value; -sub _readNumericalOids { - my ($handle) = @_; + $self->{_walk} = {}; - my ($values, $last_oid); while (my $line = <$handle>) { - if ($line =~ /^ - (\S+) \s - = \s - (?:Wrong \s Type \s \(should \s be \s [^:]+\): \s)? - ([^:]+): \s - (.*) - /x - ) { - my ($oid, $type, $value) = ($1, $2, $3); - $values->{$oid} = [ $type, $value ]; - $last_oid = $oid; - next; + # Use different regex if walk contains numerical or symbolic oids + if ($numerical) { + if ($line =~ /^ + (\S+) \s + = \s + (?:Wrong \s Type \s \(should \s be \s [^:]+\): \s)? + ([^:]+): \s + (.*) + /x + ) { + my ($oid, $type, $value) = ($1, $2, $3); + $last_value = [ $type, $value ]; + $self->_setValue($oid, $last_value); + next; + } + } else { + if ($line =~ /^ + ([^.]+) \. ([\d.]+) \s + = \s + (?:Wrong \s Type \s \(should \s be \s [^:]+\): \s)? + ([^:]+): \s + (.*) + /x + ) { + my ($mib, $suffix, $type, $value) = ($1, $2, $3, $4); + + if ($prefixes{$mib}) { + my $oid = $prefixes{$mib} . '.' . $suffix; + $last_value = [ $type, $value ]; + $self->_setValue($oid, $last_value); + } else { + # irrelevant OID + $last_value = undef; + } + + next; + } } + # Don't merge end of walk delimiter in last value + last if $line =~ /No more variables left in this MIB View/; + last if $line =~ /^End of MIB$/; + # potential continuation - if ($line !~ /^$/ && $line !~ /= ""$/ && $last_oid) { - if ($values->{$last_oid}->[0] eq 'STRING' && - $values->{$last_oid}->[1] !~ /"$/ + if ($line !~ /^$/ && $line !~ /= ""$/ && $last_value) { + if ($last_value->[0] eq 'STRING' && + $last_value->[1] !~ /"$/ ) { chomp $line; - $values->{$last_oid}->[1] .= "\n" . $line; + $last_value->[1] .= "\n" . $line; next; - } - if ($values->{$last_oid}->[0] eq 'Hex-STRING') { + } elsif ($last_value->[0] eq 'Hex-STRING') { chomp $line; - $values->{$last_oid}->[1] .= $line; + $last_value->[1] .= $line; next; } } - $last_oid = undef; + $last_value = undef; } - return $values; + close ($handle); } -sub _readSymbolicOids { - my ($handle) = @_; - - - my ($values, $last_oid); - while (my $line = <$handle>) { - - if ($line =~ /^ - ([^.]+) \. ([\d.]+) \s - = \s - (?:Wrong \s Type \s \(should \s be \s [^:]+\): \s)? - ([^:]+): \s - (.*) - /x - ) { - my ($mib, $suffix, $type, $value) = ($1, $2, $3, $4); - - if ($prefixes{$mib}) { - my $oid = $prefixes{$mib} . '.' . $suffix; - $values->{$oid} = [ $type, $value ]; - $last_oid = $oid; - } else { - # irrelevant OID - $last_oid = undef; - } - - next; +sub _setValue { + my ($self, $oid, $value) = @_; + + # Optimization: use 6 first oid digits as tree root key as they don't often change + my ($root, $nextoidpart) = $oid =~ /^(\.\d+\.\d+\.\d+\.\d+\.\d+\.\d+)(.*)$/ + or return; + # Prepare walk tree roots with empty node while not exist + # 1st value node will contain sub-nodes + # 2nd value will be the numder index + # 3rd value will be a hash of sub-index -> sub-node ref in 1st values + # 4th value will be a SNMP value array ref like [ TYPE, VALUE ] when + # a value should be stored + $self->{_walk}->{$root} = [ [], undef, {}, undef ] unless exists($self->{_walk}->{$root}); + $oid = $nextoidpart; + + my $base = $self->{_walk}->{$root}; + foreach my $num (split(/\./, substr($oid,1))) { + # Get subnode ref if indexed + if ($base->[2] && $base->[2]->{$num}) { + $base = $base->[2]->{$num}; + # Otherwise initialize a new subnode + } else { + my $ref = [undef, $num, {}]; + # Initialize an array ref as subnode if necessary + $base->[0] = [] unless $base->[0]; + # Push new sub-node in list + push @{$base->[0]}, $ref; + # Index sub-node + $base->[2]->{$num} = $ref; + # New subnode becomes the base node + $base = $ref; } + } + # Keep value in leaf + $base->[2] = undef; + $base->[3] = $value; +} - # potential continuation - if ($line !~ /^$/ && $line !~ /= ""$/ && $last_oid) { - if ($values->{$last_oid}->[0] eq 'STRING' && - $values->{$last_oid}->[1] !~ /"$/ - ) { - chomp $line; - $values->{$last_oid}->[1] .= "\n" . $line; - next - } - if ($values->{$last_oid}->[0] eq 'Hex-STRING' && - $line =~ /^([A-F0-9]{2})( [A-F0-9]{2})?/ - ) { - chomp $line; - $values->{$last_oid}->[1] .= $line; - next - } - } +sub _getValue { + my ($self, $oid, $walk) = @_; - $last_oid = undef; + my ($root, $nextoidpart) = $oid =~ /^(\.\d+\.\d+\.\d+\.\d+\.\d+\.\d+)(.*)$/ + or return; + return unless exists($self->{_walk}->{$root}); + $oid = $nextoidpart; + + my $base = $self->{_walk}->{$root}; + foreach my $num (split(/\./, substr($oid,1))) { + # No value if no subnode indexed + # Also no value if requested subnode is not indexed + return unless $base->[2] && $base->[2]->{$num}; + $base = $base->[2]->{$num}; } - return $values; + return $walk ? $base : $base->[3]; } sub get { my ($self, $oid) = @_; return unless $oid; - return unless $self->{values}->{$oid}; + my $value = $self->_getValue($oid) + or return; return _getSanitizedValue( - $self->{values}->{$oid}->[0], - $self->{values}->{$oid}->[1], + $value->[0], + $value->[1], ); } +sub _deepwalk { + my ($base) = @_; + + my $hash = {}; + + # Lookup all current base subnodes + foreach my $ref (@{$base->[0]}) { + # We need the subnode key as hash key + my $key = $ref->[1]; + # Keep the value is one is available + if (defined($ref->[3])) { + $hash->{$key} = _getSanitizedValue(@{$ref->[3]}); + } + # walk subnodes subnode + if ($ref->[0]) { + my $subkeys = _deepwalk($ref); + foreach my $subkey (keys(%{$subkeys})) { + # Keep subkey values + $hash->{$key.".".$subkey} = $subkeys->{$subkey}; + } + } + } + + return $hash; +} + sub walk { my ($self, $oid) = @_; return unless $oid; - my $values; - foreach my $key (keys %{$self->{values}}) { - next unless $key =~ /^$oid\.(.+)/; - $values->{$1} = _getSanitizedValue( - $self->{values}->{$key}->[0], - $self->{values}->{$key}->[1] - ); - } + my $base = $self->_getValue($oid, 1) + or return; + + # Don't walk unless subnodes exist + return unless $base->[0]; - return $values; + return _deepwalk($base); } sub _getSanitizedValue { diff --git a/lib/FusionInventory/Agent/SOAP/VMware.pm b/lib/FusionInventory/Agent/SOAP/VMware.pm index 3310c19e97..5a1e5e0cb9 100644 --- a/lib/FusionInventory/Agent/SOAP/VMware.pm +++ b/lib/FusionInventory/Agent/SOAP/VMware.pm @@ -76,7 +76,7 @@ sub _parseAnswer { # We simplify the XML structure my $pattern = '.*<\w+Response xmlns="urn:vim25">(.+).*$'; - $answer =~ s/$pattern/$1/sg,; + $answer =~ s/$pattern/$1/sg; $answer =~ s/ (xsi:|)type="[:\w]+"//sg; $answer =~ s/[[:cntrl:]]//g; my $tmpRef = $self->{tpp}->parse($answer); diff --git a/lib/FusionInventory/Agent/SOAP/VMware/Host.pm b/lib/FusionInventory/Agent/SOAP/VMware/Host.pm index e1ff090d2e..ecbd8993c0 100644 --- a/lib/FusionInventory/Agent/SOAP/VMware/Host.pm +++ b/lib/FusionInventory/Agent/SOAP/VMware/Host.pm @@ -47,31 +47,36 @@ sub getBiosInfo { my $hardware = $self->{hash}[0]{hardware}; my $biosInfo = $hardware->{biosInfo}; my $systemInfo = $hardware->{systemInfo}; - my $ssn; return unless ref($biosInfo) eq 'HASH'; - my $identifierValue; + my $bios = { + BDATE => $biosInfo->{releaseDate}, + BVERSION => $biosInfo->{biosVersion}, + SMODEL => $systemInfo->{model}, + SMANUFACTURER => $systemInfo->{vendor} + }; + if (ref($systemInfo->{otherIdentifyingInfo}) eq 'HASH') { - $identifierValue = $systemInfo->{otherIdentifyingInfo}->{identifierValue}; + $bios->{ASSETTAG} = $systemInfo->{otherIdentifyingInfo}->{identifierValue}; } elsif (ref($systemInfo->{otherIdentifyingInfo}) eq 'ARRAY') { foreach (@{$systemInfo->{otherIdentifyingInfo}}) { if ($_->{identifierType}->{key} eq 'ServiceTag') { - $ssn = $_->{identifierValue}; - last; + # In the case we found more than one ServiceTag, assume there will be + # only two, the first being the chassis S/N, the second the system S/N + # This cover the case where the second is the lame board S/N + if ($bios->{SSN}) { + $bios->{MSN} = $bios->{SSN}; + } + $bios->{SSN} = $_->{identifierValue}; + } elsif ($_->{identifierType}->{key} eq 'AssetTag') { + $bios->{ASSETTAG} = $_->{identifierValue}; } } } - return { - BDATE => $biosInfo->{releaseDate}, - BVERSION => $biosInfo->{biosVersion}, - SMODEL => $systemInfo->{model}, - SMANUFACTURER => $systemInfo->{vendor}, - ASSETTAG => $identifierValue, - SSN => $ssn - }; + return $bios; } sub getHardwareInfo { @@ -107,12 +112,14 @@ sub getCPUs { my $totalCore = $hardware->{cpuInfo}{numCpuCores}; my $totalThread = $hardware->{cpuInfo}{numCpuThreads}; my $cpuEntries = $hardware->{cpuPkg}; + my $cpuPackages = $hardware->{cpuInfo}{numCpuPackages} || + scalar(_asArray($cpuEntries)); my @cpus; foreach (_asArray($cpuEntries)) { push @cpus, { - CORE => $totalCore / _asArray($cpuEntries), + CORE => eval { $totalCore / $cpuPackages }, MANUFACTURER => $cpuManufacturor{ $_->{vendor} } || $_->{vendor}, NAME => $_->{description}, SPEED => int( $_->{hz} / ( 1000 * 1000 ) ), diff --git a/lib/FusionInventory/Agent/Target/Scheduler.pm b/lib/FusionInventory/Agent/Target/Scheduler.pm index 7c063725d0..d3eafceb5f 100644 --- a/lib/FusionInventory/Agent/Target/Scheduler.pm +++ b/lib/FusionInventory/Agent/Target/Scheduler.pm @@ -16,7 +16,7 @@ sub new { my $self = $class->SUPER::new(%params); $self->{storage} = $params{storage}; - $self->{name} = 'scheduler' . $count++, + $self->{id} = 'scheduler' . $count++; # handle persistent state $self->_loadState(); @@ -32,7 +32,7 @@ sub new { sub getName { my ($self) = @_; - return $self->{name}; + return $self->{id}; } sub getType { @@ -44,14 +44,21 @@ sub getType { sub plannedTasks { my $self = shift @_; - # Keep only Maintenance as local task + # Keep only Maintenance as local task, but keep others if (@_) { $self->{tasks} = [ grep { $_ =~ /^Maintenance$/i } @_ ]; + $self->{others} = [ grep { $_ !~ /^Maintenance$/i } @_ ]; } return @{$self->{tasks} || []}; } +sub otherTasks { + my $self = shift @_; + + return @{$self->{others} || []}; +} + sub _loadState { my ($self) = @_; diff --git a/lib/FusionInventory/Agent/Task/Collect/Version.pm b/lib/FusionInventory/Agent/Task/Collect/Version.pm index 2cf194cdc0..cb43251f02 100644 --- a/lib/FusionInventory/Agent/Task/Collect/Version.pm +++ b/lib/FusionInventory/Agent/Task/Collect/Version.pm @@ -3,6 +3,6 @@ package FusionInventory::Agent::Task::Collect::Version; use strict; use warnings; -use constant VERSION => "2.4.0"; +use constant VERSION => "2.5"; 1; diff --git a/lib/FusionInventory/Agent/Task/Deploy.pm b/lib/FusionInventory/Agent/Task/Deploy.pm index 59167e1504..79c8fd5b11 100644 --- a/lib/FusionInventory/Agent/Task/Deploy.pm +++ b/lib/FusionInventory/Agent/Task/Deploy.pm @@ -124,6 +124,7 @@ sub processRemote { sha512 => $sha512, data => $answer->{associatedFiles}{$sha512}, datastore => $datastore, + prolog => $self->{target}->getMaxDelay(), logger => $logger ); } @@ -200,6 +201,9 @@ sub processRemote { msg => $file->{name}.' already downloaded' ); + # Reset retention time for all still downloaded parts + $file->resetPartFilePaths(); + $workdir->addFile($file); next; } @@ -212,6 +216,9 @@ sub processRemote { $file->download(); + # Reset retention time for all downloaded parts + $file->resetPartFilePaths(); + # Are all the fileparts here? my $downloadIsOK = $file->filePartsExists(); @@ -359,6 +366,12 @@ sub processRemote { $logger->debug2("Finished job $job->{uuid}..."); + # When success and finished, we can still cleanup file in private + # cache when retention duration is not set + foreach my $file ( @{ $job->{associatedFiles} } ) { + $file->cleanup_private(); + } + $job->currentStep('end'); $job->setStatus( status => 'ok', diff --git a/lib/FusionInventory/Agent/Task/Deploy/CheckProcessor/WinKeyNotEquals.pm b/lib/FusionInventory/Agent/Task/Deploy/CheckProcessor/WinKeyNotEquals.pm index 396f4ebfbe..e9b896aca2 100644 --- a/lib/FusionInventory/Agent/Task/Deploy/CheckProcessor/WinKeyNotEquals.pm +++ b/lib/FusionInventory/Agent/Task/Deploy/CheckProcessor/WinKeyNotEquals.pm @@ -47,7 +47,7 @@ sub success { my $parent_key = FusionInventory::Agent::Tools::Win32::getRegistryKey( path => $parent ); - return 0 unless (defined($parent_key)); + return 1 unless (defined($parent_key)); my @regValue = $parent_key->GetValue($key); @@ -56,7 +56,7 @@ sub success { } else { $self->on_failure("missing registry value: ".$self->{path}); } - return 0 unless (@regValue); + return 1 unless (@regValue); # We need to convert values as string while checking a DWORD value my ($regValue, $regType ) = @regValue; diff --git a/lib/FusionInventory/Agent/Task/Deploy/File.pm b/lib/FusionInventory/Agent/Task/Deploy/File.pm index ab05ed1ad6..2df457e868 100644 --- a/lib/FusionInventory/Agent/Task/Deploy/File.pm +++ b/lib/FusionInventory/Agent/Task/Deploy/File.pm @@ -18,7 +18,8 @@ sub new { my $self = { p2p => $params{data}->{p2p}, - retention_duration => $params{data}->{'p2p-retention-duration'} || 60 * 24 * 3, + retention_duration => $params{data}->{'p2p-retention-duration'}, + prolog_delay => $params{prolog} || 3600, uncompress => $params{data}->{uncompress}, mirrors => $params{data}->{mirrors}, multiparts => $params{data}->{multiparts}, @@ -29,45 +30,114 @@ sub new { logger => $params{logger} }; + # p2p-retention-duration has a different meaning if not a p2p file + if (!$self->{retention_duration}) { + if ($self->{p2p}) { + # For p2p file, keep downloaded parts 3 days by default + $self->{retention_duration} = 60 * 24 * 3; + } else { + # For not p2p file, we will keep downloaded parts as long as + # we need them: 3 times the PROLOG delay to support download + # restart in case of network failure + $self->{retention_duration} = 0; + } + } + bless $self, $class; return $self; } -sub getPartFilePath { +sub normalizedPartFilePath { my ($self, $sha512) = @_; return unless $sha512 =~ /^(.)(.)(.{6})/; my $subFilePath = $1.'/'.$2.'/'.$3; - my @storageDirs = - File::Glob::bsd_glob($self->{datastore}->{path}.'/fileparts/shared/*'), - File::Glob::bsd_glob($self->{datastore}->{path}.'/fileparts/private/*'); - - foreach my $dir (@storageDirs) { - if (-f $dir.'/'.$subFilePath) { - return $dir.'/'.$subFilePath; - } - } - my $filePath = $self->{datastore}->{path}.'/fileparts/'; -# filepart not found + my $retention_duration; if ($self->{p2p}) { $filePath .= 'shared/'; + $retention_duration = $self->{retention_duration} * 60; } else { $filePath .= 'private/'; + $retention_duration = $self->{retention_duration} ? + $self->{retention_duration} * 60 : $self->{prolog_delay} * 3; } -# Compute a directory name that will be used to know -# if the file must be purge. We don't want a new directory -# everytime, so we use a one minute time frame to follow the retention duration unit - my $expiration = time + (($self->{retention_duration}+1) * 60); + # Compute a directory name that will be used to know if the file must + # be purge. We don't want a new directory everytime, so we use a one + # minute time frame to follow the retention duration unit + my $expiration = time + $retention_duration + 60; my $retentiontime = $expiration - $expiration % 60 ; $filePath .= $retentiontime . '/' . $subFilePath; return $filePath; } +sub cleanup_private { + my ($self) = @_; + + # Don't cleanup for p2p shared parts + return if $self->{p2p}; + + # Only cleanup if no retention duration has been set + return if $self->{retention_duration}; + + # Cleanup all parts + foreach my $sha512 (@{$self->{multiparts}}) { + my $path = $self->getPartFilePath($sha512); + unlink $path if -f $path; + } + + # This may leave an empty folder tree, but it will be cleaned by + # Maintenance task when convenient +} + +sub resetPartFilePaths { + my ($self) = @_; + + # move all Part files to respect retention duration from now + my %updates = (); + + foreach my $sha512 (@{$self->{multiparts}}) { + my $path = $self->getPartFilePath($sha512); + if (-f $path) { + my $update = $self->normalizedPartFilePath($sha512); + next if $path eq $update; + $updates{$path} = $update ; + } + } + + foreach my $path (keys(%updates)) { + File::Path::mkpath(dirname($updates{$path})); + rename $path, $updates{$path}; + } + + # This may leave an empty folder tree, but it will be cleaned by + # Maintenance task when convenient +} + +sub getPartFilePath { + my ($self, $sha512) = @_; + + return unless $sha512 =~ /^(.)(.)(.{6})/; + my $subFilePath = $1.'/'.$2.'/'.$3; + + my @storageDirs = ( + File::Glob::bsd_glob($self->{datastore}->{path}.'/fileparts/shared/*'), + File::Glob::bsd_glob($self->{datastore}->{path}.'/fileparts/private/*') + ); + + foreach my $dir (@storageDirs) { + if (-f $dir.'/'.$subFilePath) { + return $dir.'/'.$subFilePath; + } + } + + return $self->normalizedPartFilePath($sha512); +} + sub download { my ($self) = @_; @@ -117,7 +187,7 @@ sub download { } # Update filepath so retention is kept in the future on long search if ( time - $nextPathUpdate > 0 ) { - $path = $self->getPartFilePath($sha512); + $path = $self->normalizedPartFilePath($sha512); $nextPathUpdate = _getNextPathUpdateTime(); } } @@ -128,7 +198,7 @@ sub download { next PART if $success; # Update filepath so retention is kept in the future on long search if ( time - $nextPathUpdate > 0 ) { - $path = $self->getPartFilePath($sha512); + $path = $self->normalizedPartFilePath($sha512); $nextPathUpdate = _getNextPathUpdateTime(); } } diff --git a/lib/FusionInventory/Agent/Task/Deploy/Job.pm b/lib/FusionInventory/Agent/Task/Deploy/Job.pm index 148ad24fc9..987429ccab 100644 --- a/lib/FusionInventory/Agent/Task/Deploy/Job.pm +++ b/lib/FusionInventory/Agent/Task/Deploy/Job.pm @@ -103,7 +103,7 @@ sub skip_on_check_failure { my $name = $check->name(); my $checkStatus = $check->process(); - if ($checkStatus =~ /^abort|error|ko|skip$/) { + if ($checkStatus =~ /^abort|error|ko|skip|startnow$/) { $logger->info("Skipping $level because $name check #$checknum failed") if $logger; if ($check->is("skip")) { @@ -117,6 +117,19 @@ sub skip_on_check_failure { status => 'ok', msg => "$level skipped", ); + } elsif ($check->is("startnow")) { + $self->setStatus( + status => 'ok', + msg => "check #$checknum, $name not successful then start $level now", + checknum => $checknum-1 + ); + + $self->setStatus( + status => 'ok', + msg => "$level started now", + ); + # Shortcut other checks telling the job is not to be skipped + return 0; } else { $self->setStatus( status => 'ko', diff --git a/lib/FusionInventory/Agent/Task/Deploy/Maintenance.pm b/lib/FusionInventory/Agent/Task/Deploy/Maintenance.pm new file mode 100644 index 0000000000..eb34ea4b99 --- /dev/null +++ b/lib/FusionInventory/Agent/Task/Deploy/Maintenance.pm @@ -0,0 +1,78 @@ +package FusionInventory::Agent::Task::Deploy::Maintenance; + +use strict; +use warnings; + +use FusionInventory::Agent::Logger; +use FusionInventory::Agent::Storage; +use FusionInventory::Agent::Task::Deploy::Datastore; + +sub new { + my ($class, %params) = @_; + + die 'no target parameter\n' unless $params{target}; + die 'no config parameter\n' unless $params{config}; + + my $self = { + logger => $params{logger} || + FusionInventory::Agent::Logger->new(), + config => $params{config}, + target => $params{target}, + }; + bless $self, $class; + + return $self; +} + +sub doMaintenance { + my ($self) = @_; + + my $folder = $self->{target}->getStorage()->getDirectory() + or return; + + $folder .= '/deploy'; + return unless -d $folder; + + my $datastore = FusionInventory::Agent::Task::Deploy::Datastore->new( + config => $self->{config}, + path => $folder, + logger => $self->{logger} + ); + + $datastore->cleanUp( force => $datastore->diskIsFull() ); +} + +1; + +__END__ + +=head1 NAME + +FusionInventory::Agent::Task::Deploy::Maintenance - Maintenance for Deploy task + +=head1 DESCRIPTION + +This module provides the Maintenance run function to cleanup Deploy environment. + +=head1 FUNCTIONS + +=head2 new(%params) + +The constructor. The following parameters are allowed, as keys of the %params +hash: + +=over + +=item I + +the logger object to use (default: a new stderr logger) + +=item I + +=item I + +=back + +=head2 doMaintenance() + +Cleanup the deploy datastore associated with the target. diff --git a/lib/FusionInventory/Agent/Task/Deploy/Version.pm b/lib/FusionInventory/Agent/Task/Deploy/Version.pm index 0e2def2ad1..32a2bd76eb 100644 --- a/lib/FusionInventory/Agent/Task/Deploy/Version.pm +++ b/lib/FusionInventory/Agent/Task/Deploy/Version.pm @@ -3,6 +3,6 @@ package FusionInventory::Agent::Task::Deploy::Version; use strict; use warnings; -use constant VERSION => "2.6"; +use constant VERSION => "2.7"; 1; diff --git a/lib/FusionInventory/Agent/Task/ESX/Version.pm b/lib/FusionInventory/Agent/Task/ESX/Version.pm index 7fe0fd1f43..f3e0e10b72 100644 --- a/lib/FusionInventory/Agent/Task/ESX/Version.pm +++ b/lib/FusionInventory/Agent/Task/ESX/Version.pm @@ -3,6 +3,6 @@ package FusionInventory::Agent::Task::ESX::Version; use strict; use warnings; -use constant VERSION => "2.3"; +use constant VERSION => "2.4"; 1; diff --git a/lib/FusionInventory/Agent/Task/Inventory/AIX/LVM.pm b/lib/FusionInventory/Agent/Task/Inventory/AIX/LVM.pm index 979917d944..6a223ebcd3 100644 --- a/lib/FusionInventory/Agent/Task/Inventory/AIX/LVM.pm +++ b/lib/FusionInventory/Agent/Task/Inventory/AIX/LVM.pm @@ -87,7 +87,7 @@ sub _getLogicalVolume { $volume->{SEG_COUNT} = $1; } if ($line =~ /^TYPE:\s+(\S+)/) { - $volume->{ATTR} = "Type $1", + $volume->{ATTR} = "Type $1"; } } close $handle; diff --git a/lib/FusionInventory/Agent/Task/Inventory/Generic/SSH.pm b/lib/FusionInventory/Agent/Task/Inventory/Generic/SSH.pm index 3238707fa4..8d337d1518 100644 --- a/lib/FusionInventory/Agent/Task/Inventory/Generic/SSH.pm +++ b/lib/FusionInventory/Agent/Task/Inventory/Generic/SSH.pm @@ -16,10 +16,21 @@ sub doInventory { my $inventory = $params{inventory}; + my $port; + my $command = "ssh-keyscan"; + if (-e '/etc/ssh/sshd_config') { + foreach my $line (getAllLines( file => '/etc/ssh/sshd_config' )) { + next unless $line =~ /^Port\s+(\d+)/; + $port = $1; + } + } + $command .= " -p $port" if $port; + # Use a 1 second timeout instead of default 5 seconds as this is still # large enough for loopback ssh pubkey scan. + $command .= ' -T 1 127.0.0.1'; my $ssh_key = getFirstMatch( - command => 'ssh-keyscan -T 1 127.0.0.1', + command => $command, pattern => qr/^[^#]\S+\s(ssh.*)/, @_, ); diff --git a/lib/FusionInventory/Agent/Task/Inventory/Generic/Softwares/Pacman.pm b/lib/FusionInventory/Agent/Task/Inventory/Generic/Softwares/Pacman.pm index 8b1b10783c..b96cc00a83 100644 --- a/lib/FusionInventory/Agent/Task/Inventory/Generic/Softwares/Pacman.pm +++ b/lib/FusionInventory/Agent/Task/Inventory/Generic/Softwares/Pacman.pm @@ -17,26 +17,74 @@ sub doInventory { my $inventory = $params{inventory}; my $logger = $params{logger}; - my $handle = getFileHandle( + my $packages = _getPackagesList( logger => $logger, - command => 'pacman -Q' + command => 'pacman -Qqi' ); + return unless $packages; + + foreach my $package (@$packages) { + $inventory->addEntry( + section => 'SOFTWARES', + entry => $package + ); + } +} + +sub _getPackagesList { + my $handle = getFileHandle(@_); return unless $handle; + my @packages; + my $package; + my $index = 1; + my %months = map { $_ => $index ++ } qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec); + while (my $line = <$handle>) { - next unless $line =~ /^(\S+)\s+(\S+)/; - my $name = $1; - my $version = $2; + chomp $line; + next unless $line; + next unless $line =~ /^(\S[^:]*):\s*(.*)$/; - $inventory->addEntry( - section => 'SOFTWARES', - entry => { - NAME => $name, - VERSION => $version + my $key = $1; + my $value = $2; + $key =~ s/\s+$//; + + if ($key eq 'Name') { + push @packages, $package + if $package; + $package = { + NAME => $value + }; + } elsif ($key eq 'Version' && $value) { + $value =~ s/^\d+://; + $package->{VERSION} = $value; + } elsif ($key eq 'Description' && $value) { + $package->{COMMENTS} = $value; + } elsif ($key eq 'Architecture' && $value) { + $package->{ARCH} = $value; + } elsif ($key eq 'Install Date' && $value) { + my ($month, $day, $year) = $value =~ /^\w+\s+(\w+)\s+(\d+)\s+[\d:]+\s+(\d+)$/; + next unless $month && $months{$month}; + $package->{INSTALLDATE} = sprintf("%d/%02d/%d", $day, $months{$month}, $year); + } elsif ($key eq 'Installed Size' && $value) { + if ($value =~ /^([\d.]+)\s+(\w+)$/) { + my $size = $2 eq 'KiB' ? $1 * 1024 : + $2 eq 'MiB' ? $1 * 1048576 : + $2 eq 'GiB' ? $1 * 1073741824 : + $1; + $package->{FILESIZE} = int($size); } - ); + } elsif ($key eq 'Groups' && $value && $value ne 'None') { + $package->{SYSTEM_CATEGORY} = join(',', split(/\s+/,$value)); + } } close $handle; + + # Add last software + push @packages, $package + if $package; + + return \@packages; } 1; diff --git a/lib/FusionInventory/Agent/Task/Inventory/MacOS.pm b/lib/FusionInventory/Agent/Task/Inventory/MacOS.pm index 6e531987ad..586d8972b3 100644 --- a/lib/FusionInventory/Agent/Task/Inventory/MacOS.pm +++ b/lib/FusionInventory/Agent/Task/Inventory/MacOS.pm @@ -10,6 +10,8 @@ use English qw(-no_match_vars); use FusionInventory::Agent::Tools; use FusionInventory::Agent::Tools::MacOS; +our $runAfter = ["FusionInventory::Agent::Task::Inventory::Generic"]; + sub isEnabled { return $OSNAME eq 'darwin'; } @@ -23,6 +25,7 @@ sub doInventory { # basic operating system informations my $kernelVersion = getFirstLine(command => 'uname -v'); my $kernelRelease = getFirstLine(command => 'uname -r'); + my $kernelArch = getFirstLine(command => 'uname -m'); my ($name, $version); my $infos = getSystemProfilerInfos(type => 'SPSoftwareDataType', logger => $logger); @@ -48,6 +51,7 @@ sub doInventory { FULL_NAME => $name, VERSION => $version, KERNEL_VERSION => $kernelRelease, + ARCH => $kernelArch, BOOT_TIME => getFormatedLocalTime($boottime) }); } diff --git a/lib/FusionInventory/Agent/Task/Inventory/MacOS/Videos.pm b/lib/FusionInventory/Agent/Task/Inventory/MacOS/Videos.pm index 0b6382f73f..68104c839e 100644 --- a/lib/FusionInventory/Agent/Task/Inventory/MacOS/Videos.pm +++ b/lib/FusionInventory/Agent/Task/Inventory/MacOS/Videos.pm @@ -51,6 +51,17 @@ sub _getDisplays { foreach my $videoName (keys %{$infos->{'Graphics/Displays'}}) { my $videoCardInfo = $infos->{'Graphics/Displays'}->{$videoName}; + + my $memory = $videoCardInfo->{'VRAM (Total)'} || + $videoCardInfo->{'VRAM (Dynamic, Max)'}; + $memory =~ s/\ .*//g if $memory; + + my $video = { + CHIPSET => $videoCardInfo->{'Chipset Model'}, + MEMORY => $memory, + NAME => $videoName + }; + foreach my $displayName (keys %{$videoCardInfo->{Displays}}) { next if $displayName eq 'Display Connector'; next if $displayName eq 'Display'; @@ -58,31 +69,33 @@ sub _getDisplays { my $resolution = $displayInfo->{Resolution}; if ($resolution) { - $resolution =~ s/\ //g; - $resolution =~ s/\@.*//g; + my ($x,$y) = $resolution =~ /(\d+) *x *(\d+)/; + $resolution = $x.'x'.$y if $x && $y; } - my $memory = $videoCardInfo->{'VRAM (Total)'}; - $memory =~ s/\ .*//g if $memory; - - push @videos, { - CHIPSET => $videoCardInfo->{'Chipset Model'}, - MEMORY => $memory, - NAME => $videoName, - RESOLUTION => $resolution, - PCISLOT => $videoCardInfo->{Slot} - }; - my $monitor = { - CAPTION => $displayName, - DESCRIPTION => $displayName, + CAPTION => $displayName }; my $serial = getSanitizedString($displayInfo->{'Display Serial Number'}); $monitor->{SERIAL} = $serial if $serial; + my $description = getSanitizedString($displayInfo->{'Display Type'}); + $monitor->{DESCRIPTION} = $description if $description; + push @monitors, $monitor; + + # Set first found resolution on associated video card + $video->{RESOLUTION} = $resolution + if $resolution && !$video->{RESOLUTION}; } + + $video->{PCISLOT} = $videoCardInfo->{Bus} + if defined($videoCardInfo->{Bus}); + $video->{PCISLOT} = $videoCardInfo->{Slot} + if defined($videoCardInfo->{Slot}); + + push @videos, $video; } return ( diff --git a/lib/FusionInventory/Agent/Task/Inventory/Version.pm b/lib/FusionInventory/Agent/Task/Inventory/Version.pm index 933981dadd..73e316cdd2 100644 --- a/lib/FusionInventory/Agent/Task/Inventory/Version.pm +++ b/lib/FusionInventory/Agent/Task/Inventory/Version.pm @@ -3,6 +3,6 @@ package FusionInventory::Agent::Task::Inventory::Version; use strict; use warnings; -use constant VERSION => "1.4"; +use constant VERSION => "1.5"; 1; diff --git a/lib/FusionInventory/Agent/Task/Inventory/Win32/AntiVirus.pm b/lib/FusionInventory/Agent/Task/Inventory/Win32/AntiVirus.pm index 2928c4f898..6d53e9976a 100644 --- a/lib/FusionInventory/Agent/Task/Inventory/Win32/AntiVirus.pm +++ b/lib/FusionInventory/Agent/Task/Inventory/Win32/AntiVirus.pm @@ -5,6 +5,8 @@ use warnings; use parent 'FusionInventory::Agent::Task::Inventory::Module'; +use UNIVERSAL::require; + use FusionInventory::Agent::Tools; use FusionInventory::Agent::Tools::Win32; @@ -51,11 +53,12 @@ sub doInventory { }; if ($object->{productState}) { - my $bin = sprintf( "%b\n", $object->{productState}); -# http://blogs.msdn.com/b/alejacma/archive/2008/05/12/how-to-get-antivirus-information-with-wmi-vbscript.aspx?PageIndex=2#comments - if ($bin =~ /(\d)\d{5}(\d)\d{6}(\d)\d{5}$/) { - $antivirus->{UPTODATE} = $1 || $2; - $antivirus->{ENABLED} = $3 ? 0 : 1; + my $hex = dec2hex($object->{productState}); + # See http://neophob.com/2010/03/wmi-query-windows-securitycenter2/ + my ($enabled, $uptodate) = $hex =~ /(.{2})(.{2})$/; + if (defined($enabled) && defined($uptodate)) { + $antivirus->{ENABLED} = $enabled =~ /^1.$/ ? 1 : 0; + $antivirus->{UPTODATE} = $uptodate =~ /^00$/ ? 1 : 0; } } @@ -64,11 +67,27 @@ sub doInventory { my ($defender) = getWMIObjects( moniker => 'winmgmts://./root/microsoft/windows/defender', class => "MSFT_MpComputerStatus", - properties => [ qw/AMProductVersion AntivirusEnabled/ ] + properties => [ qw/AMProductVersion AntivirusEnabled + AntivirusSignatureVersion/ ] ); - $antivirus->{VERSION} = $defender->{AMProductVersion} - if ($defender && $defender->{AntivirusEnabled} && $defender->{AMProductVersion}); + if ($defender) { + $antivirus->{VERSION} = $defender->{AMProductVersion} + if $defender->{AMProductVersion}; + $antivirus->{ENABLED} = $defender->{AntivirusEnabled} + if (defined($defender->{AntivirusEnabled})); + $antivirus->{BASE_VERSION} = $defender->{AntivirusSignatureVersion} + if $defender->{AntivirusSignatureVersion}; + } $antivirus->{COMPANY} = "Microsoft Corporation"; + # Finally try registry for base version + if (!$antivirus->{BASE_VERSION}) { + $defender = _getSoftwareRegistryKeys( + 'Microsoft/Windows Defender/Signature Updates', + [ 'AVSignatureVersion' ] + ); + $antivirus->{BASE_VERSION} = $defender->{'/AVSignatureVersion'} + if $defender && $defender->{'/AVSignatureVersion'}; + } } # Finally try to get version from software installation in registry @@ -85,10 +104,19 @@ sub doInventory { # avoid duplicates next if $seen->{$antivirus->{NAME}}->{$antivirus->{VERSION}||'_undef_'}++; - # McAfee data + # Check for other product datas for update if ($antivirus->{NAME} =~ /McAfee/i) { - my $info = _getMcAfeeInfo(); - $antivirus->{$_} = $info->{$_} foreach keys %$info; + _setMcAfeeInfos($antivirus); + } elsif ($antivirus->{NAME} =~ /Kaspersky/i) { + _setKasperskyInfos($antivirus); + } elsif ($antivirus->{NAME} =~ /ESET/i) { + _setESETInfos($antivirus); + } elsif ($antivirus->{NAME} =~ /Avira/i) { + _setAviraInfos($antivirus); + } elsif ($antivirus->{NAME} =~ /Security Essentials/i) { + _setMSEssentialsInfos($antivirus); + } elsif ($antivirus->{NAME} =~ /F-Secure/i) { + _setFSecureInfos($antivirus); } $inventory->addEntry( @@ -104,81 +132,219 @@ sub _getAntivirusUninstall { return unless $name; - my ($regUninstall, $AVRegUninstall); + # Cleanup name from localized chars to keep a clean regex pattern + my ($pattern) = $name =~ /^([a-zA-Z0-9 ._-]+)/ + or return; + # Escape dot in pattern + $pattern =~ s/\./\\./g; + my $match = qr/^$pattern/i; + + return _getSoftwareRegistryKeys( + 'Microsoft/Windows/CurrentVersion/Uninstall', + [ 'DisplayName', 'DisplayVersion', 'Publisher' ], + sub { + my ($registry) = @_; + return first { + $_->{"/DisplayName"} && $_->{"/DisplayName"} =~ $match; + } values(%{$registry}); + } + ); +} - if (is64bit()) { - $regUninstall = getRegistryKey( - path => 'HKEY_LOCAL_MACHINE/SOFTWARE/Wow6432Node/Microsoft/Windows/CurrentVersion/Uninstall', - ); - $AVRegUninstall = first { - $_->{"/DisplayName"} && $_->{"/DisplayName"} =~ /$name/i; - } values(%{$regUninstall}); - } +sub _setMcAfeeInfos { + my ($antivirus) = @_; - if (!$AVRegUninstall) { - $regUninstall = getRegistryKey( - path => 'HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Uninstall', - ); - $AVRegUninstall = first { - $_->{"/DisplayName"} && $_->{"/DisplayName"} =~ /$name/i; - } values(%{$regUninstall}); - } + my %properties = ( + 'BASE_VERSION' => [ 'AVDatVersion', 'AVDatVersionMinor' ], + '32ENGINE_VERSION' => [ 'EngineVersion32Major', 'EngineVersion32Minor' ], + '64ENGINE_VERSION' => [ 'EngineVersionMajor', 'EngineVersionMinor' ], + ); + + my $regvalues = [ map { @{$_} } values(%properties) ]; - return $AVRegUninstall; + my $macafeeReg = _getSoftwareRegistryKeys('McAfee/AVEngine', $regvalues) + or return; + + # major.minor versions properties + foreach my $property (keys %properties) { + my $keys = $properties{$property}; + my $major = $macafeeReg->{'/' . $keys->[0]}; + my $minor = $macafeeReg->{'/' . $keys->[1]}; + $antivirus->{$property} = sprintf("%04d.%04d", hex2dec($major), hex2dec($minor)) + if defined $major && defined $minor; + } } -sub _getMcAfeeInfo { +sub _setKasperskyInfos { + my ($antivirus) = @_; - my %properties = ( - DATFILEVERSION => [ 'AVDatVersion', 'AVDatVersionMinor' ], - ENGINEVERSION32 => [ 'EngineVersion32Major', 'EngineVersion32Minor' ], - ENGINEVERSION64 => [ 'EngineVersionMajor', 'EngineVersionMinor' ], - ); + my $regvalues = [ qw(LastSuccessfulUpdate LicKeyType LicDaysTillExpiration) ]; - my $regvalues = [ 'AVDatDate', map { @{$_} } values(%properties) ]; + my $kasperskyReg = _getSoftwareRegistryKeys('KasperskyLab\protected', $regvalues) + or return; - my ($info, $macafeeReg); + my $found = first { + $_->{"Data/"} && $_->{"Data/"}->{"/LastSuccessfulUpdate"} + } values(%{$kasperskyReg}); - if (is64bit()) { - $macafeeReg = getRegistryKey( - path => 'HKEY_LOCAL_MACHINE/SOFTWARE/Wow6432Node/McAfee/AVEngine', - wmiopts => { # Only used for remote WMI optimization - values => $regvalues + if ($found) { + my $lastupdate = hex2dec($found->{"Data/"}->{"/LastSuccessfulUpdate"}); + if ($lastupdate && $lastupdate != 0xFFFFFFFF) { + my @date = localtime($lastupdate); + # Format BASE_VERSION as YYYYMMDD + $antivirus->{BASE_VERSION} = sprintf( + "%04d%02d%02d",$date[5]+1900,$date[4]+1,$date[3]); + } + # Set expiration date only if we found a licence key type + my $keytype = hex2dec($found->{"Data/"}->{"/LicKeyType"}); + if ($keytype) { + my $expiration = hex2dec($found->{"Data/"}->{"/LicDaysTillExpiration"}); + if (defined($expiration)) { + my @date = localtime(time+86400*$expiration); + $antivirus->{EXPIRATION} = sprintf( + "%02d/%02d/%04d",$date[3],$date[4]+1,$date[5]+1900); } - ); + } } +} - if (!$macafeeReg) { - $macafeeReg = getRegistryKey( - path => 'HKEY_LOCAL_MACHINE/SOFTWARE/McAfee/AVEngine', - wmiopts => { # Only used for remote WMI optimization - values => $regvalues - } - ); +sub _setESETInfos { + my ($antivirus) = @_; + + my $esetReg = _getSoftwareRegistryKeys( + 'ESET\ESET Security\CurrentVersion\Info', + [ qw(ProductVersion ScannerVersion) ] + ); + return unless $esetReg; + + unless ($antivirus->{VERSION}) { + $antivirus->{VERSION} = $esetReg->{"/ProductVersion"} + if $esetReg->{"/ProductVersion"}; } - return unless $macafeeReg; + $antivirus->{BASE_VERSION} = $esetReg->{"/ScannerVersion"} + if $esetReg->{"/ScannerVersion"}; +} - # major.minor versions properties - foreach my $property (keys %properties) { - my $keys = $properties{$property}; - my $major = $macafeeReg->{'/' . $keys->[0]}; - my $minor = $macafeeReg->{'/' . $keys->[1]}; - $info->{$property} = sprintf("%04d.%04d", hex2dec($major), hex2dec($minor)) - if defined $major && defined $major; +sub _setAviraInfos { + my ($antivirus) = @_; + + my ($aviraInfos) = getWMIObjects( + moniker => 'winmgmts://./root/CIMV2/Applications/Avira_AntiVir', + class => "License_Info", + properties => [ qw/License_Expiration/ ] + ); + if($aviraInfos && $aviraInfos->{License_Expiration}) { + my ($expiration) = $aviraInfos->{License_Expiration} =~ /^(\d+\.\d+\.\d+)/; + if ($expiration) { + $expiration =~ s/\./\//g; + $antivirus->{EXPIRATION} = $expiration; + } } - # file creation date property - if ($macafeeReg->{'/AVDatDate'}) { - my $datFileCreation = encodeFromRegistry($macafeeReg->{'/AVDatDate'}); - # from YYYY/MM/DD to DD/MM/YYYY - if ($datFileCreation =~ /(\d\d\d\d)\/(\d\d)\/(\d\d)/) { - $datFileCreation = join( '/', ($3, $2, $1) ); + my $aviraReg = _getSoftwareRegistryKeys( + 'Avira/Antivirus', + [ qw(VdfVersion) ] + ); + return unless $aviraReg; + + $antivirus->{BASE_VERSION} = $aviraReg->{"/VdfVersion"} + if $aviraReg->{"/VdfVersion"}; +} + +sub _setMSEssentialsInfos { + my ($antivirus) = @_; + + my $mseReg = _getSoftwareRegistryKeys( + 'Microsoft\Microsoft Antimalware\Signature Updates', + [ 'AVSignatureVersion' ] + ); + return unless $mseReg; + + $antivirus->{BASE_VERSION} = $mseReg->{"/AVSignatureVersion"} + if $mseReg->{"/AVSignatureVersion"}; +} + +sub _setFSecureInfos { + my ($antivirus) = @_; + + my $fsecReg = _getSoftwareRegistryKeys( + 'F-Secure\Ultralight\Updates\aquarius', + [ qw(file_set_visible_version) ] + ); + return unless $fsecReg; + + my $found = first { $_->{"/file_set_visible_version"} } values(%{$fsecReg}); + + $antivirus->{BASE_VERSION} = $found->{"/file_set_visible_version"} + if $found->{"/file_set_visible_version"}; + + # Try to find license "expiry_date" from a specific json file + $fsecReg = _getSoftwareRegistryKeys( + 'F-Secure\CCF\DLLHoster\100\Plugins\CosmosService', + [ qw(DataPath) ] + ); + return unless $fsecReg; + + my $path = $fsecReg->{"/DataPath"}; + return unless $path && -d $path; + + # This is the full path for the expected json file + $path .= "\\safe.S-1-5-18.local.cosmos"; + return unless -f $path; + + my $infos = getAllLines(file => $path); + return unless $infos; + + JSON::PP->require(); + my @licenses; + eval { + $infos = JSON::PP::decode_json($infos); + @licenses = @{$infos->{local}->{windows}->{secl}->{subscription}->{license_table}}; + }; + return unless @licenses; + + my $expiry_date; + # In the case more than one license is found, assume we need the one with appid=2 + foreach my $license (@licenses) { + $expiry_date = $license->{expiry_date} + if $license->{expiry_date}; + last if $expiry_date && $license->{appid} && $license->{appid} == 2; + } + return unless $expiry_date; + + my @date = localtime($expiry_date); + $antivirus->{EXPIRATION} = sprintf("%02d/%02d/%04d",$date[3],$date[4]+1,$date[5]+1900); +} + +sub _getSoftwareRegistryKeys { + my ($base, $values, $callback) = @_; + + my $reg; + if (is64bit()) { + $reg = getRegistryKey( + path => 'HKEY_LOCAL_MACHINE/SOFTWARE/Wow6432Node/'.$base, + wmiopts => { # Only used for remote WMI optimization + values => $values + } + ); + if ($reg) { + if ($callback) { + my $filter = &{$callback}($reg); + return $filter if $filter; + } else { + return $reg; + } } - $info->{DATFILECREATION} = $datFileCreation; } - return $info; + $reg = getRegistryKey( + path => 'HKEY_LOCAL_MACHINE/SOFTWARE/'.$base, + wmiopts => { # Only used for remote WMI optimization + values => $values + } + ); + return ($callback && $reg) ? &{$callback}($reg) : $reg; } 1; diff --git a/lib/FusionInventory/Agent/Task/Inventory/Win32/Drives.pm b/lib/FusionInventory/Agent/Task/Inventory/Win32/Drives.pm index 5829d9e138..fa3c830e29 100644 --- a/lib/FusionInventory/Agent/Task/Inventory/Win32/Drives.pm +++ b/lib/FusionInventory/Agent/Task/Inventory/Win32/Drives.pm @@ -47,7 +47,7 @@ sub doInventory { sub _getDrives { my (%params) = @_; - my $systemDrive; + my $systemDrive = "C:"; foreach my $object (getWMIObjects( class => 'Win32_OperatingSystem', properties => [ qw/SystemDrive/ ] diff --git a/lib/FusionInventory/Agent/Task/Inventory/Win32/Memory.pm b/lib/FusionInventory/Agent/Task/Inventory/Win32/Memory.pm index 7dc8a9cf68..e5d96bb6bc 100644 --- a/lib/FusionInventory/Agent/Task/Inventory/Win32/Memory.pm +++ b/lib/FusionInventory/Agent/Task/Inventory/Win32/Memory.pm @@ -136,7 +136,7 @@ sub _getMemories { foreach my $object (getWMIObjects( class => 'Win32_PhysicalMemoryArray', properties => [ qw/ - MemoryDevices SerialNumber PhysicalMemoryCorrection + MemoryDevices SerialNumber MemoryErrorCorrection / ] )) { @@ -145,14 +145,14 @@ sub _getMemories { $memory->{SERIALNUMBER} = $object->{SerialNumber}; } - if ($object->{PhysicalMemoryCorrection}) { + if ($object->{MemoryErrorCorrection}) { $memory->{MEMORYCORRECTION} = - $memoryErrorProtection[$object->{PhysicalMemoryCorrection}]; + $memoryErrorProtection[$object->{MemoryErrorCorrection}]; + if ($memory->{MEMORYCORRECTION} && $object->{MemoryErrorCorrection}>3) { + $memory->{DESCRIPTION} .= " (".$memory->{MEMORYCORRECTION}.")"; + } } - if ($memory->{MEMORYCORRECTION}) { - $memory->{DESCRIPTION} .= " (".$memory->{MEMORYCORRECTION}.")"; - } } return @memories; diff --git a/lib/FusionInventory/Agent/Task/Inventory/Win32/Softwares.pm b/lib/FusionInventory/Agent/Task/Inventory/Win32/Softwares.pm index 31815ed654..38331f1cf7 100644 --- a/lib/FusionInventory/Agent/Task/Inventory/Win32/Softwares.pm +++ b/lib/FusionInventory/Agent/Task/Inventory/Win32/Softwares.pm @@ -7,10 +7,14 @@ use parent 'FusionInventory::Agent::Task::Inventory::Module'; use English qw(-no_match_vars); use File::Basename; +use File::Temp; +use UNIVERSAL::require; +use Encode qw(decode); use FusionInventory::Agent::Tools; use FusionInventory::Agent::Tools::Win32; use FusionInventory::Agent::Tools::Win32::Constants; +use FusionInventory::Agent::Tools::Win32::LoadIndirectString; my $seen = {}; @@ -31,6 +35,7 @@ sub doInventory { my $inventory = $params{inventory}; my $logger = $params{logger}; + my $remotewmi = $inventory->getRemote(); my $is64bit = is64bit(); @@ -86,6 +91,14 @@ sub doInventory { _addSoftware(inventory => $inventory, entry => $hotfix); } + # Lookup for UWP/Windows Store packages (not supported by WMI task) + unless ($remotewmi) { + my $packages = _getAppxPackages( logger => $logger ) || []; + foreach my $package (@{$packages}) { + _addSoftware(inventory => $inventory, entry => $package); + } + } + # Reset seen hash so we can see softwares in later same run inventory $seen = {}; } @@ -404,4 +417,244 @@ sub _getSqlInstancesVersions { return $sqlinstanceVersions->{'/Edition'}; } +sub _getAppxPackages { + my (%params) = @_; + + return unless canRun('powershell'); + + XML::TreePP->require(); + + my $logger = $params{logger}; + + my @lines; + { + # Temp file will be deleted out of this scope + my $fh = File::Temp->new( + TEMPLATE => 'get-appxpackage-XXXXXX', + SUFFIX => '.ps1' + ); + print $fh ; + close($fh); + my $file = $fh->filename; + + return unless ($file && -f $file); + + @lines = getAllLines( + command => "powershell -NonInteractive -ExecutionPolicy ByPass -File $file", + %params + ); + } + + my ($list, $package); + my %manifest_mapping = qw( + DisplayName DISPLAYNAME + Description COMMENTS + PublisherDisplayName PUBLISHERDISPLAYNAME + ); + + foreach my $line (@lines) { + chomp($line); + + # Add package on empty line + if (!$line && $package && $package->{NAME}) { + push @{$list}, $package; + undef $package; + next; + } + + my ($key, $value) = $line =~ /^([A-Z_]+):\s*(.*)\s*$/; + next unless ($key && defined($value)); + $package->{$key} = decode('UTF-8', $value); + + # Read manifest + if ($key eq 'FOLDER' && $value && -d $value) { + my $xml = $value . '/appxmanifest.xml'; + if (-f $xml) { + my $tpp = XML::TreePP->new() + or next; + my $tree = $tpp->parsefile($xml); + foreach my $property (keys(%manifest_mapping)) { + my $key = $manifest_mapping{$property}; + my $value = $tree->{Package}->{Properties}->{$property} + or next; + $package->{$key} = decode('UTF-8', $value); + } + } + } + } + + # Add last package if still not added + push @{$list}, $package if ($package && $package->{NAME}); + + # Extract publishers + my $publishers = _parsePackagePublishers($list); + + # Cleanup list and fix localized strings + foreach my $package (@{$list}) { + my $name = $package->{NAME}; + my $pubid = delete $package->{PUBLISHERID}; + $package->{PUBLISHER} = $publishers->{$pubid} + if ($pubid && $publishers->{$pubid}); + + if (!$package->{PUBLISHER} && $name =~ /^Microsoft/i) { + $package->{PUBLISHER} = "Microsoft Corp."; + } elsif (!$package->{PUBLISHER}) { + $logger->debug2("no publisher found for $name package") if $logger; + } + + my $pkgname = delete $package->{PACKAGE}; + + my $installdate = delete $package->{INSTALLDATE}; + if ($installdate) { + my ($date) = $installdate =~ m|^([0-9/]+)|; + $installdate = _dateFormat($date); + $package->{INSTALLDATE} = $installdate if $installdate; + } + + my $dn = delete $package->{DISPLAYNAME}; + if ($dn && $dn =~ /^ms-resource:/) { + my $res = SHLoadIndirectString(_canonicalResourceURI( + $pkgname, $package->{FOLDER}, $dn + )); + $logger->debug2("$name package name " . ($res ? + "resolved to '$res'" : "can't be resolved from '$dn'")) + if $logger; + $dn = $res; + } + if (!$dn) { + $dn = _canonicalPackageName($package->{NAME}); + } + $package->{NAME} = $dn if $dn; + + my $comments = delete $package->{COMMENTS}; + if ($comments && $comments =~ /^ms-resource:/) { + my $res = SHLoadIndirectString(_canonicalResourceURI( + $pkgname, $package->{FOLDER}, $comments + )); + $logger->debug2("$name package comments " . ($res ? + "resolved to '$res'" : "can't be resolved from '$comments'")) + if $logger; + $comments = $res; + } + $package->{COMMENTS} = $comments if $comments; + + $package->{FROM} = 'uwp'; + } + + return $list; +} + +sub _canonicalPackageName { + my ($name) = @_; + # Fix up name for well-know cases if the case display name is missing + if ($name =~ /^Microsoft\.NET\./i) { + $name =~ s/\./ /g; + $name =~ s/Microsoft NET/Microsoft .Net/; + } elsif ($name =~ /^(Microsoft|windows)\./i) { + $name =~ s/\./ /g; + } + return $name; +} + +sub _canonicalResourceURI { + my ($package, $folder, $resource) = @_; + my $file = $folder.'\resources.pri'; + my $base = -f $file ? $file : $package; + my ($prefix, $respath) = $resource =~ /^(ms-resource:)(.*)$/ + or return; + if ($respath =~ m|^//|) { + # Keep resource as is + } elsif ($respath =~ m|^/|) { + $resource = $prefix.'//'.$respath; + } else { + $resource = $prefix.'///'.($respath =~ /resources/i ? '':'resources/').$respath; + } + return '@{'.$base.'?'.$resource.'}'; +} + +sub _parsePackagePublishers { + my $list = shift(@_); + + my %publishers = qw( + tf1gferkr813w AutoDesk + ); + + my @localized_publisher_packages = (); + + foreach my $package (@{$list}) { + my $publisher = delete $package->{PUBLISHERDISPLAYNAME}; + my $pubid = $package->{PUBLISHERID} + or next; + next unless $publisher; + next if ($publishers{$pubid} && $publishers{$pubid} !~ /^ms-resource:/); + if ($publisher =~ /^ms-resource:/) { + push @localized_publisher_packages, $package; + } + $publishers{$pubid} = $publisher; + } + + # Fix publishers with ms-resource: + foreach my $package (@localized_publisher_packages) { + my $pubid = $package->{PUBLISHERID} + or next; + next if ($publishers{$pubid} && $publishers{$pubid} !~ /^ms-resource:/); + my $string = SHLoadIndirectString(_canonicalResourceURI( + $package->{PACKAGE}, $package->{FOLDER}, $publishers{$pubid} + )); + if ($string) { + $publishers{$pubid} = $string; + } else { + delete $publishers{$pubid}; + } + } + + return \%publishers; +} + 1; + +__DATA__ +# Script PowerShell +[Windows.Management.Deployment.PackageManager,Windows.Management.Deployment,ContentType=WindowsRuntime] >$null + +$packages = New-Object Windows.Management.Deployment.PackageManager + +foreach ( $package in $packages.FindPackages() ) +{ + # Check install state for each user and break if an installation is found + $state = "Installed" + foreach ( $user in $packages.FindUsers($package.Id.FullName) ) + { + $state = $user.InstallState + if ($user.InstallState -Like "Installed") { + break + $p = $packages.FindPackageForUser($user.UserSecurityId, $package.Id.FullName) + if ($p.InstalledLocation.DateCreated -NotLike "") { + $installedDate = $p.InstalledLocation.DateCreated + break + } + } + } + if ($state -NotLike "Installed") { continue } + + # Use installeddate if found otherwise use installation folder creation date + $installedDate = "" + if ($package.InstalledDate -NotLike "") { + $installedDate = $package.InstalledDate + } elseif ($package.InstalledLocation.DateCreated -NotLike "") { + $installedDate = $package.InstalledLocation.DateCreated + } + + Write-host "NAME: $($package.Id.Name)" + Write-host "PACKAGE: $($package.Id.FullName)" + Write-host "ARCH: $($package.Id.Architecture.ToString().ToLowerInvariant())" + Write-host "VERSION: $($package.Id.Version.Major).$($package.Id.Version.Minor).$($package.Id.Version.Build).$($package.Id.Version.Revision)" + Write-host "FOLDER: $($package.InstalledLocation.Path)" + if ($installedDate -NotLike "") { + Write-host "INSTALLDATE: $($installedDate)" + } + Write-host "PUBLISHER: $($package.Id.Publisher)" + Write-host "PUBLISHERID: $($package.Id.PublisherId)" + Write-host "SYSTEM_CATEGORY: $($package.SignatureKind.ToString().ToLowerInvariant())" + Write-Host +} diff --git a/lib/FusionInventory/Agent/Task/Maintenance.pm b/lib/FusionInventory/Agent/Task/Maintenance.pm index 511ef080e9..36995a1aab 100644 --- a/lib/FusionInventory/Agent/Task/Maintenance.pm +++ b/lib/FusionInventory/Agent/Task/Maintenance.pm @@ -5,8 +5,10 @@ use warnings; use parent 'FusionInventory::Agent::Task'; -use FusionInventory::Agent::Storage; -use FusionInventory::Agent::Task::Deploy::Datastore; +use English qw(-no_match_vars); +use UNIVERSAL::require; +use File::Basename; + use FusionInventory::Agent::Task::Maintenance::Version; our $VERSION = FusionInventory::Agent::Task::Maintenance::Version::VERSION; @@ -14,25 +16,58 @@ our $VERSION = FusionInventory::Agent::Task::Maintenance::Version::VERSION; sub isEnabled { my ($self) = @_; - if (!$self->{target}->isa('FusionInventory::Agent::Target::Scheduler')) { + if (!$self->{target}->isType('scheduler')) { $self->{logger}->debug("Maintenance task only compatible with Scheduler target"); return; } - return 1; + my $found = 0; + # Lookup for each target task if a Maintenance module exists + foreach my $task ($self->{target}->otherTasks()) { + my $taskdir = dirname(__FILE__) .'/'. ucfirst($task); + next unless -d $taskdir; + + my $maintenance = $taskdir.'/Maintenance.pm'; + next unless -e $maintenance; + + $found ++; + last; + } + + return $found; } sub run { - my ($self, %params) = @_; + my ($self) = @_; my $logger = $self->{logger}; - my $folder = $self->{target}->getStorage()->getDirectory(); - my $datastore = FusionInventory::Agent::Task::Deploy::Datastore->new( - config => $self->{config}, - path => $folder.'/deploy', - logger => $logger - ); - $datastore->cleanUp( force => $datastore->diskIsFull() ); + my @taskclass = split('::', __PACKAGE__); + pop @taskclass; + + # Lookup for each target task if a Maintenance module exists and run + # the its doMaintenance() API + foreach my $task ($self->{target}->otherTasks()) { + my $taskdir = dirname(__FILE__) .'/'. ucfirst($task); + next unless -d $taskdir; + + my $file = $taskdir.'/Maintenance.pm'; + next unless -e $file; + + my $module = join('::', @taskclass, ucfirst($task), 'Maintenance'); + $module->require(); + if ($EVAL_ERROR) { + $logger->debug("failed to load $task maintenance module: $EVAL_ERROR"); + next; + } + + $logger->debug2("Doing $task Maintenance"); + my $maintenance = $module->new( + target => $self->{target}, + config => $self->{config}, + logger => $logger, + ); + $maintenance->doMaintenance(); + } } 1; @@ -50,10 +85,13 @@ and safe. =head1 FUNCTIONS -=head2 isEnabled ( $self ) +=head2 isEnabled() + +Lookup for a Maintenance module for each target enabled tasks. -Returns true if the task is enabled. +Returns true if the task should be finally enabled. -=head2 run ( $self, %params ) +=head2 run() -Run the task. +Run the Maintenance task by calling each doMaintenance() API from each +task Maintenance found modules. diff --git a/lib/FusionInventory/Agent/Task/Maintenance/Version.pm b/lib/FusionInventory/Agent/Task/Maintenance/Version.pm index 87e995de93..1bd8b6d364 100644 --- a/lib/FusionInventory/Agent/Task/Maintenance/Version.pm +++ b/lib/FusionInventory/Agent/Task/Maintenance/Version.pm @@ -3,6 +3,6 @@ package FusionInventory::Agent::Task::Maintenance::Version; use strict; use warnings; -use constant VERSION => "1.0"; +use constant VERSION => "1.1"; 1; diff --git a/lib/FusionInventory/Agent/Task/NetDiscovery.pm b/lib/FusionInventory/Agent/Task/NetDiscovery.pm index c1ce2bfb0c..f63ed5eb5d 100644 --- a/lib/FusionInventory/Agent/Task/NetDiscovery.pm +++ b/lib/FusionInventory/Agent/Task/NetDiscovery.pm @@ -119,13 +119,6 @@ sub run { ); } - FusionInventory::Agent::Task::NetDiscovery::Ping->require(); - if ($EVAL_ERROR) { - $self->{logger}->info( - "Can't load Task::NetDiscovery::Ping, timestamp ping can't be used" - ); - } - Net::NBName->require(); if ($EVAL_ERROR) { $self->{logger}->info( @@ -182,7 +175,7 @@ sub run { my $results = Thread::Queue->new(); do { - $addresses->enqueue($block->ip()), + $addresses->enqueue($block->ip()); } while (++$block); my $size = $addresses->pending(); @@ -358,8 +351,6 @@ sub _scanAddress { my %device = ( $INC{'Net/SNMP.pm'} ? $self->_scanAddressBySNMP(%params) : (), $INC{'Net/NBName.pm'} ? $self->_scanAddressByNetbios(%params) : (), - $INC{'FusionInventory/Agent/Task/NetDiscovery/Ping.pm'} ? - $self->_scanAddressByTSPing(%params) : (), $INC{'Net/Ping.pm'} ? $self->_scanAddressByPing(%params) : (), $params{arp} ? $self->_scanAddressByArp(%params) : (), ); @@ -405,40 +396,26 @@ sub _scanAddressByArp { return %device; } -sub _scanAddressByTSPing { - my ($self, %params) = @_; - - my $np = Net::Ping::TimeStamp->new('icmp', 1); - - my %device = (); - - if ($np->ping($params{ip})) { - $device{DNSHOSTNAME} = $params{ip}; - } - - $self->{logger}->debug( - sprintf "[thread %d] - scanning %s with timestamp ping: %s", - threads->tid(), - $params{ip}, - $device{DNSHOSTNAME} ? 'success' : 'no result' - ); - - return %device; -} - sub _scanAddressByPing { my ($self, %params) = @_; + my $type = 'echo'; my $np = Net::Ping->new('icmp', 1); my %device = (); if ($np->ping($params{ip})) { $device{DNSHOSTNAME} = $params{ip}; + } elsif ($Net::Ping::VERSION >= 2.67) { + $type = 'timestamp'; + $np->message_type($type); + if ($np->ping($params{ip})) { + $device{DNSHOSTNAME} = $params{ip}; + } } $self->{logger}->debug( - sprintf "[thread %d] - scanning %s with echo ping: %s", + sprintf "[thread %d] - scanning %s with $type ping: %s", threads->tid(), $params{ip}, $device{DNSHOSTNAME} ? 'success' : 'no result' @@ -500,8 +477,10 @@ sub _scanAddressBySNMP { if ($params{snmp_domains} && @{$params{snmp_domains}}) { my @domtries = (); foreach my $domain (@{$params{snmp_domains}}) { - my @cases = map { { %{$_}, domain => $domain } } @{$tries}; - push @domtries, @cases; + foreach my $try (@{$tries}) { + $try->{domain} = $domain; + } + push @domtries, @{$tries}; } $tries = \@domtries; } diff --git a/lib/FusionInventory/Agent/Task/NetDiscovery/Ping.pm b/lib/FusionInventory/Agent/Task/NetDiscovery/Ping.pm deleted file mode 100644 index abee0759e6..0000000000 --- a/lib/FusionInventory/Agent/Task/NetDiscovery/Ping.pm +++ /dev/null @@ -1,130 +0,0 @@ -package FusionInventory::Agent::Task::NetDiscovery::Ping; - -# Declare unofficial Net::Ping::TimeStamp package -package - Net::Ping::TimeStamp; - -use strict; -use warnings; - -use parent qw(Net::Ping); - -use constant ICMP_TIMESTAMP => 13; -use constant ICMP_TIMESTAMP_REPLY => 14; -use constant ICMP_STRUCT => "C2 n3 N3"; # Structure of a minimal timestamp ICMP packet - -# Just overide ping_icmp method to implement TimeStamp ICMP query and -# TimeStamp ICMP reply support as specified in RFC 792 -# The method is a simplified version of the original Echo ICMP support from Net::Ping -# It only supports IPv4 at this time -sub ping_icmp -{ - my ($self, - $ip, # Hash of addr (string), addr_in (packed), family - $timeout # Seconds after which ping times out - ) = @_; - - my ($saddr, # sockaddr_in with port and ip - $checksum, # Checksum of ICMP packet - $msg, # ICMP packet to send - $len_msg, # Length of $msg - $rbits, # Read bits, filehandles for reading - $nfound, # Number of ready filehandles found - $finish_time, # Time ping should be finished - $done, # set to 1 when we are done - $ret, # Return value - $recv_msg, # Received message including IP header - $from_saddr, # sockaddr_in of sender - $from_port, # Port packet was sent from - $from_ip, # Packed IP of sender - $from_type, # ICMP type - $from_subcode, # ICMP subcode - $from_pid, # ICMP packet id - $from_seq, # ICMP packet sequence - ); - - $ip = $self->{host} if !defined $ip and $self->{host}; - $timeout = $self->{timeout} if !defined $timeout and $self->{timeout}; - - socket($self->{fh}, $ip->{family}, Net::Ping::SOCK_RAW, $self->{proto_num}) || - croak("icmp socket error - $!"); - - if (defined $self->{local_addr} && - !CORE::bind($self->{fh}, _pack_sockaddr_in(0, $self->{local_addr}))) { - croak("icmp bind error - $!"); - } - $self->_setopts(); - - $self->{seq} = ($self->{seq} + 1) % 65536; # Increment sequence - $checksum = 0; # No checksum for starters - $msg = pack( - ICMP_STRUCT, ICMP_TIMESTAMP, Net::Ping::SUBCODE, - $checksum, $self->{pid}, $self->{seq}, 0, 0, 0 - ); - - $checksum = Net::Ping->checksum($msg); - $msg = pack( - ICMP_STRUCT, ICMP_TIMESTAMP, Net::Ping::SUBCODE, - $checksum, $self->{pid}, $self->{seq}, 0, 0, 0 - ); - - $len_msg = length($msg); - $saddr = Net::Ping::_pack_sockaddr_in(Net::Ping::ICMP_PORT, $ip); - $self->{from_ip} = undef; - $self->{from_type} = undef; - $self->{from_subcode} = undef; - send($self->{fh}, $msg, Net::Ping::ICMP_FLAGS, $saddr); # Send the message - - $rbits = ""; - vec($rbits, $self->{fh}->fileno(), 1) = 1; - $ret = 0; - $done = 0; - $finish_time = &Net::Ping::time() + $timeout; # Must be done by this time - while (!$done && $timeout > 0) # Keep trying if we have time - { - $nfound = Net::Ping::mselect((my $rout=$rbits), undef, undef, $timeout); # Wait for packet - $timeout = $finish_time - &Net::Ping::time(); # Get remaining time - if (!defined($nfound)) # Hmm, a strange error - { - $ret = undef; - $done = 1; - } - elsif ($nfound) # Got a packet from somewhere - { - $recv_msg = ""; - $from_pid = -1; - $from_seq = -1; - $from_saddr = recv($self->{fh}, $recv_msg, 1500, Net::Ping::ICMP_FLAGS); - ($from_port, $from_ip) = Net::Ping::_unpack_sockaddr_in($from_saddr, $ip->{family}); - ($from_type, $from_subcode) = unpack("C2", substr($recv_msg, 20, 2)); - if ($from_type == ICMP_TIMESTAMP_REPLY) { - ($from_pid, $from_seq) = unpack("n3", substr($recv_msg, 24, 4)) - if length $recv_msg >= 28; - } else { - ($from_pid, $from_seq) = unpack("n3", substr($recv_msg, 52, 4)) - if length $recv_msg >= 56; - } - $self->{from_ip} = $from_ip; - $self->{from_type} = $from_type; - $self->{from_subcode} = $from_subcode; - next if ($from_pid != $self->{pid}); - next if ($from_seq != $self->{seq}); - if ($self->ntop($from_ip) eq $self->ntop($ip)) { # Does the packet check out? - if ($from_type == ICMP_TIMESTAMP_REPLY) { - $ret = 1; - $done = 1; - } elsif ($from_type == Net::Ping::ICMP_UNREACHABLE) { - $done = 1; - } elsif ($from_type == Net::Ping::ICMP_TIME_EXCEEDED()) { - $ret = 0; - $done = 1; - } - } - } else { # Oops, timed out - $done = 1; - } - } - return $ret; -} - -1; diff --git a/lib/FusionInventory/Agent/Task/NetDiscovery/Version.pm b/lib/FusionInventory/Agent/Task/NetDiscovery/Version.pm index 4770d0f1ca..9915d837b4 100644 --- a/lib/FusionInventory/Agent/Task/NetDiscovery/Version.pm +++ b/lib/FusionInventory/Agent/Task/NetDiscovery/Version.pm @@ -3,6 +3,6 @@ package FusionInventory::Agent::Task::NetDiscovery::Version; use strict; use warnings; -use constant VERSION => "2.6"; +use constant VERSION => "2.7"; 1; diff --git a/lib/FusionInventory/Agent/Task/NetInventory/Version.pm b/lib/FusionInventory/Agent/Task/NetInventory/Version.pm index 12abf7642f..77758c1ca6 100644 --- a/lib/FusionInventory/Agent/Task/NetInventory/Version.pm +++ b/lib/FusionInventory/Agent/Task/NetInventory/Version.pm @@ -3,6 +3,6 @@ package FusionInventory::Agent::Task::NetInventory::Version; use strict; use warnings; -use constant VERSION => "3.0"; +use constant VERSION => "3.1"; 1; diff --git a/lib/FusionInventory/Agent/Tools/Batteries.pm b/lib/FusionInventory/Agent/Tools/Batteries.pm index 0bc930bbe7..8bf50fdf0a 100644 --- a/lib/FusionInventory/Agent/Tools/Batteries.pm +++ b/lib/FusionInventory/Agent/Tools/Batteries.pm @@ -82,6 +82,7 @@ sub getCanonicalCapacity { } # Also implement a batteries class, but split name on new line to not export it in CPAN +## no critic (ProhibitMultiplePackages) package Inventory::Batteries; diff --git a/lib/FusionInventory/Agent/Tools/Hardware.pm b/lib/FusionInventory/Agent/Tools/Hardware.pm index c456241c42..a03e9ad9f9 100644 --- a/lib/FusionInventory/Agent/Tools/Hardware.pm +++ b/lib/FusionInventory/Agent/Tools/Hardware.pm @@ -1033,7 +1033,21 @@ sub _setConnectedDevices { my $cdp_connection = $cdp_info->{$interface_id}; if ($lldp_connection) { - if ($cdp_connection->{SYSDESCR} eq $lldp_connection->{SYSDESCR}) { + my $match = 0; + + # Try different case to find LLDP/CDP connection match + if ($lldp_connection->{SYSDESCR} && $cdp_connection->{SYSDESCR} eq $lldp_connection->{SYSDESCR}) { + $match ++; + } elsif ($lldp_connection->{SYSNAME} && $cdp_connection->{SYSNAME}) { + my $cdp_test = getCanonicalMacAddress($cdp_connection->{SYSNAME}); + if ($cdp_connection->{SYSNAME} eq $lldp_connection->{SYSNAME}) { + $match ++; + } elsif ($lldp_connection->{SYSMAC} && $cdp_test && $lldp_connection->{SYSMAC} eq $cdp_test) { + $match ++; + } + } + + if ($match) { # same device, everything OK foreach my $key (qw/IP MODEL/) { $lldp_connection->{$key} = $cdp_connection->{$key}; @@ -1358,7 +1372,7 @@ sub _getVlans { foreach my $suffix (sort keys %{$vmPortStatus}) { my $port_id = _getElement($suffix, -1); my $vlan_id = $vmPortStatus->{$suffix}; - my $name = $vtpVlanName->{$vlan_id}; + my $name = getCanonicalString($vtpVlanName->{$vlan_id}); push @{$results->{$port_id}}, { NUMBER => $vlan_id, @@ -1383,7 +1397,7 @@ sub _getVlans { } push @{$results->{$portnumber}}, { NUMBER => $vlan, - NAME => $vlanIdName->{$suffix} + NAME => getCanonicalString($vlanIdName->{$suffix}) }; } } diff --git a/lib/FusionInventory/Agent/Tools/MacOS.pm b/lib/FusionInventory/Agent/Tools/MacOS.pm index 72c99fd603..b11a9d83f1 100644 --- a/lib/FusionInventory/Agent/Tools/MacOS.pm +++ b/lib/FusionInventory/Agent/Tools/MacOS.pm @@ -46,6 +46,10 @@ sub _initXmlParser { } elsif ($params{file}) { $xmlParser = XML::XPath->new(filename => $params{file}); } + + # Don't validate XML against DTD, parsing may fail if a proxy is active + $XML::XPath::ParseParamEnt = 0; + return $xmlParser; } diff --git a/lib/FusionInventory/Agent/Tools/PowerSupplies.pm b/lib/FusionInventory/Agent/Tools/PowerSupplies.pm index 428f54c0d8..7180eb724e 100644 --- a/lib/FusionInventory/Agent/Tools/PowerSupplies.pm +++ b/lib/FusionInventory/Agent/Tools/PowerSupplies.pm @@ -70,6 +70,7 @@ sub getIpmiFru { } # Also implement a powersupplies class, but split name on new line to not export it in CPAN +## no critic (ProhibitMultiplePackages) package Inventory::PowerSupplies; diff --git a/lib/FusionInventory/Agent/Tools/SNMP.pm b/lib/FusionInventory/Agent/Tools/SNMP.pm index dd6e11e7a1..8f2c1eff4e 100644 --- a/lib/FusionInventory/Agent/Tools/SNMP.pm +++ b/lib/FusionInventory/Agent/Tools/SNMP.pm @@ -53,6 +53,9 @@ sub getCanonicalString { # truncate after first invalid character but keep newline as valid $value =~ s/[^\p{Print}\n].*$//; + # Finally cleanup EOL if some is remaining at the end + chomp($value); + return $value; } diff --git a/lib/FusionInventory/Agent/Tools/Win32.pm b/lib/FusionInventory/Agent/Tools/Win32.pm index d9dddf4d35..02c9ed3aeb 100644 --- a/lib/FusionInventory/Agent/Tools/Win32.pm +++ b/lib/FusionInventory/Agent/Tools/Win32.pm @@ -250,6 +250,16 @@ sub getRegistryValue { return _call_win32_ole_dependent_api($win32_ole_dependent_api); } + # Handle differently paths including /**/ pattern + if ($root =~ m/\/\*\*(?:\/.*|)$/ || $keyName eq '**') { + return _getRegistryDynamic( + logger => $params{logger}, + path => "$root/$keyName", + valueName => $valueName, + withtype => $params{withtype} + ); + } + my $key = _getRegistryKey( logger => $params{logger}, root => $root, @@ -260,7 +270,7 @@ sub getRegistryValue { if ($valueName eq '*') { my %ret; - foreach (keys %$key) { + foreach (grep { m|^/| } keys %$key) { s{^/}{}; $ret{$_} = $params{withtype} ? [$key->GetValue($_)] : $key->{"/$_"} ; } @@ -367,7 +377,7 @@ sub getRegistryKey { ); } -sub _getRegistryKey { +sub _getRegistryRoot { my (%params) = @_; ## no critic (ProhibitBitwise) @@ -381,11 +391,72 @@ sub _getRegistryKey { ) if $params{logger}; return; } + return $rootKey; +} + +sub _getRegistryKey { + my (%params) = @_; + + my $rootKey = _getRegistryRoot(%params) + or return; + my $key = $rootKey->Open($params{keyName}); return $key; } +sub _getRegistryDynamic { + my (%params) = @_; + + my %ret; + my $valueName = $params{valueName}; + + my @rootparts = split(/\/+\*\*\/+/, $params{path}.'/', 2); + my $first = shift(@rootparts); + my $second = shift(@rootparts) || ''; + $first .= '/'; + $second = '/'.$second; + $second =~ s|/*$||; + + my $rootSub = _getRegistryRoot( + root => $first, + logger => $params{logger} + ); + return unless defined($rootSub); + + foreach my $sub ($rootSub->SubKeyNames) { + if ($second =~ m/\/+\*\*(?:\/.*|)/) { + my $subret = _getRegistryDynamic( + logger => $params{logger}, + path => $first.$sub.$second, + valueName => $valueName, + withtype => $params{withtype} + ); + next unless defined($subret); + my ($subkey) = $second =~ /^([^*]+)\*\*(?:\/.*|)$/; + foreach my $subretkey (keys %$subret) { + $ret{$sub.$subkey.$subretkey} = $subret->{$subretkey}; + } + } else { + my $key = _getRegistryRoot( + root => $first.$sub.$second, + logger => $params{logger} + ); + next unless defined($key); + + if ($valueName eq '*') { + foreach (grep { m|^/| } keys %$key) { + s{^/}{}; + $ret{$sub.$second."/".$_} = $params{withtype} ? [$key->GetValue($_)] : $key->{"/$_"} ; + } + } elsif (exists($key->{"/$valueName"})) { + $ret{$sub.$second."/".$valueName} = $params{withtype} ? [$key->GetValue($valueName)] : $key->{"/$valueName"} ; + } + } + } + return \%ret; +} + sub _getRegistryKeyFromWMI{ my (%params) = @_; diff --git a/lib/FusionInventory/Agent/Tools/Win32/API.pm b/lib/FusionInventory/Agent/Tools/Win32/API.pm new file mode 100644 index 0000000000..8c78d7486a --- /dev/null +++ b/lib/FusionInventory/Agent/Tools/Win32/API.pm @@ -0,0 +1,47 @@ +package FusionInventory::Agent::Tools::Win32::API; + +use warnings; +use strict; + +use English qw(-no_match_vars); +use UNIVERSAL::require; + +use FusionInventory::Agent::Logger; + +sub new { + my ($class, %params) = @_; + + my $self = { + logger => $params{logger} || FusionInventory::Agent::Logger->new() + }; + bless $self, $class; + + # Load Win32::API as late as possible + Win32::API->require() or return; + + my $api; + eval { + $api = Win32::API->new(@{$params{win32api}}); + }; + $self->{logger}->debug2("win32 api load failure: $EVAL_ERROR") if $EVAL_ERROR; + + $self->{_api} = $api if $api; + + return $self; +} + +sub Call { + my $self = shift; + + return unless $self->{_api}; + + my $ret; + eval { + $ret = $self->{_api}->Call(@_); + }; + $self->{logger}->debug2("win32 api call failure: $EVAL_ERROR") if $EVAL_ERROR; + + return $ret; +} + +1; diff --git a/lib/FusionInventory/Agent/Tools/Win32/LoadIndirectString.pm b/lib/FusionInventory/Agent/Tools/Win32/LoadIndirectString.pm new file mode 100644 index 0000000000..7fc8f1b8d3 --- /dev/null +++ b/lib/FusionInventory/Agent/Tools/Win32/LoadIndirectString.pm @@ -0,0 +1,57 @@ +package FusionInventory::Agent::Tools::Win32::LoadIndirectString; + +use warnings; +use strict; + +use parent 'Exporter'; + +use FusionInventory::Agent::Tools::Win32::API; +use FusionInventory::Agent::Tools::Win32::WideChar; + +our @EXPORT = qw( + SHLoadIndirectString +); + +my $apiSHLoadIndirectString; + +sub SHLoadIndirectString { + my ($string) = @_; + + return unless $string; + + my $wstring = MultiByteToWideChar($string) + or return; + + unless ($apiSHLoadIndirectString) { + $apiSHLoadIndirectString = FusionInventory::Agent::Tools::Win32::API->new( + win32api => [ + 'shlwapi', + 'SHLoadIndirectString', + [ 'P', 'P', 'I', 'I' ], + 'N' + ] + ); + } + + return unless $apiSHLoadIndirectString; + + # Buffer size should be sufficient for our purpose + my $buffer = '\0' x 4096; + my $ret = $apiSHLoadIndirectString->Call( + $wstring, + $buffer, + 4096, + 0 + ); + + return if ($ret || !$buffer); + + $buffer = WideCharToMultiByte($buffer); + + # api returns the same string in buffer is no indirect string was found + return unless ($buffer && $buffer ne $string); + + return $buffer ; +} + +1; diff --git a/lib/FusionInventory/Agent/Tools/Win32/WideChar.pm b/lib/FusionInventory/Agent/Tools/Win32/WideChar.pm new file mode 100644 index 0000000000..71bcf52592 --- /dev/null +++ b/lib/FusionInventory/Agent/Tools/Win32/WideChar.pm @@ -0,0 +1,90 @@ +package FusionInventory::Agent::Tools::Win32::WideChar; + +use warnings; +use strict; + +use parent 'Exporter'; + +use Encode qw(encode decode); + +use FusionInventory::Agent::Tools::Win32::API; + +# UTF-8 code page +use constant CP_UTF8 => 65001; + +our @EXPORT = qw( + MultiByteToWideChar + WideCharToMultiByte +); + +my $apiMultiByteToWideChar; +my $apiWideCharToMultiByte; + +sub MultiByteToWideChar { + my ($string) = @_; + + return unless $string; + + unless ($apiMultiByteToWideChar) { + $apiMultiByteToWideChar = FusionInventory::Agent::Tools::Win32::API->new( + win32api => [ + 'kernel32', + 'MultiByteToWideChar', + [ 'I', 'I', 'P', 'I', 'P', 'I' ], + 'I' + ] + ); + } + + return unless $apiMultiByteToWideChar; + + # Encode string as UTF-8 before conversion + $string = encode('UTF-8', $string); + + my $len = length($string); + my $lenbuf = 2 * $len; + my $buffer = "\0" x $lenbuf; + + my $ret = $apiMultiByteToWideChar->Call( + CP_UTF8, 0, $string, $len, $buffer, $lenbuf + ); + return unless $ret; + return $buffer; +} + +sub WideCharToMultiByte { + my ($string) = @_; + + return unless $string; + + unless ($apiWideCharToMultiByte) { + $apiWideCharToMultiByte = FusionInventory::Agent::Tools::Win32::API->new( + win32api => [ + 'kernel32', + 'WideCharToMultiByte', + [ 'I', 'I', 'P', 'I', 'P', 'I', 'P', 'P' ], + 'I' + ] + ); + } + + return unless $apiWideCharToMultiByte; + + my $lpDefaultChar = 0; + my $lpUsedDefaultChar = 0; + my $len = length($string); + my $buffer = "\0" x $len; + + my $ret = $apiWideCharToMultiByte->Call( + CP_UTF8, 0, $string, -1, $buffer, $len, + $lpDefaultChar, $lpUsedDefaultChar + ); + return unless $ret; + + # Cleanup buffer + $buffer =~ s/\0+$//; + + return decode('UTF-8', $buffer); +} + +1; diff --git a/lib/FusionInventory/Agent/Version.pm b/lib/FusionInventory/Agent/Version.pm index f764c04c82..a884394b79 100644 --- a/lib/FusionInventory/Agent/Version.pm +++ b/lib/FusionInventory/Agent/Version.pm @@ -3,7 +3,7 @@ package FusionInventory::Agent::Version; use strict; use warnings; -our $VERSION = "2.4.1"; +our $VERSION = "2.4.2"; our $PROVIDER = "FusionInventory"; our $COMMENTS = []; @@ -33,5 +33,5 @@ agent issue is reported. One very useful information should be first defined like in that example: our $COMMENTS = [ - "Based on FusionInventory Agent v2.4" + "Based on FusionInventory Agent v2.4.2" ]; diff --git a/lib/setup.pm b/lib/setup.pm index 8ad7a24741..5d02f85006 100644 --- a/lib/setup.pm +++ b/lib/setup.pm @@ -29,7 +29,7 @@ eval { next if ($setup{$key} && File::Spec->file_name_is_absolute($setup{$key})); my $folder = abs_path(File::Spec->rel2abs('../'.$setup{$key}, $setup{libdir})); - $setup{$key} = $folder if -d $folder; + $setup{$key} = $folder if $folder && -d $folder; } } }; diff --git a/resources/linux/packaging/pacman b/resources/linux/packaging/pacman new file mode 100644 index 0000000000..34d344cb37 --- /dev/null +++ b/resources/linux/packaging/pacman @@ -0,0 +1,251 @@ +Name : ca-certificates +Version : 20180821-1 +Description : Common CA certificates (default providers) +Architecture : any +URL : https://src.fedoraproject.org/rpms/ca-certificates +Licenses : GPL2 +Groups : None +Provides : None +Depends On : ca-certificates-mozilla +Optional Deps : None +Required By : curl +Optional For : openssl +Conflicts With : ca-certificates-cacert<=20140824-4 +Replaces : ca-certificates-cacert<=20140824-4 +Installed Size : 1024.00 B +Packager : Jan Alexander Steffens (heftig) +Build Date : Tue Aug 21 18:39:16 2018 +Install Date : Wed Sep 12 10:55:23 2018 +Install Reason : Installed as a dependency for another package +Install Script : No +Validated By : Signature + +Name : filesystem +Version : 2018.8-1 +Description : Base Arch Linux files +Architecture : x86_64 +URL : https://www.archlinux.org +Licenses : GPL +Groups : base +Provides : None +Depends On : iana-etc +Optional Deps : None +Required By : glibc +Optional For : None +Conflicts With : None +Replaces : None +Installed Size : 12.00 KiB +Packager : Jan Alexander Steffens (heftig) +Build Date : Tue Aug 21 14:21:42 2018 +Install Date : Wed Sep 12 10:54:35 2018 +Install Reason : Explicitly installed +Install Script : No +Validated By : Signature + +Name : pacman-mirrorlist +Version : 20180912-1 +Description : Arch Linux mirror list for use by pacman +Architecture : any +URL : https://www.archlinux.org/mirrorlist/ +Licenses : GPL +Groups : None +Provides : None +Depends On : None +Optional Deps : None +Required By : pacman +Optional For : None +Conflicts With : None +Replaces : None +Installed Size : 26.00 KiB +Packager : Florian Pritz +Build Date : Wed Sep 12 07:46:50 2018 +Install Date : Wed Sep 12 10:55:27 2018 +Install Reason : Installed as a dependency for another package +Install Script : No +Validated By : Signature + +Name : perl +Version : 5.28.0-1 +Description : A highly capable, feature-rich programming language +Architecture : x86_64 +URL : http://www.perl.org +Licenses : GPL PerlArtistic +Groups : base +Provides : perl-archive-tar=2.30 perl-attribute-handlers=1.01 perl-autodie=2.29 perl-autoloader=5.74 perl-autouse=1.11 perl-b-debug=1.26 perl-base=2.27 perl-bignum=0.49 perl-carp=1.50 perl-compress-raw-bzip2=2.074 perl-compress-raw-zlib=2.076 perl-config-perl-v=0.29 perl-constant=1.33 perl-cpan-meta-requirements=2.140 perl-cpan-meta-yaml=0.018 perl-cpan-meta=2.150010 perl-cpan=2.20 perl-data-dumper=2.170 perl-db_file=1.840 perl-devel-ppport=3.40 perl-devel-selfstubber=1.06 perl-digest-md5=2.55 perl-digest-sha=6.01 perl-digest=1.17_01 perl-dumpvalue=1.18 perl-encode=2.97 perl-encoding-warnings=0.13 perl-env=1.04 perl-experimental=0.019 perl-exporter=5.73 perl-extutils-cbuilder=0.280230 perl-extutils-constant=0.25 perl-extutils-install=2.14 perl-extutils-makemaker=7.34 perl-extutils-manifest=1.70 perl-extutils-parsexs=3.39 perl-file-fetch=0.56 perl-file-path=2.15 perl-file-temp=0.2304 perl-filter-simple=0.95 perl-filter-util-call=1.58 perl-getopt-long=2.5 perl-http-tiny=0.070 perl-i18n-collate=1.02 perl-i18n-langtags=0.43 perl-if=0.0608 perl-io-compress=2.074 perl-io-socket-ip=0.39 perl-io-zlib=1.10 perl-io=1.39 perl-ipc-cmd=1.00 perl-ipc-sysv=2.07 perl-json-pp=2.97001 perl-lib=0.64 perl-libnet=3.11 perl-locale-codes=3.56 perl-locale-maketext-simple=0.21_01 perl-locale-maketext=1.29 perl-math-bigint-fastcalc=0.5006 perl-math-bigint=1.999811 perl-math-bigrat=0.2613 perl-math-complex=1.5901 perl-memoize=1.03_01 perl-mime-base64=3.15 perl-module-corelist=5.20180622 perl-module-load-conditional=0.68 perl-module-load=0.32 perl-module-loaded=0.08 perl-module-metadata=1.000033 perl-net-ping=2.62 perl-params-check=0.38 perl-parent=0.236 perl-pathtools=3.74 perl-perl-ostype=1.010 perl-perlfaq=5.021011 perl-perlio-via-quotedprint=0.08 perl-pod-checker=1.73 perl-pod-escapes=1.07 perl-pod-parser=1.63 perl-pod-perldoc=3.2801 perl-pod-simple=3.35 perl-pod-usage=1.69 perl-podlators=5.006 perl-safe=2.40 perl-scalar-list-utils=1.50 perl-search-dict=1.07 perl-selfloader=1.25 perl-socket=2.027 perl-storable=3.08 perl-sys-syslog=0.35 perl-term-ansicolor=4.06 perl-term-cap=1.17 perl-term-complete=1.403 perl-term-readline=1.17 perl-test-harness=3.42 perl-test-simple=1.302133 perl-test=1.31 perl-text-abbrev=1.02 perl-text-balanced=2.03 perl-text-parsewords=3.30 perl-text-tabs=2013.0523 perl-thread-queue=3.12 perl-thread-semaphore=2.13 perl-threads-shared=1.58 perl-threads=2.22 perl-tie-file=1.02 perl-tie-refhash=1.39 perl-time-hires=1.9759 perl-time-local=1.25 perl-time-piece=1.3204 perl-unicode-collate=1.25 perl-unicode-normalize=1.26 perl-version=0.9923 perl-xsloader=0.30 +Depends On : gdbm db glibc +Optional Deps : None +Required By : groff openssl texinfo +Optional For : vim +Conflicts With : None +Replaces : None +Installed Size : 57.47 MiB +Packager : Florian Pritz +Build Date : Wed Aug 1 08:43:05 2018 +Install Date : Wed Sep 12 10:54:57 2018 +Install Reason : Explicitly installed +Install Script : No +Validated By : Signature + +Name : systemd +Version : 239.0-2 +Description : system and service manager +Architecture : x86_64 +URL : https://www.github.com/systemd/systemd +Licenses : GPL2 LGPL2.1 +Groups : base-devel +Provides : nss-myhostname systemd-tools=239.0 udev=239.0 +Depends On : acl bash cryptsetup dbus iptables kbd kmod hwids libcap libgcrypt libsystemd libidn lz4 pam libelf libseccomp util-linux xz pcre2 +Optional Deps : libmicrohttpd: remote journald capabilities + quota-tools: kernel-level quota management + systemd-sysvcompat: symlink package to provide sysvinit binaries [installed] + polkit: allow administration as unprivileged user +Required By : dhcpcd netctl systemd-sysvcompat +Optional For : None +Conflicts With : nss-myhostname systemd-tools udev +Replaces : nss-myhostname systemd-tools udev +Installed Size : 18.96 MiB +Packager : Christian Hesse +Build Date : Fri Jun 22 15:04:34 2018 +Install Date : Wed Sep 12 10:55:12 2018 +Install Reason : Installed as a dependency for another package +Install Script : Yes +Validated By : Signature + +Name : vim +Version : 8.1.0333-1 +Description : Vi Improved, a highly configurable, improved version of the vi text editor +Architecture : x86_64 +URL : https://www.vim.org +Licenses : custom:vim +Groups : None +Provides : xxd vim-minimal vim-python3 +Depends On : vim-runtime=8.1.0333-1 gpm acl glibc libgcrypt pcre zlib libffi +Optional Deps : python2: Python 2 language support + python: Python 3 language support + ruby: Ruby language support + lua: Lua language support + perl: Perl language support [installed] + tcl: Tcl language support +Required By : None +Optional For : None +Conflicts With : gvim vim-minimal vim-python3 +Replaces : vim-python3 vim-minimal +Installed Size : 3.38 MiB +Packager : Levente Polyak +Build Date : Wed Aug 29 20:42:12 2018 +Install Date : Wed Sep 12 13:00:05 2018 +Install Reason : Explicitly installed +Install Script : No +Validated By : Signature + +Name : vim-runtime +Version : 8.1.0333-1 +Description : Vi Improved, a highly configurable, improved version of the vi text editor (shared runtime) +Architecture : x86_64 +URL : https://www.vim.org +Licenses : custom:vim +Groups : None +Provides : None +Depends On : None +Optional Deps : sh: support for some tools and macros [installed] + python: demoserver example tool + gawk: mve tools upport [installed] +Required By : vim +Optional For : None +Conflicts With : None +Replaces : None +Installed Size : 28.30 MiB +Packager : Levente Polyak +Build Date : Wed Aug 29 20:42:12 2018 +Install Date : Wed Sep 12 13:00:04 2018 +Install Reason : Installed as a dependency for another package +Install Script : No +Validated By : Signature + +Name : which +Version : 2.21-2 +Description : A utility to show the full path of commands +Architecture : x86_64 +URL : http://savannah.gnu.org/projects/which +Licenses : GPL3 +Groups : base base-devel +Provides : None +Depends On : glibc bash +Optional Deps : None +Required By : None +Optional For : None +Conflicts With : None +Replaces : None +Installed Size : 27.00 KiB +Packager : Sébastien Luttringer +Build Date : Sat May 14 13:11:33 2016 +Install Date : Wed Sep 12 10:55:29 2018 +Install Reason : Explicitly installed +Install Script : No +Validated By : Signature + +Name : xz +Version : 5.2.4-1 +Description : Library and command line tools for XZ and LZMA compressed files +Architecture : x86_64 +URL : https://tukaani.org/xz/ +Licenses : GPL LGPL custom +Groups : None +Provides : None +Depends On : sh +Optional Deps : None +Required By : kmod libarchive libelf libsystemd systemd zstd +Optional For : None +Conflicts With : None +Replaces : None +Installed Size : 757.00 KiB +Packager : Pierre Schmitz +Build Date : Mon Apr 30 03:18:54 2018 +Install Date : Wed Sep 12 10:55:01 2018 +Install Reason : Installed as a dependency for another package +Install Script : No +Validated By : Signature + +Name : zlib +Version : 1:1.2.11-3 +Description : Compression library implementing the deflate compression method found in gzip and PKZIP +Architecture : x86_64 +URL : https://www.zlib.net/ +Licenses : custom +Groups : None +Provides : None +Depends On : glibc +Optional Deps : None +Required By : cracklib curl file glib2 gnutls kmod libarchive libelf man-db pcre pcre2 sqlite vim zstd +Optional For : None +Conflicts With : None +Replaces : None +Installed Size : 327.00 KiB +Packager : Evangelos Foutras +Build Date : Mon Jul 23 07:01:05 2018 +Install Date : Wed Sep 12 10:55:02 2018 +Install Reason : Installed as a dependency for another package +Install Script : No +Validated By : Signature + +Name : zstd +Version : 1.3.5-1 +Description : Zstandard - Fast real-time compression algorithm +Architecture : x86_64 +URL : http://www.zstd.net/ +Licenses : BSD GPL2 +Groups : None +Provides : None +Depends On : zlib xz lz4 +Optional Deps : None +Required By : libarchive +Optional For : None +Conflicts With : None +Replaces : None +Installed Size : 2.64 MiB +Packager : Bartłomiej Piotrowski +Build Date : Tue Jul 3 10:19:18 2018 +Install Date : Wed Sep 12 10:55:22 2018 +Install Reason : Installed as a dependency for another package +Install Script : No +Validated By : Signature diff --git a/resources/macos/system_profiler/dual-display-#475 b/resources/macos/system_profiler/dual-display-#475 new file mode 100644 index 0000000000..46303bda43 --- /dev/null +++ b/resources/macos/system_profiler/dual-display-#475 @@ -0,0 +1,41 @@ +Graphics/Displays: + + Intel HD Graphics 530: + + Chipset Model: Intel HD Graphics 530 + Type: GPU + Bus: Built-In + VRAM (Dynamic, Max): 1536 MB + Vendor: Intel + Device ID: 0x191b + Revision ID: 0x0006 + Automatic Graphics Switching: Supported + gMux Version: 4.0.29 [3.2.8] + Metal: Supported, feature set macOS GPUFamily1 v3 + + Radeon Pro 450: + + Chipset Model: AMD Radeon Pro 450 + Type: GPU + Bus: PCIe + PCIe Lane Width: x8 + VRAM (Dynamic, Max): 2048 MB + Vendor: AMD (0x1002) + Device ID: 0x67ef + Revision ID: 0x00ef + ROM Revision: 113-C980AF-908 + VBIOS Version: 113-C9801AL-028 + EFI Driver Version: 01.00.908 + Automatic Graphics Switching: Supported + gMux Version: 4.0.29 [3.2.8] + Metal: Supported, feature set macOS GPUFamily1 v3 + Displays: + Color LCD: + Display Type: Built-In Retina LCD + Resolution: 2880 x 1800 Retina + Framebuffer Depth: 24-Bit Color (ARGB8888) + Main Display: Yes + Mirror: Off + Online: Yes + Rotation: Supported + Automatically Adjust Brightness: No diff --git a/share/pci.ids b/share/pci.ids index f04dd8f2ec..4c31bc80bf 100644 --- a/share/pci.ids +++ b/share/pci.ids @@ -1,8 +1,8 @@ # # List of PCI ID's # -# Version: 2018.06.29 -# Date: 2018-06-29 03:15:02 +# Version: 2018.10.02 +# Date: 2018-10-02 03:15:02 # # Maintained by Albert Pool, Martin Mares, and other volunteers from # the PCI ID Project at http://pci-ids.ucw.cz/. @@ -428,6 +428,7 @@ 17aa 1052 ThinkServer RAID 720i 17aa 1053 ThinkServer RAID 720ix 1d49 0600 ThinkSystem RAID 730-8i 1GB Cache PCIe 12Gb Adapter + 1d49 0608 ThinkSystem RAID 730-8i 2GB Flash PCIe 12Gb Adapter 1d49 0609 ThinkSystem RAID 730-8i 4GB Flash PCIe 12Gb Adapter 8086 351e RMS3CC080 RAID Controller 8086 351f RMS3CC040 RAID Controller @@ -483,6 +484,7 @@ 0070 SAS2004 PCI-Express Fusion-MPT SAS-2 [Spitfire] 0071 MR SAS HBA 2004 0072 SAS2008 PCI-Express Fusion-MPT SAS-2 [Falcon] + 1000 30b0 9200-8e [LSI SAS 6Gb/s SAS/SATA PCIe x8 External HBA] 1028 1f1c 6Gbps SAS HBA Adapter 1028 1f1d PERC H200 Adapter 1028 1f1e PERC H200 Integrated @@ -650,6 +652,8 @@ 02b0 Virtual Endpoint on PCIe Switch 1d49 0001 ThinkSystem 1610-4P NVMe Switch Adapter 1d49 0002 ThinkSystem 810-4P NVMe Switch Adapter + 02b1 Virtual Endpoint on PCIe Switch (9749) + 1d49 0004 ThinkSystem 1610-8P NVMe Switch Adapter 0407 MegaRAID 1000 0530 MegaRAID 530 SCSI 320-0X RAID Controller 1000 0531 MegaRAID 531 SCSI 320-4X RAID Controller @@ -772,6 +776,7 @@ 131b Kaveri [Radeon R4 Graphics] 131c Kaveri [Radeon R7 Graphics] 131d Kaveri [Radeon R6 Graphics] + 15d8 Picasso 15dd Raven Ridge [Radeon Vega Series / Radeon Vega Mobile Series] 103c 83c6 Radeon Vega 8 Mobile 1458 d000 Radeon RX Vega 11 @@ -1662,7 +1667,8 @@ 106b 014b Tropo XT [Radeon R9 M380 Mac Edition] 6641 Saturn PRO [Radeon HD 8930M] 6646 Bonaire XT [Radeon R9 M280X] - 6647 Bonaire PRO [Radeon R9 M270X] + 6647 Saturn PRO/XT [Radeon R9 M270X/M280X] + 1043 223d N551ZU laptop Radeon R9 M280X 6649 Bonaire [FirePro W5100] 1002 0b0c FirePro W4300 103c 0b0c Bonaire [FirePro W4300] @@ -2336,7 +2342,7 @@ 1458 22f0 Radeon RX 570 1458 22f7 Radeon RX 570 Gaming 4G 1462 3411 Radeon RX 470 - 1462 3413 Radeon RX 480 + 1462 3413 Radeon RX 480 Gaming X 8GB 1462 3416 Radeon RX 570 1462 3418 Radeon RX 580 Armor 4G OC 148c 2372 Radeon RX 480 @@ -2349,7 +2355,7 @@ 1787 a470 Radeon RX 470 1787 a480 Radeon RX 480 1849 5001 Phantom Gaming X RX 580 OC - 1da2 e353 Sapphire Radeon RX 580 Pulse 8GB + 1da2 e353 Radeon RX 570 Pulse 4GB 1da2 e366 Nitro+ Radeon RX 580 4GB 67e0 Baffin [Radeon Pro WX 4170] 103c 8270 Radeon Pro WX 4170 @@ -2367,12 +2373,14 @@ 103c 8277 Radeon Pro WX 4150 67e9 Baffin [Polaris11] 67eb Baffin [Radeon Pro V5300X] - 67ef Baffin [Radeon RX 460/560D / Pro 450/455/460/555/560] + 67ef Baffin [Radeon RX 460/560D / Pro 450/455/460/555/555X/560/560X] 106b 0160 Radeon Pro 460 106b 0166 Radeon Pro 455 106b 0167 Radeon Pro 450 106b 0179 Radeon Pro 560 106b 017a Radeon Pro 555 + 106b 018f Radeon Pro 560X + 106b 0190 Radeon Pro 555X 1642 1727 Polaris 21 XL [Radeon RX 560D] 1682 956d Polaris 21 XL [Radeon RX 560D] 67ff Baffin [Radeon RX 550 640SP / RX 560/560X] @@ -2458,8 +2466,9 @@ 15c3 2b1e MED-X6000 6829 Cape Verde 682a Venus PRO - 682b Venus LE / Tropo PRO-L [Radeon HD 8830M / R7 M465X] + 682b Cape Verde PRO / Venus LE / Tropo PRO-L [Radeon HD 8830M / R7 250 / R7 M465X] 0128 079c Radeon R7 465X + 1462 3012 Radeon R7 250 682c Cape Verde GL [FirePro W4100] 682d Chelsea XT GL [FirePro M4000] 682f Chelsea LP [Radeon HD 7730M] @@ -2602,7 +2611,7 @@ 6867 Vega 10 XL [Radeon Pro Vega 56] 6868 Vega 10 [Radeon PRO WX 8100] 686c Vega 10 [Radeon Instinct MI25 MxGPU] - 687f Vega 10 XT [Radeon RX Vega 64] + 687f Vega 10 XL/XT [Radeon RX Vega 56/64] 6880 Lexington [Radeon HD 6550M] 103c 163c Pavilion dv6 Radeon HD 6550M 6888 Cypress XT [FirePro V8800] @@ -3119,7 +3128,7 @@ # Make naming scheme consistent 174b e308 Radeon R9 380 Nitro 4G D5 694c Polaris 22 [Radeon RX Vega M GH] - 694e Polaris 22 [Radeon RX Vega M GL] + 694e Polaris 22 XL [Radeon RX Vega M GL] 6980 Polaris12 6981 Polaris12 6985 Lexa XT [Radeon PRO WX 3100] @@ -3651,6 +3660,7 @@ # I have a Tonga card and this is the HDMI Audio part aad8 Tonga HDMI Audio [Radeon R9 285/380] 174b aad8 Radeon R9 285/380 HDMI Audio + aae0 Baffin HDMI/DP Audio [Radeon RX 550 640SP / RX 560/560X] aae8 Fiji HDMI/DP Audio [Radeon R9 Nano / FURY/FURY X] aaf0 Ellesmere [Radeon RX 580] ac00 Theater 600 Pro @@ -4074,6 +4084,7 @@ 03dc POWER8 Host Bridge (PHB3) 044b GenWQE Accelerator Adapter 04aa Flash Adapter 90 (PCIe2 0.9TB) + 04c1 POWER9 Host Bridge (PHB4) 04da PCI-E IPR SAS+ Adapter (ASIC) 1014 04fb PCIe3 x16 20GB Cache 12Gb Quad SAS RAID+ Adapter(580B) 1014 04fc PCIe3 x8 12Gb Quad SAS RAID+ Adapter(580A) @@ -4315,10 +4326,16 @@ 43a1 Hudson PCI to PCI bridge (PCIE port 1) 43a2 Hudson PCI to PCI bridge (PCIE port 2) 43a3 Hudson PCI to PCI bridge (PCIE port 3) + 43b0 X370 Series Chipset PCIe Upstream Port + 1849 43c6 Fatal1ty X370 Professional Gaming 43b1 X399 Series Chipset PCIe Bridge 43b4 300 Series Chipset PCIe Port + 43b5 X370 Series Chipset SATA Controller + 1849 43c8 Fatal1ty X370 Professional Gaming 43b6 X399 Series Chipset SATA Controller 43b7 300 Series Chipset SATA Controller + 43b9 X370 Series Chipset USB 3.1 xHCI Controller + 1849 43d0 Fatal1ty X370 Professional Gaming 43ba X399 Series Chipset USB 3.1 xHCI Controller 43bb 300 Series Chipset USB 3.1 xHCI Controller 7006 AMD-751 [Irongate] System Controller @@ -5370,6 +5387,7 @@ 3306 Integrated Lights-Out Standard Slave Instrumentation & System Support 103c 330e iLO3 103c 3381 iLO4 + 1590 00e4 iLO5 3307 Integrated Lights-Out Standard Management Processor Support and Messaging # HP DL380 G6 103c 3309 iLO 2 @@ -6249,6 +6267,8 @@ 0074 U4 HT Bridge # should be 14e4:1645 1645 Broadcom NetXtreme BCM5701 Gigabit Ethernet + 1801 T2 Bridge Controller + 1802 T2 Secure Enclave Processor 2001 S1X NVMe Controller 2002 S3ELab NVMe Controller 2003 S3X NVMe Controller @@ -6364,6 +6384,8 @@ 1077 02a8 QLE2692 Dual Port 16Gb FC to PCIe Gen3 x8 Adapter 1077 02ab QLE2740 Single Port 32Gb FC to PCIe Gen3 x8 Adapter 1077 02ac QLE2742 Dual Port 32Gb FC to PCIe Gen3 x8 Adapter + 1077 02b8 2x16Gb QME2692 FC HBA + 1077 02b9 2x32Gb QME2742 FC HBA 1590 00f9 StoreFabric SN1100Q 16Gb Single Port Fibre Channel Host Bus Adapter 1590 00fa StoreFabric SN1100Q 16Gb Dual Port Fibre Channel Host Bus Adapter 1590 0203 StoreFabric SN1600Q 32Gb Single Port Fibre Channel Host Bus Adapter @@ -6433,6 +6455,8 @@ 1077 0007 QLogic 2x1GE+2x10GE QL41264HMCU CNA 1077 0009 QLogic 2x1GE+2x10GE QL41162HMRJ CNA 1077 000b 25GE 2P QL41262HxCU-DE Adapter + 1077 000f 2x25GE QL41262HMKR CNA + 1077 0010 2x25GE QL41232HMKR NIC 1077 0011 FastLinQ QL41212HLCU 25GbE Adapter 1077 0012 FastLinQ QL41112H 10GbE Adapter 1077 0019 QL41232HOCU - Dual Port 25/10GbE SFP28 OCP Adapter @@ -6453,6 +6477,7 @@ 1077 000c QLogic 2x25GE QL41262HMCU CNA 1077 000d FastLinQ QL41262H 25GbE FCoE Adapter 1077 000e FastLinQ QL41162H 10GbE FCoE Adapter + 1077 000f 2x25GE QL41262HMKR CNA 8084 FastLinQ QL41000 Series 10/25/40/50GbE Controller (iSCSI) 1077 0001 10GE 2P QL41162HxRJ-DE Adapter 1077 0002 10GE 2P QL41112HxCU-DE Adapter @@ -6466,6 +6491,7 @@ 1077 000c QLogic 2x25GE QL41262HMCU CNA 1077 000d FastLinQ QL41262H 25GbE iSCSI Adapter 1077 000e FastLinQ QL41162H 10GbE iSCSI Adapter + 1077 000f 2x25GE QL41262HMKR CNA 8090 FastLinQ QL41000 Series Gigabit Ethernet Controller (SR-IOV VF) 1077 0001 25GE 2P QL41262HxCU-DE Adapter 1077 0002 10GE 2P QL41112HxCU-DE Adapter @@ -6479,6 +6505,8 @@ 1077 000c QLogic 2x25GE QL41262HMCU CNA 1077 000d FastLinQ QL41262H 25GbE FCoE Adapter (SR-IOV VF) 1077 000e FastLinQ QL41162H 10GbE iSCSI Adapter (SR-IOV VF) + 1077 000f 2x25GE QL41262HMKR CNA + 1077 0010 2x25GE QL41232HMKR NIC 1077 0011 FastLinQ QL41212H 25GbE Adapter (SR-IOV VF) 1077 0012 FastLinQ QL41112H 10GbE Adapter (SR-IOV VF) 1590 021e 10/25GbE 2P QL41162HMRJ-HP Adapter @@ -7483,6 +7511,7 @@ 036c Bt879(??) Video Capture 13e9 0070 Win/TV (Video Section) 036e Bt878 Video Capture + 0000 0001 Euresys Picolo PCIe 0070 13eb WinTV Series 0070 ff01 Viewcast Osprey 200 0071 0101 DigiTV PCI @@ -7577,6 +7606,7 @@ 1851 1851 FlyVideo'98 EZ - video 1852 1852 FlyVideo'98 (with FM Tuner) 0878 Bt878 Audio Capture + 0000 0001 Euresys Picolo PCIe 0070 13eb WinTV Series 0070 ff01 Viewcast Osprey 200 0071 0101 DigiTV PCI @@ -7941,6 +7971,7 @@ 1d49 0001 ThinkSystem 1610-4P NVMe Switch Adapter 1d49 0002 ThinkSystem 810-4P NVMe Switch Adapter 9749 PEX 9749 49-lane, 13-port PCI Express Gen 3 (8.0 GT/s) Switch + 1d49 0004 ThinkSystem 1610-8P NVMe Switch Adapter a100 Blackmagic Design DeckLink bb04 B&B 3PCIOSD1A Isolated PCI Serial c001 CronyxOmega-PCI (8-port RS232) @@ -9454,6 +9485,7 @@ 040f G84GL [Quadro FX 1700] 0410 G92 [GeForce GT 330] 0414 G92 [GeForce 9800 GT] + 0418 G92 [GeForce GT 330 OEM] 0420 G86 [GeForce 8400 SE] 0421 G86 [GeForce 8500 GT] 1462 0960 NX8500GT-TD512EH/M2 @@ -10314,10 +10346,12 @@ 0f00 GF108 [GeForce GT 630] 0f01 GF108 [GeForce GT 620] 0f02 GF108 [GeForce GT 730] + 0f03 GF108 [GeForce GT 610] 0f06 GF108 [GeForce GT 730] 0fb0 GM200 High Definition Audio 0fb8 GP108 High Definition Audio Controller 0fb9 GP107GL High Definition Audio Controller + 0fba GM206 High Definition Audio Controller 0fbb GM204 High Definition Audio Controller 0fc0 GK107 [GeForce GT 640 OEM] 0fc1 GK107 [GeForce GT 640] @@ -10403,7 +10437,7 @@ # 06G-P4-2795-KR 3842 2795 GeForce GTX Titan SC Hydro Copper Signature 1007 GK110 [GeForce GTX 780 Rev. 2] - 1008 GK110 [GeForce GTX 780 Ti Rev. 2] + 1008 GK110 [GeForce GTX 780 Ti 6GB] 100a GK110B [GeForce GTX 780 Ti] 100c GK110B [GeForce GTX TITAN Black] 101e GK110GL [Tesla K20X] @@ -11037,6 +11071,7 @@ 1392 GM107M [GeForce GTX 860M] 1393 GM107M [GeForce 840M] 1398 GM107M [GeForce 845M] + 1399 GM107M [GeForce 945M] 139a GM107M [GeForce GTX 950M] 17aa 362c GeForce GTX 950A 17aa 362f GeForce GTX 950A @@ -11045,6 +11080,7 @@ 17aa 3647 GeForce GTX 950A 17aa 36b9 GeForce GTX 950A 139b GM107M [GeForce GTX 960M] + 1028 06e4 XPS 15 9550 103c 2b4c GeForce GTX 960A 139c GM107M [GeForce 940M] 139d GM107M [GeForce GTX 750 Ti] @@ -11110,6 +11146,7 @@ 174d GM108M [GeForce MX130] 174e GM108M [GeForce MX110] 1789 GM107GL [GRID M3-3020] + 179c GM107 [GeForce 940MX] 17c2 GM200 [GeForce GTX TITAN X] 17c8 GM200 [GeForce GTX 980 Ti] 17f0 GM200GL [Quadro M6000] @@ -11118,6 +11155,7 @@ 1b00 GP102 [TITAN X] 1b01 GP102 1b02 GP102 [TITAN Xp] + 1b04 GP102 1b06 GP102 [GeForce GTX 1080 Ti] 1b07 GP102 [P102-100] 1b30 GP102GL [Quadro P6000] @@ -11136,23 +11174,27 @@ 1462 11e8 GeForce GTX 1070 Max-Q 1462 11e9 GeForce GTX 1070 Max-Q 1558 9501 GeForce GTX 1070 Max-Q + 1ba2 GP104M [GeForce GTX 1070 Mobile] 1bad GP104 [GeForce GTX 1070 Engineering Sample] 1bb0 GP104GL [Quadro P5000] 1bb1 GP104GL [Quadro P4000] 1bb3 GP104GL [Tesla P4] 1bb4 GP104GL [Tesla P6] 1bb5 GP104GLM [Quadro P5200 Mobile] + 103c 842f P5200 [Zbook 17 G5 mobile workstation] 1bb6 GP104GLM [Quadro P5000 Mobile] 1bb7 GP104GLM [Quadro P4000 Mobile] 1462 11e9 Quadro P4000 Max-Q 1bb8 GP104GLM [Quadro P3000 Mobile] 1bb9 GP104GLM [Quadro P4200 Mobile] + 103c 842f P4200 [Zbook 17 G5 mobile workstation] 1bbb GP104GLM [Quadro P3200 Mobile] + 103c 842f P3200 [Zbook 17 G5 moble workstation] 1bc7 GP104 [P104-101] - 1be0 GP104M [GeForce GTX 1080 Mobile] + 1be0 GP104BM [GeForce GTX 1080 Mobile] 1028 07c0 GeForce GTX 1080 Max-Q 1458 355b GeForce GTX 1080 Max-Q - 1be1 GP104M [GeForce GTX 1070 Mobile] + 1be1 GP104BM [GeForce GTX 1070 Mobile] 1c00 GP106 1c01 GP106 1c02 GP106 [GeForce GTX 1060 3GB] @@ -11167,17 +11209,19 @@ 1c22 GP106M [GeForce GTX 1050 Mobile] 1c30 GP106GL [Quadro P2000] 1c35 GP106 - 1c60 GP106M [GeForce GTX 1060 Mobile 6GB] + 1c60 GP106BM [GeForce GTX 1060 Mobile 6GB] 103c 8390 GeForce GTX 1060 Max-Q 6GB - 1c61 GP106M [GeForce GTX 1050 Ti Mobile] - 1c62 GP106M [GeForce GTX 1050 Mobile] + 1c61 GP106BM [GeForce GTX 1050 Ti Mobile] + 1c62 GP106BM [GeForce GTX 1050 Mobile] 1c70 GP106GL - 1c80 GP107 [GeForce GTX 1050 3GB] 1c81 GP107 [GeForce GTX 1050] 1c82 GP107 [GeForce GTX 1050 Ti] + 1c83 GP107 [GeForce GTX 1050 3GB] 1c8c GP107M [GeForce GTX 1050 Ti Mobile] 1c8d GP107M [GeForce GTX 1050 Mobile] 1c8e GP107M + 1c8f GP107M [GeForce GTX 1050 Ti Max-Q] + 1c92 GP107M [GeForce GTX 1050 Mobile] 1ca7 GP107GL 1ca8 GP107GL 1caa GP107GL @@ -11186,8 +11230,16 @@ 1cb3 GP107GL [Quadro P400] 1cb6 GP107GL [Quadro P620] 1cba GP107GLM [Quadro P2000 Mobile] + 103c 842c P2000 [Zbook 15 G5 mobile workstation] + 103c 842f P2000 [Zbook 17 G5 mobile workstation] 1cbb GP107GLM [Quadro P1000 Mobile] + 103c 8429 P1000 [Zbook Studio G5 mobile workstation] + 103c 842c P1000 [Zbook 15 G5 mobile workstation] + 103c 842f P1000 [Zbook 17 G5 mobile workstation] + 103c 8451 P1000 [Zbook Studio x360 G5 mobile workstation] 1cbc GP107GLM [Quadro P600 Mobile] + 1ccc GP107BM [GeForce GTX 1050 Ti Mobile] + 1ccd GP107BM [GeForce GTX 1050 Mobile] 1d01 GP108 [GeForce GT 1030] 1d10 GP108M [GeForce MX150] 1d12 GP108M [GeForce MX150] @@ -11201,6 +11253,20 @@ 1db6 GV100GL [Tesla V100 PCIe 32GB] 1db7 GV100GL [Tesla V100 DGXS 32GB] 1dba GV100GL [Quadro GV100] + 10de 12eb TITAN V CEO Edition + 1e02 TU102 + 1e04 TU102 [GeForce RTX 2080 Ti] + 1e07 TU102 [GeForce RTX 2080 Ti Rev. A] + 1462 3715 RTX 2080 Ti GAMING X TRIO + 1e30 TU102GL + 1e3c TU102GL [Quadro RTX 6000] + 1e3d TU102GL + 1e82 TU104 [GeForce RTX 2080] + 1e87 TU104 [GeForce RTX 2080 Rev. A] + 1eab TU104M [GeForce RTX 2080 Mobile] + 1eae TU104M + 1f02 TU106 [GeForce RTX 2070] + 1f07 TU106 [GeForce RTX 2070 Rev. A] 10df Emulex Corporation 0720 OneConnect NIC (Skyhawk) 103c 1934 FlexFabric 20Gb 2-port 650M Adapter @@ -11263,6 +11329,7 @@ f400 LPe36000 Fibre Channel Host Adapter [Prism] 10df f401 LPe35000 Fibre Channel Host Adapter [Prism] 10df f402 LPe35000 Fibre Channel Host Adapter [Prism] + 10df f410 LPe35002-M2-D 2-Port 32Gb Fibre Channel Adapter f700 LP7000 Fibre Channel Host Adapter f701 LP7000 Fibre Channel Host Adapter Alternate ID (JX1:2-3, JX2:1-2) f800 LP8000 Fibre Channel Host Adapter @@ -11310,6 +11377,7 @@ 1775 1100 VR11 Single Board Computer 0860 CA91C860 [QSpan] 0862 CA91C862A [QSpan-II] + 8111 Tsi381 PCIe to PCI Bridge 8260 CA91L8200B [Dual PCI PowerSpan II] 8261 CA91L8260B [Single PCI PowerSpan II] a108 Tsi109 Host Bridge for Dual PowerPC @@ -11385,6 +11453,7 @@ 524a RTS524A PCI Express Card Reader 5250 RTS5250 PCI Express Card Reader 525a RTS525A PCI Express Card Reader + 1028 06e4 XPS 15 9550 17aa 224f ThinkPad X1 Carbon 5th Gen 5286 RTS5286 PCI Express Card Reader 5287 RTL8411B PCI Express Card Reader @@ -11544,6 +11613,7 @@ 10ec 8739 Dell Wireless 1801 b822 RTL8822BE 802.11a/b/g/n/ac WiFi adapter c821 RTL8821CE 802.11ac PCIe Wireless Network Adapter + d723 RTL8723DE 802.11b/g/n PCIe Adapter 10ed Ascii Corporation 7310 V7310 10ee Xilinx Corporation @@ -12675,7 +12745,8 @@ 1127 0400 ForeRunnerHE ATM 1129 Firmworks 112a Hermes Electronics Company, Ltd. -112b Linotype - Hell AG +# nee Linotype - Hell AG +112b Heidelberger Druckmaschinen AGHeidelberger Druckmaschinen AG 112c Zenith Data Systems 112d Ravicad 112e Infomedia Microelectronics Inc. @@ -13806,6 +13877,10 @@ 0003 FireStream 50 119f Bull HN Information Systems 1081 BXI Host Channel Adapter +# BXI stands for Bull eXascale Interconnect + 1101 BXI Host Channel Adapter v1.2 +# BXI stands for Bull eXascale Interconnect + 1121 BXI Host Channel Adapter v1.3 11a0 Convex Computer Corporation 11a1 Hamamatsu Photonics K.K. 11a2 Sierra Research and Technology @@ -14345,6 +14420,7 @@ 7384 PM7384 [FREEDM - 84P672 Frm Engine & Datalink Mgr] 8000 PM8000 [SPC - SAS Protocol Controller] 8009 PM8009 SPCve 8x6G + 8018 PM8018 Adaptec SAS Adaptor ASA-70165H PCIe Gen3 x8 6 Gbps 16-lane 4x SFF-8644 8032 PM8032 Tachyon QE8 117c 003a Celerity FC-81EN Fibre Channel Adapter 117c 003b Celerity FC-82EN Fibre Channel Adapter @@ -16200,9 +16276,10 @@ 1612 0000 PCI-1612 4-port RS-232/422/485 1711 PCI-1711 16-channel data acquisition card 12-bit, 100kS/s 1733 PCI-1733 32-channel isolated digital input card - 1752 PCI-1752 - 1754 PCI-1754 - 1756 PCI-1756 + 1734 PCI-1734 32-channel isolated digital output card + 1752 PCI-1752 64-channel Isolated Digital Output Card + 1754 PCI-1754 64-channel Isolated Digital Input Card + 1756 PCI-1756 64-ch Isolated Digital I/O PCI Card # FPGA bridge to two SJA1000 c302 MIOe-3680 2-Port CAN-Bus MIOe Module with Isolation Protection 13ff Silicon Spice Inc @@ -16665,6 +16742,9 @@ 50ab T520-50AB Unified Wire Ethernet Controller 50ac T540-50AC Unified Wire Ethernet Controller 50ad T520-50AD Unified Wire Ethernet Controller + 50ae T540-50AE Unified Wire Ethernet Controller + 50af T580-50AF Unified Wire Ethernet Controller + 50b0 T520-50B0 Unified Wire Ethernet Controller 5401 T520-CR Unified Wire Ethernet Controller 5402 T522-CR Unified Wire Ethernet Controller 5403 T540-CR Unified Wire Ethernet Controller @@ -16732,6 +16812,9 @@ 54ab T520-50AB Unified Wire Ethernet Controller 54ac T540-50AC Unified Wire Ethernet Controller 54ad T520-50AD Unified Wire Ethernet Controller + 54ae T540-50AE Unified Wire Ethernet Controller + 54af T580-50AF Unified Wire Ethernet Controller + 54b0 T520-50B0 Unified Wire Ethernet Controller 5501 T520-CR Unified Wire Storage Controller 5502 T522-CR Unified Wire Storage Controller 5503 T540-CR Unified Wire Storage Controller @@ -16799,6 +16882,9 @@ 55ab T520-50AB Unified Wire Storage Controller 55ac T540-50AC Unified Wire Storage Controller 55ad T520-50AD Unified Wire Storage Controller + 55ae T540-50AE Unified Wire Storage Controller + 55af T580-50AF Unified Wire Storage Controller + 55b0 T520-50B0 Unified Wire Storage Controller 5601 T520-CR Unified Wire Storage Controller 5602 T522-CR Unified Wire Storage Controller 5603 T540-CR Unified Wire Storage Controller @@ -16866,6 +16952,9 @@ 56ab T520-50AB Unified Wire Storage Controller 56ac T540-50AC Unified Wire Storage Controller 56ad T520-50AD Unified Wire Storage Controller + 56ae T540-50AE Unified Wire Storage Controller + 56af T580-50AF Unified Wire Storage Controller + 56b0 T520-50B0 Unified Wire Storage Controller 5701 T520-CR Unified Wire Ethernet Controller 5702 T522-CR Unified Wire Ethernet Controller 5703 T540-CR Unified Wire Ethernet Controller @@ -16972,6 +17061,9 @@ 58ab T520-50AB Unified Wire Ethernet Controller [VF] 58ac T540-50AC Unified Wire Ethernet Controller [VF] 58ad T520-50AD Unified Wire Ethernet Controller [VF] + 58ae T540-50AE Unified Wire Ethernet Controller [VF] + 58af T580-50AF Unified Wire Ethernet Controller [VF] + 58b0 T520-50B0 Unified Wire Ethernet Controller [VF] 6001 T6225-CR Unified Wire Ethernet Controller 6002 T6225-SO-CR Unified Wire Ethernet Controller 6003 T6425-CR Unified Wire Ethernet Controller @@ -17451,8 +17543,7 @@ 14e1 INVERTEX 14e2 INFOLIBRIA 14e3 AMTELCO -# Formerly Broadcom Corporation -14e4 Broadcom Limited +14e4 Broadcom Inc. and subsidiaries 0576 BCM43224 802.11a/b/g/n 0800 Sentry5 Chipcommon I/O Controller 0804 Sentry5 PCI Bridge @@ -18166,7 +18257,10 @@ 5840 BCM5840 Crypto Accelerator 5841 BCM5841 Crypto Accelerator 5850 BCM5850 Crypto Accelerator + 5e87 Valkyrie offload engine 8602 BCM7400/BCM7405 Serial ATA Controller + 9026 CN99xx [ThunderX2] Integrated USB 3.0 xHCI Host Controller + 9027 CN99xx [ThunderX2] Integrated AHCI/SATA 3 Host Controller a8d8 BCM43224/5 Wireless Network Adapter aa52 BCM43602 802.11ac Wireless LAN SoC b302 BCM56302 StrataXGS 24x1GE 2x10GE Switch Controller @@ -18184,6 +18278,10 @@ b850 Broadcom BCM56850 Switch ASIC # Tomahawk b960 Broadcom BCM56960 Switch ASIC + d802 BCM58802 Stingray 50Gb Ethernet SoC + 14e4 8024 Stingray Dual-Port 25Gb Ethernet PCIe SmartNIC w4GB DRAM + 14e4 8028 Stingray Dual-Port 25Gb Ethernet PCIe SmartNIC w8GB DRAM + d804 BCM58804 Stingray 100Gb Ethernet SoC 14e5 Pixelfusion Ltd 14e6 SHINING Technology Inc 14e7 3CX @@ -18929,6 +19027,9 @@ 1021 MT28861 1974 MT28800 Family [ConnectX-5 PCIe Bridge] 1975 MT416842 Family [BlueField SoC PCIe Bridge] + 4117 MT27712A0-FDCF-AE + 1bd4 0039 SN10XMP2P25 + 1bd4 004d SN10XMP2P25,YZPC-01191-101 5274 MT21108 InfiniBridge 5a44 MT23108 InfiniHost 5a45 MT23108 [Infinihost HCA Flash Recovery] @@ -19273,6 +19374,8 @@ 7191 Proc10a_48S 71a1 Proc10a_66S 71b1 Proc10A + 72b1 HawkEye + 73b1 Proc10s 165d Hsing Tech. Enterprise Co., Ltd. 165f Linux Media Labs, LLC 1020 LMLM4 MPEG-4 encoder @@ -19303,6 +19406,7 @@ 167e ONNTO Corp. 1681 Hercules 1682 XFX Pine Group Inc. + c580 Radeon RX 580 1688 CastleNet Technology Inc. 1170 WLAN 802.11b card # nee Atheros Communications, Inc. @@ -19618,6 +19722,8 @@ 4353 PMC-DX2003 Reconfigurable FPGA with TTL and Differential I/O 4357 PMC-DX502 Reconfigurable Differential I/O Module 4457 PMC730, APC730, AcPC730 Multifunction Module + 4471 XMC730 Multi-function I/O module with front I/O + 4473 XMC730CC Multi-function I/O module with rear I/O Conduction-cooled 464d PMC408 32-Channel Digital Input/Output Module 4850 PMC220-16 12-Bit Analog Output Module 4a42 PMC483, APC483, AcPC483 Counter Timer Module @@ -19855,6 +19961,8 @@ a100 THUNDERX CN88XX 48 core SoC a200 OCTEON TX CN81XX/CN80XX a300 OCTEON TX CN83XX + af00 CN99xx [ThunderX2] Integrated PCI Host bridge + af84 CN99xx [ThunderX2] Integrated PCI Express RP Bridge 1787 Hightech Information System Ltd. 1789 Ennyah Technologies Corp. # also used by Struck Innovative Systeme for joint developments @@ -19913,6 +20021,7 @@ 7163 GL9701 PCIe to PCI Bridge 8083 GL880 USB 1.1 UHCI controller 8084 GL880 USB 2.0 EHCI controller + 9750 GL9750 SD Host Controller 17aa Lenovo 402b Intel 82599ES 10Gb 2-port Server Adapter X520-2 17ab Phillips Components @@ -20542,16 +20651,19 @@ 1924 8019 SFN8542-R2 8000 Series 10/40G Adapter 1924 801a SFN8722-R1 8000 Series OCP 10G Adapter 1924 801b SFN8522-R3 8000 Series 10G Adapter - 0b03 SFC9250 10/25/40/50/100G Ethernet Controller + 1924 801c SFN8042-R3 8000 Series 10/40G Adapter + 1924 8021 SFN8041-R1 8000 Series 10/40G Adapter + 0b03 XtremeScale SFC9250 10/25/40/50/100G Ethernet Controller 1924 801d x2522-R1 2000 Series 10/25G Adapter 1924 801e x2542-R1 2000 Series 40/100G Adapter - 1924 8022 x2522-R2 2000 Series 10/25G Adapter + 1924 8022 XtremeScale X2522 10G Network Adapter + 1924 8028 XtremeScale X2522-25G Network Adapter 1803 SFC9020 10G Ethernet Controller (Virtual Function) 1813 SFL9021 10GBASE-T Ethernet Controller (Virtual Function) 1903 SFC9120 10G Ethernet Controller (Virtual Function) 1923 SFC9140 10/40G Ethernet Controller (Virtual Function) 1a03 SFC9220 10/40G Ethernet Controller (Virtual Function) - 1b03 SFC9250 10/25/40/50/100G Ethernet Controller (Virtual Function) + 1b03 XtremeScale SFC9250 10/25/40/50/100G Ethernet Controller (Virtual Function) 6703 SFC4000 rev A iSCSI/Onload [Solarstorm] 10b8 0102 SMC10GPCIe-10BT (A2) [TigerCard] 10b8 0103 SMC10GPCIe-10BT (A3) [TigerCard] @@ -20567,6 +20679,7 @@ 1924 0500 SFE4005-A0 c101 EF1-21022T [EtherFabric] 192a BiTMICRO Networks Inc. + 0008 RAMPART 192e TransDimension 1931 Option N.V. 000c Qualcomm MSM6275 UMTS chip @@ -20739,6 +20852,7 @@ 0102 NodalCore C-2000 Content Classification Accelerator 0105 NodalCore C-3000 Content Classification Accelerator 196d Club-3D BV +196e PNY 1971 AGEIA Technologies, Inc. 1011 Physics Processing Unit [PhysX] 1043 0001 PhysX P1 @@ -20779,6 +20893,7 @@ 1982 Distant Early Warning Communications Inc 1600 OX16C954 HOST-A 16ff OX16C954 HOST-B +1987 Phison Electronics Corporation 1989 Montilio Inc. 0001 RapidFile Bridge 8001 RapidFile @@ -20887,6 +21002,7 @@ a238 HiSilicon USB 3.0 Host Controller a239 HiSilicon USB 2.0 2-port Host Controller a23a HiSilicon USB 2.0 Host Controller + a23b HiSilicon USB 1.1 Host Controller a250 HiSilicon ZIP Engine a251 HiSilicon ZIP Engine(Virtual Function) a255 HiSilicon SEC Engine @@ -21009,6 +21125,7 @@ 0009 RAIDCore Controller 000a RAIDCore Controller 1aae Global Velocity, Inc. +1ab4 Distributed Management Task Force, Inc. (DMTF)Distributed Management Task Force, Inc. (DMTF) 1ab6 CalDigit, Inc. 6201 RAID Card # Parallels VM virtual devices @@ -21036,7 +21153,7 @@ 0a44 microEnable IV-FULL x4 0e44 microEnable IV-GigE x4 1ae9 Wilocity Ltd. - 0101 Wil6200 PCI Express Root Port + 0101 Wil6200 PCI Express Upstream Port 0200 Wil6200 PCI Express Port 0201 Wil6200 Wireless PCI Express Port 0301 Wil6200 802.11ad Wireless Network Adapter @@ -21113,8 +21230,22 @@ 1080 ASM1083/1085 PCIe to PCI Bridge 1849 1080 Motherboard 1142 ASM1042A USB 3.0 Host Controller + 1184 ASM1184e PCIe Switch Port + 1849 1184 ASM1184e PCIe Switch 1242 ASM1142 USB 3.1 Host Controller 1343 ASM1143 USB 3.1 Host Controller + 2142 ASM2142 USB 3.1 Host Controller +1b26 Netcope Technologies, a.s. + c132 COMBO-LXT155 + c1c0 NFB-100G1-e0 + c1c1 NFB-100G1-e1 + c250 NFB-200G2-master + c251 NFB-200G2-slave + c2c0 NFB-100G2-e0 + c2c1 NFB-100G2-e1 + cb20 COMBO-20G + cb40 COMBO-40G + cb80 NFB-40G2 1b2c Opal-RT Technologies Inc. 1b36 Red Hat, Inc. 0001 QEMU PCI-PCI bridge @@ -21210,6 +21341,7 @@ 1d5c 1000 Anker USB 3.0 Express Card 1009 FL1009 USB 3.0 Host Controller 1100 FL1100 USB 3.0 Host Controller + 16b8 6e31 Allegro Pro USB 3.0 PCIe 1b74 OpenVox Communication Co. Ltd. 0115 D115P/D115E Single-port E1/T1 card d130 D130P/D130E Single-port E1/T1 card (3rd GEN) @@ -21226,6 +21358,7 @@ e400 PX14400 Dual Xilinx Virtex5 based Digitizer 1b96 Western Digital 1b9a XAVi Technologies Corp. +1baa QNAP Systems, Inc. 1bad ReFLEX CES 1bb0 SimpliVity Corporation 0002 OmniCube Accelerator OA-3000 @@ -21250,8 +21383,14 @@ 0100 Nytro Flash Storage 1bb1 0101 Nytro XF1440 1bb1 0103 Nytro 5000 + 1bb1 0105 Nytro 5020 + 1bb1 0106 Nytro 5020 TCG 1bb1 0121 Nytro XM1440 1bb1 0123 Nytro 5000 +# Kiowa M.2 + 1bb1 0125 Nytro 5020 +# Kiowa M.2 TCG + 1bb1 0126 Nytro 5020 1bb1 01a1 Nytro XP7102 1bb3 Bluecherry 4304 BC-04120A MPEG4 4 port video encoder / decoder @@ -21296,6 +21435,8 @@ 4263 10G-PCIE3-8E-4S Network Adapter 4264 10G-PCIE3-8E-2S Network Adapter 4265 10G-PCIE3-8E-2S Network Adapter + 5000 25G-PCIE3-8A-2S Security Intelligent Adapter + 5001 25G-PCIE3-8B-2S Security Intelligent Adapter 1c1c Symphony 0001 82C101 1c28 Lite-On IT Corp. / Plextor @@ -21364,6 +21505,8 @@ 0305 Simulyzer-RT CompactPCI Serial CAN-1 card 1cd7 Nanjing Magewell Electronics Co., Ltd. 0010 Pro Capture Endpoint + 0014 PRO CAPTURE AIO 4K PLUS + 0017 PRO CAPTURE AIO 4K 1cdd secunet Security Networks AG 1ce4 Exablaze 0001 ExaNIC X4 @@ -21374,8 +21517,11 @@ 0006 ExaNIC X10-HPT 0007 ExaNIC X40 0008 ExaNIC V5P + 0009 ExaNIC X25 + 0100 ExaDISK FX1 1cf7 Subspace Dynamics 1d00 Pure Storage +1d05 Tongfang Hongkong Limited 1d0f Amazon.com, Inc. cd01 NVMe SSD Controller ec20 Elastic Network Adapter (ENA) @@ -21446,6 +21592,7 @@ 0040 Turbocard2 Accelerator 0080 Open Network Interface Card 80G 00c0 Turbocard3 Accelerator + 0140 Open Network Interface Card 40G e004 AB01/EMB01 Development Board 1d40 Techman Electronics (Changshu) Co., Ltd. 1d44 DPT @@ -21488,6 +21635,7 @@ 1d72 Xiaomi 1d78 DERA 1d7c Aerotech, Inc. +1d82 NETINT Technologies Inc. 1d87 Fuzhou Rockchip Electronics Co., Ltd 1d8f Enyx 1d94 Chengdu Higon IC Design Co.Ltd @@ -21521,9 +21669,13 @@ 790b FCH SMBus Controller 790e FCH LPC Bridge 1d95 Graphcore Ltd + 0001 Colossus GC2 [C2] + 0002 Colossus GC1 [S1] 1da1 Teko Telecom S.r.l. 1da2 Sapphire Technology Limited 1dbb NGD Systems, Inc. +1dbf Guizhou Huaxintong Semiconductor Technology Co., Ltd + 0401 StarDragon4800 PCI Express Root Port 1de1 Tekram Technology Co.,Ltd. 0391 TRM-S1040 [DC-315 / DC-395 series] 2020 DC-390 @@ -21533,14 +21685,14 @@ 1000 IO Memory Controller 2000 NoLoad Hardware Development Kit 1def Ampere Computing, LLC - e005 Skylark PCI Express Root Port 0 [X-Gene 3] - e006 Skylark PCI Express Root Port 1 [X-Gene 3] - e007 Skylark PCI Express Root Port 2 [X-Gene 3] - e008 Skylark PCI Express Root Port 3 [X-Gene 3] - e009 Skylark PCI Express Root Port 4 [X-Gene 3] - e00a Skylark PCI Express Root Port 5 [X-Gene 3] - e00b Skylark PCI Express Root Port 6 [X-Gene 3] - e00c Skylark PCI Express Root Port 7 [X-Gene 3] + e005 Skylark PCI Express Root Port 0 [eMAG] + e006 Skylark PCI Express Root Port 1 [eMAG] + e007 Skylark PCI Express Root Port 2 [eMAG] + e008 Skylark PCI Express Root Port 3 [eMAG] + e009 Skylark PCI Express Root Port 4 [eMAG] + e00a Skylark PCI Express Root Port 5 [eMAG] + e00b Skylark PCI Express Root Port 6 [eMAG] + e00c Skylark PCI Express Root Port 7 [eMAG] 1df7 opencpi.org 0001 ml605 0002 alst4 @@ -21594,11 +21746,14 @@ 1432 8102 10 Gigabit Ethernet PCI Express Adapter 1fc9 3015 Ethernet Adapter 4026 TN9610 10GbE SFP+ Ethernet Adapter + 4c52 1000 LREC6860AF 10 Gigabit Ethernet Adapter 4027 TN9710P 10GBase-T/NBASE-T Ethernet Adapter 1154 0368 LGY-PCIE-MG 1432 8104 10 Gigabit Ethernet PCI Express Adapter 1546 4027 GE10-PCIE4XG202P 10Gbase-T/NBASE-T Ethernet Adapter + 1baa 3310 PCIe Expansion Card 1fc9 3015 Ethernet Adapter + 4c52 1001 LREC6860BT 10 Gigabit Ethernet Adapter 4527 TN9710Q 5GBase-T/NBASE-T Ethernet Adapter 1fcc StreamLabs f416 MS416 @@ -21994,6 +22149,7 @@ 4a14 5000 RT8029-Based Ethernet Adapter 4b10 Buslogic Inc. 4c48 LUNG HWA Electronics +4c52 LR-Link 4c53 SBS Technologies 0000 PLUSTEST device 4c53 3000 PLUSTEST card (PC104+) @@ -22193,14 +22349,14 @@ 544c Teralogic Inc 0350 TL880-based HDTV/ATSC tuner 544d TBS Technologies - 6178 DVB-S2 4 Tuner PCIe Card + 6178 DVB Tuner PCIe Card 544d 6904 TBS6904 DVB-S2 Quad Tuner PCIe Card 544d 6905 TBS6905 DVB-S2 Quad Tuner PCIe Card 6205 0001 TBS6205 DVB-T2/T/C Quad TV Tuner PCIe Card 6209 0001 TBS6209 DVB-T2/C2/T/C/ISDB-T OctaTV Tuner 5452 SCANLAB AG 3443 RTC4 -5455 Technische University Berlin +5455 Technische Universitaet Berlin 4458 S5933 5456 GoTView 5519 Cnet Technologies, Inc. @@ -22463,7 +22619,7 @@ 0373 80333 B-Bus IOAPIC 0374 80333 Address Translation Unit 0402 Xeon E3-1200 v3/4th Gen Core Processor Integrated Graphics Controller - 0406 4th Gen Core Processor Integrated Graphics Controller + 0406 Haswell Integrated Graphics Controller 040a Xeon E3-1200 v3 Processor Integrated Graphics Controller 0412 Xeon E3-1200 v3/4th Gen Core Processor Integrated Graphics Controller 0416 4th Gen Core Processor Integrated Graphics Controller @@ -22925,12 +23081,39 @@ 0a2a Haswell-ULT Integrated Graphics Controller 0a2e Haswell-ULT Integrated Graphics Controller 0a53 DC P3520 SSD - 0a54 Express Flash NVMe P4500/P4600 + 0a54 NVMe Datacenter SSD [3DNAND, Beta Rock Controller] 1028 1fe1 Express Flash NVMe 1TB 2.5" U.2 (P4500) 1028 1fe2 Express Flash NVMe 2TB 2.5" U.2 (P4500) 1028 1fe3 Express Flash NVMe 4TB 2.5" U.2 (P4500) 1028 1fe4 Express Flash NVMe 4TB HHHL AIC (P4500) - 0a55 Express Flash NVMe P4600 + 1028 1fee Express Flash NVMe 1.6TB 2.5" U.2 (P4610) + 1028 1fef Express Flash NVMe 3.2TB 2.5" U.2 (P4610) + 1028 1ff0 Express Flash NVMe 6.4TB 2.5" U.2 (P4610) + 1028 1fff Express Flash NVMe 8.0TB 2.5" U.2 (P4510) + 1028 2003 Express Flash NVMe 1.0 TB 2.5" U.2 (P4510) + 1028 2004 Express Flash NVMe 2.0TB 2.5" U.2 (P4510) + 1028 2005 Express Flash NVMe 4.0TB 2.5" U.2 (P4510) + 108e 4870 NVMe PCIe 3.0 SSD 6.4TB AIC (P4608) + 108e 4871 NVMe PCIe 3.0 SSD 6.4TB 2.5-inch (P4600) + 108e 487a NVMe PCIe 3.0 SSD v2 6.4TB 2.5-inch (P4610) + 1590 025d NVMe Datacenter SSD [3DNAND] 1.0TB 2.5" U.2 (P4500) + 1590 025e NVMe Datacenter SSD [3DNAND] 2.0TB 2.5" U.2 (P4500) + 1590 025f NVMe Datacenter SSD [3DNAND] 4.0TB 2.5" U.2 (P4500) + 1590 0262 NVMe Datacenter SSD [3DNAND] 1.6TB 2.5" U.2 (P4600) + 1590 0264 NVMe Datacenter SSD [3DNAND] 3.2TB 2.5" U.2 (P4600) + 1590 0265 NVMe Datacenter SSD [3DNAND] 6.4TB 2.5" U.2 (P4600) + 1590 026c NVMe Datacenter SSD [3DNAND] 4.0TB AIC (P4500) + 8086 4308 Intel SSD D5-P4320 and D5-P4326 + 8086 4702 NVMe Datacenter SSD [3DNAND] SE 2.5" U.2 (P4500) + 8086 4704 NVMe Datacenter SSD [3DNAND] SE AIC (P4500) + 8086 4712 NVMe Datacenter SSD [3DNAND] ME 2.5" U.2 (P4600) + 8086 4714 NVMe Datacenter SSD [3DNAND] ME AIC (P4600) + 8086 4802 NVMe Datacenter SSD [3DNAND] SE 2.5" U.2 (P4510) + 8086 4804 NVMe Datacenter SSD [3DNAND] SE AIC (P4510) + 8086 4805 NVMe Datacenter SSD [3DNAND] SE M.2 (P4511) + 8086 4812 NVMe Datacenter SSD [3DNAND] ME 2.5" U.2 (P4610) + 8086 4814 NVMe Datacenter SSD [3DNAND] ME AIC (P4610) + 0a55 NVMe DC SSD [3DNAND, Beta Rock Controller] 1028 1fe5 Express Flash NVMe 1.6TB 2.5" U.2 (P4600) 1028 1fe6 Express Flash NVMe 2TB 2.5" U.2 (P4600) 1028 1fe7 Express Flash NVMe 3.2TB 2.5" U.2 (P4600) @@ -24064,6 +24247,7 @@ 1059 0130 T4009 1GbE interface 1059 0140 T2035 1GbE interface 1059 0150 RD-01068 1GbE interface + 1059 0170 RD-01213 10GbE interface 1538 I210 Gigabit Network Connection 1539 I211 Gigabit Network Connection 153a Ethernet Connection I217-LM @@ -24175,6 +24359,7 @@ 1028 1f98 Ethernet 10G 4P X710-k bNDC 1028 1f9e Ethernet 10G 2P X710-k bNDC 1059 0150 RD-01068 10GbE-KR interface + 1059 0170 RD-01213 10GbE interface 1590 0000 Ethernet 2-port 563i Adapter 1590 00f8 Ethernet 2-port 563i Adapter 8086 0000 Ethernet Converged Network Adapter XL710-Q2 @@ -24217,6 +24402,8 @@ 8086 00a0 Ethernet Converged Network Adapter X710-T4 8086 1003 Ethernet Converged Network Adapter X710-T 158a Ethernet Controller XXV710 for 25GbE backplane + 1590 0000 10/25Gb Ethernet Adapter + 1590 0286 Synergy 4610C 10/25Gb Ethernet Adapter 8086 000a Ethernet 25G 2P XXV710 Mezz 158b Ethernet Controller XXV710 for 25GbE SFP28 8086 0000 Ethernet Network Adapter XXV710 @@ -24240,8 +24427,9 @@ 15a9 X552 Virtual Function 15aa Ethernet Connection X552 10 GbE Backplane 1059 0120 T4008 10GbE interface - 1059 0150 RD-01068 10GbE interface 15ab Ethernet Connection X552 10 GbE Backplane + 1059 0150 RD-01068 10GbE interface + 1059 0170 RD-01213 10GbE interface 15ac Ethernet Connection X552 10 GbE SFP+ 1059 0160 RD-01167 10GbE interface 15ad Ethernet Connection X552/X557-AT 10GBASE-T @@ -24345,6 +24533,7 @@ 1901 Xeon E3-1200 v5/E3-1500 v5/6th Gen Core Processor PCIe Controller (x16) 1902 HD Graphics 510 1903 Xeon E3-1200 v5/E3-1500 v5/6th Gen Core Processor Thermal Subsystem + 1028 06e4 XPS 15 9550 1904 Xeon E3-1200 v5/E3-1500 v5/6th Gen Core Processor Host Bridge/DRAM Registers 1028 06f3 Latitude 3570 17aa 382a B51-80 Laptop @@ -24356,6 +24545,7 @@ 190c Xeon E3-1200 v5/E3-1500 v5/6th Gen Core Processor Host Bridge/DRAM Registers 190f Xeon E3-1200 v5/E3-1500 v5/6th Gen Core Processor Host Bridge/DRAM Registers 1910 Xeon E3-1200 v5/E3-1500 v5/6th Gen Core Processor Host Bridge/DRAM Registers + 1028 06e4 XPS 15 9550 1911 Xeon E3-1200 v5/v6 / E3-1500 v5 / 6th/7th Gen Core Processor Gaussian Mixture Model 17aa 2247 ThinkPad T570 17aa 224f ThinkPad X1 Carbon 5th Gen @@ -24365,6 +24555,7 @@ 1918 Xeon E3-1200 v5/E3-1500 v5/6th Gen Core Processor Host Bridge/DRAM Registers 1919 Xeon E3-1200 v5/E3-1500 v5/6th Gen Core Processor Imaging Unit 191b HD Graphics 530 + 1028 06e4 XPS 15 9550 191d HD Graphics P530 191e HD Graphics 515 191f Xeon E3-1200 v5/E3-1500 v5/6th Gen Core Processor Host Bridge/DRAM Registers @@ -24551,41 +24742,41 @@ 1c41 Mobile SFF 6 Series Chipset Family LPC Controller 1c42 6 Series/C200 Series Chipset Family LPC Controller 1c43 Mobile 6 Series Chipset Family LPC Controller - 1c44 Z68 Express Chipset Family LPC Controller + 1c44 Z68 Express Chipset LPC Controller 1c45 6 Series/C200 Series Chipset Family LPC Controller - 1c46 P67 Express Chipset Family LPC Controller + 1c46 P67 Express Chipset LPC Controller 1043 844d P8P67 Deluxe Motherboard - 1c47 UM67 Express Chipset Family LPC Controller + 1c47 UM67 Express Chipset LPC Controller 1c48 6 Series/C200 Series Chipset Family LPC Controller - 1c49 HM65 Express Chipset Family LPC Controller + 1c49 HM65 Express Chipset LPC Controller 8086 7270 Apple MacBookPro8,2 [Core i7, 15", 2011] - 1c4a H67 Express Chipset Family LPC Controller + 1c4a H67 Express Chipset LPC Controller 1028 04aa XPS 8300 1043 844d P8H67 Series Motherboard - 1c4b HM67 Express Chipset Family LPC Controller + 1c4b HM67 Express Chipset LPC Controller 1028 04b2 Vostro 3350 1028 04da Vostro 3750 - 1c4c Q65 Express Chipset Family LPC Controller - 1c4d QS67 Express Chipset Family LPC Controller - 1c4e Q67 Express Chipset Family LPC Controller - 1c4f QM67 Express Chipset Family LPC Controller + 1c4c Q65 Express Chipset LPC Controller + 1c4d QS67 Express Chipset LPC Controller + 1c4e Q67 Express Chipset LPC Controller + 1c4f QM67 Express Chipset LPC Controller 1028 04a3 Precision M4600 17aa 21cf ThinkPad T520 - 1c50 B65 Express Chipset Family LPC Controller + 1c50 B65 Express Chipset LPC Controller 1c51 6 Series/C200 Series Chipset Family LPC Controller - 1c52 C202 Chipset Family LPC Controller + 1c52 C202 Chipset LPC Controller 8086 7270 Server Board S1200BTS 1c53 6 Series/C200 Series Chipset Family LPC Controller - 1c54 C204 Chipset Family LPC Controller + 1c54 C204 Chipset LPC Controller 1c55 6 Series/C200 Series Chipset Family LPC Controller - 1c56 C206 Chipset Family LPC Controller + 1c56 C206 Chipset LPC Controller 1043 844d P8B WS Motherboard 1c57 6 Series/C200 Series Chipset Family LPC Controller - 1c58 Upgraded B65 Express Chipset Family LPC Controller - 1c59 Upgraded HM67 Express Chipset Family LPC Controller - 1c5a Upgraded Q67 Express Chipset Family LPC Controller + 1c58 Upgraded B65 Express Chipset LPC Controller + 1c59 Upgraded HM67 Express Chipset LPC Controller + 1c5a Upgraded Q67 Express Chipset LPC Controller 1c5b 6 Series/C200 Series Chipset Family LPC Controller - 1c5c H61 Express Chipset Family LPC Controller + 1c5c H61 Express Chipset LPC Controller 1c5d 6 Series/C200 Series Chipset Family LPC Controller 1c5e 6 Series/C200 Series Chipset Family LPC Controller 1c5f 6 Series/C200 Series Chipset Family LPC Controller @@ -24785,9 +24976,9 @@ 1e5c 7 Series Chipset Family LPC Controller 1e5d HM75 Express Chipset LPC Controller 144d c652 NP300E5C series laptop - 1e5e 7 Series Chipset Family LPC Controller + 1e5e HM70 Express Chipset LPC Controller 1043 108d VivoBook X202EV - 1e5f 7 Series Chipset Family LPC Controller + 1e5f NM70 Express Chipset LPC Controller 1f00 Atom processor C2000 SoC Transaction Router 1f01 Atom processor C2000 SoC Transaction Router 1f02 Atom processor C2000 SoC Transaction Router @@ -24837,6 +25028,7 @@ 1f3a Atom processor C2000 PCU 1f3b Atom processor C2000 PCU 1f3c Atom processor C2000 PCU SMBus + 1f3d Atom Processor C2000 PECI SMBus 1f3e Atom processor C2000 RAID SATA3 Controller 1f3f Atom processor C2000 RAID SATA3 Controller 1f40 Ethernet Connection I354 1.0 GbE Backplane @@ -25616,6 +25808,8 @@ 24fd Wireless 8265 / 8275 # Windstorm Peak 8086 0010 Dual Band Wireless-AC 8265 + 8086 0150 Dual Band Wireless-AC 8265 + 8086 1010 Dual Band Wireless-AC 8265 8086 1130 Dual Band Wireless-AC 8265 2500 82820 820 (Camino) Chipset Host Bridge (MCH) 1028 0095 Precision Workstation 220 Chipset @@ -26122,9 +26316,12 @@ 2700 Optane SSD 900P Series 8086 3900 900P Series [Add-in Card] 8086 3901 900P Series [2.5" SFF] - 2701 Optane DC P4800X Series SSD - 8086 3904 DC P4800X Series [Add-in Card] - 8086 3905 DC P4800X Series [2.5" SFF] + 2701 NVMe Datacenter SSD [Optane] + 1028 2000 Express Flash NVMe [Optane] 375GB 2.5" U.2 (P4800X) + 1028 2001 Express Flash NVMe [Optane] 750GB 2.5" U.2 (P4800X) + 1028 2002 Express Flash NVMe [Optane] 750GB AIC (P4800X) + 8086 3904 NVMe Datacenter SSD [Optane] x4 AIC (P4800X) + 8086 3905 NVMe Datacenter SSD [Optane] 15mm 2.5" U.2 (P4800X) 2770 82945G/GZ/P/PL Memory Controller Hub 1028 01ad OptiPlex GX620 103c 2a3b Pavilion A1512X @@ -28217,6 +28414,10 @@ 3e85 8th Gen Core Processor PCIe Controller (x8) 3e89 8th Gen Core Processor PCIe Controller (x4) 3e91 8th Gen Core Processor Gaussian Mixture Model + 3e92 UHD Graphics 630 (Desktop) + 3e9b UHD Graphics 630 (Mobile) + 3ea0 UHD Graphics 620 (Whiskey Lake) + 3ea5 Iris Plus Graphics 655 3ec2 8th Gen Core Processor Host Bridge/DRAM Registers 3ec4 8th Gen Core Processor Host Bridge/DRAM Registers 3ec6 8th Gen Core Processor Host Bridge/DRAM Registers @@ -28398,20 +28599,27 @@ 530d 80310 (IOP) IO Processor 5845 QEMU NVM Express Controller 1af4 1100 QEMU Virtual Machine + 5900 Xeon E3-1200 v6/7th Gen Core Processor Host Bridge/DRAM Registers + 5901 Xeon E3-1200 v6/7th Gen Core Processor PCIe Controller (x16) 5902 HD Graphics 610 5904 Xeon E3-1200 v6/7th Gen Core Processor Host Bridge/DRAM Registers 17aa 2247 ThinkPad T570 17aa 224f ThinkPad X1 Carbon 5th Gen + 5905 Xeon E3-1200 v6/7th Gen Core Processor PCIe Controller (x8) + 5909 Xeon E3-1200 v6/7th Gen Core Processor PCIe Controller (x4) + 590c Xeon E3-1200 v6/7th Gen Core Processor Host Bridge/DRAM Registers 590f Xeon E3-1200 v6/7th Gen Core Processor Host Bridge/DRAM Registers 5910 Xeon E3-1200 v6/7th Gen Core Processor Host Bridge/DRAM Registers + 5911 Xeon E3-1200 v6/7th Gen Core Processor Gaussian Mixture Model 5912 HD Graphics 630 5914 Xeon E3-1200 v6/7th Gen Core Processor Host Bridge/DRAM Registers 5916 HD Graphics 620 17aa 2248 ThinkPad T570 17aa 224f ThinkPad X1 Carbon 5th Gen 5917 UHD Graphics 620 + 5918 Xeon E3-1200 v6/7th Gen Core Processor Host Bridge/DRAM Registers 591d HD Graphics P630 - 591f Intel Kaby Lake Host Bridge + 591f Xeon E3-1200 v6/7th Gen Core Processor Host Bridge/DRAM Registers 5a84 Celeron N3350/Pentium N4200/Atom E3900 Series Integrated Graphics Controller 5a88 Celeron N3350/Pentium N4200/Atom E3900 Series Imaging Unit 5a98 Celeron N3350/Pentium N4200/Atom E3900 Series Audio Cluster @@ -28720,21 +28928,23 @@ 8086 0100 Intel740 Graphics Accelerator 8002 Trusted Execution Technology Registers 8003 Trusted Execution Technology Registers - 8100 System Controller Hub (SCH Poulsbo) - 8108 System Controller Hub (SCH Poulsbo) Graphics Controller - 8110 System Controller Hub (SCH Poulsbo) PCI Express Port 1 - 8112 System Controller Hub (SCH Poulsbo) PCI Express Port 2 - 8114 System Controller Hub (SCH Poulsbo) USB UHCI #1 - 8115 System Controller Hub (SCH Poulsbo) USB UHCI #2 - 8116 System Controller Hub (SCH Poulsbo) USB UHCI #3 - 8117 System Controller Hub (SCH Poulsbo) USB EHCI #1 - 8118 System Controller Hub (SCH Poulsbo) USB Client Controller - 8119 System Controller Hub (SCH Poulsbo) LPC Bridge - 811a System Controller Hub (SCH Poulsbo) IDE Controller - 811b System Controller Hub (SCH Poulsbo) HD Audio Controller - 811c System Controller Hub (SCH Poulsbo) SDIO Controller #1 - 811d System Controller Hub (SCH Poulsbo) SDIO Controller #2 - 811e System Controller Hub (SCH Poulsbo) SDIO Controller #3 + 8100 US15W/US15X SCH [Poulsbo] Host Bridge + 8101 US15L/UL11L SCH [Poulsbo] Host Bridge + 8108 US15W/US15X SCH [Poulsbo] Graphics Controller + 8109 US15L/UL11L SCH [Poulsbo] Graphics Controller + 8110 US15W/US15X/US15L/UL11L SCH [Poulsbo] PCI Express Port 1 + 8112 US15W/US15X/US15L/UL11L SCH [Poulsbo] PCI Express Port 2 + 8114 US15W/US15X/US15L/UL11L SCH [Poulsbo] USB UHCI Controller #1 + 8115 US15W/US15X/US15L/UL11L SCH [Poulsbo] USB UHCI Controller #2 + 8116 US15W/US15X/US15L/UL11L SCH [Poulsbo] USB UHCI Controller #3 + 8117 US15W/US15X/US15L/UL11L SCH [Poulsbo] USB EHCI Controller + 8118 US15W/US15X/US15L/UL11L SCH [Poulsbo] USB Client Controller + 8119 US15W/US15X/US15L/UL11L SCH [Poulsbo] LPC Bridge + 811a US15W/US15X/US15L/UL11L SCH [Poulsbo] IDE Controller + 811b US15W/US15X/US15L/UL11L SCH [Poulsbo] HD Audio Controller + 811c US15W/US15X/US15L/UL11L SCH [Poulsbo] SDIO/MMC Controller #1 + 811d US15W/US15X/US15L/UL11L SCH [Poulsbo] SDIO/MMC Controller #2 + 811e US15W/US15X/US15L/UL11L SCH [Poulsbo] SDIO/MMC Controller #3 8180 Atom Processor E6xx PCI Express Port 3 8181 Atom Processor E6xx PCI Express Port 4 8182 Atom Processor E6xx Integrated Graphics Controller @@ -28873,7 +29083,7 @@ 8c59 8 Series/C220 Series Chipset Family LPC Controller 8c5a 8 Series/C220 Series Chipset Family LPC Controller 8c5b 8 Series/C220 Series Chipset Family LPC Controller - 8c5c C220 Series Chipset Family H81 Express LPC Controller + 8c5c H81 Express LPC Controller 8c5d 8 Series/C220 Series Chipset Family LPC Controller 8c5e 8 Series/C220 Series Chipset Family LPC Controller 8c5f 8 Series/C220 Series Chipset Family LPC Controller @@ -28910,9 +29120,10 @@ 8cbd 9 Series Chipset Family KT Controller 8cc1 9 Series Chipset Family LPC Controller 8cc2 9 Series Chipset Family LPC Controller - 8cc3 9 Series Chipset Family HM97 LPC Controller - 8cc4 9 Series Chipset Family Z97 LPC Controller - 8cc6 9 Series Chipset Family H97 Controller + 8cc3 HM97 Chipset LPC Controller + 8cc4 Z97 Chipset LPC Controller + 8cc5 QM97 Chipset LPC Controller + 8cc6 H97 Chipset LPC Controller 8d00 C610/X99 series chipset 4-port SATA Controller [IDE mode] 8d02 C610/X99 series chipset 6-Port SATA Controller [AHCI mode] 8d04 C610/X99 series chipset SATA Controller [RAID mode] @@ -29170,69 +29381,77 @@ a012 Atom Processor D4xx/D5xx/N4xx/N5xx Integrated Graphics Controller 144d c072 Notebook N150P a013 Atom Processor D4xx/D5xx/N4xx/N5xx CHAPS counter - a102 Sunrise Point-H SATA controller [AHCI mode] - a103 Sunrise Point-H SATA Controller [AHCI mode] + a102 Q170/Q150/B150/H170/H110/Z170/CM236 Chipset SATA Controller [AHCI Mode] + a103 HM170/QM170 Chipset SATA Controller [AHCI Mode] + 1028 06e4 XPS 15 9550 a105 Sunrise Point-H SATA Controller [RAID mode] - a107 Sunrise Point-H SATA Controller [RAID mode] + a106 Q170/H170/Z170/CM236 Chipset SATA Controller [RAID Mode] + a107 HM170/QM170 Chipset SATA Controller [RAID Mode] a10f Sunrise Point-H SATA Controller [RAID mode] - a110 Sunrise Point-H PCI Express Root Port #1 - a111 Sunrise Point-H PCI Express Root Port #2 - a112 Sunrise Point-H PCI Express Root Port #3 - a113 Sunrise Point-H PCI Express Root Port #4 - a114 Sunrise Point-H PCI Express Root Port #5 - a115 Sunrise Point-H PCI Express Root Port #6 - a116 Sunrise Point-H PCI Express Root Port #7 - a117 Sunrise Point-H PCI Express Root Port #8 - a118 Sunrise Point-H PCI Express Root Port #9 - a119 Sunrise Point-H PCI Express Root Port #10 - a11a Sunrise Point-H PCI Express Root Port #11 - a11b Sunrise Point-H PCI Express Root Port #12 - a11c Sunrise Point-H PCI Express Root Port #13 - a11d Sunrise Point-H PCI Express Root Port #14 - a11e Sunrise Point-H PCI Express Root Port #15 - a11f Sunrise Point-H PCI Express Root Port #16 - a120 Sunrise Point-H P2SB - a121 Sunrise Point-H PMC + a110 100 Series/C230 Series Chipset Family PCI Express Root Port #1 + a111 100 Series/C230 Series Chipset Family PCI Express Root Port #2 + a112 100 Series/C230 Series Chipset Family PCI Express Root Port #3 + a113 100 Series/C230 Series Chipset Family PCI Express Root Port #4 + a114 100 Series/C230 Series Chipset Family PCI Express Root Port #5 + a115 100 Series/C230 Series Chipset Family PCI Express Root Port #6 + a116 100 Series/C230 Series Chipset Family PCI Express Root Port #7 + a117 100 Series/C230 Series Chipset Family PCI Express Root Port #8 + a118 100 Series/C230 Series Chipset Family PCI Express Root Port #9 + a119 100 Series/C230 Series Chipset Family PCI Express Root Port #10 + a11a 100 Series/C230 Series Chipset Family PCI Express Root Port #11 + a11b 100 Series/C230 Series Chipset Family PCI Express Root Port #12 + a11c 100 Series/C230 Series Chipset Family PCI Express Root Port #13 + a11d 100 Series/C230 Series Chipset Family PCI Express Root Port #14 + a11e 100 Series/C230 Series Chipset Family PCI Express Root Port #15 + a11f 100 Series/C230 Series Chipset Family PCI Express Root Port #16 + a120 100 Series/C230 Series Chipset Family P2SB + a121 100 Series/C230 Series Chipset Family Power Management Controller + 1028 06e4 XPS 15 9550 a122 Sunrise Point-H cAVS - a123 Sunrise Point-H SMBus - a124 Sunrise Point-H SPI Controller - a125 Sunrise Point-H Gigabit Ethernet Controller - a126 Sunrise Point-H Northpeak - a127 Sunrise Point-H Serial IO UART #0 - a128 Sunrise Point-H Serial IO UART #1 - a129 Sunrise Point-H Serial IO SPI #0 - a12a Sunrise Point-H Serial IO SPI #1 - a12f Sunrise Point-H USB 3.0 xHCI Controller - a130 Sunrise Point-H USB Device Controller (OTG) - a131 Sunrise Point-H Thermal subsystem + a123 100 Series/C230 Series Chipset Family SMBus + 1028 06e4 XPS 15 9550 + a124 100 Series/C230 Series Chipset Family SPI Controller + a125 100 Series/C230 Series Chipset Family Gigabit Ethernet Controller + a126 100 Series/C230 Series Chipset Family Trace Hub + a127 100 Series/C230 Series Chipset Family Serial IO UART #0 + a128 100 Series/C230 Series Chipset Family Serial IO UART #1 + a129 100 Series/C230 Series Chipset Family Serial IO GSPI #0 + a12a 100 Series/C230 Series Chipset Family Serial IO GSPI #1 + a12f 100 Series/C230 Series Chipset Family USB 3.0 xHCI Controller + 1028 06e4 XPS 15 9550 + a130 100 Series/C230 Series Chipset Family USB Device Controller (OTG) + a131 100 Series/C230 Series Chipset Family Thermal Subsystem + 1028 06e4 XPS 15 9550 a133 Sunrise Point-H Northpeak ACPI Function - a135 Sunrise Point-H Integrated Sensor Hub - a13a Sunrise Point-H CSME HECI #1 - a13b Sunrise Point-H CSME HECI #2 - a13c Sunrise Point-H CSME IDE Redirection - a13d Sunrise Point-H KT Redirection - a13e Sunrise Point-H CSME HECI #3 + a135 100 Series/C230 Series Chipset Family Integrated Sensor Hub + a13a 100 Series/C230 Series Chipset Family MEI Controller #1 + 1028 06e4 XPS 15 9550 + a13b 100 Series/C230 Series Chipset Family MEI Controller #2 + a13c 100 Series/C230 Series Chipset Family IDE Redirection + a13d 100 Series/C230 Series Chipset Family KT Redirection + a13e 100 Series/C230 Series Chipset Family MEI Controller #3 a140 Sunrise Point-H LPC Controller a141 Sunrise Point-H LPC Controller a142 Sunrise Point-H LPC Controller - a143 Sunrise Point-H LPC Controller - a144 Sunrise Point-H LPC Controller - a145 Sunrise Point-H LPC Controller - a146 Sunrise Point-H LPC Controller - a147 Sunrise Point-H LPC Controller - a148 Sunrise Point-H LPC Controller - a149 Sunrise Point-H LPC Controller - a14a Sunrise Point-H LPC Controller + a143 H110 Chipset LPC/eSPI Controller + a144 H170 Chipset LPC/eSPI Controller + a145 Z170 Chipset LPC/eSPI Controller + a146 Q170 Chipset LPC/eSPI Controller + a147 Q150 Chipset LPC/eSPI Controller + a148 B150 Chipset LPC/eSPI Controller + a149 C236 Chipset LPC/eSPI Controller + a14a C232 Chipset LPC/eSPI Controller a14b Sunrise Point-H LPC Controller a14c Sunrise Point-H LPC Controller - a14d Sunrise Point-H LPC Controller - a14e Sunrise Point-H LPC Controller + a14d QM170 Chipset LPC/eSPI Controller + a14e HM170 Chipset LPC/eSPI Controller + 1028 06e4 XPS 15 9550 a14f Sunrise Point-H LPC Controller - a150 Sunrise Point-H LPC Controller + a150 CM236 Chipset LPC/eSPI Controller a151 Sunrise Point-H LPC Controller - a152 Sunrise Point-H LPC Controller - a153 Sunrise Point-H LPC Controller - a154 Sunrise Point-H LPC Controller + a152 HM175 Chipset LPC/eSPI Controller + a153 QM175 Chipset LPC/eSPI Controller + a154 CM238 Chipset LPC/eSPI Controller a155 Sunrise Point-H LPC Controller a156 Sunrise Point-H LPC Controller a157 Sunrise Point-H LPC Controller @@ -29244,60 +29463,65 @@ a15d Sunrise Point-H LPC Controller a15e Sunrise Point-H LPC Controller a15f Sunrise Point-H LPC Controller - a160 Sunrise Point-H Serial IO I2C Controller #0 - a161 Sunrise Point-H Serial IO I2C Controller #1 - a166 Sunrise Point-H Serial IO UART Controller #2 - a167 Sunrise Point-H PCI Root Port #17 - a168 Sunrise Point-H PCI Root Port #18 - a169 Sunrise Point-H PCI Root Port #19 - a16a Sunrise Point-H PCI Root Port #20 - a170 Sunrise Point-H HD Audio + a160 100 Series/C230 Series Chipset Family Serial IO I2C Controller #0 + 1028 06e4 XPS 15 9550 + a161 100 Series/C230 Series Chipset Family Serial IO I2C Controller #1 + 1028 06e4 XPS 15 9550 + a162 100 Series/C230 Series Chipset Family Serial IO I2C Controller #2 + a163 100 Series/C230 Series Chipset Family Serial IO I2C Controller #3 + a166 100 Series/C230 Series Chipset Family Serial IO UART Controller #2 + a167 100 Series/C230 Series Chipset Family PCI Express Root Port #17 + a168 100 Series/C230 Series Chipset Family PCI Express Root Port #18 + a169 100 Series/C230 Series Chipset Family PCI Express Root Port #19 + a16a 100 Series/C230 Series Chipset Family PCI Express Root Port #20 + a170 100 Series/C230 Series Chipset Family HD Audio Controller a171 CM238 HD Audio Controller - a182 Lewisburg SATA Controller [AHCI mode] - a186 Lewisburg SATA Controller [RAID mode] - a190 Lewisburg PCI Express Root Port #1 - a191 Lewisburg PCI Express Root Port #2 - a192 Lewisburg PCI Express Root Port #3 - a193 Lewisburg PCI Express Root Port #4 - a194 Lewisburg PCI Express Root Port #5 - a195 Lewisburg PCI Express Root Port #6 - a196 Lewisburg PCI Express Root Port #7 - a197 Lewisburg PCI Express Root Port #8 - a198 Lewisburg PCI Express Root Port #9 - a199 Lewisburg PCI Express Root Port #10 - a19a Lewisburg PCI Express Root Port #11 - a19b Lewisburg PCI Express Root Port #12 - a19c Lewisburg PCI Express Root Port #13 - a19d Lewisburg PCI Express Root Port #14 - a19e Lewisburg PCI Express Root Port #15 - a19f Lewisburg PCI Express Root Port #16 - a1a0 Lewisburg P2SB - a1a1 Lewisburg PMC - a1a2 Lewisburg cAVS - a1a3 Lewisburg SMBus - a1a4 Lewisburg SPI Controller - a1af Lewisburg USB 3.0 xHCI Controller - a1b1 Lewisburg Thermal Subsystem - a1ba Lewisburg CSME: HECI #1 - a1bb Lewisburg CSME: HECI #2 - a1bc Lewisburg CSME: IDE-r - a1bd Lewisburg CSME: KT Controller - a1be Lewisburg CSME: HECI #3 - a1c1 Lewisburg LPC Controller - a1c2 Lewisburg LPC Controller - a1c3 Lewisburg LPC Controller - a1c4 Lewisburg LPC Controller - a1c5 Lewisburg LPC Controller - a1c6 Lewisburg LPC Controller - a1c7 Lewisburg LPC Controller - a1d2 Lewisburg SSATA Controller [AHCI mode] - a1d6 Lewisburg SSATA Controller [RAID mode] - a1e7 Lewisburg PCI Express Root Port #17 - a1e8 Lewisburg PCI Express Root Port #18 - a1e9 Lewisburg PCI Express Root Port #19 - a1ea Lewisburg PCI Express Root Port #20 - a1f0 Lewisburg MROM 0 - a1f1 Lewisburg MROM 1 + a182 C620 Series Chipset Family SATA Controller [AHCI mode] + a186 C620 Series Chipset Family SATA Controller [RAID mode] + a190 C620 Series Chipset Family PCI Express Root Port #1 + a191 C620 Series Chipset Family PCI Express Root Port #2 + a192 C620 Series Chipset Family PCI Express Root Port #3 + a193 C620 Series Chipset Family PCI Express Root Port #4 + a194 C620 Series Chipset Family PCI Express Root Port #5 + a195 C620 Series Chipset Family PCI Express Root Port #6 + a196 C620 Series Chipset Family PCI Express Root Port #7 + a197 C620 Series Chipset Family PCI Express Root Port #8 + a198 C620 Series Chipset Family PCI Express Root Port #9 + a199 C620 Series Chipset Family PCI Express Root Port #10 + a19a C620 Series Chipset Family PCI Express Root Port #11 + a19b C620 Series Chipset Family PCI Express Root Port #12 + a19c C620 Series Chipset Family PCI Express Root Port #13 + a19d C620 Series Chipset Family PCI Express Root Port #14 + a19e C620 Series Chipset Family PCI Express Root Port #15 + a19f C620 Series Chipset Family PCI Express Root Port #16 + a1a0 C620 Series Chipset Family P2SB + a1a1 C620 Series Chipset Family Power Management Controller + a1a2 C620 Series Chipset Family cAVS + a1a3 C620 Series Chipset Family SMBus + a1a4 C620 Series Chipset Family SPI Controller + a1a6 C620 Series Chipset Family Trace Hub + a1af C620 Series Chipset Family USB 3.0 xHCI Controller + a1b1 C620 Series Chipset Family Thermal Subsystem + a1ba C620 Series Chipset Family MEI Controller #1 + a1bb C620 Series Chipset Family MEI Controller #2 + a1bc C620 Series Chipset Family IDE Redirection + a1bd C620 Series Chipset Family KT Redirection + a1be C620 Series Chipset Family MEI Controller #3 + a1c1 C621 Series Chipset LPC/eSPI Controller + a1c2 C622 Series Chipset LPC/eSPI Controller + a1c3 C624 Series Chipset LPC/eSPI Controller + a1c4 C625 Series Chipset LPC/eSPI Controller + a1c5 C626 Series Chipset LPC/eSPI Controller + a1c6 C627 Series Chipset LPC/eSPI Controller + a1c7 C628 Series Chipset LPC/eSPI Controller + a1d2 C620 Series Chipset Family SSATA Controller [AHCI mode] + a1d6 C620 Series Chipset Family SSATA Controller [RAID mode] + a1e7 C620 Series Chipset Family PCI Express Root Port #17 + a1e8 C620 Series Chipset Family PCI Express Root Port #18 + a1e9 C620 Series Chipset Family PCI Express Root Port #19 + a1ea C620 Series Chipset Family PCI Express Root Port #20 + a1ec C620 Series Chipset Family MROM 0 + a1ed C620 Series Chipset Family MROM 1 a1f8 Lewisburg IE: HECI #1 a1f9 Lewisburg IE: HECI #2 a1fa Lewisburg IE: IDE-r @@ -29329,13 +29553,17 @@ a29d 200 Series PCH PCI Express Root Port #14 a29e 200 Series PCH PCI Express Root Port #15 a29f 200 Series PCH PCI Express Root Port #16 - a2a1 200 Series PCH PMC - a2a3 200 Series PCH SMBus Controller - a2a7 200 Series PCH Serial IO UART Controller #0 - a2a8 200 Series PCH Serial IO UART Controller #1 - a2a9 200 Series PCH Serial IO SPI Controller #0 - a2aa 200 Series PCH Serial IO SPI Controller #1 - a2af 200 Series PCH USB 3.0 xHCI Controller + a2a0 200 Series/Z370 Chipset Family P2SB + a2a1 200 Series/Z370 Chipset Family Power Management Controller + a2a3 200 Series/Z370 Chipset Family SMBus Controller + a2a4 200 Series/Z370 Chipset Family SPI Controller + a2a5 200 Series/Z370 Chipset Family Gigabit Ethernet Controller + a2a6 200 Series/Z370 Chipset Family Trace Hub + a2a7 200 Series/Z370 Chipset Family Serial IO UART Controller #0 + a2a8 200 Series/Z370 Chipset Family Serial IO UART Controller #1 + a2a9 200 Series/Z370 Chipset Family Serial IO SPI Controller #0 + a2aa 200 Series/Z370 Chipset Family Serial IO SPI Controller #1 + a2af 200 Series/Z370 Chipset Family USB 3.0 xHCI Controller a2b1 200 Series PCH Thermal Subsystem a2ba 200 Series PCH CSME HECI #1 a2bb 200 Series PCH CSME HECI #2 @@ -29344,6 +29572,9 @@ a2c6 200 Series PCH LPC Controller (Q270) a2c7 200 Series PCH LPC Controller (Q250) a2c8 200 Series PCH LPC Controller (B250) + a2c9 Z370 Chipset LPC/eSPI Controller + a2d2 X299 Chipset LPC/eSPI Controller + a2d3 C422 Chipset LPC/eSPI Controller a2e0 200 Series PCH Serial IO I2C Controller #0 a2e1 200 Series PCH Serial IO I2C Controller #1 a2e2 200 Series PCH Serial IO I2C Controller #2 @@ -29361,10 +29592,30 @@ a304 H370 Chipset LPC/eSPI Controller a323 Cannon Lake PCH SMBus Controller a324 Cannon Lake PCH SPI Controller - a32c Cannon Lake PCH PCI Express Root Port 21 - a330 Cannon Lake PCH PCI Express Root Port 9 - a342 Cannon Lake PCH PCI Express Root Port 19 - a343 Cannon Lake PCH PCI Express Root Port 20 + a32c Cannon Lake PCH PCI Express Root Port #21 + a32d Cannon Lake PCH PCI Express Root Port #22 + a32e Cannon Lake PCH PCI Express Root Port #23 + a32f Cannon Lake PCH PCI Express Root Port #24 + a330 Cannon Lake PCH PCI Express Root Port #9 + a331 Cannon Lake PCH PCI Express Root Port #10 + a332 Cannon Lake PCH PCI Express Root Port #11 + a333 Cannon Lake PCH PCI Express Root Port #12 + a334 Cannon Lake PCH PCI Express Root Port #13 + a335 Cannon Lake PCH PCI Express Root Port #14 + a336 Cannon Lake PCH PCI Express Root Port #15 + a337 Cannon Lake PCH PCI Express Root Port #16 + a338 Cannon Lake PCH PCI Express Root Port #1 + a339 Cannon Lake PCH PCI Express Root Port #2 + a33a Cannon Lake PCH PCI Express Root Port #3 + a33b Cannon Lake PCH PCI Express Root Port #4 + a33c Cannon Lake PCH PCI Express Root Port #5 + a33d Cannon Lake PCH PCI Express Root Port #6 + a33e Cannon Lake PCH PCI Express Root Port #7 + a33f Cannon Lake PCH PCI Express Root Port #8 + a340 Cannon Lake PCH PCI Express Root Port #17 + a341 Cannon Lake PCH PCI Express Root Port #18 + a342 Cannon Lake PCH PCI Express Root Port #19 + a343 Cannon Lake PCH PCI Express Root Port #20 a348 Cannon Lake PCH cAVS a352 Cannon Lake PCH SATA AHCI Controller a360 Cannon Lake PCH HECI Controller @@ -29409,6 +29660,7 @@ d156 Core Processor Semaphore and Scratchpad Registers d157 Core Processor System Control and Status Registers d158 Core Processor Miscellaneous Registers + f1a5 SSD 600P Series f1a6 SSD Pro 7600p/760p/E 6100p Series 80ee InnoTek Systemberatung GmbH beef VirtualBox Graphics Adapter @@ -29757,6 +30009,7 @@ 152d 8a24 QS-8236-16i 152d 8a36 QS-8240-24i 152d 8a37 QS-8242-24i + 9005 0608 SmartRAID 3162-8i /e 9005 0800 SmartRAID 3154-8i 9005 0801 SmartRAID 3152-8i 9005 0802 SmartRAID 3151-4i @@ -29980,7 +30233,9 @@ bdbd Blackmagic Design a142 UltraStudio HD Mini a143 DeckLink Mini Recorder 4K a144 DeckLink Mini Monitor 4K + a148 DeckLink SDI Micro a14b DeckLink 8K Pro + a1ff eGPU RX580 c001 TSI Telsys c0a9 Micron/Crucial Technology c0de Motorola @@ -29994,6 +30249,7 @@ caed Canny Edge cafe Chrysalis-ITS 0003 Luna K3 Hardware Security Module 0006 Luna PCI-e 3000 Hardware Security Module +cc53 ScaleFlux Inc. cccc Catapult Communications ccec Curtiss-Wright Controls Embedded Computing cddd Tyzx, Inc. diff --git a/share/sysobject.ids b/share/sysobject.ids index 2fcabf3bab..7584412e78 100644 --- a/share/sysobject.ids +++ b/share/sysobject.ids @@ -1491,10 +1491,104 @@ 9.6.1.72.2000.2 Cisco NETWORKING SGE 2000 9.6.1.72.2010.2 Cisco NETWORKING SGE 2010 9.6.1.73.2000.3 Cisco NETWORKING SGE 2000P -9.6.1.82.24.1 Cisco NETWORKING SF300-24PP -9.6.1.83.20.1 Cisco NETWORKING SG 300-20 -9.6.1.83.28.1 Cisco NETWORKING SG 300-28 -9.6.1.83.52.1 Cisco NETWORKING SG 300-52 +9.6.1.80.24.1 Cisco NETWORKING SF500-24 +9.6.1.80.24.2 Cisco NETWORKING SF500-24P +9.6.1.80.48.1 Cisco NETWORKING SF500-48 +9.6.1.80.48.2 Cisco NETWORKING SF500-48P +9.6.1.81.5.3.0 Cisco NETWORKING SG500-52MP +9.6.1.81.28.1 Cisco NETWORKING SG500-28 +9.6.1.81.28.2 Cisco NETWORKING SG500-28P +9.6.1.81.52.1 Cisco NETWORKING SG500-52 +9.6.1.81.52.2 Cisco NETWORKING SG500-52P +9.6.1.82.8.1 Cisco NETWORKING SF302-08 +9.6.1.82.8.2 Cisco NETWORKING SF302-08P +9.6.1.82.8.3 Cisco NETWORKING SF302-08MP +9.6.1.82.8.4 Cisco NETWORKING SF300-08 +9.6.1.82.24.1 Cisco NETWORKING SF300-24 +9.6.1.82.24.2 Cisco NETWORKING SF300-24P +9.6.1.82.24.3 Cisco NETWORKING SF300-24MP +9.6.1.82.48.1 Cisco NETWORKING SF300-48 +9.6.1.82.48.2 Cisco NETWORKING SF300-48P +9.6.1.83.10.1 Cisco NETWORKING SG300-10 +9.6.1.83.10.2 Cisco NETWORKING SG300-10P +9.6.1.83.10.3 Cisco NETWORKING SG300-10MP +9.6.1.83.10.5 Cisco NETWORKING SG300-10SFP +9.6.1.83.20.1 Cisco NETWORKING SG300-20 +9.6.1.83.28.1 Cisco NETWORKING SG300-28 +9.6.1.83.28.2 Cisco NETWORKING SG300-28P +9.6.1.83.28.3 Cisco NETWORKING SG300-28MP +9.6.1.83.28.5 Cisco NETWORKING SG300-28SFP +9.6.1.83.52.1 Cisco NETWORKING SG300-52 +9.6.1.83.52.2 Cisco NETWORKING SG300-52P +9.6.1.83.52.3 Cisco NETWORKING SG300-52MP +9.6.1.84.24.1 Cisco NETWORKING SF220-24 +9.6.1.84.24.2 Cisco NETWORKING SF220-24P +9.6.1.84.26.1 Cisco NETWORKING SG220-26 +9.6.1.84.26.2 Cisco NETWORKING SG220-26P +9.6.1.84.28.3 Cisco NETWORKING SG220-28MP +9.6.1.84.28.5 Cisco NETWORKING SG220-28 +9.6.1.84.48.1 Cisco NETWORKING SF220-48 +9.6.1.84.48.2 Cisco NETWORKING SF220-48P +9.6.1.84.50.1 Cisco NETWORKING SG220-50 +9.6.1.84.50.2 Cisco NETWORKING SG220-50P +9.6.1.84.52.5 Cisco NETWORKING SG220-52 +9.6.1.85.24.1 Cisco NETWORKING SG500X-24 +9.6.1.85.24.2 Cisco NETWORKING SG500X-24P +9.6.1.85.48.1 Cisco NETWORKING SG500X-48 +9.6.1.85.48.2 Cisco NETWORKING SG500X-48P +9.6.1.86.48.1 Cisco NETWORKING ESW2-550X-48 +9.6.1.86.48.6 Cisco NETWORKING ESW2-550X-48DC +9.6.1.86.52.1 Cisco NETWORKING ESW2-350G-52 +9.6.1.86.52.6 Cisco NETWORKING ESW2-350G-52DC +9.6.1.87.24.1 Cisco NETWORKING SF200-24 +9.6.1.87.24.2 Cisco NETWORKING SF200-24P +9.6.1.87.48.1 Cisco NETWORKING SF200-48 +9.6.1.87.48.2 Cisco NETWORKING SF200-48P +9.6.1.88.10.3 Cisco NETWORKING SG200-10FP +9.6.1.88.18.1 Cisco NETWORKING SG200-18 +9.6.1.88.24.3 Cisco NETWORKING SF200-24FP +9.6.1.88.26.1 Cisco NETWORKING SG200-26 +9.6.1.88.26.2 Cisco NETWORKING SG200-26P +9.6.1.88.26.3 Cisco NETWORKING SG200-26FP +9.6.1.88.50.1 Cisco NETWORKING SG200-50 +9.6.1.88.50.2 Cisco NETWORKING SG200-50P +9.6.1.88.50.3 Cisco NETWORKING SG200-50FP +9.6.1.90.16.9 Cisco NETWORKING SG550XG-8F8T +9.6.1.90.24.8 Cisco NETWORKING SG550XG-24F +9.6.1.90.24.9 Cisco NETWORKING SG550XG-24T +9.6.1.90.48.9 Cisco NETWORKING SG550XG-48T +9.6.1.91.12.9 Cisco NETWORKING SG350XG-2F10 +9.6.1.91.24.8 Cisco NETWORKING SG350XG-24F +9.6.1.91.24.9 Cisco NETWORKING SG350XG-24T +9.6.1.91.48.9 Cisco NETWORKING SG350XG-48T +9.6.1.92.24.1 Cisco NETWORKING SF550X-24 +9.6.1.92.24.5 Cisco NETWORKING SF550X-24P +9.6.1.92.24.6 Cisco NETWORKING SF550X-24MP +9.6.1.92.48.1 Cisco NETWORKING SF550X-48 +9.6.1.92.48.5 Cisco NETWORKING SF550X-48P +9.6.1.92.48.6 Cisco NETWORKING SF550X-48MP +9.6.1.94.24.1 Cisco NETWORKING SG350X-24 +9.6.1.94.24.5 Cisco NETWORKING SG350X-24P +9.6.1.94.24.6 Cisco NETWORKING SG350X-24MP +9.6.1.94.48.1 Cisco NETWORKING SG350X-48 +9.6.1.94.48.5 Cisco NETWORKING SG350X-48P +9.6.1.94.48.6 Cisco NETWORKING SG350X-48MP +9.6.1.95.10.3 Cisco NETWORKING SG350-10 +9.6.1.95.10.5 Cisco NETWORKING SG350-10P +9.6.1.95.10.6 Cisco NETWORKING SG350-10MP +9.6.1.95.10.10 Cisco NETWORKING SG355-10P +9.6.1.95.28.1 Cisco NETWORKING SG350-28 +9.6.1.95.28.5 Cisco NETWORKING SG350-28P +9.6.1.95.28.6 Cisco NETWORKING SG350-28MP +9.6.1.96.48.1 Cisco NETWORKING SF350-48 +9.6.1.96.48.5 Cisco NETWORKING SF350-48P +9.6.1.96.48.6 Cisco NETWORKING SF350-48MP +9.6.1.97.10.5 Cisco NETWORKING SG250-10P +9.6.1.97.26.1 Cisco NETWORKING SG250-26 +9.6.1.97.26.4 Cisco NETWORKING SG250-26HP +9.6.1.97.26.5 Cisco NETWORKING SG250-26P +9.6.1.98.24.1 Cisco NETWORKING SF250-48 +9.6.1.98.24.4 Cisco NETWORKING SF250-48HP 9.9.368.4.2 Cisco NETWORKING CSS 11800 9.9.368.4.3 Cisco NETWORKING CSS 11500 9.9.368.4.4 Cisco NETWORKING CSS 11050 @@ -3927,6 +4021,13 @@ 838.5.1.1000.4.0 Xedia NETWORKING Lucent1000 838.5.1.1000.4.1 Xedia NETWORKING Lucent1000 +841 Proxim Wireless NETWORKING +841.2.1 Proxim Wireless NETWORKING AP-800 +841.2.2 Proxim Wireless NETWORKING AP-8000 +841.2.11 Proxim Wireless NETWORKING QB-8100 +841.2.21 Proxim Wireless NETWORKING MP-8100 +841.2.22 Proxim Wireless NETWORKING MP-8100-CPE + 890 Zyxel NETWORKING 890.1.2.6.22 Zyxel NETWORKING Prestige650R 890.1.5.8.66 Zyxel NETWORKING XGS1910 @@ -4550,7 +4651,97 @@ 1991.1.3.55.2.2 Foundry NETWORKING MLXe 1991.1.3.55.3.2 Foundry NETWORKING MLXe 1991.1.3.55.4.2 Brocade NETWORKING MLXe-32 -1991.1.3.57.1.1.1.1 Brocade NETWORKING ICX6430-24 +1991.1.3.56.1.1.1.1 Brocade NETWORKING ICX 6610-24 Switch Image +1991.1.3.56.1.1.1.2 Brocade NETWORKING ICX 6610-24 Base Layer 3 Router Image +1991.1.3.56.1.1.1.3 Brocade NETWORKING ICX 6610-24 Base Router Image +1991.1.3.56.1.1.1.4 Brocade NETWORKING ICX 6610-24 Premium Router Image +1991.1.3.56.1.1.1.5 Brocade NETWORKING ICX 6610-24 Advanced Router Image +1991.1.3.56.1.2.1.1 Brocade NETWORKING ICX 6610-24 HPOE Switch Image +1991.1.3.56.1.2.1.2 Brocade NETWORKING ICX 6610-24 HPOE Base Layer 3 Router Image +1991.1.3.56.1.2.1.3 Brocade NETWORKING ICX 6610-24 HPOE Base Router Image +1991.1.3.56.1.2.1.4 Brocade NETWORKING ICX 6610-24 HPOE Premium Router Image +1991.1.3.56.1.2.1.5 Brocade NETWORKING ICX 6610-24 HPOE Advanced Router Image +1991.1.3.56.1.3.1.1 Brocade NETWORKING ICX 6610-24F Switch Image +1991.1.3.56.1.3.1.2 Brocade NETWORKING ICX 6610-24F Base Layer 3 Router Image +1991.1.3.56.1.3.1.3 Brocade NETWORKING ICX 6610-24F Base Router Image +1991.1.3.56.1.3.1.4 Brocade NETWORKING ICX 6610-24F Premium Router Image +1991.1.3.56.1.3.1.5 Brocade NETWORKING ICX 6610-24F Advanced Router Image +1991.1.3.56.2.1.1.1 Brocade NETWORKING ICX 6610-48 Switch Image +1991.1.3.56.2.1.1.2 Brocade NETWORKING ICX 6610-48 Base Layer 3 Router Image +1991.1.3.56.2.1.1.3 Brocade NETWORKING ICX 6610-48 Base Router Image +1991.1.3.56.2.1.1.4 Brocade NETWORKING ICX 6610-48 Premium Router Image +1991.1.3.56.2.1.1.5 Brocade NETWORKING ICX 6610-48 Advanced Router Image +1991.1.3.56.2.2.1.1 Brocade NETWORKING ICX 6610-48 HPOE Switch Image +1991.1.3.56.2.2.1.2 Brocade NETWORKING ICX 6610-48 HPOE Base Layer 3 Router Image +1991.1.3.56.2.2.1.3 Brocade NETWORKING ICX 6610-48 HPOE Base Router Image +1991.1.3.56.2.2.1.4 Brocade NETWORKING ICX 6610-48 HPOE Premium Router Image +1991.1.3.56.2.2.1.5 Brocade NETWORKING ICX 6610-48 HPOE Advanced Router Image +1991.1.3.57.1.1.1.1 Brocade NETWORKING ICX 6430-24 Switch +1991.1.3.57.1.2.1.1 Brocade NETWORKING ICX 6430-24 HPOE Switch +1991.1.3.57.2.1.1.1 Brocade NETWORKING ICX 6430-48 Switch +1991.1.3.57.2.2.1.1 Brocade NETWORKING ICX 6430-48 HPOE Switch +1991.1.3.57.3.1.1.1 Brocade NETWORKING ICX 6430-C12-PD Switch +1991.1.3.58.1.1.1.1 Brocade NETWORKING ICX 6450-24 Switch Image +1991.1.3.58.1.1.1.2 Brocade NETWORKING ICX 6450-24 Base Layer 3 Router Image +1991.1.3.58.1.1.1.3 Brocade NETWORKING ICX 6450-24 Base Router Image +1991.1.3.58.1.1.1.4 Brocade NETWORKING ICX 6450-24 Premium Router Image +1991.1.3.58.1.2.1.1 Brocade NETWORKING ICX 6450-24 HPOE Switch Image +1991.1.3.58.1.2.1.2 Brocade NETWORKING ICX 6450-24 HPOE Base Layer 3 Router Image +1991.1.3.58.1.2.1.3 Brocade NETWORKING ICX 6450-24 HPOE Base Router Image +1991.1.3.58.1.2.1.4 Brocade NETWORKING ICX 6450-24 HPOE Premium Router Image +1991.1.3.58.2.1.1.1 Brocade NETWORKING ICX 6450-48 Switch Image +1991.1.3.58.2.1.1.2 Brocade NETWORKING ICX 6450-48 Base Layer 3 Router Image +1991.1.3.58.2.1.1.3 Brocade NETWORKING ICX 6450-48 Base Router Image +1991.1.3.58.2.1.1.4 Brocade NETWORKING ICX 6450-48 Premium Router Image +1991.1.3.58.2.2.1.1 Brocade NETWORKING ICX 6450-48 HPOE Switch Image +1991.1.3.58.2.2.1.2 Brocade NETWORKING ICX 6450-48 HPOE Base Layer 3 Router Image +1991.1.3.58.2.2.1.3 Brocade NETWORKING ICX 6450-48 HPOE Base Router Image +1991.1.3.58.2.2.1.4 Brocade NETWORKING ICX 6450-48 HPOE Premium Router Image +1991.1.3.58.3.1.1.1 Brocade NETWORKING ICX 6450-C12-PD Switch Image +1991.1.3.58.3.1.1.2 Brocade NETWORKING ICX 6450-C12-PD Base Layer 3 Router Image +1991.1.3.58.3.1.1.3 Brocade NETWORKING ICX 6450-C12-PD Base Router Image +1991.1.3.58.3.1.1.4 Brocade NETWORKING ICX 6450-C12-PD Premium Router Image +1991.1.3.59.1.1.1.1 Brocade NETWORKING ICX 6650-64 Switch Image +1991.1.3.59.1.1.1.2 Brocade NETWORKING ICX 6650-64 Base Layer 3 Router Image +1991.1.3.59.1.1.1.3 Brocade NETWORKING ICX 6650-64 Base Router Image +1991.1.3.60.1.1.1.1 Brocade NETWORKING ICX 7750-48C Switch Image +1991.1.3.60.1.1.1.2 Brocade NETWORKING ICX 7750-48C Base Layer 3 Router Image +1991.1.3.60.1.1.1.3 Brocade NETWORKING ICX 7750-48C Base Router Image +1991.1.3.60.2.1.1.1 Brocade NETWORKING ICX 7750-48F Switch Image +1991.1.3.60.2.1.1.2 Brocade NETWORKING ICX 7750-48F Base Layer 3 Router Image +1991.1.3.60.2.1.1.3 Brocade NETWORKING ICX 7750-48F Base Router Image +1991.1.3.60.3.1.1.1 Brocade NETWORKING ICX 7750-26Q Switch Image +1991.1.3.60.3.1.1.2 Brocade NETWORKING ICX 7750-26Q Base Layer 3 Router Image +1991.1.3.60.3.1.1.3 Brocade NETWORKING ICX 7750-26Q Base Router Image +1991.1.3.61.1.1.1.1 Brocade NETWORKING ICX 7450-24 Switch Image +1991.1.3.61.1.1.1.2 Brocade NETWORKING ICX 7450-24 Base Layer 3 Router Image +1991.1.3.61.1.1.1.3 Brocade NETWORKING ICX 7450-24 Base Router Image +1991.1.3.61.1.2.1.1 Brocade NETWORKING ICX 7450-24 HPOE Switch Image +1991.1.3.61.1.2.1.2 Brocade NETWORKING ICX 7450-24 HPOE Base Layer 3 Router Image +1991.1.3.61.1.2.1.3 Brocade NETWORKING ICX 7450-24 HPOE Base Router Image +1991.1.3.61.2.1.1.1 Brocade NETWORKING ICX 7450-48 Switch Image +1991.1.3.61.2.1.1.2 Brocade NETWORKING ICX 7450-48 Base Layer 3 Router Image +1991.1.3.61.2.1.1.3 Brocade NETWORKING ICX 7450-48 Base Router Image +1991.1.3.61.2.2.1.1 Brocade NETWORKING ICX 7450-48 HPOE Switch Image +1991.1.3.61.2.2.1.2 Brocade NETWORKING ICX 7450-48 HPOE Base Layer 3 Router Image +1991.1.3.61.2.2.1.3 Brocade NETWORKING ICX 7450-48 HPOE Base Router Image +1991.1.3.61.2.3.1.1 Brocade NETWORKING ICX 7450-48F Switch Image +1991.1.3.61.2.3.1.2 Brocade NETWORKING ICX 7450-48F Base Layer 3 Router Image +1991.1.3.61.2.3.1.3 Brocade NETWORKING ICX 7450-48F Base Router Image +1991.1.3.62.1.1.1.1 Brocade NETWORKING ICX 7250-24 Switch Image +1991.1.3.62.1.1.1.2 Brocade NETWORKING ICX 7250-24 Base Layer 3 Router Image +1991.1.3.62.1.1.1.3 Brocade NETWORKING ICX 7250-24 Base Router Image +1991.1.3.62.1.2.1.1 Brocade NETWORKING ICX 7250-24 HPOE Switch Image +1991.1.3.62.1.2.1.2 Brocade NETWORKING ICX 7250-24 HPOE Base Layer 3 Router Image +1991.1.3.62.1.2.1.3 Brocade NETWORKING ICX 7250-24 HPOE Base Router Image +1991.1.3.62.1.3.1.1 Brocade NETWORKING ICX 7250-24 1G Switch Image +1991.1.3.62.1.3.1.2 Brocade NETWORKING ICX 7250-24 1G Base Layer 3 Router Image +1991.1.3.62.2.1.1.1 Brocade NETWORKING ICX 7250-48 Switch Image +1991.1.3.62.2.1.1.2 Brocade NETWORKING ICX 7250-48 Base Layer 3 Router Image +1991.1.3.62.2.1.1.3 Brocade NETWORKING ICX 7250-48 Base Router Image +1991.1.3.62.2.2.1.1 Brocade NETWORKING ICX 7250-48 HPOE Switch Image +1991.1.3.62.2.2.1.2 Brocade NETWORKING ICX 7250-48 HPOE Base Layer 3 Router Image +1991.1.3.62.2.2.1.3 Brocade NETWORKING ICX 7250-48 HPOE Base Router Image 1991.1.5.1.1.4.2.1 Foundry NETWORKING FastIron 2402CF Switch 1991.1.5.1.1.4.3.1 Foundry NETWORKING FastIron 4802CF Switch 1991.1.5.1.1.4.4.1 Foundry NETWORKING EdgeIron 24G-A @@ -5230,7 +5421,74 @@ 3076.1.2.1.1.3.1 Cisco NETWORKING VPN 3002 Concentrator 3097 WatchGuard NETWORKING +3097.1.4 WatchGuard NETWORKING fbX Series +3097.1.4.1 WatchGuard NETWORKING fbX500 +3097.1.4.2 WatchGuard NETWORKING fbX550e +3097.1.4.3 WatchGuard NETWORKING fbX700 +3097.1.4.4 WatchGuard NETWORKING fbX750e +3097.1.4.5 WatchGuard NETWORKING fbX750e-4 +3097.1.4.6 WatchGuard NETWORKING fbX1000 +3097.1.4.7 WatchGuard NETWORKING fbx1250e +3097.1.4.8 WatchGuard NETWORKING fbX1250e-4 +3097.1.4.9 WatchGuard NETWORKING fbX2500 +3097.1.4.10 WatchGuard NETWORKING fbX5000 +3097.1.4.11 WatchGuard NETWORKING fbX5500e +3097.1.4.12 WatchGuard NETWORKING fbX6000 +3097.1.4.13 WatchGuard NETWORKING fbX6500e +3097.1.4.14 WatchGuard NETWORKING fbX8000 +3097.1.4.15 WatchGuard NETWORKING fbX8500e +3097.1.4.16 WatchGuard NETWORKING fbX8500e-F +3097.1.4.17 WatchGuard NETWORKING fbX10e +3097.1.4.18 WatchGuard NETWORKING fbX10e-W +3097.1.4.19 WatchGuard NETWORKING fbX20e +3097.1.4.20 WatchGuard NETWORKING fbX20e-W +3097.1.4.21 WatchGuard NETWORKING fbX55e +3097.1.4.22 WatchGuard NETWORKING fbX55e-W +3097.1.5 WatchGuard NETWORKING XTM Series +3097.1.5.1 WatchGuard NETWORKING XTM1050 +3097.1.5.2 WatchGuard NETWORKING XTM1050-F +3097.1.5.3 WatchGuard NETWORKING XTM830-F +3097.1.5.4 WatchGuard NETWORKING XTM830 +3097.1.5.5 WatchGuard NETWORKING XTM820 +3097.1.5.6 WatchGuard NETWORKING XTM810 +3097.1.5.7 WatchGuard NETWORKING XTM530 +3097.1.5.8 WatchGuard NETWORKING XTM520 +3097.1.5.9 WatchGuard NETWORKING XTM510 3097.1.5.10 WatchGuard NETWORKING XTM505 +3097.1.5.11 WatchGuard NETWORKING XTM23 +3097.1.5.12 WatchGuard NETWORKING XTM22 +3097.1.5.13 WatchGuard NETWORKING XTM21 +3097.1.5.14 WatchGuard NETWORKING XTM23-W +3097.1.5.15 WatchGuard NETWORKING XTM22-W +3097.1.5.16 WatchGuard NETWORKING XTM21-W +3097.1.5.17 WatchGuard NETWORKING XTM2050 +3097.1.5.18 WatchGuard NETWORKING XTM25 +3097.1.5.19 WatchGuard NETWORKING XTM25-W +3097.1.5.20 WatchGuard NETWORKING XTM26 +3097.1.5.21 WatchGuard NETWORKING XTM26-W +3097.1.5.22 WatchGuard NETWORKING XTM33 +3097.1.5.23 WatchGuard NETWORKING XTM33-W +3097.1.5.24 WatchGuard NETWORKING XTM330 +3097.1.5.25 WatchGuard NETWORKING XTM545 +3097.1.5.26 WatchGuard NETWORKING XTM535 +3097.1.5.27 WatchGuard NETWORKING XTM525 +3097.1.5.28 WatchGuard NETWORKING XTM515 +3097.1.5.29 WatchGuard NETWORKING XTM2050A +3097.1.5.30 WatchGuard NETWORKING XTM850 +3097.1.5.31 WatchGuard NETWORKING XTM860 +3097.1.5.32 WatchGuard NETWORKING XTM870 +3097.1.5.33 WatchGuard NETWORKING XTM870-F +3097.1.5.34 WatchGuard NETWORKING XTM1520 +3097.1.5.35 WatchGuard NETWORKING XTM1525 +3097.1.5.36 WatchGuard NETWORKING XTM2520 +3097.1.5.37 WatchGuard NETWORKING XTMV-SM +3097.1.5.38 WatchGuard NETWORKING XTMV-MED +3097.1.5.39 WatchGuard NETWORKING XTMV-LG +3097.1.5.40 WatchGuard NETWORKING XTMV-DC +3097.1.5.41 WatchGuard NETWORKING XTMV-EXP +3097.1.5.42 WatchGuard NETWORKING XTMV +3097.1.5.43 WatchGuard NETWORKING XTM1520-RP +3097.1.5.44 WatchGuard NETWORKING XTM1525-RP 3174 Tasman NETWORKING 3174.1.2 Tasman NETWORKING 1400E @@ -5413,6 +5671,8 @@ 4115.1.8.1 Arris NETWORKING D5 4115.1.9.1 Arris NETWORKING E6000 +4413 Ubiquiti NETWORKING + 4474 PaxComm NETWORKING 4474.102.1 paxcommL2 NETWORKING @@ -6406,7 +6666,10 @@ 12356.101.1.1002 Fortinet NETWORKING Fortigate 110C 12356.101.1.1003 Fortinet NETWORKING Fortigate 111C 12356.101.1.1004 Fortinet NETWORKING Fortigate 100D -12356.101.1.1005 Fortinet NETWORKING Fortigate 100C +12356.101.1.1005 Fortinet NETWORKING Fortigate 140E +12356.101.1.1006 Fortinet NETWORKING Fortigate 140EP +12356.101.1.1041 Fortinet NETWORKING Fortigate 100E +12356.101.1.1043 Fortinet NETWORKING Fortigate 101E 12356.101.1.1401 Fortinet NETWORKING Fortigate 140D 12356.101.1.1402 Fortinet NETWORKING Fortigate 140P 12356.101.1.1403 Fortinet NETWORKING Fortigate 140T @@ -6419,6 +6682,7 @@ 12356.101.1.2006 Fortinet NETWORKING Fortigate 240D 12356.101.1.2007 Fortinet NETWORKING Fortigate 200DP 12356.101.1.2008 Fortinet NETWORKING Fortigate 240DP +12356.101.1.2009 Fortinet NETWORKING Fortigate 200E 12356.101.1.2013 Fortinet NETWORKING Fortigate 280D 12356.101.1.3000 Fortinet NETWORKING Fortigate 300 12356.101.1.3001 Fortinet NETWORKING Fortigate 300A @@ -6452,7 +6716,7 @@ 12356.101.1.12400 Fortinet NETWORKING Fortigate 1240B 12356.101.1.15000 Fortinet NETWORKING Fortigate 1500D 12356.101.1.15001 Fortinet NETWORKING Fortigate 1500DT -12356.101.1.20000 Fortinet NETWORKING Fortigate 2000 +12356.101.1.20000 Fortinet NETWORKING Fortigate 2000E 12356.101.1.30000 Fortinet NETWORKING Fortigate 3000 12356.101.1.30160 Fortinet NETWORKING Fortigate 3016B 12356.101.1.30400 Fortinet NETWORKING Fortigate 3040B @@ -6775,6 +7039,8 @@ 25053 RUCKUS NETWORKING 25053.3.1.5.2 Ruckus NETWORKING ZoneDirector +24681 Qnap STORAGE + 25461 Palo Alto Networks NETWORKING 25461.2.3.2 Palo Alto Networks NETWORKING PA-4020 25461.2.3.3 Palo Alto Networks NETWORKING PA-2050 @@ -8553,6 +8819,112 @@ 26866.1.1 Gigamon NETWORKING GigaVUE-420 26866.3.1 Gigamon NETWORKING GigaVUE-2404 +29671 Cisco NETWORKING Meraki product +29671.2.1 Cisco NETWORKING Meraki MINI +29671.2.2 Cisco NETWORKING Meraki ID2 +29671.2.3 Cisco NETWORKING Meraki WPG +29671.2.4 Cisco NETWORKING Meraki OD1 +29671.2.5 Cisco NETWORKING Meraki OD2 +29671.2.6 Cisco NETWORKING Meraki OD3 +29671.2.7 Cisco NETWORKING Meraki MO1 +29671.2.8 Cisco NETWORKING Meraki SOL +29671.2.9 Cisco NETWORKING Meraki LR1 +29671.2.10 Cisco NETWORKING Meraki MR11 +29671.2.11 Cisco NETWORKING Meraki MR12 +29671.2.12 Cisco NETWORKING Meraki MR14 +29671.2.13 Cisco NETWORKING Meraki MR16 +29671.2.14 Cisco NETWORKING Meraki MR24 +29671.2.15 Cisco NETWORKING Meraki MR62 +29671.2.16 Cisco NETWORKING Meraki MR66 +29671.2.17 Cisco NETWORKING Meraki MR34 +29671.2.18 Cisco NETWORKING Meraki MR18 +29671.2.19 Cisco NETWORKING Meraki MR26 +29671.2.20 Cisco NETWORKING Meraki MR32 +29671.2.21 Cisco NETWORKING Meraki MR72 +29671.2.22 Cisco NETWORKING Meraki MR42 +29671.2.23 Cisco NETWORKING Meraki MR52 +29671.2.24 Cisco NETWORKING Meraki MR53 +29671.2.25 Cisco NETWORKING Meraki MR84 +29671.2.26 Cisco NETWORKING Meraki MR30H +29671.2.27 Cisco NETWORKING Meraki MR33 +29671.2.28 Cisco NETWORKING Meraki MR74 +29671.2.29 Cisco NETWORKING Meraki MR70 +29671.2.100 Cisco NETWORKING Meraki Z1 +29671.2.101 Cisco NETWORKING Meraki MX70 +29671.2.102 Cisco NETWORKING Meraki MX60 +29671.2.103 Cisco NETWORKING Meraki MX80 +29671.2.104 Cisco NETWORKING Meraki MX400 +29671.2.105 Cisco NETWORKING Meraki MX600 +29671.2.106 Cisco NETWORKING Meraki MX100 +29671.2.107 Cisco NETWORKING Meraki MX64 +29671.2.108 Cisco NETWORKING Meraki MX64W +29671.2.109 Cisco NETWORKING Meraki MX84 +29671.2.110 Cisco NETWORKING Meraki MX65 +29671.2.111 Cisco NETWORKING Meraki MX65W +29671.2.112 Cisco NETWORKING Meraki MX250 +29671.2.113 Cisco NETWORKING Meraki MX450 +29671.2.116 Cisco NETWORKING Meraki Z3 +29671.2.117 Cisco NETWORKING Meraki GX20 +29671.2.118 Cisco NETWORKING Meraki MX67 +29671.2.119 Cisco NETWORKING Meraki MX67W +29671.2.120 Cisco NETWORKING Meraki MX67C +29671.2.121 Cisco NETWORKING Meraki MX68 +29671.2.122 Cisco NETWORKING Meraki MX68W +29671.2.123 Cisco NETWORKING Meraki MX68CW +29671.2.124 Cisco NETWORKING Meraki Z3C +29671.2.200 Cisco NETWORKING Meraki VM10 +29671.2.300 Cisco NETWORKING Meraki MS22 +29671.2.301 Cisco NETWORKING Meraki MS22P +29671.2.302 Cisco NETWORKING Meraki MS42 +29671.2.303 Cisco NETWORKING Meraki MS42p +29671.2.304 Cisco NETWORKING Meraki MS220-8 +29671.2.305 Cisco NETWORKING Meraki MS220-8P +29671.2.306 Cisco NETWORKING Meraki MS220-24 +29671.2.307 Cisco NETWORKING Meraki MS220-24P +29671.2.308 Cisco NETWORKING Meraki MS220-48 +29671.2.309 Cisco NETWORKING Meraki MS220-48LP +29671.2.310 Cisco NETWORKING Meraki MS220-48FP +29671.2.311 Cisco NETWORKING Meraki MS320-24 +29671.2.312 Cisco NETWORKING Meraki MS320-24P +29671.2.313 Cisco NETWORKING Meraki MS320-48 +29671.2.314 Cisco NETWORKING Meraki MS320-48LP +29671.2.315 Cisco NETWORKING Meraki MS320-48FP +29671.2.316 Cisco NETWORKING Meraki MS420-24 +29671.2.317 Cisco NETWORKING Meraki MS420-48 +29671.2.318 Cisco NETWORKING Meraki MS350-24 +29671.2.319 Cisco NETWORKING Meraki MS350-24P +29671.2.320 Cisco NETWORKING Meraki MS350-48 +29671.2.321 Cisco NETWORKING Meraki MS350-48LP +29671.2.322 Cisco NETWORKING Meraki MS350-48FP +29671.2.323 Cisco NETWORKING Meraki MS410-16 +29671.2.324 Cisco NETWORKING Meraki MS410-32 +29671.2.325 Cisco NETWORKING Meraki MS425-16 +29671.2.326 Cisco NETWORKING Meraki MS425-32 +29671.2.327 Cisco NETWORKING Meraki MS350-24X +29671.2.328 Cisco NETWORKING Meraki MS225-24 +29671.2.329 Cisco NETWORKING Meraki MS225-24P +29671.2.330 Cisco NETWORKING Meraki MS225-48 +29671.2.331 Cisco NETWORKING Meraki MS225-48LP +29671.2.332 Cisco NETWORKING Meraki MS225-48FP +29671.2.333 Cisco NETWORKING Meraki MS250-24 +29671.2.334 Cisco NETWORKING Meraki MS250-24P +29671.2.335 Cisco NETWORKING Meraki MS250-48 +29671.2.336 Cisco NETWORKING Meraki MS250-48LP +29671.2.337 Cisco NETWORKING Meraki MS250-48FP +29671.2.338 Cisco NETWORKING Meraki MS120-8 +29671.2.339 Cisco NETWORKING Meraki MS120-8LP +29671.2.340 Cisco NETWORKING Meraki MS120-8FP +29671.2.341 Cisco NETWORKING Meraki MS120-24 +29671.2.342 Cisco NETWORKING Meraki MS120-24P +29671.2.343 Cisco NETWORKING Meraki MS120-48 +29671.2.344 Cisco NETWORKING Meraki MS120-48LP +29671.2.345 Cisco NETWORKING Meraki MS210-24 +29671.2.346 Cisco NETWORKING Meraki MS210-24P +29671.2.347 Cisco NETWORKING Meraki MS210-48 +29671.2.348 Cisco NETWORKING Meraki MS210-48LP +29671.2.349 Cisco NETWORKING Meraki MS210-48FP +29671.2.356 Cisco NETWORKING Meraki MS120-48FP + 29999 Hewlett-Packard PRINTER # specifying a model value prevent fallback on hrDeviceDescr value for better identification 29999.1 Hewlett-Packard PRINTER @@ -8584,3 +8956,10 @@ 37560.1.8 Frontier NETWORKING nGenius 1500 41112 Ubiquiti NETWORKING +41112.1.3 Ubiquiti NETWORKING AirFIBER +41112.1.4 Ubiquiti NETWORKING AirMAX +41112.1.5 Ubiquiti NETWORKING EdgeMax +41112.1.6 Ubiquiti NETWORKING UniFi +41112.1.7 Ubiquiti NETWORKING AirVision +41112.1.8 Ubiquiti NETWORKING MFi +41112.1.9 Ubiquiti NETWORKING UniTel diff --git a/share/usb.ids b/share/usb.ids index a1db7c6d59..eccf728fe6 100644 --- a/share/usb.ids +++ b/share/usb.ids @@ -9,8 +9,8 @@ # The latest version can be obtained from # http://www.linux-usb.org/usb.ids # -# Version: 2018.05.04 -# Date: 2018-05-04 20:34:07 +# Version: 2018.08.15 +# Date: 2018-08-15 20:34:06 # # Vendors, devices and interfaces. Please keep sorted. @@ -6843,6 +6843,7 @@ 0072 M-LS6UL Mouse 0073 M-LS7UL Mouse 0074 M-FW1UL Mouse + 0075 M-FW2DL Mouse 200c LD-USB/TX 4002 Laneed 100Mbps Ethernet LD-USB/TX [pegasus] 4005 LD-USBL/TX @@ -18256,6 +18257,8 @@ ad02 SE340D PC Remote Control af01 AUVIO Universal Remote Receiver for PlayStation 3 1d5b Smartronix, Inc. +1d5c Fresco Logic + 2000 FL2000/FL2000DX VGA/DVI/HDMI Adapter 1d6b Linux Foundation 0001 1.1 root hub 0002 2.0 root hub @@ -18386,6 +18389,7 @@ 1fc9 NXP Semiconductors 0003 LPC1343 010b PR533 + 012b i.MX 8M Dual/8M QuadLite/8M Quad Serial Downloader 1fde ILX Lightwave Corporation 0001 UART Bridge 1fe7 Vertex Wireless Co., Ltd. @@ -18623,6 +18627,25 @@ 0001 EPOC Consumer Headset Wireless Dongle 21d6 Agecodagis SARL 0002 Seismic recorder [Tellus] +2207 Fuzhou Rockchip Electronics Company + 0010 GoClever Tab R83 + 0011 SmartTab + 281a RK2818 in Mask ROM mode + 290a RK2918 in Mask ROM mode + 292a RK2928 in Mask ROM mode + 292c RK3026 in Mask ROM mode + 300a RK3066 in Mask ROM mode + 300b RK3168 in Mask ROM mode + 301a RK3036 in Mask ROM mode + 310a RK3066B in Mask ROM mode + 310b RK3188 in Mask ROM mode + 310c RK3126/RK3128 in Mask ROM mode + 310d RK3126 in Mask ROM mode + 320a RK3288 in Mask ROM mode + 320b RK3228/RK3229 in Mask ROM mode + 320c RK3328 in Mask ROM mode + 330a RK3368 in Mask ROM mode + 330c RK3399 in Mask ROM mode 2222 MacAlly 0004 iWebKey Keyboard 2520 Mini Tablet @@ -18841,6 +18864,9 @@ 002d Alcor mouse 0047 MasterKeys Pro L 9494 Sirus Headset +2548 Pulse-Eight + 1001 CEC Adapter + 1002 CEC Adapter 2632 TwinMOS 3209 7-in-1 Card Reader 2639 Xsens @@ -19015,6 +19041,8 @@ 2dcf Dialog Semiconductor c952 Audio Class 2.0 Devices 2fb2 Fujitsu, Ltd +3016 Boundary Devices, LLC + 0001 Nitrogen Bootloader 3125 Eagletron 0001 TrackerPod Camera Stand 3136 Navini Networks diff --git a/t/agent/http/client/connection.t b/t/agent/http/client/connection.t index 8c1396f02f..d6fe1fd40b 100755 --- a/t/agent/http/client/connection.t +++ b/t/agent/http/client/connection.t @@ -18,7 +18,7 @@ use FusionInventory::Test::Utils; unsetProxyEnvVar(); # find an available port -my $port = FusionInventory::Agent::Tools::first { test_port($_) } 8080 .. 8090; +my $port = FusionInventory::Agent::Tools::first { test_port($_) } 8080 .. 8180; if (!$port) { plan skip_all => 'no port available'; diff --git a/t/agent/http/client/fusion/response.t b/t/agent/http/client/fusion/response.t index 98c8de2043..14c5e390d0 100644 --- a/t/agent/http/client/fusion/response.t +++ b/t/agent/http/client/fusion/response.t @@ -19,7 +19,7 @@ use FusionInventory::Test::Utils; unsetProxyEnvVar(); # find an available port -my $port = FusionInventory::Agent::Tools::first { test_port($_) } 8080 .. 8090; +my $port = FusionInventory::Agent::Tools::first { test_port($_) } 8080 .. 8180; if (!$port) { plan skip_all => 'no available port'; diff --git a/t/agent/http/client/ocs/response.t b/t/agent/http/client/ocs/response.t index d33820e68a..81b772ec97 100755 --- a/t/agent/http/client/ocs/response.t +++ b/t/agent/http/client/ocs/response.t @@ -19,7 +19,7 @@ use FusionInventory::Test::Utils; unsetProxyEnvVar(); # find an available port -my $port = FusionInventory::Agent::Tools::first { test_port($_) } 8080 .. 8090; +my $port = FusionInventory::Agent::Tools::first { test_port($_) } 8080 .. 8180; if (!$port) { plan skip_all => 'no available port'; diff --git a/t/agent/http/client/ssl.t b/t/agent/http/client/ssl.t index ea159fe592..86cc2adecf 100755 --- a/t/agent/http/client/ssl.t +++ b/t/agent/http/client/ssl.t @@ -22,7 +22,7 @@ use Net::HTTPS; unsetProxyEnvVar(); # find an available port -my $port = FusionInventory::Agent::Tools::first { test_port($_) } 8080 .. 8090; +my $port = FusionInventory::Agent::Tools::first { test_port($_) } 8080 .. 8180; if (!$port) { plan skip_all => 'no available port'; diff --git a/t/agent/http/server.t b/t/agent/http/server.t index 512c5c8db1..2641bb9a95 100755 --- a/t/agent/http/server.t +++ b/t/agent/http/server.t @@ -48,9 +48,6 @@ if (my $pid = fork()) { exit $client->get('http://127.0.0.1:62354')->is_success(); } -# find an available port -my $port = FusionInventory::Agent::Tools::first { test_port($_) } 8080 .. 8090; - lives_ok { $server = FusionInventory::Agent::HTTP::Server->new( agent => FusionInventory::Test::Agent->new(), @@ -90,7 +87,7 @@ ok ( ); # find an available port -$port = FusionInventory::Agent::Tools::first { test_port($_) } 8080 .. 8090; +my $port = FusionInventory::Agent::Tools::first { test_port($_) } 8080 .. 8180; lives_ok { $server = FusionInventory::Agent::HTTP::Server->new( diff --git a/t/agent/soap.t b/t/agent/soap.t index ff3dff68d5..efe4a554be 100755 --- a/t/agent/soap.t +++ b/t/agent/soap.t @@ -35,8 +35,7 @@ my %tests = ( 'SMODEL' => 'Sun Fire X2200 M2 with Dual Core Processor', 'BDATE' => '2009-02-04T00:00:00Z', 'ASSETTAG' => ' To Be Filled By O.E.M.', - 'BVERSION' => 'S39_3B27', - 'SSN' => undef + 'BVERSION' => 'S39_3B27' } ], 'getHardwareInfo' => [ diff --git a/t/agent/tools/win32.t b/t/agent/tools/win32.t old mode 100755 new mode 100644 index 5eaa448c90..72ab908e46 --- a/t/agent/tools/win32.t +++ b/t/agent/tools/win32.t @@ -172,6 +172,47 @@ my %register = ( '/TEMP' => '%SystemRoot%\\TEMP', '/OS' => 'Windows_NT', } + }, + 'HKEY_USERS/' => { + 'S-1-5-21-2246875202-1293753324-4206800371-500/' => { + 'Software/' => { + 'SimonTatham/' => { + 'PuTTY/' => { + '/Version' => '4.1', + 'SshHostKeys/' => { + '/rsa2@22:192.168.20.32' => '76f523a6eec4ea6b' + }, + '/username' => 'johndoe' + } + }, + 'Mozilla/' => { + 'Firefox/' => { + '/Version' => '59.0' + } + } + } + }, + 'S-1-5-21-2246875202-1293753324-4206800567-500/' => { + '/DisplayName' => 'Janine', + 'Software/' => { + 'SimonTatham/' => { + 'PuTTY/' => { + '/Version' => '5.2', + '/username' => 'jane', + 'SshHostKeys/' => { + '/rsa2@22:192.168.20.54' => 'fdfb3a2eeaa7' + } + } + }, + 'Mozilla/' => { + 'Firefox/' => { + '/Version' => '62.0', + 'Configuration/' => {}, + '/Timeout' => '15' + } + } + } + } } ); @@ -235,7 +276,6 @@ my %regval_tests = ( _expected => { 'ClientID' => '0x12345678', 'Version' => '12.0.72365', - 'subkey/' => undef } }, 'teamviewerid-withtype' => { @@ -249,12 +289,80 @@ my %regval_tests = ( _expected => { 'ClientID' => [ '0x12345678', REG_DWORD() ], 'Version' => [ '12.0.72365', REG_SZ() ], - 'subkey/' => [] } }, 'temp-env' => { path => 'HKEY_LOCAL_MACHINE/CurrentControlSet/Control/Session Manager/Environment/TEMP', _expected => '%SystemRoot%\\TEMP' + }, + 'putty_keys' => { + path => 'HKEY_USERS/**/Software/SimonTatham/PuTTY/SshHostKeys/*', + _expected => { + 'S-1-5-21-2246875202-1293753324-4206800371-500/Software/SimonTatham/PuTTY/SshHostKeys/rsa2@22:192.168.20.32' + => '76f523a6eec4ea6b', + 'S-1-5-21-2246875202-1293753324-4206800567-500/Software/SimonTatham/PuTTY/SshHostKeys/rsa2@22:192.168.20.54' + => 'fdfb3a2eeaa7' + } + }, + 'users_software_versions' => { + path => 'HKEY_USERS/**/Software/Mozilla/Firefox/Version', + _expected => { + 'S-1-5-21-2246875202-1293753324-4206800567-500/Software/Mozilla/Firefox/Version' => '62.0', + 'S-1-5-21-2246875202-1293753324-4206800371-500/Software/Mozilla/Firefox/Version' => '59.0' + } + }, + 'users_softwares_versions' => { + path => 'HKEY_USERS/**/Software/**/**/Version', + _expected => { + 'S-1-5-21-2246875202-1293753324-4206800371-500/Software/SimonTatham/PuTTY/Version' => '4.1', + 'S-1-5-21-2246875202-1293753324-4206800567-500/Software/SimonTatham/PuTTY/Version' => '5.2', + 'S-1-5-21-2246875202-1293753324-4206800371-500/Software/Mozilla/Firefox/Version' => '59.0', + 'S-1-5-21-2246875202-1293753324-4206800567-500/Software/Mozilla/Firefox/Version' => '62.0' + } + }, + 'users_software_values' => { + path => 'HKEY_USERS/**/Software/**/**/*', + _expected => { + 'S-1-5-21-2246875202-1293753324-4206800371-500/Software/SimonTatham/PuTTY/Version' => '4.1', + 'S-1-5-21-2246875202-1293753324-4206800371-500/Software/SimonTatham/PuTTY/username' => 'johndoe', + 'S-1-5-21-2246875202-1293753324-4206800567-500/Software/SimonTatham/PuTTY/Version' => '5.2', + 'S-1-5-21-2246875202-1293753324-4206800567-500/Software/Mozilla/Firefox/Version' => '62.0', + 'S-1-5-21-2246875202-1293753324-4206800371-500/Software/Mozilla/Firefox/Version' => '59.0', + 'S-1-5-21-2246875202-1293753324-4206800567-500/Software/SimonTatham/PuTTY/username' => 'jane', + 'S-1-5-21-2246875202-1293753324-4206800567-500/Software/Mozilla/Firefox/Timeout' => '15' + } + }, + 'users_software_values' => { + path => 'HKEY_USERS/**/Software/**/Firefox/*', + _expected => { + 'S-1-5-21-2246875202-1293753324-4206800567-500/Software/Mozilla/Firefox/Version' => '62.0', + 'S-1-5-21-2246875202-1293753324-4206800371-500/Software/Mozilla/Firefox/Version' => '59.0', + 'S-1-5-21-2246875202-1293753324-4206800567-500/Software/Mozilla/Firefox/Timeout' => '15' + } + }, + 'users_vars' => { + path => 'HKEY_USERS/**/*', + _expected => { + 'S-1-5-21-2246875202-1293753324-4206800567-500/DisplayName' => 'Janine' + } + }, + 'users_displayname' => { + path => 'HKEY_USERS/**/DisplayName', + _expected => { + 'S-1-5-21-2246875202-1293753324-4206800567-500/DisplayName' => 'Janine' + } + }, + 'bad_glob_on_values' => { + path => 'HKEY_USERS/**/Software/**/**/**', + _expected => {} + }, + 'bad_glob_on_values_2' => { + path => 'HKEY_USERS/S-1-5-21-2246875202-1293753324-4206800371-500/Software/Mozilla/Firefox/**', + _expected => undef + }, + 'bad_glob_on_values_3' => { + path => 'HKEY_USERS/**/**', + _expected => {} } ); @@ -307,6 +415,28 @@ SKIP: { } ); + $module->mock( + '_getRegistryRoot', + sub { + my (%params) = @_; + return unless $params{root}; + my $root; + if (exists($register{$params{root}})) { + $root = { %{$register{$params{root}}} }; + } else { + $root = \%register; + foreach my $part (split('/',$params{root})) { + return unless $root->{$part.'/'}; + $root = { %{$root->{$part.'/'}} } + } + } + # Bless leaf as expected + map { bless $root->{$_}, 'Win32::TieRegistry' } grep { m|/$| } keys %{$root}; + bless $root, 'Win32::TieRegistry'; + return $root; + } + ); + FusionInventory::Agent::Tools::Win32->use('getRegistryKey'); foreach my $test (keys %regkey_tests) { diff --git a/t/apps/agent.t b/t/apps/agent.t index 25cef656db..8afcf20d03 100755 --- a/t/apps/agent.t +++ b/t/apps/agent.t @@ -12,7 +12,7 @@ use XML::TreePP; use FusionInventory::Agent::Tools; use FusionInventory::Test::Utils; -plan tests => 34; +plan tests => 36; my ($content, $out, $err, $rc); @@ -217,6 +217,25 @@ subtest "--local inventory execution" => sub { }; ok(-f "$dir/foo", '--local result file presence'); +# consecutive lazy inventory with fake server target, no inventory and no failure +($out, $err, $rc) = run_executable( + 'fusioninventory-agent', + "$base_options --lazy --server=http://localhost/plugins/fusioninventory" +); + +subtest "second inventory execution and content" => sub { + check_execution_ok($err, $rc); +}; + +($out, $err, $rc) = run_executable( + 'fusioninventory-agent', + "$base_options --lazy --server=http://localhost/plugins/fusioninventory" +); + +subtest "second inventory execution and content" => sub { + check_execution_ok($err, $rc); +}; + sub check_execution_ok { my ($err, $rc) = @_; @@ -233,6 +252,12 @@ sub check_execution_ok { qr/unexpected error in \S+/, 'no broken module (execution)' ); + + unlike( + $err, + qr/Use of uninitialized value/, + 'no failure on uninitialized value' + ); } sub check_content_ok { diff --git a/t/lib/FusionInventory/Test/Utils.pm b/t/lib/FusionInventory/Test/Utils.pm index 51daf5ba5d..299c64f720 100644 --- a/t/lib/FusionInventory/Test/Utils.pm +++ b/t/lib/FusionInventory/Test/Utils.pm @@ -28,13 +28,13 @@ sub test_port { my $paddr = sockaddr_in($port, $iaddr); my $proto = getprotobyname('tcp'); if (socket(my $socket, PF_INET, SOCK_STREAM, $proto)) { - if (connect($socket, $paddr)) { + if (bind($socket, $paddr)) { close $socket; - return 0; + return 1; } } - return 1; + return 0; } sub test_localhost { diff --git a/t/lib/fake/windows/Win32/TieRegistry.pm b/t/lib/fake/windows/Win32/TieRegistry.pm index ba55a15a7a..9becd25ffd 100644 --- a/t/lib/fake/windows/Win32/TieRegistry.pm +++ b/t/lib/fake/windows/Win32/TieRegistry.pm @@ -32,4 +32,10 @@ sub GetValue { : $self->{$value} ; } +sub SubKeyNames { + my ($self, $key) = @_ ; + my @keys = map { s|/$|| && $_ } grep { m|/$| } keys(%{$self}); + return @keys; +} + 1; diff --git a/t/perlcriticrc b/t/perlcriticrc index 6ec73d5c2c..0fe8db4f0b 100644 --- a/t/perlcriticrc +++ b/t/perlcriticrc @@ -1 +1,2 @@ exclude = ProhibitAccessOfPrivateData ProhibitThreeArgumentOpen +include = ClassHierarchies ProhibitCommaSeparatedStatements ProhibitMultiplePackages diff --git a/t/tasks/inventory/linux/softwares.t b/t/tasks/inventory/linux/softwares.t index c82281e90a..07c9a66d13 100755 --- a/t/tasks/inventory/linux/softwares.t +++ b/t/tasks/inventory/linux/softwares.t @@ -18,6 +18,7 @@ use FusionInventory::Agent::Task::Inventory::Generic::Softwares::RPM; use FusionInventory::Agent::Task::Inventory::Generic::Softwares::Deb; use FusionInventory::Agent::Task::Inventory::Generic::Softwares::Gentoo; use FusionInventory::Agent::Task::Inventory::Generic::Softwares::Nix; +use FusionInventory::Agent::Task::Inventory::Generic::Softwares::Pacman; my $rpm_packages = [ { @@ -292,7 +293,102 @@ my $nix_packages = [ } ]; -plan tests => 9; +my $pacman_packages = [ + { + COMMENTS => 'Common CA certificates (default providers)', + ARCH => 'any', + VERSION => '20180821-1', + NAME => 'ca-certificates', + INSTALLDATE => '12/09/2018', + FILESIZE => 1024 + }, + { + NAME => 'filesystem', + INSTALLDATE => '12/09/2018', + FILESIZE => 12288, + COMMENTS => 'Base Arch Linux files', + SYSTEM_CATEGORY => 'base', + ARCH => 'x86_64', + VERSION => '2018.8-1' + }, + { + VERSION => '20180912-1', + ARCH => 'any', + COMMENTS => 'Arch Linux mirror list for use by pacman', + FILESIZE => 26624, + INSTALLDATE => '12/09/2018', + NAME => 'pacman-mirrorlist' + }, + { + FILESIZE => 60261662, + INSTALLDATE => '12/09/2018', + NAME => 'perl', + VERSION => '5.28.0-1', + ARCH => 'x86_64', + SYSTEM_CATEGORY => 'base', + COMMENTS => 'A highly capable, feature-rich programming language' + }, + { + ARCH => 'x86_64', + COMMENTS => 'system and service manager', + SYSTEM_CATEGORY => 'base-devel', + VERSION => '239.0-2', + INSTALLDATE => '12/09/2018', + NAME => 'systemd', + FILESIZE => 19881000 + }, + { + FILESIZE => 3544186, + INSTALLDATE => '12/09/2018', + NAME => 'vim', + VERSION => '8.1.0333-1', + ARCH => 'x86_64', + COMMENTS => 'Vi Improved, a highly configurable, improved version of the vi text editor' + }, + { + VERSION => '8.1.0333-1', + ARCH => 'x86_64', + COMMENTS => 'Vi Improved, a highly configurable, improved version of the vi text editor (shared runtime)', + FILESIZE => 29674700, + INSTALLDATE => '12/09/2018', + NAME => 'vim-runtime' + }, + { + VERSION => '2.21-2', + COMMENTS => 'A utility to show the full path of commands', + SYSTEM_CATEGORY => 'base,base-devel', + ARCH => 'x86_64', + FILESIZE => 27648, + NAME => 'which', + INSTALLDATE => '12/09/2018' + }, + { + ARCH => 'x86_64', + COMMENTS => 'Library and command line tools for XZ and LZMA compressed files', + VERSION => '5.2.4-1', + INSTALLDATE => '12/09/2018', + NAME => 'xz', + FILESIZE => 775168 + }, + { + FILESIZE => 334848, + NAME => 'zlib', + INSTALLDATE => '12/09/2018', + VERSION => '1.2.11-3', + COMMENTS => 'Compression library implementing the deflate compression method found in gzip and PKZIP', + ARCH => 'x86_64' + }, + { + VERSION => '1.3.5-1', + COMMENTS => 'Zstandard - Fast real-time compression algorithm', + ARCH => 'x86_64', + FILESIZE => 2768240, + NAME => 'zstd', + INSTALLDATE => '12/09/2018' + } +]; + +plan tests => 11; my $inventory = FusionInventory::Test::Inventory->new(); @@ -328,6 +424,15 @@ lives_ok { foreach @$packages; } 'nix: registering'; +$packages = FusionInventory::Agent::Task::Inventory::Generic::Softwares::Pacman::_getPackagesList( + file => "resources/linux/packaging/pacman" +); +cmp_deeply($packages, $pacman_packages, 'pacman: parsing'); +lives_ok { + $inventory->addEntry(section => 'SOFTWARES', entry => $_) + foreach @$packages; +} 'pacman: registering'; + ok( !FusionInventory::Agent::Task::Inventory::Generic::Softwares::Gentoo::_equeryNeedsWildcard( file => "resources/linux/equery/gentoo1" diff --git a/t/tasks/inventory/macos/videos.t b/t/tasks/inventory/macos/videos.t index 9935249811..8e5dd90caa 100755 --- a/t/tasks/inventory/macos/videos.t +++ b/t/tasks/inventory/macos/videos.t @@ -13,11 +13,9 @@ my %tests = ( '10.6.5-dual-monitor' => { MONITORS => [ { - DESCRIPTION => 'E2441', CAPTION => 'E2441' }, { - DESCRIPTION => 'E2441_0', CAPTION => 'E2441_0' } ], @@ -28,13 +26,29 @@ my %tests = ( CHIPSET => 'ATI Radeon HD 5770', MEMORY => '1024', PCISLOT => 'Slot-1' + } + ] + }, + 'dual-display-#475' => { + MONITORS => [ + { + DESCRIPTION => 'Built-In Retina LCD', + CAPTION => 'Color LCD' + } + ], + VIDEOS => [ + { + NAME => 'Intel HD Graphics 530', + CHIPSET => 'Intel HD Graphics 530', + MEMORY => '1536', + PCISLOT => 'Built-In' }, { - NAME => 'ATI Radeon HD 5770', - RESOLUTION => '1920x1080', - CHIPSET => 'ATI Radeon HD 5770', - MEMORY => '1024', - PCISLOT => 'Slot-1' + NAME => 'Radeon Pro 450', + RESOLUTION => '2880x1800', + CHIPSET => 'AMD Radeon Pro 450', + MEMORY => '2048', + PCISLOT => 'PCIe' } ] }, @@ -42,14 +56,13 @@ my %tests = ( MONITORS => [ { CAPTION => 'DELL SE2416H', - DESCRIPTION => 'DELL SE2416H', SERIAL => 'P7HT871G1H9L' } ], VIDEOS => [ { MEMORY => '1024', - PCISLOT => undef, + PCISLOT => 'PCIe', RESOLUTION => '1920x1080', CHIPSET => 'Asus GeForce GT 730', NAME => 'Asus GeForce GT 730' diff --git a/t/tasks/inventory/windows/memory.t b/t/tasks/inventory/windows/memory.t index 61431ef909..4bcaab721d 100755 --- a/t/tasks/inventory/windows/memory.t +++ b/t/tasks/inventory/windows/memory.t @@ -76,6 +76,7 @@ my %tests = ( CAPTION => 'Physical Memory', REMOVABLE => 0, DESCRIPTION => 'Physical Memory', + MEMORYCORRECTION => 'None', CAPACITY => '2048' } ], diff --git a/t/tasks/maintenance.t b/t/tasks/maintenance.t new file mode 100755 index 0000000000..c8a288b51c --- /dev/null +++ b/t/tasks/maintenance.t @@ -0,0 +1,122 @@ +#!/usr/bin/perl + +use strict; +use warnings; +use lib 't/lib'; + +use File::Basename; +use File::Temp qw(tempdir); +use File::Path qw(mkpath); + +use Test::Exception; +use Test::More; +use Test::MockModule; + +use FusionInventory::Agent::Logger; +use FusionInventory::Agent::Task::Maintenance; +use FusionInventory::Agent::Target::Local; +use FusionInventory::Agent::Target::Server; +use FusionInventory::Agent::Target::Scheduler; +use FusionInventory::Agent::Task::Deploy::Datastore; + +plan tests => 22; + +# Setup a target with a Fatal logger and no debug +my $logger = FusionInventory::Agent::Logger->new( + logger => [ 'Test' ] +); + +my $local = FusionInventory::Agent::Target::Local->new( + path => tempdir(CLEANUP => 1), + logger => $logger, + basevardir => tempdir(CLEANUP => 1) +); + +my $server = FusionInventory::Agent::Target::Server->new( + url => 'http://localhost/glpi-any', + logger => $logger, + basevardir => tempdir(CLEANUP => 1) +); + +my $scheduler = FusionInventory::Agent::Target::Scheduler->new( + storage => $server->getStorage(), + logger => $logger, + basevardir => tempdir(CLEANUP => 1) +); + +my $task; + +lives_ok { + $task = FusionInventory::Agent::Task::Maintenance->new( + target => $local, + logger => FusionInventory::Agent::Logger->new( 'debug' => 1 ), + config => {} + ); +} "Maintenance object instanciation for local target" ; +ok( ! $task->isEnabled(), "Maintenance is disabled for local target"); + +lives_ok { + $task = FusionInventory::Agent::Task::Maintenance->new( + target => $server, + logger => FusionInventory::Agent::Logger->new( 'debug' => 1 ), + config => {} + ); +} "Maintenance object instanciation for server target" ; +ok( ! $task->isEnabled(), "Maintenance is disabled for server target"); + +lives_ok { + $task = FusionInventory::Agent::Task::Maintenance->new( + target => $scheduler, + logger => FusionInventory::Agent::Logger->new( 'debug' => 1 ), + config => {} + ); +} "Maintenance object instanciation for scheduler target" ; +is(scalar($scheduler->plannedTasks()), 0, "No planned task for scheduler"); +is(scalar($scheduler->otherTasks()), 0, "No other tasks"); +ok( ! $task->isEnabled(), "Maintenance is disabled for scheduler without task"); + +$scheduler->plannedTasks('Inventory', 'Something'); +is(scalar($scheduler->plannedTasks()), 0, "No planned task for scheduler"); +is(scalar($scheduler->otherTasks()), 2, "2 other tasks"); +ok( ! $task->isEnabled(), "Maintenance is disabled for scheduler but without Maintenance task"); + +# Only Maintenance is kept as task, but we need at least Deploy in others +$scheduler->plannedTasks('Inventory', 'TaskXYZ', 'Maintenance','Deploy'); +is(scalar($scheduler->plannedTasks()), 1, "One planned tasks for scheduler"); +is(scalar($scheduler->otherTasks()), 3, "3 other tasks"); +ok( $task->isEnabled(), "Maintenance is enabled for scheduler"); + +lives_ok { + $task->run(); +} "Doing maintenance"; + +# Test Deploy maintenance module +my $folder = $scheduler->getStorage()->getDirectory().'/deploy/fileparts/private'; +SKIP: { + my $datastore = FusionInventory::Agent::Task::Deploy::Datastore->new( + config => {}, + path => $scheduler->getStorage()->getDirectory(), + logger => $logger + ); + skip 'disk is still full', 7 + if $datastore->diskIsFull(); + + my @files = map { $folder.'/'.$_.'/test' } (0,time-60,time+3600); + foreach my $file (@files) { + File::Path::mkpath(dirname($file)); + open FILE, ">$file" or die "Can't create tmp file: $!\n"; + print FILE "TEST\n"; + close(FILE); + } + ok( -f $files[0], "File exists in folder 0"); + ok( -f $files[1], "File exists in past folder"); + ok( -f $files[2], "File exists in future folder"); + + lives_ok { + $task->run(); + } "Doing Deploy maintenance"; + + ok( ! -f $files[0], "File removed in folder 0"); + ok( ! -f $files[1], "File removed in past folder"); + ok( -f $files[2], "File exists in future folder"); +} diff --git a/t/tasks/netinventory.t b/t/tasks/netinventory.t index d7971df418..adbb66caee 100644 --- a/t/tasks/netinventory.t +++ b/t/tasks/netinventory.t @@ -17,6 +17,12 @@ use FusionInventory::Agent::Target::Server; use FusionInventory::Agent::HTTP::Client::OCS; use FusionInventory::Agent::XML::Query::Prolog; +use FusionInventory::Agent::Version; +use FusionInventory::Agent::Task::NetInventory::Version; + +our $VERSION = $FusionInventory::Agent::Version::VERSION; +our $TASKVERSION = FusionInventory::Agent::Task::NetInventory::Version::VERSION; + # check thread support availability if (!$Config{usethreads} || $Config{usethreads} ne 'define') { plan skip_all => 'thread support required'; @@ -134,10 +140,10 @@ my %responses = ( - 2.4.1 + '.$VERSION.' 1 - 3.0 + '.$TASKVERSION.' 98030 normal_v2_case @@ -155,7 +161,7 @@ my %responses = ( NETWORKING - 3.0 + '.$TASKVERSION.' 98030 normal_v2_case @@ -168,7 +174,7 @@ my %responses = ( 1 - 3.0 + '.$TASKVERSION.' 98030 normal_v2_case @@ -181,7 +187,7 @@ my %responses = ( 1 - 3.0 + '.$TASKVERSION.' 98030 normal_v2_case @@ -192,10 +198,10 @@ my %responses = ( - 2.4.1 + '.$VERSION.' 1 - 3.0 + '.$TASKVERSION.' 98031 normal_v2_case @@ -215,7 +221,7 @@ my %responses = ( NETWORKING - 3.0 + '.$TASKVERSION.' 98031 normal_v2_case @@ -228,7 +234,7 @@ my %responses = ( 1 - 3.0 + '.$TASKVERSION.' 98031 normal_v2_case @@ -241,7 +247,7 @@ my %responses = ( 1 - 3.0 + '.$TASKVERSION.' 98031 normal_v2_case @@ -274,10 +280,10 @@ my %responses = ( - 2.4.1 + '.$VERSION.' 1 - 3.0 + '.$TASKVERSION.' 98030 error_v2_case @@ -294,7 +300,7 @@ my %responses = ( NETWORKING - 3.0 + '.$TASKVERSION.' 98030 error_v2_case @@ -307,7 +313,7 @@ my %responses = ( 1 - 3.0 + '.$TASKVERSION.' 98030 error_v2_case @@ -320,7 +326,7 @@ my %responses = ( 1 - 3.0 + '.$TASKVERSION.' 98030 error_v2_case @@ -372,7 +378,7 @@ my %responses = ( NETWORKING - 3.0 + '.$TASKVERSION.' 98030 normal_v3_case @@ -392,7 +398,7 @@ my %responses = ( NETWORKING - 3.0 + '.$TASKVERSION.' 98031 normal_v3_case @@ -419,7 +425,7 @@ my %responses = ( - 3.0 + '.$TASKVERSION.' 98032 normal_v3_case @@ -460,7 +466,7 @@ my %responses = ( NETWORKING - 3.0 + '.$TASKVERSION.' 98037 error_v3_case