[Fusioninventory-commit] [fusinv/fusioninventory-agent] a291e4: try to use ssl_opts on LWP<6 too

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


  Branch: refs/heads/2.3.x
  Home:   https://github.com/fusinv/fusioninventory-agent
  Commit: a291e4d5d73c13fc8076211b004e7349cd4bbf7d
      https://github.com/fusinv/fusioninventory-agent/commit/a291e4d5d73c13fc8076211b004e7349cd4bbf7d
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2011-11-28 (Mon, 28 Nov 2011)

  Changed paths:
    M lib/FusionInventory/Agent/Network.pm

  Log Message:
  -----------
  try to use ssl_opts on LWP<6 too

previously this block was only for LWP6. For some modern
LWP5/Crypt::SSLeay also need it, I use an eval here to avoid
failure on ancient LWP::UserAgent with no ssl_opts()

closes: #1161

Reported-by: Remi Collet <fedora at famillecollet.com>


diff --git a/lib/FusionInventory/Agent/Network.pm b/lib/FusionInventory/Agent/Network.pm
index b349de5..6bc6fbf 100644
--- a/lib/FusionInventory/Agent/Network.pm
+++ b/lib/FusionInventory/Agent/Network.pm
@@ -107,8 +107,11 @@ sub createUA {
 
     my $ua = LWP::UserAgent->new(keep_alive => 1, requests_redirectable => ['POST', 'GET', 'HEAD']);
 
-
-    if ($LWP::VERSION >= 6) {
+    # previously this block was only for LWP6.
+    # For some modern LWP5/Crypt::SSLeay also need it, I use
+    # an eval here to avoid failure on ancient LWP::UserAgent with
+    # no ssl_opts()
+    eval {
         # LWP6 default behavior is to check the SSL hostname
         if ($config->{'no-ssl-check'}) {
             $ua->ssl_opts(verify_hostname => 0);
@@ -119,7 +122,7 @@ sub createUA {
         if ($config->{'ca-cert-dir'}) {
             $ua->ssl_opts(SSL_ca_path => $config->{'ca-cert-dir'});
         }
-    }
+    };
 
     if ($noProxy) {
 


================================================================
  Commit: 5001036e8eabac54a5058306c44793df325109a2
      https://github.com/fusinv/fusioninventory-agent/commit/5001036e8eabac54a5058306c44793df325109a2
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2011-11-28 (Mon, 28 Nov 2011)

  Changed paths:
    M lib/FusionInventory/Agent/Network.pm

  Log Message:
  -----------
  improve the regex used to parse the SSL-Cert

 - Drop the port from the hostname
 - Use a wildcare only if there is a domain


diff --git a/lib/FusionInventory/Agent/Network.pm b/lib/FusionInventory/Agent/Network.pm
index 6bc6fbf..96d7513 100644
--- a/lib/FusionInventory/Agent/Network.pm
+++ b/lib/FusionInventory/Agent/Network.pm
@@ -362,9 +362,10 @@ sub setSslRemoteHost {
     # Check server name against provided SSL certificate
         if ( $self->{URI} =~ /^https:\/\/([^\/]+).*$/i ) {
             my $re = $1;
+            $re =~ s/:\d+//;
 # Accept SSL cert will hostname with wild-card
 # http://forge.fusioninventory.org/issues/542
-            $re =~ s/^([^\.]+)/($1|\\*)/;
+            $re =~ s/^([^\.]+)\.(.+)/($1|\\*)/;
 # protect some characters, $re will be evaluated as a regex
             $re =~ s/([\-\.])/\\$1/g;
             $ua->default_header('If-SSL-Cert-Subject' => '/CN='.$re.'($|\/)');


================================================================
  Commit: 8035bde109d9684dac5fd9369ce6a7a641c54f99
      https://github.com/fusinv/fusioninventory-agent/commit/8035bde109d9684dac5fd9369ce6a7a641c54f99
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2011-11-28 (Mon, 28 Nov 2011)

  Changed paths:
    M t/ssl.t

  Log Message:
  -----------
  SSL: skip some test on LWP<6

Those cases are just unsupported.

closes: #1161

Reported-by: Remi Collet <fedora at famillecollet.com>


diff --git a/t/ssl.t b/t/ssl.t
index ff8c25e..d8b384f 100644
--- a/t/ssl.t
+++ b/t/ssl.t
@@ -107,10 +107,14 @@ $server->set_dispatch({
 });
 $server->background();
 
+
+SKIP: {
+skip "Too all LWP for alternate hostname", 1 unless $LWP::VERSION >= 6;
 ok(
     $secure_client->send({message => $message}),
     'trusted certificate, alternate hostname: connection success'
 );
+}
 
 $server->stop();
 
@@ -161,10 +165,14 @@ ok(
     'untrusted certificate, correct hostname: connection failure'
 );
 
+SKIP: {
+skip "Check disabled on LWP<6", 1 unless $LWP::VERSION >= 6;
+# Unless you wan to fix this
 ok(
     $unsafe_client->send({message => $message}),
     'untrusted certificate, correct hostname, no check: connection success'
 );
+}
 
 $server->stop();
 


================================================================
  Commit: d4ecbdd3d67397df4447b38cd0f4fba9c4a81090
      https://github.com/fusinv/fusioninventory-agent/commit/d4ecbdd3d67397df4447b38cd0f4fba9c4a81090
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2011-12-05 (Mon, 05 Dec 2011)

  Changed paths:
    M contrib/Tarballs.pm

  Log Message:
  -----------
  adjust the namespace


diff --git a/contrib/Tarballs.pm b/contrib/Tarballs.pm
index 85bc5e0..acfa5df 100644
--- a/contrib/Tarballs.pm
+++ b/contrib/Tarballs.pm
@@ -2,7 +2,7 @@
 #
 # The complete name of the package
 # the path MUST be valid or the package won't be loaded
-package FusionInventory::Agent::Backend::OS::Generic::Tarballs;
+package FusionInventory::Agent::Task::Inventory::Input::Generic::Tarballs;
 use strict;
 # I need to declare $runAfter because of the strict mode 
 use vars qw($runAfter);


================================================================
  Commit: eb060430483f46a5bd0ee5e7bcae29b4a2839b70
      https://github.com/fusinv/fusioninventory-agent/commit/eb060430483f46a5bd0ee5e7bcae29b4a2839b70
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2011-12-08 (Thu, 08 Dec 2011)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/OS/MacOS/Printers.pm

  Log Message:
  -----------
  Ignore false entries if no printer installed

See: https://bugs.launchpad.net/bugs/901570

Reported-by: Andreas Xenos


diff --git a/lib/FusionInventory/Agent/Task/Inventory/OS/MacOS/Printers.pm b/lib/FusionInventory/Agent/Task/Inventory/OS/MacOS/Printers.pm
index 4abfc3b..93fadf8 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/OS/MacOS/Printers.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/OS/MacOS/Printers.pm
@@ -23,8 +23,15 @@ sub doInventory {
     return(undef) unless(ref($h) eq 'HASH');
 
     foreach my $printer (keys %$h){
-        if ($printer && $printer =~ /^The printers list is empty. To add printers/) {
+        if ($printer && (
+            $printer =~ /list is empty/
+            ||
+            $printer =~ /^Status/
+            ||
+            $printer =~ /^CUPS Version/
+            )            ) {
 #http://forge.fusioninventory.org/issues/169
+#https://bugs.launchpad.net/bugs/901570
                 next;
         }
 


================================================================
  Commit: 13886e40b234826ec771f300b324aa7f02215962
      https://github.com/fusinv/fusioninventory-agent/commit/13886e40b234826ec771f300b324aa7f02215962
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2011-12-08 (Thu, 08 Dec 2011)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Printers.pm
    M t/components/client/ssl.t

  Log Message:
  -----------
  Merge branch '2.1.x' into 2.2.x


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Printers.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Printers.pm
index be7859a..f1649f2 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Printers.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Printers.pm
@@ -24,9 +24,16 @@ sub doInventory {
     return unless ref $info eq 'HASH';
 
     foreach my $printer (keys %$info) {
-        if ($printer && $printer =~ /^The printers list is empty. To add printers/) {
+        if ($printer && (
+            $printer =~ /list is empty/
+            ||
+            $printer =~ /^Status/
+            ||
+            $printer =~ /^CUPS Version/
+            )            ) {
 #http://forge.fusioninventory.org/issues/169
-            next;
+#https://bugs.launchpad.net/bugs/901570
+                next;
         }
 
         $inventory->addEntry(
diff --git a/t/components/client/ssl.t b/t/components/client/ssl.t
index dbddc15..46a0b82 100755
--- a/t/components/client/ssl.t
+++ b/t/components/client/ssl.t
@@ -112,10 +112,14 @@ $server->set_dispatch({
 });
 $server->background();
 
+
+SKIP: {
+skip "Too all LWP for alternate hostname", 1 unless $LWP::VERSION >= 6;
 ok(
     $secure_client->request(HTTP::Request->new(GET => $url))->is_success(),
     'trusted certificate, alternate hostname: connection success'
 );
+}
 
 $server->stop();
 
@@ -195,9 +199,13 @@ ok(
     'untrusted certificate, correct hostname: connection failure'
 );
 
+SKIP: {
+skip "Check disabled on LWP<6", 1 unless $LWP::VERSION >= 6;
+# Unless you wan to fix this
 ok(
     $unsafe_client->request(HTTP::Request->new(GET => $url))->is_success(),
     'untrusted certificate, correct hostname, no check: connection success'
 );
+}
 
 $server->stop();


================================================================
  Commit: 7ede8d4b9720d8a67d541ceeab571cca3eec06dc
      https://github.com/fusinv/fusioninventory-agent/commit/7ede8d4b9720d8a67d541ceeab571cca3eec06dc
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2011-12-09 (Fri, 09 Dec 2011)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/OS/Win32/CPU.pm

  Log Message:
  -----------
  reverse the last changes on CPU.pm

These changes were wrongly assuming dmidecode was used to collect
the CPU like in the 2.2.x branch.

Reported-by: Anthony Facchin <anthony.facchin at shiseido-sif.eu>


diff --git a/lib/FusionInventory/Agent/Task/Inventory/OS/Win32/CPU.pm b/lib/FusionInventory/Agent/Task/Inventory/OS/Win32/CPU.pm
index b35c437..880b3d2 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/OS/Win32/CPU.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/OS/Win32/CPU.pm
@@ -13,8 +13,6 @@ use Win32::TieRegistry (
     qw/KEY_READ/
 );
 
-our $runMeIfTheseChecksFailed = ["FusionInventory::Agent::Task::Inventory::OS::Generic::Dmidecode"];
-
 use FusionInventory::Agent::Task::Inventory::OS::Win32;
 use FusionInventory::Agent::Tools;
 
@@ -58,10 +56,7 @@ sub doInventory {
 
     my $vmsystem;
 
-# http://forge.fusioninventory.org/issues/379
-    my(@osver) = Win32::GetOSVersion();
-    my $isWin2003 = ($osver[4] == 2 && $osver[1] == 5 && $osver[2] == 2);
-
+    my $dmidecodeCpu = getCpusFromDmidecode();
 
     my $cpuId = 0;
     foreach my $Properties (getWmiProperties('Win32_Processor', qw/
@@ -70,20 +65,14 @@ sub doInventory {
 
         my $info = getCPUInfoFromRegistry($logger, $cpuId);
 
+#        my $cache = $Properties->{L2CacheSize}+$Properties->{L3CacheSize};
         my $core = $Properties->{NumberOfCores};
         my $description = $info->{Identifier};
         my $name = $info->{ProcessorNameString};
         my $manufacturer = $info->{VendorIdentifier};
-        my $id = $Properties->{ProcessorId};
-        my $speed = $Properties->{MaxClockSpeed};
-
-        # Some information are missing on Win2000
-        if (!$name) {
-            $name = $ENV{PROCESSOR_IDENTIFIER};
-            if ($name =~ s/,\s(\S+)$//) {
-                $manufacturer = $1;
-            }
-        }
+        my $id = $dmidecodeCpu->[$cpuId]->{ID} || $Properties->{ProcessorId};
+        my $serial = $dmidecodeCpu->[$cpuId]->{SERIAL};
+        my $speed = $dmidecodeCpu->[$cpuId]->{SPEED} || $Properties->{MaxClockSpeed};
 
         if ($manufacturer) {
             $manufacturer =~ s/Genuine//;
@@ -118,7 +107,7 @@ sub doInventory {
             MANUFACTURER => $manufacturer,
             SERIAL => $serial,
             SPEED => $speed,
-            ID => $id
+	    ID => $id
         });
 
         $cpuId++;


================================================================
  Commit: 8fc93566e1ff551682987f11d0af46a06108cf5e
      https://github.com/fusinv/fusioninventory-agent/commit/8fc93566e1ff551682987f11d0af46a06108cf5e
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2011-12-12 (Mon, 12 Dec 2011)

  Changed paths:
    M README

  Log Message:
  -----------
  document ssl issues with sha256


diff --git a/README b/README
index 7d85e08..754f87c 100644
--- a/README
+++ b/README
@@ -36,6 +36,26 @@ immediatly if IO::Socket::SSL is not available, unless certificate checking has
 been explicitely disabled (--no-ssl-check command line parameter, or
 no-ssl-check configuration parameter).
 
+The SSL protocol version supported by the agent is dependant of openssl
+version. In particular, usage of specific certificate signature algorithms such
+as SHA requires at least openssl 0.9.8o, as it is supposed to be allowed
+starting from TLS 1.1 only. Failure to comply will result in error message such
+as:
+warning: TLS library problem: 14710:error:0D0C50A1:asn1 encoding
+routines:ASN1_item_verify:unknown message digest algorithm:a_verify.c:146:
+
+This can be controlled in the certificate itself:
+[guillaume at beria ~]$ openssl x509 -noout -text -in cert.pem | grep Signature
+Signature Algorithm: sha256WithRSAEncryption
+Signature Algorithm: sha256WithRSAEncryption
+
+The available workaround:
+- ensure server certificate complies with clients capacities, using controlled
+  certificate generation parameters
+- ensure clients capacities matches server certificate properties, upgrading
+  openssl and its perl bindings (Net::SSLeay)
+- disable server certificate checking on client
+
 System-specific informations
 ----------------------------
 


================================================================
  Commit: 8695a9d4da58179c6295744f6eeffeb3105e4944
      https://github.com/fusinv/fusioninventory-agent/commit/8695a9d4da58179c6295744f6eeffeb3105e4944
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2011-12-12 (Mon, 12 Dec 2011)

  Changed paths:
    M t/ssl.t

  Log Message:
  -----------
  ignore the test if IO::Socket::SSL is not installed

https://rt.cpan.org/Ticket/Display.html?id=73164


diff --git a/t/ssl.t b/t/ssl.t
index d8b384f..1395526 100644
--- a/t/ssl.t
+++ b/t/ssl.t
@@ -10,11 +10,16 @@ use Socket;
 use Test::More;
 use Test::Exception;
 
+use UNIVERSAL::require;
 use FusionInventory::Agent::Network;
 use FusionInventory::Agent::XML::Query::SimpleMessage;
-use FusionInventory::Test::Server;
 use FusionInventory::Logger;
 
+if (!IO::Socket::SSL->require()) {
+    plan skip_all => "IO::Socket::SSL required to run this test";
+}
+FusionInventory::Test::Server->require();
+
 if ($OSNAME eq 'MSWin32' || $OSNAME eq 'darwin') {
     plan skip_all => 'non working test on Windows and MacOS';
 } else {
@@ -46,6 +51,7 @@ my $message = FusionInventory::Agent::XML::Query::SimpleMessage->new({
         foo => 'bar'
     }
 });
+
 my $unsafe_client = FusionInventory::Agent::Network->new({
     logger       => $logger,
     target       => {
@@ -89,7 +95,6 @@ ok(
     $secure_client->send({message => $message}),
     'trusted certificate, correct hostname: connection success'
 );
-
 $server->stop();
 
 # trusted certificate, alternate hostname


================================================================
  Commit: 4007addf0f593f6aa3bf675f0cc2824d2d8f4805
      https://github.com/fusinv/fusioninventory-agent/commit/4007addf0f593f6aa3bf675f0cc2824d2d8f4805
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2011-12-12 (Mon, 12 Dec 2011)

  Changed paths:
    M t/components/client/ssl.t
    A t/ssl/cnf/good-sha256.cnf
    R t/ssl/crt/ca-rulezlan.pem
    M t/ssl/crt/good-sha256.pem
    R t/ssl/key/ca-rulezlan.pem
    M t/ssl/key/good-sha256.pem

  Log Message:
  -----------
  no need to use two different CA


diff --git a/t/components/client/ssl.t b/t/components/client/ssl.t
index 46a0b82..62ea6bc 100755
--- a/t/components/client/ssl.t
+++ b/t/components/client/ssl.t
@@ -47,7 +47,7 @@ my $secure_client = FusionInventory::Agent::HTTP::Client->new(
 
 my $secure_sha256_client = FusionInventory::Agent::HTTP::Client->new(
     logger       => $logger,
-    ca_cert_file => 't/ssl/crt/ca-rulezlan.pem',
+    ca_cert_file => 't/ssl/crt/ca.pem',
 );
 
 # ensure the server get stopped even if an exception is thrown
diff --git a/t/ssl/cnf/good-sha256.cnf b/t/ssl/cnf/good-sha256.cnf
new file mode 100644
index 0000000..c5d90dc
--- /dev/null
+++ b/t/ssl/cnf/good-sha256.cnf
@@ -0,0 +1,17 @@
+[ req ]
+default_bits       = 2048
+default_md         = sha256
+encrypt_key        = no
+distinguished_name = req_dn
+req_extensions     = req_ext
+prompt             = no
+
+[ req_dn ]
+organizationName       = fusioninventory.org
+organizationalUnitName = trusted test certificate
+commonName             = localhost
+emailAddress           = test at fusioninventory.org
+
+[ req_ext ]
+basicConstraints     = CA:false
+subjectKeyIdentifier = hash
diff --git a/t/ssl/crt/ca-rulezlan.pem b/t/ssl/crt/ca-rulezlan.pem
deleted file mode 100644
index 8692d34..0000000
--- a/t/ssl/crt/ca-rulezlan.pem
+++ /dev/null
@@ -1,35 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIGIzCCBAugAwIBAgIJAINRP0U9bGFsMA0GCSqGSIb3DQEBCwUAMIHHMS4wLAYD
-VQQDEyVSdWxlemxhbiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcxMRAwDgYD
-VQQHEwdBcnJhZG9uMREwDwYDVQQIEwhCcmV0YWduZTELMAkGA1UEBhMCRlIxIjAg
-BgkqhkiG9w0BCQEWE2dvbmVyaUBydWxlemxhbi5vcmcxETAPBgNVBAoTCExhbmFm
-cmFnMSwwKgYDVQQLEyNEZXBhcnRtZW50IG9mIENvbXB1dGF0aW9uYWwgU2NpZW5j
-ZTAeFw0xMTExMjkyMTU4NTdaFw0zMTExMjQyMTU4NTdaMIHHMS4wLAYDVQQDEyVS
-dWxlemxhbiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcxMRAwDgYDVQQHEwdB
-cnJhZG9uMREwDwYDVQQIEwhCcmV0YWduZTELMAkGA1UEBhMCRlIxIjAgBgkqhkiG
-9w0BCQEWE2dvbmVyaUBydWxlemxhbi5vcmcxETAPBgNVBAoTCExhbmFmcmFnMSww
-KgYDVQQLEyNEZXBhcnRtZW50IG9mIENvbXB1dGF0aW9uYWwgU2NpZW5jZTCCAiIw
-DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK/B3StGdjU73qo9QZ4wVtFaRrPI
-tU3B16Zrz8KGY/bc5PSIi83xLzGGcz3g3W2mAI8THZHfD6qHQKkVhLR4OS10eV5Q
-knvKjN7+bFp5mUMCbCoZ9GFw6J0SdilrbYudiHLV7Y24Co9kt8ziETMFe9Xd8m+i
-Qmpz0nslGg6n4y1Z4e69SXeh/94Bg22e5htsJ3sGENIk/bQMb4h/5tvufLDmpyU1
-GvLwYWlGTPF43u0+mBdjT2cW5Dw5rXidM1jbIV1Sl+9eJ5rsL9uH31sO5mCabESS
-iRdu1zf3/ASscgxhSW23hPiDoBsLUF17n7eDOxGCnwdfwE+YRHaH7kenQbCpbFuf
-Xo8anFH7k7wLiptaMl4SVGRhyUObTILoOKji7tBkUDC4EvSuHl96A15xbXPTDucM
-PaCRZXRWFPajSNgq8X49HHsURbTRLvOeFSQQ12BhRyzb9XXpYqc4OVsPa+KMuvkm
-N4gXSWlWyQRnd0hTpOZcdTAuIQzTcdfqHiULX2Q2TjFVCTmdnjQuFq+5ar3c+DUp
-CqKs5+hYE1x0KPIsyrrBufHysE7rVxFPIFxmNVyrNTGeDJGSHDEV2dnpT/LmVo96
-my1LGg1FgLw94Odf1C47FPrDeKlWoYzDRZ2nInpMN6rlpue1bZKV49e3+5MLhP63
-Z/YuPQgxy9yOuv1bAgMBAAGjEDAOMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEL
-BQADggIBAHnERCw+gL7dzIaaoRXE0tvVP+asmSzVgwJ0iZPOu7jd8WvQhIA+AgEY
-7RuM7Hhdd3JYiNRIXJykbFlLbI9bLwjNtxYQuAxgKbWVGCBnRb0iwlQ8nuVtGqCE
-K3uFCTXWtKQpPbtLQYHDH98dREklw/am5eH5O/eOFwHAEVyBfYRD30yKzTk3CMqF
-G8A0O+M9KIkJqG1rF0CXB3tUUlcTql/22ZLgO7kHt68nnB/N+EVUJv8mfepNQkiO
-gcSe60lJNLKpgkPkDV15MbA5c+UH1Udptf/JEFwRNQG4q/I8IId8gmiaLiTv0Q1m
-ErQzQbhGuQHUN2ACMWnajg1IHvn3cu9Onc3AOiI9nfHBMzeATH7IxGKJjTZaCZyo
-hCqFStW5C1jIR07ZrtE0oxFSHD4UNXTeYGNtb6yPKicqx3gzd4A5/KMUbbhMB6G7
-EmaPK9ssOsIqPCpgO/OLfQcT7ovAvnvYaJbRNR2u60FnctA8f4Mzisk1biG/slCN
-60oWrxgqRe/G0mWj6fkFt7Jl4t6BCTlVe7hT34xvyKuT2j2iyZdf669zT90HF2XN
-g/c3LYPCzICtrckc85Z/7lhh0kktni0Zkbg9CmsUmZk4ntiDnt9eaKEFsCF9HLNy
-AlJPXgFb7zMrtRupqjA3Tv4owmuzAa0WrD7Ofjylz/E6rp/9Stbf
------END CERTIFICATE-----
diff --git a/t/ssl/crt/good-sha256.pem b/t/ssl/crt/good-sha256.pem
index c128a6f..c27a0c0 100644
--- a/t/ssl/crt/good-sha256.pem
+++ b/t/ssl/crt/good-sha256.pem
@@ -1,117 +1,70 @@
 Certificate:
     Data:
-        Version: 3 (0x2)
-        Serial Number: 2 (0x2)
+        Version: 1 (0x0)
+        Serial Number: 7 (0x7)
         Signature Algorithm: sha256WithRSAEncryption
-        Issuer: CN=Rulezlan Certification Authority - G1, L=Arradon, ST=Bretagne, C=FR/emailAddress=goneri at rulezlan.org, O=Lanafrag, OU=Department of Computational Science
+        Issuer: O=fusioninventory.org, OU=test certification authority, CN=test_ca/emailAddress=test at fusioninventory.org
         Validity
-            Not Before: Dec  2 15:23:20 2011 GMT
-            Not After : Dec  1 15:23:20 2013 GMT
-        Subject: CN=localhost, L=Arradon, ST=Bretagne, C=FR/emailAddress=goneri at rulezlan.org, O=Lanafrag, OU=Department of Computational Science
+            Not Before: Dec 12 18:55:04 2011 GMT
+            Not After : Dec 11 18:55:04 2013 GMT
+        Subject: O=fusioninventory.org, OU=trusted test certificate, CN=localhost/emailAddress=test at fusioninventory.org
         Subject Public Key Info:
             Public Key Algorithm: rsaEncryption
-            RSA Public Key: (4096 bit)
-                Modulus (4096 bit):
-                    00:cf:8e:f5:b2:04:77:8e:17:5e:31:b8:2f:08:37:
-                    40:de:3b:a0:eb:ce:bb:c9:3b:5c:55:2b:0f:c4:a1:
-                    10:4a:44:45:f8:30:42:88:76:9e:af:2c:45:cb:5e:
-                    1c:d9:4b:fa:c4:15:9e:26:ab:89:f1:91:9d:ff:74:
-                    4f:4c:9a:4e:0f:20:e0:db:01:0b:aa:85:78:1e:54:
-                    e4:61:01:06:76:b3:b7:e3:bc:5d:17:d3:69:05:bf:
-                    b2:2a:23:52:de:7e:40:90:9a:1c:5e:d3:54:b3:1e:
-                    ba:fc:1c:78:a5:51:c3:4c:c5:ed:d4:ae:25:ac:4a:
-                    87:20:96:e5:b7:8f:47:3c:ee:71:bf:3a:33:19:1d:
-                    9c:c1:cc:29:9f:9e:8f:7a:50:18:90:20:a9:70:eb:
-                    02:d6:6a:4b:f5:62:db:e8:4d:b2:87:51:c5:29:c3:
-                    b5:e2:81:bd:17:8d:f3:fb:8b:11:4e:c1:c9:46:3a:
-                    4d:c4:90:25:eb:0a:02:ea:a3:ec:86:6f:bf:cc:09:
-                    32:2b:f3:77:e3:c1:02:38:c7:28:14:86:7e:ae:90:
-                    83:37:ea:04:43:89:34:57:9d:f9:4d:bf:53:2a:ef:
-                    84:35:4d:20:44:8c:96:6b:91:97:d7:2d:9a:02:7c:
-                    b9:6a:52:8e:5a:34:bf:ba:b9:07:34:9d:72:8b:05:
-                    96:93:ca:c7:0b:5c:85:5a:c4:7a:21:a4:8d:fa:a9:
-                    e4:26:64:be:e8:b4:c4:cc:06:6c:0f:0c:89:5d:fc:
-                    4e:fa:99:9a:0d:cd:65:7b:43:31:cf:52:67:11:48:
-                    e8:8b:32:0f:1a:f7:ee:ec:5c:d3:18:f0:3b:e8:ff:
-                    f4:d7:0a:ca:b5:64:a6:91:4c:c8:e9:9b:45:cc:ff:
-                    0b:94:32:a5:49:9a:ba:52:95:82:05:82:d7:05:74:
-                    c9:23:72:ed:b1:77:72:82:50:bc:76:94:51:b0:59:
-                    33:36:36:4e:0a:a2:2b:e7:4c:ba:b8:52:30:ae:9a:
-                    79:74:de:45:34:ee:ec:21:c9:9f:fd:d1:36:5b:3d:
-                    04:c3:38:04:06:b5:6a:88:5f:18:40:e3:7c:75:06:
-                    4d:60:0d:78:8a:75:9e:9a:18:26:5d:50:c5:60:43:
-                    a5:bd:f5:44:2d:64:a5:0b:29:a1:17:c9:26:4b:12:
-                    cd:c4:03:a8:d8:68:e4:7a:6a:4f:a0:d1:61:25:f5:
-                    4b:19:ea:a6:03:7a:55:f1:61:40:39:8c:d5:37:0e:
-                    0e:3b:c6:8b:91:d2:d8:ea:3f:10:d5:66:cc:7d:e7:
-                    7a:7a:3a:1e:37:29:01:0f:cc:13:a2:b1:0a:dc:11:
-                    90:52:6f:57:27:83:16:37:f5:c9:23:bc:d9:35:a4:
-                    00:00:2d
+                Public-Key: (2048 bit)
+                Modulus:
+                    00:b6:fb:e5:c7:2d:1a:28:a6:f2:94:c1:be:ac:f7:
+                    a5:2f:63:e5:b0:db:58:3f:b7:b9:5b:4c:4d:5b:8e:
+                    23:8a:b6:71:98:c1:fc:11:0b:6b:58:3e:81:a8:d0:
+                    8d:89:ce:2f:6c:ff:8d:6c:04:b7:b8:ad:cf:b5:a4:
+                    71:05:58:bc:9c:01:a5:13:36:06:29:d3:84:61:c1:
+                    75:34:6e:fe:64:8d:67:83:31:61:05:06:00:c6:b6:
+                    a0:67:11:85:dc:43:86:f0:61:c6:cc:c4:28:24:34:
+                    5b:d4:ac:23:da:35:e2:11:fe:a4:ff:84:17:8c:5a:
+                    29:28:7d:44:44:dc:72:08:4b:16:79:a1:8c:8e:24:
+                    cc:dc:c4:cb:de:43:97:ac:47:b4:64:46:3c:2d:f9:
+                    41:dc:14:96:54:27:c5:f5:ee:9f:29:d9:c1:3a:5c:
+                    41:99:64:b9:72:4f:b2:7a:aa:65:3f:06:3c:dd:06:
+                    67:06:ca:33:7a:63:8c:fc:d1:9f:55:58:8b:88:36:
+                    ff:4b:95:21:cf:1e:b0:88:b6:0a:1f:29:1f:d1:90:
+                    e4:0e:5c:6e:45:d6:2e:c3:37:a9:a5:cb:15:01:51:
+                    3a:57:44:f3:b5:10:7e:99:4d:87:d2:3a:44:1a:83:
+                    53:9e:57:c5:03:11:a2:9e:3a:72:d5:41:4b:85:55:
+                    25:17
                 Exponent: 65537 (0x10001)
-        X509v3 extensions:
-            X509v3 Basic Constraints: 
-                CA:FALSE
     Signature Algorithm: sha256WithRSAEncryption
-        18:50:f9:86:78:13:e6:3f:3a:b2:97:e0:2e:e0:cb:3e:87:88:
-        0b:d4:a5:ed:70:e0:8a:bf:ee:04:47:54:47:97:c5:09:f4:da:
-        a5:d2:f7:ed:7e:e5:61:be:ff:17:41:f3:87:66:d9:46:de:28:
-        cf:64:46:34:0d:d0:55:ef:14:98:9f:8d:d6:03:78:0c:e6:a9:
-        e9:10:f9:af:0c:4c:ec:d1:09:4d:93:16:7f:8e:de:66:5e:ee:
-        bb:c9:fa:a0:32:0f:2d:82:32:1e:56:a6:e9:b8:b9:9a:12:3b:
-        eb:9c:be:c7:5e:ca:00:78:fc:83:b9:f6:af:0f:34:3a:23:01:
-        12:ad:67:f1:23:93:62:30:c4:05:c4:d9:2a:b5:78:aa:c1:1f:
-        0c:d7:5c:95:e6:ba:e2:5c:ba:b1:a7:d2:9e:81:6e:ea:2a:0e:
-        4d:5c:dd:91:0d:de:5f:95:00:ab:9c:4e:83:9f:03:39:db:f8:
-        65:f8:b6:f3:69:cb:68:49:48:76:c3:8d:ef:db:cd:98:f4:d1:
-        56:b4:57:c9:aa:30:ea:97:f2:a4:af:35:b9:32:86:e9:fe:07:
-        28:50:ff:dd:43:ca:6a:3d:4f:d0:92:80:87:b8:56:e0:88:76:
-        7c:1a:00:60:32:91:4b:76:4a:82:ff:40:c8:25:45:74:96:27:
-        4a:21:4a:f2:29:12:43:2e:33:49:fa:59:87:55:10:56:5b:12:
-        09:9c:20:d9:dd:d3:db:17:23:db:c2:2e:47:fb:e8:6e:1c:8b:
-        5f:d2:d6:5b:9e:5d:2f:5d:dc:e9:27:3d:fd:da:47:12:9f:c0:
-        f2:85:9b:ca:78:48:63:ca:42:27:80:00:8e:c6:2c:8f:1d:09:
-        08:56:58:8c:82:3b:83:c6:ee:13:cd:a7:62:3b:02:3d:37:8c:
-        da:55:ae:88:d9:e2:41:ba:06:52:48:ac:42:e9:5e:83:26:fb:
-        be:79:29:57:b3:d1:07:c7:ea:a5:bb:6b:e6:06:40:f3:1f:ab:
-        c8:28:65:fa:2d:e8:52:7a:3a:65:b0:3a:e3:dc:85:d2:fc:a6:
-        39:a7:67:ec:60:a4:8d:4c:03:1e:ed:05:3b:f1:9d:f1:5a:82:
-        cf:4b:70:96:67:e7:f7:a9:b2:3f:46:4b:1d:f8:46:4a:6b:03:
-        bb:b5:0f:9e:59:d7:9f:9b:b6:6a:98:15:8c:97:46:c6:9c:a8:
-        09:4d:87:c1:45:74:05:18:ef:1d:ce:84:7c:23:b8:f7:f2:5e:
-        96:22:6d:cd:97:82:34:15:40:e7:be:79:5c:f2:24:4e:5b:b1:
-        22:1b:1e:1b:a2:54:03:ba:6d:58:5f:d5:68:6c:35:3f:98:2b:
-        49:96:85:99:cb:07:cc:a5
+        11:37:b8:2b:61:c2:e0:e6:76:23:d6:9f:8d:61:5d:6d:d8:1f:
+        73:d8:40:7c:25:25:e7:3e:1f:3d:04:e5:61:f5:6b:fe:c4:af:
+        cc:8d:55:b2:73:4c:66:89:25:29:c1:44:d2:3c:2c:96:7a:d4:
+        05:ee:ff:32:ca:a6:16:ee:9f:70:b7:d1:08:0d:8f:1e:71:7c:
+        a6:0e:3d:dc:5a:08:8e:28:64:3f:4c:b2:e1:cd:5d:96:3d:ae:
+        28:df:56:bc:a6:ce:1f:e7:d6:ef:ff:41:b3:8e:1e:1e:76:bb:
+        e7:7e:12:f8:93:35:1a:93:41:cb:81:32:6a:d0:2c:87:b6:24:
+        f8:b8:c2:a6:4d:0c:b2:f7:34:ec:9a:67:13:0b:4a:2a:12:bb:
+        c2:d3:62:14:20:08:46:bf:da:68:5d:bf:4d:fb:19:f5:1e:ea:
+        b0:a3:12:41:98:f2:f1:b5:f2:30:1b:17:9d:37:af:c2:83:08:
+        9d:14:ef:7f:28:a0:f0:8f:ab:d7:02:bf:d7:2b:ab:7c:17:10:
+        28:79:4e:98:01:d4:a1:bf:cf:cc:2e:84:66:74:10:23:1e:d7:
+        31:83:11:21:96:37:76:46:04:95:1c:4c:b2:35:b0:ca:87:52:
+        1d:72:fd:6c:4c:72:51:a9:fb:13:fb:69:87:55:be:6b:2e:fd:
+        bc:0c:2c:69
 -----BEGIN CERTIFICATE-----
-MIIF/DCCA+SgAwIBAgIBAjANBgkqhkiG9w0BAQsFADCBxzEuMCwGA1UEAxMlUnVs
-ZXpsYW4gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMTEQMA4GA1UEBxMHQXJy
-YWRvbjERMA8GA1UECBMIQnJldGFnbmUxCzAJBgNVBAYTAkZSMSIwIAYJKoZIhvcN
-AQkBFhNnb25lcmlAcnVsZXpsYW4ub3JnMREwDwYDVQQKEwhMYW5hZnJhZzEsMCoG
-A1UECxMjRGVwYXJ0bWVudCBvZiBDb21wdXRhdGlvbmFsIFNjaWVuY2UwHhcNMTEx
-MjAyMTUyMzIwWhcNMTMxMjAxMTUyMzIwWjCBqzESMBAGA1UEAxMJbG9jYWxob3N0
-MRAwDgYDVQQHEwdBcnJhZG9uMREwDwYDVQQIEwhCcmV0YWduZTELMAkGA1UEBhMC
-RlIxIjAgBgkqhkiG9w0BCQEWE2dvbmVyaUBydWxlemxhbi5vcmcxETAPBgNVBAoT
-CExhbmFmcmFnMSwwKgYDVQQLEyNEZXBhcnRtZW50IG9mIENvbXB1dGF0aW9uYWwg
-U2NpZW5jZTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAM+O9bIEd44X
-XjG4Lwg3QN47oOvOu8k7XFUrD8ShEEpERfgwQoh2nq8sRcteHNlL+sQVniarifGR
-nf90T0yaTg8g4NsBC6qFeB5U5GEBBnazt+O8XRfTaQW/siojUt5+QJCaHF7TVLMe
-uvwceKVRw0zF7dSuJaxKhyCW5bePRzzucb86MxkdnMHMKZ+ej3pQGJAgqXDrAtZq
-S/Vi2+hNsodRxSnDteKBvReN8/uLEU7ByUY6TcSQJesKAuqj7IZvv8wJMivzd+PB
-AjjHKBSGfq6QgzfqBEOJNFed+U2/UyrvhDVNIESMlmuRl9ctmgJ8uWpSjlo0v7q5
-BzSdcosFlpPKxwtchVrEeiGkjfqp5CZkvui0xMwGbA8MiV38TvqZmg3NZXtDMc9S
-ZxFI6IsyDxr37uxc0xjwO+j/9NcKyrVkppFMyOmbRcz/C5QypUmaulKVggWC1wV0
-ySNy7bF3coJQvHaUUbBZMzY2TgqiK+dMurhSMK6aeXTeRTTu7CHJn/3RNls9BMM4
-BAa1aohfGEDjfHUGTWANeIp1npoYJl1QxWBDpb31RC1kpQspoRfJJksSzcQDqNho
-5HpqT6DRYSX1SxnqpgN6VfFhQDmM1TcODjvGi5HS2Oo/ENVmzH3neno6HjcpAQ/M
-E6KxCtwRkFJvVyeDFjf1ySO82TWkAAAtAgMBAAGjDTALMAkGA1UdEwQCMAAwDQYJ
-KoZIhvcNAQELBQADggIBABhQ+YZ4E+Y/OrKX4C7gyz6HiAvUpe1w4Iq/7gRHVEeX
-xQn02qXS9+1+5WG+/xdB84dm2UbeKM9kRjQN0FXvFJifjdYDeAzmqekQ+a8MTOzR
-CU2TFn+O3mZe7rvJ+qAyDy2CMh5Wpum4uZoSO+ucvsdeygB4/IO59q8PNDojARKt
-Z/Ejk2IwxAXE2Sq1eKrBHwzXXJXmuuJcurGn0p6BbuoqDk1c3ZEN3l+VAKucToOf
-Aznb+GX4tvNpy2hJSHbDje/bzZj00Va0V8mqMOqX8qSvNbkyhun+ByhQ/91Dymo9
-T9CSgIe4VuCIdnwaAGAykUt2SoL/QMglRXSWJ0ohSvIpEkMuM0n6WYdVEFZbEgmc
-INnd09sXI9vCLkf76G4ci1/S1lueXS9d3OknPf3aRxKfwPKFm8p4SGPKQieAAI7G
-LI8dCQhWWIyCO4PG7hPNp2I7Aj03jNpVrojZ4kG6BlJIrELpXoMm+755KVez0QfH
-6qW7a+YGQPMfq8goZfot6FJ6OmWwOuPchdL8pjmnZ+xgpI1MAx7tBTvxnfFags9L
-cJZn5/epsj9GSx34RkprA7u1D55Z15+btmqYFYyXRsacqAlNh8FFdAUY7x3OhHwj
-uPfyXpYibc2XgjQVQOe+eVzyJE5bsSIbHhuiVAO6bVhf1WhsNT+YK0mWhZnLB8yl
+MIIDczCCAlsCAQcwDQYJKoZIhvcNAQELBQAwgYAxHDAaBgNVBAoTE2Z1c2lvbmlu
+dmVudG9yeS5vcmcxJTAjBgNVBAsTHHRlc3QgY2VydGlmaWNhdGlvbiBhdXRob3Jp
+dHkxEDAOBgNVBAMUB3Rlc3RfY2ExJzAlBgkqhkiG9w0BCQEWGHRlc3RAZnVzaW9u
+aW52ZW50b3J5Lm9yZzAeFw0xMTEyMTIxODU1MDRaFw0xMzEyMTExODU1MDRaMH4x
+HDAaBgNVBAoTE2Z1c2lvbmludmVudG9yeS5vcmcxITAfBgNVBAsTGHRydXN0ZWQg
+dGVzdCBjZXJ0aWZpY2F0ZTESMBAGA1UEAxMJbG9jYWxob3N0MScwJQYJKoZIhvcN
+AQkBFhh0ZXN0QGZ1c2lvbmludmVudG9yeS5vcmcwggEiMA0GCSqGSIb3DQEBAQUA
+A4IBDwAwggEKAoIBAQC2++XHLRoopvKUwb6s96UvY+Ww21g/t7lbTE1bjiOKtnGY
+wfwRC2tYPoGo0I2Jzi9s/41sBLe4rc+1pHEFWLycAaUTNgYp04RhwXU0bv5kjWeD
+MWEFBgDGtqBnEYXcQ4bwYcbMxCgkNFvUrCPaNeIR/qT/hBeMWikofURE3HIISxZ5
+oYyOJMzcxMveQ5esR7RkRjwt+UHcFJZUJ8X17p8p2cE6XEGZZLlyT7J6qmU/Bjzd
+BmcGyjN6Y4z80Z9VWIuINv9LlSHPHrCItgofKR/RkOQOXG5F1i7DN6mlyxUBUTpX
+RPO1EH6ZTYfSOkQag1OeV8UDEaKeOnLVQUuFVSUXAgMBAAEwDQYJKoZIhvcNAQEL
+BQADggEBABE3uCthwuDmdiPWn41hXW3YH3PYQHwlJec+Hz0E5WH1a/7Er8yNVbJz
+TGaJJSnBRNI8LJZ61AXu/zLKphbun3C30QgNjx5xfKYOPdxaCI4oZD9MsuHNXZY9
+rijfVrymzh/n1u//QbOOHh52u+d+EviTNRqTQcuBMmrQLIe2JPi4wqZNDLL3NOya
+ZxMLSioSu8LTYhQgCEa/2mhdv037GfUe6rCjEkGY8vG18jAbF503r8KDCJ0U738o
+oPCPq9cCv9crq3wXECh5TpgB1KG/z8wuhGZ0ECMe1zGDESGWN3ZGBJUcTLI1sMqH
+Uh1y/WxMclGp+xP7aYdVvmsu/bwMLGk=
 -----END CERTIFICATE-----
diff --git a/t/ssl/key/ca-rulezlan.pem b/t/ssl/key/ca-rulezlan.pem
deleted file mode 100644
index 7089dd3..0000000
--- a/t/ssl/key/ca-rulezlan.pem
+++ /dev/null
@@ -1,54 +0,0 @@
------BEGIN RSA PRIVATE KEY-----
-Proc-Type: 4,ENCRYPTED
-DEK-Info: DES-EDE3-CBC,763FADE98194F731
-
-82jO0Mx5ffxKd4h7cuMCegx/GHVwKC3TcaqGyh+Xk/nqIB6af33gpRKG3BPzwQNj
-QJUlN3LQ1BgeN0Pfg1UY3hyXBnM8PYJL3XECCj5nCd9FGU3JfZPel7ufCuDoerCd
-KBSsEmAn2watdFaFNLyHxMiy5Mxxl1MdiH596eSrrzVQRtPLgEQVTZYZDnAHQXjN
-lluLmq6BTEfw01C2/rx73tOVA3AkKvE465jhHKx5PSEyoDSKkuvAn8yKOFVabCSF
-mCGANkK9JfgzQyp6Z/CryhQHLndaoUuITjRPBIxFmlh0LQv76xz55naF9+2p+353
-14s+mkfoR3cCCkh9ajMqCcMFVshMpQmJxSyAvw2ZdmkoIlLENBxvGISDKFokojp6
-5ElKfUvDORgiWcMixp6uW218v7OCRyCfIsEoiOoc6liTqPuVt4uIgnH9QqE4gQwA
-vIRlxbV65OO9CF5xkjC6UjVUrFJOsLZwts3V76a3o1sTj10DqAdq78+b9qo5Kl4H
-g9mHFPEYwCz3eXkCv4APb3nANlv7qLaaUREg7DhOw8armAWB/KN5WmBbdWJ1oaSS
-Xflr4jk3RtMyJJcuZosBxDmN0dpEZAQGbqg4CFuDw6qcq9Fj4i1lWvG1M9IHE4YA
-sMsZPZ7Mhx90qak2+o4RSZzH+C0vcgcdGh3zdTZbs2JcFVcX9rbBsXR2TH9sQSug
-UafXKNrb/MpBNME5+Cgr6epWfmywcvym79dM46O+ZI1mDwBUrMpCB/KDk62FzIUp
-EZI9s46S1vUB8/kHWgYjEVEkHV+WqeomHwZisAa0fj9kFtkzbZ60mSAd6/oQLlfT
-SXU7J0LclvezEaksw0DU2mINmbStyF9AFlC5ii+s+dHm+VCn/LjgFkrs3U7AkIXZ
-cLSHGAYRDC9dfwp912szm0YSXj60k1eeT1au4RIWPVi2DwBv+lPNNmnyR4+NhqU6
-VjPBvXrevjT51rutI1B7OgiTacMQDQ+V8viBkIxkXXFLVNqWFo49CmHoS1awJ6Ja
-YLBpFTZ/0TdMihsXhWGH0yc9f5w5TmNNUzlojXWQ9YBvcCe0+4xWSDYb5Au5+lVK
-pkzFHj5ROi/0E2pFS4QYx0z2evVqloVrM5lFnEaQ3f5zo+Xa5OQRG4TsBDae+OKV
-9QehUssRugVHCyjxSohrsVWUqYFHR6pYQOFvFOpp7p+hIKC04q0f1UnGoiWlK17O
-WYr0u71EJvVSBhou9BdaQ1RXdvXxFtyWamxtav0Z2EJGRkNdPDww43kANpWLh65F
-q9uDxRW2rzNPeagUPPpWCvZnOQrdqkdIBtyLaN/TOhtoTX16EL6ZWHRXRP5fOtBR
-9kA1L2CjpTT9X7FJZADaPqoTTWO4F9yxIT46OurMzddNYtc4TuxtSTdEEgf/9AVX
-l09AFgU2EEbakXtK2V9tJ5McDs7ZT3agVlL1m6WND1zFstjGRYOYqtL6YD8yVhbD
-vYguXm540IZ2DqIRb/SD4YTCgG1u0m2bwTZLsg8xH7LcUscQ1puciEK1brvYXmBp
-fKmWQm6EAN6jxZDoaAfxzCQjYqDTyk4urt3m0cfeyhgzbahZXQjb8kRs90WhZJMK
-9cIQWYJMtXjX2dB9fTGkfO1J7+e6AeEHtL5lfP6KF0iyl8T2EV4GJBomiV5kDOlS
-QVdwZz1yX7rHLl4aTHOh9XFsk75+CbNUNp2dzjSYZhocWNaMF/Wd+WhPe/AchXYk
-AwMBKDLPJUWg99HBttntnY+OiDEewqtsbpMmwcp9uZoF0NBnH1/1AkIXZWG+Lats
-MKKGNbAoGCFmTMuD0M+0VhfC9yJOLUdnygntv+hwa6HtAEadSqlKMzfk5VddAbEu
-KpRmsPCx9wzSj98yXfEOjb6BEhfcPc6E6U6trN0RsdkfhIxmWBOidWFaPZgkwGxe
-Xg5MtVTcKQS7BzBA1Ux067D+UCRAe9av2NCRHIoaDUATsiWTeqL8oNFzXWeFB3Ii
-ejkJTNYVHNliRpAFSnkqJeXfZG+0lLFbw+Hf2YVf345+tEn6LmP6wO9zx7Sq2uCU
-IeoInj8Ejcli46afkSPja0s3iTPQDlqVBZHng9o+02P01/2MK5GdGCN9Uf3aMEJ6
-pOhepqio7RwHjr5rw/rtumLipQZGa7h6MfUbvTtPUu91XFiwGCaPsl/ApsS6+gaw
-xU+NY59XCULYiXYJp8U7t/3hAfulTYMBlChcWxb4RRTsSRW7Q9A6mGbZv6VJtPsO
-rRWBr5evRA331j9JdCmCwWn0nSUfWFLX89dHLqsYMC3fqL6A3Nv0SEAWRoaPqO/H
-q97J19+A6kWMea9Rl23sS/OA3L69WZfytTxF5koJnjMZb+un4JRm8c7eeG+KgLKX
-N7EjCXvbHZwD2fMaHm4fb4JsmxJe3vbzUNYvtfPZ7ezECpeORdDfZurZhFsYt4Xd
-WzN07pmvqDK8q+RXnlOYHcf7gdIroQpm6wbXNSU/LyMfEcchNM+R8MxriOdg9t5N
-J4K8U3dyq6+gt5NVAWemAJzrVKbE3Fy7TZBM1Xa0lFo0Qf2g4092qQtuNaFge0xH
-8TNdBDFIpR9AoupDds3tTFhiCAqXWbGsxDIddFfdZKWqUfqrofSC9/JxHp/l+gqU
-Fjk4kwFktpHn7vtfmkgk9o1XA0NpteJHddAI4lf7YfPG1WnvLcbtHDIaic5xF8Hs
-FZ3V+zmjKMYgjeXK9FBCBW1oIwKdG6t0N/bTEOrtztsEWf4c8bgH6mx4XstJa/qF
-sx0AQwxUhvOYrXLjY24OC5Z164O34vOC1hYwE8LCdnGZPExKXtrg+fEHL7oO6yqy
-hkXjksj6nujM+wCbuwBfIrlSRQUm7wPAM4zPzN1I4ISzCsbJNei+PuT3l7n3g++p
-nm8WRcqGyIomQrZLpHuxCfXK00NJlkatbeuW0BA7aHre/sbY7XJKdqdjhtX5qzZv
-GpeRdBrwrytcbR50pNVoJS02AxivKYvCiRAhPH7wj9Btj8afg/54yWz+iaxBDGqv
-tO/fU3hpbhrO/fWzFZKcMwl+7DY2kAjZQMZYD3tBzfKuV7gjDR37u8MH41X+qCVL
-3xkmyud4T920fSyxpKZHiEhVvTyg1fX5O+d/I0Jk/4nW+Cp2v6nOdcrhsnczQ79d
------END RSA PRIVATE KEY-----
diff --git a/t/ssl/key/good-sha256.pem b/t/ssl/key/good-sha256.pem
index ec1aac5..0292542 100644
--- a/t/ssl/key/good-sha256.pem
+++ b/t/ssl/key/good-sha256.pem
@@ -1,51 +1,28 @@
------BEGIN RSA PRIVATE KEY-----
-MIIJKgIBAAKCAgEAz471sgR3jhdeMbgvCDdA3jug6867yTtcVSsPxKEQSkRF+DBC
-iHaeryxFy14c2Uv6xBWeJquJ8ZGd/3RPTJpODyDg2wELqoV4HlTkYQEGdrO347xd
-F9NpBb+yKiNS3n5AkJocXtNUsx66/Bx4pVHDTMXt1K4lrEqHIJblt49HPO5xvzoz
-GR2cwcwpn56PelAYkCCpcOsC1mpL9WLb6E2yh1HFKcO14oG9F43z+4sRTsHJRjpN
-xJAl6woC6qPshm+/zAkyK/N348ECOMcoFIZ+rpCDN+oEQ4k0V535Tb9TKu+ENU0g
-RIyWa5GX1y2aAny5alKOWjS/urkHNJ1yiwWWk8rHC1yFWsR6IaSN+qnkJmS+6LTE
-zAZsDwyJXfxO+pmaDc1le0Mxz1JnEUjoizIPGvfu7FzTGPA76P/01wrKtWSmkUzI
-6ZtFzP8LlDKlSZq6UpWCBYLXBXTJI3LtsXdyglC8dpRRsFkzNjZOCqIr50y6uFIw
-rpp5dN5FNO7sIcmf/dE2Wz0EwzgEBrVqiF8YQON8dQZNYA14inWemhgmXVDFYEOl
-vfVELWSlCymhF8kmSxLNxAOo2GjkempPoNFhJfVLGeqmA3pV8WFAOYzVNw4OO8aL
-kdLY6j8Q1WbMfed6ejoeNykBD8wTorEK3BGQUm9XJ4MWN/XJI7zZNaQAAC0CAwEA
-AQKCAgAahvLv5ZJCHspzIE8iha1MueI/QRTPCz8pw28oek1SsJcguUpHlqGBUe85
-prWZMBTEqt6jopjmvu2qkHryF2aSmGkklGWhTZ2kgsUNgMwKr7145cIgIWzyxyVG
-LW2R8iDeWlP16pyQqATN4/Wna2PClClpXTiDZKMQjzic1TsNlowDHLUbKKW4Pxey
-xtkfkM0S3pnJTL/4F23N1uy0K/n9QX4pcFH2uQ4pzIK6S3PS1QGccCcwUBwIhicJ
-RhoctHuW4DYBWASinzBhgVKmDOpz9RRQOSCCYS7HY/FQ9nryqdoD1e+h0zYGWX1G
-ixV76+TmqdZ3wPYgLzW0i8rv6a7sybQMAqOeh/Bnv9jQhNur7KBCsW1Go+MSSvcg
-VKLLTvf/o2gW70dwll2tQFSd1iqLfVaTAJTqyyl+sb++CeeAKVuDSsCNaapM0SG+
-LUuLuJOxY2GIabz8cRT8WE09dZdcoFSzOIPmzwKEsYBRQK07bwGSqNGSpubRiK/L
-4KZYVSx4SBpwHnkrtWxPpfGxkpF6mD2hHxAWTFA72gl5Euc61rmrkv3FNTrGj70x
-4HbX/Fgjh8wOaBibxEih7ubsoYAydp+3/W7jB8My7r8XK5I2ZcxAYagc6y16D30m
-YDj69m0GlazgZqo9soTAoGAksN6e3ns3jvZQ+edrpfnqm9O/IQKCAQEA7Pr5K0/O
-dmZmu3rdx5O/nUYPToq5wUfVPVpDeb0aAJEckyyY4mTZbdlEkl8cpFGzfuQfi4p6
-Q290dm0GVdfL0NsuSspvkbRk2WDQWtx2BqwoMsMBk8WSBYk2JHAvpvpK3uVUswtD
-R8D0m6aJhrWrgzD5o/FdXOwK1MoRW4NMdSwJXqPIKG/990TrTcxbm144pQbPRT3x
-GS8wJf3TGAFZ3cHoCbK18WRcB6le4D/SkKBo7go1nCjxI2lTUgUEUknWqDTyhPTj
-uFFTAzDVt0NHX8z+LbvZn5FnR0kt1cik5v1WZKATsfwV20zYwdfBax+cNdEbLbwJ
-EYPyC/2ab50hlwKCAQEA4Dd64cFe9lTHX2Y8AfjX+jOsmk7aPf+a8GTLaz79o+/M
-76fRxVfYX9bMCliWFDUpnafDjVAYrp+nS7e+zrKLK8QnZp0oTctm0dhDwAO4zQsr
-4Y58nvLxalDgbjpV9fn7jLIaYqWPdG55t9eWl/Z5hK2i+meOG8PtG8dJN2gR3ECv
-mdrxMCvPUhshsWsWYlG2xS07P+xODj/P2ZzFJ77gyqd23IGSzdanuFB3yfgePx7z
-BEHHANYYwc0eD/Oz9MvhTvnVVF27jQOO52luwXpnPq2dBN5u/edCgq9E3ZDU3QkX
-CXeYed9u6hmUuClp1v8GBd5gIhIOHvCrSnu9v85c2wKCAQEAnDMMm1S+FGKIolho
-6Exlh0ePfUiJCXHMhuUBBrPy+J6tRACoQMkSW4pS3VudqF1Fv4SjmjlLPzmufQR9
-oYVcjSx7BccK5PIPawyaKNmZXeqJkHPijUEzbzyymC/t6NSfFu339w+caCYx1Ipf
-qZADHbThRwMnc8ENnpYV/Mi9U5oUDvJLUwQGVL5zjlL9qpnfIj8rzUr3qI7m4JO+
-WNtDHZza0dGehR6OXmpv48WNh9CDeSr3jRebYajhx3URFSAgQbysgaBcnLfVzIua
-wnGxEN8wRnrEBZ40gdMlR/05XBttn2O3t6Ad0++CC7qnfXFXaE2M6YdAPvBGUUr2
-SU07vwKCAQEAy90l+YYcldTXwkHuZcygc3nwgg0YGi8B7Xl4C3cmn5w1teHctZX9
-woZG11Fcg9sij5ouD5q4Fm5LamkTMFTefVjIimByeOlr/3ingTrhGG4D4/3uCYfT
-QVtv9ElOR2yX74EwxGjMWozoVuPKpTkRnDVUbmEhsNUgDZXRWHNjaePWxglwKuBq
-jLjmla5Ml/C8QeOyb5ioEAStM6t7B3xiX2CMjkmx9T4rGUbw486ZkcLOKxyzmGsR
-74RUxSRMh1Oo9GnsMd1X3gtSL86JSZnFrhOlJPwp5uoSa0h5UQuSv7a4H3+CP62L
-54aC1j+xYC5Yh5V9yvynojIpTHveNzum6QKCAQEAvkQKmVBGKgrMN91O7IN3sWdj
-gU0wctkjHSAWBkGoV+2350AkhORLgVRLv9stFL/am+lghMU+VimzIN4+ZNeK6BFq
-0DHepLkBGgnWWm4zz/uqLOGWPCo+5yS/hIuHt7NxnZorllFGESass6nfBmNfHWa2
-dVj/uvANmPWgLpvWTE7v8CGsSHGBeS67fKg3Qy2acQ+VxxzwvSYB/TrmEmYaLpPT
-JLjAML5V8K+tAlINo8BFlo5w8w0ymvdKbOjJ8Nh4dZLI3SwFawR4qxrW3XiAHvNV
-Ihx+UO2qWbI6RGDIQj204lIcGVk6wFOmxq0f6qVSgyn2v+u9lx+wG0+XDBBbiA==
------END RSA PRIVATE KEY-----
+-----BEGIN PRIVATE KEY-----
+MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC2++XHLRoopvKU
+wb6s96UvY+Ww21g/t7lbTE1bjiOKtnGYwfwRC2tYPoGo0I2Jzi9s/41sBLe4rc+1
+pHEFWLycAaUTNgYp04RhwXU0bv5kjWeDMWEFBgDGtqBnEYXcQ4bwYcbMxCgkNFvU
+rCPaNeIR/qT/hBeMWikofURE3HIISxZ5oYyOJMzcxMveQ5esR7RkRjwt+UHcFJZU
+J8X17p8p2cE6XEGZZLlyT7J6qmU/BjzdBmcGyjN6Y4z80Z9VWIuINv9LlSHPHrCI
+tgofKR/RkOQOXG5F1i7DN6mlyxUBUTpXRPO1EH6ZTYfSOkQag1OeV8UDEaKeOnLV
+QUuFVSUXAgMBAAECggEAUUtAHmkPQhhJlYUt7TJolNFQ7m3EmypIkyMnCxHvAGVl
+unQURI5KNn4upI1jFGIh987hSage51FxAkX4YGO4B6dDa3GI83QhUDzekVjudEXO
+Qx7g95ZfKelhAelrCxyFCq6l37sWCl+onKeNlhhyQ4RaUZqhy50SxAZDGkTF9KCG
+SUb/zoZ67i4VUlAtstxAy6jfrnsDKSmsMu63EchhzKxwYUIBAwfvVuIjw+FacF0d
+NkfS22+n97CB4thM5Jk67DsfuEzxpbhvIKV75cmrlZOCdaybCKguULQiKARQqpzE
+1ux0jL7w5V1RwjWbhggFgDj1HJgA9aOSRBD0WawRwQKBgQDtl9Skw1CnSOL73ihg
+KGMHGVKPqGpMGrVtCYQBH9HTiSbKw/42LE1W1Jx4KdH65ctBwO1VyfTa2I6uuEWP
+tgUwZ+dmREzvdpeHXZo+FUi+HYP1c8zk8v6fQcGcPGHUoF1Z6aa9kzt/tlJg/J/f
+Zia0sL0jLnxMHTfi1+6P0DI0DwKBgQDFKQH3iO+Q+uKXMqrHgh4crQZ+14zn3J7y
+dOxXa06ZbmwEKeM2UvOzzElzBtar9cZGKsor+RwT4ZcGrvOIURbwTZdqJv/M5KAo
+s6HA5W1LYJDRZwub2M9pBbZ1RDcO8ImrSh7U4KHGMMHDM+8IEiDNI5Fe7I8raBrv
+lXlYiorWeQKBgHK/ta+ttTJV/WpvrUhjuRAgpsNDL7N54s26nsp8N7bWsqmTZx96
+3g9lt/xBFmz6tuQW7YlVdLCNjrvLu6zg2Di8tgGqUw4EVMLH7kq1tOA9GRJez0J0
+KY15EK0IbKdonC1kr2c3yLCxua+l0wDuMRtrkK2BMf8AzZD9gPZsMxL5AoGBAJxF
+MZrqvb+zK3BeJ4C0wHtIJVLaNIP+mTlhtYZgtk7kd9chAEepniIPtNPoQrTPvFUX
+S2FpNHkJoHQarUqJw126kl4ABVZ4i/1Wy8mhz2wkYQSo4UmoolUCwyjVZbKAsw3C
+VQez+GWndZzsB/TksX0HSQztAVmNTXRCjIjCXuM5AoGAAZeapd0CVHXmKfST+G81
+m8b4BHW2s+EzLQzOe1Q1H58ESTrz3woglW+WswV2jopZRUAh9WH0hLT+BLyiZMds
+YCtg0yPoT4gdQQhTAue01QoXWEE+pYomxYS1+EnFgbnDuEiAox4aKMcOwlWCYs7c
+sLY1q3YQEJ4fG1GpCXR2HPM=
+-----END PRIVATE KEY-----


================================================================
  Commit: 98af15fb026b04e23be88d0b4f9698257fbac3b8
      https://github.com/fusinv/fusioninventory-agent/commit/98af15fb026b04e23be88d0b4f9698257fbac3b8
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2011-12-13 (Tue, 13 Dec 2011)

  Changed paths:
    R t/ssl.t
    A t/ssl.t.disabled

  Log Message:
  -----------
  disable t/ssl.t


diff --git a/t/ssl.t b/t/ssl.t
deleted file mode 100644
index 1395526..0000000
--- a/t/ssl.t
+++ /dev/null
@@ -1,198 +0,0 @@
-#!/usr/bin/perl
-
-use strict;
-use warnings;
-use lib 't';
-
-use Compress::Zlib;
-use English qw(-no_match_vars);
-use Socket;
-use Test::More;
-use Test::Exception;
-
-use UNIVERSAL::require;
-use FusionInventory::Agent::Network;
-use FusionInventory::Agent::XML::Query::SimpleMessage;
-use FusionInventory::Logger;
-
-if (!IO::Socket::SSL->require()) {
-    plan skip_all => "IO::Socket::SSL required to run this test";
-}
-FusionInventory::Test::Server->require();
-
-if ($OSNAME eq 'MSWin32' || $OSNAME eq 'darwin') {
-    plan skip_all => 'non working test on Windows and MacOS';
-} else {
-    plan tests => 6;
-}
-
-my $ok = sub {
-    my ($server, $cgi) = @_;
-
-    print "HTTP/1.0 200 OK\r\n";
-    print "\r\n";
-    print compress("<REPLY><word>hello</word></REPLY>");
-};
-
-my $logger = FusionInventory::Logger->new({
-    backends => [ 'Test' ]
-});
-
-# no connection tests
-BAIL_OUT("port aleady used") if test_port(8080);
-
-my $server;
-my $message = FusionInventory::Agent::XML::Query::SimpleMessage->new({
-    logger => $logger,
-    target => {
-        deviceid => 'bar'
-    },
-    msg => {
-        foo => 'bar'
-    }
-});
-
-my $unsafe_client = FusionInventory::Agent::Network->new({
-    logger       => $logger,
-    target       => {
-        path => 'https://localhost:8080/public'
-    },
-    config       => {
-        VERSION        => 42,
-        'no-ssl-check' => 1,
-    },
-});
-my $secure_client = FusionInventory::Agent::Network->new({
-    logger       => $logger,
-    target       => {
-        path => 'https://localhost:8080/public'
-    },
-    config       => {
-        VERSION        => 42,
-        'ca-cert-file' => 't/ssl/crt/ca.pem',
-    },
-});
-
-# ensure the server get stopped even if an exception is thrown
-$SIG{__DIE__}  = sub { $server->stop(); };
-
-# trusted certificate, correct hostname
-$server = FusionInventory::Test::Server->new(
-    port     => 8080,
-    user     => 'test',
-    realm    => 'test',
-    password => 'test',
-    ssl      => 1,
-    crt      => 't/ssl/crt/good.pem',
-    key      => 't/ssl/key/good.pem',
-);
-$server->set_dispatch({
-    '/public'  => $ok,
-});
-$server->background();
-
-ok(
-    $secure_client->send({message => $message}),
-    'trusted certificate, correct hostname: connection success'
-);
-$server->stop();
-
-# trusted certificate, alternate hostname
-$server = FusionInventory::Test::Server->new(
-    port     => 8080,
-    user     => 'test',
-    realm    => 'test',
-    password => 'test',
-    ssl      => 1,
-    crt      => 't/ssl/crt/alternate.pem',
-    key      => 't/ssl/key/alternate.pem',
-);
-$server->set_dispatch({
-    '/public'  => $ok,
-});
-$server->background();
-
-
-SKIP: {
-skip "Too all LWP for alternate hostname", 1 unless $LWP::VERSION >= 6;
-ok(
-    $secure_client->send({message => $message}),
-    'trusted certificate, alternate hostname: connection success'
-);
-}
-
-$server->stop();
-
-# trusted certificate, wrong hostname
-$server = FusionInventory::Test::Server->new(
-    port     => 8080,
-    user     => 'test',
-    realm    => 'test',
-    password => 'test',
-    ssl      => 1,
-    crt      => 't/ssl/crt/wrong.pem',
-    key      => 't/ssl/key/wrong.pem',
-);
-$server->set_dispatch({
-    '/public'  => $ok,
-});
-$server->background();
-
-ok(
-    !$secure_client->send({message => $message}),
-    'trusted certificate, wrong hostname: connection failure'
-);
-
-ok(
-    $unsafe_client->send({message => $message}),
-    'trusted certificate, wrong hostname, no check: connection success'
-);
-
-$server->stop();
-
-# untrusted certificate, correct hostname
-$server = FusionInventory::Test::Server->new(
-    port     => 8080,
-    user     => 'test',
-    realm    => 'test',
-    password => 'test',
-    ssl      => 1,
-    crt      => 't/ssl/crt/bad.pem',
-    key      => 't/ssl/key/bad.pem',
-);
-$server->set_dispatch({
-    '/public'  => $ok,
-});
-$server->background();
-
-ok(
-    !$secure_client->send({message => $message}),
-    'untrusted certificate, correct hostname: connection failure'
-);
-
-SKIP: {
-skip "Check disabled on LWP<6", 1 unless $LWP::VERSION >= 6;
-# Unless you wan to fix this
-ok(
-    $unsafe_client->send({message => $message}),
-    'untrusted certificate, correct hostname, no check: connection success'
-);
-}
-
-$server->stop();
-
-sub test_port {
-    my $port   = $_[0];
-
-    my $iaddr = inet_aton('localhost');
-    my $paddr = sockaddr_in($port, $iaddr);
-    my $proto = getprotobyname('tcp');
-    if (socket(my $socket, PF_INET, SOCK_STREAM, $proto)) {
-        if (connect($socket, $paddr)) {
-            close $socket;
-            return 1;
-        } 
-    }
-
-    return 0;
-}
diff --git a/t/ssl.t.disabled b/t/ssl.t.disabled
new file mode 100644
index 0000000..1395526
--- /dev/null
+++ b/t/ssl.t.disabled
@@ -0,0 +1,198 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+use lib 't';
+
+use Compress::Zlib;
+use English qw(-no_match_vars);
+use Socket;
+use Test::More;
+use Test::Exception;
+
+use UNIVERSAL::require;
+use FusionInventory::Agent::Network;
+use FusionInventory::Agent::XML::Query::SimpleMessage;
+use FusionInventory::Logger;
+
+if (!IO::Socket::SSL->require()) {
+    plan skip_all => "IO::Socket::SSL required to run this test";
+}
+FusionInventory::Test::Server->require();
+
+if ($OSNAME eq 'MSWin32' || $OSNAME eq 'darwin') {
+    plan skip_all => 'non working test on Windows and MacOS';
+} else {
+    plan tests => 6;
+}
+
+my $ok = sub {
+    my ($server, $cgi) = @_;
+
+    print "HTTP/1.0 200 OK\r\n";
+    print "\r\n";
+    print compress("<REPLY><word>hello</word></REPLY>");
+};
+
+my $logger = FusionInventory::Logger->new({
+    backends => [ 'Test' ]
+});
+
+# no connection tests
+BAIL_OUT("port aleady used") if test_port(8080);
+
+my $server;
+my $message = FusionInventory::Agent::XML::Query::SimpleMessage->new({
+    logger => $logger,
+    target => {
+        deviceid => 'bar'
+    },
+    msg => {
+        foo => 'bar'
+    }
+});
+
+my $unsafe_client = FusionInventory::Agent::Network->new({
+    logger       => $logger,
+    target       => {
+        path => 'https://localhost:8080/public'
+    },
+    config       => {
+        VERSION        => 42,
+        'no-ssl-check' => 1,
+    },
+});
+my $secure_client = FusionInventory::Agent::Network->new({
+    logger       => $logger,
+    target       => {
+        path => 'https://localhost:8080/public'
+    },
+    config       => {
+        VERSION        => 42,
+        'ca-cert-file' => 't/ssl/crt/ca.pem',
+    },
+});
+
+# ensure the server get stopped even if an exception is thrown
+$SIG{__DIE__}  = sub { $server->stop(); };
+
+# trusted certificate, correct hostname
+$server = FusionInventory::Test::Server->new(
+    port     => 8080,
+    user     => 'test',
+    realm    => 'test',
+    password => 'test',
+    ssl      => 1,
+    crt      => 't/ssl/crt/good.pem',
+    key      => 't/ssl/key/good.pem',
+);
+$server->set_dispatch({
+    '/public'  => $ok,
+});
+$server->background();
+
+ok(
+    $secure_client->send({message => $message}),
+    'trusted certificate, correct hostname: connection success'
+);
+$server->stop();
+
+# trusted certificate, alternate hostname
+$server = FusionInventory::Test::Server->new(
+    port     => 8080,
+    user     => 'test',
+    realm    => 'test',
+    password => 'test',
+    ssl      => 1,
+    crt      => 't/ssl/crt/alternate.pem',
+    key      => 't/ssl/key/alternate.pem',
+);
+$server->set_dispatch({
+    '/public'  => $ok,
+});
+$server->background();
+
+
+SKIP: {
+skip "Too all LWP for alternate hostname", 1 unless $LWP::VERSION >= 6;
+ok(
+    $secure_client->send({message => $message}),
+    'trusted certificate, alternate hostname: connection success'
+);
+}
+
+$server->stop();
+
+# trusted certificate, wrong hostname
+$server = FusionInventory::Test::Server->new(
+    port     => 8080,
+    user     => 'test',
+    realm    => 'test',
+    password => 'test',
+    ssl      => 1,
+    crt      => 't/ssl/crt/wrong.pem',
+    key      => 't/ssl/key/wrong.pem',
+);
+$server->set_dispatch({
+    '/public'  => $ok,
+});
+$server->background();
+
+ok(
+    !$secure_client->send({message => $message}),
+    'trusted certificate, wrong hostname: connection failure'
+);
+
+ok(
+    $unsafe_client->send({message => $message}),
+    'trusted certificate, wrong hostname, no check: connection success'
+);
+
+$server->stop();
+
+# untrusted certificate, correct hostname
+$server = FusionInventory::Test::Server->new(
+    port     => 8080,
+    user     => 'test',
+    realm    => 'test',
+    password => 'test',
+    ssl      => 1,
+    crt      => 't/ssl/crt/bad.pem',
+    key      => 't/ssl/key/bad.pem',
+);
+$server->set_dispatch({
+    '/public'  => $ok,
+});
+$server->background();
+
+ok(
+    !$secure_client->send({message => $message}),
+    'untrusted certificate, correct hostname: connection failure'
+);
+
+SKIP: {
+skip "Check disabled on LWP<6", 1 unless $LWP::VERSION >= 6;
+# Unless you wan to fix this
+ok(
+    $unsafe_client->send({message => $message}),
+    'untrusted certificate, correct hostname, no check: connection success'
+);
+}
+
+$server->stop();
+
+sub test_port {
+    my $port   = $_[0];
+
+    my $iaddr = inet_aton('localhost');
+    my $paddr = sockaddr_in($port, $iaddr);
+    my $proto = getprotobyname('tcp');
+    if (socket(my $socket, PF_INET, SOCK_STREAM, $proto)) {
+        if (connect($socket, $paddr)) {
+            close $socket;
+            return 1;
+        } 
+    }
+
+    return 0;
+}


================================================================
  Commit: b59a090968f2904b3c2c78ae0e214cd4f779fd9d
      https://github.com/fusinv/fusioninventory-agent/commit/b59a090968f2904b3c2c78ae0e214cd4f779fd9d
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2011-12-14 (Wed, 14 Dec 2011)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/OS/Win32/Bios.pm

  Log Message:
  -----------
  VMware System incorrectly detected

closes: #1391

Reported-by: Mario Gzuk <mariogzuk at technikz.de>


diff --git a/lib/FusionInventory/Agent/Task/Inventory/OS/Win32/Bios.pm b/lib/FusionInventory/Agent/Task/Inventory/OS/Win32/Bios.pm
index 9fb1481..f153039 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/OS/Win32/Bios.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/OS/Win32/Bios.pm
@@ -130,6 +130,10 @@ sub doInventory {
 
     if ($bversion eq 'VirtualBox' || $mmodel eq 'VirtualBox') {
         $vmsystem = 'VirtualBox';
+    } elsif ($smodel =~  /VMware/i) {
+        $vmsystem = 'VMware';
+    } elsif ($biosSerial =~  /VMware/i) {
+        $vmsystem = 'VMware';
     }
 
     if ($vmsystem) {


================================================================
  Commit: b3bffb12ce916bbc35b529bc58362a88f90a0ebd
      https://github.com/fusinv/fusioninventory-agent/commit/b3bffb12ce916bbc35b529bc58362a88f90a0ebd
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2011-12-14 (Wed, 14 Dec 2011)

  Changed paths:
    M Changes
    M lib/FusionInventory/Agent.pm

  Log Message:
  -----------
  prepare 2.1.13 release


diff --git a/Changes b/Changes
index 0530ee3..5a53b41 100644
--- a/Changes
+++ b/Changes
@@ -1,5 +1,21 @@
 Revision history for FusionInventory::Agent
 
+2.1.12  Wed, 14 Dec 2011 13:06:44 +0100
+
+TEST-SUITE
+ ✔ 2.1.10 Test suite fails
+       commit:8035bd
+     http://forge.fusioninventory.org/issues/1161
+   thanks: Remi Collet
+
+WINDOWS
+ ✔ VM System incorrect
+       commit:b59a09
+     http://forge.fusioninventory.org/issues/1391
+   thanks: Mario Gzuk
+ ✔ Fix the CPU detection on Windows 
+   thanks: Anthony Facchin
+
 2.1.12  Wed, 23 Nov 2011 18:14:52 +0100
 
 GENERIC
diff --git a/lib/FusionInventory/Agent.pm b/lib/FusionInventory/Agent.pm
index 2724601..af2b9ee 100644
--- a/lib/FusionInventory/Agent.pm
+++ b/lib/FusionInventory/Agent.pm
@@ -11,7 +11,7 @@ use File::Path;
 use XML::Simple;
 use Sys::Hostname;
 
-our $VERSION = '2.1.12';
+our $VERSION = '2.1.13';
 $ENV{LC_ALL} = 'C'; # Turn off localised output for commands
 $ENV{LANG} = 'C'; # Turn off localised output for commands
 


================================================================
  Commit: 67456df9d93027c781262198ef4e0d9ab9983735
      https://github.com/fusinv/fusioninventory-agent/commit/67456df9d93027c781262198ef4e0d9ab9983735
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2011-12-15 (Thu, 15 Dec 2011)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/OS/Win32/Networks.pm

  Log Message:
  -----------
  Ethernet Type not detected on Windows

closes: #1393

Reported-by: Mario Gzuk <mariogzuk at technikz.de>


diff --git a/lib/FusionInventory/Agent/Task/Inventory/OS/Win32/Networks.pm b/lib/FusionInventory/Agent/Task/Inventory/OS/Win32/Networks.pm
index 0974c03..97b7c69 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/OS/Win32/Networks.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/OS/Win32/Networks.pm
@@ -109,6 +109,9 @@ sub doInventory {
         $netifs[$idx]{macaddr} = $nic->MACAddress;
         $netifs[$idx]{speed} = $nic->Speed;
         $netifs[$idx]{pnpdeviceid} = $nic->PNPDeviceID;
+        $netifs[$idx]{type} = $nic->AdapterType;
+
+        $netifs[$idx]{type} =~ s/Ethernet.*/Ethernet/ if $netifs[$idx]{type};
     }
 
     foreach my $netif (@netifs) {


================================================================
  Commit: fd780274b2a0ca2b9466d48643836467ec51f3b3
      https://github.com/fusinv/fusioninventory-agent/commit/fd780274b2a0ca2b9466d48643836467ec51f3b3
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2011-12-15 (Thu, 15 Dec 2011)

  Changed paths:
    M Changes
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Bios.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm

  Log Message:
  -----------
  Merge branch '2.1.x' into 2.2.x


diff --git a/Changes b/Changes
index effd112..1a8eec8 100644
--- a/Changes
+++ b/Changes
@@ -56,6 +56,22 @@ Minor changes:
 * Linux: Use /sbin/ip to get the interface IP addresses (#854)
 * HPUX: don't report unoccupied memory slots
 
+2.1.12  Wed, 14 Dec 2011 13:06:44 +0100
+
+TEST-SUITE
+ ✔ 2.1.10 Test suite fails
+       commit:8035bd
+     http://forge.fusioninventory.org/issues/1161
+   thanks: Remi Collet
+
+WINDOWS
+ ✔ VM System incorrect
+       commit:b59a09
+     http://forge.fusioninventory.org/issues/1391
+   thanks: Mario Gzuk
+ ✔ Fix the CPU detection on Windows 
+   thanks: Anthony Facchin
+
 2.1.12  Wed, 23 Nov 2011 18:14:52 +0100
 
 GENERIC
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Bios.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Bios.pm
index a4575b4..ee0ad7c 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Bios.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Bios.pm
@@ -92,7 +92,16 @@ sub doInventory {
         $inventory->setHardware ({
             VMSYSTEM => 'VirtualBox'
         });
+    } elsif (
+        ($bios->{BIOSSERIAL} && ($bios->{BIOSSERIAL} =~ /VMware/i))
+         ||
+        ($bios->{SMODEL} && ($bios->{SMODEL} eq 'VirtualBox'))
+       ) {
+        $inventory->setHardware ({
+            VMSYSTEM => 'VMware'
+        });
     }
+
 }
 
 1;
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
index 0fba5f9..c9e9acd 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
@@ -102,6 +102,12 @@ sub doInventory {
         } else {
 	    $interface->{VIRTUALDEV} = $nic->PNPDeviceID =~ /^ROOT/ ? 1 : 0;
         }
+
+        if (defined $nic->AdapterType) {
+            $interface->{TYPE} = $nic->AdapterType;
+            $interface->{TYPE} =~ s/Ethernet.*/Ethernet/;
+        }
+
     }
 
     foreach my $interface (@interfaces) {


================================================================
  Commit: 78faf6852eb7715a7f05b7ab5e0046f10ddc4bb6
      https://github.com/fusinv/fusioninventory-agent/commit/78faf6852eb7715a7f05b7ab5e0046f10ddc4bb6
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2011-12-15 (Thu, 15 Dec 2011)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Bios.pm

  Log Message:
  -----------
  win32: drop the trailing spaces

see: #1397

Reported-by: David Durieux <d.durieux at siprossii.com>


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Bios.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Bios.pm
index ee0ad7c..2dca55b 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Bios.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Bios.pm
@@ -82,6 +82,8 @@ sub doInventory {
 
     }
 
+    $bios->{$_} =~ s/\s+$// foreach (keys %bios);
+
     $inventory->setBios($bios);
 
     if (


================================================================
  Commit: 25670a6179d596269c8a00838d8802bae7ec7b90
      https://github.com/fusinv/fusioninventory-agent/commit/25670a6179d596269c8a00838d8802bae7ec7b90
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2011-12-15 (Thu, 15 Dec 2011)

  Changed paths:
    M t/components/client/ssl.t
    A t/ssl/cnf/good-sha256.cnf
    R t/ssl/crt/ca-rulezlan.pem
    M t/ssl/crt/good-sha256.pem
    R t/ssl/key/ca-rulezlan.pem
    M t/ssl/key/good-sha256.pem

  Log Message:
  -----------
  Merge remote-tracking branch 'origin/2.2.x' into 2.2.x


diff --git a/t/components/client/ssl.t b/t/components/client/ssl.t
index 46a0b82..62ea6bc 100755
--- a/t/components/client/ssl.t
+++ b/t/components/client/ssl.t
@@ -47,7 +47,7 @@ my $secure_client = FusionInventory::Agent::HTTP::Client->new(
 
 my $secure_sha256_client = FusionInventory::Agent::HTTP::Client->new(
     logger       => $logger,
-    ca_cert_file => 't/ssl/crt/ca-rulezlan.pem',
+    ca_cert_file => 't/ssl/crt/ca.pem',
 );
 
 # ensure the server get stopped even if an exception is thrown
diff --git a/t/ssl/cnf/good-sha256.cnf b/t/ssl/cnf/good-sha256.cnf
new file mode 100644
index 0000000..c5d90dc
--- /dev/null
+++ b/t/ssl/cnf/good-sha256.cnf
@@ -0,0 +1,17 @@
+[ req ]
+default_bits       = 2048
+default_md         = sha256
+encrypt_key        = no
+distinguished_name = req_dn
+req_extensions     = req_ext
+prompt             = no
+
+[ req_dn ]
+organizationName       = fusioninventory.org
+organizationalUnitName = trusted test certificate
+commonName             = localhost
+emailAddress           = test at fusioninventory.org
+
+[ req_ext ]
+basicConstraints     = CA:false
+subjectKeyIdentifier = hash
diff --git a/t/ssl/crt/ca-rulezlan.pem b/t/ssl/crt/ca-rulezlan.pem
deleted file mode 100644
index 8692d34..0000000
--- a/t/ssl/crt/ca-rulezlan.pem
+++ /dev/null
@@ -1,35 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIGIzCCBAugAwIBAgIJAINRP0U9bGFsMA0GCSqGSIb3DQEBCwUAMIHHMS4wLAYD
-VQQDEyVSdWxlemxhbiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcxMRAwDgYD
-VQQHEwdBcnJhZG9uMREwDwYDVQQIEwhCcmV0YWduZTELMAkGA1UEBhMCRlIxIjAg
-BgkqhkiG9w0BCQEWE2dvbmVyaUBydWxlemxhbi5vcmcxETAPBgNVBAoTCExhbmFm
-cmFnMSwwKgYDVQQLEyNEZXBhcnRtZW50IG9mIENvbXB1dGF0aW9uYWwgU2NpZW5j
-ZTAeFw0xMTExMjkyMTU4NTdaFw0zMTExMjQyMTU4NTdaMIHHMS4wLAYDVQQDEyVS
-dWxlemxhbiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcxMRAwDgYDVQQHEwdB
-cnJhZG9uMREwDwYDVQQIEwhCcmV0YWduZTELMAkGA1UEBhMCRlIxIjAgBgkqhkiG
-9w0BCQEWE2dvbmVyaUBydWxlemxhbi5vcmcxETAPBgNVBAoTCExhbmFmcmFnMSww
-KgYDVQQLEyNEZXBhcnRtZW50IG9mIENvbXB1dGF0aW9uYWwgU2NpZW5jZTCCAiIw
-DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK/B3StGdjU73qo9QZ4wVtFaRrPI
-tU3B16Zrz8KGY/bc5PSIi83xLzGGcz3g3W2mAI8THZHfD6qHQKkVhLR4OS10eV5Q
-knvKjN7+bFp5mUMCbCoZ9GFw6J0SdilrbYudiHLV7Y24Co9kt8ziETMFe9Xd8m+i
-Qmpz0nslGg6n4y1Z4e69SXeh/94Bg22e5htsJ3sGENIk/bQMb4h/5tvufLDmpyU1
-GvLwYWlGTPF43u0+mBdjT2cW5Dw5rXidM1jbIV1Sl+9eJ5rsL9uH31sO5mCabESS
-iRdu1zf3/ASscgxhSW23hPiDoBsLUF17n7eDOxGCnwdfwE+YRHaH7kenQbCpbFuf
-Xo8anFH7k7wLiptaMl4SVGRhyUObTILoOKji7tBkUDC4EvSuHl96A15xbXPTDucM
-PaCRZXRWFPajSNgq8X49HHsURbTRLvOeFSQQ12BhRyzb9XXpYqc4OVsPa+KMuvkm
-N4gXSWlWyQRnd0hTpOZcdTAuIQzTcdfqHiULX2Q2TjFVCTmdnjQuFq+5ar3c+DUp
-CqKs5+hYE1x0KPIsyrrBufHysE7rVxFPIFxmNVyrNTGeDJGSHDEV2dnpT/LmVo96
-my1LGg1FgLw94Odf1C47FPrDeKlWoYzDRZ2nInpMN6rlpue1bZKV49e3+5MLhP63
-Z/YuPQgxy9yOuv1bAgMBAAGjEDAOMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEL
-BQADggIBAHnERCw+gL7dzIaaoRXE0tvVP+asmSzVgwJ0iZPOu7jd8WvQhIA+AgEY
-7RuM7Hhdd3JYiNRIXJykbFlLbI9bLwjNtxYQuAxgKbWVGCBnRb0iwlQ8nuVtGqCE
-K3uFCTXWtKQpPbtLQYHDH98dREklw/am5eH5O/eOFwHAEVyBfYRD30yKzTk3CMqF
-G8A0O+M9KIkJqG1rF0CXB3tUUlcTql/22ZLgO7kHt68nnB/N+EVUJv8mfepNQkiO
-gcSe60lJNLKpgkPkDV15MbA5c+UH1Udptf/JEFwRNQG4q/I8IId8gmiaLiTv0Q1m
-ErQzQbhGuQHUN2ACMWnajg1IHvn3cu9Onc3AOiI9nfHBMzeATH7IxGKJjTZaCZyo
-hCqFStW5C1jIR07ZrtE0oxFSHD4UNXTeYGNtb6yPKicqx3gzd4A5/KMUbbhMB6G7
-EmaPK9ssOsIqPCpgO/OLfQcT7ovAvnvYaJbRNR2u60FnctA8f4Mzisk1biG/slCN
-60oWrxgqRe/G0mWj6fkFt7Jl4t6BCTlVe7hT34xvyKuT2j2iyZdf669zT90HF2XN
-g/c3LYPCzICtrckc85Z/7lhh0kktni0Zkbg9CmsUmZk4ntiDnt9eaKEFsCF9HLNy
-AlJPXgFb7zMrtRupqjA3Tv4owmuzAa0WrD7Ofjylz/E6rp/9Stbf
------END CERTIFICATE-----
diff --git a/t/ssl/crt/good-sha256.pem b/t/ssl/crt/good-sha256.pem
index c128a6f..c27a0c0 100644
--- a/t/ssl/crt/good-sha256.pem
+++ b/t/ssl/crt/good-sha256.pem
@@ -1,117 +1,70 @@
 Certificate:
     Data:
-        Version: 3 (0x2)
-        Serial Number: 2 (0x2)
+        Version: 1 (0x0)
+        Serial Number: 7 (0x7)
         Signature Algorithm: sha256WithRSAEncryption
-        Issuer: CN=Rulezlan Certification Authority - G1, L=Arradon, ST=Bretagne, C=FR/emailAddress=goneri at rulezlan.org, O=Lanafrag, OU=Department of Computational Science
+        Issuer: O=fusioninventory.org, OU=test certification authority, CN=test_ca/emailAddress=test at fusioninventory.org
         Validity
-            Not Before: Dec  2 15:23:20 2011 GMT
-            Not After : Dec  1 15:23:20 2013 GMT
-        Subject: CN=localhost, L=Arradon, ST=Bretagne, C=FR/emailAddress=goneri at rulezlan.org, O=Lanafrag, OU=Department of Computational Science
+            Not Before: Dec 12 18:55:04 2011 GMT
+            Not After : Dec 11 18:55:04 2013 GMT
+        Subject: O=fusioninventory.org, OU=trusted test certificate, CN=localhost/emailAddress=test at fusioninventory.org
         Subject Public Key Info:
             Public Key Algorithm: rsaEncryption
-            RSA Public Key: (4096 bit)
-                Modulus (4096 bit):
-                    00:cf:8e:f5:b2:04:77:8e:17:5e:31:b8:2f:08:37:
-                    40:de:3b:a0:eb:ce:bb:c9:3b:5c:55:2b:0f:c4:a1:
-                    10:4a:44:45:f8:30:42:88:76:9e:af:2c:45:cb:5e:
-                    1c:d9:4b:fa:c4:15:9e:26:ab:89:f1:91:9d:ff:74:
-                    4f:4c:9a:4e:0f:20:e0:db:01:0b:aa:85:78:1e:54:
-                    e4:61:01:06:76:b3:b7:e3:bc:5d:17:d3:69:05:bf:
-                    b2:2a:23:52:de:7e:40:90:9a:1c:5e:d3:54:b3:1e:
-                    ba:fc:1c:78:a5:51:c3:4c:c5:ed:d4:ae:25:ac:4a:
-                    87:20:96:e5:b7:8f:47:3c:ee:71:bf:3a:33:19:1d:
-                    9c:c1:cc:29:9f:9e:8f:7a:50:18:90:20:a9:70:eb:
-                    02:d6:6a:4b:f5:62:db:e8:4d:b2:87:51:c5:29:c3:
-                    b5:e2:81:bd:17:8d:f3:fb:8b:11:4e:c1:c9:46:3a:
-                    4d:c4:90:25:eb:0a:02:ea:a3:ec:86:6f:bf:cc:09:
-                    32:2b:f3:77:e3:c1:02:38:c7:28:14:86:7e:ae:90:
-                    83:37:ea:04:43:89:34:57:9d:f9:4d:bf:53:2a:ef:
-                    84:35:4d:20:44:8c:96:6b:91:97:d7:2d:9a:02:7c:
-                    b9:6a:52:8e:5a:34:bf:ba:b9:07:34:9d:72:8b:05:
-                    96:93:ca:c7:0b:5c:85:5a:c4:7a:21:a4:8d:fa:a9:
-                    e4:26:64:be:e8:b4:c4:cc:06:6c:0f:0c:89:5d:fc:
-                    4e:fa:99:9a:0d:cd:65:7b:43:31:cf:52:67:11:48:
-                    e8:8b:32:0f:1a:f7:ee:ec:5c:d3:18:f0:3b:e8:ff:
-                    f4:d7:0a:ca:b5:64:a6:91:4c:c8:e9:9b:45:cc:ff:
-                    0b:94:32:a5:49:9a:ba:52:95:82:05:82:d7:05:74:
-                    c9:23:72:ed:b1:77:72:82:50:bc:76:94:51:b0:59:
-                    33:36:36:4e:0a:a2:2b:e7:4c:ba:b8:52:30:ae:9a:
-                    79:74:de:45:34:ee:ec:21:c9:9f:fd:d1:36:5b:3d:
-                    04:c3:38:04:06:b5:6a:88:5f:18:40:e3:7c:75:06:
-                    4d:60:0d:78:8a:75:9e:9a:18:26:5d:50:c5:60:43:
-                    a5:bd:f5:44:2d:64:a5:0b:29:a1:17:c9:26:4b:12:
-                    cd:c4:03:a8:d8:68:e4:7a:6a:4f:a0:d1:61:25:f5:
-                    4b:19:ea:a6:03:7a:55:f1:61:40:39:8c:d5:37:0e:
-                    0e:3b:c6:8b:91:d2:d8:ea:3f:10:d5:66:cc:7d:e7:
-                    7a:7a:3a:1e:37:29:01:0f:cc:13:a2:b1:0a:dc:11:
-                    90:52:6f:57:27:83:16:37:f5:c9:23:bc:d9:35:a4:
-                    00:00:2d
+                Public-Key: (2048 bit)
+                Modulus:
+                    00:b6:fb:e5:c7:2d:1a:28:a6:f2:94:c1:be:ac:f7:
+                    a5:2f:63:e5:b0:db:58:3f:b7:b9:5b:4c:4d:5b:8e:
+                    23:8a:b6:71:98:c1:fc:11:0b:6b:58:3e:81:a8:d0:
+                    8d:89:ce:2f:6c:ff:8d:6c:04:b7:b8:ad:cf:b5:a4:
+                    71:05:58:bc:9c:01:a5:13:36:06:29:d3:84:61:c1:
+                    75:34:6e:fe:64:8d:67:83:31:61:05:06:00:c6:b6:
+                    a0:67:11:85:dc:43:86:f0:61:c6:cc:c4:28:24:34:
+                    5b:d4:ac:23:da:35:e2:11:fe:a4:ff:84:17:8c:5a:
+                    29:28:7d:44:44:dc:72:08:4b:16:79:a1:8c:8e:24:
+                    cc:dc:c4:cb:de:43:97:ac:47:b4:64:46:3c:2d:f9:
+                    41:dc:14:96:54:27:c5:f5:ee:9f:29:d9:c1:3a:5c:
+                    41:99:64:b9:72:4f:b2:7a:aa:65:3f:06:3c:dd:06:
+                    67:06:ca:33:7a:63:8c:fc:d1:9f:55:58:8b:88:36:
+                    ff:4b:95:21:cf:1e:b0:88:b6:0a:1f:29:1f:d1:90:
+                    e4:0e:5c:6e:45:d6:2e:c3:37:a9:a5:cb:15:01:51:
+                    3a:57:44:f3:b5:10:7e:99:4d:87:d2:3a:44:1a:83:
+                    53:9e:57:c5:03:11:a2:9e:3a:72:d5:41:4b:85:55:
+                    25:17
                 Exponent: 65537 (0x10001)
-        X509v3 extensions:
-            X509v3 Basic Constraints: 
-                CA:FALSE
     Signature Algorithm: sha256WithRSAEncryption
-        18:50:f9:86:78:13:e6:3f:3a:b2:97:e0:2e:e0:cb:3e:87:88:
-        0b:d4:a5:ed:70:e0:8a:bf:ee:04:47:54:47:97:c5:09:f4:da:
-        a5:d2:f7:ed:7e:e5:61:be:ff:17:41:f3:87:66:d9:46:de:28:
-        cf:64:46:34:0d:d0:55:ef:14:98:9f:8d:d6:03:78:0c:e6:a9:
-        e9:10:f9:af:0c:4c:ec:d1:09:4d:93:16:7f:8e:de:66:5e:ee:
-        bb:c9:fa:a0:32:0f:2d:82:32:1e:56:a6:e9:b8:b9:9a:12:3b:
-        eb:9c:be:c7:5e:ca:00:78:fc:83:b9:f6:af:0f:34:3a:23:01:
-        12:ad:67:f1:23:93:62:30:c4:05:c4:d9:2a:b5:78:aa:c1:1f:
-        0c:d7:5c:95:e6:ba:e2:5c:ba:b1:a7:d2:9e:81:6e:ea:2a:0e:
-        4d:5c:dd:91:0d:de:5f:95:00:ab:9c:4e:83:9f:03:39:db:f8:
-        65:f8:b6:f3:69:cb:68:49:48:76:c3:8d:ef:db:cd:98:f4:d1:
-        56:b4:57:c9:aa:30:ea:97:f2:a4:af:35:b9:32:86:e9:fe:07:
-        28:50:ff:dd:43:ca:6a:3d:4f:d0:92:80:87:b8:56:e0:88:76:
-        7c:1a:00:60:32:91:4b:76:4a:82:ff:40:c8:25:45:74:96:27:
-        4a:21:4a:f2:29:12:43:2e:33:49:fa:59:87:55:10:56:5b:12:
-        09:9c:20:d9:dd:d3:db:17:23:db:c2:2e:47:fb:e8:6e:1c:8b:
-        5f:d2:d6:5b:9e:5d:2f:5d:dc:e9:27:3d:fd:da:47:12:9f:c0:
-        f2:85:9b:ca:78:48:63:ca:42:27:80:00:8e:c6:2c:8f:1d:09:
-        08:56:58:8c:82:3b:83:c6:ee:13:cd:a7:62:3b:02:3d:37:8c:
-        da:55:ae:88:d9:e2:41:ba:06:52:48:ac:42:e9:5e:83:26:fb:
-        be:79:29:57:b3:d1:07:c7:ea:a5:bb:6b:e6:06:40:f3:1f:ab:
-        c8:28:65:fa:2d:e8:52:7a:3a:65:b0:3a:e3:dc:85:d2:fc:a6:
-        39:a7:67:ec:60:a4:8d:4c:03:1e:ed:05:3b:f1:9d:f1:5a:82:
-        cf:4b:70:96:67:e7:f7:a9:b2:3f:46:4b:1d:f8:46:4a:6b:03:
-        bb:b5:0f:9e:59:d7:9f:9b:b6:6a:98:15:8c:97:46:c6:9c:a8:
-        09:4d:87:c1:45:74:05:18:ef:1d:ce:84:7c:23:b8:f7:f2:5e:
-        96:22:6d:cd:97:82:34:15:40:e7:be:79:5c:f2:24:4e:5b:b1:
-        22:1b:1e:1b:a2:54:03:ba:6d:58:5f:d5:68:6c:35:3f:98:2b:
-        49:96:85:99:cb:07:cc:a5
+        11:37:b8:2b:61:c2:e0:e6:76:23:d6:9f:8d:61:5d:6d:d8:1f:
+        73:d8:40:7c:25:25:e7:3e:1f:3d:04:e5:61:f5:6b:fe:c4:af:
+        cc:8d:55:b2:73:4c:66:89:25:29:c1:44:d2:3c:2c:96:7a:d4:
+        05:ee:ff:32:ca:a6:16:ee:9f:70:b7:d1:08:0d:8f:1e:71:7c:
+        a6:0e:3d:dc:5a:08:8e:28:64:3f:4c:b2:e1:cd:5d:96:3d:ae:
+        28:df:56:bc:a6:ce:1f:e7:d6:ef:ff:41:b3:8e:1e:1e:76:bb:
+        e7:7e:12:f8:93:35:1a:93:41:cb:81:32:6a:d0:2c:87:b6:24:
+        f8:b8:c2:a6:4d:0c:b2:f7:34:ec:9a:67:13:0b:4a:2a:12:bb:
+        c2:d3:62:14:20:08:46:bf:da:68:5d:bf:4d:fb:19:f5:1e:ea:
+        b0:a3:12:41:98:f2:f1:b5:f2:30:1b:17:9d:37:af:c2:83:08:
+        9d:14:ef:7f:28:a0:f0:8f:ab:d7:02:bf:d7:2b:ab:7c:17:10:
+        28:79:4e:98:01:d4:a1:bf:cf:cc:2e:84:66:74:10:23:1e:d7:
+        31:83:11:21:96:37:76:46:04:95:1c:4c:b2:35:b0:ca:87:52:
+        1d:72:fd:6c:4c:72:51:a9:fb:13:fb:69:87:55:be:6b:2e:fd:
+        bc:0c:2c:69
 -----BEGIN CERTIFICATE-----
-MIIF/DCCA+SgAwIBAgIBAjANBgkqhkiG9w0BAQsFADCBxzEuMCwGA1UEAxMlUnVs
-ZXpsYW4gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMTEQMA4GA1UEBxMHQXJy
-YWRvbjERMA8GA1UECBMIQnJldGFnbmUxCzAJBgNVBAYTAkZSMSIwIAYJKoZIhvcN
-AQkBFhNnb25lcmlAcnVsZXpsYW4ub3JnMREwDwYDVQQKEwhMYW5hZnJhZzEsMCoG
-A1UECxMjRGVwYXJ0bWVudCBvZiBDb21wdXRhdGlvbmFsIFNjaWVuY2UwHhcNMTEx
-MjAyMTUyMzIwWhcNMTMxMjAxMTUyMzIwWjCBqzESMBAGA1UEAxMJbG9jYWxob3N0
-MRAwDgYDVQQHEwdBcnJhZG9uMREwDwYDVQQIEwhCcmV0YWduZTELMAkGA1UEBhMC
-RlIxIjAgBgkqhkiG9w0BCQEWE2dvbmVyaUBydWxlemxhbi5vcmcxETAPBgNVBAoT
-CExhbmFmcmFnMSwwKgYDVQQLEyNEZXBhcnRtZW50IG9mIENvbXB1dGF0aW9uYWwg
-U2NpZW5jZTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAM+O9bIEd44X
-XjG4Lwg3QN47oOvOu8k7XFUrD8ShEEpERfgwQoh2nq8sRcteHNlL+sQVniarifGR
-nf90T0yaTg8g4NsBC6qFeB5U5GEBBnazt+O8XRfTaQW/siojUt5+QJCaHF7TVLMe
-uvwceKVRw0zF7dSuJaxKhyCW5bePRzzucb86MxkdnMHMKZ+ej3pQGJAgqXDrAtZq
-S/Vi2+hNsodRxSnDteKBvReN8/uLEU7ByUY6TcSQJesKAuqj7IZvv8wJMivzd+PB
-AjjHKBSGfq6QgzfqBEOJNFed+U2/UyrvhDVNIESMlmuRl9ctmgJ8uWpSjlo0v7q5
-BzSdcosFlpPKxwtchVrEeiGkjfqp5CZkvui0xMwGbA8MiV38TvqZmg3NZXtDMc9S
-ZxFI6IsyDxr37uxc0xjwO+j/9NcKyrVkppFMyOmbRcz/C5QypUmaulKVggWC1wV0
-ySNy7bF3coJQvHaUUbBZMzY2TgqiK+dMurhSMK6aeXTeRTTu7CHJn/3RNls9BMM4
-BAa1aohfGEDjfHUGTWANeIp1npoYJl1QxWBDpb31RC1kpQspoRfJJksSzcQDqNho
-5HpqT6DRYSX1SxnqpgN6VfFhQDmM1TcODjvGi5HS2Oo/ENVmzH3neno6HjcpAQ/M
-E6KxCtwRkFJvVyeDFjf1ySO82TWkAAAtAgMBAAGjDTALMAkGA1UdEwQCMAAwDQYJ
-KoZIhvcNAQELBQADggIBABhQ+YZ4E+Y/OrKX4C7gyz6HiAvUpe1w4Iq/7gRHVEeX
-xQn02qXS9+1+5WG+/xdB84dm2UbeKM9kRjQN0FXvFJifjdYDeAzmqekQ+a8MTOzR
-CU2TFn+O3mZe7rvJ+qAyDy2CMh5Wpum4uZoSO+ucvsdeygB4/IO59q8PNDojARKt
-Z/Ejk2IwxAXE2Sq1eKrBHwzXXJXmuuJcurGn0p6BbuoqDk1c3ZEN3l+VAKucToOf
-Aznb+GX4tvNpy2hJSHbDje/bzZj00Va0V8mqMOqX8qSvNbkyhun+ByhQ/91Dymo9
-T9CSgIe4VuCIdnwaAGAykUt2SoL/QMglRXSWJ0ohSvIpEkMuM0n6WYdVEFZbEgmc
-INnd09sXI9vCLkf76G4ci1/S1lueXS9d3OknPf3aRxKfwPKFm8p4SGPKQieAAI7G
-LI8dCQhWWIyCO4PG7hPNp2I7Aj03jNpVrojZ4kG6BlJIrELpXoMm+755KVez0QfH
-6qW7a+YGQPMfq8goZfot6FJ6OmWwOuPchdL8pjmnZ+xgpI1MAx7tBTvxnfFags9L
-cJZn5/epsj9GSx34RkprA7u1D55Z15+btmqYFYyXRsacqAlNh8FFdAUY7x3OhHwj
-uPfyXpYibc2XgjQVQOe+eVzyJE5bsSIbHhuiVAO6bVhf1WhsNT+YK0mWhZnLB8yl
+MIIDczCCAlsCAQcwDQYJKoZIhvcNAQELBQAwgYAxHDAaBgNVBAoTE2Z1c2lvbmlu
+dmVudG9yeS5vcmcxJTAjBgNVBAsTHHRlc3QgY2VydGlmaWNhdGlvbiBhdXRob3Jp
+dHkxEDAOBgNVBAMUB3Rlc3RfY2ExJzAlBgkqhkiG9w0BCQEWGHRlc3RAZnVzaW9u
+aW52ZW50b3J5Lm9yZzAeFw0xMTEyMTIxODU1MDRaFw0xMzEyMTExODU1MDRaMH4x
+HDAaBgNVBAoTE2Z1c2lvbmludmVudG9yeS5vcmcxITAfBgNVBAsTGHRydXN0ZWQg
+dGVzdCBjZXJ0aWZpY2F0ZTESMBAGA1UEAxMJbG9jYWxob3N0MScwJQYJKoZIhvcN
+AQkBFhh0ZXN0QGZ1c2lvbmludmVudG9yeS5vcmcwggEiMA0GCSqGSIb3DQEBAQUA
+A4IBDwAwggEKAoIBAQC2++XHLRoopvKUwb6s96UvY+Ww21g/t7lbTE1bjiOKtnGY
+wfwRC2tYPoGo0I2Jzi9s/41sBLe4rc+1pHEFWLycAaUTNgYp04RhwXU0bv5kjWeD
+MWEFBgDGtqBnEYXcQ4bwYcbMxCgkNFvUrCPaNeIR/qT/hBeMWikofURE3HIISxZ5
+oYyOJMzcxMveQ5esR7RkRjwt+UHcFJZUJ8X17p8p2cE6XEGZZLlyT7J6qmU/Bjzd
+BmcGyjN6Y4z80Z9VWIuINv9LlSHPHrCItgofKR/RkOQOXG5F1i7DN6mlyxUBUTpX
+RPO1EH6ZTYfSOkQag1OeV8UDEaKeOnLVQUuFVSUXAgMBAAEwDQYJKoZIhvcNAQEL
+BQADggEBABE3uCthwuDmdiPWn41hXW3YH3PYQHwlJec+Hz0E5WH1a/7Er8yNVbJz
+TGaJJSnBRNI8LJZ61AXu/zLKphbun3C30QgNjx5xfKYOPdxaCI4oZD9MsuHNXZY9
+rijfVrymzh/n1u//QbOOHh52u+d+EviTNRqTQcuBMmrQLIe2JPi4wqZNDLL3NOya
+ZxMLSioSu8LTYhQgCEa/2mhdv037GfUe6rCjEkGY8vG18jAbF503r8KDCJ0U738o
+oPCPq9cCv9crq3wXECh5TpgB1KG/z8wuhGZ0ECMe1zGDESGWN3ZGBJUcTLI1sMqH
+Uh1y/WxMclGp+xP7aYdVvmsu/bwMLGk=
 -----END CERTIFICATE-----
diff --git a/t/ssl/key/ca-rulezlan.pem b/t/ssl/key/ca-rulezlan.pem
deleted file mode 100644
index 7089dd3..0000000
--- a/t/ssl/key/ca-rulezlan.pem
+++ /dev/null
@@ -1,54 +0,0 @@
------BEGIN RSA PRIVATE KEY-----
-Proc-Type: 4,ENCRYPTED
-DEK-Info: DES-EDE3-CBC,763FADE98194F731
-
-82jO0Mx5ffxKd4h7cuMCegx/GHVwKC3TcaqGyh+Xk/nqIB6af33gpRKG3BPzwQNj
-QJUlN3LQ1BgeN0Pfg1UY3hyXBnM8PYJL3XECCj5nCd9FGU3JfZPel7ufCuDoerCd
-KBSsEmAn2watdFaFNLyHxMiy5Mxxl1MdiH596eSrrzVQRtPLgEQVTZYZDnAHQXjN
-lluLmq6BTEfw01C2/rx73tOVA3AkKvE465jhHKx5PSEyoDSKkuvAn8yKOFVabCSF
-mCGANkK9JfgzQyp6Z/CryhQHLndaoUuITjRPBIxFmlh0LQv76xz55naF9+2p+353
-14s+mkfoR3cCCkh9ajMqCcMFVshMpQmJxSyAvw2ZdmkoIlLENBxvGISDKFokojp6
-5ElKfUvDORgiWcMixp6uW218v7OCRyCfIsEoiOoc6liTqPuVt4uIgnH9QqE4gQwA
-vIRlxbV65OO9CF5xkjC6UjVUrFJOsLZwts3V76a3o1sTj10DqAdq78+b9qo5Kl4H
-g9mHFPEYwCz3eXkCv4APb3nANlv7qLaaUREg7DhOw8armAWB/KN5WmBbdWJ1oaSS
-Xflr4jk3RtMyJJcuZosBxDmN0dpEZAQGbqg4CFuDw6qcq9Fj4i1lWvG1M9IHE4YA
-sMsZPZ7Mhx90qak2+o4RSZzH+C0vcgcdGh3zdTZbs2JcFVcX9rbBsXR2TH9sQSug
-UafXKNrb/MpBNME5+Cgr6epWfmywcvym79dM46O+ZI1mDwBUrMpCB/KDk62FzIUp
-EZI9s46S1vUB8/kHWgYjEVEkHV+WqeomHwZisAa0fj9kFtkzbZ60mSAd6/oQLlfT
-SXU7J0LclvezEaksw0DU2mINmbStyF9AFlC5ii+s+dHm+VCn/LjgFkrs3U7AkIXZ
-cLSHGAYRDC9dfwp912szm0YSXj60k1eeT1au4RIWPVi2DwBv+lPNNmnyR4+NhqU6
-VjPBvXrevjT51rutI1B7OgiTacMQDQ+V8viBkIxkXXFLVNqWFo49CmHoS1awJ6Ja
-YLBpFTZ/0TdMihsXhWGH0yc9f5w5TmNNUzlojXWQ9YBvcCe0+4xWSDYb5Au5+lVK
-pkzFHj5ROi/0E2pFS4QYx0z2evVqloVrM5lFnEaQ3f5zo+Xa5OQRG4TsBDae+OKV
-9QehUssRugVHCyjxSohrsVWUqYFHR6pYQOFvFOpp7p+hIKC04q0f1UnGoiWlK17O
-WYr0u71EJvVSBhou9BdaQ1RXdvXxFtyWamxtav0Z2EJGRkNdPDww43kANpWLh65F
-q9uDxRW2rzNPeagUPPpWCvZnOQrdqkdIBtyLaN/TOhtoTX16EL6ZWHRXRP5fOtBR
-9kA1L2CjpTT9X7FJZADaPqoTTWO4F9yxIT46OurMzddNYtc4TuxtSTdEEgf/9AVX
-l09AFgU2EEbakXtK2V9tJ5McDs7ZT3agVlL1m6WND1zFstjGRYOYqtL6YD8yVhbD
-vYguXm540IZ2DqIRb/SD4YTCgG1u0m2bwTZLsg8xH7LcUscQ1puciEK1brvYXmBp
-fKmWQm6EAN6jxZDoaAfxzCQjYqDTyk4urt3m0cfeyhgzbahZXQjb8kRs90WhZJMK
-9cIQWYJMtXjX2dB9fTGkfO1J7+e6AeEHtL5lfP6KF0iyl8T2EV4GJBomiV5kDOlS
-QVdwZz1yX7rHLl4aTHOh9XFsk75+CbNUNp2dzjSYZhocWNaMF/Wd+WhPe/AchXYk
-AwMBKDLPJUWg99HBttntnY+OiDEewqtsbpMmwcp9uZoF0NBnH1/1AkIXZWG+Lats
-MKKGNbAoGCFmTMuD0M+0VhfC9yJOLUdnygntv+hwa6HtAEadSqlKMzfk5VddAbEu
-KpRmsPCx9wzSj98yXfEOjb6BEhfcPc6E6U6trN0RsdkfhIxmWBOidWFaPZgkwGxe
-Xg5MtVTcKQS7BzBA1Ux067D+UCRAe9av2NCRHIoaDUATsiWTeqL8oNFzXWeFB3Ii
-ejkJTNYVHNliRpAFSnkqJeXfZG+0lLFbw+Hf2YVf345+tEn6LmP6wO9zx7Sq2uCU
-IeoInj8Ejcli46afkSPja0s3iTPQDlqVBZHng9o+02P01/2MK5GdGCN9Uf3aMEJ6
-pOhepqio7RwHjr5rw/rtumLipQZGa7h6MfUbvTtPUu91XFiwGCaPsl/ApsS6+gaw
-xU+NY59XCULYiXYJp8U7t/3hAfulTYMBlChcWxb4RRTsSRW7Q9A6mGbZv6VJtPsO
-rRWBr5evRA331j9JdCmCwWn0nSUfWFLX89dHLqsYMC3fqL6A3Nv0SEAWRoaPqO/H
-q97J19+A6kWMea9Rl23sS/OA3L69WZfytTxF5koJnjMZb+un4JRm8c7eeG+KgLKX
-N7EjCXvbHZwD2fMaHm4fb4JsmxJe3vbzUNYvtfPZ7ezECpeORdDfZurZhFsYt4Xd
-WzN07pmvqDK8q+RXnlOYHcf7gdIroQpm6wbXNSU/LyMfEcchNM+R8MxriOdg9t5N
-J4K8U3dyq6+gt5NVAWemAJzrVKbE3Fy7TZBM1Xa0lFo0Qf2g4092qQtuNaFge0xH
-8TNdBDFIpR9AoupDds3tTFhiCAqXWbGsxDIddFfdZKWqUfqrofSC9/JxHp/l+gqU
-Fjk4kwFktpHn7vtfmkgk9o1XA0NpteJHddAI4lf7YfPG1WnvLcbtHDIaic5xF8Hs
-FZ3V+zmjKMYgjeXK9FBCBW1oIwKdG6t0N/bTEOrtztsEWf4c8bgH6mx4XstJa/qF
-sx0AQwxUhvOYrXLjY24OC5Z164O34vOC1hYwE8LCdnGZPExKXtrg+fEHL7oO6yqy
-hkXjksj6nujM+wCbuwBfIrlSRQUm7wPAM4zPzN1I4ISzCsbJNei+PuT3l7n3g++p
-nm8WRcqGyIomQrZLpHuxCfXK00NJlkatbeuW0BA7aHre/sbY7XJKdqdjhtX5qzZv
-GpeRdBrwrytcbR50pNVoJS02AxivKYvCiRAhPH7wj9Btj8afg/54yWz+iaxBDGqv
-tO/fU3hpbhrO/fWzFZKcMwl+7DY2kAjZQMZYD3tBzfKuV7gjDR37u8MH41X+qCVL
-3xkmyud4T920fSyxpKZHiEhVvTyg1fX5O+d/I0Jk/4nW+Cp2v6nOdcrhsnczQ79d
------END RSA PRIVATE KEY-----
diff --git a/t/ssl/key/good-sha256.pem b/t/ssl/key/good-sha256.pem
index ec1aac5..0292542 100644
--- a/t/ssl/key/good-sha256.pem
+++ b/t/ssl/key/good-sha256.pem
@@ -1,51 +1,28 @@
------BEGIN RSA PRIVATE KEY-----
-MIIJKgIBAAKCAgEAz471sgR3jhdeMbgvCDdA3jug6867yTtcVSsPxKEQSkRF+DBC
-iHaeryxFy14c2Uv6xBWeJquJ8ZGd/3RPTJpODyDg2wELqoV4HlTkYQEGdrO347xd
-F9NpBb+yKiNS3n5AkJocXtNUsx66/Bx4pVHDTMXt1K4lrEqHIJblt49HPO5xvzoz
-GR2cwcwpn56PelAYkCCpcOsC1mpL9WLb6E2yh1HFKcO14oG9F43z+4sRTsHJRjpN
-xJAl6woC6qPshm+/zAkyK/N348ECOMcoFIZ+rpCDN+oEQ4k0V535Tb9TKu+ENU0g
-RIyWa5GX1y2aAny5alKOWjS/urkHNJ1yiwWWk8rHC1yFWsR6IaSN+qnkJmS+6LTE
-zAZsDwyJXfxO+pmaDc1le0Mxz1JnEUjoizIPGvfu7FzTGPA76P/01wrKtWSmkUzI
-6ZtFzP8LlDKlSZq6UpWCBYLXBXTJI3LtsXdyglC8dpRRsFkzNjZOCqIr50y6uFIw
-rpp5dN5FNO7sIcmf/dE2Wz0EwzgEBrVqiF8YQON8dQZNYA14inWemhgmXVDFYEOl
-vfVELWSlCymhF8kmSxLNxAOo2GjkempPoNFhJfVLGeqmA3pV8WFAOYzVNw4OO8aL
-kdLY6j8Q1WbMfed6ejoeNykBD8wTorEK3BGQUm9XJ4MWN/XJI7zZNaQAAC0CAwEA
-AQKCAgAahvLv5ZJCHspzIE8iha1MueI/QRTPCz8pw28oek1SsJcguUpHlqGBUe85
-prWZMBTEqt6jopjmvu2qkHryF2aSmGkklGWhTZ2kgsUNgMwKr7145cIgIWzyxyVG
-LW2R8iDeWlP16pyQqATN4/Wna2PClClpXTiDZKMQjzic1TsNlowDHLUbKKW4Pxey
-xtkfkM0S3pnJTL/4F23N1uy0K/n9QX4pcFH2uQ4pzIK6S3PS1QGccCcwUBwIhicJ
-RhoctHuW4DYBWASinzBhgVKmDOpz9RRQOSCCYS7HY/FQ9nryqdoD1e+h0zYGWX1G
-ixV76+TmqdZ3wPYgLzW0i8rv6a7sybQMAqOeh/Bnv9jQhNur7KBCsW1Go+MSSvcg
-VKLLTvf/o2gW70dwll2tQFSd1iqLfVaTAJTqyyl+sb++CeeAKVuDSsCNaapM0SG+
-LUuLuJOxY2GIabz8cRT8WE09dZdcoFSzOIPmzwKEsYBRQK07bwGSqNGSpubRiK/L
-4KZYVSx4SBpwHnkrtWxPpfGxkpF6mD2hHxAWTFA72gl5Euc61rmrkv3FNTrGj70x
-4HbX/Fgjh8wOaBibxEih7ubsoYAydp+3/W7jB8My7r8XK5I2ZcxAYagc6y16D30m
-YDj69m0GlazgZqo9soTAoGAksN6e3ns3jvZQ+edrpfnqm9O/IQKCAQEA7Pr5K0/O
-dmZmu3rdx5O/nUYPToq5wUfVPVpDeb0aAJEckyyY4mTZbdlEkl8cpFGzfuQfi4p6
-Q290dm0GVdfL0NsuSspvkbRk2WDQWtx2BqwoMsMBk8WSBYk2JHAvpvpK3uVUswtD
-R8D0m6aJhrWrgzD5o/FdXOwK1MoRW4NMdSwJXqPIKG/990TrTcxbm144pQbPRT3x
-GS8wJf3TGAFZ3cHoCbK18WRcB6le4D/SkKBo7go1nCjxI2lTUgUEUknWqDTyhPTj
-uFFTAzDVt0NHX8z+LbvZn5FnR0kt1cik5v1WZKATsfwV20zYwdfBax+cNdEbLbwJ
-EYPyC/2ab50hlwKCAQEA4Dd64cFe9lTHX2Y8AfjX+jOsmk7aPf+a8GTLaz79o+/M
-76fRxVfYX9bMCliWFDUpnafDjVAYrp+nS7e+zrKLK8QnZp0oTctm0dhDwAO4zQsr
-4Y58nvLxalDgbjpV9fn7jLIaYqWPdG55t9eWl/Z5hK2i+meOG8PtG8dJN2gR3ECv
-mdrxMCvPUhshsWsWYlG2xS07P+xODj/P2ZzFJ77gyqd23IGSzdanuFB3yfgePx7z
-BEHHANYYwc0eD/Oz9MvhTvnVVF27jQOO52luwXpnPq2dBN5u/edCgq9E3ZDU3QkX
-CXeYed9u6hmUuClp1v8GBd5gIhIOHvCrSnu9v85c2wKCAQEAnDMMm1S+FGKIolho
-6Exlh0ePfUiJCXHMhuUBBrPy+J6tRACoQMkSW4pS3VudqF1Fv4SjmjlLPzmufQR9
-oYVcjSx7BccK5PIPawyaKNmZXeqJkHPijUEzbzyymC/t6NSfFu339w+caCYx1Ipf
-qZADHbThRwMnc8ENnpYV/Mi9U5oUDvJLUwQGVL5zjlL9qpnfIj8rzUr3qI7m4JO+
-WNtDHZza0dGehR6OXmpv48WNh9CDeSr3jRebYajhx3URFSAgQbysgaBcnLfVzIua
-wnGxEN8wRnrEBZ40gdMlR/05XBttn2O3t6Ad0++CC7qnfXFXaE2M6YdAPvBGUUr2
-SU07vwKCAQEAy90l+YYcldTXwkHuZcygc3nwgg0YGi8B7Xl4C3cmn5w1teHctZX9
-woZG11Fcg9sij5ouD5q4Fm5LamkTMFTefVjIimByeOlr/3ingTrhGG4D4/3uCYfT
-QVtv9ElOR2yX74EwxGjMWozoVuPKpTkRnDVUbmEhsNUgDZXRWHNjaePWxglwKuBq
-jLjmla5Ml/C8QeOyb5ioEAStM6t7B3xiX2CMjkmx9T4rGUbw486ZkcLOKxyzmGsR
-74RUxSRMh1Oo9GnsMd1X3gtSL86JSZnFrhOlJPwp5uoSa0h5UQuSv7a4H3+CP62L
-54aC1j+xYC5Yh5V9yvynojIpTHveNzum6QKCAQEAvkQKmVBGKgrMN91O7IN3sWdj
-gU0wctkjHSAWBkGoV+2350AkhORLgVRLv9stFL/am+lghMU+VimzIN4+ZNeK6BFq
-0DHepLkBGgnWWm4zz/uqLOGWPCo+5yS/hIuHt7NxnZorllFGESass6nfBmNfHWa2
-dVj/uvANmPWgLpvWTE7v8CGsSHGBeS67fKg3Qy2acQ+VxxzwvSYB/TrmEmYaLpPT
-JLjAML5V8K+tAlINo8BFlo5w8w0ymvdKbOjJ8Nh4dZLI3SwFawR4qxrW3XiAHvNV
-Ihx+UO2qWbI6RGDIQj204lIcGVk6wFOmxq0f6qVSgyn2v+u9lx+wG0+XDBBbiA==
------END RSA PRIVATE KEY-----
+-----BEGIN PRIVATE KEY-----
+MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC2++XHLRoopvKU
+wb6s96UvY+Ww21g/t7lbTE1bjiOKtnGYwfwRC2tYPoGo0I2Jzi9s/41sBLe4rc+1
+pHEFWLycAaUTNgYp04RhwXU0bv5kjWeDMWEFBgDGtqBnEYXcQ4bwYcbMxCgkNFvU
+rCPaNeIR/qT/hBeMWikofURE3HIISxZ5oYyOJMzcxMveQ5esR7RkRjwt+UHcFJZU
+J8X17p8p2cE6XEGZZLlyT7J6qmU/BjzdBmcGyjN6Y4z80Z9VWIuINv9LlSHPHrCI
+tgofKR/RkOQOXG5F1i7DN6mlyxUBUTpXRPO1EH6ZTYfSOkQag1OeV8UDEaKeOnLV
+QUuFVSUXAgMBAAECggEAUUtAHmkPQhhJlYUt7TJolNFQ7m3EmypIkyMnCxHvAGVl
+unQURI5KNn4upI1jFGIh987hSage51FxAkX4YGO4B6dDa3GI83QhUDzekVjudEXO
+Qx7g95ZfKelhAelrCxyFCq6l37sWCl+onKeNlhhyQ4RaUZqhy50SxAZDGkTF9KCG
+SUb/zoZ67i4VUlAtstxAy6jfrnsDKSmsMu63EchhzKxwYUIBAwfvVuIjw+FacF0d
+NkfS22+n97CB4thM5Jk67DsfuEzxpbhvIKV75cmrlZOCdaybCKguULQiKARQqpzE
+1ux0jL7w5V1RwjWbhggFgDj1HJgA9aOSRBD0WawRwQKBgQDtl9Skw1CnSOL73ihg
+KGMHGVKPqGpMGrVtCYQBH9HTiSbKw/42LE1W1Jx4KdH65ctBwO1VyfTa2I6uuEWP
+tgUwZ+dmREzvdpeHXZo+FUi+HYP1c8zk8v6fQcGcPGHUoF1Z6aa9kzt/tlJg/J/f
+Zia0sL0jLnxMHTfi1+6P0DI0DwKBgQDFKQH3iO+Q+uKXMqrHgh4crQZ+14zn3J7y
+dOxXa06ZbmwEKeM2UvOzzElzBtar9cZGKsor+RwT4ZcGrvOIURbwTZdqJv/M5KAo
+s6HA5W1LYJDRZwub2M9pBbZ1RDcO8ImrSh7U4KHGMMHDM+8IEiDNI5Fe7I8raBrv
+lXlYiorWeQKBgHK/ta+ttTJV/WpvrUhjuRAgpsNDL7N54s26nsp8N7bWsqmTZx96
+3g9lt/xBFmz6tuQW7YlVdLCNjrvLu6zg2Di8tgGqUw4EVMLH7kq1tOA9GRJez0J0
+KY15EK0IbKdonC1kr2c3yLCxua+l0wDuMRtrkK2BMf8AzZD9gPZsMxL5AoGBAJxF
+MZrqvb+zK3BeJ4C0wHtIJVLaNIP+mTlhtYZgtk7kd9chAEepniIPtNPoQrTPvFUX
+S2FpNHkJoHQarUqJw126kl4ABVZ4i/1Wy8mhz2wkYQSo4UmoolUCwyjVZbKAsw3C
+VQez+GWndZzsB/TksX0HSQztAVmNTXRCjIjCXuM5AoGAAZeapd0CVHXmKfST+G81
+m8b4BHW2s+EzLQzOe1Q1H58ESTrz3woglW+WswV2jopZRUAh9WH0hLT+BLyiZMds
+YCtg0yPoT4gdQQhTAue01QoXWEE+pYomxYS1+EnFgbnDuEiAox4aKMcOwlWCYs7c
+sLY1q3YQEJ4fG1GpCXR2HPM=
+-----END PRIVATE KEY-----


================================================================
  Commit: d8fb4d73a791d8794dbd4b68f198b97ea5ab7d6b
      https://github.com/fusinv/fusioninventory-agent/commit/d8fb4d73a791d8794dbd4b68f198b97ea5ab7d6b
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2011-12-15 (Thu, 15 Dec 2011)

  Changed paths:
    M lib/FusionInventory/Agent/Network.pm

  Log Message:
  -----------
  revert 5001036e8ea

The regex changes was wrong. sorry :(
http://blog.gmane.org/gmane.comp.monitoring.fusion-inventory.user

Reported-by: Óscar Beiro <obeiro at construccionescrespo.com>


diff --git a/lib/FusionInventory/Agent/Network.pm b/lib/FusionInventory/Agent/Network.pm
index 96d7513..4d4dfaf 100644
--- a/lib/FusionInventory/Agent/Network.pm
+++ b/lib/FusionInventory/Agent/Network.pm
@@ -365,7 +365,7 @@ sub setSslRemoteHost {
             $re =~ s/:\d+//;
 # Accept SSL cert will hostname with wild-card
 # http://forge.fusioninventory.org/issues/542
-            $re =~ s/^([^\.]+)\.(.+)/($1|\\*)/;
+            $re =~ s/^([^\.]+)/($1|\\*)/;
 # protect some characters, $re will be evaluated as a regex
             $re =~ s/([\-\.])/\\$1/g;
             $ua->default_header('If-SSL-Cert-Subject' => '/CN='.$re.'($|\/)');


================================================================
  Commit: 54c153a918725052b94d2a5b353c56ed6d158850
      https://github.com/fusinv/fusioninventory-agent/commit/54c153a918725052b94d2a5b353c56ed6d158850
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2011-12-15 (Thu, 15 Dec 2011)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Storages.pm

  Log Message:
  -----------
  better parsing regexps


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Storages.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Storages.pm
index 49c91c3..143c637 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Storages.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Storages.pm
@@ -35,23 +35,18 @@ sub _getStorages {
         if (/^(\S+)\s+Soft/) {
             $storage->{NAME} = $1;
         }
-        if (/Product:\s*(.+)/) {
-            my $model = $1;
-            # empty product, we got Revision instead, dropping it
-            $model =~ s/Revision:.*//;
-            $storage->{MODEL} = $model;
-        }
-        if (/Serial No:\s*(\S+)/) {
-            my $serial = $1;
-            $storage->{SERIALNUMBER} = $serial if $serial !~ /^Size/i;
-        }
-        if (/Revision:\s*(\S+)/) {
-            $storage->{FIRMWARE} = $1 unless $1 eq 'Serial';
-        }
-        if (/^Vendor:\s*(\S+)/) {
+        if (/^
+            Vendor:       \s (\S+)          \s+
+            Product:      \s (\S[\w\s-]*\S) \s+
+            Revision:     \s (\S+)          \s+
+            Serial \s No: \s (\S*)
+        /x) {
             $storage->{MANUFACTURER} = $1;
+            $storage->{MODEL} = $2;
+            $storage->{FIRMWARE} = $3;
+            $storage->{SERIALNUMBER} = $4 if $4;
         }
-        if (/<(\d+)\s*bytes/) {
+        if (/<(\d+) bytes/) {
             $storage->{DISKSIZE} = int($1/(1000*1000));
         }
         if(/^Illegal/) { # Last ligne


================================================================
  Commit: 9f611fc44ec9f6d8a989c0406fdd9fe5aa95ca85
      https://github.com/fusinv/fusioninventory-agent/commit/9f611fc44ec9f6d8a989c0406fdd9fe5aa95ca85
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2011-12-15 (Thu, 15 Dec 2011)

  Changed paths:
    M t/inventory/solaris/storages.t

  Log Message:
  -----------
  fix expected results


diff --git a/t/inventory/solaris/storages.t b/t/inventory/solaris/storages.t
index 1177356..e4eeb9b 100755
--- a/t/inventory/solaris/storages.t
+++ b/t/inventory/solaris/storages.t
@@ -15,7 +15,7 @@ my %tests = (
             FIRMWARE     => '5009',
             DESCRIPTION  => 'FW:5009',
             MANUFACTURER => 'HITACHI',
-            MODEL        => 'OPEN-V      -SUN '
+            MODEL        => 'OPEN-V      -SUN'
         },
     ],
     'sample2' => [
@@ -26,7 +26,7 @@ my %tests = (
             DESCRIPTION  => 'S/N:43W14Z080040A34E FW:PQ08',
             MANUFACTURER => 'HITACHI',
             SERIALNUMBER => '43W14Z080040A34E',
-            MODEL        => 'DK32EJ72NSUN72G  '
+            MODEL        => 'DK32EJ72NSUN72G'
         }
     ],
     'sample3-wrong-vendor-product' => [
@@ -36,7 +36,7 @@ my %tests = (
             FIRMWARE     => 'RX02',
             DESCRIPTION  => 'FW:RX02',
             MANUFACTURER => 'Optiarc',
-            MODEL        => 'DVD-ROM DDU810A  '
+            MODEL        => 'DVD-ROM DDU810A'
         },
         {
             NAME         => 'c3t0d0',
@@ -44,7 +44,7 @@ my %tests = (
             FIRMWARE     => '1.11',
             DESCRIPTION  => 'FW:1.11',
             MANUFACTURER => 'INTEL',
-            MODEL        => 'SROMBSASFC       '
+            MODEL        => 'SROMBSASFC'
         },
         {
             NAME         => 'c3t1d0',
@@ -52,7 +52,7 @@ my %tests = (
             FIRMWARE     => '1.11',
             DESCRIPTION  => 'FW:1.11',
             MANUFACTURER => 'INTEL',
-            MODEL        => 'SROMBSASFC       '
+            MODEL        => 'SROMBSASFC'
         },
         {
             NAME         => 'c1t13d0',
@@ -60,7 +60,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c1t14d0',
@@ -68,7 +68,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c2t13d0',
@@ -76,7 +76,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c2t14d0',
@@ -84,7 +84,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c2t15d0',
@@ -92,7 +92,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c2t16d0',
@@ -100,7 +100,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c2t17d0',
@@ -108,7 +108,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c2t18d0',
@@ -116,7 +116,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c2t19d0',
@@ -124,7 +124,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c2t20d0',
@@ -132,7 +132,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c2t21d0',
@@ -140,7 +140,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c2t22d0',
@@ -148,7 +148,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c2t23d0',
@@ -156,7 +156,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c2t24d0',
@@ -164,7 +164,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c2t25d0',
@@ -172,7 +172,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c2t26d0',
@@ -180,7 +180,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c2t27d0',
@@ -188,7 +188,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c2t28d0',
@@ -196,7 +196,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c2t29d0',
@@ -204,7 +204,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c2t30d0',
@@ -212,7 +212,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c2t31d0',
@@ -220,7 +220,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c2t32d0',
@@ -228,7 +228,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c2t33d0',
@@ -236,7 +236,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c2t34d0',
@@ -244,7 +244,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c2t35d0',
@@ -252,7 +252,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c2t36d0',
@@ -260,7 +260,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c2t37d0',
@@ -268,7 +268,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c2t38d0',
@@ -276,7 +276,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c2t39d0',
@@ -284,7 +284,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c2t40d0',
@@ -292,7 +292,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c2t41d0',
@@ -300,7 +300,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c2t42d0',
@@ -308,7 +308,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c2t43d0',
@@ -316,7 +316,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c2t44d0',
@@ -324,7 +324,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c2t45d0',
@@ -332,7 +332,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c2t46d0',
@@ -340,7 +340,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c2t47d0',
@@ -348,7 +348,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c2t48d0',
@@ -356,7 +356,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c2t49d0',
@@ -364,7 +364,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c2t50d0',
@@ -372,7 +372,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c2t51d0',
@@ -380,7 +380,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c2t52d0',
@@ -388,7 +388,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c2t53d0',
@@ -396,7 +396,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c2t54d0',
@@ -404,7 +404,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c2t55d0',
@@ -412,7 +412,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c2t56d0',
@@ -420,7 +420,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c2t57d0',
@@ -428,7 +428,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c2t58d0',
@@ -436,7 +436,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c2t59d0',
@@ -444,7 +444,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c2t60d0',
@@ -452,7 +452,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c2t61d0',
@@ -460,7 +460,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c2t62d0',
@@ -468,7 +468,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c2t63d0',
@@ -476,7 +476,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c2t64d0',
@@ -484,7 +484,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c2t65d0',
@@ -492,7 +492,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c2t66d0',
@@ -500,7 +500,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c2t67d0',
@@ -508,7 +508,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c2t68d0',
@@ -516,7 +516,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c2t69d0',
@@ -524,7 +524,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c2t70d0',
@@ -532,7 +532,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c2t71d0',
@@ -540,7 +540,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c2t72d0',
@@ -548,7 +548,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c6t8d0',
@@ -556,7 +556,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c6t9d0',
@@ -564,7 +564,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c6t10d0',
@@ -572,7 +572,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c6t11d0',
@@ -580,7 +580,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c6t12d0',
@@ -588,7 +588,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c6t13d0',
@@ -596,7 +596,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c11t8d0',
@@ -604,7 +604,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c6t15d0',
@@ -612,7 +612,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c6t16d0',
@@ -620,7 +620,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c6t17d0',
@@ -628,7 +628,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c6t18d0',
@@ -636,7 +636,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c6t19d0',
@@ -644,7 +644,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c6t20d0',
@@ -652,7 +652,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c6t21d0',
@@ -660,7 +660,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c6t22d0',
@@ -668,7 +668,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c6t23d0',
@@ -676,7 +676,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c6t24d0',
@@ -684,7 +684,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c6t25d0',
@@ -692,7 +692,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c6t26d0',
@@ -700,7 +700,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c11t9d0',
@@ -708,7 +708,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c6t28d0',
@@ -716,7 +716,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c6t29d0',
@@ -724,7 +724,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c6t30d0',
@@ -732,7 +732,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c6t31d0',
@@ -740,7 +740,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c6t32d0',
@@ -748,7 +748,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c6t33d0',
@@ -756,7 +756,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c6t34d0',
@@ -764,7 +764,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c6t35d0',
@@ -772,7 +772,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c6t36d0',
@@ -780,7 +780,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c6t37d0',
@@ -788,7 +788,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c6t38d0',
@@ -796,7 +796,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c6t39d0',
@@ -804,7 +804,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c11t10d0',
@@ -812,7 +812,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c6t41d0',
@@ -820,7 +820,7 @@ my %tests = (
             FIRMWARE     => 'XR38',
             DESCRIPTION  => 'FW:XR38',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c6t42d0',
@@ -828,7 +828,7 @@ my %tests = (
             FIRMWARE     => 'XR38',
             DESCRIPTION  => 'FW:XR38',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c6t43d0',
@@ -836,7 +836,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c6t44d0',
@@ -844,7 +844,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c6t45d0',
@@ -852,7 +852,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c6t46d0',
@@ -860,7 +860,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c11t11d0',
@@ -868,7 +868,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c11t12d0',
@@ -876,7 +876,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c11t13d0',
@@ -884,7 +884,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c11t15d0',
@@ -892,7 +892,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c11t16d0',
@@ -900,7 +900,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c11t17d0',
@@ -908,7 +908,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c11t18d0',
@@ -916,7 +916,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c11t19d0',
@@ -924,7 +924,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c11t20d0',
@@ -932,7 +932,7 @@ my %tests = (
             FIRMWARE     => 'XR38',
             DESCRIPTION  => 'FW:XR38',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c11t21d0',
@@ -940,7 +940,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c11t22d0',
@@ -948,7 +948,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c11t23d0',
@@ -956,7 +956,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c11t24d0',
@@ -964,7 +964,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c11t25d0',
@@ -972,7 +972,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c11t26d0',
@@ -980,7 +980,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c11t28d0',
@@ -988,7 +988,7 @@ my %tests = (
             FIRMWARE     => 'XR38',
             DESCRIPTION  => 'FW:XR38',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c11t29d0',
@@ -996,7 +996,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c11t30d0',
@@ -1004,7 +1004,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c11t31d0',
@@ -1012,7 +1012,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c11t32d0',
@@ -1020,7 +1020,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c1t15d0',
@@ -1028,7 +1028,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c1t16d0',
@@ -1036,7 +1036,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c1t17d0',
@@ -1044,7 +1044,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c1t18d0',
@@ -1052,7 +1052,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c1t19d0',
@@ -1060,7 +1060,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c1t20d0',
@@ -1068,7 +1068,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c1t21d0',
@@ -1076,7 +1076,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c1t22d0',
@@ -1084,7 +1084,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c1t23d0',
@@ -1092,7 +1092,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c1t24d0',
@@ -1100,7 +1100,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c1t25d0',
@@ -1108,7 +1108,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c1t26d0',
@@ -1116,7 +1116,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c1t27d0',
@@ -1124,7 +1124,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c1t28d0',
@@ -1132,7 +1132,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c1t29d0',
@@ -1140,7 +1140,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c1t30d0',
@@ -1148,7 +1148,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c1t31d0',
@@ -1156,7 +1156,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c1t32d0',
@@ -1164,7 +1164,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c1t33d0',
@@ -1172,7 +1172,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c1t34d0',
@@ -1180,7 +1180,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c1t35d0',
@@ -1188,7 +1188,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c1t36d0',
@@ -1196,7 +1196,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c1t37d0',
@@ -1204,7 +1204,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c1t38d0',
@@ -1212,7 +1212,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c1t39d0',
@@ -1220,7 +1220,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c1t40d0',
@@ -1228,7 +1228,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c1t71d0',
@@ -1236,7 +1236,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c1t41d0',
@@ -1244,7 +1244,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c1t42d0',
@@ -1252,7 +1252,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c1t43d0',
@@ -1260,7 +1260,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c1t44d0',
@@ -1268,7 +1268,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c1t45d0',
@@ -1276,7 +1276,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c1t46d0',
@@ -1284,7 +1284,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c1t47d0',
@@ -1292,7 +1292,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c1t48d0',
@@ -1300,7 +1300,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c1t49d0',
@@ -1308,7 +1308,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c1t50d0',
@@ -1316,7 +1316,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c1t51d0',
@@ -1324,7 +1324,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c1t52d0',
@@ -1332,7 +1332,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c1t53d0',
@@ -1340,7 +1340,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c1t54d0',
@@ -1348,7 +1348,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c1t55d0',
@@ -1356,7 +1356,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c1t56d0',
@@ -1364,7 +1364,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c1t57d0',
@@ -1372,7 +1372,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c1t58d0',
@@ -1380,7 +1380,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c1t59d0',
@@ -1388,7 +1388,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c1t60d0',
@@ -1396,7 +1396,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c1t61d0',
@@ -1404,7 +1404,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c1t62d0',
@@ -1412,7 +1412,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c1t63d0',
@@ -1420,7 +1420,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c1t64d0',
@@ -1428,7 +1428,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c1t65d0',
@@ -1436,7 +1436,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c1t66d0',
@@ -1444,7 +1444,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c1t67d0',
@@ -1452,7 +1452,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c1t68d0',
@@ -1460,7 +1460,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c1t69d0',
@@ -1468,7 +1468,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c1t70d0',
@@ -1476,7 +1476,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c1t72d0',
@@ -1484,7 +1484,7 @@ my %tests = (
             FIRMWARE     => 'A70M',
             DESCRIPTION  => 'FW:A70M',
             MANUFACTURER => 'Hitachi',
-            MODEL        => 'HUA72101 '
+            MODEL        => 'HUA72101'
         },
         {
             NAME         => 'c11t33d0',
@@ -1492,7 +1492,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c11t34d0',
@@ -1500,7 +1500,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c11t35d0',
@@ -1508,7 +1508,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c11t36d0',
@@ -1516,7 +1516,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c11t37d0',
@@ -1524,7 +1524,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c11t38d0',
@@ -1532,7 +1532,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c11t39d0',
@@ -1540,7 +1540,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c11t41d0',
@@ -1548,7 +1548,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c11t42d0',
@@ -1556,7 +1556,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c11t43d0',
@@ -1564,7 +1564,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c11t44d0',
@@ -1572,7 +1572,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c11t45d0',
@@ -1580,7 +1580,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c11t46d0',
@@ -1588,7 +1588,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c11t47d0',
@@ -1596,7 +1596,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c11t48d0',
@@ -1604,7 +1604,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c11t49d0',
@@ -1612,7 +1612,7 @@ my %tests = (
             FIRMWARE     => 'XQ32',
             DESCRIPTION  => 'FW:XQ32',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310005 '
+            MODEL        => 'ST310005'
         },
         {
             NAME         => 'c11t50d0',
@@ -1620,7 +1620,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c11t51d0',
@@ -1628,7 +1628,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c11t52d0',
@@ -1636,7 +1636,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c11t54d0',
@@ -1644,7 +1644,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c11t55d0',
@@ -1652,7 +1652,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c11t56d0',
@@ -1660,7 +1660,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c11t57d0',
@@ -1668,7 +1668,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c11t58d0',
@@ -1676,7 +1676,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c11t59d0',
@@ -1684,7 +1684,7 @@ my %tests = (
             FIRMWARE     => 'XR3A',
             DESCRIPTION  => 'FW:XR3A',
             MANUFACTURER => 'SEAGATE',
-            MODEL        => 'ST310003 '
+            MODEL        => 'ST310003'
         },
         {
             NAME         => 'c7t0d0',
@@ -1692,7 +1692,7 @@ my %tests = (
             FIRMWARE     => '0.01',
             DESCRIPTION  => 'FW:0.01',
             MANUFACTURER => 'Intel',
-            MODEL        => 'RMM2 VDrive 1 '
+            MODEL        => 'RMM2 VDrive 1'
         },
         {
             NAME         => 'c8t0d0',
@@ -1700,7 +1700,7 @@ my %tests = (
             FIRMWARE     => '0.01',
             DESCRIPTION  => 'FW:0.01',
             MANUFACTURER => 'Intel',
-            MODEL        => 'RMM2 VDrive 2 '
+            MODEL        => 'RMM2 VDrive 2'
         },
         {
             NAME         => 'c10t0d0',
@@ -1708,7 +1708,7 @@ my %tests = (
             FIRMWARE     => '0.01',
             DESCRIPTION  => 'FW:0.01',
             MANUFACTURER => 'Intel',
-            MODEL        => 'RMM2 VDrive 4 '
+            MODEL        => 'RMM2 VDrive 4'
         },
         {
             NAME         => 'c9t0d0',
@@ -1716,7 +1716,7 @@ my %tests = (
             FIRMWARE     => '0.01',
             DESCRIPTION  => 'FW:0.01',
             MANUFACTURER => 'Intel',
-            MODEL        => 'RMM2 VDrive 3 '
+            MODEL        => 'RMM2 VDrive 3'
         }
     ]
 );


================================================================
  Commit: 8b35e839ef7c7ef88671fe352ece25ff1373b1a2
      https://github.com/fusinv/fusioninventory-agent/commit/8b35e839ef7c7ef88671fe352ece25ff1373b1a2
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2011-12-15 (Thu, 15 Dec 2011)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Storages.pm

  Log Message:
  -----------
  use explicit iterator


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Storages.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Storages.pm
index 143c637..ff2fe92 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Storages.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Storages.pm
@@ -31,11 +31,11 @@ sub _getStorages {
     my @storages;
     my $storage;
 
-    while (<$handle>) {
-        if (/^(\S+)\s+Soft/) {
+    while (my $line = <$handle>) {
+        if ($line =~ /^(\S+)\s+Soft/) {
             $storage->{NAME} = $1;
         }
-        if (/^
+        if ($line =~ /^
             Vendor:       \s (\S+)          \s+
             Product:      \s (\S[\w\s-]*\S) \s+
             Revision:     \s (\S+)          \s+
@@ -46,10 +46,10 @@ sub _getStorages {
             $storage->{FIRMWARE} = $3;
             $storage->{SERIALNUMBER} = $4 if $4;
         }
-        if (/<(\d+) bytes/) {
+        if ($line =~ /<(\d+) bytes/) {
             $storage->{DISKSIZE} = int($1/(1000*1000));
         }
-        if(/^Illegal/) { # Last ligne
+        if ($line =~ /^Illegal/) { # Last ligne
 
             ## To be removed when SERIALNUMBER will be supported
             if ($storage->{SERIALNUMBER}) {


================================================================
  Commit: dc4975c7154e27f098279ac39898cef7131f267d
      https://github.com/fusinv/fusioninventory-agent/commit/dc4975c7154e27f098279ac39898cef7131f267d
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2011-12-15 (Thu, 15 Dec 2011)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Storages.pm

  Log Message:
  -----------
  move external command usage out of parsing function


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Storages.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Storages.pm
index ff2fe92..5f2c715 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Storages.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Storages.pm
@@ -15,9 +15,22 @@ sub doInventory {
     my $inventory = $params{inventory};
     my $logger    = $params{logger};
 
-    foreach my $storage (_getStorages(
-            logger => $logger, command => 'iostat -En'
-        )) {
+    my @storages = _getStorages(
+        logger => $logger, command => 'iostat -En'
+    );
+
+    foreach my $storage (@storages) {
+        if (-l "/dev/rdsk/$storage->{NAME}s2") {
+            my $rdisk_path = getFirstLine(
+                command => "ls -l /dev/rdsk/$storage->{NAME}s2"
+            );
+            $storage->{TYPE} =
+                $rdisk_path =~ /->.*scsi_vhci/ ? 'MPxIO' :
+                $rdisk_path =~ /->.*fp@/       ? 'FC'    :
+                $rdisk_path =~ /->.*scsi@/     ? 'SCSI'  :
+                                                 undef   ;
+        }
+
         $inventory->addEntry(section => 'STORAGES', entry => $storage);
     }
 }
@@ -77,16 +90,6 @@ sub _getStorages {
             }
 
 
-            if (-l "/dev/rdsk/$storage->{NAME}s2") {
-                my $rdisk_path = getFirstLine(
-                    command => "ls -l /dev/rdsk/$storage->{NAME}s2"
-                );
-                $storage->{TYPE} =
-                    $rdisk_path =~ /->.*scsi_vhci/ ? 'MPxIO' :
-                    $rdisk_path =~ /->.*fp@/       ? 'FC'    :
-                    $rdisk_path =~ /->.*scsi@/     ? 'SCSI'  :
-                                                     undef   ;
-            }
             push @storages, $storage;
             undef $storage;
         }


================================================================
  Commit: 9523594831f92e961e7c59d7d1c570ff76770a10
      https://github.com/fusinv/fusioninventory-agent/commit/9523594831f92e961e7c59d7d1c570ff76770a10
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2011-12-15 (Thu, 15 Dec 2011)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Storages.pm

  Log Message:
  -----------
  cleanup


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Storages.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Storages.pm
index 5f2c715..172b111 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Storages.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Storages.pm
@@ -81,8 +81,11 @@ sub _getStorages {
 
             if ($storage->{MANUFACTURER}) {
                 ## Workaround for MANUFACTURER == ATA case
-                if (($storage->{MANUFACTURER} eq 'ATA') && $storage->{MODEL} =~ s/^(Hitachi|Seagate|INTEL)\s(\S.*)/$2/i) {
+                if (
+                    $storage->{MANUFACTURER} eq 'ATA' &&
+                    $storage->{MODEL} =~ /^(Hitachi|Seagate|INTEL) (.+)/i) {
                         $storage->{MANUFACTURER} = $1;
+                        $storage->{MODEL} = $2;
                 }
 
                 ## Drop the (R) from the manufacturer string


================================================================
  Commit: 9fbfc038e8fd8ac1598aa8c9a2a1d814325fd2dd
      https://github.com/fusinv/fusioninventory-agent/commit/9fbfc038e8fd8ac1598aa8c9a2a1d814325fd2dd
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2011-12-15 (Thu, 15 Dec 2011)

  Changed paths:
    M Changes
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Bios.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm

  Log Message:
  -----------
  Merge remote-tracking branch 'forge/2.2.x' into 2.2.x


diff --git a/Changes b/Changes
index effd112..1a8eec8 100644
--- a/Changes
+++ b/Changes
@@ -56,6 +56,22 @@ Minor changes:
 * Linux: Use /sbin/ip to get the interface IP addresses (#854)
 * HPUX: don't report unoccupied memory slots
 
+2.1.12  Wed, 14 Dec 2011 13:06:44 +0100
+
+TEST-SUITE
+ ✔ 2.1.10 Test suite fails
+       commit:8035bd
+     http://forge.fusioninventory.org/issues/1161
+   thanks: Remi Collet
+
+WINDOWS
+ ✔ VM System incorrect
+       commit:b59a09
+     http://forge.fusioninventory.org/issues/1391
+   thanks: Mario Gzuk
+ ✔ Fix the CPU detection on Windows 
+   thanks: Anthony Facchin
+
 2.1.12  Wed, 23 Nov 2011 18:14:52 +0100
 
 GENERIC
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Bios.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Bios.pm
index a4575b4..2dca55b 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Bios.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Bios.pm
@@ -82,6 +82,8 @@ sub doInventory {
 
     }
 
+    $bios->{$_} =~ s/\s+$// foreach (keys %bios);
+
     $inventory->setBios($bios);
 
     if (
@@ -92,7 +94,16 @@ sub doInventory {
         $inventory->setHardware ({
             VMSYSTEM => 'VirtualBox'
         });
+    } elsif (
+        ($bios->{BIOSSERIAL} && ($bios->{BIOSSERIAL} =~ /VMware/i))
+         ||
+        ($bios->{SMODEL} && ($bios->{SMODEL} eq 'VirtualBox'))
+       ) {
+        $inventory->setHardware ({
+            VMSYSTEM => 'VMware'
+        });
     }
+
 }
 
 1;
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
index 0fba5f9..c9e9acd 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
@@ -102,6 +102,12 @@ sub doInventory {
         } else {
 	    $interface->{VIRTUALDEV} = $nic->PNPDeviceID =~ /^ROOT/ ? 1 : 0;
         }
+
+        if (defined $nic->AdapterType) {
+            $interface->{TYPE} = $nic->AdapterType;
+            $interface->{TYPE} =~ s/Ethernet.*/Ethernet/;
+        }
+
     }
 
     foreach my $interface (@interfaces) {


================================================================
  Commit: b9afc14d29a65716c17c82a52751fd2800b08fab
      https://github.com/fusinv/fusioninventory-agent/commit/b9afc14d29a65716c17c82a52751fd2800b08fab
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2011-12-15 (Thu, 15 Dec 2011)

  Changed paths:
    M lib/FusionInventory/Agent/HTTP/Client.pm

  Log Message:
  -----------
  cosmetics, and uniform error messages


diff --git a/lib/FusionInventory/Agent/HTTP/Client.pm b/lib/FusionInventory/Agent/HTTP/Client.pm
index 2a3eb72..eb26736 100644
--- a/lib/FusionInventory/Agent/HTTP/Client.pm
+++ b/lib/FusionInventory/Agent/HTTP/Client.pm
@@ -22,23 +22,23 @@ sub new {
         if $params{ca_cert_dir} && ! -d $params{ca_cert_dir};
 
     my $self = {
-        logger         => $params{logger} ||
+        logger       => $params{logger} ||
                           FusionInventory::Agent::Logger->new(),
-        user           => $params{user},
-        password       => $params{password},
-        timeout        => $params{timeout} || 180,
-        ssl_set        => 0,
-        no_ssl_check   => $params{no_ssl_check},
-        ca_cert_dir    => $params{ca_cert_dir},
-        ca_cert_file   => $params{ca_cert_file}
+        user         => $params{user},
+        password     => $params{password},
+        timeout      => $params{timeout} || 180,
+        ssl_set      => 0,
+        no_ssl_check => $params{no_ssl_check},
+        ca_cert_dir  => $params{ca_cert_dir},
+        ca_cert_file => $params{ca_cert_file}
     };
     bless $self, $class;
 
     # create user agent
     $self->{ua} = LWP::UserAgent->new(
-            parse_head => 0, # No need to parse HTML
-            keep_alive => 1,
-            requests_redirectable => ['POST', 'GET', 'HEAD']
+        parse_head => 0, # No need to parse HTML
+        keep_alive => 1,
+        requests_redirectable => ['POST', 'GET', 'HEAD']
     );
 
     if ($params{proxy}) {
@@ -139,8 +139,9 @@ sub _setSSLOptions {
         # certificate hostname
         IO::Socket::SSL->require();
         die
-            "failed to load IO::Socket::SSL" .
-            ", unable to perform SSL certificate validation"
+            "failed to load IO::Socket::SSL, "                 .
+            "unable to perform SSL certificate validation.\n"  .
+            "You can use 'no-ssl-check' option to disable it."
             if $EVAL_ERROR;
 
         if ($LWP::VERSION >= 6) {
@@ -148,13 +149,14 @@ sub _setSSLOptions {
                 if $self->{'ca_cert_file'};
             $self->{ua}->ssl_opts(SSL_ca_path => $self->{'ca_cert_dir'})
                 if $self->{'ca_cert_dir'};
-        } elsif ($IO::Socket::SSL::VERSION < 1.14) {
-            # SSL_verifycn_scheme and SSL_verifycn_name are required
-            die "IO::Socket::SSL $IO::Socket::SSL::VERSION is too old. Version 1.14 is ".
-                "required to do SSL cert validation.\n".
-                " You can use 'no-ssl-check' option ".
-                " if you want to disable the SSL cert check";
         } else {
+            # SSL_verifycn_scheme and SSL_verifycn_name are required
+            die 
+                "IO::Socket::SSL $IO::Socket::SSL::VERSION is too old, "     .
+                "version 1.14 is required for SSL certificate validation.\n" .
+                " You can use 'no-ssl-check' option to disable SSL it."
+                if $IO::Socket::SSL::VERSION < 1.14;
+
             # use a custom HTTPS handler to workaround default LWP5 behaviour
             FusionInventory::Agent::HTTP::Protocol::https->use(
                 ca_cert_file => $self->{'ca_cert_file'},
@@ -162,9 +164,8 @@ sub _setSSLOptions {
             );
             die 
                 "failed to load FusionInventory::Agent::HTTP::Protocol::https" .
-                ", unable to perform SSL certificate validation.\n".
-                " You can use 'no-ssl-check' option ".
-                " if you want to disable the SSL cert check"
+                ", unable to perform SSL certificate validation.\n"            .
+                "You can use 'no-ssl-check' option to disable it."
                 if $EVAL_ERROR;
 
             LWP::Protocol::implementor(


================================================================
  Commit: 578e2ace95dee92157c9a313f2ea11f80d8e198a
      https://github.com/fusinv/fusioninventory-agent/commit/578e2ace95dee92157c9a313f2ea11f80d8e198a
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2011-12-18 (Sun, 18 Dec 2011)

  Changed paths:
    M lib/FusionInventory/Agent/HTTP/Server.pm

  Log Message:
  -----------
  HTTP /deploy: speed up the file lookup


diff --git a/lib/FusionInventory/Agent/HTTP/Server.pm b/lib/FusionInventory/Agent/HTTP/Server.pm
index 44dc263..139744f 100644
--- a/lib/FusionInventory/Agent/HTTP/Server.pm
+++ b/lib/FusionInventory/Agent/HTTP/Server.pm
@@ -148,29 +148,24 @@ sub _handle_deploy {
 
     my $logger = $self->{logger};
 
-    return unless $sha512 =~ /^..(.{6})/;
-    my $name = $1;
-    my $path;
+    return unless $sha512 =~ /^(.)(.)(.{6})/;
+    my $subFilePath = $1.'/'.$2.'/'.$3;
 
-    File::Find->require();
+    File::Glob->require();
     Digest::SHA->require();
 
-    foreach my $target ($self->{scheduler}->getTargets()) {
-        my $shareDir = $target->{storage}->getDirectory()."/deploy/fileparts/shared";
-        next unless -d $shareDir;
-
-        my $wanted = sub {
-            return unless -f $_;
-            return unless basename($_) eq $name;
+    my $path;
+    LOOP: foreach my $target ($self->{scheduler}->getTargets()) {
+        foreach (File::Glob::glob($target->{storage}->getDirectory()."/deploy/fileparts/shared/*")) {
+            next unless -f $_.'/'.$subFilePath;
 
             my $sha = Digest::SHA->new('512');
-            $sha->addfile($File::Find::name, 'b');
-            return unless $sha->hexdigest eq $sha512;
+            $sha->addfile($_.'/'.$subFilePath, 'b');
+            next unless $sha->hexdigest eq $sha512;
 
-            $path = $File::Find::name;
-        };
-        File::Find::find({ wanted => $wanted, no_chdir => 1 }, $shareDir);
-        last if $path;
+            $path = $_.'/'.$subFilePath;
+            last LOOP;
+        }
     }
     if ($path) {
         $logger->debug($log_prefix . "file $sha512 found");


================================================================
  Commit: 89ee7511ba3cd886268a6597eb73900893d2df5a
      https://github.com/fusinv/fusioninventory-agent/commit/89ee7511ba3cd886268a6597eb73900893d2df5a
  Author: Guillaume Rousse <guillomovitch at gmail.com>
  Date:   2011-12-18 (Sun, 18 Dec 2011)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Users.pm

  Log Message:
  -----------
  don't use version-specific options with last


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Users.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Users.pm
index fe84463..8c0817b 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Users.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Users.pm
@@ -41,9 +41,9 @@ sub doInventory {
     }
 
     my ($lastUser, $lastDate);
-    my $last = getFirstLine(command => 'last -R');
+    my $last = getFirstLine(command => 'last');
     if ($last &&
-        $last =~ /^(\S+) \s+ \S+ \s+ (\S+ \s+ \S+ \s+ \S+ \s+ \S+)/x
+        $last =~ /^(\S+) \s+ \S+ \s+ \S+ \s+ (\S+ \s+ \S+ \s+ \S+ \s+ \S+)/x
     ) {
         $lastUser = $1;
         $lastDate = $2;


================================================================
  Commit: 47feefb96d78ee945a97eae2067f4eab7f1df269
      https://github.com/fusinv/fusioninventory-agent/commit/47feefb96d78ee945a97eae2067f4eab7f1df269
  Author: Guillaume Rousse <guillomovitch at gmail.com>
  Date:   2011-12-18 (Sun, 18 Dec 2011)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Softwares.pm

  Log Message:
  -----------
  fix attribute, this is COMMENTS and not DESCRIPTION (fix #1395)


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Softwares.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Softwares.pm
index 6e54649..2ca73af 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Softwares.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Softwares.pm
@@ -39,9 +39,9 @@ sub _getPackagesListFromPkgInfo {
     while (my $line = <$handle>) {
         next unless $line =~ /^(\S+)-(\d+\S*)\s+(.*)/;
         push @packages, {
-            NAME    => $1,
-            VERSION => $2,
-            DESCRIPTION => $3
+            NAME     => $1,
+            VERSION  => $2,
+            COMMENTS => $3
         };
     }
 


================================================================
  Commit: 17308ffc5c6944ae890550444a64b87089c83ab2
      https://github.com/fusinv/fusioninventory-agent/commit/17308ffc5c6944ae890550444a64b87089c83ab2
  Author: Guillaume Rousse <guillomovitch at gmail.com>
  Date:   2011-12-18 (Sun, 18 Dec 2011)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Drives.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Drives.pm
    M lib/FusionInventory/Agent/Tools/Unix.pm

  Log Message:
  -----------
  pass filesystem type explicitely when it can not get computed from df output (fix #1394)


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Drives.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Drives.pm
index 094b7cd..9c64cb7 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Drives.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Drives.pm
@@ -25,8 +25,9 @@ sub doInventory {
     my @filesystems;
     foreach my $type (@types) {
         push @filesystems, getFilesystemsFromDf(
-            logger => $logger,
-            command => "df -P -k -t $type"
+            logger  => $logger,
+            command => "df -P -k -t $type",
+            type    => $type
         );
     }
 
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Drives.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Drives.pm
index 949d020..d798a5e 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Drives.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Drives.pm
@@ -25,8 +25,9 @@ sub doInventory {
     my @filesystems;
     foreach my $type (@types) {
         push @filesystems, getFilesystemsFromDf(
-            logger => $logger,
-            command => "df -P -k -t $type"
+            logger  => $logger,
+            command => "df -P -k -t $type",
+            type    => $type,
         );
     }
 
diff --git a/lib/FusionInventory/Agent/Tools/Unix.pm b/lib/FusionInventory/Agent/Tools/Unix.pm
index 115e1a6..428f54f 100644
--- a/lib/FusionInventory/Agent/Tools/Unix.pm
+++ b/lib/FusionInventory/Agent/Tools/Unix.pm
@@ -146,7 +146,8 @@ sub _parseDhcpLeaseFile {
 }
 
 sub getFilesystemsFromDf {
-    my $handle = getFileHandle(@_);
+    my %params = (@_);
+    my $handle = getFileHandle(%params);
 
     my @filesystems;
     
@@ -161,7 +162,9 @@ sub getFilesystemsFromDf {
         chomp $line;
         my @infos = split(/\s+/, $line);
 
-        # depending of the number of colums, information index change
+        # depending on the df implementation, and how it is called 
+        # the filesystem type may appear as second colum, or be missing
+        # in the second case, it has to be given by caller
         my ($filesystem, $total, $free, $type);
         if ($headers[1] eq 'Type') {
             $filesystem = $infos[1];
@@ -169,6 +172,7 @@ sub getFilesystemsFromDf {
             $free       = $infos[4];
             $type       = $infos[6];
         } else {
+            $filesystem = $params{type},
             $total = $infos[1];
             $free  = $infos[3];
             $type  = $infos[5];


================================================================
  Commit: d3b3c3c36d3b9291296353e915f2922d6e684f5c
      https://github.com/fusinv/fusioninventory-agent/commit/d3b3c3c36d3b9291296353e915f2922d6e684f5c
  Author: Guillaume Rousse <guillomovitch at gmail.com>
  Date:   2011-12-18 (Sun, 18 Dec 2011)

  Changed paths:
    M lib/FusionInventory/Agent/HTTP/Server.pm

  Log Message:
  -----------
  Merge remote branch 'origin/2.2.x' into 2.2.x


diff --git a/lib/FusionInventory/Agent/HTTP/Server.pm b/lib/FusionInventory/Agent/HTTP/Server.pm
index 44dc263..139744f 100644
--- a/lib/FusionInventory/Agent/HTTP/Server.pm
+++ b/lib/FusionInventory/Agent/HTTP/Server.pm
@@ -148,29 +148,24 @@ sub _handle_deploy {
 
     my $logger = $self->{logger};
 
-    return unless $sha512 =~ /^..(.{6})/;
-    my $name = $1;
-    my $path;
+    return unless $sha512 =~ /^(.)(.)(.{6})/;
+    my $subFilePath = $1.'/'.$2.'/'.$3;
 
-    File::Find->require();
+    File::Glob->require();
     Digest::SHA->require();
 
-    foreach my $target ($self->{scheduler}->getTargets()) {
-        my $shareDir = $target->{storage}->getDirectory()."/deploy/fileparts/shared";
-        next unless -d $shareDir;
-
-        my $wanted = sub {
-            return unless -f $_;
-            return unless basename($_) eq $name;
+    my $path;
+    LOOP: foreach my $target ($self->{scheduler}->getTargets()) {
+        foreach (File::Glob::glob($target->{storage}->getDirectory()."/deploy/fileparts/shared/*")) {
+            next unless -f $_.'/'.$subFilePath;
 
             my $sha = Digest::SHA->new('512');
-            $sha->addfile($File::Find::name, 'b');
-            return unless $sha->hexdigest eq $sha512;
+            $sha->addfile($_.'/'.$subFilePath, 'b');
+            next unless $sha->hexdigest eq $sha512;
 
-            $path = $File::Find::name;
-        };
-        File::Find::find({ wanted => $wanted, no_chdir => 1 }, $shareDir);
-        last if $path;
+            $path = $_.'/'.$subFilePath;
+            last LOOP;
+        }
     }
     if ($path) {
         $logger->debug($log_prefix . "file $sha512 found");


================================================================
  Commit: 331f2de03b4dd97c1a7eafaa3a5b5dd3b0c6b8cd
      https://github.com/fusinv/fusioninventory-agent/commit/331f2de03b4dd97c1a7eafaa3a5b5dd3b0c6b8cd
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2011-12-19 (Mon, 19 Dec 2011)

  Changed paths:
    M lib/FusionInventory/Agent/HTTP/Client.pm

  Log Message:
  -----------
  verify_hostname => 0 may also by required with LWP5

LWP5 + IO::Socket::SSL require the verify_hostname => 0 too,
to avoid breakage, we run it in an eval()


diff --git a/lib/FusionInventory/Agent/HTTP/Client.pm b/lib/FusionInventory/Agent/HTTP/Client.pm
index 2a3eb72..ef08294 100644
--- a/lib/FusionInventory/Agent/HTTP/Client.pm
+++ b/lib/FusionInventory/Agent/HTTP/Client.pm
@@ -129,10 +129,10 @@ sub _setSSLOptions {
 
     # SSL handling
     if ($self->{'no_ssl_check'}) {
-        if ($LWP::VERSION >= 6) {
-            # LWP6 default behavior is to check the SSL hostname
-            $self->{ua}->ssl_opts(verify_hostname => 0);
-        }
+# IO::Socket::SSL default behavior is to check the SSL hostname
+# We run it in a eval to avoid break if the ssl_opts doesn't work on some
+# old LWP
+       eval { $self->{ua}->ssl_opts(verify_hostname => 0); }
     } else {
         # only IO::Socket::SSL can perform full server certificate validation,
         # Net::SSL is only able to check certification authority, and not


================================================================
  Commit: 614bafad8cde5af1d0e08f88196c99db939077f7
      https://github.com/fusinv/fusioninventory-agent/commit/614bafad8cde5af1d0e08f88196c99db939077f7
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2011-12-20 (Tue, 20 Dec 2011)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Dmidecode/Battery.pm

  Log Message:
  -----------
  avoid a warning if there is no batterie

closes: #1402

Reported-by: David Durieux <d.durieux at siprossii.com>


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Dmidecode/Battery.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Dmidecode/Battery.pm
index a3c0ef6..dc55899 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Dmidecode/Battery.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Dmidecode/Battery.pm
@@ -18,6 +18,8 @@ sub doInventory {
 
     my $battery = _getBattery(logger => $logger);
 
+    return unless $battery;
+
     $inventory->addEntry(
         section => 'BATTERIES',
         entry   => $battery


================================================================
  Commit: 5e9ddf1789eb3a09265f3c179e68beab8d7d0775
      https://github.com/fusinv/fusioninventory-agent/commit/5e9ddf1789eb3a09265f3c179e68beab8d7d0775
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2011-12-20 (Tue, 20 Dec 2011)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm

  Log Message:
  -----------
  fix: missing monitor on Windows

closes: #1400

Reported-by: David Durieux <d.durieux at siprossii.com>


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
index 71f1606..23ed66d 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
@@ -105,17 +105,19 @@ sub _getScreensFromWindows {
     }
 
 # The generic Win32_DesktopMonitor class, the second screen will be missing
-    foreach my $objItem (getWmiProperties('Win32_DesktopMonitor', qw/
+    foreach my $object (FusionInventory::Agent::Tools::Win32::getWmiObjects(
+                class => 'Win32_DesktopMonitor',
+                properties => [ qw/
                 Caption MonitorManufacturer MonitorType PNPDeviceID
-                /)) {
+                / ] )) {
 
 
-        next unless $objItem->{"Availability"};
-        next unless $objItem->{"PNPDeviceID"};
-        next unless $objItem->{"Availability"} == 3;
-        my $name = $objItem->{"Caption"};
+        next unless $object->{"Availability"};
+        next unless $object->{"PNPDeviceID"};
+        next unless $object->{"Availability"} == 3;
+        my $name = $object->{"Caption"};
 
-        $devices->{lc($objItem->{"PNPDeviceID"})} = { name => $name, type => $objItem->{MonitorType}, manufacturer => $objItem->{MonitorManufacturer}, caption => $objItem->{Caption} };
+        $devices->{lc($object->{"PNPDeviceID"})} = { name => $name, type => $object->{MonitorType}, manufacturer => $object->{MonitorManufacturer}, caption => $object->{Caption} };
 
     }
 


================================================================
  Commit: 008d4a0b6e89002314dfbe5bd123cfbca8724922
      https://github.com/fusinv/fusioninventory-agent/commit/008d4a0b6e89002314dfbe5bd123cfbca8724922
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2011-12-20 (Tue, 20 Dec 2011)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Bios.pm

  Log Message:
  -----------
  bios: avoid a warning if a key is undef


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Bios.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Bios.pm
index 2dca55b..b8e2f95 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Bios.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Bios.pm
@@ -82,7 +82,9 @@ sub doInventory {
 
     }
 
-    $bios->{$_} =~ s/\s+$// foreach (keys %bios);
+    foreach (keys %$bios) {
+        $bios->{$_} =~ s/\s+$// if $bios->{$_};
+    }
 
     $inventory->setBios($bios);
 


================================================================
  Commit: 096cc919ed0f7c3429c6629cb996362a5a022865
      https://github.com/fusinv/fusioninventory-agent/commit/096cc919ed0f7c3429c6629cb996362a5a022865
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2011-12-20 (Tue, 20 Dec 2011)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/AntiVirus.pm

  Log Message:
  -----------
  avoid a warning


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/AntiVirus.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/AntiVirus.pm
index 0d12f8c..ebcdbeb 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/AntiVirus.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/AntiVirus.pm
@@ -51,7 +51,7 @@ sub doInventory {
             }
 
             # avoid duplicates
-            next if $seen->{$antivirus->{NAME}}->{$antivirus->{VERSION}}++;
+            next if $seen->{$antivirus->{NAME}}->{$antivirus->{VERSION}||'_undef_'}++;
 
             $inventory->addEntry(
                 section => 'ANTIVIRUS',


================================================================
  Commit: 0c812544694849ff24b59ee6e8500eebd5fa3568
      https://github.com/fusinv/fusioninventory-agent/commit/0c812544694849ff24b59ee6e8500eebd5fa3568
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2011-12-20 (Tue, 20 Dec 2011)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm

  Log Message:
  -----------
  avoid a warning if software version is undef


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm
index 25656db..64651a0 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm
@@ -133,7 +133,7 @@ sub _getSoftwares {
         $software->{VERSION} =~ s/[\000-\037].*// if $software->{VERSION};
 
         # avoid duplicates
-        next if $seen->{$software->{NAME}}->{$software->{VERSION}}++;
+        next if $seen->{$software->{NAME}}->{$software->{VERSION} || '_undef_'}++;
 
         push @softwares, $software;
     }


================================================================
  Commit: 919f0831f1a98f4cfa2e2e4611f3d05bb5bff0c9
      https://github.com/fusinv/fusioninventory-agent/commit/919f0831f1a98f4cfa2e2e4611f3d05bb5bff0c9
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2011-12-20 (Tue, 20 Dec 2011)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/CPU.pm

  Log Message:
  -----------
  fix: use dmidecode to collect CPU information

closes: #1398

Reported-by: David Durieux <d.durieux at siprossii.com>


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/CPU.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/CPU.pm
index 0a38bab..a086573 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/CPU.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/CPU.pm
@@ -32,6 +32,8 @@ sub doInventory {
     my $id;
     my $speed;
 
+    my @dmidecodeCpu = getCpusFromDmidecode();
+
     my $vmsystem;
 
     my $cpuId = 0;
@@ -49,12 +51,15 @@ sub doInventory {
         );
 
 #        my $cache = $object->{L2CacheSize}+$object->{L3CacheSize};
-        my $core = $object->{NumberOfCores};
+        my $core = $dmidecodeCpu[$cpuId]->{CORE} || $object->{NumberOfCores};
+        my $thread = $dmidecodeCpu[$cpuId]->{THREAD};
         my $description = $info->{Identifier};
         my $name = $info->{ProcessorNameString};
         my $manufacturer = $info->{VendorIdentifier};
-        my $id = $object->{ProcessorId};
-        my $speed = $object->{MaxClockSpeed};
+        my $id = $dmidecodeCpu[$cpuId]->{ID} || $object->{ProcessorId};
+        my $speed = $dmidecodeCpu[$cpuId]->{SPEED} || $object->{MaxClockSpeed};
+        my $serial = $dmidecodeCpu[$cpuId]->{SERIAL};
+
 
         # Some information are missing on Win2000
         if (!$name) {
@@ -93,6 +98,7 @@ sub doInventory {
             section => 'CPUS',
             entry   => {
                 CORE         => $core,
+                THREAD       => $thread,
                 DESCRIPTION  => $description,
                 NAME         => $name,
                 MANUFACTURER => $manufacturer,


================================================================
  Commit: f5d8222211bbf1c8cf308b6cc709e97bc33132ed
      https://github.com/fusinv/fusioninventory-agent/commit/f5d8222211bbf1c8cf308b6cc709e97bc33132ed
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2011-12-20 (Tue, 20 Dec 2011)

  Changed paths:
    M lib/FusionInventory/Agent/HTTP/Client.pm
    M lib/FusionInventory/Agent/HTTP/Server.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Drives.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Softwares.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Dmidecode/Battery.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Users.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Drives.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/AntiVirus.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Bios.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/CPU.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm
    M lib/FusionInventory/Agent/Tools/Unix.pm

  Log Message:
  -----------
  Merge remote-tracking branch 'forge/2.2.x' into 2.2.x


diff --git a/lib/FusionInventory/Agent/HTTP/Client.pm b/lib/FusionInventory/Agent/HTTP/Client.pm
index eb26736..bd782a8 100644
--- a/lib/FusionInventory/Agent/HTTP/Client.pm
+++ b/lib/FusionInventory/Agent/HTTP/Client.pm
@@ -129,10 +129,10 @@ sub _setSSLOptions {
 
     # SSL handling
     if ($self->{'no_ssl_check'}) {
-        if ($LWP::VERSION >= 6) {
-            # LWP6 default behavior is to check the SSL hostname
-            $self->{ua}->ssl_opts(verify_hostname => 0);
-        }
+# IO::Socket::SSL default behavior is to check the SSL hostname
+# We run it in a eval to avoid break if the ssl_opts doesn't work on some
+# old LWP
+       eval { $self->{ua}->ssl_opts(verify_hostname => 0); }
     } else {
         # only IO::Socket::SSL can perform full server certificate validation,
         # Net::SSL is only able to check certification authority, and not
diff --git a/lib/FusionInventory/Agent/HTTP/Server.pm b/lib/FusionInventory/Agent/HTTP/Server.pm
index 44dc263..139744f 100644
--- a/lib/FusionInventory/Agent/HTTP/Server.pm
+++ b/lib/FusionInventory/Agent/HTTP/Server.pm
@@ -148,29 +148,24 @@ sub _handle_deploy {
 
     my $logger = $self->{logger};
 
-    return unless $sha512 =~ /^..(.{6})/;
-    my $name = $1;
-    my $path;
+    return unless $sha512 =~ /^(.)(.)(.{6})/;
+    my $subFilePath = $1.'/'.$2.'/'.$3;
 
-    File::Find->require();
+    File::Glob->require();
     Digest::SHA->require();
 
-    foreach my $target ($self->{scheduler}->getTargets()) {
-        my $shareDir = $target->{storage}->getDirectory()."/deploy/fileparts/shared";
-        next unless -d $shareDir;
-
-        my $wanted = sub {
-            return unless -f $_;
-            return unless basename($_) eq $name;
+    my $path;
+    LOOP: foreach my $target ($self->{scheduler}->getTargets()) {
+        foreach (File::Glob::glob($target->{storage}->getDirectory()."/deploy/fileparts/shared/*")) {
+            next unless -f $_.'/'.$subFilePath;
 
             my $sha = Digest::SHA->new('512');
-            $sha->addfile($File::Find::name, 'b');
-            return unless $sha->hexdigest eq $sha512;
+            $sha->addfile($_.'/'.$subFilePath, 'b');
+            next unless $sha->hexdigest eq $sha512;
 
-            $path = $File::Find::name;
-        };
-        File::Find::find({ wanted => $wanted, no_chdir => 1 }, $shareDir);
-        last if $path;
+            $path = $_.'/'.$subFilePath;
+            last LOOP;
+        }
     }
     if ($path) {
         $logger->debug($log_prefix . "file $sha512 found");
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Drives.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Drives.pm
index 094b7cd..9c64cb7 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Drives.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Drives.pm
@@ -25,8 +25,9 @@ sub doInventory {
     my @filesystems;
     foreach my $type (@types) {
         push @filesystems, getFilesystemsFromDf(
-            logger => $logger,
-            command => "df -P -k -t $type"
+            logger  => $logger,
+            command => "df -P -k -t $type",
+            type    => $type
         );
     }
 
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Softwares.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Softwares.pm
index 6e54649..2ca73af 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Softwares.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Softwares.pm
@@ -39,9 +39,9 @@ sub _getPackagesListFromPkgInfo {
     while (my $line = <$handle>) {
         next unless $line =~ /^(\S+)-(\d+\S*)\s+(.*)/;
         push @packages, {
-            NAME    => $1,
-            VERSION => $2,
-            DESCRIPTION => $3
+            NAME     => $1,
+            VERSION  => $2,
+            COMMENTS => $3
         };
     }
 
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Dmidecode/Battery.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Dmidecode/Battery.pm
index a3c0ef6..dc55899 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Dmidecode/Battery.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Dmidecode/Battery.pm
@@ -18,6 +18,8 @@ sub doInventory {
 
     my $battery = _getBattery(logger => $logger);
 
+    return unless $battery;
+
     $inventory->addEntry(
         section => 'BATTERIES',
         entry   => $battery
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
index 71f1606..23ed66d 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
@@ -105,17 +105,19 @@ sub _getScreensFromWindows {
     }
 
 # The generic Win32_DesktopMonitor class, the second screen will be missing
-    foreach my $objItem (getWmiProperties('Win32_DesktopMonitor', qw/
+    foreach my $object (FusionInventory::Agent::Tools::Win32::getWmiObjects(
+                class => 'Win32_DesktopMonitor',
+                properties => [ qw/
                 Caption MonitorManufacturer MonitorType PNPDeviceID
-                /)) {
+                / ] )) {
 
 
-        next unless $objItem->{"Availability"};
-        next unless $objItem->{"PNPDeviceID"};
-        next unless $objItem->{"Availability"} == 3;
-        my $name = $objItem->{"Caption"};
+        next unless $object->{"Availability"};
+        next unless $object->{"PNPDeviceID"};
+        next unless $object->{"Availability"} == 3;
+        my $name = $object->{"Caption"};
 
-        $devices->{lc($objItem->{"PNPDeviceID"})} = { name => $name, type => $objItem->{MonitorType}, manufacturer => $objItem->{MonitorManufacturer}, caption => $objItem->{Caption} };
+        $devices->{lc($object->{"PNPDeviceID"})} = { name => $name, type => $object->{MonitorType}, manufacturer => $object->{MonitorManufacturer}, caption => $object->{Caption} };
 
     }
 
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Users.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Users.pm
index fe84463..8c0817b 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Users.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Users.pm
@@ -41,9 +41,9 @@ sub doInventory {
     }
 
     my ($lastUser, $lastDate);
-    my $last = getFirstLine(command => 'last -R');
+    my $last = getFirstLine(command => 'last');
     if ($last &&
-        $last =~ /^(\S+) \s+ \S+ \s+ (\S+ \s+ \S+ \s+ \S+ \s+ \S+)/x
+        $last =~ /^(\S+) \s+ \S+ \s+ \S+ \s+ (\S+ \s+ \S+ \s+ \S+ \s+ \S+)/x
     ) {
         $lastUser = $1;
         $lastDate = $2;
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Drives.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Drives.pm
index 949d020..d798a5e 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Drives.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Drives.pm
@@ -25,8 +25,9 @@ sub doInventory {
     my @filesystems;
     foreach my $type (@types) {
         push @filesystems, getFilesystemsFromDf(
-            logger => $logger,
-            command => "df -P -k -t $type"
+            logger  => $logger,
+            command => "df -P -k -t $type",
+            type    => $type,
         );
     }
 
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/AntiVirus.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/AntiVirus.pm
index 0d12f8c..ebcdbeb 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/AntiVirus.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/AntiVirus.pm
@@ -51,7 +51,7 @@ sub doInventory {
             }
 
             # avoid duplicates
-            next if $seen->{$antivirus->{NAME}}->{$antivirus->{VERSION}}++;
+            next if $seen->{$antivirus->{NAME}}->{$antivirus->{VERSION}||'_undef_'}++;
 
             $inventory->addEntry(
                 section => 'ANTIVIRUS',
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Bios.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Bios.pm
index 2dca55b..b8e2f95 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Bios.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Bios.pm
@@ -82,7 +82,9 @@ sub doInventory {
 
     }
 
-    $bios->{$_} =~ s/\s+$// foreach (keys %bios);
+    foreach (keys %$bios) {
+        $bios->{$_} =~ s/\s+$// if $bios->{$_};
+    }
 
     $inventory->setBios($bios);
 
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/CPU.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/CPU.pm
index 0a38bab..a086573 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/CPU.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/CPU.pm
@@ -32,6 +32,8 @@ sub doInventory {
     my $id;
     my $speed;
 
+    my @dmidecodeCpu = getCpusFromDmidecode();
+
     my $vmsystem;
 
     my $cpuId = 0;
@@ -49,12 +51,15 @@ sub doInventory {
         );
 
 #        my $cache = $object->{L2CacheSize}+$object->{L3CacheSize};
-        my $core = $object->{NumberOfCores};
+        my $core = $dmidecodeCpu[$cpuId]->{CORE} || $object->{NumberOfCores};
+        my $thread = $dmidecodeCpu[$cpuId]->{THREAD};
         my $description = $info->{Identifier};
         my $name = $info->{ProcessorNameString};
         my $manufacturer = $info->{VendorIdentifier};
-        my $id = $object->{ProcessorId};
-        my $speed = $object->{MaxClockSpeed};
+        my $id = $dmidecodeCpu[$cpuId]->{ID} || $object->{ProcessorId};
+        my $speed = $dmidecodeCpu[$cpuId]->{SPEED} || $object->{MaxClockSpeed};
+        my $serial = $dmidecodeCpu[$cpuId]->{SERIAL};
+
 
         # Some information are missing on Win2000
         if (!$name) {
@@ -93,6 +98,7 @@ sub doInventory {
             section => 'CPUS',
             entry   => {
                 CORE         => $core,
+                THREAD       => $thread,
                 DESCRIPTION  => $description,
                 NAME         => $name,
                 MANUFACTURER => $manufacturer,
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm
index 25656db..64651a0 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm
@@ -133,7 +133,7 @@ sub _getSoftwares {
         $software->{VERSION} =~ s/[\000-\037].*// if $software->{VERSION};
 
         # avoid duplicates
-        next if $seen->{$software->{NAME}}->{$software->{VERSION}}++;
+        next if $seen->{$software->{NAME}}->{$software->{VERSION} || '_undef_'}++;
 
         push @softwares, $software;
     }
diff --git a/lib/FusionInventory/Agent/Tools/Unix.pm b/lib/FusionInventory/Agent/Tools/Unix.pm
index 115e1a6..428f54f 100644
--- a/lib/FusionInventory/Agent/Tools/Unix.pm
+++ b/lib/FusionInventory/Agent/Tools/Unix.pm
@@ -146,7 +146,8 @@ sub _parseDhcpLeaseFile {
 }
 
 sub getFilesystemsFromDf {
-    my $handle = getFileHandle(@_);
+    my %params = (@_);
+    my $handle = getFileHandle(%params);
 
     my @filesystems;
     
@@ -161,7 +162,9 @@ sub getFilesystemsFromDf {
         chomp $line;
         my @infos = split(/\s+/, $line);
 
-        # depending of the number of colums, information index change
+        # depending on the df implementation, and how it is called 
+        # the filesystem type may appear as second colum, or be missing
+        # in the second case, it has to be given by caller
         my ($filesystem, $total, $free, $type);
         if ($headers[1] eq 'Type') {
             $filesystem = $infos[1];
@@ -169,6 +172,7 @@ sub getFilesystemsFromDf {
             $free       = $infos[4];
             $type       = $infos[6];
         } else {
+            $filesystem = $params{type},
             $total = $infos[1];
             $free  = $infos[3];
             $type  = $infos[5];


================================================================
  Commit: 9f345fc20bd966a4a7094394ce482bbbe6d5373e
      https://github.com/fusinv/fusioninventory-agent/commit/9f345fc20bd966a4a7094394ce482bbbe6d5373e
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2011-12-21 (Wed, 21 Dec 2011)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Uptime.pm

  Log Message:
  -----------
  no need to actually run sysctl to consider it usable


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Uptime.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Uptime.pm
index 1b5e7ad..120f99b 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Uptime.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Uptime.pm
@@ -6,8 +6,7 @@ use warnings;
 use FusionInventory::Agent::Tools;
 
 sub isEnabled {
-    my $boottime = getFirstLine(command => 'sysctl -n kern.boottime');
-    return $boottime;
+    return canRun('sysctl');
 }
 
 sub doInventory {


================================================================
  Commit: d7dfd63b2e77a3d97f5052df8d7cf6f332f34166
      https://github.com/fusinv/fusioninventory-agent/commit/d7dfd63b2e77a3d97f5052df8d7cf6f332f34166
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2011-12-21 (Wed, 21 Dec 2011)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Uptime.pm

  Log Message:
  -----------
  honours BSD-specific output formats (fix #1215)


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Uptime.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Uptime.pm
index 120f99b..601b062 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Uptime.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Uptime.pm
@@ -22,10 +22,13 @@ sub doInventory {
 }
 
 sub _getUptime {
-    my $boottime = getFirstMatch(
-        pattern => qr/sec\s*=\s*(\d+)/,
-        @_,
-    );
+    my $line = getFirstLine(@_);
+
+    # the output of 'sysctl -n kern.boottime' differs between BSD flavours
+    my $boottime = 
+        $line =~ /^(\d+)/      ? $1 : # OpenBSD format
+        $line =~ /sec = (\d+)/ ? $1 : # FreeBSD format
+        undef;
     return unless $boottime;
 
     my $uptime = $boottime - time();


================================================================
  Commit: eb69507838484ec5b211c45d91c628dbf3a961a5
      https://github.com/fusinv/fusioninventory-agent/commit/eb69507838484ec5b211c45d91c628dbf3a961a5
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2011-12-22 (Thu, 22 Dec 2011)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Networks.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Storages/Adaptec.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Slots.pm

  Log Message:
  -----------
  use explicit iterator


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Networks.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Networks.pm
index 8469882..de317fe 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Networks.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Networks.pm
@@ -141,9 +141,9 @@ sub _getUevent {
     return unless $handle;
 
     my ($driver, $pcislot);
-    while (<$handle>) {
-        $driver = $1 if /^DRIVER=(\S+)/;
-        $pcislot = $1 if /^PCI_SLOT_NAME=(\S+)/;
+    while (my $line = <$handle>) {
+        $driver = $1 if $line =~ /^DRIVER=(\S+)/;
+        $pcislot = $1 if $line =~ /^PCI_SLOT_NAME=(\S+)/;
     }
     close $handle;
 
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Storages/Adaptec.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Storages/Adaptec.pm
index 355d48a..f171fc4 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Storages/Adaptec.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Storages/Adaptec.pm
@@ -56,8 +56,8 @@ sub _getDisksFromProc {
     my $disk;
 
     my $count = -1;
-    while (<$handle>) {
-        if (/^Host: (\w+)/) {
+    while (my $line = <$handle>) {
+        if ($line =~ /^Host: (\w+)/) {
             $count++;
             if ($1 eq $params{controller}) {
                 # that's the controller we're looking for
@@ -72,7 +72,7 @@ sub _getDisksFromProc {
             }
         }
 
-        if (/Model:\s(\S+).*Rev:\s(\S+)/) {
+        if ($line =~ /Model:\s(\S+).*Rev:\s(\S+)/) {
             next unless $disk;
             $disk->{MODEL}    = $1;
             $disk->{FIRMWARE} = $2;
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Slots.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Slots.pm
index d50ec28..91a3aa0 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Slots.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Slots.pm
@@ -42,9 +42,9 @@ sub _getSlots4 {
 
     my @slots;
 
-    while (<$handle>) {
-        next unless /pci/;
-        my @pci = split(/ +/);
+    while (my $line = <$handle>) {
+        next unless $line =~ /pci/;
+        my @pci = split(/ +/, $line);
         push @slots, {
             DESCRIPTION => $pci[0] . " (" . $pci[1] . ")",
             DESIGNATION => $pci[3],


================================================================
  Commit: 9cf276e5ec889620fd562bfa8412a2f711c1dec1
      https://github.com/fusinv/fusioninventory-agent/commit/9cf276e5ec889620fd562bfa8412a2f711c1dec1
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2011-12-28 (Wed, 28 Dec 2011)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Distro/LSB.pm

  Log Message:
  -----------
  run lsb_release only once


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Distro/LSB.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Distro/LSB.pm
index 604a0a5..4792d11 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Distro/LSB.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Distro/LSB.pm
@@ -15,31 +15,30 @@ sub doInventory {
     my $inventory = $params{inventory};
     my $logger    = $params{logger};
 
-    my $release = getFirstMatch(
+    my $handle = getFileHandle(
         logger  => $logger,
-        command => 'lsb_release -d',
-        pattern => qr/Description:\s+(.+)/
+        command => 'lsb_release -a',
     );
 
-    # See: #1262
-    $release =~ s/^Enterprise Linux Enterprise Linux/Oracle Linux/;
-
-    my $linuxDistributionName;
-    my $linuxDistributionVersion;
-    # Redirect stderr to /dev/null to avoid "No LSB modules are available" message
-    foreach (`lsb_release -a 2> /dev/null`) {
-        $linuxDistributionName    = $1 if /Distributor ID:\s+(.+)/;
-        $linuxDistributionVersion = $1 if /Release:\s+(.+)/;
+    my ($name, $version, $description);
+    while (my $line = <$handle>) {
+        $name        = $1 if $line =~ /^Distributor ID:\s+(.+)/;
+        $version     = $1 if $line =~ /^Release:\s+(.+)/;
+        $description = $1 if $line =~ /^Description:\s+(.+)/;
     }
+    close $handle;
+
+    # See: #1262
+    $description =~ s/^Enterprise Linux Enterprise Linux/Oracle Linux/;
 
     $inventory->setHardware({
-        OSNAME     => $release,
+        OSNAME => $description,
     });
 
     $inventory->setOperatingSystem({
-        NAME                 => $linuxDistributionName,
-        VERSION              => $linuxDistributionVersion,
-        FULL_NAME            => $release
+        NAME      => $name,
+        VERSION   => $version,
+        FULL_NAME => $description
     });
 
 }


================================================================
  Commit: cc231cb993ad6ff00b427004e36562ad5beb85e7
      https://github.com/fusinv/fusioninventory-agent/commit/cc231cb993ad6ff00b427004e36562ad5beb85e7
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-01-02 (Mon, 02 Jan 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm

  Log Message:
  -----------
  cosmetics (indendation)


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
index 23ed66d..37f107b 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
@@ -77,10 +77,10 @@ sub _getScreensFromWindows {
         require FusionInventory::Agent::Tools::Win32;
         require Win32::TieRegistry;
         Win32::TieRegistry->import(
-                Delimiter   => '/',
-                ArrayValues => 0,
-                TiedRef     => \$Registry
-                );
+            Delimiter   => '/',
+            ArrayValues => 0,
+            TiedRef     => \$Registry
+        );
     };
     if ($EVAL_ERROR) {
         print "Failed to load Win32::OLE and Win32::TieRegistry\n";
@@ -90,13 +90,14 @@ sub _getScreensFromWindows {
     use constant wbemFlagReturnImmediately => 0x10;
     use constant wbemFlagForwardOnly => 0x20;
 
-# Vista and upper, able to get the second screen
+    # Vista and upper, able to get the second screen
     my $WMIServices = Win32::OLE->GetObject(
-            "winmgmts:{impersonationLevel=impersonate,authenticationLevel=Pkt}!//./root/wmi" );
+        "winmgmts:{impersonationLevel=impersonate,authenticationLevel=Pkt}!//./root/wmi"
+    );
 
-    foreach my $properties ( Win32::OLE::in( $WMIServices->InstancesOf(
-                    "WMIMonitorID" ) ) )
-    {
+    foreach my $properties (Win32::OLE::in($WMIServices->InstancesOf(
+        "WMIMonitorID"
+    ))) {
 
         next unless $properties->{InstanceName};
         my $PNPDeviceID = $properties->{InstanceName};
@@ -106,18 +107,23 @@ sub _getScreensFromWindows {
 
 # The generic Win32_DesktopMonitor class, the second screen will be missing
     foreach my $object (FusionInventory::Agent::Tools::Win32::getWmiObjects(
-                class => 'Win32_DesktopMonitor',
-                properties => [ qw/
-                Caption MonitorManufacturer MonitorType PNPDeviceID
-                / ] )) {
-
+        class => 'Win32_DesktopMonitor',
+        properties => [ qw/
+            Caption MonitorManufacturer MonitorType PNPDeviceID
+        / ]
+    )) {
 
         next unless $object->{"Availability"};
         next unless $object->{"PNPDeviceID"};
         next unless $object->{"Availability"} == 3;
         my $name = $object->{"Caption"};
 
-        $devices->{lc($object->{"PNPDeviceID"})} = { name => $name, type => $object->{MonitorType}, manufacturer => $object->{MonitorManufacturer}, caption => $object->{Caption} };
+        $devices->{lc($object->{"PNPDeviceID"})} = {
+            name         => $name,
+            type         => $object->{MonitorType},
+            manufacturer => $object->{MonitorManufacturer},
+            caption      => $object->{Caption}
+        };
 
     }
 
@@ -140,8 +146,8 @@ sub _getScreensFromWindows {
 # Win32-specifics constants can not be loaded on non-Windows OS
             no strict 'subs';
             $machKey = $Registry->Open('LMachine', {
-                    Access => $access
-                    } ) or $logger->fault("Can't open HKEY_LOCAL_MACHINE key: $EXTENDED_OS_ERROR");
+                Access => $access
+            } ) or $logger->fault("Can't open HKEY_LOCAL_MACHINE key: $EXTENDED_OS_ERROR");
 
         }
 


================================================================
  Commit: 3d65a28cc768c80baab8d763509ba1ebd373e59b
      https://github.com/fusinv/fusioninventory-agent/commit/3d65a28cc768c80baab8d763509ba1ebd373e59b
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-01-02 (Mon, 02 Jan 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm

  Log Message:
  -----------
  useless quotes


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
index 37f107b..e084653 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
@@ -113,12 +113,12 @@ sub _getScreensFromWindows {
         / ]
     )) {
 
-        next unless $object->{"Availability"};
-        next unless $object->{"PNPDeviceID"};
-        next unless $object->{"Availability"} == 3;
-        my $name = $object->{"Caption"};
+        next unless $object->{Availability};
+        next unless $object->{PNPDeviceID};
+        next unless $object->{Availability} == 3;
+        my $name = $object->{Caption};
 
-        $devices->{lc($object->{"PNPDeviceID"})} = {
+        $devices->{lc($object->{PNPDeviceID})} = {
             name         => $name,
             type         => $object->{MonitorType},
             manufacturer => $object->{MonitorManufacturer},


================================================================
  Commit: 07b9345b67d1cf1cdf0c6159ef1d35b705a58731
      https://github.com/fusinv/fusioninventory-agent/commit/07b9345b67d1cf1cdf0c6159ef1d35b705a58731
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-01-02 (Mon, 02 Jan 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/AIX/Memory.pm

  Log Message:
  -----------
  no VERSION attribute for memories (fix #1301)


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/AIX/Memory.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/AIX/Memory.pm
index 1e6992f..50b141f 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/AIX/Memory.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/AIX/Memory.pm
@@ -77,7 +77,6 @@ sub _getMemories {
             TYPE        => $info->{PN},
             CAPTION     => 'Slot ' . $info->{YL},
             SERIALNUMBER=> $info->{SN},
-            VERSION     => $info->{VK},
             NUMSLOTS    => $numslots++
         };
     }


================================================================
  Commit: 562e8164e2dac793b7947e75369139c135df475e
      https://github.com/fusinv/fusioninventory-agent/commit/562e8164e2dac793b7947e75369139c135df475e
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-01-04 (Wed, 04 Jan 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/OS/Generic/Screen.pm

  Log Message:
  -----------
  HSD manufacturer code: Hannspree Inc

https://bugs.launchpad.net/ocsinventory-windows-agent/+bug/911696


diff --git a/lib/FusionInventory/Agent/Task/Inventory/OS/Generic/Screen.pm b/lib/FusionInventory/Agent/Task/Inventory/OS/Generic/Screen.pm
index bfbdd42..65044a7 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/OS/Generic/Screen.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/OS/Generic/Screen.pm
@@ -683,6 +683,7 @@ sub _getManifacturerFromCode {
         "IFS" => "InFocus",
         "BOE" => "BOE Display Technology",
         "IQT" => "Hyundai",
+        "HSD" => "Hannspree Inc"
 
 
     };


================================================================
  Commit: c0474f5fb56984d6a9ed425617c295e8b75c9c10
      https://github.com/fusinv/fusioninventory-agent/commit/c0474f5fb56984d6a9ed425617c295e8b75c9c10
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-01-04 (Wed, 04 Jan 2012)

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

  Log Message:
  -----------
  Merge branch '2.1.x' into 2.2.x


diff --git a/lib/FusionInventory/Agent/Tools/Screen.pm b/lib/FusionInventory/Agent/Tools/Screen.pm
index af81348..6c4c320 100644
--- a/lib/FusionInventory/Agent/Tools/Screen.pm
+++ b/lib/FusionInventory/Agent/Tools/Screen.pm
@@ -500,6 +500,7 @@ sub getManufacturerFromCode {
         "IFS" => "InFocus",
         "BOE" => "BOE Display Technology",
         "IQT" => "Hyundai",
+        "HSD" => "Hannspree Inc"
 
 
     };


================================================================
  Commit: c4566b306bedce28720bfacfe97da9cfbce0c626
      https://github.com/fusinv/fusioninventory-agent/commit/c4566b306bedce28720bfacfe97da9cfbce0c626
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-01-05 (Thu, 05 Jan 2012)

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

  Log Message:
  -----------
  Merge remote-tracking branch 'forge/2.2.x' into 2.2.x


diff --git a/lib/FusionInventory/Agent/Tools/Screen.pm b/lib/FusionInventory/Agent/Tools/Screen.pm
index af81348..6c4c320 100644
--- a/lib/FusionInventory/Agent/Tools/Screen.pm
+++ b/lib/FusionInventory/Agent/Tools/Screen.pm
@@ -500,6 +500,7 @@ sub getManufacturerFromCode {
         "IFS" => "InFocus",
         "BOE" => "BOE Display Technology",
         "IQT" => "Hyundai",
+        "HSD" => "Hannspree Inc"
 
 
     };


================================================================
  Commit: 16c73051d3beef50b15c763163c716c4d6d341b2
      https://github.com/fusinv/fusioninventory-agent/commit/16c73051d3beef50b15c763163c716c4d6d341b2
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-01-05 (Thu, 05 Jan 2012)

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

  Log Message:
  -----------
  partly revert commit #2df3c4f


diff --git a/lib/FusionInventory/Agent/Tools.pm b/lib/FusionInventory/Agent/Tools.pm
index 9bf640a..7ff5ed8 100644
--- a/lib/FusionInventory/Agent/Tools.pm
+++ b/lib/FusionInventory/Agent/Tools.pm
@@ -47,6 +47,13 @@ our @EXPORT = qw(
 
 my $nowhere = $OSNAME eq 'MSWin32' ? 'nul' : '/dev/null';
 
+# this trigger some errors on Perl 5.12/Win32:
+# Anonymous function called in forbidden scalar context
+if ($OSNAME ne 'MSWin32') {
+    memoize('canRun');
+    memoize('canRead');
+}
+
 sub getFormatedLocalTime {
     my ($time) = @_;
 


================================================================
  Commit: a34981178ab9ee55e756616413cfa29e9199fc91
      https://github.com/fusinv/fusioninventory-agent/commit/a34981178ab9ee55e756616413cfa29e9199fc91
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-01-06 (Fri, 06 Jan 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Distro/NonLSB.pm

  Log Message:
  -----------
  no need to read the release file twice


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Distro/NonLSB.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Distro/NonLSB.pm
index 303d1f4..1794eba 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Distro/NonLSB.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Distro/NonLSB.pm
@@ -70,11 +70,13 @@ sub doInventory {
     my $distribution = first { -f $_->[0] } @distributions;
     return unless $distribution;
 
+    my $data = _getDistroData($distribution);
+
     $inventory->setHardware({
-        OSNAME => _findRelease($distribution),
+        OSNAME => $data->{FULL_NAME }
     });
 
-    $inventory->setOperatingSystem(_getDistroData($distribution));
+    $inventory->setOperatingSystem($data);
 }
 
 sub _getDistroData {
@@ -104,15 +106,4 @@ sub _getDistroData {
     return $data;
 }
 
-sub _findRelease {
-    my ($distribution) = @_;
-
-    my $template = $distribution->[3];
-
-    my $line    = getFirstLine(file => $distribution->[0]);
-    my $release = sprintf $template, $line;
-
-    return $release;
-}
-
 1;


================================================================
  Commit: 99662bb42fe30b8a9911e1157cf71b5ec33a775f
      https://github.com/fusinv/fusioninventory-agent/commit/99662bb42fe30b8a9911e1157cf71b5ec33a775f
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-01-06 (Fri, 06 Jan 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Distro/NonLSB.pm

  Log Message:
  -----------
  don't forget to import List::Util


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Distro/NonLSB.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Distro/NonLSB.pm
index 1794eba..f4d7d78 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Distro/NonLSB.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Distro/NonLSB.pm
@@ -6,6 +6,7 @@ use warnings;
 use English qw(-no_match_vars);
 
 use FusionInventory::Agent::Tools;
+use List::Util qw(first);
 
 # This array contains four items for each distribution:
 # - release file


================================================================
  Commit: 19bfcf71c4f2ee8e6478d940abb0c25362283b65
      https://github.com/fusinv/fusioninventory-agent/commit/19bfcf71c4f2ee8e6478d940abb0c25362283b65
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-01-06 (Fri, 06 Jan 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Distro/NonLSB.pm

  Log Message:
  -----------
  arch-linux has an empty release file (bug #1286)


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Distro/NonLSB.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Distro/NonLSB.pm
index f4d7d78..207a500 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Distro/NonLSB.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Distro/NonLSB.pm
@@ -17,7 +17,7 @@ my @distributions = (
     # vmware-release contains something like "VMware ESX Server 3" or "VMware ESX 4.0 (Kandinsky)"
     [ '/etc/vmware-release',    'VMWare',                     '([\d.]+)',         '%s' ],
 
-    [ '/etc/arch-release',      'ArchLinux',                  '(.*)',             'ArchLinux %s' ],
+    [ '/etc/arch-release',      'ArchLinux',                  '(.*)',             'ArchLinux' ],
 
     [ '/etc/debian_version',    'Debian',                     '(.*)',             'Debian GNU/Linux %s'],
 
@@ -88,8 +88,14 @@ sub _getDistroData {
     my $template = $distribution->[3];
 
     my $line       = getFirstLine(file => $distribution->[0]);
-    my $release    = sprintf $template, $line;
-    my ($version)  = $line =~ /$regexp/;
+    # Arch Linux has an empty release file
+    my ($release, $version);
+    if ($line) {
+        $release   = sprintf $template, $line;
+        ($version) = $line =~ /$regexp/;
+    } else {
+        $release = $template;
+    }
 
     my $data = {
         NAME      => $name,


================================================================
  Commit: ee9cd66dbd732d7a087f0b1bc6a8e25c5fed0c0e
      https://github.com/fusinv/fusioninventory-agent/commit/ee9cd66dbd732d7a087f0b1bc6a8e25c5fed0c0e
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-01-06 (Fri, 06 Jan 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/AIX/Networks.pm

  Log Message:
  -----------
  complete list of interfaces found with lscfg with iconfig -l output (bug #1326)


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/AIX/Networks.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/AIX/Networks.pm
index dee026f..5c1518c 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/AIX/Networks.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/AIX/Networks.pm
@@ -41,11 +41,17 @@ sub _getInterfaces {
 
     my $logger = $params{logger};
 
+    # get a first list of interfaces objects from lscfg
     my @interfaces = _parseLscfg(
         command => 'lscfg -v -l en*',
         logger  => $logger
     );
 
+    # complete with empty interfaces objects from ifconfig
+    push @interfaces,
+        map { { DESCRIPTION => $_ } }
+        split(/ /, getFirstLine(command => 'ifconfig -l'));
+
     foreach my $interface (@interfaces) {
         my $handle = getFileHandle(
             command => "lsattr -E -l $interface->{DESCRIPTION}",


================================================================
  Commit: 633a4d2b7e7ce572882c97ea332d2d1da57c63bc
      https://github.com/fusinv/fusioninventory-agent/commit/633a4d2b7e7ce572882c97ea332d2d1da57c63bc
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-01-06 (Fri, 06 Jan 2012)

  Changed paths:
    M t/inventory/bsd/softwares.t

  Log Message:
  -----------
  fix identation


diff --git a/t/inventory/bsd/softwares.t b/t/inventory/bsd/softwares.t
index 3f1d690..474a827 100755
--- a/t/inventory/bsd/softwares.t
+++ b/t/inventory/bsd/softwares.t
@@ -10,183 +10,182 @@ use FusionInventory::Agent::Task::Inventory::Input::BSD::Softwares;
 my %pkg_info_tests = (
     'sample1' => [
         {
-          'NAME' => 'GeoIP',
-          'DESCRIPTION' => 'Find the country that any IP address or hostname originates',
-          'VERSION' => '1.4.8_1'
+            NAME        => 'GeoIP',
+            DESCRIPTION => 'Find the country that any IP address or hostname originates',
+            VERSION     => '1.4.8_1'
         },
         {
-          'NAME' => 'ImageMagick',
-          'DESCRIPTION' => 'Image processing tools',
-          'VERSION' => '6.7.0.10_1'
+            NAME        => 'ImageMagick',
+            DESCRIPTION => 'Image processing tools',
+            VERSION     => '6.7.0.10_1'
         },
         {
-          'NAME' => 'ORBit2',
-          'DESCRIPTION' => 'High-performance CORBA ORB with support for the C language',
-          'VERSION' => '2.14.19'
+            NAME        => 'ORBit2',
+            DESCRIPTION => 'High-performance CORBA ORB with support for the C language',
+            VERSION     => '2.14.19'
         },
         {
-          'NAME' => 'Ocsinventory-Agent',
-          'DESCRIPTION' => 'Keep track of the computers configuration and software',
-          'VERSION' => '1.1.2.1_1,1'
+            NAME        => 'Ocsinventory-Agent',
+            DESCRIPTION => 'Keep track of the computers configuration and software',
+            VERSION     => '1.1.2.1_1,1'
         },
         {
-          'NAME' => 'Ocsinventory-Agent',
-          'DESCRIPTION' => 'Keep track of the computers configuration and software',
-          'VERSION' => '2.0,1'
+            NAME        => 'Ocsinventory-Agent',
+            DESCRIPTION => 'Keep track of the computers configuration and software',
+            VERSION     => '2.0,1'
         },
         {
-          'NAME' => 'OpenEXR',
-          'DESCRIPTION' => 'A high dynamic-range (HDR) image file format',
-          'VERSION' => '1.6.1_3'
+            NAME        => 'OpenEXR',
+            DESCRIPTION => 'A high dynamic-range (HDR) image file format',
+            VERSION     => '1.6.1_3'
         },
         {
-          'NAME' => 'a2ps-a4',
-          'DESCRIPTION' => 'Formats an ascii file for printing on a postscript printer',
-          'VERSION' => '4.13b_4'
+            NAME        => 'a2ps-a4',
+            DESCRIPTION => 'Formats an ascii file for printing on a postscript printer',
+            VERSION     => '4.13b_4'
         },
         {
-          'NAME' => 'aalib',
-          'DESCRIPTION' => 'An ascii art library',
-          'VERSION' => '1.4.r5_6'
+            NAME        => 'aalib',
+            DESCRIPTION => 'An ascii art library',
+            VERSION     => '1.4.r5_6'
         },
         {
-          'NAME' => 'acidrip',
-          'DESCRIPTION' => 'GTK2::Perl wrapper for MPlayer and MEncoder for ripping DVD',
-          'VERSION' => '0.14_8'
+            NAME        => 'acidrip',
+            DESCRIPTION => 'GTK2::Perl wrapper for MPlayer and MEncoder for ripping DVD',
+            VERSION     => '0.14_8'
         },
         {
-          'NAME' => 'acroread8',
-          'DESCRIPTION' => 'Adobe Reader for view, print, and search PDF documents (ENU',
-          'VERSION' => '8.1.7_3'
+            NAME        => 'acroread8',
+            DESCRIPTION => 'Adobe Reader for view, print, and search PDF documents (ENU',
+            VERSION     => '8.1.7_3'
         },
         {
-          'NAME' => 'acroreadwrapper',
-          'DESCRIPTION' => 'Wrapper script for Adobe Reader',
-          'VERSION' => '0.0.20110920'
+            NAME        => 'acroreadwrapper',
+            DESCRIPTION => 'Wrapper script for Adobe Reader',
+            VERSION     => '0.0.20110920'
         },
         {
-          'NAME' => 'alsa-lib',
-          'DESCRIPTION' => 'ALSA compatibility library',
-          'VERSION' => '1.0.23'
+            NAME        => 'alsa-lib',
+            DESCRIPTION => 'ALSA compatibility library',
+            VERSION     => '1.0.23'
         },
         {
-          'NAME' => 'ap22-mod_perl2',
-          'DESCRIPTION' => 'Embeds a Perl interpreter in the Apache2 server',
-          'VERSION' => '2.0.5_1,3'
+            NAME        => 'ap22-mod_perl2',
+            DESCRIPTION => 'Embeds a Perl interpreter in the Apache2 server',
+            VERSION     => '2.0.5_1,3'
         },
         {
-          'NAME' => 'apache',
-          'DESCRIPTION' => 'Version 2.2.x of Apache web server with prefork MPM.',
-          'VERSION' => '2.2.19'
+            NAME        => 'apache',
+            DESCRIPTION => 'Version 2.2.x of Apache web server with prefork MPM.',
+            VERSION     => '2.2.19'
         },
         {
-          'NAME' => 'apache-ant',
-          'DESCRIPTION' => 'Java- and XML-based build tool, conceptually similar to mak',
-          'VERSION' => '1.8.2'
+            NAME        => 'apache-ant',
+            DESCRIPTION => 'Java- and XML-based build tool, conceptually similar to mak',
+            VERSION     => '1.8.2'
         },
         {
-          'NAME' => 'appres',
-          'DESCRIPTION' => 'Program to list application\'s resources',
-          'VERSION' => '1.0.3'
+            NAME        => 'appres',
+            DESCRIPTION => 'Program to list application\'s resources',
+            VERSION     => '1.0.3'
         },
         {
-          'NAME' => 'apr-ipv6-devrandom-gdbm-db42',
-          'DESCRIPTION' => 'Apache Portability Library',
-          'VERSION' => '1.4.5.1.3.12'
+            NAME        => 'apr-ipv6-devrandom-gdbm-db42',
+            DESCRIPTION => 'Apache Portability Library',
+            VERSION     => '1.4.5.1.3.12'
         },
         {
-          'NAME' => 'aspell',
-          'DESCRIPTION' => 'Spelling checker with better suggestion logic than ispell',
-          'VERSION' => '0.60.6.1'
+            NAME        => 'aspell',
+            DESCRIPTION => 'Spelling checker with better suggestion logic than ispell',
+            VERSION     => '0.60.6.1'
         },
         {
-          'NAME' => 'atk',
-          'DESCRIPTION' => 'A GNOME accessibility toolkit (ATK)',
-          'VERSION' => '2.0.1'
+            NAME        => 'atk',
+            DESCRIPTION => 'A GNOME accessibility toolkit (ATK)',
+            VERSION     => '2.0.1'
         },
         {
-          'NAME' => 'atkmm',
-          'DESCRIPTION' => 'C++ wrapper for ATK API library',
-          'VERSION' => '2.22.5'
+            NAME        => 'atkmm',
+            DESCRIPTION => 'C++ wrapper for ATK API library',
+            VERSION     => '2.22.5'
         },
         {
-          'NAME' => 'attica',
-          'DESCRIPTION' => 'Collaboration Services API library',
-          'VERSION' => '0.2.80,1'
+            NAME        => 'attica',
+            DESCRIPTION => 'Collaboration Services API library',
+            VERSION     => '0.2.80,1'
         },
         {
-          'NAME' => 'atunes',
-          'DESCRIPTION' => 'A full-featured audio player and manager developed in Java',
-          'VERSION' => '2.0.1'
+            NAME        => 'atunes',
+            DESCRIPTION => 'A full-featured audio player and manager developed in Java',
+            VERSION     => '2.0.1'
         },
         {
-          'NAME' => 'audacity',
-          'DESCRIPTION' => 'Audacity is a GUI editor for digital audio waveforms',
-          'VERSION' => '1.2.4b_9'
+            NAME        => 'audacity',
+            DESCRIPTION => 'Audacity is a GUI editor for digital audio waveforms',
+            VERSION     => '1.2.4b_9'
         },
         {
-          'NAME' => 'autoconf',
-          'DESCRIPTION' => 'Automatically configure source code on many Un*x platforms ',
-          'VERSION' => '2.13.000227_6'
+            NAME        => 'autoconf',
+            DESCRIPTION => 'Automatically configure source code on many Un*x platforms ',
+            VERSION     => '2.13.000227_6'
         },
         {
-          'NAME' => 'autoconf',
-          'DESCRIPTION' => 'Automatically configure source code on many Un*x platforms ',
-          'VERSION' => '2.68'
+            NAME        => 'autoconf',
+            DESCRIPTION => 'Automatically configure source code on many Un*x platforms ',
+            VERSION     => '2.68'
         },
         {
-          'NAME' => 'autoconf-wrapper',
-          'DESCRIPTION' => 'Wrapper script for GNU autoconf',
-          'VERSION' => '20101119'
+            NAME        => 'autoconf-wrapper',
+            DESCRIPTION => 'Wrapper script for GNU autoconf',
+            VERSION     => '20101119'
         },
         {
-          'NAME' => 'automake',
-          'DESCRIPTION' => 'GNU Standards-compliant Makefile generator (1.11)',
-          'VERSION' => '1.11.1'
+            NAME        => 'automake',
+            DESCRIPTION => 'GNU Standards-compliant Makefile generator (1.11)',
+            VERSION     => '1.11.1'
         },
         {
-          'NAME' => 'automake',
-          'DESCRIPTION' => 'GNU Standards-compliant Makefile generator (1.4)',
-          'VERSION' => '1.4.6_6'
+            NAME        => 'automake',
+            DESCRIPTION => 'GNU Standards-compliant Makefile generator (1.4)',
+            VERSION     => '1.4.6_6'
         },
         {
-          'NAME' => 'automake-wrapper',
-          'DESCRIPTION' => 'Wrapper script for GNU automake',
-          'VERSION' => '20101119'
+            NAME        => 'automake-wrapper',
+            DESCRIPTION => 'Wrapper script for GNU automake',
+            VERSION     => '20101119'
         },
         {
-          'NAME' => 'automoc4',
-          'DESCRIPTION' => 'Automatic moc for Qt 4 packages',
-          'VERSION' => '0.9.88_1'
+            NAME        => 'automoc4',
+            DESCRIPTION => 'Automatic moc for Qt 4 packages',
+            VERSION     => '0.9.88_1'
         },
         {
-          'NAME' => 'avahi-app',
-          'DESCRIPTION' => 'Service discovery on a local network',
-          'VERSION' => '0.6.29'
+            NAME        => 'avahi-app',
+            DESCRIPTION => 'Service discovery on a local network',
+            VERSION     => '0.6.29'
         },
         {
-          'NAME' => 'b43-fwcutter',
-          'DESCRIPTION' => 'Extracts firmware for Broadcom Wireless adapters',
-          'VERSION' => '012'
+            NAME        => 'b43-fwcutter',
+            DESCRIPTION => 'Extracts firmware for Broadcom Wireless adapters',
+            VERSION     => '012'
         },
         {
-          'NAME' => 'babl',
-          'DESCRIPTION' => 'Dynamic pixel format conversion library',
-          'VERSION' => '0.1.4'
+            NAME        => 'babl',
+            DESCRIPTION => 'Dynamic pixel format conversion library',
+            VERSION     => '0.1.4'
         },
         {
-          'NAME' => 'bash',
-          'DESCRIPTION' => 'The GNU Project\'s Bourne Again SHell',
-          'VERSION' => '4.1.11'
+            NAME        => 'bash',
+            DESCRIPTION => 'The GNU Project\'s Bourne Again SHell',
+            VERSION     => '4.1.11'
         }
     ]
 );
 
 plan tests => scalar keys %pkg_info_tests;
 
-use Data::Dumper;
 foreach my $test (keys %pkg_info_tests) {
     my $file = "resources/bsd/pkg_info/$test";
     my $results = FusionInventory::Agent::Task::Inventory::Input::BSD::Softwares::_getPackagesListFromPkgInfo(file => $file);
-    is_deeply($results, $pkg_info_tests{$test}, $test) or print Dumper($results);
+    is_deeply($results, $pkg_info_tests{$test}, $test);
 }


================================================================
  Commit: d256f0330022cf4f838106d632c5bb00accc7bb3
      https://github.com/fusinv/fusioninventory-agent/commit/d256f0330022cf4f838106d632c5bb00accc7bb3
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-01-06 (Fri, 06 Jan 2012)

  Changed paths:
    M t/inventory/bsd/softwares.t

  Log Message:
  -----------
  fix expected results


diff --git a/t/inventory/bsd/softwares.t b/t/inventory/bsd/softwares.t
index 474a827..2464a04 100755
--- a/t/inventory/bsd/softwares.t
+++ b/t/inventory/bsd/softwares.t
@@ -10,174 +10,174 @@ use FusionInventory::Agent::Task::Inventory::Input::BSD::Softwares;
 my %pkg_info_tests = (
     'sample1' => [
         {
-            NAME        => 'GeoIP',
-            DESCRIPTION => 'Find the country that any IP address or hostname originates',
-            VERSION     => '1.4.8_1'
+            NAME     => 'GeoIP',
+            COMMENTS => 'Find the country that any IP address or hostname originates',
+            VERSION  => '1.4.8_1'
         },
         {
-            NAME        => 'ImageMagick',
-            DESCRIPTION => 'Image processing tools',
-            VERSION     => '6.7.0.10_1'
+            NAME     => 'ImageMagick',
+            COMMENTS => 'Image processing tools',
+            VERSION  => '6.7.0.10_1'
         },
         {
-            NAME        => 'ORBit2',
-            DESCRIPTION => 'High-performance CORBA ORB with support for the C language',
-            VERSION     => '2.14.19'
+            NAME     => 'ORBit2',
+            COMMENTS => 'High-performance CORBA ORB with support for the C language',
+            VERSION  => '2.14.19'
         },
         {
-            NAME        => 'Ocsinventory-Agent',
-            DESCRIPTION => 'Keep track of the computers configuration and software',
-            VERSION     => '1.1.2.1_1,1'
+            NAME     => 'Ocsinventory-Agent',
+            COMMENTS => 'Keep track of the computers configuration and software',
+            VERSION  => '1.1.2.1_1,1'
         },
         {
-            NAME        => 'Ocsinventory-Agent',
-            DESCRIPTION => 'Keep track of the computers configuration and software',
-            VERSION     => '2.0,1'
+            NAME     => 'Ocsinventory-Agent',
+            COMMENTS => 'Keep track of the computers configuration and software',
+            VERSION  => '2.0,1'
         },
         {
-            NAME        => 'OpenEXR',
-            DESCRIPTION => 'A high dynamic-range (HDR) image file format',
-            VERSION     => '1.6.1_3'
+            NAME     => 'OpenEXR',
+            COMMENTS => 'A high dynamic-range (HDR) image file format',
+            VERSION  => '1.6.1_3'
         },
         {
-            NAME        => 'a2ps-a4',
-            DESCRIPTION => 'Formats an ascii file for printing on a postscript printer',
-            VERSION     => '4.13b_4'
+            NAME     => 'a2ps-a4',
+            COMMENTS => 'Formats an ascii file for printing on a postscript printer',
+            VERSION  => '4.13b_4'
         },
         {
-            NAME        => 'aalib',
-            DESCRIPTION => 'An ascii art library',
-            VERSION     => '1.4.r5_6'
+            NAME     => 'aalib',
+            COMMENTS => 'An ascii art library',
+            VERSION  => '1.4.r5_6'
         },
         {
-            NAME        => 'acidrip',
-            DESCRIPTION => 'GTK2::Perl wrapper for MPlayer and MEncoder for ripping DVD',
-            VERSION     => '0.14_8'
+            NAME     => 'acidrip',
+            COMMENTS => 'GTK2::Perl wrapper for MPlayer and MEncoder for ripping DVD',
+            VERSION  => '0.14_8'
         },
         {
-            NAME        => 'acroread8',
-            DESCRIPTION => 'Adobe Reader for view, print, and search PDF documents (ENU',
-            VERSION     => '8.1.7_3'
+            NAME     => 'acroread8',
+            COMMENTS => 'Adobe Reader for view, print, and search PDF documents (ENU',
+            VERSION  => '8.1.7_3'
         },
         {
-            NAME        => 'acroreadwrapper',
-            DESCRIPTION => 'Wrapper script for Adobe Reader',
-            VERSION     => '0.0.20110920'
+            NAME     => 'acroreadwrapper',
+            COMMENTS => 'Wrapper script for Adobe Reader',
+            VERSION  => '0.0.20110920'
         },
         {
-            NAME        => 'alsa-lib',
-            DESCRIPTION => 'ALSA compatibility library',
-            VERSION     => '1.0.23'
+            NAME     => 'alsa-lib',
+            COMMENTS => 'ALSA compatibility library',
+            VERSION  => '1.0.23'
         },
         {
-            NAME        => 'ap22-mod_perl2',
-            DESCRIPTION => 'Embeds a Perl interpreter in the Apache2 server',
-            VERSION     => '2.0.5_1,3'
+            NAME     => 'ap22-mod_perl2',
+            COMMENTS => 'Embeds a Perl interpreter in the Apache2 server',
+            VERSION  => '2.0.5_1,3'
         },
         {
-            NAME        => 'apache',
-            DESCRIPTION => 'Version 2.2.x of Apache web server with prefork MPM.',
-            VERSION     => '2.2.19'
+            NAME     => 'apache',
+            COMMENTS => 'Version 2.2.x of Apache web server with prefork MPM.',
+            VERSION  => '2.2.19'
         },
         {
-            NAME        => 'apache-ant',
-            DESCRIPTION => 'Java- and XML-based build tool, conceptually similar to mak',
-            VERSION     => '1.8.2'
+            NAME     => 'apache-ant',
+            COMMENTS => 'Java- and XML-based build tool, conceptually similar to mak',
+            VERSION  => '1.8.2'
         },
         {
-            NAME        => 'appres',
-            DESCRIPTION => 'Program to list application\'s resources',
-            VERSION     => '1.0.3'
+            NAME     => 'appres',
+            COMMENTS => 'Program to list application\'s resources',
+            VERSION  => '1.0.3'
         },
         {
-            NAME        => 'apr-ipv6-devrandom-gdbm-db42',
-            DESCRIPTION => 'Apache Portability Library',
-            VERSION     => '1.4.5.1.3.12'
+            NAME     => 'apr-ipv6-devrandom-gdbm-db42',
+            COMMENTS => 'Apache Portability Library',
+            VERSION  => '1.4.5.1.3.12'
         },
         {
-            NAME        => 'aspell',
-            DESCRIPTION => 'Spelling checker with better suggestion logic than ispell',
-            VERSION     => '0.60.6.1'
+            NAME     => 'aspell',
+            COMMENTS => 'Spelling checker with better suggestion logic than ispell',
+            VERSION  => '0.60.6.1'
         },
         {
-            NAME        => 'atk',
-            DESCRIPTION => 'A GNOME accessibility toolkit (ATK)',
-            VERSION     => '2.0.1'
+            NAME     => 'atk',
+            COMMENTS => 'A GNOME accessibility toolkit (ATK)',
+            VERSION  => '2.0.1'
         },
         {
-            NAME        => 'atkmm',
-            DESCRIPTION => 'C++ wrapper for ATK API library',
-            VERSION     => '2.22.5'
+            NAME     => 'atkmm',
+            COMMENTS => 'C++ wrapper for ATK API library',
+            VERSION  => '2.22.5'
         },
         {
-            NAME        => 'attica',
-            DESCRIPTION => 'Collaboration Services API library',
-            VERSION     => '0.2.80,1'
+            NAME     => 'attica',
+            COMMENTS => 'Collaboration Services API library',
+            VERSION  => '0.2.80,1'
         },
         {
-            NAME        => 'atunes',
-            DESCRIPTION => 'A full-featured audio player and manager developed in Java',
-            VERSION     => '2.0.1'
+            NAME     => 'atunes',
+            COMMENTS => 'A full-featured audio player and manager developed in Java',
+            VERSION  => '2.0.1'
         },
         {
-            NAME        => 'audacity',
-            DESCRIPTION => 'Audacity is a GUI editor for digital audio waveforms',
-            VERSION     => '1.2.4b_9'
+            NAME     => 'audacity',
+            COMMENTS => 'Audacity is a GUI editor for digital audio waveforms',
+            VERSION  => '1.2.4b_9'
         },
         {
-            NAME        => 'autoconf',
-            DESCRIPTION => 'Automatically configure source code on many Un*x platforms ',
-            VERSION     => '2.13.000227_6'
+            NAME     => 'autoconf',
+            COMMENTS => 'Automatically configure source code on many Un*x platforms ',
+            VERSION  => '2.13.000227_6'
         },
         {
-            NAME        => 'autoconf',
-            DESCRIPTION => 'Automatically configure source code on many Un*x platforms ',
-            VERSION     => '2.68'
+            NAME     => 'autoconf',
+            COMMENTS => 'Automatically configure source code on many Un*x platforms ',
+            VERSION  => '2.68'
         },
         {
-            NAME        => 'autoconf-wrapper',
-            DESCRIPTION => 'Wrapper script for GNU autoconf',
-            VERSION     => '20101119'
+            NAME     => 'autoconf-wrapper',
+            COMMENTS => 'Wrapper script for GNU autoconf',
+            VERSION  => '20101119'
         },
         {
-            NAME        => 'automake',
-            DESCRIPTION => 'GNU Standards-compliant Makefile generator (1.11)',
-            VERSION     => '1.11.1'
+            NAME     => 'automake',
+            COMMENTS => 'GNU Standards-compliant Makefile generator (1.11)',
+            VERSION  => '1.11.1'
         },
         {
-            NAME        => 'automake',
-            DESCRIPTION => 'GNU Standards-compliant Makefile generator (1.4)',
-            VERSION     => '1.4.6_6'
+            NAME     => 'automake',
+            COMMENTS => 'GNU Standards-compliant Makefile generator (1.4)',
+            VERSION  => '1.4.6_6'
         },
         {
-            NAME        => 'automake-wrapper',
-            DESCRIPTION => 'Wrapper script for GNU automake',
-            VERSION     => '20101119'
+            NAME     => 'automake-wrapper',
+            COMMENTS => 'Wrapper script for GNU automake',
+            VERSION  => '20101119'
         },
         {
-            NAME        => 'automoc4',
-            DESCRIPTION => 'Automatic moc for Qt 4 packages',
-            VERSION     => '0.9.88_1'
+            NAME     => 'automoc4',
+            COMMENTS => 'Automatic moc for Qt 4 packages',
+            VERSION  => '0.9.88_1'
         },
         {
-            NAME        => 'avahi-app',
-            DESCRIPTION => 'Service discovery on a local network',
-            VERSION     => '0.6.29'
+            NAME     => 'avahi-app',
+            COMMENTS => 'Service discovery on a local network',
+            VERSION  => '0.6.29'
         },
         {
-            NAME        => 'b43-fwcutter',
-            DESCRIPTION => 'Extracts firmware for Broadcom Wireless adapters',
-            VERSION     => '012'
+            NAME     => 'b43-fwcutter',
+            COMMENTS => 'Extracts firmware for Broadcom Wireless adapters',
+            VERSION  => '012'
         },
         {
-            NAME        => 'babl',
-            DESCRIPTION => 'Dynamic pixel format conversion library',
-            VERSION     => '0.1.4'
+            NAME     => 'babl',
+            COMMENTS => 'Dynamic pixel format conversion library',
+            VERSION  => '0.1.4'
         },
         {
-            NAME        => 'bash',
-            DESCRIPTION => 'The GNU Project\'s Bourne Again SHell',
-            VERSION     => '4.1.11'
+            NAME     => 'bash',
+            COMMENTS => 'The GNU Project\'s Bourne Again SHell',
+            VERSION  => '4.1.11'
         }
     ]
 );


================================================================
  Commit: b189b846a7e88054e5d544a66f3041468748bce5
      https://github.com/fusinv/fusioninventory-agent/commit/b189b846a7e88054e5d544a66f3041468748bce5
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-01-06 (Fri, 06 Jan 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Softwares.pm

  Log Message:
  -----------
  clearer regexp


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Softwares.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Softwares.pm
index 2ca73af..9376672 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Softwares.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Softwares.pm
@@ -37,7 +37,7 @@ sub _getPackagesListFromPkgInfo {
 
     my @packages;
     while (my $line = <$handle>) {
-        next unless $line =~ /^(\S+)-(\d+\S*)\s+(.*)/;
+        next unless $line =~ /^(\S+) - (\S+) \s+ (.*)/x;
         push @packages, {
             NAME     => $1,
             VERSION  => $2,


================================================================
  Commit: 86c492f0305cbdd132b5dafe399f4a324bc128a5
      https://github.com/fusinv/fusioninventory-agent/commit/86c492f0305cbdd132b5dafe399f4a324bc128a5
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-01-06 (Fri, 06 Jan 2012)

  Changed paths:
    M t/inventory/aix/memory.t

  Log Message:
  -----------
  fix expected results


diff --git a/t/inventory/aix/memory.t b/t/inventory/aix/memory.t
index d8c5095..5f54fe3 100755
--- a/t/inventory/aix/memory.t
+++ b/t/inventory/aix/memory.t
@@ -14,7 +14,6 @@ my %tests = (
             NUMSLOTS    => 0,
             SERIALNUMBER=> 'YH10MS5CH923',
             DESCRIPTION => 'Memory DIMM',
-            VERSION     => 'RS6K',
             TYPE        => '00P5767',
             CAPTION     => 'Slot U787A.001.DPM2CW2-P1-C9',
             CAPACITY    => '512'
@@ -23,7 +22,6 @@ my %tests = (
             NUMSLOTS    => 1,
             SERIALNUMBER=> 'YH10MS5CH8ED',
             DESCRIPTION => 'Memory DIMM',
-            VERSION     => 'RS6K',
             TYPE        => '00P5767',
             CAPTION     => 'Slot U787A.001.DPM2CW2-P1-C11',
             CAPACITY    => '512'
@@ -32,7 +30,6 @@ my %tests = (
             NUMSLOTS    => 2,
             SERIALNUMBER=> 'YH10MS5CH8F0',
             DESCRIPTION => 'Memory DIMM',
-            VERSION     => 'RS6K',
             TYPE        => '00P5767',
             CAPTION     => 'Slot U787A.001.DPM2CW2-P1-C14',
             CAPACITY    => '512'
@@ -41,7 +38,6 @@ my %tests = (
             NUMSLOTS    => 3,
             SERIALNUMBER=> 'YH10MS5CH92C',
             DESCRIPTION => 'Memory DIMM',
-            VERSION     => 'RS6K',
             TYPE        => '00P5767',
             CAPTION     => 'Slot U787A.001.DPM2CW2-P1-C16',
             CAPACITY    => '512'
@@ -52,7 +48,6 @@ my %tests = (
             NUMSLOTS    => 0,
             SERIALNUMBER=> '00005055',
             DESCRIPTION => 'Memory DIMM',
-            VERSION     => 'RS6K',
             TYPE        => undef,
             CAPTION     => 'Slot U788D.001.99DXY4Y-P1-C1',
             CAPACITY    => '1024'
@@ -61,7 +56,6 @@ my %tests = (
             NUMSLOTS    => 1,
             SERIALNUMBER=> '04008030',
             DESCRIPTION => 'Memory DIMM',
-            VERSION     => 'RS6K',
             TYPE        => undef,
             CAPTION     => 'Slot U788D.001.99DXY4Y-P1-C2',
             CAPACITY    => '1024'
@@ -70,7 +64,6 @@ my %tests = (
             NUMSLOTS    => 2,
             SERIALNUMBER=> '00007033',
             DESCRIPTION => 'Memory DIMM',
-            VERSION     => 'RS6K',
             TYPE        => undef,
             CAPTION     => 'Slot U788D.001.99DXY4Y-P1-C3',
             CAPACITY    => '1024'
@@ -79,7 +72,6 @@ my %tests = (
             NUMSLOTS    => 3,
             SERIALNUMBER=> '00005031',
             DESCRIPTION => 'Memory DIMM',
-            VERSION     => 'RS6K',
             TYPE        => undef,
             CAPTION     => 'Slot U788D.001.99DXY4Y-P1-C4',
             CAPACITY    => '1024'
@@ -90,7 +82,6 @@ my %tests = (
             NUMSLOTS    => 0,
             SERIALNUMBER=> 'YLD001110C29',
             DESCRIPTION => 'Memory DIMM',
-            VERSION     => 'ipzSeries',
             TYPE        => '43X5036',
             CAPTION     => 'Slot U78A5.001.WIH5D66-P1-C1',
             CAPACITY    => '4096'
@@ -99,7 +90,6 @@ my %tests = (
             NUMSLOTS    => 1,
             SERIALNUMBER=> 'YLD005346272',
             DESCRIPTION => 'Memory DIMM',
-            VERSION     => 'ipzSeries',
             TYPE        => '43X5036',
             CAPTION     => 'Slot U78A5.001.WIH5D66-P1-C2',
             CAPACITY    => '4096'
@@ -108,7 +98,6 @@ my %tests = (
             NUMSLOTS    => 2,
             SERIALNUMBER=> 'YLD000110C0C',
             DESCRIPTION => 'Memory DIMM',
-            VERSION     => 'ipzSeries',
             TYPE        => '43X5036',
             CAPTION     => 'Slot U78A5.001.WIH5D66-P1-C3',
             CAPACITY    => '4096'
@@ -117,7 +106,6 @@ my %tests = (
             NUMSLOTS    => 3,
             SERIALNUMBER=> 'YLD004930776',
             DESCRIPTION => 'Memory DIMM',
-            VERSION     => 'ipzSeries',
             TYPE        => '43X5036',
             CAPTION     => 'Slot U78A5.001.WIH5D66-P1-C4',
             CAPACITY    => '4096'
@@ -126,7 +114,6 @@ my %tests = (
             NUMSLOTS    => 4,
             SERIALNUMBER=> 'YLD00793074C',
             DESCRIPTION => 'Memory DIMM',
-            VERSION     => 'ipzSeries',
             TYPE        => '43X5036',
             CAPTION     => 'Slot U78A5.001.WIH5D66-P1-C5',
             CAPACITY    => '4096'
@@ -135,7 +122,6 @@ my %tests = (
             NUMSLOTS    => 5,
             SERIALNUMBER=> 'YLD003810961',
             DESCRIPTION => 'Memory DIMM',
-            VERSION     => 'ipzSeries',
             TYPE        => '43X5036',
             CAPTION     => 'Slot U78A5.001.WIH5D66-P1-C6',
             CAPACITY    => '4096'
@@ -144,7 +130,6 @@ my %tests = (
             NUMSLOTS    => 6,
             SERIALNUMBER=> 'YLD006346270',
             DESCRIPTION => 'Memory DIMM',
-            VERSION     => 'ipzSeries',
             TYPE        => '43X5036',
             CAPTION     => 'Slot U78A5.001.WIH5D66-P1-C7',
             CAPACITY    => '4096'
@@ -153,7 +138,6 @@ my %tests = (
             NUMSLOTS    => 7,
             SERIALNUMBER=> 'YLD00281096F',
             DESCRIPTION => 'Memory DIMM',
-            VERSION     => 'ipzSeries',
             TYPE        => '43X5036',
             CAPTION     => 'Slot U78A5.001.WIH5D66-P1-C8',
             CAPACITY    => '4096'
@@ -162,7 +146,6 @@ my %tests = (
             NUMSLOTS    => 8,
             SERIALNUMBER=> 'YLD009710956',
             DESCRIPTION => 'Memory DIMM',
-            VERSION     => 'ipzSeries',
             TYPE        => '43X5036',
             CAPTION     => 'Slot U78A5.001.WIH5D66-P2-C1',
             CAPACITY    => '4096'
@@ -171,7 +154,6 @@ my %tests = (
             NUMSLOTS    => 9,
             SERIALNUMBER=> 'YLD00D346271',
             DESCRIPTION => 'Memory DIMM',
-            VERSION     => 'ipzSeries',
             TYPE        => '43X5036',
             CAPTION     => 'Slot U78A5.001.WIH5D66-P2-C2',
             CAPACITY    => '4096'
@@ -180,7 +162,6 @@ my %tests = (
             NUMSLOTS    => 10,
             SERIALNUMBER=> 'YLD00851096F',
             DESCRIPTION => 'Memory DIMM',
-            VERSION     => 'ipzSeries',
             TYPE        => '43X5036',
             CAPTION     => 'Slot U78A5.001.WIH5D66-P2-C3',
             CAPACITY    => '4096'
@@ -189,7 +170,6 @@ my %tests = (
             NUMSLOTS    => 11,
             SERIALNUMBER=> 'YLD00C930661',
             DESCRIPTION => 'Memory DIMM',
-            VERSION     => 'ipzSeries',
             TYPE        => '43X5036',
             CAPTION     => 'Slot U78A5.001.WIH5D66-P2-C4',
             CAPACITY    => '4096'
@@ -198,7 +178,6 @@ my %tests = (
             NUMSLOTS    => 12,
             SERIALNUMBER=> 'YLD00F930748',
             DESCRIPTION => 'Memory DIMM',
-            VERSION     => 'ipzSeries',
             TYPE        => '43X5036',
             CAPTION     => 'Slot U78A5.001.WIH5D66-P2-C5',
             CAPACITY    => '4096'
@@ -207,7 +186,6 @@ my %tests = (
             NUMSLOTS    => 13,
             SERIALNUMBER=> 'YLD00B410C26',
             DESCRIPTION => 'Memory DIMM',
-            VERSION     => 'ipzSeries',
             TYPE        => '43X5036',
             CAPTION     => 'Slot U78A5.001.WIH5D66-P2-C6',
             CAPACITY    => '4096'
@@ -216,7 +194,6 @@ my %tests = (
             NUMSLOTS    => 14,
             SERIALNUMBER=> 'YLD00E34627B',
             DESCRIPTION => 'Memory DIMM',
-            VERSION     => 'ipzSeries',
             TYPE        => '43X5036',
             CAPTION     => 'Slot U78A5.001.WIH5D66-P2-C7',
             CAPACITY    => '4096'
@@ -225,7 +202,6 @@ my %tests = (
             NUMSLOTS    => 15,
             SERIALNUMBER=> 'YLD00A610973',
             DESCRIPTION => 'Memory DIMM',
-            VERSION     => 'ipzSeries',
             TYPE        => '43X5036',
             CAPTION     => 'Slot U78A5.001.WIH5D66-P2-C8',
             CAPACITY    => '4096'
@@ -236,7 +212,6 @@ my %tests = (
             NUMSLOTS    => 0,
             SERIALNUMBER=> 'YLD0014403BC',
             DESCRIPTION => 'Memory DIMM',
-            VERSION     => 'ipzSeries',
             TYPE        => '43X5035',
             CAPTION     => 'Slot U78A5.001.WIH55B2-P1-C1',
             CAPACITY    => '2048'
@@ -245,7 +220,6 @@ my %tests = (
             NUMSLOTS    => 1,
             SERIALNUMBER=> 'YLD0004403BB',
             DESCRIPTION => 'Memory DIMM',
-            VERSION     => 'ipzSeries',
             TYPE        => '43X5035',
             CAPTION     => 'Slot U78A5.001.WIH55B2-P1-C3',
             CAPACITY    => '2048'
@@ -256,7 +230,6 @@ my %tests = (
             NUMSLOTS    => 0,
             SERIALNUMBER=> 'YLD00030486D',
             DESCRIPTION => 'Memory DIMM',
-            VERSION     => 'ipzSeries',
             TYPE        => '77P8784',
             CAPTION     => 'Slot U78A0.001.DNWHPLG-P1-C13-C2',
             CAPACITY    => '4096'
@@ -265,7 +238,6 @@ my %tests = (
             NUMSLOTS    => 1,
             SERIALNUMBER=> 'YLD003304853',
             DESCRIPTION => 'Memory DIMM',
-            VERSION     => 'ipzSeries',
             TYPE        => '77P8784',
             CAPTION     => 'Slot U78A0.001.DNWHPLG-P1-C13-C3',
             CAPACITY    => '4096'
@@ -274,7 +246,6 @@ my %tests = (
             NUMSLOTS    => 2,
             SERIALNUMBER=> 'YLD0013047DE',
             DESCRIPTION => 'Memory DIMM',
-            VERSION     => 'ipzSeries',
             TYPE        => '77P8784',
             CAPTION     => 'Slot U78A0.001.DNWHPLG-P1-C13-C4',
             CAPACITY    => '4096'
@@ -283,7 +254,6 @@ my %tests = (
             NUMSLOTS    => 3,
             SERIALNUMBER=> 'YLD002304855',
             DESCRIPTION => 'Memory DIMM',
-            VERSION     => 'ipzSeries',
             TYPE        => '77P8784',
             CAPTION     => 'Slot U78A0.001.DNWHPLG-P1-C13-C5',
             CAPACITY    => '4096'
@@ -292,7 +262,6 @@ my %tests = (
             NUMSLOTS    => 4,
             SERIALNUMBER=> 'YLD006304856',
             DESCRIPTION => 'Memory DIMM',
-            VERSION     => 'ipzSeries',
             TYPE        => '77P8784',
             CAPTION     => 'Slot U78A0.001.DNWHPLG-P1-C13-C6',
             CAPACITY    => '4096'
@@ -301,7 +270,6 @@ my %tests = (
             NUMSLOTS    => 5,
             SERIALNUMBER=> 'YLD00530483B',
             DESCRIPTION => 'Memory DIMM',
-            VERSION     => 'ipzSeries',
             TYPE        => '77P8784',
             CAPTION     => 'Slot U78A0.001.DNWHPLG-P1-C13-C7',
             CAPACITY    => '4096'
@@ -310,7 +278,6 @@ my %tests = (
             NUMSLOTS    => 6,
             SERIALNUMBER=> 'YLD007304859',
             DESCRIPTION => 'Memory DIMM',
-            VERSION     => 'ipzSeries',
             TYPE        => '77P8784',
             CAPTION     => 'Slot U78A0.001.DNWHPLG-P1-C13-C8',
             CAPACITY    => '4096'
@@ -319,7 +286,6 @@ my %tests = (
             NUMSLOTS    => 7,
             SERIALNUMBER=> 'YLD00430481E',
             DESCRIPTION => 'Memory DIMM',
-            VERSION     => 'ipzSeries',
             TYPE        => '77P8784',
             CAPTION     => 'Slot U78A0.001.DNWHPLG-P1-C13-C9',
             CAPACITY    => '4096'


================================================================
  Commit: 59283239dd2d83e35287dc06794f25f293559117
      https://github.com/fusinv/fusioninventory-agent/commit/59283239dd2d83e35287dc06794f25f293559117
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-01-06 (Fri, 06 Jan 2012)

  Changed paths:
    M MANIFEST.SKIP

  Log Message:
  -----------
  more exceptions


diff --git a/MANIFEST.SKIP b/MANIFEST.SKIP
index 8f614e9..3b5f123 100644
--- a/MANIFEST.SKIP
+++ b/MANIFEST.SKIP
@@ -5,11 +5,13 @@ CVS/
 ^.gitignore$
 ^.cvsignore$
 .svn
+.merge
 
 ^blib
 ^_build
 ^Build$
 ^cover_db
+^nytprof
 ^Makefile(\.old)?$
 ^MANIFEST\.
 ^pm_to_blib$


================================================================
  Commit: 7568e644430e1f9ed889f56aa6a70175f6242de9
      https://github.com/fusinv/fusioninventory-agent/commit/7568e644430e1f9ed889f56aa6a70175f6242de9
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-01-06 (Fri, 06 Jan 2012)

  Changed paths:
    M Makefile.PL

  Log Message:
  -----------
  update comment


diff --git a/Makefile.PL b/Makefile.PL
index f94fddc..1aa4f63 100644
--- a/Makefile.PL
+++ b/Makefile.PL
@@ -88,7 +88,7 @@ use English qw(-no_match_vars);
 
 our %variables;
 
-# force a perl-independant prefix for everything but perl modules
+# force a perl-independant prefix for everything
 sub constants {
     my ($self) = @_;
 


================================================================
  Commit: cab7edb03629fec3da0b6e4500b991ec5e1b1322
      https://github.com/fusinv/fusioninventory-agent/commit/cab7edb03629fec3da0b6e4500b991ec5e1b1322
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-01-06 (Fri, 06 Jan 2012)

  Changed paths:
    M Makefile.PL

  Log Message:
  -----------
  add junit test results target


diff --git a/Makefile.PL b/Makefile.PL
index 1aa4f63..b9af25b 100644
--- a/Makefile.PL
+++ b/Makefile.PL
@@ -202,3 +202,15 @@ fusioninventory-agent.1.html: fusioninventory-agent
 EOF
     return $manifypods;
 }
+
+sub test {
+    my ($self) = @_;
+    my $test = $self->SUPER::test(@_);
+
+    $test .= <<'EOF';
+junit.xml:
+	prove -l --recurse --formatter TAP::Formatter::JUnit t > junit.xml
+EOF
+
+    return $test;
+}


================================================================
  Commit: 72c643f4da530a5922df521770aa98ca1d42cbc2
      https://github.com/fusinv/fusioninventory-agent/commit/72c643f4da530a5922df521770aa98ca1d42cbc2
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-01-06 (Fri, 06 Jan 2012)

  Changed paths:
    M Makefile.PL

  Log Message:
  -----------
  pass --timer option to probe


diff --git a/Makefile.PL b/Makefile.PL
index b9af25b..0d4434f 100644
--- a/Makefile.PL
+++ b/Makefile.PL
@@ -209,7 +209,8 @@ sub test {
 
     $test .= <<'EOF';
 junit.xml:
-	prove -l --recurse --formatter TAP::Formatter::JUnit t > junit.xml
+	prove --lib --timer --recurse --formatter TAP::Formatter::JUnit t \
+	    > junit.xml
 EOF
 
     return $test;


================================================================
  Commit: 46779d7d8619ebe402dcb34bf983450cfff229bc
      https://github.com/fusinv/fusioninventory-agent/commit/46779d7d8619ebe402dcb34bf983450cfff229bc
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-01-06 (Fri, 06 Jan 2012)

  Changed paths:
    M Makefile.PL

  Log Message:
  -----------
  allow to specific junit result file name


diff --git a/Makefile.PL b/Makefile.PL
index 0d4434f..a5863a6 100644
--- a/Makefile.PL
+++ b/Makefile.PL
@@ -208,9 +208,9 @@ sub test {
     my $test = $self->SUPER::test(@_);
 
     $test .= <<'EOF';
-junit.xml:
+%-junit.xml:
 	prove --lib --timer --recurse --formatter TAP::Formatter::JUnit t \
-	    > junit.xml
+	    > $@
 EOF
 
     return $test;


================================================================
  Commit: 6800d9effa0e67c005bb469296e0f7494d230fa1
      https://github.com/fusinv/fusioninventory-agent/commit/6800d9effa0e67c005bb469296e0f7494d230fa1
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-01-06 (Fri, 06 Jan 2012)

  Changed paths:
    M Makefile.PL

  Log Message:
  -----------
  let user manage output redirection himself


diff --git a/Makefile.PL b/Makefile.PL
index a5863a6..9c91fd5 100644
--- a/Makefile.PL
+++ b/Makefile.PL
@@ -208,9 +208,8 @@ sub test {
     my $test = $self->SUPER::test(@_);
 
     $test .= <<'EOF';
-%-junit.xml:
-	prove --lib --timer --recurse --formatter TAP::Formatter::JUnit t \
-	    > $@
+test-junit:
+	prove --lib --timer --recurse --formatter TAP::Formatter::JUnit t
 EOF
 
     return $test;


================================================================
  Commit: 9581ed0951dd288f329e2116f91156c75ba619f7
      https://github.com/fusinv/fusioninventory-agent/commit/9581ed0951dd288f329e2116f91156c75ba619f7
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-01-06 (Fri, 06 Jan 2012)

  Changed paths:
    M Makefile.PL

  Log Message:
  -----------
  Revert "let user manage output redirection himself"

We don't want the command itself in the output

This reverts commit 6800d9effa0e67c005bb469296e0f7494d230fa1.


diff --git a/Makefile.PL b/Makefile.PL
index 9c91fd5..a5863a6 100644
--- a/Makefile.PL
+++ b/Makefile.PL
@@ -208,8 +208,9 @@ sub test {
     my $test = $self->SUPER::test(@_);
 
     $test .= <<'EOF';
-test-junit:
-	prove --lib --timer --recurse --formatter TAP::Formatter::JUnit t
+%-junit.xml:
+	prove --lib --timer --recurse --formatter TAP::Formatter::JUnit t \
+	    > $@
 EOF
 
     return $test;


================================================================
  Commit: a4ebd2193dcc488d789b7b0eadf91ab19c802e62
      https://github.com/fusinv/fusioninventory-agent/commit/a4ebd2193dcc488d789b7b0eadf91ab19c802e62
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-01-10 (Tue, 10 Jan 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm

  Log Message:
  -----------
  use UNIVERSAL::require, instead of require keyword


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
index e084653..05a899a 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
@@ -73,20 +73,26 @@ sub _getScreensFromWindows {
 
     my $devices = {};
     my $Registry;
-    eval {
-        require FusionInventory::Agent::Tools::Win32;
-        require Win32::TieRegistry;
-        Win32::TieRegistry->import(
-            Delimiter   => '/',
-            ArrayValues => 0,
-            TiedRef     => \$Registry
-        );
-    };
+
+    FusionInventory::Agent::Tools::Win32->require();
+    if ($EVAL_ERROR) {
+        print
+            "Failed to load FusionInventory::Agent::Tools::Win32: $EVAL_ERROR";
+        return;
+    }
+
+    Win32::TieRegistry->require();
     if ($EVAL_ERROR) {
-        print "Failed to load Win32::OLE and Win32::TieRegistry\n";
+        print "Failed to load Win32::TieRegistry: $EVAL_ERROR";
         return;
     }
 
+    Win32::TieRegistry->import(
+        Delimiter   => '/',
+        ArrayValues => 0,
+        TiedRef     => \$Registry
+    );
+
     use constant wbemFlagReturnImmediately => 0x10;
     use constant wbemFlagForwardOnly => 0x20;
 


================================================================
  Commit: c35ed7f6073b8db83774bbcda03dfe3ac68eb790
      https://github.com/fusinv/fusioninventory-agent/commit/c35ed7f6073b8db83774bbcda03dfe3ac68eb790
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-01-10 (Tue, 10 Jan 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm

  Log Message:
  -----------
  keep module loading near the place where they are used


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
index 05a899a..d2ded95 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
@@ -72,7 +72,6 @@ sub _getScreensFromWindows {
     my ($logger) = @_;
 
     my $devices = {};
-    my $Registry;
 
     FusionInventory::Agent::Tools::Win32->require();
     if ($EVAL_ERROR) {
@@ -81,18 +80,6 @@ sub _getScreensFromWindows {
         return;
     }
 
-    Win32::TieRegistry->require();
-    if ($EVAL_ERROR) {
-        print "Failed to load Win32::TieRegistry: $EVAL_ERROR";
-        return;
-    }
-
-    Win32::TieRegistry->import(
-        Delimiter   => '/',
-        ArrayValues => 0,
-        TiedRef     => \$Registry
-    );
-
     use constant wbemFlagReturnImmediately => 0x10;
     use constant wbemFlagForwardOnly => 0x20;
 
@@ -133,6 +120,19 @@ sub _getScreensFromWindows {
 
     }
 
+    Win32::TieRegistry->require();
+    if ($EVAL_ERROR) {
+        print "Failed to load Win32::TieRegistry: $EVAL_ERROR";
+        return;
+    }
+
+    my $Registry;
+    Win32::TieRegistry->import(
+        Delimiter   => '/',
+        ArrayValues => 0,
+        TiedRef     => \$Registry
+    );
+
     my @ret;
     foreach my $PNPDeviceID (keys %{$devices}) {
 


================================================================
  Commit: 9717b6317eba1090bf68d8ca1db57f1334cf4ed5
      https://github.com/fusinv/fusioninventory-agent/commit/9717b6317eba1090bf68d8ca1db57f1334cf4ed5
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-01-10 (Tue, 10 Jan 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm

  Log Message:
  -----------
  unused variables


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
index d2ded95..0056e08 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
@@ -80,9 +80,6 @@ sub _getScreensFromWindows {
         return;
     }
 
-    use constant wbemFlagReturnImmediately => 0x10;
-    use constant wbemFlagForwardOnly => 0x20;
-
     # Vista and upper, able to get the second screen
     my $WMIServices = Win32::OLE->GetObject(
         "winmgmts:{impersonationLevel=impersonate,authenticationLevel=Pkt}!//./root/wmi"


================================================================
  Commit: 424adaf12ec35c0f31e8bed6254122ff22a20bfb
      https://github.com/fusinv/fusioninventory-agent/commit/424adaf12ec35c0f31e8bed6254122ff22a20bfb
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-01-10 (Tue, 10 Jan 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm

  Log Message:
  -----------
  use Tools::Win32 functions, instead of direct Win32::OLE ones


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
index 0056e08..77dceb5 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
@@ -81,28 +81,25 @@ sub _getScreensFromWindows {
     }
 
     # Vista and upper, able to get the second screen
-    my $WMIServices = Win32::OLE->GetObject(
-        "winmgmts:{impersonationLevel=impersonate,authenticationLevel=Pkt}!//./root/wmi"
-    );
-
-    foreach my $properties (Win32::OLE::in($WMIServices->InstancesOf(
-        "WMIMonitorID"
-    ))) {
+    foreach my $object (FusionInventory::Agent::Tools::Win32::getWmiObjects(
+        moniker    => 'winmgmts:{impersonationLevel=impersonate,authenticationLevel=Pkt}!//./root/wmi',
+        class      => 'WMIMonitorID',
+        properties => [ qw/InstanceName/ ]
+    )) {
+        next unless $object->{InstanceName};
 
-        next unless $properties->{InstanceName};
-        my $PNPDeviceID = $properties->{InstanceName};
+        my $PNPDeviceID = $object->{InstanceName};
         $PNPDeviceID =~ s/_\d+//;
         $devices->{lc($PNPDeviceID)} = {};
     }
 
-# The generic Win32_DesktopMonitor class, the second screen will be missing
+    # The generic Win32_DesktopMonitor class, the second screen will be missing
     foreach my $object (FusionInventory::Agent::Tools::Win32::getWmiObjects(
         class => 'Win32_DesktopMonitor',
         properties => [ qw/
             Caption MonitorManufacturer MonitorType PNPDeviceID
         / ]
     )) {
-
         next unless $object->{Availability};
         next unless $object->{PNPDeviceID};
         next unless $object->{Availability} == 3;
@@ -114,7 +111,6 @@ sub _getScreensFromWindows {
             manufacturer => $object->{MonitorManufacturer},
             caption      => $object->{Caption}
         };
-
     }
 
     Win32::TieRegistry->require();


================================================================
  Commit: e9cbeec3aa6b8fcba3826e6ef3331eac842b5e02
      https://github.com/fusinv/fusioninventory-agent/commit/e9cbeec3aa6b8fcba3826e6ef3331eac842b5e02
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-01-10 (Tue, 10 Jan 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm

  Log Message:
  -----------
  cleanup


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
index 77dceb5..4e9c460 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
@@ -129,26 +129,17 @@ sub _getScreensFromWindows {
     my @ret;
     foreach my $PNPDeviceID (keys %{$devices}) {
 
+        my $KEY_WOW64_64KEY = 0x100;
 
-        my $machKey;
-        {
-            my $KEY_WOW64_64KEY = 0x100;
+        my $access = FusionInventory::Agent::Tools::Win32::is64bit() ?
+            Win32::TieRegistry::KEY_READ() | $KEY_WOW64_64KEY :
+            Win32::TieRegistry::KEY_READ();
 
-            my $access;
-
-            if (FusionInventory::Agent::Tools::Win32::is64bit()) {
-                $access = Win32::TieRegistry::KEY_READ() | $KEY_WOW64_64KEY;
-            } else {
-                $access = Win32::TieRegistry::KEY_READ();
-            }
-
-# Win32-specifics constants can not be loaded on non-Windows OS
-            no strict 'subs';
-            $machKey = $Registry->Open('LMachine', {
-                Access => $access
-            } ) or $logger->fault("Can't open HKEY_LOCAL_MACHINE key: $EXTENDED_OS_ERROR");
-
-        }
+        my $machKey = $Registry->Open('LMachine', {
+            Access => $access
+        } ) or $logger->fault(
+            "Can't open HKEY_LOCAL_MACHINE key: $EXTENDED_OS_ERROR"
+        );
 
         $devices->{$PNPDeviceID}{edid} =
             $machKey->{"SYSTEM/CurrentControlSet/Enum/".$PNPDeviceID."/Device Parameters/EDID"} || '';


================================================================
  Commit: 03c7d4cd7c79822bdbcee9aa3d64afacf0e32b39
      https://github.com/fusinv/fusioninventory-agent/commit/03c7d4cd7c79822bdbcee9aa3d64afacf0e32b39
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-01-10 (Tue, 10 Jan 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm

  Log Message:
  -----------
  split unix screens computing into its own function


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
index 4e9c460..df0dc4b 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
@@ -151,35 +151,28 @@ sub _getScreensFromWindows {
 
 }
 
+sub _getScreensFromUnix {
 
+    my $raw_edid =
+        getFirstLine(command => 'monitor-get-edid-using-vbe') ||
+        getFirstLine(command => 'monitor-get-edid');
 
-sub _getScreens {
-    my ($logger) = @_;
-
-    my @screens;
-
-    if ($OSNAME eq 'MSWin32') {
-
-        return _getScreensFromWindows($logger);
-
-    } else {
-        # Mandriva
-        my $raw_edid =
-            getFirstLine(command => 'monitor-get-edid-using-vbe') ||
-            getFirstLine(command => 'monitor-get-edid');
-
-        if (!$raw_edid) {
-            foreach (1..5) { # Sometime get-edid return an empty string...
-                $raw_edid = getFirstLine(command => 'get-edid');
-                last if $raw_edid && (length($raw_edid) == 128 || length($raw_edid) == 256);
-            }
+    if (!$raw_edid) {
+        foreach (1..5) { # Sometime get-edid return an empty string...
+            $raw_edid = getFirstLine(command => 'get-edid');
+            last if $raw_edid && (length($raw_edid) == 128 || length($raw_edid) == 256);
         }
-        return unless length($raw_edid) == 128 || length($raw_edid) == 256;
-
-        push @screens, { edid => $raw_edid };
     }
+    return unless length($raw_edid) == 128 || length($raw_edid) == 256;
+
+    return ( { edid => $raw_edid } );
+}
+
+sub _getScreens {
+    my ($logger) = @_;
 
-    return @screens;
+    return $OSNAME eq 'MSWin32' ?
+        _getScreensFromWindows($logger) : _getScreensFromUnix($logger);
 }
 
 1;


================================================================
  Commit: 6d2c452bc734b43ac7ca6fb711757b4111df9f1b
      https://github.com/fusinv/fusioninventory-agent/commit/6d2c452bc734b43ac7ca6fb711757b4111df9f1b
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-01-10 (Tue, 10 Jan 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm

  Log Message:
  -----------
  no need to use an hash to store results, indexed access is never used


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
index df0dc4b..17130fb 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
@@ -71,8 +71,6 @@ sub doInventory {
 sub _getScreensFromWindows {
     my ($logger) = @_;
 
-    my $devices = {};
-
     FusionInventory::Agent::Tools::Win32->require();
     if ($EVAL_ERROR) {
         print
@@ -80,6 +78,8 @@ sub _getScreensFromWindows {
         return;
     }
 
+    my @screens;
+
     # Vista and upper, able to get the second screen
     foreach my $object (FusionInventory::Agent::Tools::Win32::getWmiObjects(
         moniker    => 'winmgmts:{impersonationLevel=impersonate,authenticationLevel=Pkt}!//./root/wmi',
@@ -90,7 +90,9 @@ sub _getScreensFromWindows {
 
         my $PNPDeviceID = $object->{InstanceName};
         $PNPDeviceID =~ s/_\d+//;
-        $devices->{lc($PNPDeviceID)} = {};
+        push @screens, {
+            id => $object->{PNPDeviceID}
+        };
     }
 
     # The generic Win32_DesktopMonitor class, the second screen will be missing
@@ -105,7 +107,8 @@ sub _getScreensFromWindows {
         next unless $object->{Availability} == 3;
         my $name = $object->{Caption};
 
-        $devices->{lc($object->{PNPDeviceID})} = {
+        push @screens, {
+            id           => $object->{PNPDeviceID},
             name         => $name,
             type         => $object->{MonitorType},
             manufacturer => $object->{MonitorManufacturer},
@@ -126,8 +129,7 @@ sub _getScreensFromWindows {
         TiedRef     => \$Registry
     );
 
-    my @ret;
-    foreach my $PNPDeviceID (keys %{$devices}) {
+    foreach my $screen (@screens) {
 
         my $KEY_WOW64_64KEY = 0x100;
 
@@ -141,14 +143,13 @@ sub _getScreensFromWindows {
             "Can't open HKEY_LOCAL_MACHINE key: $EXTENDED_OS_ERROR"
         );
 
-        $devices->{$PNPDeviceID}{edid} =
-            $machKey->{"SYSTEM/CurrentControlSet/Enum/".$PNPDeviceID."/Device Parameters/EDID"} || '';
-        $devices->{$PNPDeviceID}{edid} =~ s/^\s+$//;
+        $screen->{edid} =
+            $machKey->{"SYSTEM/CurrentControlSet/Enum/$screen->{id}/Device Parameters/EDID"} || '';
+        $screen->{edid} =~ s/^\s+$//;
 
-        push @ret, $devices->{$PNPDeviceID};
     }
-    return @ret;
 
+    return @screens;
 }
 
 sub _getScreensFromUnix {


================================================================
  Commit: beddf63818dd54a5b0b3a3b4baa499ed3f8c47c7
      https://github.com/fusinv/fusioninventory-agent/commit/beddf63818dd54a5b0b3a3b4baa499ed3f8c47c7
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-01-10 (Tue, 10 Jan 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm

  Log Message:
  -----------
  useless intermediate variable


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
index 17130fb..9fc659a 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
@@ -105,11 +105,10 @@ sub _getScreensFromWindows {
         next unless $object->{Availability};
         next unless $object->{PNPDeviceID};
         next unless $object->{Availability} == 3;
-        my $name = $object->{Caption};
 
         push @screens, {
             id           => $object->{PNPDeviceID},
-            name         => $name,
+            name         => $object->{Caption},
             type         => $object->{MonitorType},
             manufacturer => $object->{MonitorManufacturer},
             caption      => $object->{Caption}


================================================================
  Commit: dbdbedd2e301a6e94f0b011c534c4d6dcf3a6d61
      https://github.com/fusinv/fusioninventory-agent/commit/dbdbedd2e301a6e94f0b011c534c4d6dcf3a6d61
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-01-10 (Tue, 10 Jan 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm

  Log Message:
  -----------
  don't duplicate constants


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
index 9fc659a..909da4e 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
@@ -130,10 +130,9 @@ sub _getScreensFromWindows {
 
     foreach my $screen (@screens) {
 
-        my $KEY_WOW64_64KEY = 0x100;
-
         my $access = FusionInventory::Agent::Tools::Win32::is64bit() ?
-            Win32::TieRegistry::KEY_READ() | $KEY_WOW64_64KEY :
+            Win32::TieRegistry::KEY_READ() |
+                FusionInventory::Agent::Tools::Win32::KEY_WOW64_64() :
             Win32::TieRegistry::KEY_READ();
 
         my $machKey = $Registry->Open('LMachine', {


================================================================
  Commit: 52dbd190ba1e6d1a559fe0965d44f001151ef1e2
      https://github.com/fusinv/fusioninventory-agent/commit/52dbd190ba1e6d1a559fe0965d44f001151ef1e2
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-01-10 (Tue, 10 Jan 2012)

  Changed paths:
    M t/01compile.t
    M t/04pod-coverage.t
    M t/FusionInventory/Test/Utils.pm

  Log Message:
  -----------
  use local filtering functions to work on filename or namespace


diff --git a/t/01compile.t b/t/01compile.t
index a5d445d..330e077 100755
--- a/t/01compile.t
+++ b/t/01compile.t
@@ -7,7 +7,6 @@ use English qw(-no_match_vars);
 use Test::More;
 
 use lib 't';
-use FusionInventory::Test::Utils;
 
 eval {
     require Test::Compile;
@@ -29,3 +28,11 @@ if ($OSNAME eq 'MSWin32') {
 my @files = grep { filter($_) } all_pm_files('lib');
 
 all_pm_files_ok(@files);
+
+# filename-based filter
+sub filter {
+    return 0 if $_ =~ m{FusionInventory/VMware};
+    return 1 if $_ =~ m{FusionInventory/Agent/Task/(Inventory|WakeOnLan)};
+    return 0 if $_ =~ m{FusionInventory/Agent/Task};
+    return 1;
+}
diff --git a/t/04pod-coverage.t b/t/04pod-coverage.t
index 7e9e1f2..bc59126 100755
--- a/t/04pod-coverage.t
+++ b/t/04pod-coverage.t
@@ -3,11 +3,11 @@
 
 use strict;
 use warnings;
+
 use Test::More;
 use English qw(-no_match_vars);
 
 use lib 't';
-use FusionInventory::Test::Utils;
 
 if (!$ENV{TEST_AUTHOR}) {
     my $msg = 'Author test. Set $ENV{TEST_AUTHOR} to a true value to run.';
@@ -43,3 +43,11 @@ foreach my $module (@modules) {
         }
     );
 }
+
+# namespace-based filter
+sub filter {
+    return 0 if $_ =~ m{FusionInventory::VMware};
+    return 1 if $_ =~ m{FusionInventory::Agent::Task::(Inventory|WakeOnLan)};
+    return 0 if $_ =~ m{FusionInventory::Agent::Task};
+    return 1;
+}
diff --git a/t/FusionInventory/Test/Utils.pm b/t/FusionInventory/Test/Utils.pm
index 5d2b7be..8d1cb0a 100644
--- a/t/FusionInventory/Test/Utils.pm
+++ b/t/FusionInventory/Test/Utils.pm
@@ -8,7 +8,6 @@ use Socket;
 
 our @EXPORT = qw(
     test_port
-    filter
 );
 
 sub test_port {
@@ -26,20 +25,3 @@ sub test_port {
 
     return 0;
 }
-
-# blacklist additional tasks that may be installed
-sub filter {
-    if ($_ =~ m{FusionInventory/VMware}) {
-        return 0;
-    }
-    if ($_ =~ m{FusionInventory/Agent/Tools}) {
-        return 1;
-    }
-    if ($_ !~ m{FusionInventory/Agent/Task/(Inventory|WakeOnLan)}) {
-        return 0;
-    }
-    return 1;
-}
-
-
-


================================================================
  Commit: cc0a9d77dbb02d89bd64f1e9a1d58b28cd40a9d7
      https://github.com/fusinv/fusioninventory-agent/commit/cc0a9d77dbb02d89bd64f1e9a1d58b28cd40a9d7
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-01-10 (Tue, 10 Jan 2012)

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

  Log Message:
  -----------
  keep modules import statement out of BEGIN block


diff --git a/lib/FusionInventory/Agent/Tools/Hostname.pm b/lib/FusionInventory/Agent/Tools/Hostname.pm
index c85498a..f7813e5 100644
--- a/lib/FusionInventory/Agent/Tools/Hostname.pm
+++ b/lib/FusionInventory/Agent/Tools/Hostname.pm
@@ -3,10 +3,11 @@ package FusionInventory::Agent::Tools::Hostname;
 use strict;
 use warnings;
 
-BEGIN {
-    use UNIVERSAL::require();
-    use English qw(-no_match_vars);
+use UNIVERSAL::require();
+use Encode;
+use English qw(-no_match_vars);
 
+BEGIN {
     if ($OSNAME eq 'MSWin32') {
         Win32::API->require();
         # Kernel32.dll is used more or less everywhere.
@@ -16,13 +17,9 @@ BEGIN {
     }
 }
 
-use Encode;
-
 sub getHostname {
 
     if ($OSNAME eq 'MSWin32') {
-
-
         my $GetComputerName = Win32::API->new("kernel32", "GetComputerNameExW", ["I", "P", "P"], "N");
         my $buffer = "\x00" x 1024;
         my $N=1024;#pack ("c4", 160,0,0,0);
@@ -33,12 +30,10 @@ sub getHostname {
         # to UTF8
         return encode("UTF-8", substr(decode("UCS-2le", $buffer),0,ord $N));
     } else {
-
         Sys::Hostname->require();
         return Sys::Hostname::hostname();
         return
     }
- 
 
 }
 


================================================================
  Commit: c4b7de573f5d82df59bb220c7a9adacecec3c2af
      https://github.com/fusinv/fusioninventory-agent/commit/c4b7de573f5d82df59bb220c7a9adacecec3c2af
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-01-10 (Tue, 10 Jan 2012)

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

  Log Message:
  -----------
  no need for multiple return


diff --git a/lib/FusionInventory/Agent/Tools/Hostname.pm b/lib/FusionInventory/Agent/Tools/Hostname.pm
index f7813e5..3d1f19a 100644
--- a/lib/FusionInventory/Agent/Tools/Hostname.pm
+++ b/lib/FusionInventory/Agent/Tools/Hostname.pm
@@ -32,7 +32,6 @@ sub getHostname {
     } else {
         Sys::Hostname->require();
         return Sys::Hostname::hostname();
-        return
     }
 
 }


================================================================
  Commit: b893d8b9e1aeb80a06f2c3b1505ce8fd6f7c9a96
      https://github.com/fusinv/fusioninventory-agent/commit/b893d8b9e1aeb80a06f2c3b1505ce8fd6f7c9a96
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-01-10 (Tue, 10 Jan 2012)

  Changed paths:
    M lib/FusionInventory/Agent.pm
    M lib/FusionInventory/Agent/HTTP/Server.pm
    M lib/FusionInventory/Agent/Tools/Hostname.pm
    M lib/FusionInventory/Agent/Tools/Win32.pm

  Log Message:
  -----------
  fix missing documentation


diff --git a/lib/FusionInventory/Agent.pm b/lib/FusionInventory/Agent.pm
index 4491937..45da0af 100644
--- a/lib/FusionInventory/Agent.pm
+++ b/lib/FusionInventory/Agent.pm
@@ -448,6 +448,10 @@ the options to use.
 
 =back
 
+=head2 init()
+
+Initialize the agent.
+
 =head2 run()
 
 Run the agent.
diff --git a/lib/FusionInventory/Agent/HTTP/Server.pm b/lib/FusionInventory/Agent/HTTP/Server.pm
index 139744f..9ce4400 100644
--- a/lib/FusionInventory/Agent/HTTP/Server.pm
+++ b/lib/FusionInventory/Agent/HTTP/Server.pm
@@ -375,3 +375,7 @@ an IP adress or an IP adress range from which to trust incoming requests
 without authentication token (default: none)
 
 =back
+
+=head2 terminate
+
+Ensure the listening thread terminates.
diff --git a/lib/FusionInventory/Agent/Tools/Hostname.pm b/lib/FusionInventory/Agent/Tools/Hostname.pm
index 3d1f19a..3c73a80 100644
--- a/lib/FusionInventory/Agent/Tools/Hostname.pm
+++ b/lib/FusionInventory/Agent/Tools/Hostname.pm
@@ -37,3 +37,18 @@ sub getHostname {
 }
 
 1;
+__END__
+
+=head1 NAME
+
+FusionInventory::Agent::Tools::Hostname - OS-independant hostname computing
+
+=head1 DESCRIPTION
+
+This module provides a generic function to retrieve host name
+
+=head1 FUNCTIONS
+
+=head2 getHostname()
+
+Returns the host name.
diff --git a/lib/FusionInventory/Agent/Tools/Win32.pm b/lib/FusionInventory/Agent/Tools/Win32.pm
index d164dbd..7e816f9 100644
--- a/lib/FusionInventory/Agent/Tools/Win32.pm
+++ b/lib/FusionInventory/Agent/Tools/Win32.pm
@@ -140,6 +140,10 @@ This module provides some Windows-specific generic functions.
 
 Returns true if the OS is 64bit or false.
 
+=head2 getLocalcodepage()
+
+Returns the local codepage.
+
 =head2 getWmiObjects(%params)
 
 Returns the list of objects from given WMI class, with given properties, properly encoded.


================================================================
  Commit: 8ea381e50620ac71eeb6d529928b81fe46fd8f57
      https://github.com/fusinv/fusioninventory-agent/commit/8ea381e50620ac71eeb6d529928b81fe46fd8f57
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-01-10 (Tue, 10 Jan 2012)

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

  Log Message:
  -----------
  proper capitalisation


diff --git a/lib/FusionInventory/Agent/Tools/Win32.pm b/lib/FusionInventory/Agent/Tools/Win32.pm
index 7e816f9..6624a0e 100644
--- a/lib/FusionInventory/Agent/Tools/Win32.pm
+++ b/lib/FusionInventory/Agent/Tools/Win32.pm
@@ -31,7 +31,7 @@ our @EXPORT = qw(
     KEY_WOW64_32
     getRegistryValue
     getWmiObjects
-    getLocalcodepage
+    getLocalCodepage
 );
 
 sub is64bit {
@@ -43,7 +43,7 @@ sub is64bit {
         );
 }
 
-sub getLocalcodepage {
+sub getLocalCodepage {
     if (!$localCodepage) {
         my $lmachine = $Registry->Open('LMachine', {
             Access => KEY_READ
@@ -66,7 +66,7 @@ sub encodeFromRegistry {
     ## no critic (ExplicitReturnUndef)
     return undef unless $string;
 
-    return encode("UTF-8", decode(getLocalcodepage(), $string));
+    return encode("UTF-8", decode(getLocalCodepage(), $string));
 }
 
 sub getWmiObjects {
@@ -140,7 +140,7 @@ This module provides some Windows-specific generic functions.
 
 Returns true if the OS is 64bit or false.
 
-=head2 getLocalcodepage()
+=head2 getLocalCodepage()
 
 Returns the local codepage.
 


================================================================
  Commit: 8f9104d6ff23c26dbdfd0122f2d5bd5aa7c52c79
      https://github.com/fusinv/fusioninventory-agent/commit/8f9104d6ff23c26dbdfd0122f2d5bd5aa7c52c79
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-01-10 (Tue, 10 Jan 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm

  Log Message:
  -----------
  ensure Win32::TieRegistry loading always works under windows


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
index 909da4e..4be0f7c 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
@@ -115,13 +115,8 @@ sub _getScreensFromWindows {
         };
     }
 
-    Win32::TieRegistry->require();
-    if ($EVAL_ERROR) {
-        print "Failed to load Win32::TieRegistry: $EVAL_ERROR";
-        return;
-    }
-
     my $Registry;
+    Win32::TieRegistry->require();
     Win32::TieRegistry->import(
         Delimiter   => '/',
         ArrayValues => 0,


================================================================
  Commit: e8935065cd69a53337824f3982e15039f7d91f81
      https://github.com/fusinv/fusioninventory-agent/commit/e8935065cd69a53337824f3982e15039f7d91f81
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-01-11 (Wed, 11 Jan 2012)

  Changed paths:
    M lib/FusionInventory/Agent.pm

  Log Message:
  -----------
  prepare 4th prerelease of the 2.2.0 agent


diff --git a/lib/FusionInventory/Agent.pm b/lib/FusionInventory/Agent.pm
index 45da0af..3673bfa 100644
--- a/lib/FusionInventory/Agent.pm
+++ b/lib/FusionInventory/Agent.pm
@@ -21,7 +21,7 @@ use FusionInventory::Agent::Tools;
 use FusionInventory::Agent::Tools::Hostname;
 use FusionInventory::Agent::XML::Query::Prolog;
 
-our $VERSION = '2.1.9903';
+our $VERSION = '2.1.9904';
 our $VERSION_STRING = 
     "FusionInventory unified agent for UNIX, Linux and MacOSX ($VERSION)";
 our $AGENT_STRING =


================================================================
  Commit: e2a82c95cce5170e372c6dbfcbed243a732a9c32
      https://github.com/fusinv/fusioninventory-agent/commit/e2a82c95cce5170e372c6dbfcbed243a732a9c32
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-01-11 (Wed, 11 Jan 2012)

  Changed paths:
    M .gitignore
    M tools/createExtLinks.sh

  Log Message:
  -----------
  add a missing symlink

lib/FusionInventory/Agent/SNMP.pm


diff --git a/.gitignore b/.gitignore
index f7a4036..6716e84 100644
--- a/.gitignore
+++ b/.gitignore
@@ -14,6 +14,7 @@ lib/FusionInventory/Agent/Task/SNMPQuery
 lib/FusionInventory/Agent/Task/Deploy
 lib/FusionInventory/Agent/Task/Deploy.pm
 lib/FusionInventory/Agent/Task/ESX.pm
+lib/FusionInventory/Agent/SNMP.pm
 pm_to_blib
 ./README
 *~
diff --git a/tools/createExtLinks.sh b/tools/createExtLinks.sh
index d921f61..41d5242 100755
--- a/tools/createExtLinks.sh
+++ b/tools/createExtLinks.sh
@@ -17,6 +17,10 @@ done
 if [ ! -e lib/FusionInventory/VMware ]; then
     ln -s $PWD/../agent-task-esx/lib/FusionInventory/VMware lib/FusionInventory/
 fi
+if [ ! -e lib/FusionInventory/Agent/SNMP.pm ]; then
+    ln -s $PWD/../agent-task-netdiscovery/lib/FusionInventory/Agent/SNMP.pm lib/FusionInventory/Agent/SNMP.pm
+fi
+
 if [ ! -e fusioninventory-esx ]; then
     ln -s $PWD/../agent-task-esx/fusioninventory-esx .
 fi


================================================================
  Commit: 7e5242b4166355a00aca6611c3c81361cdaec1cd
      https://github.com/fusinv/fusioninventory-agent/commit/7e5242b4166355a00aca6611c3c81361cdaec1cd
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-01-17 (Tue, 17 Jan 2012)

  Changed paths:
    M lib/FusionInventory/Agent/HTTP/Client.pm

  Log Message:
  -----------
  uneeded quoting


diff --git a/lib/FusionInventory/Agent/HTTP/Client.pm b/lib/FusionInventory/Agent/HTTP/Client.pm
index bd782a8..f117248 100644
--- a/lib/FusionInventory/Agent/HTTP/Client.pm
+++ b/lib/FusionInventory/Agent/HTTP/Client.pm
@@ -128,10 +128,10 @@ sub _setSSLOptions {
     my ($self) = @_;
 
     # SSL handling
-    if ($self->{'no_ssl_check'}) {
-# IO::Socket::SSL default behavior is to check the SSL hostname
-# We run it in a eval to avoid break if the ssl_opts doesn't work on some
-# old LWP
+    if ($self->{no_ssl_check}) {
+        # IO::Socket::SSL default behavior is to check the SSL hostname
+        # We run it in a eval to avoid break if the ssl_opts doesn't work
+        # with old LWP
        eval { $self->{ua}->ssl_opts(verify_hostname => 0); }
     } else {
         # only IO::Socket::SSL can perform full server certificate validation,
@@ -145,10 +145,10 @@ sub _setSSLOptions {
             if $EVAL_ERROR;
 
         if ($LWP::VERSION >= 6) {
-            $self->{ua}->ssl_opts(SSL_ca_file => $self->{'ca_cert_file'})
-                if $self->{'ca_cert_file'};
-            $self->{ua}->ssl_opts(SSL_ca_path => $self->{'ca_cert_dir'})
-                if $self->{'ca_cert_dir'};
+            $self->{ua}->ssl_opts(SSL_ca_file => $self->{ca_cert_file})
+                if $self->{ca_cert_file};
+            $self->{ua}->ssl_opts(SSL_ca_path => $self->{ca_cert_dir})
+                if $self->{ca_cert_dir};
         } else {
             # SSL_verifycn_scheme and SSL_verifycn_name are required
             die 
@@ -159,8 +159,8 @@ sub _setSSLOptions {
 
             # use a custom HTTPS handler to workaround default LWP5 behaviour
             FusionInventory::Agent::HTTP::Protocol::https->use(
-                ca_cert_file => $self->{'ca_cert_file'},
-                ca_cert_dir  => $self->{'ca_cert_dir'},
+                ca_cert_file => $self->{ca_cert_file},
+                ca_cert_dir  => $self->{ca_cert_dir},
             );
             die 
                 "failed to load FusionInventory::Agent::HTTP::Protocol::https" .
@@ -174,7 +174,7 @@ sub _setSSLOptions {
 
             # abuse user agent internal to pass values to the handler, so
             # as to have different behaviors in the same process
-            $self->{ua}->{ssl_check} = $self->{'no_ssl_check'} ? 0 : 1;
+            $self->{ua}->{ssl_check} = $self->{no_ssl_check} ? 0 : 1;
         }
     }
 


================================================================
  Commit: 1f5f1601d62a5a549c21a50b4985bc93e0f5f4a2
      https://github.com/fusinv/fusioninventory-agent/commit/1f5f1601d62a5a549c21a50b4985bc93e0f5f4a2
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-01-17 (Tue, 17 Jan 2012)

  Changed paths:
    M lib/FusionInventory/Agent/HTTP/Client.pm

  Log Message:
  -----------
  use an explicit condition


diff --git a/lib/FusionInventory/Agent/HTTP/Client.pm b/lib/FusionInventory/Agent/HTTP/Client.pm
index f117248..0f322c4 100644
--- a/lib/FusionInventory/Agent/HTTP/Client.pm
+++ b/lib/FusionInventory/Agent/HTTP/Client.pm
@@ -130,9 +130,7 @@ sub _setSSLOptions {
     # SSL handling
     if ($self->{no_ssl_check}) {
         # IO::Socket::SSL default behavior is to check the SSL hostname
-        # We run it in a eval to avoid break if the ssl_opts doesn't work
-        # with old LWP
-       eval { $self->{ua}->ssl_opts(verify_hostname => 0); }
+       $self->{ua}->ssl_opts(verify_hostname => 0) if $LWP::VERSION >= 6;
     } else {
         # only IO::Socket::SSL can perform full server certificate validation,
         # Net::SSL is only able to check certification authority, and not


================================================================
  Commit: 0d7c459832c56150f2f3d349df2a0e9afabebb67
      https://github.com/fusinv/fusioninventory-agent/commit/0d7c459832c56150f2f3d349df2a0e9afabebb67
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-01-17 (Tue, 17 Jan 2012)

  Changed paths:
    M lib/FusionInventory/Agent/HTTP/Protocol/https.pm

  Log Message:
  -----------
  uneeded quoting


diff --git a/lib/FusionInventory/Agent/HTTP/Protocol/https.pm b/lib/FusionInventory/Agent/HTTP/Protocol/https.pm
index 9681ffc..c07fe99 100644
--- a/lib/FusionInventory/Agent/HTTP/Protocol/https.pm
+++ b/lib/FusionInventory/Agent/HTTP/Protocol/https.pm
@@ -10,10 +10,10 @@ sub import {
     my ($class, %params) = @_;
 
     # set default context
-    IO::Socket::SSL::set_ctx_defaults(ca_file => $params{'ca_cert_file'})
-        if $params{'ca_cert_file'};
-    IO::Socket::SSL::set_ctx_defaults(ca_path => $params{'ca_cert_dir'})
-        if $params{'ca_cert_dir'};
+    IO::Socket::SSL::set_ctx_defaults(ca_file => $params{ca_cert_file})
+        if $params{ca_cert_file};
+    IO::Socket::SSL::set_ctx_defaults(ca_path => $params{ca_cert_dir})
+        if $params{ca_cert_dir};
 }
 
 sub _extra_sock_opts {


================================================================
  Commit: 0e95737ce35bb3c775e5446423cee9ad6d34c21d
      https://github.com/fusinv/fusioninventory-agent/commit/0e95737ce35bb3c775e5446423cee9ad6d34c21d
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-01-18 (Wed, 18 Jan 2012)

  Changed paths:
    M .gitignore
    M lib/FusionInventory/Agent.pm
    M tools/createExtLinks.sh

  Log Message:
  -----------
  Merge remote-tracking branch 'forge/2.2.x' into 2.2.x


diff --git a/.gitignore b/.gitignore
index f7a4036..6716e84 100644
--- a/.gitignore
+++ b/.gitignore
@@ -14,6 +14,7 @@ lib/FusionInventory/Agent/Task/SNMPQuery
 lib/FusionInventory/Agent/Task/Deploy
 lib/FusionInventory/Agent/Task/Deploy.pm
 lib/FusionInventory/Agent/Task/ESX.pm
+lib/FusionInventory/Agent/SNMP.pm
 pm_to_blib
 ./README
 *~
diff --git a/lib/FusionInventory/Agent.pm b/lib/FusionInventory/Agent.pm
index 45da0af..3673bfa 100644
--- a/lib/FusionInventory/Agent.pm
+++ b/lib/FusionInventory/Agent.pm
@@ -21,7 +21,7 @@ use FusionInventory::Agent::Tools;
 use FusionInventory::Agent::Tools::Hostname;
 use FusionInventory::Agent::XML::Query::Prolog;
 
-our $VERSION = '2.1.9903';
+our $VERSION = '2.1.9904';
 our $VERSION_STRING = 
     "FusionInventory unified agent for UNIX, Linux and MacOSX ($VERSION)";
 our $AGENT_STRING =
diff --git a/tools/createExtLinks.sh b/tools/createExtLinks.sh
index d921f61..41d5242 100755
--- a/tools/createExtLinks.sh
+++ b/tools/createExtLinks.sh
@@ -17,6 +17,10 @@ done
 if [ ! -e lib/FusionInventory/VMware ]; then
     ln -s $PWD/../agent-task-esx/lib/FusionInventory/VMware lib/FusionInventory/
 fi
+if [ ! -e lib/FusionInventory/Agent/SNMP.pm ]; then
+    ln -s $PWD/../agent-task-netdiscovery/lib/FusionInventory/Agent/SNMP.pm lib/FusionInventory/Agent/SNMP.pm
+fi
+
 if [ ! -e fusioninventory-esx ]; then
     ln -s $PWD/../agent-task-esx/fusioninventory-esx .
 fi


================================================================
  Commit: 0681a8c5d3078245b3f3728aa54be344e1afae9e
      https://github.com/fusinv/fusioninventory-agent/commit/0681a8c5d3078245b3f3728aa54be344e1afae9e
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-01-20 (Fri, 20 Jan 2012)

  Changed paths:
    M lib/FusionInventory/Agent/HTTP/Client.pm

  Log Message:
  -----------
  change condition

Fedora backported behaviour change from LWP 6 to LWP 5, so the check
should be done on method availability, not on LWP version


diff --git a/lib/FusionInventory/Agent/HTTP/Client.pm b/lib/FusionInventory/Agent/HTTP/Client.pm
index 0f322c4..8c1940f 100644
--- a/lib/FusionInventory/Agent/HTTP/Client.pm
+++ b/lib/FusionInventory/Agent/HTTP/Client.pm
@@ -129,8 +129,11 @@ sub _setSSLOptions {
 
     # SSL handling
     if ($self->{no_ssl_check}) {
-        # IO::Socket::SSL default behavior is to check the SSL hostname
-       $self->{ua}->ssl_opts(verify_hostname => 0) if $LWP::VERSION >= 6;
+       # LWP 6 default behaviour is to check hostname
+       # Fedora also backported this behaviour change in its LWP5 package, so
+       # just checking on LWP version is not enough
+       $self->{ua}->ssl_opts(verify_hostname => 0)
+           if $self->{ua}->can('ssl_opts');
     } else {
         # only IO::Socket::SSL can perform full server certificate validation,
         # Net::SSL is only able to check certification authority, and not


================================================================
  Commit: 2599963207a1108fdfd34c4dafb7bea27162164a
      https://github.com/fusinv/fusioninventory-agent/commit/2599963207a1108fdfd34c4dafb7bea27162164a
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-01-24 (Tue, 24 Jan 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/OS/Win32/Bios.pm

  Log Message:
  -----------
  Fix: detect Win2k Xen guest

closes: #1436

Reported-by: Mario Gzuk <mariogzuk at technikz.de>


diff --git a/lib/FusionInventory/Agent/Task/Inventory/OS/Win32/Bios.pm b/lib/FusionInventory/Agent/Task/Inventory/OS/Win32/Bios.pm
index f153039..c0416f1 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/OS/Win32/Bios.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/OS/Win32/Bios.pm
@@ -127,8 +127,9 @@ sub doInventory {
 #    if ($bmanufacturer eq 'Bochs' || $mmodel eq 'Bochs') {
 #        $vmsystem = 'QEMU';
 #    } els
-
-    if ($bversion eq 'VirtualBox' || $mmodel eq 'VirtualBox') {
+    if ($smanufacturer eq 'Xen' || $bmanufacturer eq 'Xen') {
+        $vmsystem = 'Xen';
+    } elsif ($bversion eq 'VirtualBox' || $mmodel eq 'VirtualBox') {
         $vmsystem = 'VirtualBox';
     } elsif ($smodel =~  /VMware/i) {
         $vmsystem = 'VMware';


================================================================
  Commit: a97316fa3265f773ecbdfd2475505e26dc8f1e34
      https://github.com/fusinv/fusioninventory-agent/commit/a97316fa3265f773ecbdfd2475505e26dc8f1e34
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-01-24 (Tue, 24 Jan 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Bios.pm

  Log Message:
  -----------
  Merge fix for #1436 from '2.1.x' into 2.2.x


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Bios.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Bios.pm
index b8e2f95..a3d02be 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Bios.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Bios.pm
@@ -104,6 +104,14 @@ sub doInventory {
         $inventory->setHardware ({
             VMSYSTEM => 'VMware'
         });
+    } elsif (
+        ($bios->{SMANUFACTURER} eq 'Xen')
+         ||
+        ($bios->{BMANUFACTURER} eq 'Xen')
+       ) {
+        $inventory->setHardware ({
+            VMSYSTEM => 'Xen'
+        });
     }
 
 }


================================================================
  Commit: 39f3c75852ded3b1cb7d215c4d7f931fbd3f1d92
      https://github.com/fusinv/fusioninventory-agent/commit/39f3c75852ded3b1cb7d215c4d7f931fbd3f1d92
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-01-26 (Thu, 26 Jan 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/OS/Win32/Software.pm

  Log Message:
  -----------
  import MSIE and MS Office

Import the MSIE version from HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer
and do not ignore hidden software (SystemComponent=1) like MS Office anymore, see: #927.

This patch also add a mechanism to avoid duplicated software (see: #927)

closes: #1441
closes: #1425
closes: #1065

Reported-by: Xavier Caillaud <tsmr at thetsmr.fr>
Reported-by: Walid Nouh <walid.nouh at gmail.com>


diff --git a/lib/FusionInventory/Agent/Task/Inventory/OS/Win32/Software.pm b/lib/FusionInventory/Agent/Task/Inventory/OS/Win32/Software.pm
index e50f1ce..5f85da8 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/OS/Win32/Software.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/OS/Win32/Software.pm
@@ -20,6 +20,8 @@ use Win32::TieRegistry (
 
 use FusionInventory::Agent::Task::Inventory::OS::Win32;
 
+my $seen = {};
+
 sub isInventoryEnabled {
     return 1;
 }
@@ -60,7 +62,7 @@ sub processSoftwares {
     foreach my $rawGuid ( keys %$softwares ) {
         my $data = $softwares->{$rawGuid};
         next unless keys %$data;
-        
+
         my $guid = $rawGuid;
         $guid =~ s/\/$//; # drop the tailing / 
 
@@ -69,10 +71,6 @@ sub processSoftwares {
             next;
         }
 
-# See bug #927
-# http://stackoverflow.com/questions/2639513/duplicate-entries-in-uninstall-registry-key-when-compiling-list-of-installed-soft
-        next if $data->{'/SystemComponent'};
-
         my $name = encodeFromRegistry($data->{'/DisplayName'});
 # Use the folder name if there is no DisplayName
         $name = encodeFromRegistry($guid) unless $name;
@@ -95,7 +93,9 @@ sub processSoftwares {
         # Workaround for #415
         $version =~ s/[\000-\037].*// if $version;
 
-        $inventory->addSoftware ({
+    addSoftware(
+        inventory => $inventory,
+        fields => {
             COMMENTS => $comments,
 #            FILESIZE => $filesize,
 #            FOLDER => $folder,
@@ -117,6 +117,40 @@ sub processSoftwares {
     }
 }
 
+sub processMSIE {
+    my %params = @_;
+
+    my $inventory = $params{inventory};
+    my $is64bit = $params{is64bit} || 0;
+    my $machKey = $params{machKey};
+
+        my $name = "Internet Explorer";
+    if ($is64bit) {
+        $name .= " (64bit)";
+    }
+    my $version = $params{machKey}->{"SOFTWARE/Microsoft/Internet Explorer/Version"};
+
+    addSoftware (
+        inventory => $inventory,
+        fields => {
+            FROM => "registry",
+            IS64BIT => $is64bit,
+            NAME => $name,
+            VERSION => $version,
+        PUBLISHER => "Microsoft Corporation"
+        }
+    )
+}
+
+sub addSoftware {
+    my %params = @_;
+
+    return if $seen->{$params{fields}->{NAME}}->{$params{fields}->{IS64BIT}}{$params{fields}->{VERSION} || '_undef_'}++;
+
+    $params{inventory}->addSoftware ($params{fields});
+
+}
+
 sub doInventory {
     my $params = shift;
 
@@ -144,15 +178,28 @@ sub doInventory {
             $machKey64bit->{"SOFTWARE/Microsoft/Windows/CurrentVersion/Uninstall"};
         processSoftwares({ inventory => $inventory, softwares => $softwares, is64bit => 1});
 
+    processMSIE(
+        machKey => $machKey64bit,
+        inventory => $inventory,
+        is64bit => 1,
+    );
+
+
         my $machKey32bit = $Registry->Open('LMachine', {
             Access => KEY_READ | KEY_WOW64_32KEY
         }) or $logger->fault("Can't open HKEY_LOCAL_MACHINE key: $EXTENDED_OS_ERROR");
 
         $softwares=
             $machKey32bit->{"SOFTWARE/Microsoft/Windows/CurrentVersion/Uninstall"};
-
         processSoftwares({ inventory => $inventory, softwares => $softwares, is64bit => 0});
 
+    processMSIE(
+        machKey => $machKey32bit,
+        inventory => $inventory,
+        is64bit => 0,
+    );
+
+
     } else {
         my $machKey = $Registry->Open('LMachine', {
             Access => KEY_READ()
@@ -160,9 +207,13 @@ sub doInventory {
 
         my $softwares=
             $machKey->{"SOFTWARE/Microsoft/Windows/CurrentVersion/Uninstall"};
-
         processSoftwares({ inventory => $inventory, softwares => $softwares, is64bit => 0});
 
+    processMSIE(
+        machKey => $machKey,
+        inventory => $inventory,
+        is64bit => 0,
+    );
     }
 
 # Copyright (c) 2009 Megagram


================================================================
  Commit: 6a87bf0852b3231db850312c66243fc8815dcb44
      https://github.com/fusinv/fusioninventory-agent/commit/6a87bf0852b3231db850312c66243fc8815dcb44
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-01-26 (Thu, 26 Jan 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm

  Log Message:
  -----------
  Merge branch '2.1.x' into 2.2.x

Merge commit:39f3c75852ded3b1cb7d215c4d7f931fbd3f1d92


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm
index 64651a0..16331bb 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm
@@ -46,8 +46,13 @@ sub doInventory {
             softwares => $softwares64,
             is64bit   => 1
         )) {
-            $inventory->addEntry(section => 'SOFTWARES', entry => $software);
+            _addSoftware(inventory => $inventory, entry => $software);
         }
+        _processMSIE(
+            machKey => $machKey64,
+            inventory => $inventory,
+            is64bit => 1
+        );
 
         my $machKey32 = $Registry->Open('LMachine', {
             Access => KEY_READ | KEY_WOW64_32 ## no critic (ProhibitBitwise)
@@ -60,8 +65,15 @@ sub doInventory {
             softwares => $softwares32,
             is64bit   => 0
         )) {
-            $inventory->addEntry(section => 'SOFTWARES', entry => $software);
+            _addSoftware(inventory => $inventory, entry => $software);
         }
+        _processMSIE(
+            machKey => $machKey64,
+            inventory => $inventory,
+            is64bit => 0
+        );
+
+
     } else {
         my $machKey = $Registry->Open('LMachine', {
             Access => KEY_READ
@@ -74,8 +86,13 @@ sub doInventory {
             softwares => $softwares,
             is64bit   => 0
         )) {
-            $inventory->addEntry(section => 'SOFTWARES', entry => $software);
+            _addSoftware(inventory => $inventory, entry => $software);
         }
+        _processMSIE(
+            machKey => $machKey,
+            inventory => $inventory,
+            is64bit => 0
+        );
     }
 }
 
@@ -103,10 +120,6 @@ sub _getSoftwares {
         # odd, found on Win2003
         next unless keys %$data > 2;
 
-        # See bug #927
-        # http://stackoverflow.com/questions/2639513/duplicate-entries-in-uninstall-registry-key-when-compiling-list-of-installed-soft
-        next if $data->{'/SystemComponent'};
-
         my $guid = $rawGuid;
         $guid =~ s/\/$//; # drop the tailing / 
 
@@ -132,13 +145,47 @@ sub _getSoftwares {
         # Workaround for #415
         $software->{VERSION} =~ s/[\000-\037].*// if $software->{VERSION};
 
-        # avoid duplicates
-        next if $seen->{$software->{NAME}}->{$software->{VERSION} || '_undef_'}++;
-
         push @softwares, $software;
     }
 
     return @softwares;
 }
 
+sub _addSoftware {
+    my %params = @_;
+
+    my $entry = $params{entry};
+
+        # avoid duplicates
+        return if $seen->{$entry->{NAME}}->{$entry->{IS64BIT}}{$entry->{VERSION} || '_undef_'}++;
+
+    $params{inventory}->addEntry(section => 'SOFTWARES', entry => $entry);
+}
+
+sub _processMSIE {
+    my %params = @_;
+
+    my $inventory = $params{inventory};
+    my $is64bit = $params{is64bit} || 0;
+    my $machKey = $params{machKey};
+
+        my $name = "Internet Explorer";
+    if ($is64bit) {
+        $name .= " (64bit)";
+    }
+    my $version = $params{machKey}->{"SOFTWARE/Microsoft/Internet Explorer/Version"};
+
+    _addSoftware(
+        inventory => $params{inventory},
+        entry => {
+            FROM => "registry",
+            IS64BIT => $is64bit,
+            NAME => $name,
+            VERSION => $version,
+        PUBLISHER => "Microsoft Corporation"
+    });
+
+}
+
+
 1;


================================================================
  Commit: 30c09825abeccb8e03fb6f9f1a72d48d3d1e3011
      https://github.com/fusinv/fusioninventory-agent/commit/30c09825abeccb8e03fb6f9f1a72d48d3d1e3011
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-01-26 (Thu, 26 Jan 2012)

  Changed paths:
    M AUTHORS
    M fusioninventory-agent
    M fusioninventory-injector

  Log Message:
  -----------
  update the Copyright: add 2012


diff --git a/AUTHORS b/AUTHORS
index ae80b04..200d1d5 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -2,7 +2,7 @@ maintainer:
   Gonéri LE BOUDER <goneri at rulezlan.org>
 
 Copyright 2006-2010 OCS Inventory contributors
-Copyright 2010-2011 FusionInventory Team
+Copyright 2010-2012 FusionInventory Team
 
 Website: http://www.fusioninventory.org
 
diff --git a/fusioninventory-agent b/fusioninventory-agent
index acbee13..0e3026d 100755
--- a/fusioninventory-agent
+++ b/fusioninventory-agent
@@ -639,7 +639,7 @@ http://forge.fusionInventory.org
 =head1 COPYRIGHT
 
 Copyright (C) 2006-2010 OCS Inventory contributors
-Copyright (C) 2010-2011 FusionInventory Team
+Copyright (C) 2010-2012 FusionInventory Team
 
  This program is free software; you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
diff --git a/fusioninventory-injector b/fusioninventory-injector
index 65166a0..f74d0de 100755
--- a/fusioninventory-injector
+++ b/fusioninventory-injector
@@ -2,7 +2,7 @@
 ###############################################################################
 ##Copyleft Pascal DANEK 2005
 ##Copyleft Goneri Le Bouder 2006
-##Copyleft FusionInventory Project 2010-2011
+##Copyleft FusionInventory Project 2010-2012
 ##Web : http://www.FusionInventory.org
 ##
 ##This code is open source and may be copied and modified as long as the source


================================================================
  Commit: adb5e51fef8fd8cfe05a2fb0d3759cf4a8289153
      https://github.com/fusinv/fusioninventory-agent/commit/adb5e51fef8fd8cfe05a2fb0d3759cf4a8289153
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-01-26 (Thu, 26 Jan 2012)

  Changed paths:
    M AUTHORS
    M fusioninventory-agent
    M fusioninventory-injector

  Log Message:
  -----------
  Merge branch '2.1.x' into 2.2.x


diff --git a/AUTHORS b/AUTHORS
index ae80b04..200d1d5 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -2,7 +2,7 @@ maintainer:
   Gonéri LE BOUDER <goneri at rulezlan.org>
 
 Copyright 2006-2010 OCS Inventory contributors
-Copyright 2010-2011 FusionInventory Team
+Copyright 2010-2012 FusionInventory Team
 
 Website: http://www.fusioninventory.org
 
diff --git a/fusioninventory-agent b/fusioninventory-agent
index af49f6d..bc9dd88 100755
--- a/fusioninventory-agent
+++ b/fusioninventory-agent
@@ -649,7 +649,7 @@ http://forge.fusionInventory.org
 =head1 COPYRIGHT
 
 Copyright (C) 2006-2010 OCS Inventory contributors
-Copyright (C) 2010-2011 FusionInventory Team
+Copyright (C) 2010-2012 FusionInventory Team
 
  This program is free software; you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
diff --git a/fusioninventory-injector b/fusioninventory-injector
index ab303c6..c45f688 100755
--- a/fusioninventory-injector
+++ b/fusioninventory-injector
@@ -2,7 +2,7 @@
 ###############################################################################
 ##Copyleft Pascal DANEK 2005
 ##Copyleft Goneri Le Bouder 2006
-##Copyleft FusionInventory Project 2010-2011
+##Copyleft FusionInventory Project 2010-2012
 ##Web : http://www.FusionInventory.org
 ##
 ##This code is open source and may be copied and modified as long as the source


================================================================
  Commit: 7c62d9182855b06e4f492a478bdc0e18d195a48a
      https://github.com/fusinv/fusioninventory-agent/commit/7c62d9182855b06e4f492a478bdc0e18d195a48a
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-01-29 (Sun, 29 Jan 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/USB.pm

  Log Message:
  -----------
  load Tools::MacOS for getIODevices()

closes: #1439

Reported-by: Walid Nouh <walid.nouh at gmail.com>


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/USB.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/USB.pm
index f588551..4f526d9 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/USB.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/USB.pm
@@ -4,6 +4,7 @@ use strict;
 use warnings;
 
 use FusionInventory::Agent::Tools;
+use FusionInventory::Agent::Tools::MacOS;
 
 my $seen;
 


================================================================
  Commit: fac06dc1e483769841022701561fd0931eb2befc
      https://github.com/fusinv/fusioninventory-agent/commit/fac06dc1e483769841022701561fd0931eb2befc
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-01-30 (Mon, 30 Jan 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Uptime.pm
    A t/inventory/macos/uptime.t

  Log Message:
  -----------
  fix: uptime on MacOSX

closes: #1440
closes: #1135

Reported-by: Walid Nouh <walid.nouh at gmail.com>


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Uptime.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Uptime.pm
index a27de15..e890f9d 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Uptime.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Uptime.pm
@@ -21,14 +21,20 @@ sub doInventory {
     });
 }
 
-sub _getUptime {
+sub _getBootTime {
     my $boottime = getFirstMatch(
-        pattern => qr/sec\s*=\s*(\d+)/,
+        pattern => qr/(\d+)$/,
         @_,
     );
+
+    return $boottime;
+}
+
+sub _getUptime {
+    my $boottime = _getBootTime(@_);
     return unless $boottime;
 
-    my $uptime = $boottime - time();
+    my $uptime = time() - $boottime;
     return getFormatedGmTime($uptime);
 }
 
diff --git a/t/inventory/macos/uptime.t b/t/inventory/macos/uptime.t
new file mode 100644
index 0000000..620634b
--- /dev/null
+++ b/t/inventory/macos/uptime.t
@@ -0,0 +1,20 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+use Test::More;
+
+use FusionInventory::Agent::Task::Inventory::Input::MacOS::Uptime;
+
+my %tests = (
+        '1325070226' => '1325070226',
+        'sec = 1325070226' => '1325070226'
+);
+
+plan tests => scalar keys %tests;
+
+foreach my $test (keys %tests) {
+ my $r = FusionInventory::Agent::Task::Inventory::Input::MacOS::Uptime::_getBootTime(string => $test);
+    ok($r eq $tests{$test});
+}


================================================================
  Commit: d3a252b082818471bdf66fd28ea3fd9e6c492d94
      https://github.com/fusinv/fusioninventory-agent/commit/d3a252b082818471bdf66fd28ea3fd9e6c492d94
  Author: Jonathan Clarke <jonathan.clarke at normation.com>
  Date:   2012-02-01 (Wed, 01 Feb 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/OS/Linux/Distro/NonLSB.pm

  Log Message:
  -----------
  detect CentOS without lsb_release

closes: #1193


diff --git a/lib/FusionInventory/Agent/Task/Inventory/OS/Linux/Distro/NonLSB.pm b/lib/FusionInventory/Agent/Task/Inventory/OS/Linux/Distro/NonLSB.pm
index dfc9538..3473eaa 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/OS/Linux/Distro/NonLSB.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/OS/Linux/Distro/NonLSB.pm
@@ -16,6 +16,7 @@ my @files = (
     [ '/etc/knoppix_version'   => 'Knoppix GNU/Linux %s' ],
     [ '/etc/mandriva-release'  => '%s' ],
     [ '/etc/mandrake-release'  => '%s' ],
+    [ '/etc/centos-release'    => '%s' ],
     [ '/etc/redhat-release'    => '%s' ],
     [ '/etc/slackware-version' => '%s' ],
     [ '/etc/SuSE-release'      => '%s' ],
@@ -56,6 +57,9 @@ my @filesDistros = (
     # mandrake-release contains something like "Mandrakelinux release 10.1 (Community) for i586"
     [ '/etc/mandrake-release'  => 'Mandrake'  => '.* release ([0-9\.]+).*'  => '%s'],
 
+    # centos-release contains something like "CentOS Linux release 6.0 (Final)"
+    [ '/etc/centos-release'    => 'CentOS'    => '.* release ([0-9\.]+).*'  => '%s' ],
+
     # redhat-release contains something like "Red Hat Enterprise Linux Server release 5 (Tikanga)"
     [ '/etc/redhat-release'    => 'RedHat'    => '.* release ([0-9\.]+).*'  => '%s' ],
 


================================================================
  Commit: b495d1ef204f924ca3db6b132f382c9fa36f9dc0
      https://github.com/fusinv/fusioninventory-agent/commit/b495d1ef204f924ca3db6b132f382c9fa36f9dc0
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-02-01 (Wed, 01 Feb 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Distro/NonLSB.pm

  Log Message:
  -----------
  Merge branch '2.1.x' into 2.2.x


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Distro/NonLSB.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Distro/NonLSB.pm
index 207a500..a42afe6 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Distro/NonLSB.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Distro/NonLSB.pm
@@ -36,6 +36,9 @@ my @distributions = (
     # mandrake-release contains something like "Mandrakelinux release 10.1 (Community) for i586"
     [ '/etc/mandrake-release',  'Mandrake',                   'release ([\d.]+)', '%s'],
 
+    # centos-release contains something like "CentOS Linux release 6.0 (Final)
+    [ '/etc/centos-release',    'CentOS',                     'release ([\d.]+)', '%s' ],
+
     # redhat-release contains something like "Red Hat Enterprise Linux Server release 5 (Tikanga)"
     [ '/etc/redhat-release',    'RedHat',                     'release ([\d.]+)', '%s' ],
 


================================================================
  Commit: a9ee803cc349bafce138621946e84cd50885e498
      https://github.com/fusinv/fusioninventory-agent/commit/a9ee803cc349bafce138621946e84cd50885e498
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-02-01 (Wed, 01 Feb 2012)

  Changed paths:
    M lib/FusionInventory/Agent/HTTP/Client/OCS.pm
    M t/components/client/ocs/compression.t

  Log Message:
  -----------
  use official compression format name, and set content-type accordingly


diff --git a/lib/FusionInventory/Agent/HTTP/Client/OCS.pm b/lib/FusionInventory/Agent/HTTP/Client/OCS.pm
index 4ba93ab..9c001f4 100644
--- a/lib/FusionInventory/Agent/HTTP/Client/OCS.pm
+++ b/lib/FusionInventory/Agent/HTTP/Client/OCS.pm
@@ -23,21 +23,24 @@ sub new {
 
     # check compression mode
     if (Compress::Zlib->require()) {
-        $self->{compression} = 'native';
-        $self->{ua}->default_header('Content-type' => 'application/x-compress');
+        # RFC 1950
+        $self->{compression} = 'zlib';
+        $self->{ua}->default_header('Content-type' => 'application/x-compress-zlib');
         $self->{logger}->debug(
             $log_prefix . 
             'Using Compress::Zlib for compression'
         );
     } elsif (canRun('gzip')) {
+        # RFC 1952
         $self->{compression} = 'gzip';
-        $self->{ua}->default_header('Content-type' => 'application/x-compress');
+        $self->{ua}->default_header('Content-type' => 'application/x-compress-gzip');
         $self->{logger}->debug(
             $log_prefix . 
             'Using gzip for compression'
         );
     } else {
         $self->{compression} = 'none';
+        $self->{ua}->default_header('Content-type' => 'application/xml');
         $self->{logger}->debug(
             $log_prefix . 
             'Not using compression'
@@ -110,9 +113,9 @@ sub _compress {
     my ($self, $data) = @_;
 
     return 
-        $self->{compression} eq 'native' ? $self->_compressNative($data) :
-        $self->{compression} eq 'gzip'   ? $self->_compressGzip($data)   :
-                                          $data;
+        $self->{compression} eq 'zlib' ? $self->_compressZlib($data) :
+        $self->{compression} eq 'gzip' ? $self->_compressGzip($data) :
+                                         $data;
 }
 
 sub _uncompress {
@@ -120,7 +123,7 @@ sub _uncompress {
 
     if ($data =~ /(\x78\x9C.*)/s) {
         $self->{logger}->debug2("format: Zlib");
-        return $self->_uncompressNative($1);
+        return $self->_uncompressZlib($1);
     } elsif ($data =~ /(\x1F\x8B\x08.*)/s) {
         $self->{logger}->debug2("format: Gzip");
         return $self->_uncompressGzip($1);
@@ -133,7 +136,7 @@ sub _uncompress {
     }
 }
 
-sub _compressNative {
+sub _compressZlib {
     my ($self, $data) = @_;
 
     return Compress::Zlib::compress($data);
@@ -160,7 +163,7 @@ sub _compressGzip {
     return $result;
 }
 
-sub _uncompressNative {
+sub _uncompressZlib {
     my ($self, $data) = @_;
 
     return Compress::Zlib::uncompress($data);
diff --git a/t/components/client/ocs/compression.t b/t/components/client/ocs/compression.t
index de0edad..f7fa57a 100755
--- a/t/components/client/ocs/compression.t
+++ b/t/components/client/ocs/compression.t
@@ -16,7 +16,7 @@ my $client = FusionInventory::Agent::HTTP::Client::OCS->new();
 
 my $data = "this is a test";
 is(
-    $client->_uncompressNative($client->_compressNative($data)),
+    $client->_uncompressZlib($client->_compressZlib($data)),
     $data,
     'round-trip compression with Compress::Zlib'
 );


================================================================
  Commit: aa708b9d44310e4646bdb9b9136f5ed51f6efc70
      https://github.com/fusinv/fusioninventory-agent/commit/aa708b9d44310e4646bdb9b9136f5ed51f6efc70
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-02-01 (Wed, 01 Feb 2012)

  Changed paths:
    M AUTHORS
    M fusioninventory-agent
    M fusioninventory-injector
    M lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Distro/NonLSB.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/USB.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Uptime.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Bios.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm
    A t/inventory/macos/uptime.t

  Log Message:
  -----------
  Merge remote-tracking branch 'forge/2.2.x' into 2.2.x


diff --git a/AUTHORS b/AUTHORS
index ae80b04..200d1d5 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -2,7 +2,7 @@ maintainer:
   Gonéri LE BOUDER <goneri at rulezlan.org>
 
 Copyright 2006-2010 OCS Inventory contributors
-Copyright 2010-2011 FusionInventory Team
+Copyright 2010-2012 FusionInventory Team
 
 Website: http://www.fusioninventory.org
 
diff --git a/fusioninventory-agent b/fusioninventory-agent
index af49f6d..bc9dd88 100755
--- a/fusioninventory-agent
+++ b/fusioninventory-agent
@@ -649,7 +649,7 @@ http://forge.fusionInventory.org
 =head1 COPYRIGHT
 
 Copyright (C) 2006-2010 OCS Inventory contributors
-Copyright (C) 2010-2011 FusionInventory Team
+Copyright (C) 2010-2012 FusionInventory Team
 
  This program is free software; you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
diff --git a/fusioninventory-injector b/fusioninventory-injector
index ab303c6..c45f688 100755
--- a/fusioninventory-injector
+++ b/fusioninventory-injector
@@ -2,7 +2,7 @@
 ###############################################################################
 ##Copyleft Pascal DANEK 2005
 ##Copyleft Goneri Le Bouder 2006
-##Copyleft FusionInventory Project 2010-2011
+##Copyleft FusionInventory Project 2010-2012
 ##Web : http://www.FusionInventory.org
 ##
 ##This code is open source and may be copied and modified as long as the source
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Distro/NonLSB.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Distro/NonLSB.pm
index 207a500..a42afe6 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Distro/NonLSB.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Distro/NonLSB.pm
@@ -36,6 +36,9 @@ my @distributions = (
     # mandrake-release contains something like "Mandrakelinux release 10.1 (Community) for i586"
     [ '/etc/mandrake-release',  'Mandrake',                   'release ([\d.]+)', '%s'],
 
+    # centos-release contains something like "CentOS Linux release 6.0 (Final)
+    [ '/etc/centos-release',    'CentOS',                     'release ([\d.]+)', '%s' ],
+
     # redhat-release contains something like "Red Hat Enterprise Linux Server release 5 (Tikanga)"
     [ '/etc/redhat-release',    'RedHat',                     'release ([\d.]+)', '%s' ],
 
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/USB.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/USB.pm
index f588551..4f526d9 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/USB.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/USB.pm
@@ -4,6 +4,7 @@ use strict;
 use warnings;
 
 use FusionInventory::Agent::Tools;
+use FusionInventory::Agent::Tools::MacOS;
 
 my $seen;
 
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Uptime.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Uptime.pm
index a27de15..e890f9d 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Uptime.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Uptime.pm
@@ -21,14 +21,20 @@ sub doInventory {
     });
 }
 
-sub _getUptime {
+sub _getBootTime {
     my $boottime = getFirstMatch(
-        pattern => qr/sec\s*=\s*(\d+)/,
+        pattern => qr/(\d+)$/,
         @_,
     );
+
+    return $boottime;
+}
+
+sub _getUptime {
+    my $boottime = _getBootTime(@_);
     return unless $boottime;
 
-    my $uptime = $boottime - time();
+    my $uptime = time() - $boottime;
     return getFormatedGmTime($uptime);
 }
 
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Bios.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Bios.pm
index b8e2f95..a3d02be 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Bios.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Bios.pm
@@ -104,6 +104,14 @@ sub doInventory {
         $inventory->setHardware ({
             VMSYSTEM => 'VMware'
         });
+    } elsif (
+        ($bios->{SMANUFACTURER} eq 'Xen')
+         ||
+        ($bios->{BMANUFACTURER} eq 'Xen')
+       ) {
+        $inventory->setHardware ({
+            VMSYSTEM => 'Xen'
+        });
     }
 
 }
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm
index 64651a0..16331bb 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm
@@ -46,8 +46,13 @@ sub doInventory {
             softwares => $softwares64,
             is64bit   => 1
         )) {
-            $inventory->addEntry(section => 'SOFTWARES', entry => $software);
+            _addSoftware(inventory => $inventory, entry => $software);
         }
+        _processMSIE(
+            machKey => $machKey64,
+            inventory => $inventory,
+            is64bit => 1
+        );
 
         my $machKey32 = $Registry->Open('LMachine', {
             Access => KEY_READ | KEY_WOW64_32 ## no critic (ProhibitBitwise)
@@ -60,8 +65,15 @@ sub doInventory {
             softwares => $softwares32,
             is64bit   => 0
         )) {
-            $inventory->addEntry(section => 'SOFTWARES', entry => $software);
+            _addSoftware(inventory => $inventory, entry => $software);
         }
+        _processMSIE(
+            machKey => $machKey64,
+            inventory => $inventory,
+            is64bit => 0
+        );
+
+
     } else {
         my $machKey = $Registry->Open('LMachine', {
             Access => KEY_READ
@@ -74,8 +86,13 @@ sub doInventory {
             softwares => $softwares,
             is64bit   => 0
         )) {
-            $inventory->addEntry(section => 'SOFTWARES', entry => $software);
+            _addSoftware(inventory => $inventory, entry => $software);
         }
+        _processMSIE(
+            machKey => $machKey,
+            inventory => $inventory,
+            is64bit => 0
+        );
     }
 }
 
@@ -103,10 +120,6 @@ sub _getSoftwares {
         # odd, found on Win2003
         next unless keys %$data > 2;
 
-        # See bug #927
-        # http://stackoverflow.com/questions/2639513/duplicate-entries-in-uninstall-registry-key-when-compiling-list-of-installed-soft
-        next if $data->{'/SystemComponent'};
-
         my $guid = $rawGuid;
         $guid =~ s/\/$//; # drop the tailing / 
 
@@ -132,13 +145,47 @@ sub _getSoftwares {
         # Workaround for #415
         $software->{VERSION} =~ s/[\000-\037].*// if $software->{VERSION};
 
-        # avoid duplicates
-        next if $seen->{$software->{NAME}}->{$software->{VERSION} || '_undef_'}++;
-
         push @softwares, $software;
     }
 
     return @softwares;
 }
 
+sub _addSoftware {
+    my %params = @_;
+
+    my $entry = $params{entry};
+
+        # avoid duplicates
+        return if $seen->{$entry->{NAME}}->{$entry->{IS64BIT}}{$entry->{VERSION} || '_undef_'}++;
+
+    $params{inventory}->addEntry(section => 'SOFTWARES', entry => $entry);
+}
+
+sub _processMSIE {
+    my %params = @_;
+
+    my $inventory = $params{inventory};
+    my $is64bit = $params{is64bit} || 0;
+    my $machKey = $params{machKey};
+
+        my $name = "Internet Explorer";
+    if ($is64bit) {
+        $name .= " (64bit)";
+    }
+    my $version = $params{machKey}->{"SOFTWARE/Microsoft/Internet Explorer/Version"};
+
+    _addSoftware(
+        inventory => $params{inventory},
+        entry => {
+            FROM => "registry",
+            IS64BIT => $is64bit,
+            NAME => $name,
+            VERSION => $version,
+        PUBLISHER => "Microsoft Corporation"
+    });
+
+}
+
+
 1;
diff --git a/t/inventory/macos/uptime.t b/t/inventory/macos/uptime.t
new file mode 100644
index 0000000..620634b
--- /dev/null
+++ b/t/inventory/macos/uptime.t
@@ -0,0 +1,20 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+use Test::More;
+
+use FusionInventory::Agent::Task::Inventory::Input::MacOS::Uptime;
+
+my %tests = (
+        '1325070226' => '1325070226',
+        'sec = 1325070226' => '1325070226'
+);
+
+plan tests => scalar keys %tests;
+
+foreach my $test (keys %tests) {
+ my $r = FusionInventory::Agent::Task::Inventory::Input::MacOS::Uptime::_getBootTime(string => $test);
+    ok($r eq $tests{$test});
+}


================================================================
  Commit: 96247f6916c90a9f466925156875f3494d7a4647
      https://github.com/fusinv/fusioninventory-agent/commit/96247f6916c90a9f466925156875f3494d7a4647
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-02-02 (Thu, 02 Feb 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task.pm

  Log Message:
  -----------
  document isEnabled method, for sake of subclass pod coverage


diff --git a/lib/FusionInventory/Agent/Task.pm b/lib/FusionInventory/Agent/Task.pm
index 5e9023a..5d78c9f 100644
--- a/lib/FusionInventory/Agent/Task.pm
+++ b/lib/FusionInventory/Agent/Task.pm
@@ -110,9 +110,13 @@ the logger object to use (default: a new stderr logger)
 
 =back
 
+=head2 isEnabled()
+
+This is a method to be implemented by each subclass.
+
 =head2 run()
 
-This is the method to be implemented by each subclass.
+This is a method to be implemented by each subclass.
 
 =head2 getOptionsFromServer($response, $name, $feature)
 


================================================================
  Commit: 4b96d7d7642560525e7eac2eb62f159bba8f5a54
      https://github.com/fusinv/fusioninventory-agent/commit/4b96d7d7642560525e7eac2eb62f159bba8f5a54
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-02-09 (Thu, 09 Feb 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/OS/MacOS/Videos.pm

  Log Message:
  -----------
  fix: use Inventory->addVideo, addEntry is not exported

Inventory->addEntry is avalaible in 2.2.0+.


diff --git a/lib/FusionInventory/Agent/Task/Inventory/OS/MacOS/Videos.pm b/lib/FusionInventory/Agent/Task/Inventory/OS/MacOS/Videos.pm
index c3d2be7..39e8dc9 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/OS/MacOS/Videos.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/OS/MacOS/Videos.pm
@@ -79,10 +79,8 @@ sub doInventory {
     my %displays = _getDisplays();
     foreach my $section (keys %displays ) {
         foreach (@{$displays{$section}}) {
-            $inventory->addEntry(
-                    section => $section,
-                    entry   => $_,
-                    );
+            $inventory->addVideo(
+                  entry   => $_
         }
     }
 }


================================================================
  Commit: 4283abb7652e488e93447ea84c16cc55c6454a6a
      https://github.com/fusinv/fusioninventory-agent/commit/4283abb7652e488e93447ea84c16cc55c6454a6a
  Author: Remi Collet <fedora at famillecollet.com>
  Date:   2012-02-10 (Fri, 10 Feb 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Network.pm

  Log Message:
  -----------
  SSL: put back add the end of the server FQDN


diff --git a/lib/FusionInventory/Agent/Network.pm b/lib/FusionInventory/Agent/Network.pm
index 4d4dfaf..298f0ad 100644
--- a/lib/FusionInventory/Agent/Network.pm
+++ b/lib/FusionInventory/Agent/Network.pm
@@ -365,7 +365,7 @@ sub setSslRemoteHost {
             $re =~ s/:\d+//;
 # Accept SSL cert will hostname with wild-card
 # http://forge.fusioninventory.org/issues/542
-            $re =~ s/^([^\.]+)/($1|\\*)/;
+            $re =~ s/^([^\.]+)/($1|\\*).$2/;
 # protect some characters, $re will be evaluated as a regex
             $re =~ s/([\-\.])/\\$1/g;
             $ua->default_header('If-SSL-Cert-Subject' => '/CN='.$re.'($|\/)');


================================================================
  Commit: 42ee703c9d77d643dacf0a749ebf745f2a64411a
      https://github.com/fusinv/fusioninventory-agent/commit/42ee703c9d77d643dacf0a749ebf745f2a64411a
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-02-10 (Fri, 10 Feb 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Network.pm

  Log Message:
  -----------
  Revert "SSL: put back add the end of the server FQDN"

This reverts commit 4283abb7652e488e93447ea84c16cc55c6454a6a.


diff --git a/lib/FusionInventory/Agent/Network.pm b/lib/FusionInventory/Agent/Network.pm
index 298f0ad..4d4dfaf 100644
--- a/lib/FusionInventory/Agent/Network.pm
+++ b/lib/FusionInventory/Agent/Network.pm
@@ -365,7 +365,7 @@ sub setSslRemoteHost {
             $re =~ s/:\d+//;
 # Accept SSL cert will hostname with wild-card
 # http://forge.fusioninventory.org/issues/542
-            $re =~ s/^([^\.]+)/($1|\\*).$2/;
+            $re =~ s/^([^\.]+)/($1|\\*)/;
 # protect some characters, $re will be evaluated as a regex
             $re =~ s/([\-\.])/\\$1/g;
             $ua->default_header('If-SSL-Cert-Subject' => '/CN='.$re.'($|\/)');


================================================================
  Commit: 8f07b5fdbac8e31f1202add5eb40fe79b6bb5675
      https://github.com/fusinv/fusioninventory-agent/commit/8f07b5fdbac8e31f1202add5eb40fe79b6bb5675
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-02-10 (Fri, 10 Feb 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Printers.pm

  Log Message:
  -----------
  use parentIdPrefix to match USB printer

this value is present on all Windows flavor, whereas containerId seems
to be present only starting with Windows 7.
Also, isolate prefix and serial extraction into function for testing
purpose.


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Printers.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Printers.pm
index 4e6ab66..43dc600 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Printers.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Printers.pm
@@ -102,7 +102,7 @@ sub doInventory {
 }
 
 # Search serial when connected in USB
-sub _getUSBPrinterSerial {
+sub _getUSBPrinterSerialNumber {
     my ($portName) = @_;
 
     my $machKey = $Registry->Open('LMachine', { 
@@ -110,45 +110,62 @@ sub _getUSBPrinterSerial {
     }) or die "Can't open HKEY_LOCAL_MACHINE key: $EXTENDED_OS_ERROR";
 
     # first, find the USB container ID for this printer
-    my $usbId;
-    my $usbprintKey = $machKey->{"SYSTEM/CurrentControlSet/Enum/USBPRINT"};
+    my $prefix = _getUSBPrefix(
+        $machKey->{"SYSTEM/CurrentControlSet/Enum/USBPRINT"},
+        $portName
+    );
+    return unless $prefix;
+
+    # second, get the serial number from the ID container entry
+    my $serial = _getUSBSerial(
+        $machKey->{"SYSTEM/CurrentControlSet/Enum/USB"},
+        $prefix
+    );
+
+    return $serial;
+}
+
+sub _getUSBPrefix {
+    my ($printKey, $portName) = @_;
 
     # find the printer entry matching given portname
-    PRINTER: foreach my $printerKey (values %$usbprintKey) {
+    foreach my $printerKey (values %$printKey) {
         # look for a subkey with expected content
-        foreach my $subKey (values %$printerKey) {
+        foreach my $subKeyName (keys %$printerKey) {
+            my $subKey = $printerKey->{$subKeyName};
             next unless 
                 $subKey->{'Device Parameters/'}                &&
                 $subKey->{'Device Parameters/'}->{'/PortName'} &&
                 $subKey->{'Device Parameters/'}->{'/PortName'} eq $portName;
             # got it
-            $usbId = $subKey->{'/ContainerID'};
-            last PRINTER;
+            my $prefix = $subKeyName;
+            $prefix =~ s{&$portName/$}{};
+            return $prefix;
         };
     }
 
-    return unless $usbId;
+    return;
+}
 
-    # second, get the serial number from the ID container entry
-    my $serial;
-    my $usbKey = $machKey->{"SYSTEM/CurrentControlSet/Enum/USB"};
+sub _getUSBSerial {
+    my ($usbKey, $prefix) = @_;
 
     # find the device entry matching given container Id
-    DEVICE: foreach my $deviceKey (values %$usbKey) {
+    foreach my $deviceKey (values %$usbKey) {
         # look for a subkey with expected content
         foreach my $subKeyName (keys %$deviceKey) {
             my $subKey = $deviceKey->{$subKeyName};
             next unless
-                $subKey->{'/ContainerId'} &&
-                $subKey->{'/ContainerId'} eq $usbId;
+                $subKey->{'/ParentIdPrefix'} &&
+                $subKey->{'/ParentIdPrefix'} eq $prefix;
             # got it
-            $serial = $subKeyName;
+            my $serial = $subKeyName;
             $serial =~ s{/$}{};
-            last DEVICE;
+            return $serial;
         }
     }
 
-    return $serial;
+    return;
 }
 
 1;


================================================================
  Commit: 4091aa0a88588bfce53bff7187fc0d51c8df1f7f
      https://github.com/fusinv/fusioninventory-agent/commit/4091aa0a88588bfce53bff7187fc0d51c8df1f7f
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-02-12 (Sun, 12 Feb 2012)

  Changed paths:
    M resources/win32/printer/xppro2/USB.reg
    M resources/win32/printer/xppro2/USBPRINT.reg

  Log Message:
  -----------
  use files from ticket #1328, instead of duplicating existing ones


diff --git a/resources/win32/printer/xppro2/USB.reg b/resources/win32/printer/xppro2/USB.reg
index c6f39c1..64ad002 100644
Binary files a/resources/win32/printer/xppro2/USB.reg and b/resources/win32/printer/xppro2/USB.reg differ
diff --git a/resources/win32/printer/xppro2/USBPRINT.reg b/resources/win32/printer/xppro2/USBPRINT.reg
index 14e5c89..274dbac 100644
Binary files a/resources/win32/printer/xppro2/USBPRINT.reg and b/resources/win32/printer/xppro2/USBPRINT.reg differ


================================================================
  Commit: 6f453ad1138574e8da94ebbc0a39f2763678c42f
      https://github.com/fusinv/fusioninventory-agent/commit/6f453ad1138574e8da94ebbc0a39f2763678c42f
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-02-12 (Sun, 12 Feb 2012)

  Changed paths:
    A t/inventory/windows/printers.t

  Log Message:
  -----------
  initial import


diff --git a/t/inventory/windows/printers.t b/t/inventory/windows/printers.t
new file mode 100755
index 0000000..8d3a4ee
--- /dev/null
+++ b/t/inventory/windows/printers.t
@@ -0,0 +1,94 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+use English qw(-no_match_vars);
+use Test::More;
+use UNIVERSAL::require;
+
+BEGIN {
+    # use mock modules for non-available ones
+    push @INC, 't/fake/windows' if $OSNAME ne 'MSWin32';
+}
+use FusionInventory::Agent::Task::Inventory::Input::Win32::Printers;
+
+my %tests = (
+    xppro1 => {
+        USB001 => [ '6&397bdcac&0', '49R8Ka' ],
+        USB002 => [ '6&2ad9257f&0', '5&19d1ce61&0&2' ],
+        USB003 => [ '6&1605722f&0', '5&2377f6ef&0&2' ],
+    },
+    xppro2 => {
+        USB001 => [ '6&1086615&0',  'J5J126789' ],
+        USB003 => [ '6&159b6df2&0', 'JV40VNJ' ],
+        USB004 => [ '7&20bd29b5&0', '6&28e27c3d&0&0000' ],
+    }
+);
+
+my $plan = 0;
+foreach my $test (keys %tests) {
+    $plan += 2 * scalar (keys $tests{$test});
+}
+plan tests => $plan;
+
+foreach my $test (keys %tests) {
+    my $printKey = load_registry("resources/win32/printer/$test/USBPRINT.reg");
+    my $usbKey   = load_registry("resources/win32/printer/$test/USB.reg");
+    foreach my $port (keys $tests{$test}) {
+        my $prefix = FusionInventory::Agent::Task::Inventory::Input::Win32::Printers::_getUSBPrefix($printKey, $port);
+        my $serial = FusionInventory::Agent::Task::Inventory::Input::Win32::Printers::_getUSBSerial($usbKey, $prefix);
+
+        is($prefix, $tests{$test}->{$port}->[0], "prefix for printer $port");
+        is($serial, $tests{$test}->{$port}->[1], "serial for printer $port");
+    }
+}
+
+sub load_registry {
+    my ($file) = @_;
+
+    my $root_offset;
+    my $root_key = {};
+    my $current_key;
+
+    open (my $handle, '<:encoding(UTF-16LE)', $file) or die();
+    while (my $line = <$handle>) {
+
+        if ($line =~ /^ \[ ([^]]+) \]/x) {
+            my $path = $1;
+            my @path = split(/\\/, $path);
+
+            if ($root_offset) {
+                splice @path, 0, $root_offset;
+                $current_key = $root_key;
+                foreach my $element (@path) {
+                    my $key_path = $element . '/';
+
+                    if (!defined $current_key->{$key_path}) {
+                        my $new_key = {};
+                        $current_key->{$key_path} = $new_key;
+                    }
+
+                    $current_key = $current_key->{$key_path};
+                }
+            } else {
+                $root_offset = scalar @path;
+            }
+            next;
+        }
+
+        if ($line =~ /^ " ([^"]+) " = dword:(\d+)/x) {
+            $current_key->{'/' . $1} = "0x$2";
+            next;
+        }
+
+        if ($line =~ /^ " ([^"]+) " = " ([^"]+) "/x) {
+            $current_key->{'/' . $1} = $2;
+            next;
+        }
+
+    }
+    close $handle;
+
+    return $root_key;
+}


================================================================
  Commit: efe114f5be499bc2d60b44ad7e18c9b66d255ad9
      https://github.com/fusinv/fusioninventory-agent/commit/efe114f5be499bc2d60b44ad7e18c9b66d255ad9
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-02-12 (Sun, 12 Feb 2012)

  Changed paths:
    M fusioninventory-win32-service

  Log Message:
  -----------
  use direct object syntax


diff --git a/fusioninventory-win32-service b/fusioninventory-win32-service
index e7c1078..0a5c624 100644
--- a/fusioninventory-win32-service
+++ b/fusioninventory-win32-service
@@ -100,7 +100,7 @@ sub getMessage {
 sub startAgent {
     return if $thread;
     $thread = threads->create(sub {
-        my $agent = new FusionInventory::Agent(
+        my $agent = FusionInventory::Agent->new(
             confdir => $directory . '/../../etc/fusioninventory',
             datadir => $directory . '/../../share',
             vardir  => $directory . '/../../var',


================================================================
  Commit: f87388d9412c25f62551851e5bb3d18cb86e59c7
      https://github.com/fusinv/fusioninventory-agent/commit/f87388d9412c25f62551851e5bb3d18cb86e59c7
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-02-12 (Sun, 12 Feb 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Printers.pm

  Log Message:
  -----------
  fix method name


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Printers.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Printers.pm
index 43dc600..48e8e6d 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Printers.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Printers.pm
@@ -101,8 +101,7 @@ sub doInventory {
     }    
 }
 
-# Search serial when connected in USB
-sub _getUSBPrinterSerialNumber {
+sub _getUSBPrinterSerial {
     my ($portName) = @_;
 
     my $machKey = $Registry->Open('LMachine', { 


================================================================
  Commit: e27f04e6287b2ab6d48117b4d1c4f32b3e0282a7
      https://github.com/fusinv/fusioninventory-agent/commit/e27f04e6287b2ab6d48117b4d1c4f32b3e0282a7
  Author: Guillaume Rousse <guillomovitch at gmail.com>
  Date:   2012-02-12 (Sun, 12 Feb 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm

  Log Message:
  -----------
  handle another date format


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm
index 16331bb..a36f322 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm
@@ -102,9 +102,15 @@ sub _dateFormat {
     ## no critic (ExplicitReturnUndef)
     return undef unless $date;
 
-    return unless $date =~ /^(\d{4})(\d{2})(\d{2})/;
+    if ($date =~ /^(\d{4})(\d{1})(\d{2})$/) {
+	return "$3/0$2/$1";
+    }
+
+    if ($date =~ /^(\d{4})(\d{2})(\d{2})$/) {
+	return "$3/$2/$1";
+    }
 
-    return "$3/$2/$1";
+    return undef;
 }
 
 sub _getSoftwares {


================================================================
  Commit: 3dd0e8d97c46e16dbe5a85229b7b6d12ca7fd25e
      https://github.com/fusinv/fusioninventory-agent/commit/3dd0e8d97c46e16dbe5a85229b7b6d12ca7fd25e
  Author: Guillaume Rousse <guillomovitch at gmail.com>
  Date:   2012-02-12 (Sun, 12 Feb 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Slots.pm

  Log Message:
  -----------
  no such attribute in inventory


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Slots.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Slots.pm
index ae9960a..cde477e 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Slots.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Slots.pm
@@ -17,9 +17,7 @@ sub doInventory {
 
     foreach my $object (getWmiObjects(
         class      => 'Win32_SystemSlot',
-        properties => [ qw/
-            Name Description SlotDesignation Status Shared
-        / ]
+        properties => [ qw/Name Description SlotDesignation Status/ ]
     )) {
 
         $inventory->addEntry(
@@ -29,7 +27,6 @@ sub doInventory {
                 DESCRIPTION => $object->{Description},
                 DESIGNATION => $object->{SlotDesignation},
                 STATUS      => $object->{Status},
-                SHARED      => $object->{Shared}
             }
         );
     }


================================================================
  Commit: f0629876f8d17d8aecb44f680061ac4d3fbbcb68
      https://github.com/fusinv/fusioninventory-agent/commit/f0629876f8d17d8aecb44f680061ac4d3fbbcb68
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-02-12 (Sun, 12 Feb 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Slots.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm

  Log Message:
  -----------
  Merge remote-tracking branch 'origin/2.2.x' into 2.2.x


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Slots.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Slots.pm
index ae9960a..cde477e 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Slots.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Slots.pm
@@ -17,9 +17,7 @@ sub doInventory {
 
     foreach my $object (getWmiObjects(
         class      => 'Win32_SystemSlot',
-        properties => [ qw/
-            Name Description SlotDesignation Status Shared
-        / ]
+        properties => [ qw/Name Description SlotDesignation Status/ ]
     )) {
 
         $inventory->addEntry(
@@ -29,7 +27,6 @@ sub doInventory {
                 DESCRIPTION => $object->{Description},
                 DESIGNATION => $object->{SlotDesignation},
                 STATUS      => $object->{Status},
-                SHARED      => $object->{Shared}
             }
         );
     }
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm
index 16331bb..a36f322 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm
@@ -102,9 +102,15 @@ sub _dateFormat {
     ## no critic (ExplicitReturnUndef)
     return undef unless $date;
 
-    return unless $date =~ /^(\d{4})(\d{2})(\d{2})/;
+    if ($date =~ /^(\d{4})(\d{1})(\d{2})$/) {
+	return "$3/0$2/$1";
+    }
+
+    if ($date =~ /^(\d{4})(\d{2})(\d{2})$/) {
+	return "$3/$2/$1";
+    }
 
-    return "$3/$2/$1";
+    return undef;
 }
 
 sub _getSoftwares {


================================================================
  Commit: b0674e33d9059117f6542c500b200a89079b6b47
      https://github.com/fusinv/fusioninventory-agent/commit/b0674e33d9059117f6542c500b200a89079b6b47
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-02-14 (Tue, 14 Feb 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/USB.pm

  Log Message:
  -----------
  isolate devices extraction for testing purposes


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/USB.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/USB.pm
index 2d95ff3..80005b4 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/USB.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/USB.pm
@@ -16,6 +16,18 @@ sub doInventory {
 
     my $inventory = $params{inventory};
 
+    foreach my $device (_getUSBDevices()) {
+        $inventory->addEntry(
+            section => 'USBDEVICES',
+            entry   => $device
+        );
+    }
+}
+
+sub _getUSBDevices {
+
+    my @devices;
+
     foreach my $object (getWmiObjects(
         class      => 'CIM_LogicalDevice',
         properties => [ qw/DeviceID Name/ ]
@@ -37,11 +49,10 @@ sub doInventory {
         # avoid duplicates
         next if $seen->{$device->{SERIAL}}++;
 
-        $inventory->addEntry(
-            section => 'USBDEVICES',
-            entry   => $device
-        );
+        push @devices, $device;
     }
+
+    return @devices;
 }
 
 1;


================================================================
  Commit: 0c88939d84af39125139ff7250c395ce90e818d0
      https://github.com/fusinv/fusioninventory-agent/commit/0c88939d84af39125139ff7250c395ce90e818d0
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-02-14 (Tue, 14 Feb 2012)

  Changed paths:
    A resources/win32/wmi/7-CIM_LogicalDevice
    A t/inventory/windows/usb.t

  Log Message:
  -----------
  initial import


diff --git a/resources/win32/wmi/7-CIM_LogicalDevice b/resources/win32/wmi/7-CIM_LogicalDevice
new file mode 100644
index 0000000..b49efba
Binary files /dev/null and b/resources/win32/wmi/7-CIM_LogicalDevice differ
diff --git a/t/inventory/windows/usb.t b/t/inventory/windows/usb.t
new file mode 100755
index 0000000..99ff736
--- /dev/null
+++ b/t/inventory/windows/usb.t
@@ -0,0 +1,117 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+use utf8;
+
+use English qw(-no_match_vars);
+use Test::More;
+use Test::MockModule;
+
+BEGIN {
+    # use mock modules for non-available ones
+    push @INC, 't/fake/windows' if $OSNAME ne 'MSWin32';
+}
+
+use FusionInventory::Agent::Task::Inventory::Input::Win32::USB;
+
+my %tests = (
+    7 => [
+        {
+            NAME      => 'Périphérique audio USB',
+            SERIAL    => 'MI_02\\7',
+            VENDORID  => '046D',
+            PRODUCTID => '08C9'
+        },
+        {
+            NAME      => 'Périphérique d’entrée USB',
+            SERIAL    => 'MI_01\\7',
+            VENDORID  => '046D',
+            PRODUCTID => 'C30A'
+        },
+        {
+            NAME      => 'Generic USB Hub',
+            SERIAL    => '1C9B8E1E',
+            VENDORID  => '8087',
+            PRODUCTID => '0024'
+        },
+        {
+            NAME      => 'Generic USB Hub',
+            SERIAL    => '355C47BA',
+            VENDORID  => '8087',
+            PRODUCTID => '0024'
+        },
+        {
+            NAME      => 'ASUS Bluetooth',
+            SERIAL    => 'DF2EE03',
+            VENDORID  => '0B05',
+            PRODUCTID => '179C'
+        },
+        {
+            NAME      => 'Périphérique USB composite',
+            SERIAL    => '\\6BE882AB',
+            VENDORID  => '046D',
+            PRODUCTID => '08C9'
+        },
+        {
+            NAME      => 'Périphérique vidéo USB',
+            SERIAL    => 'MI_00\\7',
+            VENDORID  => '046D',
+            PRODUCTID => '08C9'
+        }
+    ]
+);
+
+plan tests => scalar keys %tests;
+
+my $module = Test::MockModule->new(
+    'FusionInventory::Agent::Task::Inventory::Input::Win32::USB'
+);
+
+foreach my $test (keys %tests) {
+    # redefine getWmiObjects function
+    $module->mock(
+        'getWmiObjects',
+        sub {
+            my (%params) = @_;
+
+            my $file = "resources/win32/wmi/$test-$params{class}";
+            open (my $handle, '<', $file) or die "can't open $file: $ERRNO";
+
+            # this is a windows file
+            binmode $handle, ':encoding(UTF-16LE)';
+            binmode $handle, ':crlf';
+
+            # build a list of desired properties indexes
+            my %properties = map { $_ => 1 } @{$params{properties}};
+
+            my @objects;
+            my $object;
+            while (my $line = <$handle>) {
+                if ($line =~ /^(\w+)=(.+)$/) {
+                    my $key = $1;
+                    my $value = $2;
+                    next unless $properties{$key};
+                    $value =~ s/&/&/g;
+                    $object->{$key} = $value;
+                    next;
+                }
+                if ($line =~ /^$/) {
+                    push @objects, $object if $object;
+                    undef $object;
+                    next;
+                }
+            }
+            close $handle;
+
+            return @objects;
+        }
+    );
+
+    my @devices = FusionInventory::Agent::Task::Inventory::Input::Win32::USB::_getUSBDevices();
+    is_deeply(
+        \@devices,
+        $tests{$test},
+        "$test USB devices list"
+    );
+}


================================================================
  Commit: 8b73a097fbd30ee7fa9a3fa8441332f33ff13a5f
      https://github.com/fusinv/fusioninventory-agent/commit/8b73a097fbd30ee7fa9a3fa8441332f33ff13a5f
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-02-14 (Tue, 14 Feb 2012)

  Changed paths:
    R resources/win32/printer/xppro1/USB.reg
    R resources/win32/printer/xppro1/USBPRINT.reg
    R resources/win32/printer/xppro2/USB.reg
    R resources/win32/printer/xppro2/USBPRINT.reg
    A resources/win32/registry/7-USB.reg
    A resources/win32/registry/7-USBPRINT.reg
    A resources/win32/registry/xppro1-USB.reg
    A resources/win32/registry/xppro1-USBPRINT.reg
    A resources/win32/registry/xppro2-USB.reg
    A resources/win32/registry/xppro2-USBPRINT.reg
    M t/inventory/windows/printers.t

  Log Message:
  -----------
  reorganise registry samples, and add 7 sample


diff --git a/resources/win32/printer/xppro1/USB.reg b/resources/win32/printer/xppro1/USB.reg
deleted file mode 100644
index c6f39c1..0000000
Binary files a/resources/win32/printer/xppro1/USB.reg and /dev/null differ
diff --git a/resources/win32/printer/xppro1/USBPRINT.reg b/resources/win32/printer/xppro1/USBPRINT.reg
deleted file mode 100644
index 14e5c89..0000000
Binary files a/resources/win32/printer/xppro1/USBPRINT.reg and /dev/null differ
diff --git a/resources/win32/printer/xppro2/USB.reg b/resources/win32/printer/xppro2/USB.reg
deleted file mode 100644
index 64ad002..0000000
Binary files a/resources/win32/printer/xppro2/USB.reg and /dev/null differ
diff --git a/resources/win32/printer/xppro2/USBPRINT.reg b/resources/win32/printer/xppro2/USBPRINT.reg
deleted file mode 100644
index 274dbac..0000000
Binary files a/resources/win32/printer/xppro2/USBPRINT.reg and /dev/null differ
diff --git a/resources/win32/registry/7-USB.reg b/resources/win32/registry/7-USB.reg
new file mode 100644
index 0000000..2639a4a
Binary files /dev/null and b/resources/win32/registry/7-USB.reg differ
diff --git a/resources/win32/registry/7-USBPRINT.reg b/resources/win32/registry/7-USBPRINT.reg
new file mode 100644
index 0000000..a92d04f
Binary files /dev/null and b/resources/win32/registry/7-USBPRINT.reg differ
diff --git a/resources/win32/registry/xppro1-USB.reg b/resources/win32/registry/xppro1-USB.reg
new file mode 100644
index 0000000..c6f39c1
Binary files /dev/null and b/resources/win32/registry/xppro1-USB.reg differ
diff --git a/resources/win32/registry/xppro1-USBPRINT.reg b/resources/win32/registry/xppro1-USBPRINT.reg
new file mode 100644
index 0000000..14e5c89
Binary files /dev/null and b/resources/win32/registry/xppro1-USBPRINT.reg differ
diff --git a/resources/win32/registry/xppro2-USB.reg b/resources/win32/registry/xppro2-USB.reg
new file mode 100644
index 0000000..64ad002
Binary files /dev/null and b/resources/win32/registry/xppro2-USB.reg differ
diff --git a/resources/win32/registry/xppro2-USBPRINT.reg b/resources/win32/registry/xppro2-USBPRINT.reg
new file mode 100644
index 0000000..274dbac
Binary files /dev/null and b/resources/win32/registry/xppro2-USBPRINT.reg differ
diff --git a/t/inventory/windows/printers.t b/t/inventory/windows/printers.t
index 8d3a4ee..2fe6ef6 100755
--- a/t/inventory/windows/printers.t
+++ b/t/inventory/windows/printers.t
@@ -23,6 +23,9 @@ my %tests = (
         USB001 => [ '6&1086615&0',  'J5J126789' ],
         USB003 => [ '6&159b6df2&0', 'JV40VNJ' ],
         USB004 => [ '7&20bd29b5&0', '6&28e27c3d&0&0000' ],
+    },
+    7 => {
+        USB001 => [ '7&17e8a3c3&0',  'MY26K1K34C2L' ],
     }
 );
 
@@ -33,8 +36,8 @@ foreach my $test (keys %tests) {
 plan tests => $plan;
 
 foreach my $test (keys %tests) {
-    my $printKey = load_registry("resources/win32/printer/$test/USBPRINT.reg");
-    my $usbKey   = load_registry("resources/win32/printer/$test/USB.reg");
+    my $printKey = load_registry("resources/win32/registry/$test-USBPRINT.reg");
+    my $usbKey   = load_registry("resources/win32/registry/$test-USB.reg");
     foreach my $port (keys $tests{$test}) {
         my $prefix = FusionInventory::Agent::Task::Inventory::Input::Win32::Printers::_getUSBPrefix($printKey, $port);
         my $serial = FusionInventory::Agent::Task::Inventory::Input::Win32::Printers::_getUSBSerial($usbKey, $prefix);


================================================================
  Commit: 228aadbf6e1ed06bae743d1fdf657118009a06c5
      https://github.com/fusinv/fusioninventory-agent/commit/228aadbf6e1ed06bae743d1fdf657118009a06c5
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-02-14 (Tue, 14 Feb 2012)

  Changed paths:
    M t/inventory/windows/printers.t

  Log Message:
  -----------
  useless module


diff --git a/t/inventory/windows/printers.t b/t/inventory/windows/printers.t
index 2fe6ef6..7aae255 100755
--- a/t/inventory/windows/printers.t
+++ b/t/inventory/windows/printers.t
@@ -5,7 +5,6 @@ use warnings;
 
 use English qw(-no_match_vars);
 use Test::More;
-use UNIVERSAL::require;
 
 BEGIN {
     # use mock modules for non-available ones


================================================================
  Commit: c638178c6f4b4b5d664cdba6d437e80caa28a2a3
      https://github.com/fusinv/fusioninventory-agent/commit/c638178c6f4b4b5d664cdba6d437e80caa28a2a3
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-02-14 (Tue, 14 Feb 2012)

  Changed paths:
    M t/inventory/windows/printers.t
    M t/inventory/windows/usb.t

  Log Message:
  -----------
  cosmetics


diff --git a/t/inventory/windows/printers.t b/t/inventory/windows/printers.t
index 7aae255..22cca88 100755
--- a/t/inventory/windows/printers.t
+++ b/t/inventory/windows/printers.t
@@ -10,6 +10,7 @@ BEGIN {
     # use mock modules for non-available ones
     push @INC, 't/fake/windows' if $OSNAME ne 'MSWin32';
 }
+
 use FusionInventory::Agent::Task::Inventory::Input::Win32::Printers;
 
 my %tests = (
@@ -53,10 +54,15 @@ sub load_registry {
     my $root_key = {};
     my $current_key;
 
-    open (my $handle, '<:encoding(UTF-16LE)', $file) or die();
+    open (my $handle, '<', $file) or die "can't open $file: $ERRNO";
+
+    # this is a windows file
+    binmode $handle, ':encoding(UTF-16LE)';
+    binmode $handle, ':crlf';
+
     while (my $line = <$handle>) {
 
-        if ($line =~ /^ \[ ([^]]+) \]/x) {
+        if ($line =~ /^ \[ ([^]]+) \] $/x) {
             my $path = $1;
             my @path = split(/\\/, $path);
 
diff --git a/t/inventory/windows/usb.t b/t/inventory/windows/usb.t
index 99ff736..88c9ad3 100755
--- a/t/inventory/windows/usb.t
+++ b/t/inventory/windows/usb.t
@@ -88,7 +88,7 @@ foreach my $test (keys %tests) {
             my @objects;
             my $object;
             while (my $line = <$handle>) {
-                if ($line =~ /^(\w+)=(.+)$/) {
+                if ($line =~ /^ (\w+) = (.+) $/x) {
                     my $key = $1;
                     my $value = $2;
                     next unless $properties{$key};


================================================================
  Commit: 89e58a2ad512a92fe044940ac402a6ac18ae4fd9
      https://github.com/fusinv/fusioninventory-agent/commit/89e58a2ad512a92fe044940ac402a6ac18ae4fd9
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-02-15 (Wed, 15 Feb 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Storage.pm

  Log Message:
  -----------
  use File::Path::mkpath instead of mk_path

File::Path::mk_path is not avalaible on RHEL5.

closes: #1466

Reported-by: Sébastien Prud'homme <sebastien.prudhomme at gmail.com>


diff --git a/lib/FusionInventory/Agent/Storage.pm b/lib/FusionInventory/Agent/Storage.pm
index c3616ea..f5f4623 100644
--- a/lib/FusionInventory/Agent/Storage.pm
+++ b/lib/FusionInventory/Agent/Storage.pm
@@ -6,7 +6,7 @@ use warnings;
 use Config;
 use English qw(-no_match_vars);
 use File::Glob qw(:glob);
-use File::Path qw(make_path);
+use File::Path qw(mkpath);
 use Storable;
 
 use FusionInventory::Agent::Logger;
@@ -17,7 +17,7 @@ sub new {
     die "no directory parameter" unless $params{directory};
 
     if (!-d $params{directory}) {
-        make_path($params{directory}, {error => \my $err});
+        mkpath($params{directory}, {error => \my $err});
         if (@$err) {
             my (undef, $message) = %{$err->[0]};
             die "Can't create $params{directory}: $message";


================================================================
  Commit: 3052f82d41784b485b3199c4413098c268afeab7
      https://github.com/fusinv/fusioninventory-agent/commit/3052f82d41784b485b3199c4413098c268afeab7
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-02-15 (Wed, 15 Feb 2012)

  Changed paths:
    M fusioninventory-win32-service
    M lib/FusionInventory/Agent/Task.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Printers.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Slots.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/USB.pm
    R resources/win32/printer/xppro1/USB.reg
    R resources/win32/printer/xppro1/USBPRINT.reg
    R resources/win32/printer/xppro2/USB.reg
    R resources/win32/printer/xppro2/USBPRINT.reg
    A resources/win32/registry/7-USB.reg
    A resources/win32/registry/7-USBPRINT.reg
    A resources/win32/registry/xppro1-USB.reg
    A resources/win32/registry/xppro1-USBPRINT.reg
    A resources/win32/registry/xppro2-USB.reg
    A resources/win32/registry/xppro2-USBPRINT.reg
    A resources/win32/wmi/7-CIM_LogicalDevice
    A t/inventory/windows/printers.t
    A t/inventory/windows/usb.t

  Log Message:
  -----------
  Merge remote-tracking branch 'origin/2.2.x' into 2.2.x


diff --git a/fusioninventory-win32-service b/fusioninventory-win32-service
index e7c1078..0a5c624 100644
--- a/fusioninventory-win32-service
+++ b/fusioninventory-win32-service
@@ -100,7 +100,7 @@ sub getMessage {
 sub startAgent {
     return if $thread;
     $thread = threads->create(sub {
-        my $agent = new FusionInventory::Agent(
+        my $agent = FusionInventory::Agent->new(
             confdir => $directory . '/../../etc/fusioninventory',
             datadir => $directory . '/../../share',
             vardir  => $directory . '/../../var',
diff --git a/lib/FusionInventory/Agent/Task.pm b/lib/FusionInventory/Agent/Task.pm
index 5e9023a..5d78c9f 100644
--- a/lib/FusionInventory/Agent/Task.pm
+++ b/lib/FusionInventory/Agent/Task.pm
@@ -110,9 +110,13 @@ the logger object to use (default: a new stderr logger)
 
 =back
 
+=head2 isEnabled()
+
+This is a method to be implemented by each subclass.
+
 =head2 run()
 
-This is the method to be implemented by each subclass.
+This is a method to be implemented by each subclass.
 
 =head2 getOptionsFromServer($response, $name, $feature)
 
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Printers.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Printers.pm
index 4e6ab66..48e8e6d 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Printers.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Printers.pm
@@ -101,7 +101,6 @@ sub doInventory {
     }    
 }
 
-# Search serial when connected in USB
 sub _getUSBPrinterSerial {
     my ($portName) = @_;
 
@@ -110,45 +109,62 @@ sub _getUSBPrinterSerial {
     }) or die "Can't open HKEY_LOCAL_MACHINE key: $EXTENDED_OS_ERROR";
 
     # first, find the USB container ID for this printer
-    my $usbId;
-    my $usbprintKey = $machKey->{"SYSTEM/CurrentControlSet/Enum/USBPRINT"};
+    my $prefix = _getUSBPrefix(
+        $machKey->{"SYSTEM/CurrentControlSet/Enum/USBPRINT"},
+        $portName
+    );
+    return unless $prefix;
+
+    # second, get the serial number from the ID container entry
+    my $serial = _getUSBSerial(
+        $machKey->{"SYSTEM/CurrentControlSet/Enum/USB"},
+        $prefix
+    );
+
+    return $serial;
+}
+
+sub _getUSBPrefix {
+    my ($printKey, $portName) = @_;
 
     # find the printer entry matching given portname
-    PRINTER: foreach my $printerKey (values %$usbprintKey) {
+    foreach my $printerKey (values %$printKey) {
         # look for a subkey with expected content
-        foreach my $subKey (values %$printerKey) {
+        foreach my $subKeyName (keys %$printerKey) {
+            my $subKey = $printerKey->{$subKeyName};
             next unless 
                 $subKey->{'Device Parameters/'}                &&
                 $subKey->{'Device Parameters/'}->{'/PortName'} &&
                 $subKey->{'Device Parameters/'}->{'/PortName'} eq $portName;
             # got it
-            $usbId = $subKey->{'/ContainerID'};
-            last PRINTER;
+            my $prefix = $subKeyName;
+            $prefix =~ s{&$portName/$}{};
+            return $prefix;
         };
     }
 
-    return unless $usbId;
+    return;
+}
 
-    # second, get the serial number from the ID container entry
-    my $serial;
-    my $usbKey = $machKey->{"SYSTEM/CurrentControlSet/Enum/USB"};
+sub _getUSBSerial {
+    my ($usbKey, $prefix) = @_;
 
     # find the device entry matching given container Id
-    DEVICE: foreach my $deviceKey (values %$usbKey) {
+    foreach my $deviceKey (values %$usbKey) {
         # look for a subkey with expected content
         foreach my $subKeyName (keys %$deviceKey) {
             my $subKey = $deviceKey->{$subKeyName};
             next unless
-                $subKey->{'/ContainerId'} &&
-                $subKey->{'/ContainerId'} eq $usbId;
+                $subKey->{'/ParentIdPrefix'} &&
+                $subKey->{'/ParentIdPrefix'} eq $prefix;
             # got it
-            $serial = $subKeyName;
+            my $serial = $subKeyName;
             $serial =~ s{/$}{};
-            last DEVICE;
+            return $serial;
         }
     }
 
-    return $serial;
+    return;
 }
 
 1;
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Slots.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Slots.pm
index ae9960a..cde477e 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Slots.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Slots.pm
@@ -17,9 +17,7 @@ sub doInventory {
 
     foreach my $object (getWmiObjects(
         class      => 'Win32_SystemSlot',
-        properties => [ qw/
-            Name Description SlotDesignation Status Shared
-        / ]
+        properties => [ qw/Name Description SlotDesignation Status/ ]
     )) {
 
         $inventory->addEntry(
@@ -29,7 +27,6 @@ sub doInventory {
                 DESCRIPTION => $object->{Description},
                 DESIGNATION => $object->{SlotDesignation},
                 STATUS      => $object->{Status},
-                SHARED      => $object->{Shared}
             }
         );
     }
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm
index 16331bb..a36f322 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm
@@ -102,9 +102,15 @@ sub _dateFormat {
     ## no critic (ExplicitReturnUndef)
     return undef unless $date;
 
-    return unless $date =~ /^(\d{4})(\d{2})(\d{2})/;
+    if ($date =~ /^(\d{4})(\d{1})(\d{2})$/) {
+	return "$3/0$2/$1";
+    }
+
+    if ($date =~ /^(\d{4})(\d{2})(\d{2})$/) {
+	return "$3/$2/$1";
+    }
 
-    return "$3/$2/$1";
+    return undef;
 }
 
 sub _getSoftwares {
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/USB.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/USB.pm
index 2d95ff3..80005b4 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/USB.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/USB.pm
@@ -16,6 +16,18 @@ sub doInventory {
 
     my $inventory = $params{inventory};
 
+    foreach my $device (_getUSBDevices()) {
+        $inventory->addEntry(
+            section => 'USBDEVICES',
+            entry   => $device
+        );
+    }
+}
+
+sub _getUSBDevices {
+
+    my @devices;
+
     foreach my $object (getWmiObjects(
         class      => 'CIM_LogicalDevice',
         properties => [ qw/DeviceID Name/ ]
@@ -37,11 +49,10 @@ sub doInventory {
         # avoid duplicates
         next if $seen->{$device->{SERIAL}}++;
 
-        $inventory->addEntry(
-            section => 'USBDEVICES',
-            entry   => $device
-        );
+        push @devices, $device;
     }
+
+    return @devices;
 }
 
 1;
diff --git a/resources/win32/printer/xppro1/USB.reg b/resources/win32/printer/xppro1/USB.reg
deleted file mode 100644
index c6f39c1..0000000
Binary files a/resources/win32/printer/xppro1/USB.reg and /dev/null differ
diff --git a/resources/win32/printer/xppro1/USBPRINT.reg b/resources/win32/printer/xppro1/USBPRINT.reg
deleted file mode 100644
index 14e5c89..0000000
Binary files a/resources/win32/printer/xppro1/USBPRINT.reg and /dev/null differ
diff --git a/resources/win32/printer/xppro2/USB.reg b/resources/win32/printer/xppro2/USB.reg
deleted file mode 100644
index c6f39c1..0000000
Binary files a/resources/win32/printer/xppro2/USB.reg and /dev/null differ
diff --git a/resources/win32/printer/xppro2/USBPRINT.reg b/resources/win32/printer/xppro2/USBPRINT.reg
deleted file mode 100644
index 14e5c89..0000000
Binary files a/resources/win32/printer/xppro2/USBPRINT.reg and /dev/null differ
diff --git a/resources/win32/registry/7-USB.reg b/resources/win32/registry/7-USB.reg
new file mode 100644
index 0000000..2639a4a
Binary files /dev/null and b/resources/win32/registry/7-USB.reg differ
diff --git a/resources/win32/registry/7-USBPRINT.reg b/resources/win32/registry/7-USBPRINT.reg
new file mode 100644
index 0000000..a92d04f
Binary files /dev/null and b/resources/win32/registry/7-USBPRINT.reg differ
diff --git a/resources/win32/registry/xppro1-USB.reg b/resources/win32/registry/xppro1-USB.reg
new file mode 100644
index 0000000..c6f39c1
Binary files /dev/null and b/resources/win32/registry/xppro1-USB.reg differ
diff --git a/resources/win32/registry/xppro1-USBPRINT.reg b/resources/win32/registry/xppro1-USBPRINT.reg
new file mode 100644
index 0000000..14e5c89
Binary files /dev/null and b/resources/win32/registry/xppro1-USBPRINT.reg differ
diff --git a/resources/win32/registry/xppro2-USB.reg b/resources/win32/registry/xppro2-USB.reg
new file mode 100644
index 0000000..64ad002
Binary files /dev/null and b/resources/win32/registry/xppro2-USB.reg differ
diff --git a/resources/win32/registry/xppro2-USBPRINT.reg b/resources/win32/registry/xppro2-USBPRINT.reg
new file mode 100644
index 0000000..274dbac
Binary files /dev/null and b/resources/win32/registry/xppro2-USBPRINT.reg differ
diff --git a/resources/win32/wmi/7-CIM_LogicalDevice b/resources/win32/wmi/7-CIM_LogicalDevice
new file mode 100644
index 0000000..b49efba
Binary files /dev/null and b/resources/win32/wmi/7-CIM_LogicalDevice differ
diff --git a/t/inventory/windows/printers.t b/t/inventory/windows/printers.t
new file mode 100755
index 0000000..22cca88
--- /dev/null
+++ b/t/inventory/windows/printers.t
@@ -0,0 +1,102 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+use English qw(-no_match_vars);
+use Test::More;
+
+BEGIN {
+    # use mock modules for non-available ones
+    push @INC, 't/fake/windows' if $OSNAME ne 'MSWin32';
+}
+
+use FusionInventory::Agent::Task::Inventory::Input::Win32::Printers;
+
+my %tests = (
+    xppro1 => {
+        USB001 => [ '6&397bdcac&0', '49R8Ka' ],
+        USB002 => [ '6&2ad9257f&0', '5&19d1ce61&0&2' ],
+        USB003 => [ '6&1605722f&0', '5&2377f6ef&0&2' ],
+    },
+    xppro2 => {
+        USB001 => [ '6&1086615&0',  'J5J126789' ],
+        USB003 => [ '6&159b6df2&0', 'JV40VNJ' ],
+        USB004 => [ '7&20bd29b5&0', '6&28e27c3d&0&0000' ],
+    },
+    7 => {
+        USB001 => [ '7&17e8a3c3&0',  'MY26K1K34C2L' ],
+    }
+);
+
+my $plan = 0;
+foreach my $test (keys %tests) {
+    $plan += 2 * scalar (keys $tests{$test});
+}
+plan tests => $plan;
+
+foreach my $test (keys %tests) {
+    my $printKey = load_registry("resources/win32/registry/$test-USBPRINT.reg");
+    my $usbKey   = load_registry("resources/win32/registry/$test-USB.reg");
+    foreach my $port (keys $tests{$test}) {
+        my $prefix = FusionInventory::Agent::Task::Inventory::Input::Win32::Printers::_getUSBPrefix($printKey, $port);
+        my $serial = FusionInventory::Agent::Task::Inventory::Input::Win32::Printers::_getUSBSerial($usbKey, $prefix);
+
+        is($prefix, $tests{$test}->{$port}->[0], "prefix for printer $port");
+        is($serial, $tests{$test}->{$port}->[1], "serial for printer $port");
+    }
+}
+
+sub load_registry {
+    my ($file) = @_;
+
+    my $root_offset;
+    my $root_key = {};
+    my $current_key;
+
+    open (my $handle, '<', $file) or die "can't open $file: $ERRNO";
+
+    # this is a windows file
+    binmode $handle, ':encoding(UTF-16LE)';
+    binmode $handle, ':crlf';
+
+    while (my $line = <$handle>) {
+
+        if ($line =~ /^ \[ ([^]]+) \] $/x) {
+            my $path = $1;
+            my @path = split(/\\/, $path);
+
+            if ($root_offset) {
+                splice @path, 0, $root_offset;
+                $current_key = $root_key;
+                foreach my $element (@path) {
+                    my $key_path = $element . '/';
+
+                    if (!defined $current_key->{$key_path}) {
+                        my $new_key = {};
+                        $current_key->{$key_path} = $new_key;
+                    }
+
+                    $current_key = $current_key->{$key_path};
+                }
+            } else {
+                $root_offset = scalar @path;
+            }
+            next;
+        }
+
+        if ($line =~ /^ " ([^"]+) " = dword:(\d+)/x) {
+            $current_key->{'/' . $1} = "0x$2";
+            next;
+        }
+
+        if ($line =~ /^ " ([^"]+) " = " ([^"]+) "/x) {
+            $current_key->{'/' . $1} = $2;
+            next;
+        }
+
+    }
+    close $handle;
+
+    return $root_key;
+}
diff --git a/t/inventory/windows/usb.t b/t/inventory/windows/usb.t
new file mode 100755
index 0000000..88c9ad3
--- /dev/null
+++ b/t/inventory/windows/usb.t
@@ -0,0 +1,117 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+use utf8;
+
+use English qw(-no_match_vars);
+use Test::More;
+use Test::MockModule;
+
+BEGIN {
+    # use mock modules for non-available ones
+    push @INC, 't/fake/windows' if $OSNAME ne 'MSWin32';
+}
+
+use FusionInventory::Agent::Task::Inventory::Input::Win32::USB;
+
+my %tests = (
+    7 => [
+        {
+            NAME      => 'Périphérique audio USB',
+            SERIAL    => 'MI_02\\7',
+            VENDORID  => '046D',
+            PRODUCTID => '08C9'
+        },
+        {
+            NAME      => 'Périphérique d’entrée USB',
+            SERIAL    => 'MI_01\\7',
+            VENDORID  => '046D',
+            PRODUCTID => 'C30A'
+        },
+        {
+            NAME      => 'Generic USB Hub',
+            SERIAL    => '1C9B8E1E',
+            VENDORID  => '8087',
+            PRODUCTID => '0024'
+        },
+        {
+            NAME      => 'Generic USB Hub',
+            SERIAL    => '355C47BA',
+            VENDORID  => '8087',
+            PRODUCTID => '0024'
+        },
+        {
+            NAME      => 'ASUS Bluetooth',
+            SERIAL    => 'DF2EE03',
+            VENDORID  => '0B05',
+            PRODUCTID => '179C'
+        },
+        {
+            NAME      => 'Périphérique USB composite',
+            SERIAL    => '\\6BE882AB',
+            VENDORID  => '046D',
+            PRODUCTID => '08C9'
+        },
+        {
+            NAME      => 'Périphérique vidéo USB',
+            SERIAL    => 'MI_00\\7',
+            VENDORID  => '046D',
+            PRODUCTID => '08C9'
+        }
+    ]
+);
+
+plan tests => scalar keys %tests;
+
+my $module = Test::MockModule->new(
+    'FusionInventory::Agent::Task::Inventory::Input::Win32::USB'
+);
+
+foreach my $test (keys %tests) {
+    # redefine getWmiObjects function
+    $module->mock(
+        'getWmiObjects',
+        sub {
+            my (%params) = @_;
+
+            my $file = "resources/win32/wmi/$test-$params{class}";
+            open (my $handle, '<', $file) or die "can't open $file: $ERRNO";
+
+            # this is a windows file
+            binmode $handle, ':encoding(UTF-16LE)';
+            binmode $handle, ':crlf';
+
+            # build a list of desired properties indexes
+            my %properties = map { $_ => 1 } @{$params{properties}};
+
+            my @objects;
+            my $object;
+            while (my $line = <$handle>) {
+                if ($line =~ /^ (\w+) = (.+) $/x) {
+                    my $key = $1;
+                    my $value = $2;
+                    next unless $properties{$key};
+                    $value =~ s/&/&/g;
+                    $object->{$key} = $value;
+                    next;
+                }
+                if ($line =~ /^$/) {
+                    push @objects, $object if $object;
+                    undef $object;
+                    next;
+                }
+            }
+            close $handle;
+
+            return @objects;
+        }
+    );
+
+    my @devices = FusionInventory::Agent::Task::Inventory::Input::Win32::USB::_getUSBDevices();
+    is_deeply(
+        \@devices,
+        $tests{$test},
+        "$test USB devices list"
+    );
+}


================================================================
  Commit: 81b9bd1657d6d3303e5c7ac68c54223abd5feb5f
      https://github.com/fusinv/fusioninventory-agent/commit/81b9bd1657d6d3303e5c7ac68c54223abd5feb5f
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-02-16 (Thu, 16 Feb 2012)

  Changed paths:
    A resources/win32/registry/.gitattributes
    A resources/win32/wmi/.gitattributes
    R resources/win32/wmi/7-CIM_LogicalDevice
    A resources/win32/wmi/7-CIM_LogicalDevice.wmi
    M t/inventory/windows/usb.t

  Log Message:
  -----------
  preserve original eol style


diff --git a/resources/win32/registry/.gitattributes b/resources/win32/registry/.gitattributes
new file mode 100644
index 0000000..9e1610d
--- /dev/null
+++ b/resources/win32/registry/.gitattributes
@@ -0,0 +1 @@
+*.reg -crlf
diff --git a/resources/win32/wmi/.gitattributes b/resources/win32/wmi/.gitattributes
new file mode 100644
index 0000000..abff04f
--- /dev/null
+++ b/resources/win32/wmi/.gitattributes
@@ -0,0 +1 @@
+*.wmi -crlf
diff --git a/resources/win32/wmi/7-CIM_LogicalDevice b/resources/win32/wmi/7-CIM_LogicalDevice
deleted file mode 100644
index b49efba..0000000
Binary files a/resources/win32/wmi/7-CIM_LogicalDevice and /dev/null differ
diff --git a/resources/win32/wmi/7-CIM_LogicalDevice.wmi b/resources/win32/wmi/7-CIM_LogicalDevice.wmi
new file mode 100644
index 0000000..b49efba
Binary files /dev/null and b/resources/win32/wmi/7-CIM_LogicalDevice.wmi differ
diff --git a/t/inventory/windows/usb.t b/t/inventory/windows/usb.t
index 88c9ad3..7bfadcb 100755
--- a/t/inventory/windows/usb.t
+++ b/t/inventory/windows/usb.t
@@ -75,7 +75,7 @@ foreach my $test (keys %tests) {
         sub {
             my (%params) = @_;
 
-            my $file = "resources/win32/wmi/$test-$params{class}";
+            my $file = "resources/win32/wmi/$test-$params{class}.wmi";
             open (my $handle, '<', $file) or die "can't open $file: $ERRNO";
 
             # this is a windows file


================================================================
  Commit: da73dd9cb07937ae7ee8b8b19ce356c538148b94
      https://github.com/fusinv/fusioninventory-agent/commit/da73dd9cb07937ae7ee8b8b19ce356c538148b94
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-02-16 (Thu, 16 Feb 2012)

  Changed paths:
    M t/inventory/windows/printers.t

  Log Message:
  -----------
  fix syntax

this was masked by auto-dereferencing on perl 5.14


diff --git a/t/inventory/windows/printers.t b/t/inventory/windows/printers.t
index 22cca88..6cf5586 100755
--- a/t/inventory/windows/printers.t
+++ b/t/inventory/windows/printers.t
@@ -31,14 +31,14 @@ my %tests = (
 
 my $plan = 0;
 foreach my $test (keys %tests) {
-    $plan += 2 * scalar (keys $tests{$test});
+    $plan += 2 * scalar (keys %{$tests{$test}});
 }
 plan tests => $plan;
 
 foreach my $test (keys %tests) {
     my $printKey = load_registry("resources/win32/registry/$test-USBPRINT.reg");
     my $usbKey   = load_registry("resources/win32/registry/$test-USB.reg");
-    foreach my $port (keys $tests{$test}) {
+    foreach my $port (keys %{$tests{$test}}) {
         my $prefix = FusionInventory::Agent::Task::Inventory::Input::Win32::Printers::_getUSBPrefix($printKey, $port);
         my $serial = FusionInventory::Agent::Task::Inventory::Input::Win32::Printers::_getUSBSerial($usbKey, $prefix);
 


================================================================
  Commit: 1164c33556d51424d5445ef057a47440553f82f1
      https://github.com/fusinv/fusioninventory-agent/commit/1164c33556d51424d5445ef057a47440553f82f1
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-02-16 (Thu, 16 Feb 2012)

  Changed paths:
    A resources/win32/.gitattributes
    R resources/win32/registry/.gitattributes
    R resources/win32/wmi/.gitattributes

  Log Message:
  -----------
  use a single .gitattributes file


There was an error trying to read the diff from github.com (time's up!)

================================================================
  Commit: 689525a3b4078d864e91948299b6055a1eda433e
      https://github.com/fusinv/fusioninventory-agent/commit/689525a3b4078d864e91948299b6055a1eda433e
  Author: Guillaume Rousse <guillomovitch at gmail.com>
  Date:   2012-02-16 (Thu, 16 Feb 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm

  Log Message:
  -----------
  compute access mode once


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
index 4be0f7c..856ead8 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
@@ -123,12 +123,12 @@ sub _getScreensFromWindows {
         TiedRef     => \$Registry
     );
 
-    foreach my $screen (@screens) {
+    my $access = FusionInventory::Agent::Tools::Win32::is64bit() ?
+	Win32::TieRegistry::KEY_READ() |
+	    FusionInventory::Agent::Tools::Win32::KEY_WOW64_64() :
+	Win32::TieRegistry::KEY_READ();
 
-        my $access = FusionInventory::Agent::Tools::Win32::is64bit() ?
-            Win32::TieRegistry::KEY_READ() |
-                FusionInventory::Agent::Tools::Win32::KEY_WOW64_64() :
-            Win32::TieRegistry::KEY_READ();
+    foreach my $screen (@screens) {
 
         my $machKey = $Registry->Open('LMachine', {
             Access => $access


================================================================
  Commit: 862cb590e1e3b028143f54ced8b4d93e75c07a82
      https://github.com/fusinv/fusioninventory-agent/commit/862cb590e1e3b028143f54ced8b4d93e75c07a82
  Author: Guillaume Rousse <guillomovitch at gmail.com>
  Date:   2012-02-16 (Thu, 16 Feb 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm

  Log Message:
  -----------
  fix second screen detection


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
index 856ead8..f69806b 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
@@ -88,10 +88,9 @@ sub _getScreensFromWindows {
     )) {
         next unless $object->{InstanceName};
 
-        my $PNPDeviceID = $object->{InstanceName};
-        $PNPDeviceID =~ s/_\d+//;
+        $object->{InstanceName} =~ s/_\d+//;
         push @screens, {
-            id => $object->{PNPDeviceID}
+            id => $object->{InstanceName}
         };
     }
 


================================================================
  Commit: 6d0315bc55fe515d11bc9d41139d8177459081d1
      https://github.com/fusinv/fusioninventory-agent/commit/6d0315bc55fe515d11bc9d41139d8177459081d1
  Author: Guillaume Rousse <guillomovitch at gmail.com>
  Date:   2012-02-16 (Thu, 16 Feb 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/USB.pm

  Log Message:
  -----------
  don't retain internal USB serials (#1328)


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/USB.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/USB.pm
index 80005b4..36eff6c 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/USB.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/USB.pm
@@ -32,7 +32,7 @@ sub _getUSBDevices {
         class      => 'CIM_LogicalDevice',
         properties => [ qw/DeviceID Name/ ]
     )) {
-        next unless $object->{DeviceID} =~ /^USB\\VID_(\w+)&PID_(\w+)(.*)/;
+        next unless $object->{DeviceID} =~ /^USB\\VID_(\w+)&PID_(\w+)\\(.*)/;
 
         my $device = {
             NAME      => $object->{Name},
@@ -41,14 +41,14 @@ sub _getUSBDevices {
             SERIAL    => $3
         };
 
-        $device->{SERIAL} =~ s/.*?&//;
-        $device->{SERIAL} =~ s/&.*$//;
-
         next if $device->{VENDORID} =~ /^0+$/;
 
         # avoid duplicates
         next if $seen->{$device->{SERIAL}}++;
 
+	# pseudo serial generated by windows
+	delete $device->{SERIAL} if $device->{SERIAL} =~ /&/;
+
         push @devices, $device;
     }
 


================================================================
  Commit: 0196a26aa691b9c4045754084860140c3cf7305d
      https://github.com/fusinv/fusioninventory-agent/commit/0196a26aa691b9c4045754084860140c3cf7305d
  Author: Guillaume Rousse <guillomovitch at gmail.com>
  Date:   2012-02-16 (Thu, 16 Feb 2012)

  Changed paths:
    M resources/win32/wmi/7-CIM_LogicalDevice.wmi

  Log Message:
  -----------
  update with proper eol encoding


diff --git a/resources/win32/wmi/7-CIM_LogicalDevice.wmi b/resources/win32/wmi/7-CIM_LogicalDevice.wmi
index b49efba..4910eb8 100644
Binary files a/resources/win32/wmi/7-CIM_LogicalDevice.wmi and b/resources/win32/wmi/7-CIM_LogicalDevice.wmi differ


================================================================
  Commit: 6a3f669eda8bf875b5132965b8a5e69739578af4
      https://github.com/fusinv/fusioninventory-agent/commit/6a3f669eda8bf875b5132965b8a5e69739578af4
  Author: Guillaume Rousse <guillomovitch at gmail.com>
  Date:   2012-02-18 (Sat, 18 Feb 2012)

  Changed paths:
    M t/inventory/windows/usb.t

  Log Message:
  -----------
  fix expected results according to new code


diff --git a/t/inventory/windows/usb.t b/t/inventory/windows/usb.t
index 7bfadcb..d1cea27 100755
--- a/t/inventory/windows/usb.t
+++ b/t/inventory/windows/usb.t
@@ -18,47 +18,36 @@ use FusionInventory::Agent::Task::Inventory::Input::Win32::USB;
 my %tests = (
     7 => [
         {
-            NAME      => 'Périphérique audio USB',
-            SERIAL    => 'MI_02\\7',
-            VENDORID  => '046D',
-            PRODUCTID => '08C9'
-        },
-        {
-            NAME      => 'Périphérique d’entrée USB',
-            SERIAL    => 'MI_01\\7',
-            VENDORID  => '046D',
-            PRODUCTID => 'C30A'
-        },
-        {
             NAME      => 'Generic USB Hub',
-            SERIAL    => '1C9B8E1E',
             VENDORID  => '8087',
             PRODUCTID => '0024'
         },
         {
             NAME      => 'Generic USB Hub',
-            SERIAL    => '355C47BA',
             VENDORID  => '8087',
             PRODUCTID => '0024'
         },
         {
             NAME      => 'ASUS Bluetooth',
-            SERIAL    => 'DF2EE03',
             VENDORID  => '0B05',
             PRODUCTID => '179C'
         },
         {
             NAME      => 'Périphérique USB composite',
-            SERIAL    => '\\6BE882AB',
+            SERIAL    => '6BE882AB',
             VENDORID  => '046D',
             PRODUCTID => '08C9'
         },
         {
-            NAME      => 'Périphérique vidéo USB',
-            SERIAL    => 'MI_00\\7',
+            NAME      => 'Périphérique d’entrée USB',
             VENDORID  => '046D',
-            PRODUCTID => '08C9'
-        }
+            PRODUCTID => 'C03E'
+        },
+        {
+            NAME      => 'Périphérique USB composite',
+            VENDORID  => '046D',
+            PRODUCTID => 'C30A'
+        },
     ]
 );
 
@@ -79,8 +68,9 @@ foreach my $test (keys %tests) {
             open (my $handle, '<', $file) or die "can't open $file: $ERRNO";
 
             # this is a windows file
+            #binmode $handle, ':crlf';
             binmode $handle, ':encoding(UTF-16LE)';
-            binmode $handle, ':crlf';
+            local $INPUT_RECORD_SEPARATOR="\r\n";
 
             # build a list of desired properties indexes
             my %properties = map { $_ => 1 } @{$params{properties}};
@@ -88,6 +78,7 @@ foreach my $test (keys %tests) {
             my @objects;
             my $object;
             while (my $line = <$handle>) {
+                chomp $line;
                 if ($line =~ /^ (\w+) = (.+) $/x) {
                     my $key = $1;
                     my $value = $2;


================================================================
  Commit: 8d37bf92300d6abeff0f602abbcdaec8ebdeea78
      https://github.com/fusinv/fusioninventory-agent/commit/8d37bf92300d6abeff0f602abbcdaec8ebdeea78
  Author: Guillaume Rousse <guillomovitch at gmail.com>
  Date:   2012-02-18 (Sat, 18 Feb 2012)

  Changed paths:
    M resources/win32/wmi/7-CIM_LogicalDevice.wmi

  Log Message:
  -----------
  new import to fix eol


diff --git a/resources/win32/wmi/7-CIM_LogicalDevice.wmi b/resources/win32/wmi/7-CIM_LogicalDevice.wmi
index 4910eb8..b49efba 100644
Binary files a/resources/win32/wmi/7-CIM_LogicalDevice.wmi and b/resources/win32/wmi/7-CIM_LogicalDevice.wmi differ


================================================================
  Commit: 0cebeaf883291375327d74b5e508784896c63c96
      https://github.com/fusinv/fusioninventory-agent/commit/0cebeaf883291375327d74b5e508784896c63c96
  Author: Guillaume Rousse <guillomovitch at gmail.com>
  Date:   2012-02-18 (Sat, 18 Feb 2012)

  Changed paths:
    M resources/win32/.gitattributes

  Log Message:
  -----------
  drop any eol normalization


diff --git a/resources/win32/.gitattributes b/resources/win32/.gitattributes
index 9e07bce..53f5171 100644
--- a/resources/win32/.gitattributes
+++ b/resources/win32/.gitattributes
@@ -1,2 +1,3 @@
-*.reg eol=crlf
-*.wmi eol=crlf
+# prevent any eol normalization
+*.reg -text
+*.wmi -text


================================================================
  Commit: d5697977d6fc1a0a016a5df0e45a8c698f9fc516
      https://github.com/fusinv/fusioninventory-agent/commit/d5697977d6fc1a0a016a5df0e45a8c698f9fc516
  Author: Guillaume Rousse <guillomovitch at gmail.com>
  Date:   2012-02-18 (Sat, 18 Feb 2012)

  Changed paths:
    R resources/win32/wmi/7-CIM_LogicalDevice.wmi

  Log Message:
  -----------
  removal before reimport


diff --git a/resources/win32/wmi/7-CIM_LogicalDevice.wmi b/resources/win32/wmi/7-CIM_LogicalDevice.wmi
deleted file mode 100644
index b49efba..0000000
Binary files a/resources/win32/wmi/7-CIM_LogicalDevice.wmi and /dev/null differ


================================================================
  Commit: 288c8f06f7ccbd36bef56160dc303c8c5ef1205a
      https://github.com/fusinv/fusioninventory-agent/commit/288c8f06f7ccbd36bef56160dc303c8c5ef1205a
  Author: Guillaume Rousse <guillomovitch at gmail.com>
  Date:   2012-02-18 (Sat, 18 Feb 2012)

  Changed paths:
    A resources/win32/wmi/7-CIM_LogicalDevice.wmi

  Log Message:
  -----------
  new import to fix eol


diff --git a/resources/win32/wmi/7-CIM_LogicalDevice.wmi b/resources/win32/wmi/7-CIM_LogicalDevice.wmi
new file mode 100644
index 0000000..b49efba
Binary files /dev/null and b/resources/win32/wmi/7-CIM_LogicalDevice.wmi differ


================================================================
  Commit: a56684c7dee6bec4bf7d94c9e28ee4224ea39855
      https://github.com/fusinv/fusioninventory-agent/commit/a56684c7dee6bec4bf7d94c9e28ee4224ea39855
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-02-18 (Sat, 18 Feb 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Storage.pm

  Log Message:
  -----------
  Merge remote-tracking branch 'forge/2.2.x' into 2.2.x


diff --git a/lib/FusionInventory/Agent/Storage.pm b/lib/FusionInventory/Agent/Storage.pm
index c3616ea..f5f4623 100644
--- a/lib/FusionInventory/Agent/Storage.pm
+++ b/lib/FusionInventory/Agent/Storage.pm
@@ -6,7 +6,7 @@ use warnings;
 use Config;
 use English qw(-no_match_vars);
 use File::Glob qw(:glob);
-use File::Path qw(make_path);
+use File::Path qw(mkpath);
 use Storable;
 
 use FusionInventory::Agent::Logger;
@@ -17,7 +17,7 @@ sub new {
     die "no directory parameter" unless $params{directory};
 
     if (!-d $params{directory}) {
-        make_path($params{directory}, {error => \my $err});
+        mkpath($params{directory}, {error => \my $err});
         if (@$err) {
             my (undef, $message) = %{$err->[0]};
             die "Can't create $params{directory}: $message";


================================================================
  Commit: 51129120774149953336f5068a416e59255a3cfa
      https://github.com/fusinv/fusioninventory-agent/commit/51129120774149953336f5068a416e59255a3cfa
  Author: Guillaume Rousse <guillomovitch at gmail.com>
  Date:   2012-02-18 (Sat, 18 Feb 2012)

  Changed paths:
    M t/inventory/windows/printers.t

  Log Message:
  -----------
  chomp lines


diff --git a/t/inventory/windows/printers.t b/t/inventory/windows/printers.t
index 6cf5586..156549f 100755
--- a/t/inventory/windows/printers.t
+++ b/t/inventory/windows/printers.t
@@ -58,9 +58,10 @@ sub load_registry {
 
     # this is a windows file
     binmode $handle, ':encoding(UTF-16LE)';
-    binmode $handle, ':crlf';
+    local $INPUT_RECORD_SEPARATOR="\r\n";
 
     while (my $line = <$handle>) {
+        chomp $line;
 
         if ($line =~ /^ \[ ([^]]+) \] $/x) {
             my $path = $1;


================================================================
  Commit: 56e9d8283e10d4f2185bd644cffb379c10ca1904
      https://github.com/fusinv/fusioninventory-agent/commit/56e9d8283e10d4f2185bd644cffb379c10ca1904
  Author: Guillaume Rousse <guillomovitch at gmail.com>
  Date:   2012-02-18 (Sat, 18 Feb 2012)

  Changed paths:
    M t/inventory/windows/usb.t

  Log Message:
  -----------
  cosmetics


diff --git a/t/inventory/windows/usb.t b/t/inventory/windows/usb.t
index d1cea27..6cc447f 100755
--- a/t/inventory/windows/usb.t
+++ b/t/inventory/windows/usb.t
@@ -68,7 +68,6 @@ foreach my $test (keys %tests) {
             open (my $handle, '<', $file) or die "can't open $file: $ERRNO";
 
             # this is a windows file
-            #binmode $handle, ':crlf';
             binmode $handle, ':encoding(UTF-16LE)';
             local $INPUT_RECORD_SEPARATOR="\r\n";
 
@@ -79,6 +78,7 @@ foreach my $test (keys %tests) {
             my $object;
             while (my $line = <$handle>) {
                 chomp $line;
+
                 if ($line =~ /^ (\w+) = (.+) $/x) {
                     my $key = $1;
                     my $value = $2;
@@ -87,6 +87,7 @@ foreach my $test (keys %tests) {
                     $object->{$key} = $value;
                     next;
                 }
+
                 if ($line =~ /^$/) {
                     push @objects, $object if $object;
                     undef $object;


================================================================
  Commit: 5f76d10c21b90c95fe435cf56af46712e61682ad
      https://github.com/fusinv/fusioninventory-agent/commit/5f76d10c21b90c95fe435cf56af46712e61682ad
  Author: Guillaume Rousse <guillomovitch at gmail.com>
  Date:   2012-02-18 (Sat, 18 Feb 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Storage.pm

  Log Message:
  -----------
  Merge remote-tracking branch 'origin/2.2.x' into 2.2.x


diff --git a/lib/FusionInventory/Agent/Storage.pm b/lib/FusionInventory/Agent/Storage.pm
index c3616ea..f5f4623 100644
--- a/lib/FusionInventory/Agent/Storage.pm
+++ b/lib/FusionInventory/Agent/Storage.pm
@@ -6,7 +6,7 @@ use warnings;
 use Config;
 use English qw(-no_match_vars);
 use File::Glob qw(:glob);
-use File::Path qw(make_path);
+use File::Path qw(mkpath);
 use Storable;
 
 use FusionInventory::Agent::Logger;
@@ -17,7 +17,7 @@ sub new {
     die "no directory parameter" unless $params{directory};
 
     if (!-d $params{directory}) {
-        make_path($params{directory}, {error => \my $err});
+        mkpath($params{directory}, {error => \my $err});
         if (@$err) {
             my (undef, $message) = %{$err->[0]};
             die "Can't create $params{directory}: $message";


================================================================
  Commit: c6c5d157afe7dec14385c5ef611f581d72f54954
      https://github.com/fusinv/fusioninventory-agent/commit/c6c5d157afe7dec14385c5ef611f581d72f54954
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-02-20 (Mon, 20 Feb 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm

  Log Message:
  -----------
  use the correct machKey for win32


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm
index a36f322..4b35d07 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm
@@ -68,7 +68,7 @@ sub doInventory {
             _addSoftware(inventory => $inventory, entry => $software);
         }
         _processMSIE(
-            machKey => $machKey64,
+            machKey => $machKey32,
             inventory => $inventory,
             is64bit => 0
         );


================================================================
  Commit: fe47afbb4c249fdc6db839f4610d1c08622a2aa5
      https://github.com/fusinv/fusioninventory-agent/commit/fe47afbb4c249fdc6db839f4610d1c08622a2aa5
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-02-20 (Mon, 20 Feb 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm

  Log Message:
  -----------
  indent


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm
index 4b35d07..9b14327 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm
@@ -175,7 +175,7 @@ sub _processMSIE {
     my $is64bit = $params{is64bit} || 0;
     my $machKey = $params{machKey};
 
-        my $name = "Internet Explorer";
+    my $name = "Internet Explorer";
     if ($is64bit) {
         $name .= " (64bit)";
     }


================================================================
  Commit: 18dfaf72bf40fbe39512dc925ecffbc1345be337
      https://github.com/fusinv/fusioninventory-agent/commit/18dfaf72bf40fbe39512dc925ecffbc1345be337
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-02-20 (Mon, 20 Feb 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/OS/MacOS/Packages.pm

  Log Message:
  -----------
  fix no-software parameter on MacOSX

closes: #1476

Reported-by: Ronan Mejecaze <rmejecaze at iweb.com>


diff --git a/lib/FusionInventory/Agent/Task/Inventory/OS/MacOS/Packages.pm b/lib/FusionInventory/Agent/Task/Inventory/OS/MacOS/Packages.pm
index 2908304..e9114de 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/OS/MacOS/Packages.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/OS/MacOS/Packages.pm
@@ -8,7 +8,7 @@ sub isInventoryEnabled {
 
     return unless can_load("Mac::SysProfile");
     # Do not run an package inventory if there is the --nosoft parameter
-    return if ($params->{config}->{nosoft});
+    return if ($params->{config}->{'no-software'});
 
     1;
 }


================================================================
  Commit: ae27440273e97e08d4445e90ee5474407f92ba91
      https://github.com/fusinv/fusioninventory-agent/commit/ae27440273e97e08d4445e90ee5474407f92ba91
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-02-20 (Mon, 20 Feb 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Videos.pm

  Log Message:
  -----------
  Merge branch '2.1.x' into 2.2.x


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Videos.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Videos.pm
index 722d7a8..d2b4604 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Videos.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Videos.pm
@@ -73,5 +73,4 @@ sub _getDisplays {
 
 }
 
-
 1;


================================================================
  Commit: 66f2f0ff9fd86609af09bdaed5c0260ab702b720
      https://github.com/fusinv/fusioninventory-agent/commit/66f2f0ff9fd86609af09bdaed5c0260ab702b720
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-02-20 (Mon, 20 Feb 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/USB.pm
    A resources/win32/.gitattributes
    R resources/win32/wmi/7-CIM_LogicalDevice
    A resources/win32/wmi/7-CIM_LogicalDevice.wmi
    M t/inventory/windows/printers.t
    M t/inventory/windows/usb.t

  Log Message:
  -----------
  Merge remote-tracking branch 'origin/2.2.x' into 2.2.x


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
index 4be0f7c..f69806b 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
@@ -88,10 +88,9 @@ sub _getScreensFromWindows {
     )) {
         next unless $object->{InstanceName};
 
-        my $PNPDeviceID = $object->{InstanceName};
-        $PNPDeviceID =~ s/_\d+//;
+        $object->{InstanceName} =~ s/_\d+//;
         push @screens, {
-            id => $object->{PNPDeviceID}
+            id => $object->{InstanceName}
         };
     }
 
@@ -123,12 +122,12 @@ sub _getScreensFromWindows {
         TiedRef     => \$Registry
     );
 
-    foreach my $screen (@screens) {
+    my $access = FusionInventory::Agent::Tools::Win32::is64bit() ?
+	Win32::TieRegistry::KEY_READ() |
+	    FusionInventory::Agent::Tools::Win32::KEY_WOW64_64() :
+	Win32::TieRegistry::KEY_READ();
 
-        my $access = FusionInventory::Agent::Tools::Win32::is64bit() ?
-            Win32::TieRegistry::KEY_READ() |
-                FusionInventory::Agent::Tools::Win32::KEY_WOW64_64() :
-            Win32::TieRegistry::KEY_READ();
+    foreach my $screen (@screens) {
 
         my $machKey = $Registry->Open('LMachine', {
             Access => $access
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/USB.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/USB.pm
index 80005b4..36eff6c 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/USB.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/USB.pm
@@ -32,7 +32,7 @@ sub _getUSBDevices {
         class      => 'CIM_LogicalDevice',
         properties => [ qw/DeviceID Name/ ]
     )) {
-        next unless $object->{DeviceID} =~ /^USB\\VID_(\w+)&PID_(\w+)(.*)/;
+        next unless $object->{DeviceID} =~ /^USB\\VID_(\w+)&PID_(\w+)\\(.*)/;
 
         my $device = {
             NAME      => $object->{Name},
@@ -41,14 +41,14 @@ sub _getUSBDevices {
             SERIAL    => $3
         };
 
-        $device->{SERIAL} =~ s/.*?&//;
-        $device->{SERIAL} =~ s/&.*$//;
-
         next if $device->{VENDORID} =~ /^0+$/;
 
         # avoid duplicates
         next if $seen->{$device->{SERIAL}}++;
 
+	# pseudo serial generated by windows
+	delete $device->{SERIAL} if $device->{SERIAL} =~ /&/;
+
         push @devices, $device;
     }
 
diff --git a/resources/win32/.gitattributes b/resources/win32/.gitattributes
new file mode 100644
index 0000000..53f5171
--- /dev/null
+++ b/resources/win32/.gitattributes
@@ -0,0 +1,3 @@
+# prevent any eol normalization
+*.reg -text
+*.wmi -text
diff --git a/resources/win32/wmi/7-CIM_LogicalDevice b/resources/win32/wmi/7-CIM_LogicalDevice
deleted file mode 100644
index b49efba..0000000
Binary files a/resources/win32/wmi/7-CIM_LogicalDevice and /dev/null differ
diff --git a/resources/win32/wmi/7-CIM_LogicalDevice.wmi b/resources/win32/wmi/7-CIM_LogicalDevice.wmi
new file mode 100644
index 0000000..b49efba
Binary files /dev/null and b/resources/win32/wmi/7-CIM_LogicalDevice.wmi differ
diff --git a/t/inventory/windows/printers.t b/t/inventory/windows/printers.t
index 22cca88..156549f 100755
--- a/t/inventory/windows/printers.t
+++ b/t/inventory/windows/printers.t
@@ -31,14 +31,14 @@ my %tests = (
 
 my $plan = 0;
 foreach my $test (keys %tests) {
-    $plan += 2 * scalar (keys $tests{$test});
+    $plan += 2 * scalar (keys %{$tests{$test}});
 }
 plan tests => $plan;
 
 foreach my $test (keys %tests) {
     my $printKey = load_registry("resources/win32/registry/$test-USBPRINT.reg");
     my $usbKey   = load_registry("resources/win32/registry/$test-USB.reg");
-    foreach my $port (keys $tests{$test}) {
+    foreach my $port (keys %{$tests{$test}}) {
         my $prefix = FusionInventory::Agent::Task::Inventory::Input::Win32::Printers::_getUSBPrefix($printKey, $port);
         my $serial = FusionInventory::Agent::Task::Inventory::Input::Win32::Printers::_getUSBSerial($usbKey, $prefix);
 
@@ -58,9 +58,10 @@ sub load_registry {
 
     # this is a windows file
     binmode $handle, ':encoding(UTF-16LE)';
-    binmode $handle, ':crlf';
+    local $INPUT_RECORD_SEPARATOR="\r\n";
 
     while (my $line = <$handle>) {
+        chomp $line;
 
         if ($line =~ /^ \[ ([^]]+) \] $/x) {
             my $path = $1;
diff --git a/t/inventory/windows/usb.t b/t/inventory/windows/usb.t
index 88c9ad3..6cc447f 100755
--- a/t/inventory/windows/usb.t
+++ b/t/inventory/windows/usb.t
@@ -18,47 +18,36 @@ use FusionInventory::Agent::Task::Inventory::Input::Win32::USB;
 my %tests = (
     7 => [
         {
-            NAME      => 'Périphérique audio USB',
-            SERIAL    => 'MI_02\\7',
-            VENDORID  => '046D',
-            PRODUCTID => '08C9'
-        },
-        {
-            NAME      => 'Périphérique d’entrée USB',
-            SERIAL    => 'MI_01\\7',
-            VENDORID  => '046D',
-            PRODUCTID => 'C30A'
-        },
-        {
             NAME      => 'Generic USB Hub',
-            SERIAL    => '1C9B8E1E',
             VENDORID  => '8087',
             PRODUCTID => '0024'
         },
         {
             NAME      => 'Generic USB Hub',
-            SERIAL    => '355C47BA',
             VENDORID  => '8087',
             PRODUCTID => '0024'
         },
         {
             NAME      => 'ASUS Bluetooth',
-            SERIAL    => 'DF2EE03',
             VENDORID  => '0B05',
             PRODUCTID => '179C'
         },
         {
             NAME      => 'Périphérique USB composite',
-            SERIAL    => '\\6BE882AB',
+            SERIAL    => '6BE882AB',
             VENDORID  => '046D',
             PRODUCTID => '08C9'
         },
         {
-            NAME      => 'Périphérique vidéo USB',
-            SERIAL    => 'MI_00\\7',
+            NAME      => 'Périphérique d’entrée USB',
+            VENDORID  => '046D',
+            PRODUCTID => 'C03E'
+        },
+        {
+            NAME      => 'Périphérique USB composite',
             VENDORID  => '046D',
-            PRODUCTID => '08C9'
-        }
+            PRODUCTID => 'C30A'
+        },
     ]
 );
 
@@ -75,12 +64,12 @@ foreach my $test (keys %tests) {
         sub {
             my (%params) = @_;
 
-            my $file = "resources/win32/wmi/$test-$params{class}";
+            my $file = "resources/win32/wmi/$test-$params{class}.wmi";
             open (my $handle, '<', $file) or die "can't open $file: $ERRNO";
 
             # this is a windows file
             binmode $handle, ':encoding(UTF-16LE)';
-            binmode $handle, ':crlf';
+            local $INPUT_RECORD_SEPARATOR="\r\n";
 
             # build a list of desired properties indexes
             my %properties = map { $_ => 1 } @{$params{properties}};
@@ -88,6 +77,8 @@ foreach my $test (keys %tests) {
             my @objects;
             my $object;
             while (my $line = <$handle>) {
+                chomp $line;
+
                 if ($line =~ /^ (\w+) = (.+) $/x) {
                     my $key = $1;
                     my $value = $2;
@@ -96,6 +87,7 @@ foreach my $test (keys %tests) {
                     $object->{$key} = $value;
                     next;
                 }
+
                 if ($line =~ /^$/) {
                     push @objects, $object if $object;
                     undef $object;


================================================================
  Commit: 10ef8d9e0126c26ca3a173d6b3d533671a9a9a87
      https://github.com/fusinv/fusioninventory-agent/commit/10ef8d9e0126c26ca3a173d6b3d533671a9a9a87
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-02-20 (Mon, 20 Feb 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm

  Log Message:
  -----------
  indent


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm
index 9b14327..58a1046 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm
@@ -162,8 +162,8 @@ sub _addSoftware {
 
     my $entry = $params{entry};
 
-        # avoid duplicates
-        return if $seen->{$entry->{NAME}}->{$entry->{IS64BIT}}{$entry->{VERSION} || '_undef_'}++;
+    # avoid duplicates
+    return if $seen->{$entry->{NAME}}->{$entry->{IS64BIT}}{$entry->{VERSION} || '_undef_'}++;
 
     $params{inventory}->addEntry(section => 'SOFTWARES', entry => $entry);
 }


================================================================
  Commit: bb098d9d9ee118805b884d99545c9e1913f690e9
      https://github.com/fusinv/fusioninventory-agent/commit/bb098d9d9ee118805b884d99545c9e1913f690e9
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-02-20 (Mon, 20 Feb 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/OS/MacOS/Videos.pm

  Log Message:
  -----------
  fix a syntax error

Reported-by: Walid Nouh <walid.nouh at gmail.com>


diff --git a/lib/FusionInventory/Agent/Task/Inventory/OS/MacOS/Videos.pm b/lib/FusionInventory/Agent/Task/Inventory/OS/MacOS/Videos.pm
index 39e8dc9..9189c4b 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/OS/MacOS/Videos.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/OS/MacOS/Videos.pm
@@ -79,8 +79,7 @@ sub doInventory {
     my %displays = _getDisplays();
     foreach my $section (keys %displays ) {
         foreach (@{$displays{$section}}) {
-            $inventory->addVideo(
-                  entry   => $_
+            $inventory->addVideo($_);
         }
     }
 }


================================================================
  Commit: f773b87e3d5f7ab87bd607fab6f17a22e56221ae
      https://github.com/fusinv/fusioninventory-agent/commit/f773b87e3d5f7ab87bd607fab6f17a22e56221ae
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-02-20 (Mon, 20 Feb 2012)

  Log Message:
  -----------
  Merge branch '2.1.x' into 2.2.x




================================================================
  Commit: 334935af3019d47304c1556ca4e0675a2c7e7ecb
      https://github.com/fusinv/fusioninventory-agent/commit/334935af3019d47304c1556ca4e0675a2c7e7ecb
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-02-20 (Mon, 20 Feb 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory.pm

  Log Message:
  -----------
  fix: $runMeIfTheseChecksFailed

runMeIfTheseChecksFailed content was ignored. Because of that,
memory and CPU inventor were done two time in a row (dmidecode
then WMI).

closes: #1399

Reported-by: Reported-by: David Durieux <d.durieux at siprossii.com>
Reported-by: James M Pulver <jmp242 at cornell.edu>,


diff --git a/lib/FusionInventory/Agent/Task/Inventory.pm b/lib/FusionInventory/Agent/Task/Inventory.pm
index 3a6a909..948e730 100644
--- a/lib/FusionInventory/Agent/Task/Inventory.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory.pm
@@ -198,9 +198,9 @@ sub _initModulesList {
             }
         }
 
-        unless ($failed) {
+        if ($failed) {
             $self->{modules}->{$module}->{enabled} = 0;
-            $logger->debug("module $module disabled: no depended module failed");
+            $logger->debug("module $module disabled because of $failed");
         }
     }
 }


================================================================
  Commit: af043ad4269df12eb25948c6bb5b117df5cc274d
      https://github.com/fusinv/fusioninventory-agent/commit/af043ad4269df12eb25948c6bb5b117df5cc274d
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-02-22 (Wed, 22 Feb 2012)

  Changed paths:
    A t/05var.t

  Log Message:
  -----------
  new test: use Test::Vars


diff --git a/t/05var.t b/t/05var.t
new file mode 100644
index 0000000..15bd4bf
--- /dev/null
+++ b/t/05var.t
@@ -0,0 +1,27 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+use Test::More;
+use English qw(-no_match_vars);
+
+if (!$ENV{TEST_AUTHOR}) {
+    my $msg = 'Author test. Set $ENV{TEST_AUTHOR} to a true value to run.';
+    plan(skip_all => $msg);
+}
+
+# use mock modules for non-available ones
+if ($OSNAME eq 'MSWin32') {
+    push @INC, 't/fake/unix';
+} else {
+    push @INC, 't/fake/windows';
+}
+
+eval { require Test::Vars; };
+
+if ($EVAL_ERROR) {
+    plan(skip_all => 'Test::Vars required to validate the code');
+}
+
+Test::Vars::all_vars_ok();
+


================================================================
  Commit: 683d797f62830637404722fe87ba5a93e742a3c7
      https://github.com/fusinv/fusioninventory-agent/commit/683d797f62830637404722fe87ba5a93e742a3c7
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-02-22 (Wed, 22 Feb 2012)

  Changed paths:
    M Changes

  Log Message:
  -----------
  fix: 2.1.12 was really 2.1.13


diff --git a/Changes b/Changes
index 5a53b41..0ef5280 100644
--- a/Changes
+++ b/Changes
@@ -1,6 +1,6 @@
 Revision history for FusionInventory::Agent
 
-2.1.12  Wed, 14 Dec 2011 13:06:44 +0100
+2.1.13  Wed, 14 Dec 2011 13:06:44 +0100
 
 TEST-SUITE
  ✔ 2.1.10 Test suite fails


================================================================
  Commit: 1ec749339d3531860c88348f83fe87b330315fe6
      https://github.com/fusinv/fusioninventory-agent/commit/1ec749339d3531860c88348f83fe87b330315fe6
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-02-22 (Wed, 22 Feb 2012)

  Changed paths:
    M Changes
    M lib/FusionInventory/Agent.pm

  Log Message:
  -----------
  2.1.14 release


diff --git a/Changes b/Changes
index 0ef5280..f2abc35 100644
--- a/Changes
+++ b/Changes
@@ -1,5 +1,39 @@
 Revision history for FusionInventory::Agent
 
+2.1.14  Wed, 22 Feb 2012 14:56:51 -0000
+
+LINUX
+ ✔ Detected OS is "RedHat" for CentOS servers if lsb_release not available
+       commit:d3a252
+     http://forge.fusioninventory.org/issues/1193
+   thanks: Jonathan Clarke
+
+MACOSX
+ ✔ no-software option doesn't work as advertised
+       commit:18dfaf
+     http://forge.fusioninventory.org/issues/1476
+   thanks: Ronan Mejecaze
+ ✔ syntax error in Video module
+   thanks: Walid Nouh
+
+WINDOWS
+ ✔ No 2007 Microsoft Office system into XML
+       commit:39f3c7
+     http://forge.fusioninventory.org/issues/1065
+   thanks: Walid Nouh, Xavier Caillaud, jerome slayer
+ ✔ On Windows Vista Office 2007 is not correctly gathered
+       commit:39f3c7
+     http://forge.fusioninventory.org/issues/1425
+   thanks: Walid Nouh, Xavier Caillaud
+ ✔ VM System incorrect
+       commit:259996
+     http://forge.fusioninventory.org/issues/1436
+   thanks: Mario Gzuk
+ ✔ Inventory Internet Explorer when it's not present in Add/remove programs
+       commit:39f3c7
+     http://forge.fusioninventory.org/issues/1441
+   thanks: Walid Nouh, Xavier Caillaud, jerome slayer
+
 2.1.13  Wed, 14 Dec 2011 13:06:44 +0100
 
 TEST-SUITE
diff --git a/lib/FusionInventory/Agent.pm b/lib/FusionInventory/Agent.pm
index af2b9ee..f698503 100644
--- a/lib/FusionInventory/Agent.pm
+++ b/lib/FusionInventory/Agent.pm
@@ -11,7 +11,7 @@ use File::Path;
 use XML::Simple;
 use Sys::Hostname;
 
-our $VERSION = '2.1.13';
+our $VERSION = '2.1.14';
 $ENV{LC_ALL} = 'C'; # Turn off localised output for commands
 $ENV{LANG} = 'C'; # Turn off localised output for commands
 


================================================================
  Commit: 07a4bff027b0a4aed6e5e040cefd818ae39d3143
      https://github.com/fusinv/fusioninventory-agent/commit/07a4bff027b0a4aed6e5e040cefd818ae39d3143
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-02-23 (Thu, 23 Feb 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm

  Log Message:
  -----------
  more robuste win32 64bit software inventory

Ignore MSIE 64bit inventory if it has no version.
_getSoftwares, don't try to process bad content (not hash ref).

Reported-by: James M Pulver <jmp242 at cornell.edu>


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm
index 58a1046..4c6c9a7 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm
@@ -15,7 +15,7 @@ use Win32::TieRegistry (
 use FusionInventory::Agent::Tools;
 use FusionInventory::Agent::Tools::Win32;
 
-my $seen;
+my $seen = {};
 
 sub isEnabled {
     my (%params) = @_;
@@ -37,47 +37,51 @@ sub doInventory {
 
         my $machKey64 = $Registry->Open('LMachine', {
             Access => KEY_READ | KEY_WOW64_64 ## no critic (ProhibitBitwise)
-        }) or die "Can't open HKEY_LOCAL_MACHINE key: $EXTENDED_OS_ERROR";
+        }) or $logger->error("Can't open HKEY_LOCAL_MACHINE key: $EXTENDED_OS_ERROR");
 
         my $softwares64 =
             $machKey64->{"SOFTWARE/Microsoft/Windows/CurrentVersion/Uninstall"};
 
         foreach my $software (_getSoftwares(
             softwares => $softwares64,
-            is64bit   => 1
+            is64bit   => 1,
+            logger => $logger
         )) {
-            _addSoftware(inventory => $inventory, entry => $software);
+            _addSoftware(inventory => $inventory, entry => $software, logger => $logger);
         }
         _processMSIE(
             machKey => $machKey64,
             inventory => $inventory,
-            is64bit => 1
+            is64bit => 1,
+            logger => $logger,
         );
 
         my $machKey32 = $Registry->Open('LMachine', {
             Access => KEY_READ | KEY_WOW64_32 ## no critic (ProhibitBitwise)
-        }) or die "Can't open HKEY_LOCAL_MACHINE key: $EXTENDED_OS_ERROR";
+        }) or $logger->error("Can't open HKEY_LOCAL_MACHINE key: $EXTENDED_OS_ERROR");
 
         my $softwares32 =
             $machKey32->{"SOFTWARE/Microsoft/Windows/CurrentVersion/Uninstall"};
 
         foreach my $software (_getSoftwares(
             softwares => $softwares32,
-            is64bit   => 0
+            is64bit   => 0,
+            logger => $logger
         )) {
-            _addSoftware(inventory => $inventory, entry => $software);
+            _addSoftware(inventory => $inventory, entry => $software, logger => $logger);
         }
         _processMSIE(
             machKey => $machKey32,
             inventory => $inventory,
-            is64bit => 0
+            is64bit => 0,
+            logger => $logger
         );
 
 
     } else {
         my $machKey = $Registry->Open('LMachine', {
             Access => KEY_READ
-        }) or die "Can't open HKEY_LOCAL_MACHINE key: $EXTENDED_OS_ERROR";
+        }) or $logger->error("Can't open HKEY_LOCAL_MACHINE key: $EXTENDED_OS_ERROR");
 
         my $softwares =
             $machKey->{"SOFTWARE/Microsoft/Windows/CurrentVersion/Uninstall"};
@@ -86,18 +90,19 @@ sub doInventory {
             softwares => $softwares,
             is64bit   => 0
         )) {
-            _addSoftware(inventory => $inventory, entry => $software);
+            _addSoftware(inventory => $inventory, entry => $software, logger => $logger);
         }
         _processMSIE(
             machKey => $machKey,
             inventory => $inventory,
-            is64bit => 0
+            is64bit => 0,
+            logger => $logger
         );
     }
 }
 
 sub _dateFormat {
-    my ($date) = @_; 
+    my ($date) = @_;
 
     ## no critic (ExplicitReturnUndef)
     return undef unless $date;
@@ -118,16 +123,22 @@ sub _getSoftwares {
 
     my $softwares = $params{softwares};
     my $is64bit   = $params{is64bit};
+    my $logger   = $params{logger};
 
     my @softwares;
 
+    return unless $softwares;
+
     foreach my $rawGuid (keys %$softwares) {
         my $data = $softwares->{$rawGuid};
+
+        next unless $data;
+
         # odd, found on Win2003
         next unless keys %$data > 2;
 
         my $guid = $rawGuid;
-        $guid =~ s/\/$//; # drop the tailing / 
+        $guid =~ s/\/$//; # drop the tailing /
 
         my $software = {
             FROM             => "registry",
@@ -162,6 +173,7 @@ sub _addSoftware {
 
     my $entry = $params{entry};
 
+    $params{logger}->debug("_addSoftware() begin") if $params{logger};
     # avoid duplicates
     return if $seen->{$entry->{NAME}}->{$entry->{IS64BIT}}{$entry->{VERSION} || '_undef_'}++;
 
@@ -173,16 +185,17 @@ sub _processMSIE {
 
     my $inventory = $params{inventory};
     my $is64bit = $params{is64bit} || 0;
-    my $machKey = $params{machKey};
 
     my $name = "Internet Explorer";
     if ($is64bit) {
         $name .= " (64bit)";
     }
     my $version = $params{machKey}->{"SOFTWARE/Microsoft/Internet Explorer/Version"};
+    return unless $version;
 
     _addSoftware(
         inventory => $params{inventory},
+        logger => $params{logger},
         entry => {
             FROM => "registry",
             IS64BIT => $is64bit,
@@ -193,5 +206,4 @@ sub _processMSIE {
 
 }
 
-
 1;


================================================================
  Commit: 6dae477b10956c14b62a70f2f636a19a7acf2366
      https://github.com/fusinv/fusioninventory-agent/commit/6dae477b10956c14b62a70f2f636a19a7acf2366
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-02-23 (Thu, 23 Feb 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Inventory.pm

  Log Message:
  -----------
  drop unused variables and methods


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Inventory.pm b/lib/FusionInventory/Agent/Task/Inventory/Inventory.pm
index a2d864d..ab36038 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Inventory.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Inventory.pm
@@ -299,16 +299,6 @@ sub setTag {
 
 }
 
-sub checkContent {
-    my ($self, $args) = @_;
-
-    my $logger = $self->{logger};
-
-    my $missing = 0;
-    my $content = $self->{content};
-
-}
-
 sub computeChecksum {
     my ($self) = @_;
 
@@ -374,7 +364,7 @@ sub computeChecksum {
 }
 
 sub saveLastState {
-    my ($self, $args) = @_;
+    my ($self) = @_;
 
     my $logger = $self->{logger};
 
@@ -479,10 +469,6 @@ Set BIOS informations.
 
 What is that for? :)
 
-=head2 checkContent()
-
-Check inventory content.
-
 =head2 computeChecksum()
 
 Compute the inventory checksum. This information is used by the server to


================================================================
  Commit: 8a6912318266000dbbd9b603ebbcfbfe0aaf87e8
      https://github.com/fusinv/fusioninventory-agent/commit/8a6912318266000dbbd9b603ebbcfbfe0aaf87e8
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-02-23 (Thu, 23 Feb 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/AIX/LVM.pm

  Log Message:
  -----------
  reorder functions


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/AIX/LVM.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/AIX/LVM.pm
index 672de8b..6e6b4f8 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/AIX/LVM.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/AIX/LVM.pm
@@ -2,9 +2,7 @@ package FusionInventory::Agent::Task::Inventory::Input::AIX::LVM;
 
 use FusionInventory::Agent::Tools;
 
-# LVM for AIX
 use strict;
-
 use warnings;
 
 use English qw(-no_match_vars);
@@ -13,6 +11,28 @@ sub isEnabled {
     canRun("lspv");
 }
 
+sub doInventory {
+    my (%params) = @_;
+
+    my $inventory = $params{inventory};
+
+    my $pvs       = _parsePvs();
+    foreach (@$pvs) {
+        $inventory->addEntry(section => 'PHYSICAL_VOLUMES', entry => $_);
+    }
+
+    my $lvs = _parseLvs();
+    foreach (@$lvs) {
+        $inventory->addEntry(section => 'LOGICAL_VOLUMES', entry => $_);
+    }
+
+    my $vgs = _parseVgs();
+    foreach (@$vgs) {
+        $inventory->addEntry(section => 'VOLUME_GROUPS', entry => $_);
+    }
+
+}
+
 sub _parseLvs {
 
     my @vs_elem;
@@ -181,26 +201,4 @@ sub _parseVgs {
     return $entries;
 }
 
-sub doInventory {
-    my (%params) = @_;
-
-    my $inventory = $params{inventory};
-
-    my $pvs       = _parsePvs();
-    foreach (@$pvs) {
-        $inventory->addEntry(section => 'PHYSICAL_VOLUMES', entry => $_);
-    }
-
-    my $lvs = _parseLvs();
-    foreach (@$lvs) {
-        $inventory->addEntry(section => 'LOGICAL_VOLUMES', entry => $_);
-    }
-
-    my $vgs = _parseVgs();
-    foreach (@$vgs) {
-        $inventory->addEntry(section => 'VOLUME_GROUPS', entry => $_);
-    }
-
-}
-
 1;


================================================================
  Commit: ac16a814c38c824b2d683d5fc1649ca4a57bbeb1
      https://github.com/fusinv/fusioninventory-agent/commit/ac16a814c38c824b2d683d5fc1649ca4a57bbeb1
  Author: Guillaume Rousse <Guillaume.Rousse at inria.fr>
  Date:   2012-02-24 (Fri, 24 Feb 2012)

  Changed paths:
    A resources/macos/system_profiler/10.6-intel-SPFireWireDataType
    A resources/macos/system_profiler/10.6-intel-SPParallelATADataType
    A resources/macos/system_profiler/10.6-intel-SPSerialATADataType
    A resources/macos/system_profiler/10.6-intel-SPUSBDataType

  Log Message:
  -----------
  initial import


diff --git a/resources/macos/system_profiler/10.6-intel-SPFireWireDataType b/resources/macos/system_profiler/10.6-intel-SPFireWireDataType
new file mode 100644
index 0000000..4a6629d
--- /dev/null
+++ b/resources/macos/system_profiler/10.6-intel-SPFireWireDataType
@@ -0,0 +1,6 @@
+FireWire:
+
+    FireWire Bus:
+
+      Maximum Speed: Up to 400 Mb/sec
+
diff --git a/resources/macos/system_profiler/10.6-intel-SPParallelATADataType b/resources/macos/system_profiler/10.6-intel-SPParallelATADataType
new file mode 100644
index 0000000..0999d1c
--- /dev/null
+++ b/resources/macos/system_profiler/10.6-intel-SPParallelATADataType
@@ -0,0 +1,38 @@
+ATA:
+
+    ATA Bus:
+
+        HL-DT-ST DVDRW  GSA-S10N:
+
+          Capacity: 7,77 GB (7 771 521 024 bytes)
+          Model: HL-DT-ST DVDRW  GSA-S10N                
+          Revision: BP08    
+          Serial Number: K0076RM5813         
+          Removable Media: Yes
+          Detachable Drive: No
+          BSD Name: disk1
+          Protocol: ATAPI
+          Unit Number: 0
+          Socket Type: Internal
+          Low Power Polling: Yes
+          Power Off: Yes
+          Partition Map Type: APM (Apple Partition Map)
+          S.M.A.R.T. status: Not Supported
+          Volumes:
+              Capacity: 31 KB (30 720 bytes)
+              Media Type: DVD-ROM
+              Writable: No
+              BSD Name: disk1s1
+              Capacity: 1,03 GB (1 034 455 040 bytes)
+              Media Type: DVD-ROM
+              Writable: No
+              BSD Name: disk1s2
+            Mac OS X Install DVD:
+              Capacity: 6,74 GB (6 737 006 592 bytes)
+              Available: 84,9 MB (84 946 944 bytes)
+              Media Type: DVD-ROM
+              Writable: No
+              File System: HFS+
+              BSD Name: disk1s3
+              Mount Point: /Volumes/Mac OS X Install DVD
+
diff --git a/resources/macos/system_profiler/10.6-intel-SPSerialATADataType b/resources/macos/system_profiler/10.6-intel-SPSerialATADataType
new file mode 100644
index 0000000..f8b58bf
--- /dev/null
+++ b/resources/macos/system_profiler/10.6-intel-SPSerialATADataType
@@ -0,0 +1,36 @@
+Serial-ATA:
+
+    Intel ICH7-M AHCI:
+
+      Vendor: Intel
+      Product: ICH7-M AHCI
+      Link Speed: 1.5 Gigabit
+      Negotiated Link Speed: 1.5 Gigabit
+      Description: AHCI Version 1.10 Supported
+
+        FUJITSU MHY2120BH:
+
+          Capacity: 120,03 GB (120 034 123 776 bytes)
+          Model: FUJITSU MHY2120BH                       
+          Revision: 0081000D
+          Serial Number:         K439T822NS6V
+          Native Command Queuing: Yes
+          Queue Depth: 32
+          Removable Media: No
+          Detachable Drive: No
+          BSD Name: disk0
+          Medium Type: Rotational
+          Partition Map Type: GPT (GUID Partition Table)
+          S.M.A.R.T. status: Verified
+          Volumes:
+              Capacity: 209,7 MB (209 715 200 bytes)
+              Writable: Yes
+              BSD Name: disk0s1
+            Macintosh HD:
+              Capacity: 119,69 GB (119 690 149 888 bytes)
+              Available: 94,9 GB (94 897 831 936 bytes)
+              Writable: Yes
+              File System: Journaled HFS+
+              BSD Name: disk0s2
+              Mount Point: /
+
diff --git a/resources/macos/system_profiler/10.6-intel-SPUSBDataType b/resources/macos/system_profiler/10.6-intel-SPUSBDataType
new file mode 100644
index 0000000..41e21a7
--- /dev/null
+++ b/resources/macos/system_profiler/10.6-intel-SPUSBDataType
@@ -0,0 +1,91 @@
+USB:
+
+    USB High-Speed Bus:
+
+      Host Controller Location: Built-in USB
+      Host Controller Driver: AppleUSBEHCI
+      PCI Device ID: 0x27cc 
+      PCI Revision ID: 0x0002 
+      PCI Vendor ID: 0x8086 
+      Bus Number: 0xfd 
+
+        Built-in iSight:
+
+          Product ID: 0x8501
+          Vendor ID: 0x05ac  (Apple Inc.)
+          Version:  1.89
+          Speed: Up to 480 Mb/sec
+          Manufacturer: Micron
+          Location ID: 0xfd400000 / 2
+          Current Available (mA): 500
+          Current Required (mA): 100
+
+    USB Bus:
+
+      Host Controller Location: Built-in USB
+      Host Controller Driver: AppleUSBUHCI
+      PCI Device ID: 0x27cb 
+      PCI Revision ID: 0x0002 
+      PCI Vendor ID: 0x8086 
+      Bus Number: 0x7d 
+
+        Bluetooth USB Host Controller:
+
+          Product ID: 0x8205
+          Vendor ID: 0x05ac  (Apple Inc.)
+          Version: 19.65
+          Speed: Up to 12 Mb/sec
+          Manufacturer: Apple Inc.
+          Location ID: 0x7d100000 / 2
+          Current Available (mA): 500
+          Current Required (mA): 0
+
+    USB Bus:
+
+      Host Controller Location: Built-in USB
+      Host Controller Driver: AppleUSBUHCI
+      PCI Device ID: 0x27c9 
+      PCI Revision ID: 0x0002 
+      PCI Vendor ID: 0x8086 
+      Bus Number: 0x3d 
+
+    USB Bus:
+
+      Host Controller Location: Built-in USB
+      Host Controller Driver: AppleUSBUHCI
+      PCI Device ID: 0x27c8 
+      PCI Revision ID: 0x0002 
+      PCI Vendor ID: 0x8086 
+      Bus Number: 0x1d 
+
+        Apple Internal Keyboard / Trackpad:
+
+          Product ID: 0x021b
+          Vendor ID: 0x05ac  (Apple Inc.)
+          Version:  0.18
+          Speed: Up to 12 Mb/sec
+          Manufacturer: Apple Computer
+          Location ID: 0x1d200000 / 2
+          Current Available (mA): 500
+          Current Required (mA): 40
+
+    USB Bus:
+
+      Host Controller Location: Built-in USB
+      Host Controller Driver: AppleUSBUHCI
+      PCI Device ID: 0x27ca 
+      PCI Revision ID: 0x0002 
+      PCI Vendor ID: 0x8086 
+      Bus Number: 0x5d 
+
+        IR Receiver:
+
+          Product ID: 0x8240
+          Vendor ID: 0x05ac  (Apple Inc.)
+          Version:  1.10
+          Speed: Up to 12 Mb/sec
+          Manufacturer: Apple Computer, Inc.
+          Location ID: 0x5d200000 / 2
+          Current Available (mA): 500
+          Current Required (mA): 100
+


================================================================
  Commit: 70a26c1caf112a3cf40b6930501bad6a450843ce
      https://github.com/fusinv/fusioninventory-agent/commit/70a26c1caf112a3cf40b6930501bad6a450843ce
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-02-25 (Sat, 25 Feb 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/AIX/LVM.pm

  Log Message:
  -----------
  use explicit iterators


There was an error trying to read the diff from github.com (execution expired)

================================================================
  Commit: df1ff1f26411869265a7ed1ef2ce5c5e44981394
      https://github.com/fusinv/fusioninventory-agent/commit/df1ff1f26411869265a7ed1ef2ce5c5e44981394
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-02-25 (Sat, 25 Feb 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/AIX/LVM.pm

  Log Message:
  -----------
  better function names


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/AIX/LVM.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/AIX/LVM.pm
index 4812051..e715576 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/AIX/LVM.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/AIX/LVM.pm
@@ -16,21 +16,21 @@ sub doInventory {
 
     my $inventory = $params{inventory};
 
-    foreach my $volume (_parsePvs()) {
+    foreach my $volume (_getPhysicalVolumes()) {
         $inventory->addEntry(section => 'PHYSICAL_VOLUMES', entry => $volume);
     }
 
-    foreach my $volume (_parseLvs()) {
+    foreach my $volume (_getLogicalVolumes()) {
         $inventory->addEntry(section => 'LOGICAL_VOLUMES', entry => $volume);
     }
 
-    foreach my $group (_parseVgs()) {
+    foreach my $group (_getVolumeGroups()) {
         $inventory->addEntry(section => 'VOLUME_GROUPS', entry => $group);
     }
 
 }
 
-sub _parseLvs {
+sub _getLogicalVolumes {
 
     my @vs_elem;
     my $vg;
@@ -87,7 +87,7 @@ sub _parseLvs {
     return $entries;
 }
 
-sub _parsePvs {
+sub _getPhysicalVolumes {
 
     my @vs_elem;
     my $vg;
@@ -141,7 +141,7 @@ sub _parsePvs {
     return $entries;
 }
 
-sub _parseVgs {
+sub _getVolumeGroups {
 
     my $entries = [];
     my @vs_elem;


================================================================
  Commit: 568217a778e9ba4448f965cb30ddb5262c78d677
      https://github.com/fusinv/fusioninventory-agent/commit/568217a778e9ba4448f965cb30ddb5262c78d677
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-02-25 (Sat, 25 Feb 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/AIX/LVM.pm

  Log Message:
  -----------
  sanity rewrite:

- use getFileHandle() instead of backticks
- process command ouput line by line rather than in list context
- split parsing in two functions for each entry category
- use explicit iterators


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/AIX/LVM.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/AIX/LVM.pm
index e715576..780c1a7 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/AIX/LVM.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/AIX/LVM.pm
@@ -15,187 +15,207 @@ sub doInventory {
     my (%params) = @_;
 
     my $inventory = $params{inventory};
+    my $logger    = $params{logger};
 
-    foreach my $volume (_getPhysicalVolumes()) {
+    foreach my $volume (_getPhysicalVolumes($logger)) {
         $inventory->addEntry(section => 'PHYSICAL_VOLUMES', entry => $volume);
     }
 
-    foreach my $volume (_getLogicalVolumes()) {
+    foreach my $volume (_getLogicalVolumes($logger)) {
         $inventory->addEntry(section => 'LOGICAL_VOLUMES', entry => $volume);
     }
 
-    foreach my $group (_getVolumeGroups()) {
+    foreach my $group (_getVolumeGroups($logger)) {
         $inventory->addEntry(section => 'VOLUME_GROUPS', entry => $group);
     }
 
 }
 
 sub _getLogicalVolumes {
+    my ($logger) = @_;
 
-    my @vs_elem;
-    my $vg;
-    my $ppsize;
-    my $status;
-    my $nblv;
-    my $typelv;
-    my $lvname;
-    my $entries = [];
-
-    foreach (`lsvg`) {
-        chomp;
-        foreach (`lsvg -l $_`) {
-            chomp;
-            if (/(\S+):.*/) {
-                $vg = $1;
-            }
-            if ( ( !/^LV NAME.*/ )
-                && /(\S+) *(\S+) *(\d+) *(\d+) *(\d+) *(\S+) *(\S+)/ )
-            {
-                $vs_elem[0] = $vg . "/" . $1;
-                $typelv     = $2;
-                $vs_elem[6] = 0;
-                $vs_elem[5] = $3;
-                $status     = "Type " . $2 . " ,PV: " . $5;
-                $lvname     = $1;
-                foreach (`lslv $1`) {
-                    if (/.*PP SIZE:\s+(\d+) .*/) {
-                        $ppsize = $1;
-                    }
-                    if (/LV IDENTIFIER:      (\S+)/) {
-                        $vs_elem[7] = $1;
-                    }
-                }
-#                print(  $lvname. " "
-#                      . $vg . " "
-#                      . $status . " "
-#                      . $vs_elem[5] . " "
-#                      . $vs_elem[7] . " "
-#                      . $vs_elem[5]
-#                      . "\n" );
-                push @$entries,
-                  {
-                    LV_NAME   => $lvname,
-                    VG_UUID   => $vg,
-                    ATTR      => $status,
-                    SIZE      => int( $vs_elem[5] * $ppsize || 0 ),
-                    LV_UUID   => $vs_elem[7],
-                    SEG_COUNT => $vs_elem[5],
-                  };
-            }
+    my $handle = getFileHandle(
+        command => "lsvg",
+        logger  => $logger
+    );
+    return unless $handle;
+
+    my @volumes;
+
+    foreach my $line (<$handle>) {
+        chomp $line;
+        push @volumes, _getLogicalVolume($logger, $line);
+    }
+    close $handle;
+
+    return @volumes;
+}
+
+sub _getLogicalVolume {
+    my ($logger, $name) = @_;
+
+    my $handle = getFileHandle(
+        command => "lsvg -l $name",
+        logger  => $logger
+    );
+    return unless $handle;
+
+    my $volume;
+
+    foreach my $line (<$handle>) {
+        chomp $line;
+
+        if ($line =~ /(\S+):.*/) {
+            $volume->{VG_UUID} = $1;
+        }
+        if ($line !~ !/^LV NAME.*/ && $line =~ /(\S+) *(\S+) *(\d+) *(\d+) *(\d+) *(\S+) *(\S+)/) {
+            $volume->{LV_NAME}   = $1;
+            $volume->{SEG_COUNT} = $3;
+            $volume->{ATTR}      = "Type $2,PV: $5";
         }
     }
-    return $entries;
+    close $handle;
+
+    my $size;
+    foreach (`lslv $volume->{LV_NAME}`) {
+        if (/.*PP SIZE:\s+(\d+) .*/) {
+            $size = $1;
+        }
+        if (/LV IDENTIFIER:      (\S+)/) {
+            $volume->{LV_UUID} = $1;
+        }
+    }
+
+    $volume->{SIZE} = int($volume->{SEG_COUNT} * $size);
+
+    return $volume;
 }
 
 sub _getPhysicalVolumes {
+    my ($logger) = @_;
+
+    my $handle = getFileHandle(
+        command => "lspv | cut -f1 -d' '",
+        logger  => $logger
+    );
+    return unless $handle;
 
-    my @vs_elem;
-    my $vg;
-    my $ppsize;
-    my $status;
-    my $nblv;
-    my $typelv;
-
-    my $entries = [];
-    my $pvname  = "";
-
-    foreach (`lspv | cut -f1 -d' '`) {
-        chomp;
-        $pvname = $_;
-        foreach (`lspv $_`) {
-            chomp;
-            if (/PHYSICAL VOLUME:    (\S+)/) {
-                $vs_elem[0] = $1;
-            }
-            if (/FREE PPs:           (\d+) .*/) {
-                $vs_elem[5] = $1;
-            }
-            if (/TOTAL PPs:          (\d+) .*/) {
-                $vs_elem[4] = $1;
-            }
-            if (/VOLUME GROUP:     (\S+)/) {
-                $vg = $1;
-            }
-            if (/PP SIZE:            (\d+) .*/) {
-                $ppsize = $1;
-            }
-            if (/PV IDENTIFIER:      (\S+)/) {
-                $vs_elem[6] = $1;
-            }
-        }
-        push @$entries,
-          {
-            DEVICE      => "/dev/" . $pvname,
-            PV_NAME     => $pvname,
-            FORMAT      => "AIX PV " . $vs_elem[0],
-            ATTR        => "VG " . $vg,
-            SIZE        => $vs_elem[4] * $ppsize,
-            FREE        => $vs_elem[5] * $ppsize,
-            PV_UUID     => $vs_elem[6],
-            PV_PE_COUNT => $vs_elem[4],
-            PE_SIZE     => $ppsize,
-          }
+    my @volumes;
 
+    foreach my $line (<$handle>) {
+        chomp $line;
+        push @volumes, _getPhysicalVolume($logger, $line);
     }
+    close $handle;
 
-    return $entries;
+    return @volumes;
+}
+
+sub _getPhysicalVolume {
+    my ($logger, $name) = @_;
+
+    my $handle = getFileHandle(
+        command => "lspv $name",
+        logger  => $logger
+    );
+    return unless $handle;
+
+    my $volume = {
+        DEVICE  => "/dev/$name",
+        PV_NAME => $name,
+    };
+
+    my ($free, $total);
+    foreach my $line (<$handle>) {
+        chomp $line;
+
+        if ($line =~ /PHYSICAL VOLUME:    (\S+)/) {
+            $volume->{FORMAT} = "AIX PV $1";
+        }
+        if ($line =~ /FREE PPs:           (\d+) .*/) {
+            $free = $1;
+        }
+        if ($line =~ /TOTAL PPs:          (\d+) .*/) {
+            $total = $1;
+        }
+        if ($line =~ /VOLUME GROUP:     (\S+)/) {
+            $volume->{ATTR} = "VG $1";
+        }
+        if ($line =~ /PP SIZE:            (\d+) .*/) {
+            $volume->{PE_SIZE} = $1;
+        }
+        if ($line =~ /PV IDENTIFIER:      (\S+)/) {
+            $volume->{PV_UUID} = $1;
+        }
+    }
+    close $handle;
+
+    $volume->{SIZE} = $total * $volume->{PE_SIZE};
+    $volume->{FREE} = $free * $volume->{PE_SIZE};
+    $volume->{PV_PE_COUNT} = $total;
+
+    return $volume;
 }
 
 sub _getVolumeGroups {
+    my ($logger) = @_;
+
+    my $handle = getFileHandle(
+        command => 'lsvg',
+        logger  => $logger
+    );
+    return unless $handle;
+
+    my @groups;
+
+    foreach my $line (<$handle>) {
+        chomp $line;
+        push @groups, _getVolumeGroup($logger, $line);
+    }
+    close $handle;
 
-    my $entries = [];
-    my @vs_elem;
-    my $vg;
-    my $ppsize;
-    my $status;
-    my $nblv;
-    my $typelv;
-    my $nbpv;
-
-    foreach (`lsvg`) {
-        chomp;
-        $vg = $_;
-        foreach (`lsvg $_`) {
-            chomp;
-            if (/VOLUME GROUP:       (\S+) .* /) {
-                $vs_elem[0] = $1;
-            }
-            if (/TOTAL PPs:      (\d+) .*/) {
-                $vs_elem[5] = $1;
-            }
-            if (/FREE PPs:       (\d+) .*/) {
-                $vs_elem[6] = $1;
-            }
-            if (/VG IDENTIFIER:  (\S+)/) {
-                $vs_elem[7] = $1;
-            }
-            if (/PP SIZE:        (\d+) .*/) {
-                $ppsize = $1;
-            }
-            if (/LVs:                (\d+) .*/) {
-                $nblv = $1;
-            }
-            if (/ACTIVE PVs:\s+(\d+) .*/) {
-                $nbpv = $1;
-            }
-
-        }
-
-        push @$entries,
-          {
-            VG_NAME        => $vg,
-            PV_COUNT       => $nbpv,
-            LV_COUNT       => $nblv,
-            ATTR           => "",
-            SIZE           => $vs_elem[5],
-            FREE           => $vs_elem[6],
-            VG_UUID        => $vs_elem[7],
-            VG_EXTENT_SIZE => $ppsize,
-          };
+    return @groups;
+}
+
+sub _getVolumeGroup {
+    my ($logger, $name) = @_;
+
+    my $handle = getFileHandle(
+        command => "lsvg $name",
+        logger  => $logger
+    );
+    return unless $handle;
+
+    my $group = {
+        VG_NAME => $name
+    };
+
+    foreach my $line (<$handle>) {
+        chomp $line;
+
+        if ($line =~ /TOTAL PPs:      (\d+) .*/) {
+            $group->{SIZE} = $1;
+        }
+        if ($line =~ /FREE PPs:       (\d+) .*/) {
+            $group->{FREE} = $1;
+        }
+        if ($line =~ /VG IDENTIFIER:  (\S+)/) {
+            $group->{VG_UUID} = $1;
+        }
+        if ($line =~ /PP SIZE:        (\d+) .*/) {
+            $group->{VG_EXTENT_SIZE} = $1;
+        }
+        if ($line =~ /LVs:                (\d+) .*/) {
+            $group->{LV_COUNT} = $1;
+        }
+        if ($line =~/ACTIVE PVs:\s+(\d+) .*/) {
+            $group->{PV_COUNT} = $1;
+        }
 
     }
+    close $handle;
 
-    return $entries;
+    return $group;
 }
 
 1;


================================================================
  Commit: 0b05a82c823e9f78558d88645ff4753455e69560
      https://github.com/fusinv/fusioninventory-agent/commit/0b05a82c823e9f78558d88645ff4753455e69560
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-02-25 (Sat, 25 Feb 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Linux/LVM.pm

  Log Message:
  -----------
  use consistent variable names


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/LVM.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/LVM.pm
index 390fb4e..997617d 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/LVM.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/LVM.pm
@@ -44,15 +44,16 @@ sub _getLogicalVolumes {
     return unless $handle;
 
     my @volumes;
-    foreach (<$handle>) {
-        my @line = split(/\s+/, $_);
+    while (my $line = <$handle>) {
+        my @infos = split(/\s+/, $line);
+
         push @volumes, {
-            LV_NAME => $line[1],
-            VG_UUID => $line[2],
-            ATTR => $line[3],
-            SIZE => int($line[4]||0),
-            LV_UUID => $line[5],
-            SEG_COUNT => $line[6],
+            LV_NAME   => $infos[1],
+            VG_UUID   => $infos[2],
+            ATTR      => $infos[3],
+            SIZE      => int($infos[4]||0),
+            LV_UUID   => $infos[5],
+            SEG_COUNT => $infos[6],
         }
 
     }


================================================================
  Commit: e8052db2eed0af855afcce3638ff909582da0030
      https://github.com/fusinv/fusioninventory-agent/commit/e8052db2eed0af855afcce3638ff909582da0030
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-02-25 (Sat, 25 Feb 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/AIX/LVM.pm

  Log Message:
  -----------
  sanitize regexps

- drop useless matching of anything
- consistent spacing definition


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/AIX/LVM.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/AIX/LVM.pm
index 780c1a7..51b4f78 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/AIX/LVM.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/AIX/LVM.pm
@@ -65,10 +65,10 @@ sub _getLogicalVolume {
     foreach my $line (<$handle>) {
         chomp $line;
 
-        if ($line =~ /(\S+):.*/) {
+        if ($line =~ /(\S+):/) {
             $volume->{VG_UUID} = $1;
         }
-        if ($line !~ !/^LV NAME.*/ && $line =~ /(\S+) *(\S+) *(\d+) *(\d+) *(\d+) *(\S+) *(\S+)/) {
+        if ($line !~ !/^LV NAME/ && $line =~ /(\S+) *(\S+) *(\d+) *(\d+) *(\d+) *(\S+) *(\S+)/) {
             $volume->{LV_NAME}   = $1;
             $volume->{SEG_COUNT} = $3;
             $volume->{ATTR}      = "Type $2,PV: $5";
@@ -81,7 +81,7 @@ sub _getLogicalVolume {
         if (/.*PP SIZE:\s+(\d+) .*/) {
             $size = $1;
         }
-        if (/LV IDENTIFIER:      (\S+)/) {
+        if (/LV IDENTIFIER:\s+(\S+)/) {
             $volume->{LV_UUID} = $1;
         }
     }
@@ -129,22 +129,22 @@ sub _getPhysicalVolume {
     foreach my $line (<$handle>) {
         chomp $line;
 
-        if ($line =~ /PHYSICAL VOLUME:    (\S+)/) {
+        if ($line =~ /PHYSICAL VOLUME:\s+(\S+)/) {
             $volume->{FORMAT} = "AIX PV $1";
         }
-        if ($line =~ /FREE PPs:           (\d+) .*/) {
+        if ($line =~ /FREE PPs:\s+(\d+)/) {
             $free = $1;
         }
-        if ($line =~ /TOTAL PPs:          (\d+) .*/) {
+        if ($line =~ /TOTAL PPs:\s+(\d+)/) {
             $total = $1;
         }
-        if ($line =~ /VOLUME GROUP:     (\S+)/) {
+        if ($line =~ /VOLUME GROUP:\s+(\S+)/) {
             $volume->{ATTR} = "VG $1";
         }
-        if ($line =~ /PP SIZE:            (\d+) .*/) {
+        if ($line =~ /PP SIZE:\s+(\d+)/) {
             $volume->{PE_SIZE} = $1;
         }
-        if ($line =~ /PV IDENTIFIER:      (\S+)/) {
+        if ($line =~ /PV IDENTIFIER:\s+(\S+)/) {
             $volume->{PV_UUID} = $1;
         }
     }
@@ -193,22 +193,22 @@ sub _getVolumeGroup {
     foreach my $line (<$handle>) {
         chomp $line;
 
-        if ($line =~ /TOTAL PPs:      (\d+) .*/) {
+        if ($line =~ /TOTAL PPs:\s+(\d+)/) {
             $group->{SIZE} = $1;
         }
-        if ($line =~ /FREE PPs:       (\d+) .*/) {
+        if ($line =~ /FREE PPs:\s+(\d+)/) {
             $group->{FREE} = $1;
         }
-        if ($line =~ /VG IDENTIFIER:  (\S+)/) {
+        if ($line =~ /VG IDENTIFIER:\s+(\S+)/) {
             $group->{VG_UUID} = $1;
         }
-        if ($line =~ /PP SIZE:        (\d+) .*/) {
+        if ($line =~ /PP SIZE:\s+(\d+)/) {
             $group->{VG_EXTENT_SIZE} = $1;
         }
-        if ($line =~ /LVs:                (\d+) .*/) {
+        if ($line =~ /LVs:\s+(\d+)/) {
             $group->{LV_COUNT} = $1;
         }
-        if ($line =~/ACTIVE PVs:\s+(\d+) .*/) {
+        if ($line =~/ACTIVE PVs:\s+(\d+)/) {
             $group->{PV_COUNT} = $1;
         }
 


================================================================
  Commit: c0975af90b492a8864486a2d25da4f1ef8492ea5
      https://github.com/fusinv/fusioninventory-agent/commit/c0975af90b492a8864486a2d25da4f1ef8492ea5
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-02-25 (Sat, 25 Feb 2012)

  Changed paths:
    M lib/FusionInventory/Agent/HTTP/Server.pm
    M lib/FusionInventory/Agent/Target/Server.pm
    M lib/FusionInventory/Agent/Task/Inventory.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/Alpha.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/MIPS.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/SPARC.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Memory.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Dmidecode/Bios.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Storages/HP.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/HPUX.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/HPUX/Memory.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Linux.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Archs/ARM.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Archs/SPARC.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Archs/i386.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/MacOS.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Hostname.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Videos.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Bios.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Memory.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Slots.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/SolarisZones.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/Xen.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/AntiVirus.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/CPU.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Controllers.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Drives.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Inputs.pm
    M lib/FusionInventory/Agent/XML/Query.pm

  Log Message:
  -----------
  drop unused variables


diff --git a/lib/FusionInventory/Agent/HTTP/Server.pm b/lib/FusionInventory/Agent/HTTP/Server.pm
index 9ce4400..001033e 100644
--- a/lib/FusionInventory/Agent/HTTP/Server.pm
+++ b/lib/FusionInventory/Agent/HTTP/Server.pm
@@ -256,7 +256,6 @@ sub _is_authenticated {
 sub _listen {
     my ($self) = @_;
 
-    my $scheduler = $self->{scheduler};
     my $logger = $self->{logger};
 
     my $daemon = HTTP::Daemon->new(
diff --git a/lib/FusionInventory/Agent/Target/Server.pm b/lib/FusionInventory/Agent/Target/Server.pm
index 64af009..0ffa6a4 100644
--- a/lib/FusionInventory/Agent/Target/Server.pm
+++ b/lib/FusionInventory/Agent/Target/Server.pm
@@ -28,8 +28,6 @@ sub new {
         vardir => $params{basevardir} . '/' . $subdir
     );
 
-    my $logger = $self->{logger};
-
     return $self;
 }
 
diff --git a/lib/FusionInventory/Agent/Task/Inventory.pm b/lib/FusionInventory/Agent/Task/Inventory.pm
index 948e730..eee2a67 100644
--- a/lib/FusionInventory/Agent/Task/Inventory.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory.pm
@@ -123,7 +123,6 @@ sub _initModulesList {
 
     my $logger = $self->{logger};
     my $config = $self->{config};
-    my $storage = $self->{storage};
 
     my @modules = __PACKAGE__->getModules('Input');
     die "no inventory module found" if !@modules;
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/Alpha.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/Alpha.pm
index 54fd354..b9d5d21 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/Alpha.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/Alpha.pm
@@ -15,7 +15,6 @@ sub doInventory {
     my (%params) = @_;
 
     my $inventory = $params{inventory};
-    my $logger    = $params{logger};
 
     # sysctl infos
 
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/MIPS.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/MIPS.pm
index 17f00f4..e79dbd0 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/MIPS.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/MIPS.pm
@@ -15,7 +15,6 @@ sub doInventory {
     my (%params) = @_;
 
     my $inventory = $params{inventory};
-    my $logger    = $params{logger};
 
     # sysctl infos
 
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/SPARC.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/SPARC.pm
index 12bf81c..9cb1786 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/SPARC.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/SPARC.pm
@@ -15,7 +15,6 @@ sub doInventory {
     my (%params) = @_;
 
     my $inventory = $params{inventory};
-    my $logger    = $params{logger};
 
     # sysctl infos
 
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Memory.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Memory.pm
index 72f36d1..d79b3cf 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Memory.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Memory.pm
@@ -15,7 +15,6 @@ sub doInventory {
     my (%params) = @_;
 
     my $inventory = $params{inventory};
-    my $logger    = $params{logger};
 
     # Swap
     my $swapSize;
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Dmidecode/Bios.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Dmidecode/Bios.pm
index 830db3e..01ee764 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Dmidecode/Bios.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Dmidecode/Bios.pm
@@ -29,7 +29,6 @@ sub _getBiosHardware {
     my $system_info  = $infos->{1}->[0];
     my $base_info    = $infos->{2}->[0];
     my $chassis_info = $infos->{3}->[0];
-    my $cpu_info     = $infos->{4}->[0];
 
     my $bios = {
         BMANUFACTURER => $bios_info->{'Vendor'},
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Storages/HP.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Storages/HP.pm
index 7587cd4..ce1818f 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Storages/HP.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Storages/HP.pm
@@ -16,7 +16,6 @@ use FusionInventory::Agent::Tools;
 # HP Array Configuration Utility CLI 7.85-18.0
 
 sub _getHpacuacliFromWinRegistry {
-    my ($logger) = @_;
 
     my $Registry;
     Win32::TieRegistry->require();
@@ -56,7 +55,7 @@ sub doInventory {
     my $inventory = $params{inventory};
     my $logger    = $params{logger};
 
-    my ($pd, $serialnumber, $model, $capacity, $firmware, $description, $media, $manufacturer);
+    my ($serialnumber, $model, $capacity, $firmware, $description, $media, $manufacturer);
 
     my $hpacuacliPath = canRun('hpacucli') ?
         "hpacucli":
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/HPUX.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/HPUX.pm
index bdf3f3c..5978c80 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/HPUX.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/HPUX.pm
@@ -17,7 +17,6 @@ sub doInventory {
     my (%params) = @_;
 
     my $inventory = $params{inventory};
-    my $logger    = $params{logger};
 
     # Operating system informations
     my $OSVersion = getFirstLine(command => 'uname -v');
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/HPUX/Memory.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/HPUX/Memory.pm
index c80e75c..ff2f94c 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/HPUX/Memory.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/HPUX/Memory.pm
@@ -106,7 +106,6 @@ sub _parseCstm {
 
     my %capacities;
     my $capacity = 0;
-    my $caption; 
     my $description;
     my $numslot = 1;
     my $subnumslot;
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux.pm
index fd19bff..32a772b 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux.pm
@@ -43,7 +43,6 @@ sub _getRHNSystemId {
     return unless -f $file;
     my $tpp = XML::TreePP->new();
     my $h = $tpp->parsefile($file);
-    my $v;
     eval {
         foreach (@{$h->{params}{param}{value}{struct}{member}}) {
             next unless $_->{name} eq 'system_id';
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Archs/ARM.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Archs/ARM.pm
index ff2f1dc..46a1ee3 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Archs/ARM.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Archs/ARM.pm
@@ -30,11 +30,9 @@ sub doInventory {
 }
 
 sub _getCPUsFromProc {
-    my ($logger, $file) = @_;
-
     my @cpus;
-    foreach my $cpu (getCPUsFromProc(@_)) {
 
+    foreach my $cpu (getCPUsFromProc(@_)) {
         push @cpus, {
             ARCH => 'ARM',
             TYPE => $cpu->{processor}
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Archs/SPARC.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Archs/SPARC.pm
index 71f7b52..e0eef88 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Archs/SPARC.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Archs/SPARC.pm
@@ -32,8 +32,6 @@ sub doInventory {
 }
 
 sub _getCPUsFromProc {
-    my ($logger, $file) = @_;
-
     my $cpu = (getCPUsFromProc(@_))[0];
 
     return unless $cpu && $cpu->{'ncpus probed'};
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Archs/i386.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Archs/i386.pm
index a6affc8..f9f84b9 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Archs/i386.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Archs/i386.pm
@@ -70,7 +70,7 @@ sub doInventory {
 sub _getCPUsFromProc {
     my @cpus = getCPUsFromProc(@_);
 
-    my ($procs, $cpuNbr, $cores, $threads);
+    my ($procs, $cpuNbr);
 
     my @cpuList;
 
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS.pm
index b30ff81..36d28a7 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS.pm
@@ -15,7 +15,6 @@ sub doInventory {
     my (%params) = @_;
 
     my $inventory = $params{inventory};
-    my $logger    = $params{logger};
 
     my ($OSName, $OSVersion);
 
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Hostname.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Hostname.pm
index 94ee02e..3900953 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Hostname.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Hostname.pm
@@ -15,7 +15,6 @@ sub doInventory {
     my (%params) = @_;
 
     my $inventory = $params{inventory};
-    my $logger    = $params{logger};
 
     my $prof = Mac::SysProfile->new();
     my $info = $prof->gettype('SPSoftwareDataType');
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Videos.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Videos.pm
index d2b4604..af65086 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Videos.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Videos.pm
@@ -36,7 +36,6 @@ sub _getDisplays {
     foreach my $videoName (keys %{$infos->{'Graphics/Displays'}}) {
         my $videoCardInfo = $infos->{'Graphics/Displays'}{$videoName};
 
-        my $displays = {};
         foreach my $displayName (keys %{$videoCardInfo->{Displays}}) {
             next if $displayName eq 'Display Connector';
             next if $displayName eq 'Display';
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Bios.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Bios.pm
index 680cb0d..08de6b0 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Bios.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Bios.pm
@@ -133,7 +133,7 @@ sub _parsePrtconf {
     );
     return unless $handle;
 
-    my ($infos, $name, $OBPstring);
+    my $infos;
     while (my $line = <$handle>) {
         next unless $line =~ /^ \s* ([^:]+) : \s* ' (.+) '$/x;
         next if $infos->{$1};
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Memory.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Memory.pm
index 2110677..82fd6ae 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Memory.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Memory.pm
@@ -132,7 +132,6 @@ sub _getMemories2 {
     my $flag_mt = 0;
 
     my $capacity;
-    my $description;
     my $caption;
     my $speed;
     my $type;
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Slots.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Slots.pm
index 91a3aa0..efeee64 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Slots.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Slots.pm
@@ -71,7 +71,6 @@ sub _getSlots5 {
     my $name;
     my $description;
     my $designation;
-    my $status;
 
     while (<$handle>) {
         last if /^\=+/ && $flag_pci && $flag;
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/SolarisZones.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/SolarisZones.pm
index cafaa8c..2909a3e 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/SolarisZones.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/SolarisZones.pm
@@ -22,8 +22,8 @@ sub doInventory {
         getAllLines(command => '/usr/sbin/zoneadm list -p', logger => $logger);
 
     foreach my $zone (@zones) {
-        my ($zoneid, $zonename, $zonestatus, $pathroot , $uuid) = split(/:/, $zone);
-        # 
+        my ($zoneid, $zonename, $zonestatus, undef, $uuid) = split(/:/, $zone);
+         
         # Memory considerations depends on rcapd or project definitions
         # Little hack, I go directly in /etc/zones reading mcap physcap for each zone.
         my $zonefile = "/etc/zones/$zonename.xml";
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/Xen.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/Xen.pm
index 424be3b..60c5ba1 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/Xen.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/Xen.pm
@@ -53,7 +53,7 @@ sub  _getVirtualMachines {
     my @machines;
     while (my $line = <$handle>) {
         chomp $line;
-        my ($name, $vmid, $memory, $vcpu, $status, $time) = split(' ', $line);
+        my ($name, $vmid, $memory, $vcpu, $status) = split(' ', $line);
         next if $name eq 'Domain-0';
         next if $vmid == 0;
 
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/AntiVirus.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/AntiVirus.pm
index ebcdbeb..558e157 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/AntiVirus.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/AntiVirus.pm
@@ -15,7 +15,6 @@ sub doInventory {
     my (%params) = @_;
 
     my $inventory = $params{inventory};
-    my $logger    = $params{logger};
 
     # Doesn't works on Win2003 Server
     # On Win7, we need to use SecurityCenter2
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/CPU.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/CPU.pm
index a086573..8f1d49c 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/CPU.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/CPU.pm
@@ -28,15 +28,11 @@ sub doInventory {
     my $inventory = $params{inventory};
     my $logger    = $params{logger};
 
-    my $serial;
-    my $id;
-    my $speed;
-
     my @dmidecodeCpu = getCpusFromDmidecode();
 
     my $vmsystem;
-
     my $cpuId = 0;
+
     foreach my $object (getWmiObjects(
         class      => 'Win32_Processor',
         properties => [ qw/NumberOfCores ProcessorId MaxClockSpeed/ ]
@@ -60,7 +56,6 @@ sub doInventory {
         my $speed = $dmidecodeCpu[$cpuId]->{SPEED} || $object->{MaxClockSpeed};
         my $serial = $dmidecodeCpu[$cpuId]->{SERIAL};
 
-
         # Some information are missing on Win2000
         if (!$name) {
             $name = $ENV{PROCESSOR_IDENTIFIER};
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Controllers.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Controllers.pm
index 30fe815..c7da8e6 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Controllers.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Controllers.pm
@@ -13,7 +13,6 @@ sub doInventory {
     my (%params) = @_;
 
     my $inventory = $params{inventory};
-    my $logger    = $params{logger};
     my %seen;
 
     foreach my $class (qw/
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Drives.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Drives.pm
index baab2a4..433232a 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Drives.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Drives.pm
@@ -23,7 +23,6 @@ sub doInventory {
     my (%params) = @_;
 
     my $inventory = $params{inventory};
-    my $logger    = $params{logger};
 
     my $systemDrive;
     foreach my $object (getWmiObjects(
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Inputs.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Inputs.pm
index 6d025f8..01c0c1d 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Inputs.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Inputs.pm
@@ -29,7 +29,6 @@ sub isEnabled {
 sub doInventory {
     my (%params) = @_;
 
-    my $logger    = $params{logger};
     my $inventory = $params{inventory};
 
     foreach my $object (getWmiObjects(
diff --git a/lib/FusionInventory/Agent/XML/Query.pm b/lib/FusionInventory/Agent/XML/Query.pm
index 1c1e42d..0768f2e 100644
--- a/lib/FusionInventory/Agent/XML/Query.pm
+++ b/lib/FusionInventory/Agent/XML/Query.pm
@@ -21,7 +21,7 @@ sub new {
 }
 
 sub getContent {
-    my ($self, $args) = @_;
+    my ($self) = @_;
 
     my $tpp = XML::TreePP->new(indent => 2);
     return $tpp->write({ REQUEST => $self->{h} });


================================================================
  Commit: cb25bc667eb3648ae1ec6ad42d8265226c64c66a
      https://github.com/fusinv/fusioninventory-agent/commit/cb25bc667eb3648ae1ec6ad42d8265226c64c66a
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-02-25 (Sat, 25 Feb 2012)

  Changed paths:
    M t/05var.t

  Log Message:
  -----------
  ignore variable , often used as loop counter


diff --git a/t/05var.t b/t/05var.t
index 15bd4bf..6671b6e 100644
--- a/t/05var.t
+++ b/t/05var.t
@@ -23,5 +23,5 @@ if ($EVAL_ERROR) {
     plan(skip_all => 'Test::Vars required to validate the code');
 }
 
-Test::Vars::all_vars_ok();
+Test::Vars::all_vars_ok(ignore_vars => { '$i' => 1 });
 


================================================================
  Commit: 796cef8bcfcd7bea2a8be50347ab9547bc4b57ce
      https://github.com/fusinv/fusioninventory-agent/commit/796cef8bcfcd7bea2a8be50347ab9547bc4b57ce
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-02-25 (Sat, 25 Feb 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm

  Log Message:
  -----------
  minor cleanup


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm
index 58a1046..ef34674 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm
@@ -27,7 +27,6 @@ sub doInventory {
     my (%params) = @_;
 
     my $inventory = $params{inventory};
-    my $logger    = $params{logger};
 
     if (is64bit()) {
 
@@ -49,9 +48,9 @@ sub doInventory {
             _addSoftware(inventory => $inventory, entry => $software);
         }
         _processMSIE(
-            machKey => $machKey64,
+            machKey   => $machKey64,
             inventory => $inventory,
-            is64bit => 1
+            is64bit   => 1
         );
 
         my $machKey32 = $Registry->Open('LMachine', {
@@ -68,9 +67,9 @@ sub doInventory {
             _addSoftware(inventory => $inventory, entry => $software);
         }
         _processMSIE(
-            machKey => $machKey32,
+            machKey   => $machKey32,
             inventory => $inventory,
-            is64bit => 0
+            is64bit   => 0
         );
 
 
@@ -89,9 +88,9 @@ sub doInventory {
             _addSoftware(inventory => $inventory, entry => $software);
         }
         _processMSIE(
-            machKey => $machKey,
+            machKey   => $machKey,
             inventory => $inventory,
-            is64bit => 0
+            is64bit   => 0
         );
     }
 }
@@ -117,7 +116,6 @@ sub _getSoftwares {
     my (%params) = @_;
 
     my $softwares = $params{softwares};
-    my $is64bit   = $params{is64bit};
 
     my @softwares;
 
@@ -144,7 +142,7 @@ sub _getSoftwares {
             VERSION_MINOR    => hex2dec($data->{'/MinorVersion'}),
             VERSION_MAJOR    => hex2dec($data->{'/MajorVersion'}),
             NO_REMOVE        => hex2dec($data->{'/NoRemove'}),
-            IS64BIT          => $is64bit,
+            IS64BIT          => $params{is64bit},
             GUID             => $guid,
         };
 
@@ -169,29 +167,24 @@ sub _addSoftware {
 }
 
 sub _processMSIE {
-    my %params = @_;
-
-    my $inventory = $params{inventory};
-    my $is64bit = $params{is64bit} || 0;
-    my $machKey = $params{machKey};
+    my (%params) = @_;
 
-    my $name = "Internet Explorer";
-    if ($is64bit) {
-        $name .= " (64bit)";
-    }
-    my $version = $params{machKey}->{"SOFTWARE/Microsoft/Internet Explorer/Version"};
+    my $name = $params{is64bit} ?
+        "Internet Explorer (64bit)" : "Internet Explorer";
+    my $version = 
+        $params{machKey}->{"SOFTWARE/Microsoft/Internet Explorer/Version"};
 
     _addSoftware(
         inventory => $params{inventory},
-        entry => {
-            FROM => "registry",
-            IS64BIT => $is64bit,
-            NAME => $name,
-            VERSION => $version,
-        PUBLISHER => "Microsoft Corporation"
-    });
+        entry     => {
+            FROM      => "registry",
+            IS64BIT   => $params{is64bit},
+            NAME      => $name,
+            VERSION   => $version,
+            PUBLISHER => "Microsoft Corporation"
+        }
+    );
 
 }
 
-
 1;


================================================================
  Commit: 70f5fea101b57c1ed59c66eb02fb23e5b14518de
      https://github.com/fusinv/fusioninventory-agent/commit/70f5fea101b57c1ed59c66eb02fb23e5b14518de
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-02-25 (Sat, 25 Feb 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/MacOS.pm

  Log Message:
  -----------
  better comments


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS.pm
index 36d28a7..d95aa38 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS.pm
@@ -18,8 +18,8 @@ sub doInventory {
 
     my ($OSName, $OSVersion);
 
-    # if we can load the system profiler, gather the information from that
     if (canLoad("Mac::SysProfile")) {
+        # use system profiler if available
         my $prof = Mac::SysProfile->new();
         my $info = $prof->gettype('SPSoftwareDataType');
         return unless ref $info eq 'HASH';
@@ -36,8 +36,7 @@ sub doInventory {
         }
 
     } else {
-        # we can't load the system profiler, use the basic BSD stype information
-        # Operating system informations
+        # fallback on basic BSD type information otherwise
         $OSName = getFirstLine(command => 'uname -s');
         $OSVersion = getFirstLine(command => 'uname -r');
     }


================================================================
  Commit: ab344314d5e290e8b4b3aa89ae45c313a33ab2c1
      https://github.com/fusinv/fusioninventory-agent/commit/ab344314d5e290e8b4b3aa89ae45c313a33ab2c1
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-02-25 (Sat, 25 Feb 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Videos.pm

  Log Message:
  -----------
  cosmetics


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Videos.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Videos.pm
index af65086..b0e74ad 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Videos.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Videos.pm
@@ -34,12 +34,12 @@ sub _getDisplays {
     my $videos = [];
 
     foreach my $videoName (keys %{$infos->{'Graphics/Displays'}}) {
-        my $videoCardInfo = $infos->{'Graphics/Displays'}{$videoName};
+        my $videoCardInfo = $infos->{'Graphics/Displays'}->{$videoName};
 
         foreach my $displayName (keys %{$videoCardInfo->{Displays}}) {
             next if $displayName eq 'Display Connector';
             next if $displayName eq 'Display';
-            my $displayInfo = $videoCardInfo->{Displays}{$displayName};
+            my $displayInfo = $videoCardInfo->{Displays}->{$displayName};
 
             my $resolution = $displayInfo->{Resolution};
             if ($resolution) {


================================================================
  Commit: 7cab4be7dbb417a8054f0f05cd32e17d98dcc640
      https://github.com/fusinv/fusioninventory-agent/commit/7cab4be7dbb417a8054f0f05cd32e17d98dcc640
  Author: Guillaume Rousse <Guillaume.Rousse at inria.fr>
  Date:   2012-02-25 (Sat, 25 Feb 2012)

  Changed paths:
    A resources/macos/system_profiler/10.6-intel-SPFireWireDataType
    A resources/macos/system_profiler/10.6-intel-SPParallelATADataType
    A resources/macos/system_profiler/10.6-intel-SPSerialATADataType
    A resources/macos/system_profiler/10.6-intel-SPUSBDataType

  Log Message:
  -----------
  initial import


diff --git a/resources/macos/system_profiler/10.6-intel-SPFireWireDataType b/resources/macos/system_profiler/10.6-intel-SPFireWireDataType
new file mode 100644
index 0000000..4a6629d
--- /dev/null
+++ b/resources/macos/system_profiler/10.6-intel-SPFireWireDataType
@@ -0,0 +1,6 @@
+FireWire:
+
+    FireWire Bus:
+
+      Maximum Speed: Up to 400 Mb/sec
+
diff --git a/resources/macos/system_profiler/10.6-intel-SPParallelATADataType b/resources/macos/system_profiler/10.6-intel-SPParallelATADataType
new file mode 100644
index 0000000..0999d1c
--- /dev/null
+++ b/resources/macos/system_profiler/10.6-intel-SPParallelATADataType
@@ -0,0 +1,38 @@
+ATA:
+
+    ATA Bus:
+
+        HL-DT-ST DVDRW  GSA-S10N:
+
+          Capacity: 7,77 GB (7 771 521 024 bytes)
+          Model: HL-DT-ST DVDRW  GSA-S10N                
+          Revision: BP08    
+          Serial Number: K0076RM5813         
+          Removable Media: Yes
+          Detachable Drive: No
+          BSD Name: disk1
+          Protocol: ATAPI
+          Unit Number: 0
+          Socket Type: Internal
+          Low Power Polling: Yes
+          Power Off: Yes
+          Partition Map Type: APM (Apple Partition Map)
+          S.M.A.R.T. status: Not Supported
+          Volumes:
+              Capacity: 31 KB (30 720 bytes)
+              Media Type: DVD-ROM
+              Writable: No
+              BSD Name: disk1s1
+              Capacity: 1,03 GB (1 034 455 040 bytes)
+              Media Type: DVD-ROM
+              Writable: No
+              BSD Name: disk1s2
+            Mac OS X Install DVD:
+              Capacity: 6,74 GB (6 737 006 592 bytes)
+              Available: 84,9 MB (84 946 944 bytes)
+              Media Type: DVD-ROM
+              Writable: No
+              File System: HFS+
+              BSD Name: disk1s3
+              Mount Point: /Volumes/Mac OS X Install DVD
+
diff --git a/resources/macos/system_profiler/10.6-intel-SPSerialATADataType b/resources/macos/system_profiler/10.6-intel-SPSerialATADataType
new file mode 100644
index 0000000..f8b58bf
--- /dev/null
+++ b/resources/macos/system_profiler/10.6-intel-SPSerialATADataType
@@ -0,0 +1,36 @@
+Serial-ATA:
+
+    Intel ICH7-M AHCI:
+
+      Vendor: Intel
+      Product: ICH7-M AHCI
+      Link Speed: 1.5 Gigabit
+      Negotiated Link Speed: 1.5 Gigabit
+      Description: AHCI Version 1.10 Supported
+
+        FUJITSU MHY2120BH:
+
+          Capacity: 120,03 GB (120 034 123 776 bytes)
+          Model: FUJITSU MHY2120BH                       
+          Revision: 0081000D
+          Serial Number:         K439T822NS6V
+          Native Command Queuing: Yes
+          Queue Depth: 32
+          Removable Media: No
+          Detachable Drive: No
+          BSD Name: disk0
+          Medium Type: Rotational
+          Partition Map Type: GPT (GUID Partition Table)
+          S.M.A.R.T. status: Verified
+          Volumes:
+              Capacity: 209,7 MB (209 715 200 bytes)
+              Writable: Yes
+              BSD Name: disk0s1
+            Macintosh HD:
+              Capacity: 119,69 GB (119 690 149 888 bytes)
+              Available: 94,9 GB (94 897 831 936 bytes)
+              Writable: Yes
+              File System: Journaled HFS+
+              BSD Name: disk0s2
+              Mount Point: /
+
diff --git a/resources/macos/system_profiler/10.6-intel-SPUSBDataType b/resources/macos/system_profiler/10.6-intel-SPUSBDataType
new file mode 100644
index 0000000..41e21a7
--- /dev/null
+++ b/resources/macos/system_profiler/10.6-intel-SPUSBDataType
@@ -0,0 +1,91 @@
+USB:
+
+    USB High-Speed Bus:
+
+      Host Controller Location: Built-in USB
+      Host Controller Driver: AppleUSBEHCI
+      PCI Device ID: 0x27cc 
+      PCI Revision ID: 0x0002 
+      PCI Vendor ID: 0x8086 
+      Bus Number: 0xfd 
+
+        Built-in iSight:
+
+          Product ID: 0x8501
+          Vendor ID: 0x05ac  (Apple Inc.)
+          Version:  1.89
+          Speed: Up to 480 Mb/sec
+          Manufacturer: Micron
+          Location ID: 0xfd400000 / 2
+          Current Available (mA): 500
+          Current Required (mA): 100
+
+    USB Bus:
+
+      Host Controller Location: Built-in USB
+      Host Controller Driver: AppleUSBUHCI
+      PCI Device ID: 0x27cb 
+      PCI Revision ID: 0x0002 
+      PCI Vendor ID: 0x8086 
+      Bus Number: 0x7d 
+
+        Bluetooth USB Host Controller:
+
+          Product ID: 0x8205
+          Vendor ID: 0x05ac  (Apple Inc.)
+          Version: 19.65
+          Speed: Up to 12 Mb/sec
+          Manufacturer: Apple Inc.
+          Location ID: 0x7d100000 / 2
+          Current Available (mA): 500
+          Current Required (mA): 0
+
+    USB Bus:
+
+      Host Controller Location: Built-in USB
+      Host Controller Driver: AppleUSBUHCI
+      PCI Device ID: 0x27c9 
+      PCI Revision ID: 0x0002 
+      PCI Vendor ID: 0x8086 
+      Bus Number: 0x3d 
+
+    USB Bus:
+
+      Host Controller Location: Built-in USB
+      Host Controller Driver: AppleUSBUHCI
+      PCI Device ID: 0x27c8 
+      PCI Revision ID: 0x0002 
+      PCI Vendor ID: 0x8086 
+      Bus Number: 0x1d 
+
+        Apple Internal Keyboard / Trackpad:
+
+          Product ID: 0x021b
+          Vendor ID: 0x05ac  (Apple Inc.)
+          Version:  0.18
+          Speed: Up to 12 Mb/sec
+          Manufacturer: Apple Computer
+          Location ID: 0x1d200000 / 2
+          Current Available (mA): 500
+          Current Required (mA): 40
+
+    USB Bus:
+
+      Host Controller Location: Built-in USB
+      Host Controller Driver: AppleUSBUHCI
+      PCI Device ID: 0x27ca 
+      PCI Revision ID: 0x0002 
+      PCI Vendor ID: 0x8086 
+      Bus Number: 0x5d 
+
+        IR Receiver:
+
+          Product ID: 0x8240
+          Vendor ID: 0x05ac  (Apple Inc.)
+          Version:  1.10
+          Speed: Up to 12 Mb/sec
+          Manufacturer: Apple Computer, Inc.
+          Location ID: 0x5d200000 / 2
+          Current Available (mA): 500
+          Current Required (mA): 100
+


================================================================
  Commit: 2fba292fa60e9c8dff98e5d5d80d7810521d533e
      https://github.com/fusinv/fusioninventory-agent/commit/2fba292fa60e9c8dff98e5d5d80d7810521d533e
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-02-25 (Sat, 25 Feb 2012)

  Changed paths:
    R t/inventory/macos/video.t
    A t/inventory/macos/videos.t

  Log Message:
  -----------
  rename for consistency with tested code


diff --git a/t/inventory/macos/video.t b/t/inventory/macos/video.t
deleted file mode 100755
index 3f5d3f7..0000000
--- a/t/inventory/macos/video.t
+++ /dev/null
@@ -1,88 +0,0 @@
-#!/usr/bin/perl
-
-use strict;
-use warnings;
-
-use Test::More;
-
-use FusionInventory::Agent::Task::Inventory::Input::MacOS::Videos;
-
-my %tests = (
-    '10.4-powerpc' => {
-        MONITORS => [
-            {
-                DESCRIPTION  => 'ASUS VH222',
-                CAPTION      => 'ASUS VH222'
-            }
-        ],
-        VIDEOS => [
-            {
-                NAME       => 'NVIDIA GeForce 6600',
-                RESOLUTION => '1360x768',
-                CHIPSET    => 'GeForce 6600',
-                MEMORY     => '256',
-                PCISLOT    => 'SLOT-1'
-            }
-        ]
-    },
-    '10.5-powerpc' => 
-        {
-        MONITORS => [
-            {
-                DESCRIPTION  => 'ASUS VH222',
-                CAPTION      => 'ASUS VH222'
-            }
-        ],
-        VIDEOS => [
-            {
-                NAME       => 'NVIDIA GeForce 6600',
-                RESOLUTION => '1680x1050',
-                CHIPSET    => 'GeForce 6600',
-                MEMORY     => '256',
-                PCISLOT    => 'SLOT-1'
-            }
-        ]
-    },
-    '10.6-intel' => {
-        MONITORS => [
-            {
-                DESCRIPTION  => 'iMac',
-                CAPTION      => 'iMac'
-            }
-        ],
-        VIDEOS => [
-            {
-                NAME       => 'ATI Radeon HD 2600 Pro',
-                RESOLUTION => '1920x1200',
-                CHIPSET    => 'ATI,RadeonHD2600',
-                MEMORY     => '256',
-                PCISLOT    => undef
-            }
-        ]
-    },
-    '10.6.6-intel' => {
-        MONITORS => [
-            {
-                DESCRIPTION  => 'Color LCD',
-                CAPTION      => 'Color LCD'
-            }
-        ],
-        VIDEOS => [
-            {
-                NAME       => 'Intel GMA 950',
-                RESOLUTION => '1280x800',
-                CHIPSET    => 'GMA 950',
-                MEMORY     => '64',
-                PCISLOT    => undef
-            }
-        ]
-    }
-);
-
-plan tests => scalar keys %tests;
-
-foreach my $test (keys %tests) {
-    my $file = "resources/macos/system_profiler/$test";
-    my %displays = FusionInventory::Agent::Task::Inventory::Input::MacOS::Videos::_getDisplays(file => $file);
-    is_deeply(\%displays, $tests{$test}, $test);
-}
diff --git a/t/inventory/macos/videos.t b/t/inventory/macos/videos.t
new file mode 100755
index 0000000..3f5d3f7
--- /dev/null
+++ b/t/inventory/macos/videos.t
@@ -0,0 +1,88 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+use Test::More;
+
+use FusionInventory::Agent::Task::Inventory::Input::MacOS::Videos;
+
+my %tests = (
+    '10.4-powerpc' => {
+        MONITORS => [
+            {
+                DESCRIPTION  => 'ASUS VH222',
+                CAPTION      => 'ASUS VH222'
+            }
+        ],
+        VIDEOS => [
+            {
+                NAME       => 'NVIDIA GeForce 6600',
+                RESOLUTION => '1360x768',
+                CHIPSET    => 'GeForce 6600',
+                MEMORY     => '256',
+                PCISLOT    => 'SLOT-1'
+            }
+        ]
+    },
+    '10.5-powerpc' => 
+        {
+        MONITORS => [
+            {
+                DESCRIPTION  => 'ASUS VH222',
+                CAPTION      => 'ASUS VH222'
+            }
+        ],
+        VIDEOS => [
+            {
+                NAME       => 'NVIDIA GeForce 6600',
+                RESOLUTION => '1680x1050',
+                CHIPSET    => 'GeForce 6600',
+                MEMORY     => '256',
+                PCISLOT    => 'SLOT-1'
+            }
+        ]
+    },
+    '10.6-intel' => {
+        MONITORS => [
+            {
+                DESCRIPTION  => 'iMac',
+                CAPTION      => 'iMac'
+            }
+        ],
+        VIDEOS => [
+            {
+                NAME       => 'ATI Radeon HD 2600 Pro',
+                RESOLUTION => '1920x1200',
+                CHIPSET    => 'ATI,RadeonHD2600',
+                MEMORY     => '256',
+                PCISLOT    => undef
+            }
+        ]
+    },
+    '10.6.6-intel' => {
+        MONITORS => [
+            {
+                DESCRIPTION  => 'Color LCD',
+                CAPTION      => 'Color LCD'
+            }
+        ],
+        VIDEOS => [
+            {
+                NAME       => 'Intel GMA 950',
+                RESOLUTION => '1280x800',
+                CHIPSET    => 'GMA 950',
+                MEMORY     => '64',
+                PCISLOT    => undef
+            }
+        ]
+    }
+);
+
+plan tests => scalar keys %tests;
+
+foreach my $test (keys %tests) {
+    my $file = "resources/macos/system_profiler/$test";
+    my %displays = FusionInventory::Agent::Task::Inventory::Input::MacOS::Videos::_getDisplays(file => $file);
+    is_deeply(\%displays, $tests{$test}, $test);
+}


================================================================
  Commit: 132d67bc9782851d66e0895b6b9bb207df63672d
      https://github.com/fusinv/fusioninventory-agent/commit/132d67bc9782851d66e0895b6b9bb207df63672d
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-02-25 (Sat, 25 Feb 2012)

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

  Log Message:
  -----------
  fix parsing

- check if value is defined, not just true
- check current indentation against current node before adding value


diff --git a/lib/FusionInventory/Agent/Tools/MacOS.pm b/lib/FusionInventory/Agent/Tools/MacOS.pm
index 321f906..5c41d76 100644
--- a/lib/FusionInventory/Agent/Tools/MacOS.pm
+++ b/lib/FusionInventory/Agent/Tools/MacOS.pm
@@ -32,14 +32,32 @@ sub getSystemProfilerInfos {
         my $level = defined $1 ? length($1) : 0;
         my $key = $2;
         my $value = $3;
+        
+        my $parent = $parents[-1];
+        my $parent_level = $parent->[1];
+        my $parent_node  = $parent->[0];
+
+        if (defined $value) {
+            # check indentation level against parent node
+            if ($level <= $parent_level) {
+
+                if (keys %$parent_node == 0) {
+                    # discard just created node, and fix its parent
+                    my $parent_key = $parent->[2];
+                    $parents[-2]->[0]->{$parent_key} = undef;
+                }
 
-        if ($value) {
-            # just add the value to the current parent
-            $parents[-1]->[0]->{$key} = $value;
+                # unstack nodes until a suitable parent is found
+                while ($level <= $parents[-1]->[1]) {
+                    pop @parents;
+                }
+                $parent_node = $parents[-1]->[0];
+            }
+
+            # add the value to the current node
+            $parent_node->{$key} = $value;
         } else {
             # compare level with parent
-            my $parent_level = $parents[-1]->[1];
-
             if ($level > $parent_level) {
                 # down the tree: no change
             } elsif ($level < $parent_level) {
@@ -55,7 +73,7 @@ sub getSystemProfilerInfos {
             # create a new node, and push it to the stack
             my $parent_node = $parents[-1]->[0];
             $parent_node->{$key} = {};
-            push (@parents, [ $parent_node->{$key}, $level ]);
+            push (@parents, [ $parent_node->{$key}, $level, $key ]);
         }
     }
     close $handle;


================================================================
  Commit: e6275a5b881aa08f3168e17c75baa5b8382cd035
      https://github.com/fusinv/fusioninventory-agent/commit/e6275a5b881aa08f3168e17c75baa5b8382cd035
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-02-25 (Sat, 25 Feb 2012)

  Changed paths:
    M t/tools/macos.t

  Log Message:
  -----------
  fix expected results


diff --git a/t/tools/macos.t b/t/tools/macos.t
index 01df645..34aefd5 100755
--- a/t/tools/macos.t
+++ b/t/tools/macos.t
@@ -18,9 +18,8 @@ my %system_profiler_tests = (
                 'BSD Device Name' => 'en1',
                 'Ethernet' => {
                     'MAC Address' => '00:14:51:61:ef:09',
-                    'Media Options' => {
-                        'Media Subtype' => 'autoselect'
-                    }
+                    'Media Options' => undef,
+                    'Media Subtype' => 'autoselect'
                 },
                 'Hardware' => 'Ethernet',
                 'Type' => 'Ethernet',
@@ -29,10 +28,9 @@ my %system_profiler_tests = (
                 },
                 'Proxies' => {
                     'Proxy Configuration Method' => 'Manual',
-                    'ExcludeSimpleHostnames' => {
-                        'Auto Discovery Enabled' => 'No',
-                        'FTP Passive Mode' => 'Yes'
-                    }
+                    'ExcludeSimpleHostnames' => 0,
+                    'Auto Discovery Enabled' => 'No',
+                    'FTP Passive Mode' => 'Yes'
                 }
             },
             'Modem interne' => {
@@ -48,10 +46,9 @@ my %system_profiler_tests = (
                 'Hardware' => 'Modem',
                 'Proxies' => {
                     'Proxy Configuration Method' => 'Manual',
-                    'ExcludeSimpleHostnames' => {
-                        'Auto Discovery Enabled' => 'No',
-                        'FTP Passive Mode' => 'Yes'
-                    }
+                    'ExcludeSimpleHostnames' => 0,
+                    'Auto Discovery Enabled' => 'No',
+                    'FTP Passive Mode' => 'Yes'
                 }
             },
             'Ethernet intégré' => {
@@ -74,12 +71,11 @@ my %system_profiler_tests = (
                 'IPv4 Addresses' => '10.0.1.110',
                 'DHCP Server Responses' => {
                     'Domain Name' => 'lan',
-                    'Lease Duration (seconds)' => {
-                        'Routers' => '10.0.1.1',
-                        'Subnet Mask' => '255.255.255.0',
-                        'Server Identifier' => '10.0.1.1',
-                        'DHCP Message Type' => '0x05'
-                    },
+                    'Lease Duration (seconds)' => 0,
+                    'Routers' => '10.0.1.1',
+                    'Subnet Mask' => '255.255.255.0',
+                    'Server Identifier' => '10.0.1.1',
+                    'DHCP Message Type' => '0x05',
                     'Domain Name Servers' => '10.0.1.1'
                 },
                 'IPv4' => {
@@ -112,10 +108,9 @@ my %system_profiler_tests = (
                 'Hardware' => 'Modem',
                 'Proxies' => {
                     'Proxy Configuration Method' => 'Manual',
-                    'ExcludeSimpleHostnames' => {
-                        'Auto Discovery Enabled' => 'No',
-                        'FTP Passive Mode' => 'Yes'
-                    }
+                    'ExcludeSimpleHostnames' => 0,
+                    'Auto Discovery Enabled' => 'No',
+                    'FTP Passive Mode' => 'Yes'
                 }
             },
             'FireWire intégré' => {
@@ -136,10 +131,9 @@ my %system_profiler_tests = (
                 },
                 'Proxies' => {
                     'Proxy Configuration Method' => 'Manual',
-                    'ExcludeSimpleHostnames' => {
-                        'Auto Discovery Enabled' => 'No',
-                        'FTP Passive Mode' => 'Yes'
-                    }
+                    'ExcludeSimpleHostnames' => 0,
+                    'Auto Discovery Enabled' => 'No',
+                    'FTP Passive Mode' => 'Yes'
                 }
             }
         },
@@ -159,11 +153,10 @@ my %system_profiler_tests = (
                             'Configuration Method' => 'DHCP'
                         },
                         'Proxies' => {
-                            'Auto Discovery Enabled' => {},
+                            'Auto Discovery Enabled' => 0,
                             'Proxy Configuration Method' => '2',
-                            'ExcludeSimpleHostnames' => {
-                                'FTP Passive Mode' => '1'
-                            }
+                            'ExcludeSimpleHostnames' => 0,
+                            'FTP Passive Mode' => '1'
                         },
                         'Hardware (MAC) Address' => '00:14:51:61:ef:09'
                     },
@@ -176,36 +169,32 @@ my %system_profiler_tests = (
                             'Configuration Method' => 'PPP'
                         },
                         'Proxies' => {
-                            'Auto Discovery Enabled' => {},
+                            'Auto Discovery Enabled' => 0,
                             'Proxy Configuration Method' => '2',
-                            'ExcludeSimpleHostnames' => {
-                                'FTP Passive Mode' => '1'
-                            }
+                            'ExcludeSimpleHostnames' => 0,
+                            'FTP Passive Mode' => '1'
                         },
                         'PPP' => {
-                            'ACSP Enabled' => {},
-                            'Idle Reminder' => {
-                                'IPCP Compression VJ' => '1',
-                                'LCP Echo Interval' => '10',
-                                'LCP Echo Enabled' => '1',
-                                'Log File' => '/var/log/ppp.log',
-                                'Idle Reminder Time' => '1800',
-                                'LCP Echo Failure' => '4'
-                            },
-                            'Verbose Logging' => {},
-                            'Dial On Demand' => {
-                                'Disconnect On Logout' => '1',
-                                'Disconnect On Idle Timer' => '600',
-                                'Disconnect On Idle' => '1',
-                                'Disconnect On Fast User Switch' => '1',
-                                'Disconnect On Sleep' => '1'
-                            },
-                            'Display Terminal Window' => {
-                               'Redial Enabled' => '1',
-                               'Redial Count' => '1',
-                               'Redial Interval' => '5'
-                             },
-                            'Use Terminal Script' => {}
+                            'ACSP Enabled' => 0,
+                            'Idle Reminder' => 0,
+                            'IPCP Compression VJ' => '1',
+                            'LCP Echo Interval' => '10',
+                            'LCP Echo Enabled' => '1',
+                            'Log File' => '/var/log/ppp.log',
+                            'Idle Reminder Time' => '1800',
+                            'LCP Echo Failure' => '4',
+                            'Verbose Logging' => 0,
+                            'Dial On Demand' => 0,
+                            'Disconnect On Logout' => '1',
+                            'Disconnect On Idle Timer' => '600',
+                            'Disconnect On Idle' => '1',
+                            'Disconnect On Fast User Switch' => '1',
+                            'Disconnect On Sleep' => '1',
+                            'Display Terminal Window' => 0,
+                            'Redial Enabled' => '1',
+                            'Redial Count' => '1',
+                            'Redial Interval' => '5',
+                            'Use Terminal Script' => 0,
                         }
                     },
                     'Ethernet intégré' => {
@@ -221,14 +210,13 @@ my %system_profiler_tests = (
                             'Configuration Method' => 'DHCP'
                         },
                         'Proxies' => {
-                            'SOCKS Proxy Enabled' => {},
-                            'HTTPS Proxy Enabled' => {},
-                            'FTP Proxy Enabled' => {
-                                'FTP Passive Mode' => '1'
-                            },
-                            'Gopher Proxy Enabled' => {},
-                            'HTTP Proxy Enabled' => {},
-                            'RTSP Proxy Enabled' => {}
+                            'SOCKS Proxy Enabled' => 0,
+                            'HTTPS Proxy Enabled' => 0,
+                            'FTP Proxy Enabled' => 0,
+                            'FTP Passive Mode' => '1',
+                            'Gopher Proxy Enabled' => 0,
+                            'HTTP Proxy Enabled' => 0,
+                            'RTSP Proxy Enabled' => 0,
                         },
                         'Hardware (MAC) Address' => '00:14:51:61:ef:08'
                     },
@@ -241,37 +229,32 @@ my %system_profiler_tests = (
                             'Configuration Method' => 'PPP'
                         },
                         'Proxies' => {
-                            'Auto Discovery Enabled' => {},
+                            'Auto Discovery Enabled' => 0,
                             'Proxy Configuration Method' => '2',
-                            'ExcludeSimpleHostnames' => {
-                                'FTP Passive Mode' => '1'
-                            }
+                            'ExcludeSimpleHostnames' => 0,
+                            'FTP Passive Mode' => '1'
                         },
                         'PPP' => {
-                            'ACSP Enabled' => {},
-                            'Idle Reminder' => {
-                                'IPCP Compression VJ' => '1',
-                                'Idle Reminder Time' => '1800'
-                            },
-                            'Verbose Logging' => {},
-                            'LCP Echo Enabled' => {
+                            'ACSP Enabled' => 0,
+                            'Idle Reminder' => 0,
+                            'IPCP Compression VJ' => '1',
+                            'Idle Reminder Time' => '1800',
+                            'Verbose Logging' => 0,
+                            'LCP Echo Enabled' => 0,
                             'LCP Echo Interval' => '10',
                             'Log File' => '/var/log/ppp.log',
-                            'LCP Echo Failure' => '4'
-                            },
-                            'Dial On Demand' => {
+                            'LCP Echo Failure' => '4',
+                            'Dial On Demand' => 0,
                             'Disconnect On Logout' => '1',
                             'Disconnect On Idle Timer' => '600',
                             'Disconnect On Idle' => '1',
                             'Disconnect On Fast User Switch' => '1',
-                            'Disconnect On Sleep' => '1'
-                        },
-                        'Display Terminal Window' => {
-                           'Redial Enabled' => '1',
-                           'Redial Count' => '1',
-                           'Redial Interval' => '5'
-                         },
-                        'Use Terminal Script' => {}
+                            'Disconnect On Sleep' => '1',
+                            'Display Terminal Window' => 0,
+                            'Redial Enabled' => '1',
+                            'Redial Count' => '1',
+                            'Redial Interval' => '5',
+                            'Use Terminal Script' => 0,
                         }
                     },
                     'FireWire intégré' => {
@@ -287,11 +270,10 @@ my %system_profiler_tests = (
                             'Configuration Method' => 'DHCP'
                         },
                         'Proxies' => {
-                            'Auto Discovery Enabled' => {},
+                            'Auto Discovery Enabled' => 0,
                             'Proxy Configuration Method' => '2',
-                            'ExcludeSimpleHostnames' => {
-                                'FTP Passive Mode' => '1'
-                            }
+                            'ExcludeSimpleHostnames' => 0,
+                            'FTP Passive Mode' => '1'
                         },
                         'Hardware (MAC) Address' => '00:14:51:ff:fe:1a:c8:e2'
                     }
@@ -344,12 +326,11 @@ my %system_profiler_tests = (
                     'Removable Media' => 'No',
                     'BSD Name' => 'disk0',
                     'Protocol' => 'ata',
-                    'Unit Number' => {
-                        'OS9 Drivers' => 'No',
-                        'Socket Type' => 'Serial-ATA',
-                        'S.M.A.R.T. status' => 'Verified',
-                        'Bay Name' => '"A (upper)"'
-                    }
+                    'Unit Number' => 0,
+                    'OS9 Drivers' => 'No',
+                    'Socket Type' => 'Serial-ATA',
+                    'S.M.A.R.T. status' => 'Verified',
+                    'Bay Name' => '"A (upper)"'
                 }
             }
         },
@@ -402,9 +383,8 @@ my %system_profiler_tests = (
                     'Detachable Drive' => 'No',
                     'Serial Number' => 'B6FD7234EC63',
                     'Protocol' => 'ATAPI',
-                    'Unit Number' => {
-                    'Socket Type' => 'Internal'
-                },
+                    'Unit Number' => 0,
+                    'Socket Type' => 'Internal',
                     'Model' => 'HL-DT-ST DVD-RW GWA-4165B'
                 }
             }
@@ -563,17 +543,16 @@ my %system_profiler_tests = (
         'Power' => {
             'System Power Settings' => {
                 'AC Power' => {
-                    'System Sleep Timer (Minutes)' => {
-                        'Reduce Processor Speed' => 'No',
-                        'Dynamic Power Step' => 'Yes',
-                        'Display Sleep Timer (Minutes)' => '10',
-                        'Disk Sleep Timer (Minutes)' => '10',
-                        'Automatic Restart On Power Loss' => 'No',
-                        'Sleep On Power Button' => 'Yes',
-                        'Wake On AC Change' => 'No',
-                        'Wake On Modem Ring' => 'Yes',
-                        'Wake On LAN' => 'Yes'
-                    }
+                    'System Sleep Timer (Minutes)' => 0,
+                    'Reduce Processor Speed' => 'No',
+                    'Dynamic Power Step' => 'Yes',
+                    'Display Sleep Timer (Minutes)' => '10',
+                    'Disk Sleep Timer (Minutes)' => '10',
+                    'Automatic Restart On Power Loss' => 'No',
+                    'Sleep On Power Button' => 'Yes',
+                    'Wake On AC Change' => 'No',
+                    'Wake On Modem Ring' => 'Yes',
+                    'Wake On LAN' => 'Yes'
                 }
             }
         }
@@ -790,11 +769,10 @@ my %system_profiler_tests = (
                     'Detachable Drive' => 'No',
                     'Serial Number' => 'B6FD7234EC63',
                     'Protocol' => 'ATAPI',
-                    'Unit Number' => {
-                        'Low Power Polling' => 'No',
-                        'Socket Type' => 'Internal',
-                        'Power Off' => 'No'
-                    },
+                    'Unit Number' => 0,
+                    'Low Power Polling' => 'No',
+                    'Socket Type' => 'Internal',
+                    'Power Off' => 'No',
                     'Model' => 'HL-DT-ST DVD-RW GWA-4165B'
                 }
             }
@@ -856,18 +834,17 @@ my %system_profiler_tests = (
             },
             'System Power Settings' => {
                 'AC Power' => {
-                    'System Sleep Timer (Minutes)' => {
-                        'Reduce Processor Speed' => 'No',
-                        'Dynamic Power Step' => 'Yes',
-                        'Display Sleep Timer (Minutes)' => '3',
-                        'Disk Sleep Timer (Minutes)' => '10',
-                        'Automatic Restart On Power Loss' => 'No',
-                        'Sleep On Power Button' => 'Yes',
-                        'Wake On AC Change' => 'No',
-                        'Wake On Clamshell Open' => 'Yes',
-                        'Wake On Modem Ring' => 'Yes',
-                        'Wake On LAN' => 'Yes'
-                    }
+                    'System Sleep Timer (Minutes)' => 0,
+                    'Reduce Processor Speed' => 'No',
+                    'Dynamic Power Step' => 'Yes',
+                    'Display Sleep Timer (Minutes)' => '3',
+                    'Disk Sleep Timer (Minutes)' => '10',
+                    'Automatic Restart On Power Loss' => 'No',
+                    'Sleep On Power Button' => 'Yes',
+                    'Wake On AC Change' => 'No',
+                    'Wake On Clamshell Open' => 'Yes',
+                    'Wake On Modem Ring' => 'Yes',
+                    'Wake On LAN' => 'Yes'
                 }
             }
         },
@@ -942,12 +919,11 @@ my %system_profiler_tests = (
                 },
                 'DHCP Server Responses' => {
                     'Domain Name' => 'lan',
-                    'Lease Duration (seconds)' => {
-                        'Routers' => '10.0.1.1',
-                        'Subnet Mask' => '255.255.255.0',
-                        'Server Identifier' => '10.0.1.1',
-                        'DHCP Message Type' => '0x05'
-                    },
+                    'Lease Duration (seconds)' => 0,
+                    'Routers' => '10.0.1.1',
+                    'Subnet Mask' => '255.255.255.0',
+                    'Server Identifier' => '10.0.1.1',
+                    'DHCP Message Type' => '0x05',
                     'Domain Name Servers' => '10.0.1.1'
                 },
                 'Type' => 'Ethernet',
@@ -988,9 +964,8 @@ my %system_profiler_tests = (
                 'BSD Device Name' => 'en1',
                 'Ethernet' => {
                     'MAC Address' => '00:14:51:61:ef:09',
-                    'Media Options' => {
-                        'Media Subtype' => 'Auto Select'
-                    }
+                    'Media Options' => undef,
+                    'Media Subtype' => 'Auto Select'
                 },
                 'Hardware' => 'AirPort',
                 'Type' => 'AirPort',
@@ -1049,13 +1024,12 @@ my %system_profiler_tests = (
                     'Removable Media' => 'No',
                     'BSD Name' => 'disk0',
                     'Protocol' => 'ata',
-                    'Unit Number' => {
-                        'Mac OS 9 Drivers' => 'No',
-                        'Socket Type' => 'Serial-ATA',
-                        'S.M.A.R.T. status' => 'Verified',
-                        'Partition Map Type' => 'APM (Apple Partition Map)',
-                        'Bay Name' => '"B (lower)"'
-                    }
+                    'Unit Number' => 0,
+                    'Mac OS 9 Drivers' => 'No',
+                    'Socket Type' => 'Serial-ATA',
+                    'S.M.A.R.T. status' => 'Verified',
+                    'Partition Map Type' => 'APM (Apple Partition Map)',
+                    'Bay Name' => '"B (lower)"'
                 }
             }
         },
@@ -1361,14 +1335,14 @@ my %system_profiler_tests = (
                         'IEEE80211' => {
                             'Join Mode' => 'Automatic',
                             'Disconnect on Logout' => 'No',
-                            'PowerEnabled' => {},
+                            'PowerEnabled' => 0,
                             'PreferredNetworks' => {
                                 'Unique Network ID' => '905AE8BA-BD26-48F3-9486-AE5BC72FE642',
-                                'RememberRecentNetworks' => '1',
                                 'SecurityType' => 'WPA2 Personal',
                                 'Unique Password ID' => '907EDC44-8C27-44A0-B5F5-2D04E1A5942A',
                                 'SSID_STR' => 'freewa'
                             },
+                            'RememberRecentNetworks' => '1',
                             'JoinModeFallback' => 'Prompt'
                         }
                     }
@@ -1386,7 +1360,7 @@ my %system_profiler_tests = (
                     'Current Available (mA)' => '500',
                     'Speed' => 'Up to 12 Mb/sec',
                     'Product ID' => '0x8206',
-                    'Current Required (mA)' => {},
+                    'Current Required (mA)' => 0,
                     'Manufacturer' => 'Apple Inc.',
                     'Vendor ID' => '0x05ac  (Apple Inc.)'
                 },
@@ -1469,11 +1443,10 @@ my %system_profiler_tests = (
                     'Detachable Drive' => 'No',
                     'Serial Number' => '            fG424F9E',
                     'Protocol' => 'ATAPI',
-                    'Unit Number' => {
-                        'Low Power Polling' => 'Yes',
-                        'Socket Type' => 'Internal',
-                        'Power Off' => 'No'
-                    },
+                    'Unit Number' => 0,
+                    'Low Power Polling' => 'Yes',
+                    'Socket Type' => 'Internal',
+                    'Power Off' => 'No',
                     'Model' => 'MATSHITADVD-R   UJ-875'
                 }
             }
@@ -1530,12 +1503,10 @@ my %system_profiler_tests = (
             'Apple Bluetooth Software Version' => '2.3.3f8',
             'Outgoing Serial Ports' => {
                 'Serial Port 1' => {
-                    'Address' => {
-                        'Name' => 'Bluetooth-Modem'
-                    },
-                    'RFCOMM Channel' => {
-                        'Requires Authentication' => 'No'
-                    }
+                    'Address' => undef,
+                    'Name' => 'Bluetooth-Modem',
+                    'RFCOMM Channel' => 0,
+                    'Requires Authentication' => 'No'
                 }
             },
             'Services' => {
@@ -1624,9 +1595,8 @@ my %system_profiler_tests = (
                 'BSD Device Name' => 'en3',
                 'Ethernet' => {
                     'MAC Address' => '00:1c:42:00:00:09',
-                    'Media Options' => {
-                        'Media Subtype' => 'Auto Select'
-                    }
+                    'Media Options' => undef,
+                    'Media Subtype' => 'Auto Select'
                 },
                 'Hardware' => 'Ethernet',
                 'Type' => 'Ethernet',
@@ -1638,13 +1608,12 @@ my %system_profiler_tests = (
                     'Addresses' => '192.168.1.16'
                 },
                 'Proxies' => {
-                    'Exclude Simple Hostnames' => {
-                        'Auto Discovery Enabled' => 'No',
-                        'FTP Passive Mode' => 'Yes',
-                        'Service Order' => '9'
-                    },
+                    'Exclude Simple Hostnames' => 0,
+                    'Auto Discovery Enabled' => 'No',
+                    'FTP Passive Mode' => 'Yes',
                     'Proxy Configuration Method' => 'Manual'
-                }
+                },
+                'Service Order' => '9',
             },
             'Parallels Shared Networking Adapter' => {
                 'Has IP Assigned' => 'Yes',
@@ -1654,9 +1623,8 @@ my %system_profiler_tests = (
                 'BSD Device Name' => 'en2',
                 'Ethernet' => {
                     'MAC Address' => '00:1c:42:00:00:08',
-                    'Media Options' => {
-                        'Media Subtype' => 'Auto Select'
-                    }
+                    'Media Options' => undef,
+                    'Media Subtype' => 'Auto Select'
                 },
                 'Hardware' => 'Ethernet',
                 'Type' => 'Ethernet',
@@ -1668,13 +1636,12 @@ my %system_profiler_tests = (
                     'Addresses' => '192.168.0.11'
                 },
                 'Proxies' => {
-                    'Exclude Simple Hostnames' => {
-                        'Auto Discovery Enabled' => 'No',
-                        'FTP Passive Mode' => 'Yes',
-                        'Service Order' => '8'
-                    },
+                    'Exclude Simple Hostnames' => 0,
+                    'Auto Discovery Enabled' => 'No',
+                    'FTP Passive Mode' => 'Yes',
                     'Proxy Configuration Method' => 'Manual'
-                }
+                },
+                'Service Order' => '8',
             },
             'FireWire' => {
                 'Has IP Assigned' => 'No',
@@ -1694,9 +1661,9 @@ my %system_profiler_tests = (
                 'Hardware' => 'FireWire',
                 'Proxies' => {
                     'FTP Passive Mode' => 'Yes',
-                    'Service Order' => '2',
                     'Exceptions List' => '*.local, 169.254/16'
-                }
+                },
+                'Service Order' => '2',
             },
             'Ethernet' => {
                 'Has IP Assigned' => 'Yes',
@@ -1718,12 +1685,11 @@ my %system_profiler_tests = (
                 'IPv4 Addresses' => '10.0.1.101',
                 'DHCP Server Responses' => {
                     'Domain Name' => 'lan',
-                    'Lease Duration (seconds)' => {
-                        'Routers' => '10.0.1.1',
-                        'Subnet Mask' => '255.255.255.0',
-                        'Server Identifier' => '10.0.1.1',
-                        'DHCP Message Type' => '0x05'
-                    },
+                    'Lease Duration (seconds)' => 0,
+                    'Routers' => '10.0.1.1',
+                    'Subnet Mask' => '255.255.255.0',
+                    'Server Identifier' => '10.0.1.1',
+                    'DHCP Message Type' => '0x05',
                     'Domain Name Servers' => '10.0.1.1'
                 },
                 'IPv4' => {
@@ -1736,9 +1702,9 @@ my %system_profiler_tests = (
                 },
                 'Proxies' => {
                     'FTP Passive Mode' => 'Yes',
-                    'Service Order' => '1',
                     'Exceptions List' => '*.local, 169.254/16'
-                }
+                },
+                'Service Order' => '1',
             },
             'Bluetooth' => {
                 'Has IP Assigned' => 'No',
@@ -1754,7 +1720,7 @@ my %system_profiler_tests = (
                 'Proxies' => {
                     'FTP Passive Mode' => 'Yes'
                 },
-                'Service Order' => {}
+                'Service Order' => 0,
             },
             'AirPort' => {
                 'Has IP Assigned' => 'No',
@@ -1765,9 +1731,8 @@ my %system_profiler_tests = (
                 'BSD Device Name' => 'en1',
                 'Ethernet' => {
                     'MAC Address' => '00:1e:c2:a7:26:6f',
-                    'Media Options' => {
-                        'Media Subtype' => 'Auto Select'
-                    }
+                    'Media Options' => undef,
+                    'Media Subtype' => 'Auto Select'
                 },
                 'IPv4' => {
                     'Configuration Method' => 'DHCP'
@@ -1778,9 +1743,9 @@ my %system_profiler_tests = (
                     'HTTP Proxy Port' => '80',
                     'FTP Passive Mode' => 'Yes',
                     'HTTP Proxy Enabled' => 'No',
-                    'Service Order' => '3',
                     'Exceptions List' => '*.local, 169.254/16'
-                }
+                },
+                'Service Order' => '3',
             }
         },
         'Ethernet Cards' => {
@@ -1886,16 +1851,16 @@ my %system_profiler_tests = (
                 },
                 'Applications' => {
                     'org.sip-communicator' => 'Allow all connections',
-                    'Firewall Logging' => 'No',
                     'com.skype.skype' => 'Allow all connections',
                     'com.Growl.GrowlHelperApp' => 'Allow all connections',
                     'com.hp.scan.app' => 'Allow all connections',
                     'com.parallels.desktop.dispatcher' => 'Allow all connections',
-                    'Stealth Mode' => 'No',
                     'net.sourceforge.xmeeting.XMeeting' => 'Allow all connections',
                     'com.getdropbox.dropbox' => 'Allow all connections'
                 },
-                'Mode' => 'Limit incoming connections to specific services and applications'
+                'Mode' => 'Limit incoming connections to specific services and applications',
+                'Firewall Logging' => 'No',
+                'Stealth Mode' => 'No',
             }
         },
         'Software' => {
@@ -2124,17 +2089,17 @@ my %system_profiler_tests = (
                         },
                         'Hardware (MAC) Address' => '00:1c:b3:c0:56:85',
                         'IEEE80211' => {
-                            'Join Mode' => 'Automatic',
                             'Disconnect on Logout' => 'Yes',
+                            'Join Mode' => 'Automatic',
+                            'JoinModeFallback' => 'Prompt',
                             'PowerEnabled' => '1',
-                            'RememberRecentNetworks' => {},
-                            'RequireAdmin' => {},
                             'PreferredNetworks' => {
                                 'Unique Network ID' => 'A628B3F5-DB6B-48A6-A3A4-17D33697041B',
                                 'SecurityType' => 'Open',
                                 'SSID_STR' => 'univ-paris1.fr'
                             },
-                            'JoinModeFallback' => 'Prompt'
+                            'RememberRecentNetworks' => 0,
+                            'RequireAdmin' => 0,
                         }
                     }
                 },
@@ -2224,8 +2189,8 @@ my %system_profiler_tests = (
                             'Join Mode' => 'Automatic',
                             'Disconnect on Logout' => 'Yes',
                             'PowerEnabled' => '1',
-                            'RememberRecentNetworks' => {},
-                            'RequireAdmin' => {},
+                            'RememberRecentNetworks' => 0,
+                            'RequireAdmin' => 0,
                             'PreferredNetworks' => {
                                  'Unique Network ID' => '963478B4-1AC3-4B35-A4BB-3510FEA2FEF2',
                                  'SecurityType' => 'WPA2 Enterprise',
@@ -2321,8 +2286,8 @@ my %system_profiler_tests = (
                         'IEEE80211' => {
                             'Join Mode' => 'Automatic',
                             'Disconnect on Logout' => 'Yes',
-                            'PowerEnabled' => {},
-                            'RememberRecentNetworks' => {},
+                            'PowerEnabled' => 0,
+                            'RememberRecentNetworks' => 0,
                             'PreferredNetworks' => {
                                 'Unique Network ID' => '46A33A68-7109-48AD-9255-900F0134903E',
                                 'SecurityType' => 'WPA Personal',
@@ -2379,15 +2344,13 @@ my %system_profiler_tests = (
             'ATA Bus' => {
                 'MATSHITACD-RW  CW-8221' => {
                     'Revision' => 'GA0J',
-                    'Serial Number' => {
-                        'Detachable Drive' => 'No',
-                        'Protocol' => 'ATAPI'
-                    },
-                    'Unit Number' => {
-                        'Low Power Polling' => 'Yes',
-                        'Socket Type' => 'Internal',
-                        'Power Off' => 'Yes'
-                    },
+                    'Serial Number' => undef,
+                    'Detachable Drive' => 'No',
+                    'Protocol' => 'ATAPI',
+                    'Unit Number' => 0,
+                    'Low Power Polling' => 'Yes',
+                    'Socket Type' => 'Internal',
+                    'Power Off' => 'Yes',
                     'Model' => 'MATSHITACD-RW  CW-8221'
                 }
             }
@@ -2431,12 +2394,10 @@ my %system_profiler_tests = (
             'Apple Bluetooth Software Version' => '2.3.8f7',
             'Outgoing Serial Ports' => {
                 'Serial Port 1' => {
-                    'Address' => {
-                        'Name' => 'Bluetooth-Modem'
-                    },
-                    'RFCOMM Channel' => {
-                        'Requires Authentication' => 'No'
-                    }
+                    'Address' => undef,
+                    'Name' => 'Bluetooth-Modem',
+                    'RFCOMM Channel' => 0,
+                    'Requires Authentication' => 'No'
                 }
             },
             'Services' => {
@@ -2479,19 +2440,18 @@ my %system_profiler_tests = (
             },
             'Battery Information' => {
                 'Charge Information' => {
-                    'Full charge capacity (mAh)' => {},
-                    'Charge remaining (mAh)' => {
-                        'Fully charged' => 'No',
-                        'Charging' => 'No'
-                    }
+                    'Full charge capacity (mAh)' => 0,
+                    'Charge remaining (mAh)' => 0,
+                    'Fully charged' => 'No',
+                    'Charging' => 'No'
                 },
                 'Health Information' => {
-                    'Voltage (mV)' => '3908',
-                    'Battery Installed' => 'Yes',
                     'Cycle count' => '5',
                     'Condition' => 'Replace Now',
-                    'Amperage (mA)' => '74'
                 },
+                'Voltage (mV)' => '3908',
+                'Battery Installed' => 'Yes',
+                'Amperage (mA)' => '74',
                 'Model Information' => {
                     'PCB Lot Code' => '0000',
                     'Firmware Version' => '102a',
@@ -2504,16 +2464,15 @@ my %system_profiler_tests = (
             },
             'System Power Settings' => {
                 'AC Power' => {
-                    'System Sleep Timer (Minutes)' => {
-                        'Display Sleep Timer (Minutes)' => '10',
-                        'Disk Sleep Timer (Minutes)' => '10',
-                        'Automatic Restart On Power Loss' => 'No',
-                        'Wake On AC Change' => 'No',
-                        'Current Power Source' => 'Yes',
-                        'Wake On Clamshell Open' => 'Yes',
-                        'Display Sleep Uses Dim' => 'Yes',
-                        'Wake On LAN' => 'Yes'
-                    }
+                    'System Sleep Timer (Minutes)' => 0,
+                    'Display Sleep Timer (Minutes)' => '10',
+                    'Disk Sleep Timer (Minutes)' => '10',
+                    'Automatic Restart On Power Loss' => 'No',
+                    'Wake On AC Change' => 'No',
+                    'Current Power Source' => 'Yes',
+                    'Wake On Clamshell Open' => 'Yes',
+                    'Display Sleep Uses Dim' => 'Yes',
+                    'Wake On LAN' => 'Yes'
                 },
                 'Battery Power' => {
                     'Reduce Brightness' => 'Yes',
@@ -2580,9 +2539,9 @@ my %system_profiler_tests = (
                 'Hardware' => 'FireWire',
                 'Proxies' => {
                     'FTP Passive Mode' => 'Yes',
-                    'Service Order' => '2',
                     'Exceptions List' => '*.local, 169.254/16'
-                }
+                },
+                'Service Order' => '2',
             },
             'Ethernet' => {
                 'Has IP Assigned' => 'Yes',
@@ -2609,12 +2568,11 @@ my %system_profiler_tests = (
                 'IPv4 Addresses' => '172.20.10.171',
                 'DHCP Server Responses' => {
                     'Domain Name' => 'univ-paris1.fr',
-                    'Lease Duration (seconds)' => {
-                        'Routers' => '172.20.10.72',
-                        'Subnet Mask' => '255.255.254.0',
-                        'Server Identifier' => '172.20.0.2',
-                        'DHCP Message Type' => '0x05'
-                    },
+                    'Lease Duration (seconds)' => 0,
+                    'Routers' => '172.20.10.72',
+                    'Subnet Mask' => '255.255.254.0',
+                    'Server Identifier' => '172.20.0.2',
+                    'DHCP Message Type' => '0x05',
                     'Domain Name Servers' => '193.55.96.84,193.55.99.70,194.214.33.181'
                 },
                 'IPv4' => {
@@ -2634,12 +2592,12 @@ my %system_profiler_tests = (
                         'Portability' => '37',
                         'Type' => '50',
                         'Metric' => '503771',
-                        'IPv6 Address' => '2001:0660:3305:0100:021b:63ff:fe36:1ec3',
                         'Marginal Power' => '71',
-                        'Service Order' => '1',
                         'Total Power' => '72'
                     }
-                }
+                },
+                'IPv6 Address' => '2001:0660:3305:0100:021b:63ff:fe36:1ec3',
+                'Service Order' => '1',
             },
             'Bluetooth' => {
                 'Has IP Assigned' => 'No',
@@ -2655,7 +2613,7 @@ my %system_profiler_tests = (
                 'Proxies' => {
                     'FTP Passive Mode' => 'Yes'
                 },
-                'Service Order' => {}
+                'Service Order' => 0,
             },
             'AirPort' => {
                 'Has IP Assigned' => 'No',
@@ -2663,9 +2621,8 @@ my %system_profiler_tests = (
                 'BSD Device Name' => 'en1',
                 'Ethernet' => {
                     'MAC Address' => '00:1c:b3:c0:56:85',
-                    'Media Options' => {
-                        'Media Subtype' => 'Auto Select'
-                    }
+                    'Media Options' => undef,
+                    'Media Subtype' => 'Auto Select'
                 },
                 'IPv4' => {
                     'Configuration Method' => 'DHCP'
@@ -2673,9 +2630,9 @@ my %system_profiler_tests = (
                 'Hardware' => 'AirPort',
                 'Proxies' => {
                     'FTP Passive Mode' => 'Yes',
-                    'Service Order' => '3',
                     'Exceptions List' => '*.local, 169.254/16'
-                }
+                },
+                'Service Order' => '3',
             }
         },
         'Ethernet Cards' => {
@@ -2853,11 +2810,10 @@ my %system_profiler_tests = (
                     'Firmware Version' => 'Atheros 5416: 2.1.14.5',
                     'Locale' => 'ETSI',
                     'Card Type' => 'AirPort Extreme  (0x168C, 0x87)',
-                    'Country Code' => {
-                        'Supported PHY Modes' => '802.11 a/b/g/n',
-                        'Status' => 'Off',
-                        'Supported Channels' => '1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140'
-                    }
+                    'Country Code' => undef,
+                    'Supported PHY Modes' => '802.11 a/b/g/n',
+                    'Status' => 'Off',
+                    'Supported Channels' => '1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140'
                 }
             }
         },
@@ -3047,6 +3003,7 @@ foreach my $test (keys %system_profiler_tests) {
     my $file = "resources/macos/system_profiler/$test";
     my $infos = getSystemProfilerInfos(file => $file);
     is_deeply($infos, $system_profiler_tests{$test}, "$test system profiler parsing");
+    use Data::Dumper;
 }
 
 foreach my $test (keys %ioreg_tests) {


================================================================
  Commit: 9d99310386d83fc7d0c6ca43d12d071ff496be4d
      https://github.com/fusinv/fusioninventory-agent/commit/9d99310386d83fc7d0c6ca43d12d071ff496be4d
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-02-25 (Sat, 25 Feb 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Storages.pm

  Log Message:
  -----------
  rewrite, using system_profiler parser from Tools::MacOs


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Storages.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Storages.pm
index 55fae1a..8d148af 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Storages.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Storages.pm
@@ -4,6 +4,7 @@ use strict;
 use warnings;
 
 use FusionInventory::Agent::Tools;
+use FusionInventory::Agent::Tools::MacOS;
 
 sub isEnabled {
     return 1;
@@ -15,116 +16,99 @@ sub doInventory {
     my $inventory = $params{inventory};
     my $logger    = $params{logger};
 
-    my $devices = {};
-
-    # Get SATA Drives
-    my $sata = _getDiskInfo();
-
-    foreach my $device ( @$sata ) {
-        my $description;
-        if (!$device->{'Protocol'}) {
-            $description = 'Disk drive';
-        } elsif ( ($device->{'Protocol'} eq 'ATAPI')
-                ||
-                ($device->{'Drive Type'}) ) {
-            $description = 'CD-ROM Drive';
-        }
-
-        my $size = $device->{'Capacity'};
-        if ($size) {
-            #e.g: Capacity: 320,07 GB (320 072 933 376 bytes)
-            $size =~ s/\s*\(.*//;
-            $size =~ s/ GB//;
-            $size =~ s/,/./;
-            $size = int($size * 1024);
-        }
-
-        my $manufacturer = getCanonicalManufacturer($device->{'Name'});
-
-        my $model = $device->{'Model'};
-        if ($model) {
-            $model =~ s/\s*$manufacturer\s*//i;
-        }
-
+    foreach my $storage (_getStorages(logger => $logger)) {
         $inventory->addEntry(
             section => 'STORAGES',
-            entry   => {
-                NAME         => $device->{'Name'},
-                SERIAL       => $device->{'Serial Number'},
-                DISKSIZE     => $size,
-                FIRMWARE     => $device->{'Revision'},
-                MANUFACTURER => $manufacturer,
-                DESCRIPTION  => $description,
-                MODEL        => $model,
-                TYPE         => $device->{'Type'}
-            }
+            entry   => $storage
         );
     }
-
-
 }
 
-sub _getDiskInfo {
-    my ($section) = @_;
-
-    my $wasEmpty;
-    my $revIndent = '';
-    my @infos;
-    my $info;
-    my $name;
-    my $type;
-    foreach (`/usr/sbin/system_profiler SPSerialATADataType`,
-        `/usr/sbin/system_profiler SPParallelATADataType`,
-        `/usr/sbin/system_profiler SPUSBDataType`,
-        `/usr/sbin/system_profiler SPFireWireDataType`) {
-        if (/^\s*$/) {
-            $wasEmpty=1;
-            next;
-        }
+sub _getStorages {
+    my $infos = getSystemProfilerInfos(@_);
+
+    # system profiler info is organized as
+    # bus => {
+    #     controller => {
+    #         key1 => value1,
+    #         device => {
+    #             key1 => value1
+    #             subdevice => {
+    #                 key1 => value1,
+    #             }
+    #         }
+    #     }
+    # }
+    my @storages;
+
+    foreach my $bus_name (qw/ATA SERIAL-ATA USB FireWire/) {
+        my $bus = $infos->{$bus_name};
+        next unless $bus;
+        foreach my $controller_name (keys %{$bus}) {
+            my $controller = $bus->{$controller_name};
+            foreach my $device_name (keys %{$controller}) {
+                my $device = $controller->{$device_name};
+                next unless ref $device eq 'HASH';
+                if (_isStorage($device)) {
+                    push @storages,
+                        _getStorage($device, $device_name, $bus_name);
+                } else {
+                    foreach my $subdevice_name (keys %{$device}) {
+                        my $subdevice = $device->{$subdevice_name};
+                        next unless ref $subdevice eq 'HASH';
+                        push @storages,
+                            _getStorage($subdevice, $subdevice_name, $bus_name)
+                            if _isStorage($subdevice);
+                    }
+                }
 
-        next unless /^(\s*)/;
-        if ($1 ne $revIndent) {
-            $name = $1 if (/^\s+(\S+.*\S+):\s*$/ && $wasEmpty);
-            $revIndent = $1;
-
-# We use the Protocol key to know if it a storage section or not
-            if (
-                # disk
-                ($info->{'BSD Name'} && $info->{'BSD Name'} =~ /^disk\d+$/)
-                ||
-                # USB Disk
-#                ($info->{'BSD Name'} && $info->{'Product ID'})
-#                ||
-                # CDROM
-                ($info->{'Protocol'} && $info->{'Socket Type'})
-            ) {
-                $info->{Type} = $type;
-                push @infos, $info;
-                $name = '';
             }
-            $info = {};
-        }
-        if (/^\s+(\S+.*?):\s+(\S.*)/) {
-            $info->{$1}=$2;
-            $info->{Name} = $name;
         }
+    }
 
-        $type = '' if /^(\S+)/;
-        if (/^(\S+):$/) {
-            $type=$1;
-            if ($type eq 'FireWire') {
-                $type = '1394';
-            }
-        }
+    return @storages;
+}
 
+sub _isStorage {
+    my ($device) = @_;
 
-        $wasEmpty=0;
+    return 
+        ($device->{'BSD Name'} && $device->{'BSD Name'} =~ /^disk\d+$/) || 
+        ($device->{'Protocol'} && $device->{'Socket Type'});
+}
+
+sub _getStorage {
+    my ($device, $device_name, $bus_name) = @_;
+
+    my $storage = {
+        NAME         => $device_name,
+        MANUFACTURER => getCanonicalManufacturer($device_name),
+        TYPE         => $bus_name eq 'FireWire' ? '1394' : $bus_name,
+        SERIAL       => $device->{'Serial Number'},
+        FIRMWARE     => $device->{'Revision'},
+        MODEL        => $device->{'Model'},
+        DISKSIZE     => $device->{'Capacity'}
+    };
+
+    if (!$device->{'Protocol'}) {
+        $storage->{DESCRIPTION} = 'Disk drive';
+    } elsif ($device->{'Protocol'} eq 'ATAPI' || $device->{'Drive Type'}) {
+        $storage->{DESCRIPTION} = 'CD-ROM Drive';
+    }
+
+    if ($storage->{DISKSIZE}) {
+        #e.g: Capacity: 320,07 GB (320 072 933 376 bytes)
+        $storage->{DISKSIZE} =~ s/\s*\(.*//;
+        $storage->{DISKSIZE} =~ s/ GB//;
+        $storage->{DISKSIZE} =~ s/,/./;
+        $storage->{DISKSIZE} = int($storage->{DISKSIZE} * 1024);
     }
-# The last one
-    if ($info->{Protocol}) {
-        push @infos, $info;
+
+    if ($storage->{MODEL}) {
+        $storage->{MODEL} =~ s/\s*$storage->{MANUFACTURER}\s*//i;
     }
-    return \@infos;
+
+    return $storage;
 }
 
 1;


================================================================
  Commit: 7159730c87b7362e590f06bfa98f7fb51d2892b1
      https://github.com/fusinv/fusioninventory-agent/commit/7159730c87b7362e590f06bfa98f7fb51d2892b1
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-02-25 (Sat, 25 Feb 2012)

  Changed paths:
    A t/inventory/macos/storages.t

  Log Message:
  -----------
  initial import


diff --git a/t/inventory/macos/storages.t b/t/inventory/macos/storages.t
new file mode 100755
index 0000000..62a3759
--- /dev/null
+++ b/t/inventory/macos/storages.t
@@ -0,0 +1,98 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+use Test::More;
+
+use FusionInventory::Agent::Task::Inventory::Input::MacOS::Storages;
+
+my %tests = (
+    '10.4-powerpc' => [
+        {
+            NAME         => 'HL-DT-ST DVD-RW GWA-4165B',
+            FIRMWARE     => 'C006',
+            TYPE         => 'ATA',
+            SERIAL       => 'B6FD7234EC63',
+            DISKSIZE     => undef,
+            MANUFACTURER => 'HL-DT-ST DVD-RW GWA-4165B',
+            MODEL        => '',
+            DESCRIPTION  => 'CD-ROM Drive'
+        }
+    ],
+    '10.5-powerpc' => [
+        {
+            NAME         => 'HL-DT-ST DVD-RW GWA-4165B',
+            FIRMWARE     => 'C006',
+            TYPE         => 'ATA',
+            SERIAL       => 'B6FD7234EC63',
+            DISKSIZE     => undef,
+            MANUFACTURER => 'HL-DT-ST DVD-RW GWA-4165B',
+            MODEL        => '',
+            DESCRIPTION  => 'CD-ROM Drive'
+        },
+        {
+            NAME         => 'Flash Disk',
+            FIRMWARE     => undef,
+            TYPE         => 'USB',
+            SERIAL       => '110074973765',
+            DISKSIZE     => 2007,
+            MANUFACTURER => 'Flash Disk',
+            MODEL        => undef,
+            DESCRIPTION  => 'Disk drive'
+        },
+        {
+            NAME         => 'DataTraveler 2.0',
+            FIRMWARE     => undef,
+            TYPE         => 'USB',
+            SERIAL       => '89980116200801151425097A',
+            DISKSIZE     => 3850,
+            MANUFACTURER => 'DataTraveler 2.0',
+            MODEL        => undef,
+            DESCRIPTION  => 'Disk drive'
+        }
+    ],
+    '10.6-intel' => [
+        {
+            NAME         => 'MATSHITADVD-R   UJ-875',
+            FIRMWARE     => 'DB09',
+            TYPE         => 'ATA',
+            SERIAL       => '            fG424F9E',
+            DISKSIZE     => undef,
+            MANUFACTURER => 'Matshita',
+            MODEL        => 'DVD-R   UJ-875',
+            DESCRIPTION  => 'CD-ROM Drive'
+        },
+        {
+            NAME         => 'Flash Disk      ',
+            FIRMWARE     => undef,
+            TYPE         => 'USB',
+            SERIAL       => '110074973765',
+            DISKSIZE     => 2160,
+            MANUFACTURER => 'Flash Disk      ',
+            MODEL        => undef,
+            DESCRIPTION  => 'Disk drive'
+        }
+    ],
+    '10.6.6-intel' => [
+        {
+            NAME         => 'MATSHITACD-RW  CW-8221',
+            FIRMWARE     => 'GA0J',
+            TYPE         => 'ATA',
+            SERIAL       => undef,
+            DISKSIZE     => undef,
+            MANUFACTURER => 'Matshita',
+            MODEL        => 'CD-RW  CW-8221',
+            DESCRIPTION  => 'CD-ROM Drive'
+        }
+    ]
+);
+
+plan tests => scalar keys %tests;
+
+foreach my $test (keys %tests) {
+    my $file = "resources/macos/system_profiler/$test";
+    my @storages = FusionInventory::Agent::Task::Inventory::Input::MacOS::Storages::_getStorages(file => $file);
+    is_deeply(\@storages, $tests{$test}, $test) or print Dumper(\@storages);
+    use Data::Dumper;
+}


================================================================
  Commit: 8ecba717d1fd2773b0d3123d30fbfa2793b2fc9d
      https://github.com/fusinv/fusioninventory-agent/commit/8ecba717d1fd2773b0d3123d30fbfa2793b2fc9d
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-02-25 (Sat, 25 Feb 2012)

  Changed paths:
    R resources/macos/system_profiler/10.6-intel-SPFireWireDataType
    R resources/macos/system_profiler/10.6-intel-SPParallelATADataType
    R resources/macos/system_profiler/10.6-intel-SPSerialATADataType
    R resources/macos/system_profiler/10.6-intel-SPUSBDataType

  Log Message:
  -----------
  not needed, they are just subsets


diff --git a/resources/macos/system_profiler/10.6-intel-SPFireWireDataType b/resources/macos/system_profiler/10.6-intel-SPFireWireDataType
deleted file mode 100644
index 4a6629d..0000000
--- a/resources/macos/system_profiler/10.6-intel-SPFireWireDataType
+++ /dev/null
@@ -1,6 +0,0 @@
-FireWire:
-
-    FireWire Bus:
-
-      Maximum Speed: Up to 400 Mb/sec
-
diff --git a/resources/macos/system_profiler/10.6-intel-SPParallelATADataType b/resources/macos/system_profiler/10.6-intel-SPParallelATADataType
deleted file mode 100644
index 0999d1c..0000000
--- a/resources/macos/system_profiler/10.6-intel-SPParallelATADataType
+++ /dev/null
@@ -1,38 +0,0 @@
-ATA:
-
-    ATA Bus:
-
-        HL-DT-ST DVDRW  GSA-S10N:
-
-          Capacity: 7,77 GB (7 771 521 024 bytes)
-          Model: HL-DT-ST DVDRW  GSA-S10N                
-          Revision: BP08    
-          Serial Number: K0076RM5813         
-          Removable Media: Yes
-          Detachable Drive: No
-          BSD Name: disk1
-          Protocol: ATAPI
-          Unit Number: 0
-          Socket Type: Internal
-          Low Power Polling: Yes
-          Power Off: Yes
-          Partition Map Type: APM (Apple Partition Map)
-          S.M.A.R.T. status: Not Supported
-          Volumes:
-              Capacity: 31 KB (30 720 bytes)
-              Media Type: DVD-ROM
-              Writable: No
-              BSD Name: disk1s1
-              Capacity: 1,03 GB (1 034 455 040 bytes)
-              Media Type: DVD-ROM
-              Writable: No
-              BSD Name: disk1s2
-            Mac OS X Install DVD:
-              Capacity: 6,74 GB (6 737 006 592 bytes)
-              Available: 84,9 MB (84 946 944 bytes)
-              Media Type: DVD-ROM
-              Writable: No
-              File System: HFS+
-              BSD Name: disk1s3
-              Mount Point: /Volumes/Mac OS X Install DVD
-
diff --git a/resources/macos/system_profiler/10.6-intel-SPSerialATADataType b/resources/macos/system_profiler/10.6-intel-SPSerialATADataType
deleted file mode 100644
index f8b58bf..0000000
--- a/resources/macos/system_profiler/10.6-intel-SPSerialATADataType
+++ /dev/null
@@ -1,36 +0,0 @@
-Serial-ATA:
-
-    Intel ICH7-M AHCI:
-
-      Vendor: Intel
-      Product: ICH7-M AHCI
-      Link Speed: 1.5 Gigabit
-      Negotiated Link Speed: 1.5 Gigabit
-      Description: AHCI Version 1.10 Supported
-
-        FUJITSU MHY2120BH:
-
-          Capacity: 120,03 GB (120 034 123 776 bytes)
-          Model: FUJITSU MHY2120BH                       
-          Revision: 0081000D
-          Serial Number:         K439T822NS6V
-          Native Command Queuing: Yes
-          Queue Depth: 32
-          Removable Media: No
-          Detachable Drive: No
-          BSD Name: disk0
-          Medium Type: Rotational
-          Partition Map Type: GPT (GUID Partition Table)
-          S.M.A.R.T. status: Verified
-          Volumes:
-              Capacity: 209,7 MB (209 715 200 bytes)
-              Writable: Yes
-              BSD Name: disk0s1
-            Macintosh HD:
-              Capacity: 119,69 GB (119 690 149 888 bytes)
-              Available: 94,9 GB (94 897 831 936 bytes)
-              Writable: Yes
-              File System: Journaled HFS+
-              BSD Name: disk0s2
-              Mount Point: /
-
diff --git a/resources/macos/system_profiler/10.6-intel-SPUSBDataType b/resources/macos/system_profiler/10.6-intel-SPUSBDataType
deleted file mode 100644
index 41e21a7..0000000
--- a/resources/macos/system_profiler/10.6-intel-SPUSBDataType
+++ /dev/null
@@ -1,91 +0,0 @@
-USB:
-
-    USB High-Speed Bus:
-
-      Host Controller Location: Built-in USB
-      Host Controller Driver: AppleUSBEHCI
-      PCI Device ID: 0x27cc 
-      PCI Revision ID: 0x0002 
-      PCI Vendor ID: 0x8086 
-      Bus Number: 0xfd 
-
-        Built-in iSight:
-
-          Product ID: 0x8501
-          Vendor ID: 0x05ac  (Apple Inc.)
-          Version:  1.89
-          Speed: Up to 480 Mb/sec
-          Manufacturer: Micron
-          Location ID: 0xfd400000 / 2
-          Current Available (mA): 500
-          Current Required (mA): 100
-
-    USB Bus:
-
-      Host Controller Location: Built-in USB
-      Host Controller Driver: AppleUSBUHCI
-      PCI Device ID: 0x27cb 
-      PCI Revision ID: 0x0002 
-      PCI Vendor ID: 0x8086 
-      Bus Number: 0x7d 
-
-        Bluetooth USB Host Controller:
-
-          Product ID: 0x8205
-          Vendor ID: 0x05ac  (Apple Inc.)
-          Version: 19.65
-          Speed: Up to 12 Mb/sec
-          Manufacturer: Apple Inc.
-          Location ID: 0x7d100000 / 2
-          Current Available (mA): 500
-          Current Required (mA): 0
-
-    USB Bus:
-
-      Host Controller Location: Built-in USB
-      Host Controller Driver: AppleUSBUHCI
-      PCI Device ID: 0x27c9 
-      PCI Revision ID: 0x0002 
-      PCI Vendor ID: 0x8086 
-      Bus Number: 0x3d 
-
-    USB Bus:
-
-      Host Controller Location: Built-in USB
-      Host Controller Driver: AppleUSBUHCI
-      PCI Device ID: 0x27c8 
-      PCI Revision ID: 0x0002 
-      PCI Vendor ID: 0x8086 
-      Bus Number: 0x1d 
-
-        Apple Internal Keyboard / Trackpad:
-
-          Product ID: 0x021b
-          Vendor ID: 0x05ac  (Apple Inc.)
-          Version:  0.18
-          Speed: Up to 12 Mb/sec
-          Manufacturer: Apple Computer
-          Location ID: 0x1d200000 / 2
-          Current Available (mA): 500
-          Current Required (mA): 40
-
-    USB Bus:
-
-      Host Controller Location: Built-in USB
-      Host Controller Driver: AppleUSBUHCI
-      PCI Device ID: 0x27ca 
-      PCI Revision ID: 0x0002 
-      PCI Vendor ID: 0x8086 
-      Bus Number: 0x5d 
-
-        IR Receiver:
-
-          Product ID: 0x8240
-          Vendor ID: 0x05ac  (Apple Inc.)
-          Version:  1.10
-          Speed: Up to 12 Mb/sec
-          Manufacturer: Apple Computer, Inc.
-          Location ID: 0x5d200000 / 2
-          Current Available (mA): 500
-          Current Required (mA): 100
-


================================================================
  Commit: 5bee372f2356a9566294b1aafe91c0939dfebc5f
      https://github.com/fusinv/fusioninventory-agent/commit/5bee372f2356a9566294b1aafe91c0939dfebc5f
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-02-25 (Sat, 25 Feb 2012)

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

  Log Message:
  -----------
  cache system_profiler parsed output


diff --git a/lib/FusionInventory/Agent/Tools/MacOS.pm b/lib/FusionInventory/Agent/Tools/MacOS.pm
index 5c41d76..bcf7051 100644
--- a/lib/FusionInventory/Agent/Tools/MacOS.pm
+++ b/lib/FusionInventory/Agent/Tools/MacOS.pm
@@ -5,6 +5,7 @@ use warnings;
 use base 'Exporter';
 
 use English qw(-no_match_vars);
+use Memoize;
 
 use FusionInventory::Agent::Tools;
 
@@ -13,6 +14,8 @@ our @EXPORT = qw(
     getIODevices
 );
 
+memoize('getSystemProfilerInfos');
+
 sub getSystemProfilerInfos {
     my %params = (
         command => '/usr/sbin/system_profiler',


================================================================
  Commit: e36f3cb8600039080cbdcd512c5e54521cf2dfcf
      https://github.com/fusinv/fusioninventory-agent/commit/e36f3cb8600039080cbdcd512c5e54521cf2dfcf
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-02-25 (Sat, 25 Feb 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory.pm

  Log Message:
  -----------
  don't call removed function


diff --git a/lib/FusionInventory/Agent/Task/Inventory.pm b/lib/FusionInventory/Agent/Task/Inventory.pm
index eee2a67..51abc38 100644
--- a/lib/FusionInventory/Agent/Task/Inventory.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory.pm
@@ -276,8 +276,6 @@ sub _feedInventory {
 
     $inventory->computeLegacyValues();
     $inventory->computeChecksum();
-
-    $inventory->checkContent();
 }
 
 sub _injectContent {


================================================================
  Commit: 26f4df924e349b3645c7b6c6ca26a6a71f1cd46e
      https://github.com/fusinv/fusioninventory-agent/commit/26f4df924e349b3645c7b6c6ca26a6a71f1cd46e
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-02-25 (Sat, 25 Feb 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Storages/Adaptec.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Linux/iLO.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Slots.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/Libvirt.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/VmWareDesktop.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm
    M lib/FusionInventory/Agent/Tools.pm
    M lib/FusionInventory/Agent/Tools/AIX.pm
    M lib/FusionInventory/Agent/Tools/Generic.pm
    M lib/FusionInventory/Agent/Tools/HPUX.pm
    M lib/FusionInventory/Agent/Tools/Linux.pm
    M lib/FusionInventory/Agent/Tools/MacOS.pm
    M lib/FusionInventory/Agent/Tools/Unix.pm
    M lib/FusionInventory/Agent/Tools/Win32.pm

  Log Message:
  -----------
  consistent syntax


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Storages/Adaptec.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Storages/Adaptec.pm
index f171fc4..4662f62 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Storages/Adaptec.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Storages/Adaptec.pm
@@ -42,7 +42,7 @@ sub doInventory {
 }
 
 sub _getDisksFromProc {
-    my %params = (
+    my (%params) = (
         file => '/proc/scsi/scsi',
         @_
     );
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/iLO.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/iLO.pm
index 6610d09..a78752e 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/iLO.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/iLO.pm
@@ -11,7 +11,7 @@ sub isEnabled {
 }
 
 sub _parseHponcfg {
-    my %params = @_;
+    my (%params) = @_;
 
     my $handle = getFileHandle(%params);
 
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Slots.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Slots.pm
index efeee64..a538f7c 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Slots.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Slots.pm
@@ -32,7 +32,7 @@ sub doInventory {
 }
 
 sub _getSlots4 {
-    my %params = (
+    my (%params) = (
         command => 'prtdiag',
         @_
     );
@@ -57,7 +57,7 @@ sub _getSlots4 {
 }
 
 sub _getSlots5 {
-    my %params = (
+    my (%params) = (
         command => 'prtdiag',
         @_
     );
@@ -106,7 +106,7 @@ sub _getSlots5 {
 }
 
 sub _getSlotsDefault {
-    my %params = (
+    my (%params) = (
         command => 'prtdiag',
         @_
     );
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/Libvirt.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/Libvirt.pm
index cfa845b..dc3ccf9 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/Libvirt.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/Libvirt.pm
@@ -26,7 +26,7 @@ sub doInventory {
 }
 
 sub _getMachines {
-    my %params = @_;
+    my (%params) = @_;
 
     my @machines = _parseList(
         command => 'virsh list --all',
@@ -49,7 +49,7 @@ sub _getMachines {
 }
 
 sub _parseList {
-    my %params = @_;
+    my (%params) = @_;
 
     my $handle = getFileHandle(%params);
     return unless $handle;
@@ -84,7 +84,7 @@ sub _parseList {
 }
 
 sub _parseDumpxml {
-    my %params = @_;
+    my (%params) = @_;
 
     my $xml = getAllLines(%params);
     if (!$xml) {
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/VmWareDesktop.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/VmWareDesktop.pm
index 5390a61..d4e0b41 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/VmWareDesktop.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/VmWareDesktop.pm
@@ -33,7 +33,7 @@ sub doInventory {
 }
 
 sub _getMachines {
-   my %params = @_;
+   my (%params) = @_;
 
     my $handle = getFileHandle(%params);
     return unless $handle;
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm
index ef34674..2c2272f 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm
@@ -156,7 +156,7 @@ sub _getSoftwares {
 }
 
 sub _addSoftware {
-    my %params = @_;
+    my (%params) = @_;
 
     my $entry = $params{entry};
 
diff --git a/lib/FusionInventory/Agent/Tools.pm b/lib/FusionInventory/Agent/Tools.pm
index 7ff5ed8..0e8e17d 100644
--- a/lib/FusionInventory/Agent/Tools.pm
+++ b/lib/FusionInventory/Agent/Tools.pm
@@ -202,7 +202,7 @@ sub getSanitizedString {
 }
 
 sub getDirectoryHandle {
-    my %params = @_;
+    my (%params) = @_;
 
     die "no directory parameter given" unless $params{directory};
 
@@ -218,7 +218,7 @@ sub getDirectoryHandle {
 }
 
 sub getFileHandle {
-    my %params = @_;
+    my (%params) = @_;
 
     my $handle;
 
@@ -252,7 +252,7 @@ sub getFileHandle {
 }
 
 sub getFirstLine {
-    my %params = @_;
+    my (%params) = @_;
 
     my $handle = getFileHandle(%params);
     return unless $handle;
@@ -265,7 +265,7 @@ sub getFirstLine {
 }
 
 sub getLastLine {
-    my %params = @_;
+    my (%params) = @_;
 
     my $handle = getFileHandle(%params);
     return unless $handle;
@@ -281,7 +281,7 @@ sub getLastLine {
 }
 
 sub getFirstMatch {
-    my %params = @_;
+    my (%params) = @_;
 
     return unless $params{pattern};
     my $handle = getFileHandle(%params);
@@ -298,7 +298,7 @@ sub getFirstMatch {
 }
 
 sub getAllLines {
-    my %params = @_;
+    my (%params) = @_;
 
     my $handle = getFileHandle(%params);
     return unless $handle;
@@ -316,7 +316,7 @@ sub getAllLines {
 }
 
 sub getLinesCount {
-    my %params = @_;
+    my (%params) = @_;
 
     my $handle = getFileHandle(%params);
     return unless $handle;
diff --git a/lib/FusionInventory/Agent/Tools/AIX.pm b/lib/FusionInventory/Agent/Tools/AIX.pm
index 4524400..2eb9538 100644
--- a/lib/FusionInventory/Agent/Tools/AIX.pm
+++ b/lib/FusionInventory/Agent/Tools/AIX.pm
@@ -18,7 +18,7 @@ memoize('getLsvpdInfos');
 memoize('getAdaptersFromLsdev');
 
 sub getLsvpdInfos {
-    my %params = (
+    my (%params) = (
         command => 'lsvpd',
         @_
     );
@@ -55,7 +55,7 @@ sub getLsvpdInfos {
 }
 
 sub getAdaptersFromLsdev {
-    my %params = (
+    my (%params) = (
         command => 'lsdev -Cc adapter -F "name:type:description"',
         @_
     );
diff --git a/lib/FusionInventory/Agent/Tools/Generic.pm b/lib/FusionInventory/Agent/Tools/Generic.pm
index ca807ba..03c1cc5 100644
--- a/lib/FusionInventory/Agent/Tools/Generic.pm
+++ b/lib/FusionInventory/Agent/Tools/Generic.pm
@@ -19,7 +19,7 @@ memoize('getDmidecodeInfos');
 memoize('getPCIDevices');
 
 sub getDmidecodeInfos {
-    my %params = (
+    my (%params) = (
         command => 'dmidecode',
         @_
     );
@@ -124,7 +124,7 @@ sub getCpusFromDmidecode {
 }
 
 sub getPCIDevices {
-    my %params = (
+    my (%params) = (
         command => 'lspci -vvv -nn',
         @_
     );
diff --git a/lib/FusionInventory/Agent/Tools/HPUX.pm b/lib/FusionInventory/Agent/Tools/HPUX.pm
index 700a9d6..f897029 100644
--- a/lib/FusionInventory/Agent/Tools/HPUX.pm
+++ b/lib/FusionInventory/Agent/Tools/HPUX.pm
@@ -18,7 +18,7 @@ memoize('getInfoFromMachinfo');
 memoize('isHPVMGuest');
 
 sub getInfoFromMachinfo {
-    my %params = (
+    my (%params) = (
         command => '/usr/contrib/bin/machinfo',
         @_
     );
diff --git a/lib/FusionInventory/Agent/Tools/Linux.pm b/lib/FusionInventory/Agent/Tools/Linux.pm
index 2559bef..e03a177 100644
--- a/lib/FusionInventory/Agent/Tools/Linux.pm
+++ b/lib/FusionInventory/Agent/Tools/Linux.pm
@@ -24,7 +24,7 @@ our @EXPORT = qw(
 memoize('getDevicesFromUdev');
 
 sub getDevicesFromUdev {
-    my %params = @_;
+    my (%params) = @_;
 
     my @devices;
 
@@ -45,7 +45,7 @@ sub getDevicesFromUdev {
 }
 
 sub _parseUdevEntry {
-    my %params = @_;
+    my (%params) = @_;
 
     my $handle = getFileHandle(%params);
     return unless $handle;
@@ -85,7 +85,7 @@ sub _parseUdevEntry {
 }
 
 sub getCPUsFromProc {
-    my %params = (
+    my (%params) = (
         file => '/proc/cpuinfo',
         @_
     );
@@ -120,7 +120,7 @@ sub _isValidCPU {
 
 
 sub getDevicesFromHal {
-    my %params = (
+    my (%params) = (
         command => '/usr/bin/lshal',
         @_
     );
@@ -164,7 +164,7 @@ sub getDevicesFromHal {
 }
 
 sub getDevicesFromProc {
-    my %params = @_;
+    my (%params) = @_;
 
     # compute list of devices
     my @names;
@@ -245,7 +245,7 @@ sub _getValueFromSysProc {
 }
 
 sub getSerialnumber {
-    my %params = @_;
+    my (%params) = @_;
 
     my ($serial) = getFirstMatch(
         command => $params{device} ? "smartctl -i $params{device}" : undef,
@@ -258,7 +258,7 @@ sub getSerialnumber {
 }
 
 sub getInterfacesFromIfconfig {
-    my %params = (
+    my (%params) = (
         command => '/sbin/ifconfig -a',
         @_
     );
@@ -307,7 +307,7 @@ sub getInterfacesFromIfconfig {
     return @interfaces;
 }
 sub getInterfacesFromIp {
-    my %params = (
+    my (%params) = (
         command => '/sbin/ip addr show',
         @_
     );
diff --git a/lib/FusionInventory/Agent/Tools/MacOS.pm b/lib/FusionInventory/Agent/Tools/MacOS.pm
index bcf7051..bef132c 100644
--- a/lib/FusionInventory/Agent/Tools/MacOS.pm
+++ b/lib/FusionInventory/Agent/Tools/MacOS.pm
@@ -17,7 +17,7 @@ our @EXPORT = qw(
 memoize('getSystemProfilerInfos');
 
 sub getSystemProfilerInfos {
-    my %params = (
+    my (%params) = (
         command => '/usr/sbin/system_profiler',
         @_
     );
@@ -85,7 +85,7 @@ sub getSystemProfilerInfos {
 }
 
 sub getIODevices {
-    my %params = @_;
+    my (%params) = @_;
 
     # passing expected class to the command ensure only instance of this class
     # are present in the output, reducing the size of the content to be parsed,
diff --git a/lib/FusionInventory/Agent/Tools/Unix.pm b/lib/FusionInventory/Agent/Tools/Unix.pm
index 428f54f..5ec40cd 100644
--- a/lib/FusionInventory/Agent/Tools/Unix.pm
+++ b/lib/FusionInventory/Agent/Tools/Unix.pm
@@ -24,7 +24,7 @@ our @EXPORT = qw(
 memoize('getProcessesFromPs');
 
 sub getDeviceCapacity {
-    my %params = @_;
+    my (%params) = @_;
 
     return unless $params{device};
 
@@ -146,7 +146,7 @@ sub _parseDhcpLeaseFile {
 }
 
 sub getFilesystemsFromDf {
-    my %params = (@_);
+    my (%params) = @_;
     my $handle = getFileHandle(%params);
 
     my @filesystems;
@@ -197,7 +197,7 @@ sub getFilesystemsFromDf {
 }
 
 sub getFilesystemsTypesFromMount {
-    my %params = (
+    my (%params) = (
         command => 'mount',
         @_
     );
@@ -334,7 +334,7 @@ sub getProcessesFromPs {
 }
 
 sub getRoutingTable {
-    my %params = (
+    my (%params) = (
         command => 'netstat -nr -f inet',
         @_
     );
diff --git a/lib/FusionInventory/Agent/Tools/Win32.pm b/lib/FusionInventory/Agent/Tools/Win32.pm
index 6624a0e..1c49573 100644
--- a/lib/FusionInventory/Agent/Tools/Win32.pm
+++ b/lib/FusionInventory/Agent/Tools/Win32.pm
@@ -70,7 +70,7 @@ sub encodeFromRegistry {
 }
 
 sub getWmiObjects {
-    my %params = (
+    my (%params) = (
         moniker => 'winmgmts:{impersonationLevel=impersonate,(security)}!//./',
         @_
     );
@@ -93,7 +93,7 @@ sub getWmiObjects {
 }
 
 sub getRegistryValue {
-    my %params = @_;
+    my (%params) = @_;
 
     my ($root, $keyName, $valueName);
     if ($params{path} =~ /^(HKEY\S+?)\/(.*)\/([^\/.]*)/ ) {


================================================================
  Commit: ccd133edbd05213dcb331d5f75e5079424fe38e8
      https://github.com/fusinv/fusioninventory-agent/commit/ccd133edbd05213dcb331d5f75e5079424fe38e8
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-02-25 (Sat, 25 Feb 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Slots.pm

  Log Message:
  -----------
  use explicit iterators


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Slots.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Slots.pm
index a538f7c..2c3914c 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Slots.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Slots.pm
@@ -72,25 +72,25 @@ sub _getSlots5 {
     my $description;
     my $designation;
 
-    while (<$handle>) {
-        last if /^\=+/ && $flag_pci && $flag;
+    while (my $line = <$handle>) {
+        last if $line =~ /^\=+/ && $flag_pci && $flag;
 
-        if (/^=+\S+\s+IO Cards/) {
+        if ($line =~ /^=+\S+\s+IO Cards/) {
             $flag_pci = 1;
         }
-        if ($flag_pci && /^-+/) {
+        if ($flag_pci && $line =~ /^-+/) {
             $flag = 1;
         }
 
         next unless $flag && $flag_pci;
 
-        if (/^\s+(\d+)/){
+        if ($line =~ /^\s+(\d+)/) {
             $name = "LSB " . $1;
         }
-        if(/^\s+\S+\s+(\S+)/){
+        if ($line =~ /^\s+\S+\s+(\S+)/) {
             $description = $1;
         }
-        if(/^\s+\S+\s+\S+\s+(\S+)/){
+        if ($line =~ /^\s+\S+\s+\S+\s+(\S+)/) {
             $designation = $1;
         }
 
@@ -111,7 +111,7 @@ sub _getSlotsDefault {
         @_
     );
 
-    my $handle  = getFileHandle(%params);
+    my $handle = getFileHandle(%params);
     return unless $handle;
 
     my @slots;
@@ -122,28 +122,28 @@ sub _getSlotsDefault {
     my $designation;
     my $status;
 
-    while (<$handle>) {
-        last if /^\=+/ && $flag_pci;
-        next if /^\s+/ && $flag_pci;
-        if (/^=+\s+IO Cards/) {
+    while (my $line = <$handle>) {
+        last if $line =~ /^\=+/ && $flag_pci;
+        next if $line =~ /^\s+/ && $flag_pci;
+        if ($line =~ /^=+\s+IO Cards/) {
             $flag_pci = 1;
         }
-        if ($flag_pci && /^-+/) {
+        if ($flag_pci && $line =~ /^-+/) {
             $flag = 1;
         }
 
         next unless $flag && $flag_pci;
 
-        if(/^(\S+)\s+/){
+        if ($line =~ /^(\S+)\s+/){
             $name = $1;
         }
-        if(/(\S+)\s*$/){
+        if ($line =~ /(\S+)\s*$/){
             $designation = $1;
         }
-        if(/^\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+(\S+)/){
+        if ($line =~ /^\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+(\S+)/) {
             $description = $1;
         }
-        if(/^\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+(\S+)/){
+        if ($line =~ /^\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+(\S+)/) {
             $status = $1;
         }
         push @slots, {


================================================================
  Commit: ac821d45cc7b85a08677f993b9215ea5a2fe27ef
      https://github.com/fusinv/fusioninventory-agent/commit/ac821d45cc7b85a08677f993b9215ea5a2fe27ef
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-02-25 (Sat, 25 Feb 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Config.pm

  Log Message:
  -----------
  use explicit iterator


diff --git a/lib/FusionInventory/Agent/Config.pm b/lib/FusionInventory/Agent/Config.pm
index b716f78..ac07bc3 100644
--- a/lib/FusionInventory/Agent/Config.pm
+++ b/lib/FusionInventory/Agent/Config.pm
@@ -147,9 +147,9 @@ sub _loadFromCfgFile {
         return;
     }
 
-    while (<$handle>) {
-        s/#.+//;
-        if (/([\w-]+)\s*=\s*(.+)/) {
+    while (my $line = <$handle>) {
+        $line =~ s/#.+//;
+        if ($line =~ /([\w-]+)\s*=\s*(.+)/) {
             my $key = $1;
             my $val = $2;
             # Remove the quotes


================================================================
  Commit: 3992007e8cbdf2d8aeb2c09326a132c1c9ddcfc2
      https://github.com/fusinv/fusioninventory-agent/commit/3992007e8cbdf2d8aeb2c09326a132c1c9ddcfc2
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-02-25 (Sat, 25 Feb 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/AIX/LVM.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Videos.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/Parallels.pm

  Log Message:
  -----------
  use while instead of foreach to read files

this avoid forcing list context, and loading the whole output in memory


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/AIX/LVM.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/AIX/LVM.pm
index 51b4f78..f8c6bc0 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/AIX/LVM.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/AIX/LVM.pm
@@ -42,7 +42,7 @@ sub _getLogicalVolumes {
 
     my @volumes;
 
-    foreach my $line (<$handle>) {
+    while (my $line = <$handle>) {
         chomp $line;
         push @volumes, _getLogicalVolume($logger, $line);
     }
@@ -62,7 +62,7 @@ sub _getLogicalVolume {
 
     my $volume;
 
-    foreach my $line (<$handle>) {
+    while (my $line = <$handle>) {
         chomp $line;
 
         if ($line =~ /(\S+):/) {
@@ -102,7 +102,7 @@ sub _getPhysicalVolumes {
 
     my @volumes;
 
-    foreach my $line (<$handle>) {
+    while (my $line = <$handle>) {
         chomp $line;
         push @volumes, _getPhysicalVolume($logger, $line);
     }
@@ -126,7 +126,7 @@ sub _getPhysicalVolume {
     };
 
     my ($free, $total);
-    foreach my $line (<$handle>) {
+    while (my $line = <$handle>) {
         chomp $line;
 
         if ($line =~ /PHYSICAL VOLUME:\s+(\S+)/) {
@@ -168,7 +168,7 @@ sub _getVolumeGroups {
 
     my @groups;
 
-    foreach my $line (<$handle>) {
+    while (my $line = <$handle>) {
         chomp $line;
         push @groups, _getVolumeGroup($logger, $line);
     }
@@ -190,7 +190,7 @@ sub _getVolumeGroup {
         VG_NAME => $name
     };
 
-    foreach my $line (<$handle>) {
+    while (my $line = <$handle>) {
         chomp $line;
 
         if ($line =~ /TOTAL PPs:\s+(\d+)/) {
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Videos.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Videos.pm
index 11b73af..be4aef8 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Videos.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Videos.pm
@@ -80,7 +80,7 @@ sub _getDdcprobeData {
     return unless $handle;
 
     my $data;
-    foreach my $line (<$handle>) {
+    while (my $line = <$handle>) {
         $line =~ s/[[:cntrl:]]//g;
         $line =~ s/[^[:ascii:]]//g;
         $data->{$1} = $2 if $line =~ /^(\S+):\s+(.*)/;
@@ -95,7 +95,7 @@ sub _parseXorgFd {
     return unless $handle;
 
     my $data;
-    foreach my $line (<$handle>) {
+    while (my $line = <$handle>) {
         if ($line =~ /Modeline\s"(\S+?)"/) {
             $data->{resolution} = $1 if !$data->{resolution};
         } elsif ($line =~ /Integrated Graphics Chipset:\s+(.*)/) {
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/Parallels.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/Parallels.pm
index 74b84f9..c96e952 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/Parallels.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/Parallels.pm
@@ -70,7 +70,7 @@ sub _parsePrlctlA {
     my $line = <$handle>;
 
     my @machines;
-    foreach my $line (<$handle>) {
+    while (my $line = <$handle>) {
         chomp $line; 
         my @info = split(/\s+/, $line, 4);
         my $uuid   = $info[0];


================================================================
  Commit: a3f124aa87180a670edb26ff32c61b2d9feffbc2
      https://github.com/fusinv/fusioninventory-agent/commit/a3f124aa87180a670edb26ff32c61b2d9feffbc2
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-02-25 (Sat, 25 Feb 2012)

  Changed paths:
    M lib/FusionInventory/Agent/HTTP/Protocol/https.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Networks.pm
    M lib/FusionInventory/Agent/Tools/Linux.pm
    M lib/FusionInventory/Agent/Tools/Network.pm
    M lib/FusionInventory/Agent/Tools/Unix.pm

  Log Message:
  -----------
  drop unused variables


diff --git a/lib/FusionInventory/Agent/HTTP/Protocol/https.pm b/lib/FusionInventory/Agent/HTTP/Protocol/https.pm
index c07fe99..d74a8b1 100644
--- a/lib/FusionInventory/Agent/HTTP/Protocol/https.pm
+++ b/lib/FusionInventory/Agent/HTTP/Protocol/https.pm
@@ -17,7 +17,7 @@ sub import {
 }
 
 sub _extra_sock_opts {
-    my ($self, $host, $port) = @_;
+    my ($self, $host) = @_;
 
     return (
         SSL_verify_mode     => $self->{ua}->{ssl_check} ?
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Networks.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Networks.pm
index de317fe..5fdf0a0 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Networks.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Networks.pm
@@ -43,7 +43,6 @@ sub _getInterfaces {
     my (%params) = @_;
 
     my $logger = $params{logger};
-    my $routes = $params{routes};
 
     my @interfaces = canRun("/sbin/ip") ?
         getInterfacesFromIp(logger => $logger):
@@ -60,7 +59,6 @@ sub _getInterfaces {
         );
 
         my ($driver, $pcislot) = _getUevent(
-            $logger,
             $interface->{DESCRIPTION}
         );
         $interface->{DRIVER} = $driver if $driver;
@@ -134,7 +132,7 @@ sub _isWifi {
 }
 
 sub _getUevent {
-    my ($logger, $name) = @_;
+    my ($name) = @_;
 
     my $file = "/sys/class/net/$name/device/uevent";
     my $handle = getFileHandle(file => $file);
diff --git a/lib/FusionInventory/Agent/Tools/Linux.pm b/lib/FusionInventory/Agent/Tools/Linux.pm
index e03a177..f2e90d4 100644
--- a/lib/FusionInventory/Agent/Tools/Linux.pm
+++ b/lib/FusionInventory/Agent/Tools/Linux.pm
@@ -332,7 +332,7 @@ sub getInterfacesFromIp {
             $interface->{IPADDRESS6} = $1;
         } elsif ($line =~ /inet ($ip_address_pattern)\/(\d{1,3})/) {
             $interface->{IPADDRESS} = $1;
-            $interface->{IPMASK}    = getNetworkMask($1, $2);
+            $interface->{IPMASK}    = getNetworkMask($2);
             $interface->{IPSUBNET}  = getSubnetAddress(
                 $interface->{IPADDRESS}, $interface->{IPMASK}
             );
diff --git a/lib/FusionInventory/Agent/Tools/Network.pm b/lib/FusionInventory/Agent/Tools/Network.pm
index 65ce338..27bdd20 100644
--- a/lib/FusionInventory/Agent/Tools/Network.pm
+++ b/lib/FusionInventory/Agent/Tools/Network.pm
@@ -86,7 +86,7 @@ sub alt2canonical {
 }
 
 sub getNetworkMask {
-    my ($address, $prefix) = @_;
+    my ($prefix) = @_;
 
     my $mask;
     $mask .= 1 foreach(1..$prefix);
@@ -143,6 +143,6 @@ Returns the subnet address for IPv4.
 
 Returns the subnet address for IPv6.
 
-=head2 getNetworkMask($address, $prefix)
+=head2 getNetworkMask($prefix)
 
 Returns the network mask.
diff --git a/lib/FusionInventory/Agent/Tools/Unix.pm b/lib/FusionInventory/Agent/Tools/Unix.pm
index 5ec40cd..decc968 100644
--- a/lib/FusionInventory/Agent/Tools/Unix.pm
+++ b/lib/FusionInventory/Agent/Tools/Unix.pm
@@ -46,7 +46,7 @@ sub getDeviceCapacity {
 sub getIpDhcp {
     my ($logger, $if) = @_;
 
-    my $dhcpLeaseFile = _findDhcpLeaseFile($logger, $if);
+    my $dhcpLeaseFile = _findDhcpLeaseFile($if);
 
     return unless $dhcpLeaseFile;
 
@@ -54,8 +54,7 @@ sub getIpDhcp {
 }
 
 sub _findDhcpLeaseFile {
-    my ($logger, $if) = @_;
-
+    my ($if) = @_;
 
     my @directories = qw(
         /var/db


================================================================
  Commit: aab1ea5b821da6e82d6d10eddc3313d26d3f2353
      https://github.com/fusinv/fusioninventory-agent/commit/aab1ea5b821da6e82d6d10eddc3313d26d3f2353
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-02-25 (Sat, 25 Feb 2012)

  Changed paths:
    M t/05var.t

  Log Message:
  -----------
  add some more exceptions


diff --git a/t/05var.t b/t/05var.t
index 6671b6e..2f1896b 100644
--- a/t/05var.t
+++ b/t/05var.t
@@ -23,5 +23,7 @@ if ($EVAL_ERROR) {
     plan(skip_all => 'Test::Vars required to validate the code');
 }
 
-Test::Vars::all_vars_ok(ignore_vars => { '$i' => 1 });
+Test::Vars::all_vars_ok(
+    ignore_vars => { '$i' => 1, '%params' => 1, '$class' => 1 }
+);
 


================================================================
  Commit: 7036a3665e26876becb4900444506b4971a3c5c2
      https://github.com/fusinv/fusioninventory-agent/commit/7036a3665e26876becb4900444506b4971a3c5c2
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-02-25 (Sat, 25 Feb 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Videos.pm

  Log Message:
  -----------
  cosmetics


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Videos.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Videos.pm
index b0e74ad..33ad418 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Videos.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Videos.pm
@@ -30,8 +30,8 @@ sub doInventory {
 sub _getDisplays {
     my $infos = getSystemProfilerInfos(@_);
 
-    my $monitors = [];
-    my $videos = [];
+    my @monitors;
+    my @videos;
 
     foreach my $videoName (keys %{$infos->{'Graphics/Displays'}}) {
         my $videoCardInfo = $infos->{'Graphics/Displays'}->{$videoName};
@@ -50,7 +50,7 @@ sub _getDisplays {
             my $memory = $videoCardInfo->{'VRAM (Total)'};
             $memory =~ s/\ .*//g if $memory;
 
-            push @$videos, {
+            push @videos, {
                 CHIPSET    => $videoCardInfo->{'Chipset Model'},
                 MEMORY     => $memory,
                 NAME       => $videoName,
@@ -58,7 +58,7 @@ sub _getDisplays {
                 PCISLOT    => $videoCardInfo->{Slot}
             };
 
-            push @$monitors, {
+            push @monitors, {
                 CAPTION     => $displayName,
                 DESCRIPTION => $displayName,
             }
@@ -66,8 +66,8 @@ sub _getDisplays {
     }
 
     return (
-        MONITORS => $monitors,
-        VIDEOS   => $videos
+        MONITORS => \@monitors,
+        VIDEOS   => \@videos
     );
 
 }


================================================================
  Commit: b8c705f43405e3ccce14a723b025fc5cfb257b7b
      https://github.com/fusinv/fusioninventory-agent/commit/b8c705f43405e3ccce14a723b025fc5cfb257b7b
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-02-25 (Sat, 25 Feb 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Videos.pm

  Log Message:
  -----------
  more explicit


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Videos.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Videos.pm
index 33ad418..8294ed5 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Videos.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Videos.pm
@@ -17,13 +17,19 @@ sub doInventory {
     my $inventory = $params{inventory};
 
     my %displays = _getDisplays();
-    foreach my $section (keys %displays ) {
-        foreach my $entry (@{$displays{$section}}) {
-            $inventory->addEntry(
-                section => $section,
-                entry   => $entry,
-            );
-        }
+
+    foreach my $monitor (@{$displays{MONITORS}}) {
+        $inventory->addEntry(
+            section => 'MONITORS',
+            entry   => $monitor,
+        );
+    }
+
+    foreach my $video (@{$displays{VIDEOS}}) {
+        $inventory->addEntry(
+            section => 'VIDEOS',
+            entry   => $video,
+        );
     }
 }
 


================================================================
  Commit: c96d7ed25462bc560a1ca60504515b8ba3096a86
      https://github.com/fusinv/fusioninventory-agent/commit/c96d7ed25462bc560a1ca60504515b8ba3096a86
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-02-25 (Sat, 25 Feb 2012)

  Changed paths:
    A resources/macos/system_profiler/10.6-intel-SPFireWireDataType
    A resources/macos/system_profiler/10.6-intel-SPParallelATADataType
    A resources/macos/system_profiler/10.6-intel-SPSerialATADataType
    A resources/macos/system_profiler/10.6-intel-SPUSBDataType

  Log Message:
  -----------
  Merge remote-tracking branch 'origin/2.2.x' into 2.2.x


diff --git a/resources/macos/system_profiler/10.6-intel-SPFireWireDataType b/resources/macos/system_profiler/10.6-intel-SPFireWireDataType
new file mode 100644
index 0000000..4a6629d
--- /dev/null
+++ b/resources/macos/system_profiler/10.6-intel-SPFireWireDataType
@@ -0,0 +1,6 @@
+FireWire:
+
+    FireWire Bus:
+
+      Maximum Speed: Up to 400 Mb/sec
+
diff --git a/resources/macos/system_profiler/10.6-intel-SPParallelATADataType b/resources/macos/system_profiler/10.6-intel-SPParallelATADataType
new file mode 100644
index 0000000..0999d1c
--- /dev/null
+++ b/resources/macos/system_profiler/10.6-intel-SPParallelATADataType
@@ -0,0 +1,38 @@
+ATA:
+
+    ATA Bus:
+
+        HL-DT-ST DVDRW  GSA-S10N:
+
+          Capacity: 7,77 GB (7 771 521 024 bytes)
+          Model: HL-DT-ST DVDRW  GSA-S10N                
+          Revision: BP08    
+          Serial Number: K0076RM5813         
+          Removable Media: Yes
+          Detachable Drive: No
+          BSD Name: disk1
+          Protocol: ATAPI
+          Unit Number: 0
+          Socket Type: Internal
+          Low Power Polling: Yes
+          Power Off: Yes
+          Partition Map Type: APM (Apple Partition Map)
+          S.M.A.R.T. status: Not Supported
+          Volumes:
+              Capacity: 31 KB (30 720 bytes)
+              Media Type: DVD-ROM
+              Writable: No
+              BSD Name: disk1s1
+              Capacity: 1,03 GB (1 034 455 040 bytes)
+              Media Type: DVD-ROM
+              Writable: No
+              BSD Name: disk1s2
+            Mac OS X Install DVD:
+              Capacity: 6,74 GB (6 737 006 592 bytes)
+              Available: 84,9 MB (84 946 944 bytes)
+              Media Type: DVD-ROM
+              Writable: No
+              File System: HFS+
+              BSD Name: disk1s3
+              Mount Point: /Volumes/Mac OS X Install DVD
+
diff --git a/resources/macos/system_profiler/10.6-intel-SPSerialATADataType b/resources/macos/system_profiler/10.6-intel-SPSerialATADataType
new file mode 100644
index 0000000..f8b58bf
--- /dev/null
+++ b/resources/macos/system_profiler/10.6-intel-SPSerialATADataType
@@ -0,0 +1,36 @@
+Serial-ATA:
+
+    Intel ICH7-M AHCI:
+
+      Vendor: Intel
+      Product: ICH7-M AHCI
+      Link Speed: 1.5 Gigabit
+      Negotiated Link Speed: 1.5 Gigabit
+      Description: AHCI Version 1.10 Supported
+
+        FUJITSU MHY2120BH:
+
+          Capacity: 120,03 GB (120 034 123 776 bytes)
+          Model: FUJITSU MHY2120BH                       
+          Revision: 0081000D
+          Serial Number:         K439T822NS6V
+          Native Command Queuing: Yes
+          Queue Depth: 32
+          Removable Media: No
+          Detachable Drive: No
+          BSD Name: disk0
+          Medium Type: Rotational
+          Partition Map Type: GPT (GUID Partition Table)
+          S.M.A.R.T. status: Verified
+          Volumes:
+              Capacity: 209,7 MB (209 715 200 bytes)
+              Writable: Yes
+              BSD Name: disk0s1
+            Macintosh HD:
+              Capacity: 119,69 GB (119 690 149 888 bytes)
+              Available: 94,9 GB (94 897 831 936 bytes)
+              Writable: Yes
+              File System: Journaled HFS+
+              BSD Name: disk0s2
+              Mount Point: /
+
diff --git a/resources/macos/system_profiler/10.6-intel-SPUSBDataType b/resources/macos/system_profiler/10.6-intel-SPUSBDataType
new file mode 100644
index 0000000..41e21a7
--- /dev/null
+++ b/resources/macos/system_profiler/10.6-intel-SPUSBDataType
@@ -0,0 +1,91 @@
+USB:
+
+    USB High-Speed Bus:
+
+      Host Controller Location: Built-in USB
+      Host Controller Driver: AppleUSBEHCI
+      PCI Device ID: 0x27cc 
+      PCI Revision ID: 0x0002 
+      PCI Vendor ID: 0x8086 
+      Bus Number: 0xfd 
+
+        Built-in iSight:
+
+          Product ID: 0x8501
+          Vendor ID: 0x05ac  (Apple Inc.)
+          Version:  1.89
+          Speed: Up to 480 Mb/sec
+          Manufacturer: Micron
+          Location ID: 0xfd400000 / 2
+          Current Available (mA): 500
+          Current Required (mA): 100
+
+    USB Bus:
+
+      Host Controller Location: Built-in USB
+      Host Controller Driver: AppleUSBUHCI
+      PCI Device ID: 0x27cb 
+      PCI Revision ID: 0x0002 
+      PCI Vendor ID: 0x8086 
+      Bus Number: 0x7d 
+
+        Bluetooth USB Host Controller:
+
+          Product ID: 0x8205
+          Vendor ID: 0x05ac  (Apple Inc.)
+          Version: 19.65
+          Speed: Up to 12 Mb/sec
+          Manufacturer: Apple Inc.
+          Location ID: 0x7d100000 / 2
+          Current Available (mA): 500
+          Current Required (mA): 0
+
+    USB Bus:
+
+      Host Controller Location: Built-in USB
+      Host Controller Driver: AppleUSBUHCI
+      PCI Device ID: 0x27c9 
+      PCI Revision ID: 0x0002 
+      PCI Vendor ID: 0x8086 
+      Bus Number: 0x3d 
+
+    USB Bus:
+
+      Host Controller Location: Built-in USB
+      Host Controller Driver: AppleUSBUHCI
+      PCI Device ID: 0x27c8 
+      PCI Revision ID: 0x0002 
+      PCI Vendor ID: 0x8086 
+      Bus Number: 0x1d 
+
+        Apple Internal Keyboard / Trackpad:
+
+          Product ID: 0x021b
+          Vendor ID: 0x05ac  (Apple Inc.)
+          Version:  0.18
+          Speed: Up to 12 Mb/sec
+          Manufacturer: Apple Computer
+          Location ID: 0x1d200000 / 2
+          Current Available (mA): 500
+          Current Required (mA): 40
+
+    USB Bus:
+
+      Host Controller Location: Built-in USB
+      Host Controller Driver: AppleUSBUHCI
+      PCI Device ID: 0x27ca 
+      PCI Revision ID: 0x0002 
+      PCI Vendor ID: 0x8086 
+      Bus Number: 0x5d 
+
+        IR Receiver:
+
+          Product ID: 0x8240
+          Vendor ID: 0x05ac  (Apple Inc.)
+          Version:  1.10
+          Speed: Up to 12 Mb/sec
+          Manufacturer: Apple Computer, Inc.
+          Location ID: 0x5d200000 / 2
+          Current Available (mA): 500
+          Current Required (mA): 100
+


================================================================
  Commit: 139132ec9b218bf2cce1927a58abf81e7108eec9
      https://github.com/fusinv/fusioninventory-agent/commit/139132ec9b218bf2cce1927a58abf81e7108eec9
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-02-25 (Sat, 25 Feb 2012)

  Changed paths:
    R resources/macos/system_profiler/10.6-intel-SPFireWireDataType
    R resources/macos/system_profiler/10.6-intel-SPParallelATADataType
    R resources/macos/system_profiler/10.6-intel-SPSerialATADataType
    R resources/macos/system_profiler/10.6-intel-SPUSBDataType

  Log Message:
  -----------
  not needed, they are just subsets


diff --git a/resources/macos/system_profiler/10.6-intel-SPFireWireDataType b/resources/macos/system_profiler/10.6-intel-SPFireWireDataType
deleted file mode 100644
index 4a6629d..0000000
--- a/resources/macos/system_profiler/10.6-intel-SPFireWireDataType
+++ /dev/null
@@ -1,6 +0,0 @@
-FireWire:
-
-    FireWire Bus:
-
-      Maximum Speed: Up to 400 Mb/sec
-
diff --git a/resources/macos/system_profiler/10.6-intel-SPParallelATADataType b/resources/macos/system_profiler/10.6-intel-SPParallelATADataType
deleted file mode 100644
index 0999d1c..0000000
--- a/resources/macos/system_profiler/10.6-intel-SPParallelATADataType
+++ /dev/null
@@ -1,38 +0,0 @@
-ATA:
-
-    ATA Bus:
-
-        HL-DT-ST DVDRW  GSA-S10N:
-
-          Capacity: 7,77 GB (7 771 521 024 bytes)
-          Model: HL-DT-ST DVDRW  GSA-S10N                
-          Revision: BP08    
-          Serial Number: K0076RM5813         
-          Removable Media: Yes
-          Detachable Drive: No
-          BSD Name: disk1
-          Protocol: ATAPI
-          Unit Number: 0
-          Socket Type: Internal
-          Low Power Polling: Yes
-          Power Off: Yes
-          Partition Map Type: APM (Apple Partition Map)
-          S.M.A.R.T. status: Not Supported
-          Volumes:
-              Capacity: 31 KB (30 720 bytes)
-              Media Type: DVD-ROM
-              Writable: No
-              BSD Name: disk1s1
-              Capacity: 1,03 GB (1 034 455 040 bytes)
-              Media Type: DVD-ROM
-              Writable: No
-              BSD Name: disk1s2
-            Mac OS X Install DVD:
-              Capacity: 6,74 GB (6 737 006 592 bytes)
-              Available: 84,9 MB (84 946 944 bytes)
-              Media Type: DVD-ROM
-              Writable: No
-              File System: HFS+
-              BSD Name: disk1s3
-              Mount Point: /Volumes/Mac OS X Install DVD
-
diff --git a/resources/macos/system_profiler/10.6-intel-SPSerialATADataType b/resources/macos/system_profiler/10.6-intel-SPSerialATADataType
deleted file mode 100644
index f8b58bf..0000000
--- a/resources/macos/system_profiler/10.6-intel-SPSerialATADataType
+++ /dev/null
@@ -1,36 +0,0 @@
-Serial-ATA:
-
-    Intel ICH7-M AHCI:
-
-      Vendor: Intel
-      Product: ICH7-M AHCI
-      Link Speed: 1.5 Gigabit
-      Negotiated Link Speed: 1.5 Gigabit
-      Description: AHCI Version 1.10 Supported
-
-        FUJITSU MHY2120BH:
-
-          Capacity: 120,03 GB (120 034 123 776 bytes)
-          Model: FUJITSU MHY2120BH                       
-          Revision: 0081000D
-          Serial Number:         K439T822NS6V
-          Native Command Queuing: Yes
-          Queue Depth: 32
-          Removable Media: No
-          Detachable Drive: No
-          BSD Name: disk0
-          Medium Type: Rotational
-          Partition Map Type: GPT (GUID Partition Table)
-          S.M.A.R.T. status: Verified
-          Volumes:
-              Capacity: 209,7 MB (209 715 200 bytes)
-              Writable: Yes
-              BSD Name: disk0s1
-            Macintosh HD:
-              Capacity: 119,69 GB (119 690 149 888 bytes)
-              Available: 94,9 GB (94 897 831 936 bytes)
-              Writable: Yes
-              File System: Journaled HFS+
-              BSD Name: disk0s2
-              Mount Point: /
-
diff --git a/resources/macos/system_profiler/10.6-intel-SPUSBDataType b/resources/macos/system_profiler/10.6-intel-SPUSBDataType
deleted file mode 100644
index 41e21a7..0000000
--- a/resources/macos/system_profiler/10.6-intel-SPUSBDataType
+++ /dev/null
@@ -1,91 +0,0 @@
-USB:
-
-    USB High-Speed Bus:
-
-      Host Controller Location: Built-in USB
-      Host Controller Driver: AppleUSBEHCI
-      PCI Device ID: 0x27cc 
-      PCI Revision ID: 0x0002 
-      PCI Vendor ID: 0x8086 
-      Bus Number: 0xfd 
-
-        Built-in iSight:
-
-          Product ID: 0x8501
-          Vendor ID: 0x05ac  (Apple Inc.)
-          Version:  1.89
-          Speed: Up to 480 Mb/sec
-          Manufacturer: Micron
-          Location ID: 0xfd400000 / 2
-          Current Available (mA): 500
-          Current Required (mA): 100
-
-    USB Bus:
-
-      Host Controller Location: Built-in USB
-      Host Controller Driver: AppleUSBUHCI
-      PCI Device ID: 0x27cb 
-      PCI Revision ID: 0x0002 
-      PCI Vendor ID: 0x8086 
-      Bus Number: 0x7d 
-
-        Bluetooth USB Host Controller:
-
-          Product ID: 0x8205
-          Vendor ID: 0x05ac  (Apple Inc.)
-          Version: 19.65
-          Speed: Up to 12 Mb/sec
-          Manufacturer: Apple Inc.
-          Location ID: 0x7d100000 / 2
-          Current Available (mA): 500
-          Current Required (mA): 0
-
-    USB Bus:
-
-      Host Controller Location: Built-in USB
-      Host Controller Driver: AppleUSBUHCI
-      PCI Device ID: 0x27c9 
-      PCI Revision ID: 0x0002 
-      PCI Vendor ID: 0x8086 
-      Bus Number: 0x3d 
-
-    USB Bus:
-
-      Host Controller Location: Built-in USB
-      Host Controller Driver: AppleUSBUHCI
-      PCI Device ID: 0x27c8 
-      PCI Revision ID: 0x0002 
-      PCI Vendor ID: 0x8086 
-      Bus Number: 0x1d 
-
-        Apple Internal Keyboard / Trackpad:
-
-          Product ID: 0x021b
-          Vendor ID: 0x05ac  (Apple Inc.)
-          Version:  0.18
-          Speed: Up to 12 Mb/sec
-          Manufacturer: Apple Computer
-          Location ID: 0x1d200000 / 2
-          Current Available (mA): 500
-          Current Required (mA): 40
-
-    USB Bus:
-
-      Host Controller Location: Built-in USB
-      Host Controller Driver: AppleUSBUHCI
-      PCI Device ID: 0x27ca 
-      PCI Revision ID: 0x0002 
-      PCI Vendor ID: 0x8086 
-      Bus Number: 0x5d 
-
-        IR Receiver:
-
-          Product ID: 0x8240
-          Vendor ID: 0x05ac  (Apple Inc.)
-          Version:  1.10
-          Speed: Up to 12 Mb/sec
-          Manufacturer: Apple Computer, Inc.
-          Location ID: 0x5d200000 / 2
-          Current Available (mA): 500
-          Current Required (mA): 100
-


================================================================
  Commit: 95420b5f0b61a28daaaa4525ef4d2f94541d0345
      https://github.com/fusinv/fusioninventory-agent/commit/95420b5f0b61a28daaaa4525ef4d2f94541d0345
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-02-26 (Sun, 26 Feb 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Printers.pm
    M t/inventory/windows/printers.t

  Log Message:
  -----------
  drop pseudo serial generated by windows


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Printers.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Printers.pm
index 48e8e6d..447d600 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Printers.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Printers.pm
@@ -159,6 +159,8 @@ sub _getUSBSerial {
                 $subKey->{'/ParentIdPrefix'} eq $prefix;
             # got it
             my $serial = $subKeyName;
+            # pseudo serial generated by windows
+            return if $serial =~ /&/;
             $serial =~ s{/$}{};
             return $serial;
         }
diff --git a/t/inventory/windows/printers.t b/t/inventory/windows/printers.t
index 156549f..240f82c 100755
--- a/t/inventory/windows/printers.t
+++ b/t/inventory/windows/printers.t
@@ -16,13 +16,13 @@ use FusionInventory::Agent::Task::Inventory::Input::Win32::Printers;
 my %tests = (
     xppro1 => {
         USB001 => [ '6&397bdcac&0', '49R8Ka' ],
-        USB002 => [ '6&2ad9257f&0', '5&19d1ce61&0&2' ],
-        USB003 => [ '6&1605722f&0', '5&2377f6ef&0&2' ],
+        USB002 => [ '6&2ad9257f&0', undef ],
+        USB003 => [ '6&1605722f&0', undef ],
     },
     xppro2 => {
         USB001 => [ '6&1086615&0',  'J5J126789' ],
         USB003 => [ '6&159b6df2&0', 'JV40VNJ' ],
-        USB004 => [ '7&20bd29b5&0', '6&28e27c3d&0&0000' ],
+        USB004 => [ '7&20bd29b5&0', undef ],
     },
     7 => {
         USB001 => [ '7&17e8a3c3&0',  'MY26K1K34C2L' ],


================================================================
  Commit: 7d9eedd9ad8934c53ec6ee092cc4ed8a4ececb8a
      https://github.com/fusinv/fusioninventory-agent/commit/7d9eedd9ad8934c53ec6ee092cc4ed8a4ececb8a
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-02-26 (Sun, 26 Feb 2012)

  Changed paths:
    M t/inventory/windows/printers.t

  Log Message:
  -----------
  simplification, we don't care about the prefix


diff --git a/t/inventory/windows/printers.t b/t/inventory/windows/printers.t
index 240f82c..8199b06 100755
--- a/t/inventory/windows/printers.t
+++ b/t/inventory/windows/printers.t
@@ -15,23 +15,23 @@ use FusionInventory::Agent::Task::Inventory::Input::Win32::Printers;
 
 my %tests = (
     xppro1 => {
-        USB001 => [ '6&397bdcac&0', '49R8Ka' ],
-        USB002 => [ '6&2ad9257f&0', undef ],
-        USB003 => [ '6&1605722f&0', undef ],
+        USB001 => '49R8Ka',
+        USB002 => undef,
+        USB003 => undef
     },
     xppro2 => {
-        USB001 => [ '6&1086615&0',  'J5J126789' ],
-        USB003 => [ '6&159b6df2&0', 'JV40VNJ' ],
-        USB004 => [ '7&20bd29b5&0', undef ],
+        USB001 => 'J5J126789',
+        USB003 => 'JV40VNJ',
+        USB004 => undef,
     },
     7 => {
-        USB001 => [ '7&17e8a3c3&0',  'MY26K1K34C2L' ],
+        USB001 => 'MY26K1K34C2L'
     }
 );
 
 my $plan = 0;
 foreach my $test (keys %tests) {
-    $plan += 2 * scalar (keys %{$tests{$test}});
+    $plan += scalar (keys %{$tests{$test}});
 }
 plan tests => $plan;
 
@@ -42,8 +42,7 @@ foreach my $test (keys %tests) {
         my $prefix = FusionInventory::Agent::Task::Inventory::Input::Win32::Printers::_getUSBPrefix($printKey, $port);
         my $serial = FusionInventory::Agent::Task::Inventory::Input::Win32::Printers::_getUSBSerial($usbKey, $prefix);
 
-        is($prefix, $tests{$test}->{$port}->[0], "prefix for printer $port");
-        is($serial, $tests{$test}->{$port}->[1], "serial for printer $port");
+        is($serial, $tests{$test}->{$port}, "serial for printer $port");
     }
 }
 


================================================================
  Commit: fc0c2d9a1df2fdfcc9f6b2756198c02677e2d1e4
      https://github.com/fusinv/fusioninventory-agent/commit/fc0c2d9a1df2fdfcc9f6b2756198c02677e2d1e4
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-02-26 (Sun, 26 Feb 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Storages.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Printers.pm

  Log Message:
  -----------
  document expected data structures


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Storages.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Storages.pm
index 8d148af..2fbbc13 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Storages.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Storages.pm
@@ -27,37 +27,34 @@ sub doInventory {
 sub _getStorages {
     my $infos = getSystemProfilerInfos(@_);
 
-    # system profiler info is organized as
-    # bus => {
-    #     controller => {
-    #         key1 => value1,
-    #         device => {
-    #             key1 => value1
-    #             subdevice => {
-    #                 key1 => value1,
-    #             }
-    #         }
-    #     }
-    # }
+    # system profiler data structure:
+    # bus
+    # └── controller
+    #     ├── device
+    #     │   ├── subdevice
+    #     │   │   └── key:value
+    #     │   └── key:value
+    #     └── key:value
+
     my @storages;
 
-    foreach my $bus_name (qw/ATA SERIAL-ATA USB FireWire/) {
-        my $bus = $infos->{$bus_name};
+    foreach my $busName (qw/ATA SERIAL-ATA USB FireWire/) {
+        my $bus = $infos->{$busName};
         next unless $bus;
-        foreach my $controller_name (keys %{$bus}) {
-            my $controller = $bus->{$controller_name};
-            foreach my $device_name (keys %{$controller}) {
-                my $device = $controller->{$device_name};
+        foreach my $controllerName (keys %{$bus}) {
+            my $controller = $bus->{$controllerName};
+            foreach my $deviceName (keys %{$controller}) {
+                my $device = $controller->{$deviceName};
                 next unless ref $device eq 'HASH';
                 if (_isStorage($device)) {
                     push @storages,
-                        _getStorage($device, $device_name, $bus_name);
+                        _getStorage($device, $deviceName, $busName);
                 } else {
-                    foreach my $subdevice_name (keys %{$device}) {
-                        my $subdevice = $device->{$subdevice_name};
+                    foreach my $subdeviceName (keys %{$device}) {
+                        my $subdevice = $device->{$subdeviceName};
                         next unless ref $subdevice eq 'HASH';
                         push @storages,
-                            _getStorage($subdevice, $subdevice_name, $bus_name)
+                            _getStorage($subdevice, $subdeviceName, $busName)
                             if _isStorage($subdevice);
                     }
                 }
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Printers.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Printers.pm
index 447d600..d7dec8f 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Printers.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Printers.pm
@@ -124,20 +124,26 @@ sub _getUSBPrinterSerial {
     return $serial;
 }
 
+# find the ParentIdPrefix value for the printer matching given portname
 sub _getUSBPrefix {
-    my ($printKey, $portName) = @_;
-
-    # find the printer entry matching given portname
-    foreach my $printerKey (values %$printKey) {
-        # look for a subkey with expected content
-        foreach my $subKeyName (keys %$printerKey) {
-            my $subKey = $printerKey->{$subKeyName};
+    my ($print, $portName) = @_;
+
+    # registry data structure:
+    # USBPRINT
+    # └── device
+    #     └── subdevice
+    #         └── Device Parameters
+    #             └── PortName:value
+
+    foreach my $device (values %$print) {
+        foreach my $subdeviceName (keys %$device) {
+            my $subdevice = $device->{$subdeviceName};
             next unless 
-                $subKey->{'Device Parameters/'}                &&
-                $subKey->{'Device Parameters/'}->{'/PortName'} &&
-                $subKey->{'Device Parameters/'}->{'/PortName'} eq $portName;
+                $subdevice->{'Device Parameters/'}                &&
+                $subdevice->{'Device Parameters/'}->{'/PortName'} &&
+                $subdevice->{'Device Parameters/'}->{'/PortName'} eq $portName;
             # got it
-            my $prefix = $subKeyName;
+            my $prefix = $subdeviceName;
             $prefix =~ s{&$portName/$}{};
             return $prefix;
         };
@@ -146,19 +152,24 @@ sub _getUSBPrefix {
     return;
 }
 
+# find the key name for the device matching given parentIdPrefix
 sub _getUSBSerial {
-    my ($usbKey, $prefix) = @_;
+    my ($usb, $prefix) = @_;
+
+    # registry data structure:
+    # USB
+    # └── device
+    #     └── subdevice
+    #         └── ParentIdPrefix:value
 
-    # find the device entry matching given container Id
-    foreach my $deviceKey (values %$usbKey) {
-        # look for a subkey with expected content
-        foreach my $subKeyName (keys %$deviceKey) {
-            my $subKey = $deviceKey->{$subKeyName};
+    foreach my $device (values %$usb) {
+        foreach my $subdeviceName (keys %$device) {
+            my $subdevice = $device->{$subdeviceName};
             next unless
-                $subKey->{'/ParentIdPrefix'} &&
-                $subKey->{'/ParentIdPrefix'} eq $prefix;
+                $subdevice->{'/ParentIdPrefix'} &&
+                $subdevice->{'/ParentIdPrefix'} eq $prefix;
             # got it
-            my $serial = $subKeyName;
+            my $serial = $subdeviceName;
             # pseudo serial generated by windows
             return if $serial =~ /&/;
             $serial =~ s{/$}{};


================================================================
  Commit: c5db7ebed725f76f6f3d9cdcc1bdc6b845f1667c
      https://github.com/fusinv/fusioninventory-agent/commit/c5db7ebed725f76f6f3d9cdcc1bdc6b845f1667c
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-02-26 (Sun, 26 Feb 2012)

  Changed paths:
    M Changes

  Log Message:
  -----------
  reordering: important changes first


diff --git a/Changes b/Changes
index 1a8eec8..51d207b 100644
--- a/Changes
+++ b/Changes
@@ -3,12 +3,7 @@ Revision history for FusionInventory agent
 2.2.0
 
 Major changes:
-* support for OCS account info have been dropped: the agent doesn't store
- arbitrary informations locally anymore
-* support for OCS network discovery and software deployment features within
-  inventory task have been removed, they are dedicated tasks for those purposes
-* fusioninventory-agent-config executable has been dropped, in favor of better
-  documentation
+* large speed improvement: up to 150% for a local inventory
 * better multitasking support:
  - the agent use fork() to run task if needed, instead of running a new process
    from scratch, avoiding the need to use a temporary file to transmit
@@ -23,13 +18,20 @@ Major changes:
     certificate checking is disabled
   - validation is now performed by SSL library, and honours alternative subject
     names, and other subtilities
-* large speed improvement: up to 150% for a local inventory
 * large cleanup of values returned from inventory:
   - unknown values are filtered out
   - strings are trimmed for trailing spaces
-  - irrelevant values, such as controllers type and manufacturer on AIX and
-    HPUX, are filtered out
-* options handling:
+  - irrelevant values, such as windows internal USB serial number, or
+    controllers type and manufacturer on AIX and HPUX, are filtered out
+* installation procedure automatically setup configuration and data directories
+  locations in executable, there is no need to manually configure them anymore
+* removal of useless features:
+  - support for OCS account info have been dropped, the agent doesn't store
+    arbitrary informations locally anymore
+  - support for OCS network discovery and software deployment features within
+    inventory task have been removed, we have better alternatives
+  - useless Ping task has been dropped
+* cleanup of available options:
   - deprecated --nosoft and --nosoftware options have been removed
   - --devlib, --share-dir, --basevardir and --realm options have been
     deprecated, as their values are now computed automatically at installation
@@ -41,11 +43,10 @@ Major changes:
   - --debug option can be specified multiple times, for additional verbosity
   - --no-inventory, --no-ocsdeploy, --no-snmpquery, --no-netdiscovery options
     have been deprecated in favor of a generic --no-task option
+* fusioninventory-agent-config executable has been dropped, in favor of better
+  documentation
 * documentation has been reviewed for consistency in various places where it
   appears (--help output, man page, configuration file)
-* installation procedure automatically setup configuration and data directories
-  locations in executable, there is no need to manually configure them anymore
-* useless Ping task has been dropped
 * XML::TreePP perl module is now used instead of XML::Simple, reducing native
   perl modules dependencies
 * OcsDeploy task is now deprecated. Please continue to use the 2.1.x agent is


================================================================
  Commit: a6c9f8b4c3ade2021895df2c1f241eb84cbb58bf
      https://github.com/fusinv/fusioninventory-agent/commit/a6c9f8b4c3ade2021895df2c1f241eb84cbb58bf
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-02-28 (Tue, 28 Feb 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Bios.pm
    M lib/FusionInventory/Agent/Task/Inventory/Inventory.pm

  Log Message:
  -----------
  use MSN for motherboard serial, and drop any usage of BASEBOARDSERIAL


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Bios.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Bios.pm
index a3d02be..5ec74eb 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Bios.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Bios.pm
@@ -74,9 +74,10 @@ sub doInventory {
                 SerialNumber Product Manufacturer
             / ]
     )) {
-        $bios->{BASEBOARDSERIAL} = $object->{SerialNumber};
-        $bios->{SSN}             = $object->{SerialNumber} unless $bios->{SSN};
+        $bios->{MSN}             = $object->{SerialNumber};
         $bios->{MMODEL}          = $object->{Product};
+        $bios->{SSN}             = $object->{SerialNumber}
+            unless $bios->{SSN};
         $bios->{SMANUFACTURER}   = $object->{Manufacturer}
             unless $bios->{SMANUFACTURER};
 
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Inventory.pm b/lib/FusionInventory/Agent/Task/Inventory/Inventory.pm
index ab36038..ecabd02 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Inventory.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Inventory.pm
@@ -534,8 +534,6 @@ Motherboard model
 
 =item ENCLOSURESERIAL
 
-=item BASEBOARDSERIAL
-
 =item BIOSSERIAL
 
 The optional asset tag for this machine.


================================================================
  Commit: 805d256a483a72e018ec56718c00372c7dcfb5f3
      https://github.com/fusinv/fusioninventory-agent/commit/805d256a483a72e018ec56718c00372c7dcfb5f3
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-02-28 (Tue, 28 Feb 2012)

  Changed paths:
    A resources/win32/README
    A resources/win32/wmi/xppro2-CIM_LogicalDevice.wmi
    M t/inventory/windows/usb.t

  Log Message:
  -----------
  add windows XP wmi output


diff --git a/resources/win32/README b/resources/win32/README
new file mode 100644
index 0000000..92b1517
--- /dev/null
+++ b/resources/win32/README
@@ -0,0 +1,6 @@
+Windows specific command and file samples
+
+wmi: wmi queries results
+- *-CIM_LogicalDevice: wmic path CIM_LogicalDevice get /Format:list
+
+registry: registry exports
diff --git a/resources/win32/wmi/xppro2-CIM_LogicalDevice.wmi b/resources/win32/wmi/xppro2-CIM_LogicalDevice.wmi
new file mode 100644
index 0000000..010bbba
Binary files /dev/null and b/resources/win32/wmi/xppro2-CIM_LogicalDevice.wmi differ
diff --git a/t/inventory/windows/usb.t b/t/inventory/windows/usb.t
index 6cc447f..f8a5147 100755
--- a/t/inventory/windows/usb.t
+++ b/t/inventory/windows/usb.t
@@ -48,6 +48,41 @@ my %tests = (
             VENDORID  => '046D',
             PRODUCTID => 'C30A'
         },
+    ],
+    xppro2 => [
+        {
+            NAME      => "Concentrador USB genérico",
+            VENDORID  => '046A',
+            PRODUCTID => '0009'
+        },
+        {
+            NAME      => 'Dispositivo compuesto USB',
+            VENDORID  => '046A',
+            PRODUCTID => '0019'
+        },
+        {
+            NAME      => 'SmartTerminal XX44',
+            VENDORID  => '046A',
+            PRODUCTID => '002D'
+        },
+        {
+            NAME      => 'Compatibilidad con impresoras USB',
+            SERIAL    => 'JV40VNJ',
+            VENDORID  => '03F0',
+            PRODUCTID => '3A17'
+        },
+        {
+            NAME      => 'Compatibilidad con impresoras USB',
+            SERIAL    => 'J5J126789',
+            VENDORID  => '04F9',
+            PRODUCTID => '002B'
+        },
+        {
+            NAME      => 'Dispositivo compuesto USB',
+            SERIAL    => '00CNBW86S20B',
+            VENDORID  => '03F0',
+            PRODUCTID => '3817'
+        }
     ]
 );
 


================================================================
  Commit: 45ec7d311ed32d8662cf595163020b883f54fe9e
      https://github.com/fusinv/fusioninventory-agent/commit/45ec7d311ed32d8662cf595163020b883f54fe9e
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-02-28 (Tue, 28 Feb 2012)

  Changed paths:
    M Changes

  Log Message:
  -----------
  Merge branch '2.1.x' into 2.2.x


diff --git a/Changes b/Changes
index 1a8eec8..3cabc6a 100644
--- a/Changes
+++ b/Changes
@@ -56,7 +56,41 @@ Minor changes:
 * Linux: Use /sbin/ip to get the interface IP addresses (#854)
 * HPUX: don't report unoccupied memory slots
 
-2.1.12  Wed, 14 Dec 2011 13:06:44 +0100
+2.1.14  Wed, 22 Feb 2012 14:56:51 -0000
+
+LINUX
+ ✔ Detected OS is "RedHat" for CentOS servers if lsb_release not available
+       commit:d3a252
+     http://forge.fusioninventory.org/issues/1193
+   thanks: Jonathan Clarke
+
+MACOSX
+ ✔ no-software option doesn't work as advertised
+       commit:18dfaf
+     http://forge.fusioninventory.org/issues/1476
+   thanks: Ronan Mejecaze
+ ✔ syntax error in Video module
+   thanks: Walid Nouh
+
+WINDOWS
+ ✔ No 2007 Microsoft Office system into XML
+       commit:39f3c7
+     http://forge.fusioninventory.org/issues/1065
+   thanks: Walid Nouh, Xavier Caillaud, jerome slayer
+ ✔ On Windows Vista Office 2007 is not correctly gathered
+       commit:39f3c7
+     http://forge.fusioninventory.org/issues/1425
+   thanks: Walid Nouh, Xavier Caillaud
+ ✔ VM System incorrect
+       commit:259996
+     http://forge.fusioninventory.org/issues/1436
+   thanks: Mario Gzuk
+ ✔ Inventory Internet Explorer when it's not present in Add/remove programs
+       commit:39f3c7
+     http://forge.fusioninventory.org/issues/1441
+   thanks: Walid Nouh, Xavier Caillaud, jerome slayer
+
+2.1.13  Wed, 14 Dec 2011 13:06:44 +0100
 
 TEST-SUITE
  ✔ 2.1.10 Test suite fails


================================================================
  Commit: 47588d3ef75794db7fcde27b07de6aae3e1a3ba9
      https://github.com/fusinv/fusioninventory-agent/commit/47588d3ef75794db7fcde27b07de6aae3e1a3ba9
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-02-28 (Tue, 28 Feb 2012)

  Changed paths:
    M Changes
    M etc/agent.cfg
    M fusioninventory-agent
    M lib/FusionInventory/Agent/Task/Inventory.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Environment.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Environment.pm

  Log Message:
  -----------
  add --no-environment option


diff --git a/Changes b/Changes
index 51d207b..ecdc1c9 100644
--- a/Changes
+++ b/Changes
@@ -43,6 +43,7 @@ Major changes:
   - --debug option can be specified multiple times, for additional verbosity
   - --no-inventory, --no-ocsdeploy, --no-snmpquery, --no-netdiscovery options
     have been deprecated in favor of a generic --no-task option
+  - --no-environment allows to not list environment variables in inventory
 * fusioninventory-agent-config executable has been dropped, in favor of better
   documentation
 * documentation has been reviewed for consistency in various places where it
diff --git a/etc/agent.cfg b/etc/agent.cfg
index f2a04e7..e534797 100644
--- a/etc/agent.cfg
+++ b/etc/agent.cfg
@@ -43,6 +43,8 @@ lazy = 0
 no-printer = 0
 # do not list installed software
 no-software = 0
+# do not list environment variables
+no-environment = 0
 # allow to scan use home directories
 scan-homedirs = 0
 # save the inventory as HTML
diff --git a/fusioninventory-agent b/fusioninventory-agent
index bc9dd88..9ea2ba2 100755
--- a/fusioninventory-agent
+++ b/fusioninventory-agent
@@ -39,6 +39,7 @@ GetOptions(
     'no-printer',
     'no-httpd',
     'no-software',
+    'no-environment',
     'no-ssl-check',
     'no-task=s',
     'no-p2p',
@@ -141,6 +142,7 @@ B<fusioninventory-agent> [options] [--server server|--local directory|--sdout]
   Inventory task specific options
     --no-printer        do not list local printers (false)
     --no-software       do not list installed software (false)
+    --no-environment    do not list environment variables (false)
     --scan-homedirs     allow to scan use home directories (false)
     --html              save the inventory as HTML (false)
     -f --force          always send data to server (false)
@@ -365,6 +367,10 @@ Do not list local printers in inventory.
 
 Do not list installed software in inventory.
 
+=item B<--no-environment>
+
+Do not list environment variables in inventory.
+
 =item B<--scan-homedirs>
 
 Allow the agent to scan home directories for virtual machines.
diff --git a/lib/FusionInventory/Agent/Task/Inventory.pm b/lib/FusionInventory/Agent/Task/Inventory.pm
index 51abc38..3a1da64 100644
--- a/lib/FusionInventory/Agent/Task/Inventory.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory.pm
@@ -154,12 +154,13 @@ sub _initModulesList {
             logger => $logger,
             timeout  => $config->{'backend-collect-timeout'},
             params => {
-                datadir       => $self->{datadir},
-                logger        => $self->{logger},
-                registry      => $self->{registry},
-                no_software   => $self->{config}->{'no-software'},
-                no_printer    => $self->{config}->{'no-printer'},
-                scan_homedirs => $self->{config}->{'scan-homedirs'},
+                datadir        => $self->{datadir},
+                logger         => $self->{logger},
+                registry       => $self->{registry},
+                no_software    => $self->{config}->{'no-software'},
+                no_printer     => $self->{config}->{'no-printer'},
+                no_environment => $self->{config}->{'no-environment'},
+                scan_homedirs  => $self->{config}->{'scan-homedirs'},
             }
         );
         if (!$enabled) {
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Environment.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Environment.pm
index e753df8..dce2e6d 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Environment.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Environment.pm
@@ -8,8 +8,12 @@ use warnings;
 use FusionInventory::Agent::Tools;
 
 sub isEnabled {
-    # We use WMI for Windows because of charset issue
-    return $OSNAME ne 'MSWin32';
+    my (%params) = @_;
+
+    return
+        # We use WMI for Windows because of charset issue
+        $OSNAME ne 'MSWin32' &&
+        !$params{no_environment};
 }
 
 sub doInventory {
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Environment.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Environment.pm
index 0cc4eab..2aa5651 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Environment.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Environment.pm
@@ -6,7 +6,9 @@ use warnings;
 use FusionInventory::Agent::Tools::Win32;
 
 sub isEnabled {
-    return 1;
+    my (%params) = @_;
+
+    return !$params{no_environment};
 }
 
 sub doInventory {


================================================================
  Commit: 36e375ca7b9f54f4081b1d45be2afaad10afed1b
      https://github.com/fusinv/fusioninventory-agent/commit/36e375ca7b9f54f4081b1d45be2afaad10afed1b
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-02-29 (Wed, 29 Feb 2012)

  Changed paths:
    M Changes
    M etc/agent.cfg
    M fusioninventory-agent
    M lib/FusionInventory/Agent/Config.pm
    M lib/FusionInventory/Agent/Task/Inventory.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/AIX/Softwares.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Softwares.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Environment.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Printers.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/HPUX/Softwares.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Softwares.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Printers.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Softwares.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Softwares.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Environment.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Printers.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm

  Log Message:
  -----------
  more generic option

obsolete --no-{printer,softwate,environment} in favor of more generic
--no-category option


diff --git a/Changes b/Changes
index ecdc1c9..73837f2 100644
--- a/Changes
+++ b/Changes
@@ -43,7 +43,8 @@ Major changes:
   - --debug option can be specified multiple times, for additional verbosity
   - --no-inventory, --no-ocsdeploy, --no-snmpquery, --no-netdiscovery options
     have been deprecated in favor of a generic --no-task option
-  - --no-environment allows to not list environment variables in inventory
+  - --no-software, --no-printer options have been deprecated in favor of a
+    generic --no-category option, and 'environment' value support has been added
 * fusioninventory-agent-config executable has been dropped, in favor of better
   documentation
 * documentation has been reviewed for consistency in various places where it
diff --git a/etc/agent.cfg b/etc/agent.cfg
index e534797..6167899 100644
--- a/etc/agent.cfg
+++ b/etc/agent.cfg
@@ -40,11 +40,7 @@ lazy = 0
 #
 
 # do not list local printers
-no-printer = 0
-# do not list installed software
-no-software = 0
-# do not list environment variables
-no-environment = 0
+# no-category = printer
 # allow to scan use home directories
 scan-homedirs = 0
 # save the inventory as HTML
diff --git a/fusioninventory-agent b/fusioninventory-agent
index 9ea2ba2..52e6c53 100755
--- a/fusioninventory-agent
+++ b/fusioninventory-agent
@@ -36,10 +36,8 @@ GetOptions(
     'logger=s',
     'logfile=s',
     'logfile-maxsize=i',
-    'no-printer',
+    'no-category=s',
     'no-httpd',
-    'no-software',
-    'no-environment',
     'no-ssl-check',
     'no-task=s',
     'no-p2p',
@@ -63,6 +61,8 @@ GetOptions(
     'no-wakeonlan',
     'no-snmpquery',
     'no-netdiscovery',
+    'no-printer',
+    'no-software',
     'rpc-trust-localhost',
     'rpc-port',
     'rpc-ip',
@@ -140,9 +140,7 @@ B<fusioninventory-agent> [options] [--server server|--local directory|--sdout]
     --no-task=TASK      do not run given task
 
   Inventory task specific options
-    --no-printer        do not list local printers (false)
-    --no-software       do not list installed software (false)
-    --no-environment    do not list environment variables (false)
+    --no-category=CATEGORY do not list given category items
     --scan-homedirs     allow to scan use home directories (false)
     --html              save the inventory as HTML (false)
     -f --force          always send data to server (false)
@@ -359,17 +357,9 @@ List available tasks and exit
 
 =over
 
-=item B<--no-printer>
-
-Do not list local printers in inventory.
-
-=item B<--no-software>
-
-Do not list installed software in inventory.
-
-=item B<--no-environment>
+=item B<--no-category>=I<CATEGORY>
 
-Do not list environment variables in inventory.
+Do not list given category items in inventory.
 
 =item B<--scan-homedirs>
 
diff --git a/lib/FusionInventory/Agent/Config.pm b/lib/FusionInventory/Agent/Config.pm
index ac07bc3..74afddc 100644
--- a/lib/FusionInventory/Agent/Config.pm
+++ b/lib/FusionInventory/Agent/Config.pm
@@ -67,6 +67,14 @@ my $deprecated = {
         message => 'use --no-task ocsdeploy option instead',
         new     => { 'no-task' => 'ocsdeploy' }
     },
+    'no-printer' => {
+        message => 'use --no-category printer option instead',
+        new     => { 'no-category' => 'printer' }
+    },
+    'no-software' => {
+        message => 'use --no-category software option instead',
+        new     => { 'no-category' => 'software' }
+    },
 };
 
 sub new {
@@ -216,6 +224,8 @@ sub _checkContent {
     $self->{server} = [ split(/,/, $self->{server}) ] if $self->{server};
     $self->{'no-task'} = [ split(/,/, $self->{'no-task'}) ]
         if $self->{'no-task'};
+    $self->{'no-category'} = [ split(/,/, $self->{'no-category'}) ]
+        if $self->{'no-category'};
 
     # files location
     $self->{'ca-cert-file'} =
diff --git a/lib/FusionInventory/Agent/Task/Inventory.pm b/lib/FusionInventory/Agent/Task/Inventory.pm
index 3a1da64..0e25fd0 100644
--- a/lib/FusionInventory/Agent/Task/Inventory.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory.pm
@@ -60,8 +60,10 @@ sub run {
         );
     }
 
-    $self->_initModulesList();
-    $self->_feedInventory($inventory);
+    my %disabled = map { $_ => 1 } @{$self->{config}->{'no-category'}};
+
+    $self->_initModulesList(\%disabled);
+    $self->_feedInventory($inventory, \%disabled);
 
     if ($self->{target}->isa('FusionInventory::Agent::Target::Stdout')) {
         $self->_printInventory(
@@ -119,7 +121,7 @@ sub run {
 }
 
 sub _initModulesList {
-    my ($self) = @_;
+    my ($self, $disabled) = @_;
 
     my $logger = $self->{logger};
     my $config = $self->{config};
@@ -154,13 +156,11 @@ sub _initModulesList {
             logger => $logger,
             timeout  => $config->{'backend-collect-timeout'},
             params => {
-                datadir        => $self->{datadir},
-                logger         => $self->{logger},
-                registry       => $self->{registry},
-                no_software    => $self->{config}->{'no-software'},
-                no_printer     => $self->{config}->{'no-printer'},
-                no_environment => $self->{config}->{'no-environment'},
-                scan_homedirs  => $self->{config}->{'scan-homedirs'},
+                no_category   => $disabled,
+                datadir       => $self->{datadir},
+                logger        => $self->{logger},
+                registry      => $self->{registry},
+                scan_homedirs => $self->{config}->{'scan-homedirs'},
             }
         );
         if (!$enabled) {
@@ -206,7 +206,7 @@ sub _initModulesList {
 }
 
 sub _runModule {
-    my ($self, $module, $inventory) = @_;
+    my ($self, $module, $inventory, $disabled) = @_;
 
     my $logger = $self->{logger};
 
@@ -225,7 +225,7 @@ sub _runModule {
         die "circular dependency between $module and $other_module"
             if $self->{modules}->{$other_module}->{used};
 
-        $self->_runModule($other_module, $inventory);
+        $self->_runModule($other_module, $inventory, $disabled);
     }
 
     $logger->debug("Running $module");
@@ -238,10 +238,9 @@ sub _runModule {
         params => {
             datadir       => $self->{datadir},
             inventory     => $inventory,
+            no_category   => $disabled,
             logger        => $self->{logger},
             registry      => $self->{registry},
-            no_software   => $self->{config}->{no_software},
-            no_printer    => $self->{config}->{no_printer},
             scan_homedirs => $self->{config}->{'scan-homedirs'},
         }
     );
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/AIX/Softwares.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/AIX/Softwares.pm
index 0597530..430555d 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/AIX/Softwares.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/AIX/Softwares.pm
@@ -9,7 +9,7 @@ sub isEnabled {
     my (%params) = @_;
 
     return
-        !$params{no_software} &&
+        !$params{no_category} &&
         canRun('lslpp');
 }
 
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Softwares.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Softwares.pm
index 9376672..1bc71c0 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Softwares.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Softwares.pm
@@ -9,7 +9,7 @@ sub isEnabled {
     my (%params) = @_;
 
     return
-        !$params{no_software} &&
+        !$params{no_category}->{software} &&
         canRun('pkg_info');
 }
 
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Environment.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Environment.pm
index dce2e6d..8df1b17 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Environment.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Environment.pm
@@ -13,7 +13,7 @@ sub isEnabled {
     return
         # We use WMI for Windows because of charset issue
         $OSNAME ne 'MSWin32' &&
-        !$params{no_environment};
+        !$params{no_category}->{environment};
 }
 
 sub doInventory {
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Printers.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Printers.pm
index 272964c..e9e4677 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Printers.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Printers.pm
@@ -13,7 +13,7 @@ sub isEnabled {
     return 
         # we use system profiler on MacOS
         $OSNAME ne 'darwin' &&
-        !$params{no_printer} &&
+        !$params{no_category}->{printer} &&
         canLoad("Net::CUPS") &&
         $Net::CUPS::VERSION >= 0.60;
 }
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/HPUX/Softwares.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/HPUX/Softwares.pm
index 3d20576..9ec009e 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/HPUX/Softwares.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/HPUX/Softwares.pm
@@ -9,7 +9,7 @@ sub isEnabled  {
     my (%params) = @_;
 
     return
-        !$params{no_software} &&
+        !$params{no_category}->{software} &&
         canRun('swlist');
 }
 
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Softwares.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Softwares.pm
index 2bfae86..d9db905 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Softwares.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Softwares.pm
@@ -8,7 +8,7 @@ use FusionInventory::Agent::Tools;
 sub isEnabled {
     my (%params) = @_;
 
-    return !$params{no_software};
+    return !$params{no_category}->{software};
 }
 
 sub doInventory {
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Printers.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Printers.pm
index f1649f2..1c2de9f 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Printers.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Printers.pm
@@ -9,7 +9,7 @@ sub isEnabled {
     my (%params) = @_;
 
     return 
-        !$params{no_printer} &&
+        !$params{no_category}->{printer} &&
         -r '/usr/sbin/system_profiler' &&
         canLoad("Mac::SysProfile");
 }
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Softwares.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Softwares.pm
index 3a3a5fc..917e901 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Softwares.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Softwares.pm
@@ -9,7 +9,7 @@ sub isEnabled {
     my (%params) = @_;
 
     return
-        !$params{no_software} &&
+        !$params{no_category}->{software} &&
         -r '/usr/sbin/system_profiler' &&
         canLoad("Mac::SysProfile");
 }
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Softwares.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Softwares.pm
index 4d63288..d2274ed 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Softwares.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Softwares.pm
@@ -9,7 +9,7 @@ sub isEnabled {
     my (%params) = @_;
 
     return 
-        !$params{no_software} &&
+        !$params{no_category}->{software} &&
         canRun('pkginfo');
 }
 
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Environment.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Environment.pm
index 2aa5651..93e02b4 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Environment.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Environment.pm
@@ -8,7 +8,7 @@ use FusionInventory::Agent::Tools::Win32;
 sub isEnabled {
     my (%params) = @_;
 
-    return !$params{no_environment};
+    return !$params{no_category}->{environment};
 }
 
 sub doInventory {
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Printers.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Printers.pm
index d7dec8f..d74b45b 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Printers.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Printers.pm
@@ -44,7 +44,8 @@ my @errStatus = (
 
 sub isEnabled {
     my (%params) = @_;
-    return !$params{no_printer};
+
+    return !$params{no_category}->{printer};
 }
 
 sub doInventory {
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm
index 2c2272f..6b11a72 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm
@@ -20,7 +20,7 @@ my $seen;
 sub isEnabled {
     my (%params) = @_;
 
-    return !$params{no_software};
+    return !$params{no_category}->{software};
 }
 
 sub doInventory {


================================================================
  Commit: 9ba42420b3ce8455cd5d115dd93880824b63725a
      https://github.com/fusinv/fusioninventory-agent/commit/9ba42420b3ce8455cd5d115dd93880824b63725a
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-02-29 (Wed, 29 Feb 2012)

  Changed paths:
    M t/apps/agent.t

  Log Message:
  -----------
  multiple changes:

- test environment variable exclusion
- use new option syntax
- use an already-existing environement variable to test its value
- rework tests description for consistency


diff --git a/t/apps/agent.t b/t/apps/agent.t
index 51f0fa7..ec53755 100755
--- a/t/apps/agent.t
+++ b/t/apps/agent.t
@@ -10,7 +10,7 @@ use XML::TreePP;
 
 use FusionInventory::Agent::Tools;
 
-use Test::More tests => 32;
+use Test::More tests => 37;
 
 my ($out, $err, $rc);
 
@@ -42,10 +42,12 @@ like(
 );
 is($out, '', 'no target stdin');
 
+my $base_options = "--stdout --no-task ocsdeploy,wakeonlan,snmpquery,netdiscovery";
+
 my $content;
 # first inventory
 ($out, $err, $rc) = run_agent(
-    "--stdout --no-ocsdeploy --no-wakeonlan --no-snmpquery --no-netdiscovery --no-printer"
+    "$base_options --no-category printer"
 );
 ok($rc == 0, 'exit status');
 
@@ -70,7 +72,7 @@ ok(
 
 # second inventory, without software
 ($out, $err, $rc) = run_agent(
-    "--stdout --no-ocsdeploy --no-wakeonlan --no-snmpquery --no-netdiscovery --no-printer --no-software"
+    "$base_options --no-category printer,software"
 );
 ok($rc == 0, 'exit status');
 
@@ -109,7 +111,7 @@ print $file <<EOF;
 EOF
 close($file);
 ($out, $err, $rc) = run_agent(
-    "--stdout --no-ocsdeploy --no-wakeonlan --no-snmpquery --no-netdiscovery --no-printer --no-software --additional-content $file"
+    "$base_options --no-category printer,software --additional-content $file"
 );
 ok($rc == 0, 'exit status');
 
@@ -129,7 +131,7 @@ ok(
 
 ok(
     ref $content->{REQUEST}->{CONTENT}->{SOFTWARES} eq 'HASH',
-    'software list has only one element'
+    'inventory has expected software list'
 );
 
 ok(
@@ -143,11 +145,10 @@ ok(
     'inventory has environment variables'
 );
 
-# create inventory targets
-$ENV{FOO} = 'bar';
+my $path = $ENV{PATH};
 
 ($out, $err, $rc) = run_agent(
-    "--stdout --no-ocsdeploy --no-wakeonlan --no-snmpquery --no-netdiscovery --no-printer --no-software"
+    "$base_options --no-category printer,software"
 );
 ok($rc == 0, 'exit status');
 
@@ -162,7 +163,7 @@ ok($content, 'output is valid XML');
 
 ok(
     !exists $content->{REQUEST}->{CONTENT}->{SOFTWARES},
-    "output doesn't have any software"
+    "inventory doesn't have any software"
 );
 
 ok(
@@ -170,16 +171,37 @@ ok(
     'inventory has environment variables'
 );
 
-SKIP: {
-skip '$ENV not set by IPC::Run on Windows', 1 if $OSNAME eq 'MSWin32';
 ok(
     (any
-        { $_->{KEY} eq 'FOO' && $_->{VAL} eq 'bar' } 
+        { $_->{KEY} eq 'PATH' && $_->{VAL} eq $path } 
         @{$content->{REQUEST}->{CONTENT}->{ENVS}}
     ),
-    'expected environment variable'
+    'inventory has expected environment variable value'
+);
+
+($out, $err, $rc) = run_agent(
+    "$base_options --no-category printer,software,environment"
+);
+ok($rc == 0, 'exit status');
+
+like(
+    $out,
+    qr/^<\?xml version="1.0" encoding="UTF-8" \?>/,
+    'output has correct encoding'
+);
+
+$content = XML::TreePP->new()->parse($out);
+ok($content, 'output is valid XML');
+
+ok(
+    !exists $content->{REQUEST}->{CONTENT}->{SOFTWARES},
+    "inventory doesn't have any software"
+);
+
+ok(
+    !exists $content->{REQUEST}->{CONTENT}->{ENVS},
+    "inventory doesn't have any environment variables"
 );
-}
 
 sub run_agent {
     my ($args) = @_;


================================================================
  Commit: 7a93c8d4a71a9beec5e9b556eccaccf9831480e1
      https://github.com/fusinv/fusioninventory-agent/commit/7a93c8d4a71a9beec5e9b556eccaccf9831480e1
  Author: Guillaume Rousse <guillomovitch at gmail.com>
  Date:   2012-02-29 (Wed, 29 Feb 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/OS.pm
    M lib/FusionInventory/Agent/Task/Inventory/Inventory.pm

  Log Message:
  -----------
  add os installation date


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/OS.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/OS.pm
index 6e7ce84..2795421 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/OS.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/OS.pm
@@ -6,6 +6,7 @@ use integer;
 
 use English qw(-no_match_vars);
 
+use FusionInventory::Agent::Tools;
 use FusionInventory::Agent::Tools::Hostname;
 use FusionInventory::Agent::Tools::Win32;
 
@@ -32,21 +33,28 @@ sub doInventory {
             path   => 'HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/lanmanserver/Parameters/srvcomment',
             logger => $logger
         ));
+        my $installDate = getFormatedLocalTime(hex2dec(
+            encodeFromRegistry(getRegistryValue(
+                path   => 'HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/InstallDate',
+                logger => $logger
+            ))
+        ));
 
         $object->{TotalSwapSpaceSize} = int($object->{TotalSwapSpaceSize} / (1024 * 1024))
             if $object->{TotalSwapSpaceSize};
 
         $inventory->setHardware({
-            WINLANG     => $object->{OSLanguage},
-            OSNAME      => $object->{Caption},
-            OSVERSION   => $object->{Version},
-            WINPRODKEY  => $key,
-            WINPRODID   => $object->{SerialNumber},
-            WINCOMPANY  => $object->{Organization},
-            WINOWNER    => $object->{RegistredUser},
-            OSCOMMENTS  => $object->{CSDVersion},
-            SWAP        => $object->{TotalSwapSpaceSize},
-            DESCRIPTION => $description,
+            WINLANG       => $object->{OSLanguage},
+            OSNAME        => $object->{Caption},
+            OSVERSION     => $object->{Version},
+            WINPRODKEY    => $key,
+            WINPRODID     => $object->{SerialNumber},
+            WINCOMPANY    => $object->{Organization},
+            WINOWNER      => $object->{RegistredUser},
+            OSCOMMENTS    => $object->{CSDVersion},
+            SWAP          => $object->{TotalSwapSpaceSize},
+            DESCRIPTION   => $description,
+            OSINSTALLDATE => $installDate
         });
 
         $inventory->setOperatingSystem({
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Inventory.pm b/lib/FusionInventory/Agent/Task/Inventory/Inventory.pm
index ab36038..8670277 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Inventory.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Inventory.pm
@@ -242,7 +242,7 @@ sub setHardware {
         PROCESSORT NAME PROCESSORS SWAP ETIME TYPE OSNAME IPADDR WORKGROUP
         DESCRIPTION MEMORY UUID DNS LASTLOGGEDUSER USERDOMAIN
         DATELASTLOGGEDUSER DEFAULTGATEWAY VMSYSTEM WINOWNER WINPRODID
-        WINPRODKEY WINCOMPANY WINLANG CHASSIS_TYPE/) {
+        WINPRODKEY WINCOMPANY WINLANG CHASSIS_TYPE OSINSTALLDATE/) {
 # WINLANG: Windows Language, see MSDN Win32_OperatingSystem documentation
         if (exists $args->{$key}) {
             my $string = getSanitizedString($args->{$key});


================================================================
  Commit: 6a76ddad4c078568c2a19f72fbc50055153e977f
      https://github.com/fusinv/fusioninventory-agent/commit/6a76ddad4c078568c2a19f72fbc50055153e977f
  Author: Guillaume Rousse <guillomovitch at gmail.com>
  Date:   2012-02-29 (Wed, 29 Feb 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Inventory.pm

  Log Message:
  -----------
  add Ipv6 attributes


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Inventory.pm b/lib/FusionInventory/Agent/Task/Inventory/Inventory.pm
index 8670277..474cc08 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Inventory.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Inventory.pm
@@ -32,7 +32,7 @@ my %fields = (
     NETWORKS    => [ qw/DESCRIPTION DRIVER IPADDRESS IPADDRESS6 IPDHCP IPGATEWAY
                         IPMASK IPSUBNET MACADDR MTU PCISLOT PNPDEVICEID STATUS
                         TYPE VIRTUALDEV SLAVES SPEED MANAGEMENT BSSID SSID WWN
-                        MANUFACTURER FIRMWARE MODEL/ ],
+                        MANUFACTURER FIRMWARE MODEL IPMASK6 IPSUBNET6/ ],
     PORTS       => [ qw/CAPTION DESCRIPTION NAME TYPE/ ],
     PROCESSES   => [ qw/USER PID CPUUSAGE MEM VIRTUALMEMORY TTY STARTED CMD/ ],
     REGISTRY    => [ qw/NAME REGVALUE HIVE/ ],


================================================================
  Commit: 4dcdaca0b0ca630720b1268b85ea8639e107a06f
      https://github.com/fusinv/fusioninventory-agent/commit/4dcdaca0b0ca630720b1268b85ea8639e107a06f
  Author: Guillaume Rousse <guillomovitch at gmail.com>
  Date:   2012-02-29 (Wed, 29 Feb 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Inventory.pm

  Log Message:
  -----------
  alphabetical order sort


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Inventory.pm b/lib/FusionInventory/Agent/Task/Inventory/Inventory.pm
index 474cc08..2362ae3 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Inventory.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Inventory.pm
@@ -29,10 +29,11 @@ my %fields = (
     MODEMS      => [ qw/DESCRIPTION NAME/ ],
     MONITORS    => [ qw/BASE64 CAPTION DESCRIPTION MANUFACTURER SERIAL
                         UUENCODE/ ],
-    NETWORKS    => [ qw/DESCRIPTION DRIVER IPADDRESS IPADDRESS6 IPDHCP IPGATEWAY
-                        IPMASK IPSUBNET MACADDR MTU PCISLOT PNPDEVICEID STATUS
-                        TYPE VIRTUALDEV SLAVES SPEED MANAGEMENT BSSID SSID WWN
-                        MANUFACTURER FIRMWARE MODEL IPMASK6 IPSUBNET6/ ],
+    NETWORKS    => [ qw/BSSID DESCRIPTION DRIVER FIRMWARE IPADDRESS IPADDRESS6 
+                        IPDHCP IPGATEWAY IPMASK IPMASK6 IPSUBNET IPSUBNET6
+                        MANAGEMENT MANUFACTURER MACADDR MODEL MTU PCISLOT 
+                        PNPDEVICEID STATUS SLAVES SPEED SSID TYPE VIRTUALDEV  
+                        WWN/ ],
     PORTS       => [ qw/CAPTION DESCRIPTION NAME TYPE/ ],
     PROCESSES   => [ qw/USER PID CPUUSAGE MEM VIRTUALMEMORY TTY STARTED CMD/ ],
     REGISTRY    => [ qw/NAME REGVALUE HIVE/ ],


================================================================
  Commit: 92676b285f1da2450fcd728fd40a26802d2ef59f
      https://github.com/fusinv/fusioninventory-agent/commit/92676b285f1da2450fcd728fd40a26802d2ef59f
  Author: Guillaume Rousse <guillomovitch at gmail.com>
  Date:   2012-02-29 (Wed, 29 Feb 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Inventory.pm

  Log Message:
  -----------
  cosmetics


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Inventory.pm b/lib/FusionInventory/Agent/Task/Inventory/Inventory.pm
index 2362ae3..e6a8994 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Inventory.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Inventory.pm
@@ -52,11 +52,14 @@ my %fields = (
     PRINTERS    => [ qw/COMMENT DESCRIPTION DRIVER NAME NETWORK PORT RESOLUTION
                         SHARED STATUS ERRSTATUS SERVERNAME SHARENAME 
                         PRINTPROCESSOR SERIAL/ ],
-    VIRTUALMACHINES => [ qw/MEMORY NAME UUID STATUS SUBSYSTEM VMTYPE VCPU
-                            VMID MAC COMMENT OWNER/ ],
-    LOGICAL_VOLUMES => [ qw/LV_NAME VGN_AME ATTR SIZE LV_UUID SEG_COUNT VG_UUID/ ],
-    PHYSICAL_VOLUMES => [ qw/DEVICE PV_NAME PV_PE_COUNT PV_UUID FORMAT ATTR SIZE FREE PE_SIZE/ ],
-    VOLUME_GROUPS => [ qw/VG_NAME PV_COUNT LV_COUNT ATTR SIZE FREE VG_UUID VG_EXTENT_SIZE/ ],
+    VIRTUALMACHINES  => [ qw/MEMORY NAME UUID STATUS SUBSYSTEM VMTYPE VCPU
+                             VMID MAC COMMENT OWNER/ ],
+    LOGICAL_VOLUMES  => [ qw/LV_NAME VGN_AME ATTR SIZE LV_UUID SEG_COUNT 
+                             VG_UUID/ ],
+    PHYSICAL_VOLUMES => [ qw/DEVICE PV_NAME PV_PE_COUNT PV_UUID FORMAT ATTR 
+                             SIZE FREE PE_SIZE/ ],
+    VOLUME_GROUPS    => [ qw/VG_NAME PV_COUNT LV_COUNT ATTR SIZE FREE VG_UUID 
+                             VG_EXTENT_SIZE/ ],
 
 );
 


================================================================
  Commit: f1b4c736036d97bd74fcb671e8d95dd1d4283e3f
      https://github.com/fusinv/fusioninventory-agent/commit/f1b4c736036d97bd74fcb671e8d95dd1d4283e3f
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-02-29 (Wed, 29 Feb 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/OS.pm
    M lib/FusionInventory/Agent/Task/Inventory/Inventory.pm

  Log Message:
  -----------
  Merge remote-tracking branch 'origin/2.2.x' into 2.2.x


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/OS.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/OS.pm
index 6e7ce84..2795421 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/OS.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/OS.pm
@@ -6,6 +6,7 @@ use integer;
 
 use English qw(-no_match_vars);
 
+use FusionInventory::Agent::Tools;
 use FusionInventory::Agent::Tools::Hostname;
 use FusionInventory::Agent::Tools::Win32;
 
@@ -32,21 +33,28 @@ sub doInventory {
             path   => 'HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/lanmanserver/Parameters/srvcomment',
             logger => $logger
         ));
+        my $installDate = getFormatedLocalTime(hex2dec(
+            encodeFromRegistry(getRegistryValue(
+                path   => 'HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/InstallDate',
+                logger => $logger
+            ))
+        ));
 
         $object->{TotalSwapSpaceSize} = int($object->{TotalSwapSpaceSize} / (1024 * 1024))
             if $object->{TotalSwapSpaceSize};
 
         $inventory->setHardware({
-            WINLANG     => $object->{OSLanguage},
-            OSNAME      => $object->{Caption},
-            OSVERSION   => $object->{Version},
-            WINPRODKEY  => $key,
-            WINPRODID   => $object->{SerialNumber},
-            WINCOMPANY  => $object->{Organization},
-            WINOWNER    => $object->{RegistredUser},
-            OSCOMMENTS  => $object->{CSDVersion},
-            SWAP        => $object->{TotalSwapSpaceSize},
-            DESCRIPTION => $description,
+            WINLANG       => $object->{OSLanguage},
+            OSNAME        => $object->{Caption},
+            OSVERSION     => $object->{Version},
+            WINPRODKEY    => $key,
+            WINPRODID     => $object->{SerialNumber},
+            WINCOMPANY    => $object->{Organization},
+            WINOWNER      => $object->{RegistredUser},
+            OSCOMMENTS    => $object->{CSDVersion},
+            SWAP          => $object->{TotalSwapSpaceSize},
+            DESCRIPTION   => $description,
+            OSINSTALLDATE => $installDate
         });
 
         $inventory->setOperatingSystem({
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Inventory.pm b/lib/FusionInventory/Agent/Task/Inventory/Inventory.pm
index ecabd02..df701fd 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Inventory.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Inventory.pm
@@ -29,10 +29,11 @@ my %fields = (
     MODEMS      => [ qw/DESCRIPTION NAME/ ],
     MONITORS    => [ qw/BASE64 CAPTION DESCRIPTION MANUFACTURER SERIAL
                         UUENCODE/ ],
-    NETWORKS    => [ qw/DESCRIPTION DRIVER IPADDRESS IPADDRESS6 IPDHCP IPGATEWAY
-                        IPMASK IPSUBNET MACADDR MTU PCISLOT PNPDEVICEID STATUS
-                        TYPE VIRTUALDEV SLAVES SPEED MANAGEMENT BSSID SSID WWN
-                        MANUFACTURER FIRMWARE MODEL/ ],
+    NETWORKS    => [ qw/BSSID DESCRIPTION DRIVER FIRMWARE IPADDRESS IPADDRESS6 
+                        IPDHCP IPGATEWAY IPMASK IPMASK6 IPSUBNET IPSUBNET6
+                        MANAGEMENT MANUFACTURER MACADDR MODEL MTU PCISLOT 
+                        PNPDEVICEID STATUS SLAVES SPEED SSID TYPE VIRTUALDEV  
+                        WWN/ ],
     PORTS       => [ qw/CAPTION DESCRIPTION NAME TYPE/ ],
     PROCESSES   => [ qw/USER PID CPUUSAGE MEM VIRTUALMEMORY TTY STARTED CMD/ ],
     REGISTRY    => [ qw/NAME REGVALUE HIVE/ ],
@@ -51,11 +52,14 @@ my %fields = (
     PRINTERS    => [ qw/COMMENT DESCRIPTION DRIVER NAME NETWORK PORT RESOLUTION
                         SHARED STATUS ERRSTATUS SERVERNAME SHARENAME 
                         PRINTPROCESSOR SERIAL/ ],
-    VIRTUALMACHINES => [ qw/MEMORY NAME UUID STATUS SUBSYSTEM VMTYPE VCPU
-                            VMID MAC COMMENT OWNER/ ],
-    LOGICAL_VOLUMES => [ qw/LV_NAME VGN_AME ATTR SIZE LV_UUID SEG_COUNT VG_UUID/ ],
-    PHYSICAL_VOLUMES => [ qw/DEVICE PV_NAME PV_PE_COUNT PV_UUID FORMAT ATTR SIZE FREE PE_SIZE/ ],
-    VOLUME_GROUPS => [ qw/VG_NAME PV_COUNT LV_COUNT ATTR SIZE FREE VG_UUID VG_EXTENT_SIZE/ ],
+    VIRTUALMACHINES  => [ qw/MEMORY NAME UUID STATUS SUBSYSTEM VMTYPE VCPU
+                             VMID MAC COMMENT OWNER/ ],
+    LOGICAL_VOLUMES  => [ qw/LV_NAME VGN_AME ATTR SIZE LV_UUID SEG_COUNT 
+                             VG_UUID/ ],
+    PHYSICAL_VOLUMES => [ qw/DEVICE PV_NAME PV_PE_COUNT PV_UUID FORMAT ATTR 
+                             SIZE FREE PE_SIZE/ ],
+    VOLUME_GROUPS    => [ qw/VG_NAME PV_COUNT LV_COUNT ATTR SIZE FREE VG_UUID 
+                             VG_EXTENT_SIZE/ ],
 
 );
 
@@ -242,7 +246,7 @@ sub setHardware {
         PROCESSORT NAME PROCESSORS SWAP ETIME TYPE OSNAME IPADDR WORKGROUP
         DESCRIPTION MEMORY UUID DNS LASTLOGGEDUSER USERDOMAIN
         DATELASTLOGGEDUSER DEFAULTGATEWAY VMSYSTEM WINOWNER WINPRODID
-        WINPRODKEY WINCOMPANY WINLANG CHASSIS_TYPE/) {
+        WINPRODKEY WINCOMPANY WINLANG CHASSIS_TYPE OSINSTALLDATE/) {
 # WINLANG: Windows Language, see MSDN Win32_OperatingSystem documentation
         if (exists $args->{$key}) {
             my $string = getSanitizedString($args->{$key});


================================================================
  Commit: 8d3adc4335d270b26d0a18d6b58e07e99dfab61b
      https://github.com/fusinv/fusioninventory-agent/commit/8d3adc4335d270b26d0a18d6b58e07e99dfab61b
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-03-01 (Thu, 01 Mar 2012)

  Changed paths:
    M Changes
    M etc/agent.cfg
    M fusioninventory-agent
    M lib/FusionInventory/Agent/Config.pm
    M lib/FusionInventory/Agent/HTTP/Protocol/https.pm
    M lib/FusionInventory/Agent/HTTP/Server.pm
    M lib/FusionInventory/Agent/Target/Server.pm
    M lib/FusionInventory/Agent/Task/Inventory.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/AIX/LVM.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/AIX/Softwares.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/Alpha.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/MIPS.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/SPARC.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Memory.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Softwares.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Dmidecode/Bios.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Environment.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Printers.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Storages/HP.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/HPUX.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/HPUX/Memory.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/HPUX/Softwares.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Linux.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Archs/ARM.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Archs/SPARC.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Archs/i386.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Linux/LVM.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Networks.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Softwares.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Storages/Adaptec.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Videos.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Linux/iLO.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/MacOS.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Hostname.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Printers.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Softwares.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Storages.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Videos.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Bios.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Memory.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Slots.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Softwares.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/Libvirt.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/Parallels.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/SolarisZones.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/VmWareDesktop.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/Xen.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/AntiVirus.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Bios.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/CPU.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Controllers.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Drives.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Environment.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Inputs.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/OS.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Printers.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm
    M lib/FusionInventory/Agent/Task/Inventory/Inventory.pm
    M lib/FusionInventory/Agent/Tools.pm
    M lib/FusionInventory/Agent/Tools/AIX.pm
    M lib/FusionInventory/Agent/Tools/Generic.pm
    M lib/FusionInventory/Agent/Tools/HPUX.pm
    M lib/FusionInventory/Agent/Tools/Linux.pm
    M lib/FusionInventory/Agent/Tools/MacOS.pm
    M lib/FusionInventory/Agent/Tools/Network.pm
    M lib/FusionInventory/Agent/Tools/Unix.pm
    M lib/FusionInventory/Agent/Tools/Win32.pm
    M lib/FusionInventory/Agent/XML/Query.pm
    A resources/win32/README
    A resources/win32/wmi/xppro2-CIM_LogicalDevice.wmi
    M t/05var.t
    M t/apps/agent.t
    A t/inventory/macos/storages.t
    R t/inventory/macos/video.t
    A t/inventory/macos/videos.t
    M t/inventory/windows/printers.t
    M t/inventory/windows/usb.t
    M t/tools/macos.t

  Log Message:
  -----------
  Merge remote-tracking branch 'origin/2.2.x' into 2.2.x


diff --git a/Changes b/Changes
index 3cabc6a..a6da7ba 100644
--- a/Changes
+++ b/Changes
@@ -3,12 +3,7 @@ Revision history for FusionInventory agent
 2.2.0
 
 Major changes:
-* support for OCS account info have been dropped: the agent doesn't store
- arbitrary informations locally anymore
-* support for OCS network discovery and software deployment features within
-  inventory task have been removed, they are dedicated tasks for those purposes
-* fusioninventory-agent-config executable has been dropped, in favor of better
-  documentation
+* large speed improvement: up to 150% for a local inventory
 * better multitasking support:
  - the agent use fork() to run task if needed, instead of running a new process
    from scratch, avoiding the need to use a temporary file to transmit
@@ -23,13 +18,20 @@ Major changes:
     certificate checking is disabled
   - validation is now performed by SSL library, and honours alternative subject
     names, and other subtilities
-* large speed improvement: up to 150% for a local inventory
 * large cleanup of values returned from inventory:
   - unknown values are filtered out
   - strings are trimmed for trailing spaces
-  - irrelevant values, such as controllers type and manufacturer on AIX and
-    HPUX, are filtered out
-* options handling:
+  - irrelevant values, such as windows internal USB serial number, or
+    controllers type and manufacturer on AIX and HPUX, are filtered out
+* installation procedure automatically setup configuration and data directories
+  locations in executable, there is no need to manually configure them anymore
+* removal of useless features:
+  - support for OCS account info have been dropped, the agent doesn't store
+    arbitrary informations locally anymore
+  - support for OCS network discovery and software deployment features within
+    inventory task have been removed, we have better alternatives
+  - useless Ping task has been dropped
+* cleanup of available options:
   - deprecated --nosoft and --nosoftware options have been removed
   - --devlib, --share-dir, --basevardir and --realm options have been
     deprecated, as their values are now computed automatically at installation
@@ -41,11 +43,12 @@ Major changes:
   - --debug option can be specified multiple times, for additional verbosity
   - --no-inventory, --no-ocsdeploy, --no-snmpquery, --no-netdiscovery options
     have been deprecated in favor of a generic --no-task option
+  - --no-software, --no-printer options have been deprecated in favor of a
+    generic --no-category option, and 'environment' value support has been added
+* fusioninventory-agent-config executable has been dropped, in favor of better
+  documentation
 * documentation has been reviewed for consistency in various places where it
   appears (--help output, man page, configuration file)
-* installation procedure automatically setup configuration and data directories
-  locations in executable, there is no need to manually configure them anymore
-* useless Ping task has been dropped
 * XML::TreePP perl module is now used instead of XML::Simple, reducing native
   perl modules dependencies
 * OcsDeploy task is now deprecated. Please continue to use the 2.1.x agent is
diff --git a/etc/agent.cfg b/etc/agent.cfg
index f2a04e7..6167899 100644
--- a/etc/agent.cfg
+++ b/etc/agent.cfg
@@ -40,9 +40,7 @@ lazy = 0
 #
 
 # do not list local printers
-no-printer = 0
-# do not list installed software
-no-software = 0
+# no-category = printer
 # allow to scan use home directories
 scan-homedirs = 0
 # save the inventory as HTML
diff --git a/fusioninventory-agent b/fusioninventory-agent
index bc9dd88..52e6c53 100755
--- a/fusioninventory-agent
+++ b/fusioninventory-agent
@@ -36,9 +36,8 @@ GetOptions(
     'logger=s',
     'logfile=s',
     'logfile-maxsize=i',
-    'no-printer',
+    'no-category=s',
     'no-httpd',
-    'no-software',
     'no-ssl-check',
     'no-task=s',
     'no-p2p',
@@ -62,6 +61,8 @@ GetOptions(
     'no-wakeonlan',
     'no-snmpquery',
     'no-netdiscovery',
+    'no-printer',
+    'no-software',
     'rpc-trust-localhost',
     'rpc-port',
     'rpc-ip',
@@ -139,8 +140,7 @@ B<fusioninventory-agent> [options] [--server server|--local directory|--sdout]
     --no-task=TASK      do not run given task
 
   Inventory task specific options
-    --no-printer        do not list local printers (false)
-    --no-software       do not list installed software (false)
+    --no-category=CATEGORY do not list given category items
     --scan-homedirs     allow to scan use home directories (false)
     --html              save the inventory as HTML (false)
     -f --force          always send data to server (false)
@@ -357,13 +357,9 @@ List available tasks and exit
 
 =over
 
-=item B<--no-printer>
-
-Do not list local printers in inventory.
-
-=item B<--no-software>
+=item B<--no-category>=I<CATEGORY>
 
-Do not list installed software in inventory.
+Do not list given category items in inventory.
 
 =item B<--scan-homedirs>
 
diff --git a/lib/FusionInventory/Agent/Config.pm b/lib/FusionInventory/Agent/Config.pm
index b716f78..74afddc 100644
--- a/lib/FusionInventory/Agent/Config.pm
+++ b/lib/FusionInventory/Agent/Config.pm
@@ -67,6 +67,14 @@ my $deprecated = {
         message => 'use --no-task ocsdeploy option instead',
         new     => { 'no-task' => 'ocsdeploy' }
     },
+    'no-printer' => {
+        message => 'use --no-category printer option instead',
+        new     => { 'no-category' => 'printer' }
+    },
+    'no-software' => {
+        message => 'use --no-category software option instead',
+        new     => { 'no-category' => 'software' }
+    },
 };
 
 sub new {
@@ -147,9 +155,9 @@ sub _loadFromCfgFile {
         return;
     }
 
-    while (<$handle>) {
-        s/#.+//;
-        if (/([\w-]+)\s*=\s*(.+)/) {
+    while (my $line = <$handle>) {
+        $line =~ s/#.+//;
+        if ($line =~ /([\w-]+)\s*=\s*(.+)/) {
             my $key = $1;
             my $val = $2;
             # Remove the quotes
@@ -216,6 +224,8 @@ sub _checkContent {
     $self->{server} = [ split(/,/, $self->{server}) ] if $self->{server};
     $self->{'no-task'} = [ split(/,/, $self->{'no-task'}) ]
         if $self->{'no-task'};
+    $self->{'no-category'} = [ split(/,/, $self->{'no-category'}) ]
+        if $self->{'no-category'};
 
     # files location
     $self->{'ca-cert-file'} =
diff --git a/lib/FusionInventory/Agent/HTTP/Protocol/https.pm b/lib/FusionInventory/Agent/HTTP/Protocol/https.pm
index c07fe99..d74a8b1 100644
--- a/lib/FusionInventory/Agent/HTTP/Protocol/https.pm
+++ b/lib/FusionInventory/Agent/HTTP/Protocol/https.pm
@@ -17,7 +17,7 @@ sub import {
 }
 
 sub _extra_sock_opts {
-    my ($self, $host, $port) = @_;
+    my ($self, $host) = @_;
 
     return (
         SSL_verify_mode     => $self->{ua}->{ssl_check} ?
diff --git a/lib/FusionInventory/Agent/HTTP/Server.pm b/lib/FusionInventory/Agent/HTTP/Server.pm
index 9ce4400..001033e 100644
--- a/lib/FusionInventory/Agent/HTTP/Server.pm
+++ b/lib/FusionInventory/Agent/HTTP/Server.pm
@@ -256,7 +256,6 @@ sub _is_authenticated {
 sub _listen {
     my ($self) = @_;
 
-    my $scheduler = $self->{scheduler};
     my $logger = $self->{logger};
 
     my $daemon = HTTP::Daemon->new(
diff --git a/lib/FusionInventory/Agent/Target/Server.pm b/lib/FusionInventory/Agent/Target/Server.pm
index 64af009..0ffa6a4 100644
--- a/lib/FusionInventory/Agent/Target/Server.pm
+++ b/lib/FusionInventory/Agent/Target/Server.pm
@@ -28,8 +28,6 @@ sub new {
         vardir => $params{basevardir} . '/' . $subdir
     );
 
-    my $logger = $self->{logger};
-
     return $self;
 }
 
diff --git a/lib/FusionInventory/Agent/Task/Inventory.pm b/lib/FusionInventory/Agent/Task/Inventory.pm
index 948e730..0e25fd0 100644
--- a/lib/FusionInventory/Agent/Task/Inventory.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory.pm
@@ -60,8 +60,10 @@ sub run {
         );
     }
 
-    $self->_initModulesList();
-    $self->_feedInventory($inventory);
+    my %disabled = map { $_ => 1 } @{$self->{config}->{'no-category'}};
+
+    $self->_initModulesList(\%disabled);
+    $self->_feedInventory($inventory, \%disabled);
 
     if ($self->{target}->isa('FusionInventory::Agent::Target::Stdout')) {
         $self->_printInventory(
@@ -119,11 +121,10 @@ sub run {
 }
 
 sub _initModulesList {
-    my ($self) = @_;
+    my ($self, $disabled) = @_;
 
     my $logger = $self->{logger};
     my $config = $self->{config};
-    my $storage = $self->{storage};
 
     my @modules = __PACKAGE__->getModules('Input');
     die "no inventory module found" if !@modules;
@@ -155,11 +156,10 @@ sub _initModulesList {
             logger => $logger,
             timeout  => $config->{'backend-collect-timeout'},
             params => {
+                no_category   => $disabled,
                 datadir       => $self->{datadir},
                 logger        => $self->{logger},
                 registry      => $self->{registry},
-                no_software   => $self->{config}->{'no-software'},
-                no_printer    => $self->{config}->{'no-printer'},
                 scan_homedirs => $self->{config}->{'scan-homedirs'},
             }
         );
@@ -206,7 +206,7 @@ sub _initModulesList {
 }
 
 sub _runModule {
-    my ($self, $module, $inventory) = @_;
+    my ($self, $module, $inventory, $disabled) = @_;
 
     my $logger = $self->{logger};
 
@@ -225,7 +225,7 @@ sub _runModule {
         die "circular dependency between $module and $other_module"
             if $self->{modules}->{$other_module}->{used};
 
-        $self->_runModule($other_module, $inventory);
+        $self->_runModule($other_module, $inventory, $disabled);
     }
 
     $logger->debug("Running $module");
@@ -238,10 +238,9 @@ sub _runModule {
         params => {
             datadir       => $self->{datadir},
             inventory     => $inventory,
+            no_category   => $disabled,
             logger        => $self->{logger},
             registry      => $self->{registry},
-            no_software   => $self->{config}->{no_software},
-            no_printer    => $self->{config}->{no_printer},
             scan_homedirs => $self->{config}->{'scan-homedirs'},
         }
     );
@@ -277,8 +276,6 @@ sub _feedInventory {
 
     $inventory->computeLegacyValues();
     $inventory->computeChecksum();
-
-    $inventory->checkContent();
 }
 
 sub _injectContent {
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/AIX/LVM.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/AIX/LVM.pm
index 672de8b..f8c6bc0 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/AIX/LVM.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/AIX/LVM.pm
@@ -2,9 +2,7 @@ package FusionInventory::Agent::Task::Inventory::Input::AIX::LVM;
 
 use FusionInventory::Agent::Tools;
 
-# LVM for AIX
 use strict;
-
 use warnings;
 
 use English qw(-no_match_vars);
@@ -13,194 +11,211 @@ sub isEnabled {
     canRun("lspv");
 }
 
-sub _parseLvs {
-
-    my @vs_elem;
-    my $vg;
-    my $ppsize;
-    my $status;
-    my $nblv;
-    my $typelv;
-    my $lvname;
-    my $entries = [];
-
-    foreach (`lsvg`) {
-        chomp;
-        foreach (`lsvg -l $_`) {
-            chomp;
-            if (/(\S+):.*/) {
-                $vg = $1;
-            }
-            if ( ( !/^LV NAME.*/ )
-                && /(\S+) *(\S+) *(\d+) *(\d+) *(\d+) *(\S+) *(\S+)/ )
-            {
-                $vs_elem[0] = $vg . "/" . $1;
-                $typelv     = $2;
-                $vs_elem[6] = 0;
-                $vs_elem[5] = $3;
-                $status     = "Type " . $2 . " ,PV: " . $5;
-                $lvname     = $1;
-                foreach (`lslv $1`) {
-                    if (/.*PP SIZE:\s+(\d+) .*/) {
-                        $ppsize = $1;
-                    }
-                    if (/LV IDENTIFIER:      (\S+)/) {
-                        $vs_elem[7] = $1;
-                    }
-                }
-#                print(  $lvname. " "
-#                      . $vg . " "
-#                      . $status . " "
-#                      . $vs_elem[5] . " "
-#                      . $vs_elem[7] . " "
-#                      . $vs_elem[5]
-#                      . "\n" );
-                push @$entries,
-                  {
-                    LV_NAME   => $lvname,
-                    VG_UUID   => $vg,
-                    ATTR      => $status,
-                    SIZE      => int( $vs_elem[5] * $ppsize || 0 ),
-                    LV_UUID   => $vs_elem[7],
-                    SEG_COUNT => $vs_elem[5],
-                  };
-            }
-        }
+sub doInventory {
+    my (%params) = @_;
+
+    my $inventory = $params{inventory};
+    my $logger    = $params{logger};
+
+    foreach my $volume (_getPhysicalVolumes($logger)) {
+        $inventory->addEntry(section => 'PHYSICAL_VOLUMES', entry => $volume);
+    }
+
+    foreach my $volume (_getLogicalVolumes($logger)) {
+        $inventory->addEntry(section => 'LOGICAL_VOLUMES', entry => $volume);
+    }
+
+    foreach my $group (_getVolumeGroups($logger)) {
+        $inventory->addEntry(section => 'VOLUME_GROUPS', entry => $group);
     }
-    return $entries;
+
 }
 
-sub _parsePvs {
-
-    my @vs_elem;
-    my $vg;
-    my $ppsize;
-    my $status;
-    my $nblv;
-    my $typelv;
-
-    my $entries = [];
-    my $pvname  = "";
-
-    foreach (`lspv | cut -f1 -d' '`) {
-        chomp;
-        $pvname = $_;
-        foreach (`lspv $_`) {
-            chomp;
-            if (/PHYSICAL VOLUME:    (\S+)/) {
-                $vs_elem[0] = $1;
-            }
-            if (/FREE PPs:           (\d+) .*/) {
-                $vs_elem[5] = $1;
-            }
-            if (/TOTAL PPs:          (\d+) .*/) {
-                $vs_elem[4] = $1;
-            }
-            if (/VOLUME GROUP:     (\S+)/) {
-                $vg = $1;
-            }
-            if (/PP SIZE:            (\d+) .*/) {
-                $ppsize = $1;
-            }
-            if (/PV IDENTIFIER:      (\S+)/) {
-                $vs_elem[6] = $1;
-            }
-        }
-        push @$entries,
-          {
-            DEVICE      => "/dev/" . $pvname,
-            PV_NAME     => $pvname,
-            FORMAT      => "AIX PV " . $vs_elem[0],
-            ATTR        => "VG " . $vg,
-            SIZE        => $vs_elem[4] * $ppsize,
-            FREE        => $vs_elem[5] * $ppsize,
-            PV_UUID     => $vs_elem[6],
-            PV_PE_COUNT => $vs_elem[4],
-            PE_SIZE     => $ppsize,
-          }
+sub _getLogicalVolumes {
+    my ($logger) = @_;
 
+    my $handle = getFileHandle(
+        command => "lsvg",
+        logger  => $logger
+    );
+    return unless $handle;
+
+    my @volumes;
+
+    while (my $line = <$handle>) {
+        chomp $line;
+        push @volumes, _getLogicalVolume($logger, $line);
     }
+    close $handle;
 
-    return $entries;
+    return @volumes;
 }
 
-sub _parseVgs {
-
-    my $entries = [];
-    my @vs_elem;
-    my $vg;
-    my $ppsize;
-    my $status;
-    my $nblv;
-    my $typelv;
-    my $nbpv;
-
-    foreach (`lsvg`) {
-        chomp;
-        $vg = $_;
-        foreach (`lsvg $_`) {
-            chomp;
-            if (/VOLUME GROUP:       (\S+) .* /) {
-                $vs_elem[0] = $1;
-            }
-            if (/TOTAL PPs:      (\d+) .*/) {
-                $vs_elem[5] = $1;
-            }
-            if (/FREE PPs:       (\d+) .*/) {
-                $vs_elem[6] = $1;
-            }
-            if (/VG IDENTIFIER:  (\S+)/) {
-                $vs_elem[7] = $1;
-            }
-            if (/PP SIZE:        (\d+) .*/) {
-                $ppsize = $1;
-            }
-            if (/LVs:                (\d+) .*/) {
-                $nblv = $1;
-            }
-            if (/ACTIVE PVs:\s+(\d+) .*/) {
-                $nbpv = $1;
-            }
-
-        }
-
-        push @$entries,
-          {
-            VG_NAME        => $vg,
-            PV_COUNT       => $nbpv,
-            LV_COUNT       => $nblv,
-            ATTR           => "",
-            SIZE           => $vs_elem[5],
-            FREE           => $vs_elem[6],
-            VG_UUID        => $vs_elem[7],
-            VG_EXTENT_SIZE => $ppsize,
-          };
+sub _getLogicalVolume {
+    my ($logger, $name) = @_;
+
+    my $handle = getFileHandle(
+        command => "lsvg -l $name",
+        logger  => $logger
+    );
+    return unless $handle;
+
+    my $volume;
 
+    while (my $line = <$handle>) {
+        chomp $line;
+
+        if ($line =~ /(\S+):/) {
+            $volume->{VG_UUID} = $1;
+        }
+        if ($line !~ !/^LV NAME/ && $line =~ /(\S+) *(\S+) *(\d+) *(\d+) *(\d+) *(\S+) *(\S+)/) {
+            $volume->{LV_NAME}   = $1;
+            $volume->{SEG_COUNT} = $3;
+            $volume->{ATTR}      = "Type $2,PV: $5";
+        }
+    }
+    close $handle;
+
+    my $size;
+    foreach (`lslv $volume->{LV_NAME}`) {
+        if (/.*PP SIZE:\s+(\d+) .*/) {
+            $size = $1;
+        }
+        if (/LV IDENTIFIER:\s+(\S+)/) {
+            $volume->{LV_UUID} = $1;
+        }
     }
 
-    return $entries;
+    $volume->{SIZE} = int($volume->{SEG_COUNT} * $size);
+
+    return $volume;
 }
 
-sub doInventory {
-    my (%params) = @_;
+sub _getPhysicalVolumes {
+    my ($logger) = @_;
 
-    my $inventory = $params{inventory};
+    my $handle = getFileHandle(
+        command => "lspv | cut -f1 -d' '",
+        logger  => $logger
+    );
+    return unless $handle;
+
+    my @volumes;
 
-    my $pvs       = _parsePvs();
-    foreach (@$pvs) {
-        $inventory->addEntry(section => 'PHYSICAL_VOLUMES', entry => $_);
+    while (my $line = <$handle>) {
+        chomp $line;
+        push @volumes, _getPhysicalVolume($logger, $line);
     }
+    close $handle;
+
+    return @volumes;
+}
+
+sub _getPhysicalVolume {
+    my ($logger, $name) = @_;
 
-    my $lvs = _parseLvs();
-    foreach (@$lvs) {
-        $inventory->addEntry(section => 'LOGICAL_VOLUMES', entry => $_);
+    my $handle = getFileHandle(
+        command => "lspv $name",
+        logger  => $logger
+    );
+    return unless $handle;
+
+    my $volume = {
+        DEVICE  => "/dev/$name",
+        PV_NAME => $name,
+    };
+
+    my ($free, $total);
+    while (my $line = <$handle>) {
+        chomp $line;
+
+        if ($line =~ /PHYSICAL VOLUME:\s+(\S+)/) {
+            $volume->{FORMAT} = "AIX PV $1";
+        }
+        if ($line =~ /FREE PPs:\s+(\d+)/) {
+            $free = $1;
+        }
+        if ($line =~ /TOTAL PPs:\s+(\d+)/) {
+            $total = $1;
+        }
+        if ($line =~ /VOLUME GROUP:\s+(\S+)/) {
+            $volume->{ATTR} = "VG $1";
+        }
+        if ($line =~ /PP SIZE:\s+(\d+)/) {
+            $volume->{PE_SIZE} = $1;
+        }
+        if ($line =~ /PV IDENTIFIER:\s+(\S+)/) {
+            $volume->{PV_UUID} = $1;
+        }
+    }
+    close $handle;
+
+    $volume->{SIZE} = $total * $volume->{PE_SIZE};
+    $volume->{FREE} = $free * $volume->{PE_SIZE};
+    $volume->{PV_PE_COUNT} = $total;
+
+    return $volume;
+}
+
+sub _getVolumeGroups {
+    my ($logger) = @_;
+
+    my $handle = getFileHandle(
+        command => 'lsvg',
+        logger  => $logger
+    );
+    return unless $handle;
+
+    my @groups;
+
+    while (my $line = <$handle>) {
+        chomp $line;
+        push @groups, _getVolumeGroup($logger, $line);
     }
+    close $handle;
+
+    return @groups;
+}
+
+sub _getVolumeGroup {
+    my ($logger, $name) = @_;
+
+    my $handle = getFileHandle(
+        command => "lsvg $name",
+        logger  => $logger
+    );
+    return unless $handle;
+
+    my $group = {
+        VG_NAME => $name
+    };
+
+    while (my $line = <$handle>) {
+        chomp $line;
+
+        if ($line =~ /TOTAL PPs:\s+(\d+)/) {
+            $group->{SIZE} = $1;
+        }
+        if ($line =~ /FREE PPs:\s+(\d+)/) {
+            $group->{FREE} = $1;
+        }
+        if ($line =~ /VG IDENTIFIER:\s+(\S+)/) {
+            $group->{VG_UUID} = $1;
+        }
+        if ($line =~ /PP SIZE:\s+(\d+)/) {
+            $group->{VG_EXTENT_SIZE} = $1;
+        }
+        if ($line =~ /LVs:\s+(\d+)/) {
+            $group->{LV_COUNT} = $1;
+        }
+        if ($line =~/ACTIVE PVs:\s+(\d+)/) {
+            $group->{PV_COUNT} = $1;
+        }
 
-    my $vgs = _parseVgs();
-    foreach (@$vgs) {
-        $inventory->addEntry(section => 'VOLUME_GROUPS', entry => $_);
     }
+    close $handle;
 
+    return $group;
 }
 
 1;
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/AIX/Softwares.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/AIX/Softwares.pm
index 0597530..430555d 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/AIX/Softwares.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/AIX/Softwares.pm
@@ -9,7 +9,7 @@ sub isEnabled {
     my (%params) = @_;
 
     return
-        !$params{no_software} &&
+        !$params{no_category} &&
         canRun('lslpp');
 }
 
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/Alpha.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/Alpha.pm
index 54fd354..b9d5d21 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/Alpha.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/Alpha.pm
@@ -15,7 +15,6 @@ sub doInventory {
     my (%params) = @_;
 
     my $inventory = $params{inventory};
-    my $logger    = $params{logger};
 
     # sysctl infos
 
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/MIPS.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/MIPS.pm
index 17f00f4..e79dbd0 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/MIPS.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/MIPS.pm
@@ -15,7 +15,6 @@ sub doInventory {
     my (%params) = @_;
 
     my $inventory = $params{inventory};
-    my $logger    = $params{logger};
 
     # sysctl infos
 
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/SPARC.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/SPARC.pm
index 12bf81c..9cb1786 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/SPARC.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/SPARC.pm
@@ -15,7 +15,6 @@ sub doInventory {
     my (%params) = @_;
 
     my $inventory = $params{inventory};
-    my $logger    = $params{logger};
 
     # sysctl infos
 
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Memory.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Memory.pm
index 72f36d1..d79b3cf 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Memory.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Memory.pm
@@ -15,7 +15,6 @@ sub doInventory {
     my (%params) = @_;
 
     my $inventory = $params{inventory};
-    my $logger    = $params{logger};
 
     # Swap
     my $swapSize;
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Softwares.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Softwares.pm
index 9376672..1bc71c0 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Softwares.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Softwares.pm
@@ -9,7 +9,7 @@ sub isEnabled {
     my (%params) = @_;
 
     return
-        !$params{no_software} &&
+        !$params{no_category}->{software} &&
         canRun('pkg_info');
 }
 
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Dmidecode/Bios.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Dmidecode/Bios.pm
index 830db3e..01ee764 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Dmidecode/Bios.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Dmidecode/Bios.pm
@@ -29,7 +29,6 @@ sub _getBiosHardware {
     my $system_info  = $infos->{1}->[0];
     my $base_info    = $infos->{2}->[0];
     my $chassis_info = $infos->{3}->[0];
-    my $cpu_info     = $infos->{4}->[0];
 
     my $bios = {
         BMANUFACTURER => $bios_info->{'Vendor'},
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Environment.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Environment.pm
index e753df8..8df1b17 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Environment.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Environment.pm
@@ -8,8 +8,12 @@ use warnings;
 use FusionInventory::Agent::Tools;
 
 sub isEnabled {
-    # We use WMI for Windows because of charset issue
-    return $OSNAME ne 'MSWin32';
+    my (%params) = @_;
+
+    return
+        # We use WMI for Windows because of charset issue
+        $OSNAME ne 'MSWin32' &&
+        !$params{no_category}->{environment};
 }
 
 sub doInventory {
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Printers.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Printers.pm
index 272964c..e9e4677 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Printers.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Printers.pm
@@ -13,7 +13,7 @@ sub isEnabled {
     return 
         # we use system profiler on MacOS
         $OSNAME ne 'darwin' &&
-        !$params{no_printer} &&
+        !$params{no_category}->{printer} &&
         canLoad("Net::CUPS") &&
         $Net::CUPS::VERSION >= 0.60;
 }
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Storages/HP.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Storages/HP.pm
index 7587cd4..ce1818f 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Storages/HP.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Storages/HP.pm
@@ -16,7 +16,6 @@ use FusionInventory::Agent::Tools;
 # HP Array Configuration Utility CLI 7.85-18.0
 
 sub _getHpacuacliFromWinRegistry {
-    my ($logger) = @_;
 
     my $Registry;
     Win32::TieRegistry->require();
@@ -56,7 +55,7 @@ sub doInventory {
     my $inventory = $params{inventory};
     my $logger    = $params{logger};
 
-    my ($pd, $serialnumber, $model, $capacity, $firmware, $description, $media, $manufacturer);
+    my ($serialnumber, $model, $capacity, $firmware, $description, $media, $manufacturer);
 
     my $hpacuacliPath = canRun('hpacucli') ?
         "hpacucli":
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/HPUX.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/HPUX.pm
index bdf3f3c..5978c80 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/HPUX.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/HPUX.pm
@@ -17,7 +17,6 @@ sub doInventory {
     my (%params) = @_;
 
     my $inventory = $params{inventory};
-    my $logger    = $params{logger};
 
     # Operating system informations
     my $OSVersion = getFirstLine(command => 'uname -v');
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/HPUX/Memory.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/HPUX/Memory.pm
index c80e75c..ff2f94c 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/HPUX/Memory.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/HPUX/Memory.pm
@@ -106,7 +106,6 @@ sub _parseCstm {
 
     my %capacities;
     my $capacity = 0;
-    my $caption; 
     my $description;
     my $numslot = 1;
     my $subnumslot;
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/HPUX/Softwares.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/HPUX/Softwares.pm
index 3d20576..9ec009e 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/HPUX/Softwares.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/HPUX/Softwares.pm
@@ -9,7 +9,7 @@ sub isEnabled  {
     my (%params) = @_;
 
     return
-        !$params{no_software} &&
+        !$params{no_category}->{software} &&
         canRun('swlist');
 }
 
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux.pm
index fd19bff..32a772b 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux.pm
@@ -43,7 +43,6 @@ sub _getRHNSystemId {
     return unless -f $file;
     my $tpp = XML::TreePP->new();
     my $h = $tpp->parsefile($file);
-    my $v;
     eval {
         foreach (@{$h->{params}{param}{value}{struct}{member}}) {
             next unless $_->{name} eq 'system_id';
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Archs/ARM.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Archs/ARM.pm
index ff2f1dc..46a1ee3 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Archs/ARM.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Archs/ARM.pm
@@ -30,11 +30,9 @@ sub doInventory {
 }
 
 sub _getCPUsFromProc {
-    my ($logger, $file) = @_;
-
     my @cpus;
-    foreach my $cpu (getCPUsFromProc(@_)) {
 
+    foreach my $cpu (getCPUsFromProc(@_)) {
         push @cpus, {
             ARCH => 'ARM',
             TYPE => $cpu->{processor}
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Archs/SPARC.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Archs/SPARC.pm
index 71f7b52..e0eef88 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Archs/SPARC.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Archs/SPARC.pm
@@ -32,8 +32,6 @@ sub doInventory {
 }
 
 sub _getCPUsFromProc {
-    my ($logger, $file) = @_;
-
     my $cpu = (getCPUsFromProc(@_))[0];
 
     return unless $cpu && $cpu->{'ncpus probed'};
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Archs/i386.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Archs/i386.pm
index a6affc8..f9f84b9 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Archs/i386.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Archs/i386.pm
@@ -70,7 +70,7 @@ sub doInventory {
 sub _getCPUsFromProc {
     my @cpus = getCPUsFromProc(@_);
 
-    my ($procs, $cpuNbr, $cores, $threads);
+    my ($procs, $cpuNbr);
 
     my @cpuList;
 
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/LVM.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/LVM.pm
index 390fb4e..997617d 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/LVM.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/LVM.pm
@@ -44,15 +44,16 @@ sub _getLogicalVolumes {
     return unless $handle;
 
     my @volumes;
-    foreach (<$handle>) {
-        my @line = split(/\s+/, $_);
+    while (my $line = <$handle>) {
+        my @infos = split(/\s+/, $line);
+
         push @volumes, {
-            LV_NAME => $line[1],
-            VG_UUID => $line[2],
-            ATTR => $line[3],
-            SIZE => int($line[4]||0),
-            LV_UUID => $line[5],
-            SEG_COUNT => $line[6],
+            LV_NAME   => $infos[1],
+            VG_UUID   => $infos[2],
+            ATTR      => $infos[3],
+            SIZE      => int($infos[4]||0),
+            LV_UUID   => $infos[5],
+            SEG_COUNT => $infos[6],
         }
 
     }
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Networks.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Networks.pm
index de317fe..5fdf0a0 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Networks.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Networks.pm
@@ -43,7 +43,6 @@ sub _getInterfaces {
     my (%params) = @_;
 
     my $logger = $params{logger};
-    my $routes = $params{routes};
 
     my @interfaces = canRun("/sbin/ip") ?
         getInterfacesFromIp(logger => $logger):
@@ -60,7 +59,6 @@ sub _getInterfaces {
         );
 
         my ($driver, $pcislot) = _getUevent(
-            $logger,
             $interface->{DESCRIPTION}
         );
         $interface->{DRIVER} = $driver if $driver;
@@ -134,7 +132,7 @@ sub _isWifi {
 }
 
 sub _getUevent {
-    my ($logger, $name) = @_;
+    my ($name) = @_;
 
     my $file = "/sys/class/net/$name/device/uevent";
     my $handle = getFileHandle(file => $file);
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Softwares.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Softwares.pm
index 2bfae86..d9db905 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Softwares.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Softwares.pm
@@ -8,7 +8,7 @@ use FusionInventory::Agent::Tools;
 sub isEnabled {
     my (%params) = @_;
 
-    return !$params{no_software};
+    return !$params{no_category}->{software};
 }
 
 sub doInventory {
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Storages/Adaptec.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Storages/Adaptec.pm
index f171fc4..4662f62 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Storages/Adaptec.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Storages/Adaptec.pm
@@ -42,7 +42,7 @@ sub doInventory {
 }
 
 sub _getDisksFromProc {
-    my %params = (
+    my (%params) = (
         file => '/proc/scsi/scsi',
         @_
     );
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Videos.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Videos.pm
index 11b73af..be4aef8 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Videos.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Videos.pm
@@ -80,7 +80,7 @@ sub _getDdcprobeData {
     return unless $handle;
 
     my $data;
-    foreach my $line (<$handle>) {
+    while (my $line = <$handle>) {
         $line =~ s/[[:cntrl:]]//g;
         $line =~ s/[^[:ascii:]]//g;
         $data->{$1} = $2 if $line =~ /^(\S+):\s+(.*)/;
@@ -95,7 +95,7 @@ sub _parseXorgFd {
     return unless $handle;
 
     my $data;
-    foreach my $line (<$handle>) {
+    while (my $line = <$handle>) {
         if ($line =~ /Modeline\s"(\S+?)"/) {
             $data->{resolution} = $1 if !$data->{resolution};
         } elsif ($line =~ /Integrated Graphics Chipset:\s+(.*)/) {
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/iLO.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/iLO.pm
index 6610d09..a78752e 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/iLO.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/iLO.pm
@@ -11,7 +11,7 @@ sub isEnabled {
 }
 
 sub _parseHponcfg {
-    my %params = @_;
+    my (%params) = @_;
 
     my $handle = getFileHandle(%params);
 
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS.pm
index b30ff81..d95aa38 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS.pm
@@ -15,12 +15,11 @@ sub doInventory {
     my (%params) = @_;
 
     my $inventory = $params{inventory};
-    my $logger    = $params{logger};
 
     my ($OSName, $OSVersion);
 
-    # if we can load the system profiler, gather the information from that
     if (canLoad("Mac::SysProfile")) {
+        # use system profiler if available
         my $prof = Mac::SysProfile->new();
         my $info = $prof->gettype('SPSoftwareDataType');
         return unless ref $info eq 'HASH';
@@ -37,8 +36,7 @@ sub doInventory {
         }
 
     } else {
-        # we can't load the system profiler, use the basic BSD stype information
-        # Operating system informations
+        # fallback on basic BSD type information otherwise
         $OSName = getFirstLine(command => 'uname -s');
         $OSVersion = getFirstLine(command => 'uname -r');
     }
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Hostname.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Hostname.pm
index 94ee02e..3900953 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Hostname.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Hostname.pm
@@ -15,7 +15,6 @@ sub doInventory {
     my (%params) = @_;
 
     my $inventory = $params{inventory};
-    my $logger    = $params{logger};
 
     my $prof = Mac::SysProfile->new();
     my $info = $prof->gettype('SPSoftwareDataType');
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Printers.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Printers.pm
index f1649f2..1c2de9f 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Printers.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Printers.pm
@@ -9,7 +9,7 @@ sub isEnabled {
     my (%params) = @_;
 
     return 
-        !$params{no_printer} &&
+        !$params{no_category}->{printer} &&
         -r '/usr/sbin/system_profiler' &&
         canLoad("Mac::SysProfile");
 }
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Softwares.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Softwares.pm
index 3a3a5fc..917e901 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Softwares.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Softwares.pm
@@ -9,7 +9,7 @@ sub isEnabled {
     my (%params) = @_;
 
     return
-        !$params{no_software} &&
+        !$params{no_category}->{software} &&
         -r '/usr/sbin/system_profiler' &&
         canLoad("Mac::SysProfile");
 }
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Storages.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Storages.pm
index 55fae1a..2fbbc13 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Storages.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Storages.pm
@@ -4,6 +4,7 @@ use strict;
 use warnings;
 
 use FusionInventory::Agent::Tools;
+use FusionInventory::Agent::Tools::MacOS;
 
 sub isEnabled {
     return 1;
@@ -15,116 +16,96 @@ sub doInventory {
     my $inventory = $params{inventory};
     my $logger    = $params{logger};
 
-    my $devices = {};
-
-    # Get SATA Drives
-    my $sata = _getDiskInfo();
-
-    foreach my $device ( @$sata ) {
-        my $description;
-        if (!$device->{'Protocol'}) {
-            $description = 'Disk drive';
-        } elsif ( ($device->{'Protocol'} eq 'ATAPI')
-                ||
-                ($device->{'Drive Type'}) ) {
-            $description = 'CD-ROM Drive';
-        }
-
-        my $size = $device->{'Capacity'};
-        if ($size) {
-            #e.g: Capacity: 320,07 GB (320 072 933 376 bytes)
-            $size =~ s/\s*\(.*//;
-            $size =~ s/ GB//;
-            $size =~ s/,/./;
-            $size = int($size * 1024);
-        }
-
-        my $manufacturer = getCanonicalManufacturer($device->{'Name'});
-
-        my $model = $device->{'Model'};
-        if ($model) {
-            $model =~ s/\s*$manufacturer\s*//i;
-        }
-
+    foreach my $storage (_getStorages(logger => $logger)) {
         $inventory->addEntry(
             section => 'STORAGES',
-            entry   => {
-                NAME         => $device->{'Name'},
-                SERIAL       => $device->{'Serial Number'},
-                DISKSIZE     => $size,
-                FIRMWARE     => $device->{'Revision'},
-                MANUFACTURER => $manufacturer,
-                DESCRIPTION  => $description,
-                MODEL        => $model,
-                TYPE         => $device->{'Type'}
-            }
+            entry   => $storage
         );
     }
-
-
 }
 
-sub _getDiskInfo {
-    my ($section) = @_;
-
-    my $wasEmpty;
-    my $revIndent = '';
-    my @infos;
-    my $info;
-    my $name;
-    my $type;
-    foreach (`/usr/sbin/system_profiler SPSerialATADataType`,
-        `/usr/sbin/system_profiler SPParallelATADataType`,
-        `/usr/sbin/system_profiler SPUSBDataType`,
-        `/usr/sbin/system_profiler SPFireWireDataType`) {
-        if (/^\s*$/) {
-            $wasEmpty=1;
-            next;
-        }
+sub _getStorages {
+    my $infos = getSystemProfilerInfos(@_);
+
+    # system profiler data structure:
+    # bus
+    # └── controller
+    #     ├── device
+    #     │   ├── subdevice
+    #     │   │   └── key:value
+    #     │   └── key:value
+    #     └── key:value
+
+    my @storages;
+
+    foreach my $busName (qw/ATA SERIAL-ATA USB FireWire/) {
+        my $bus = $infos->{$busName};
+        next unless $bus;
+        foreach my $controllerName (keys %{$bus}) {
+            my $controller = $bus->{$controllerName};
+            foreach my $deviceName (keys %{$controller}) {
+                my $device = $controller->{$deviceName};
+                next unless ref $device eq 'HASH';
+                if (_isStorage($device)) {
+                    push @storages,
+                        _getStorage($device, $deviceName, $busName);
+                } else {
+                    foreach my $subdeviceName (keys %{$device}) {
+                        my $subdevice = $device->{$subdeviceName};
+                        next unless ref $subdevice eq 'HASH';
+                        push @storages,
+                            _getStorage($subdevice, $subdeviceName, $busName)
+                            if _isStorage($subdevice);
+                    }
+                }
 
-        next unless /^(\s*)/;
-        if ($1 ne $revIndent) {
-            $name = $1 if (/^\s+(\S+.*\S+):\s*$/ && $wasEmpty);
-            $revIndent = $1;
-
-# We use the Protocol key to know if it a storage section or not
-            if (
-                # disk
-                ($info->{'BSD Name'} && $info->{'BSD Name'} =~ /^disk\d+$/)
-                ||
-                # USB Disk
-#                ($info->{'BSD Name'} && $info->{'Product ID'})
-#                ||
-                # CDROM
-                ($info->{'Protocol'} && $info->{'Socket Type'})
-            ) {
-                $info->{Type} = $type;
-                push @infos, $info;
-                $name = '';
             }
-            $info = {};
-        }
-        if (/^\s+(\S+.*?):\s+(\S.*)/) {
-            $info->{$1}=$2;
-            $info->{Name} = $name;
         }
+    }
 
-        $type = '' if /^(\S+)/;
-        if (/^(\S+):$/) {
-            $type=$1;
-            if ($type eq 'FireWire') {
-                $type = '1394';
-            }
-        }
+    return @storages;
+}
 
+sub _isStorage {
+    my ($device) = @_;
 
-        $wasEmpty=0;
+    return 
+        ($device->{'BSD Name'} && $device->{'BSD Name'} =~ /^disk\d+$/) || 
+        ($device->{'Protocol'} && $device->{'Socket Type'});
+}
+
+sub _getStorage {
+    my ($device, $device_name, $bus_name) = @_;
+
+    my $storage = {
+        NAME         => $device_name,
+        MANUFACTURER => getCanonicalManufacturer($device_name),
+        TYPE         => $bus_name eq 'FireWire' ? '1394' : $bus_name,
+        SERIAL       => $device->{'Serial Number'},
+        FIRMWARE     => $device->{'Revision'},
+        MODEL        => $device->{'Model'},
+        DISKSIZE     => $device->{'Capacity'}
+    };
+
+    if (!$device->{'Protocol'}) {
+        $storage->{DESCRIPTION} = 'Disk drive';
+    } elsif ($device->{'Protocol'} eq 'ATAPI' || $device->{'Drive Type'}) {
+        $storage->{DESCRIPTION} = 'CD-ROM Drive';
+    }
+
+    if ($storage->{DISKSIZE}) {
+        #e.g: Capacity: 320,07 GB (320 072 933 376 bytes)
+        $storage->{DISKSIZE} =~ s/\s*\(.*//;
+        $storage->{DISKSIZE} =~ s/ GB//;
+        $storage->{DISKSIZE} =~ s/,/./;
+        $storage->{DISKSIZE} = int($storage->{DISKSIZE} * 1024);
     }
-# The last one
-    if ($info->{Protocol}) {
-        push @infos, $info;
+
+    if ($storage->{MODEL}) {
+        $storage->{MODEL} =~ s/\s*$storage->{MANUFACTURER}\s*//i;
     }
-    return \@infos;
+
+    return $storage;
 }
 
 1;
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Videos.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Videos.pm
index d2b4604..8294ed5 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Videos.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Videos.pm
@@ -17,30 +17,35 @@ sub doInventory {
     my $inventory = $params{inventory};
 
     my %displays = _getDisplays();
-    foreach my $section (keys %displays ) {
-        foreach my $entry (@{$displays{$section}}) {
-            $inventory->addEntry(
-                section => $section,
-                entry   => $entry,
-            );
-        }
+
+    foreach my $monitor (@{$displays{MONITORS}}) {
+        $inventory->addEntry(
+            section => 'MONITORS',
+            entry   => $monitor,
+        );
+    }
+
+    foreach my $video (@{$displays{VIDEOS}}) {
+        $inventory->addEntry(
+            section => 'VIDEOS',
+            entry   => $video,
+        );
     }
 }
 
 sub _getDisplays {
     my $infos = getSystemProfilerInfos(@_);
 
-    my $monitors = [];
-    my $videos = [];
+    my @monitors;
+    my @videos;
 
     foreach my $videoName (keys %{$infos->{'Graphics/Displays'}}) {
-        my $videoCardInfo = $infos->{'Graphics/Displays'}{$videoName};
+        my $videoCardInfo = $infos->{'Graphics/Displays'}->{$videoName};
 
-        my $displays = {};
         foreach my $displayName (keys %{$videoCardInfo->{Displays}}) {
             next if $displayName eq 'Display Connector';
             next if $displayName eq 'Display';
-            my $displayInfo = $videoCardInfo->{Displays}{$displayName};
+            my $displayInfo = $videoCardInfo->{Displays}->{$displayName};
 
             my $resolution = $displayInfo->{Resolution};
             if ($resolution) {
@@ -51,7 +56,7 @@ sub _getDisplays {
             my $memory = $videoCardInfo->{'VRAM (Total)'};
             $memory =~ s/\ .*//g if $memory;
 
-            push @$videos, {
+            push @videos, {
                 CHIPSET    => $videoCardInfo->{'Chipset Model'},
                 MEMORY     => $memory,
                 NAME       => $videoName,
@@ -59,7 +64,7 @@ sub _getDisplays {
                 PCISLOT    => $videoCardInfo->{Slot}
             };
 
-            push @$monitors, {
+            push @monitors, {
                 CAPTION     => $displayName,
                 DESCRIPTION => $displayName,
             }
@@ -67,8 +72,8 @@ sub _getDisplays {
     }
 
     return (
-        MONITORS => $monitors,
-        VIDEOS   => $videos
+        MONITORS => \@monitors,
+        VIDEOS   => \@videos
     );
 
 }
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Bios.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Bios.pm
index 680cb0d..08de6b0 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Bios.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Bios.pm
@@ -133,7 +133,7 @@ sub _parsePrtconf {
     );
     return unless $handle;
 
-    my ($infos, $name, $OBPstring);
+    my $infos;
     while (my $line = <$handle>) {
         next unless $line =~ /^ \s* ([^:]+) : \s* ' (.+) '$/x;
         next if $infos->{$1};
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Memory.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Memory.pm
index 2110677..82fd6ae 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Memory.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Memory.pm
@@ -132,7 +132,6 @@ sub _getMemories2 {
     my $flag_mt = 0;
 
     my $capacity;
-    my $description;
     my $caption;
     my $speed;
     my $type;
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Slots.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Slots.pm
index 91a3aa0..2c3914c 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Slots.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Slots.pm
@@ -32,7 +32,7 @@ sub doInventory {
 }
 
 sub _getSlots4 {
-    my %params = (
+    my (%params) = (
         command => 'prtdiag',
         @_
     );
@@ -57,7 +57,7 @@ sub _getSlots4 {
 }
 
 sub _getSlots5 {
-    my %params = (
+    my (%params) = (
         command => 'prtdiag',
         @_
     );
@@ -71,27 +71,26 @@ sub _getSlots5 {
     my $name;
     my $description;
     my $designation;
-    my $status;
 
-    while (<$handle>) {
-        last if /^\=+/ && $flag_pci && $flag;
+    while (my $line = <$handle>) {
+        last if $line =~ /^\=+/ && $flag_pci && $flag;
 
-        if (/^=+\S+\s+IO Cards/) {
+        if ($line =~ /^=+\S+\s+IO Cards/) {
             $flag_pci = 1;
         }
-        if ($flag_pci && /^-+/) {
+        if ($flag_pci && $line =~ /^-+/) {
             $flag = 1;
         }
 
         next unless $flag && $flag_pci;
 
-        if (/^\s+(\d+)/){
+        if ($line =~ /^\s+(\d+)/) {
             $name = "LSB " . $1;
         }
-        if(/^\s+\S+\s+(\S+)/){
+        if ($line =~ /^\s+\S+\s+(\S+)/) {
             $description = $1;
         }
-        if(/^\s+\S+\s+\S+\s+(\S+)/){
+        if ($line =~ /^\s+\S+\s+\S+\s+(\S+)/) {
             $designation = $1;
         }
 
@@ -107,12 +106,12 @@ sub _getSlots5 {
 }
 
 sub _getSlotsDefault {
-    my %params = (
+    my (%params) = (
         command => 'prtdiag',
         @_
     );
 
-    my $handle  = getFileHandle(%params);
+    my $handle = getFileHandle(%params);
     return unless $handle;
 
     my @slots;
@@ -123,28 +122,28 @@ sub _getSlotsDefault {
     my $designation;
     my $status;
 
-    while (<$handle>) {
-        last if /^\=+/ && $flag_pci;
-        next if /^\s+/ && $flag_pci;
-        if (/^=+\s+IO Cards/) {
+    while (my $line = <$handle>) {
+        last if $line =~ /^\=+/ && $flag_pci;
+        next if $line =~ /^\s+/ && $flag_pci;
+        if ($line =~ /^=+\s+IO Cards/) {
             $flag_pci = 1;
         }
-        if ($flag_pci && /^-+/) {
+        if ($flag_pci && $line =~ /^-+/) {
             $flag = 1;
         }
 
         next unless $flag && $flag_pci;
 
-        if(/^(\S+)\s+/){
+        if ($line =~ /^(\S+)\s+/){
             $name = $1;
         }
-        if(/(\S+)\s*$/){
+        if ($line =~ /(\S+)\s*$/){
             $designation = $1;
         }
-        if(/^\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+(\S+)/){
+        if ($line =~ /^\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+(\S+)/) {
             $description = $1;
         }
-        if(/^\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+(\S+)/){
+        if ($line =~ /^\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+(\S+)/) {
             $status = $1;
         }
         push @slots, {
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Softwares.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Softwares.pm
index 4d63288..d2274ed 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Softwares.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Softwares.pm
@@ -9,7 +9,7 @@ sub isEnabled {
     my (%params) = @_;
 
     return 
-        !$params{no_software} &&
+        !$params{no_category}->{software} &&
         canRun('pkginfo');
 }
 
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/Libvirt.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/Libvirt.pm
index cfa845b..dc3ccf9 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/Libvirt.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/Libvirt.pm
@@ -26,7 +26,7 @@ sub doInventory {
 }
 
 sub _getMachines {
-    my %params = @_;
+    my (%params) = @_;
 
     my @machines = _parseList(
         command => 'virsh list --all',
@@ -49,7 +49,7 @@ sub _getMachines {
 }
 
 sub _parseList {
-    my %params = @_;
+    my (%params) = @_;
 
     my $handle = getFileHandle(%params);
     return unless $handle;
@@ -84,7 +84,7 @@ sub _parseList {
 }
 
 sub _parseDumpxml {
-    my %params = @_;
+    my (%params) = @_;
 
     my $xml = getAllLines(%params);
     if (!$xml) {
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/Parallels.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/Parallels.pm
index 74b84f9..c96e952 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/Parallels.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/Parallels.pm
@@ -70,7 +70,7 @@ sub _parsePrlctlA {
     my $line = <$handle>;
 
     my @machines;
-    foreach my $line (<$handle>) {
+    while (my $line = <$handle>) {
         chomp $line; 
         my @info = split(/\s+/, $line, 4);
         my $uuid   = $info[0];
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/SolarisZones.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/SolarisZones.pm
index cafaa8c..2909a3e 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/SolarisZones.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/SolarisZones.pm
@@ -22,8 +22,8 @@ sub doInventory {
         getAllLines(command => '/usr/sbin/zoneadm list -p', logger => $logger);
 
     foreach my $zone (@zones) {
-        my ($zoneid, $zonename, $zonestatus, $pathroot , $uuid) = split(/:/, $zone);
-        # 
+        my ($zoneid, $zonename, $zonestatus, undef, $uuid) = split(/:/, $zone);
+         
         # Memory considerations depends on rcapd or project definitions
         # Little hack, I go directly in /etc/zones reading mcap physcap for each zone.
         my $zonefile = "/etc/zones/$zonename.xml";
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/VmWareDesktop.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/VmWareDesktop.pm
index 5390a61..d4e0b41 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/VmWareDesktop.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/VmWareDesktop.pm
@@ -33,7 +33,7 @@ sub doInventory {
 }
 
 sub _getMachines {
-   my %params = @_;
+   my (%params) = @_;
 
     my $handle = getFileHandle(%params);
     return unless $handle;
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/Xen.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/Xen.pm
index 424be3b..60c5ba1 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/Xen.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/Xen.pm
@@ -53,7 +53,7 @@ sub  _getVirtualMachines {
     my @machines;
     while (my $line = <$handle>) {
         chomp $line;
-        my ($name, $vmid, $memory, $vcpu, $status, $time) = split(' ', $line);
+        my ($name, $vmid, $memory, $vcpu, $status) = split(' ', $line);
         next if $name eq 'Domain-0';
         next if $vmid == 0;
 
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/AntiVirus.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/AntiVirus.pm
index ebcdbeb..558e157 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/AntiVirus.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/AntiVirus.pm
@@ -15,7 +15,6 @@ sub doInventory {
     my (%params) = @_;
 
     my $inventory = $params{inventory};
-    my $logger    = $params{logger};
 
     # Doesn't works on Win2003 Server
     # On Win7, we need to use SecurityCenter2
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Bios.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Bios.pm
index a3d02be..5ec74eb 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Bios.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Bios.pm
@@ -74,9 +74,10 @@ sub doInventory {
                 SerialNumber Product Manufacturer
             / ]
     )) {
-        $bios->{BASEBOARDSERIAL} = $object->{SerialNumber};
-        $bios->{SSN}             = $object->{SerialNumber} unless $bios->{SSN};
+        $bios->{MSN}             = $object->{SerialNumber};
         $bios->{MMODEL}          = $object->{Product};
+        $bios->{SSN}             = $object->{SerialNumber}
+            unless $bios->{SSN};
         $bios->{SMANUFACTURER}   = $object->{Manufacturer}
             unless $bios->{SMANUFACTURER};
 
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/CPU.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/CPU.pm
index a086573..8f1d49c 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/CPU.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/CPU.pm
@@ -28,15 +28,11 @@ sub doInventory {
     my $inventory = $params{inventory};
     my $logger    = $params{logger};
 
-    my $serial;
-    my $id;
-    my $speed;
-
     my @dmidecodeCpu = getCpusFromDmidecode();
 
     my $vmsystem;
-
     my $cpuId = 0;
+
     foreach my $object (getWmiObjects(
         class      => 'Win32_Processor',
         properties => [ qw/NumberOfCores ProcessorId MaxClockSpeed/ ]
@@ -60,7 +56,6 @@ sub doInventory {
         my $speed = $dmidecodeCpu[$cpuId]->{SPEED} || $object->{MaxClockSpeed};
         my $serial = $dmidecodeCpu[$cpuId]->{SERIAL};
 
-
         # Some information are missing on Win2000
         if (!$name) {
             $name = $ENV{PROCESSOR_IDENTIFIER};
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Controllers.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Controllers.pm
index 30fe815..c7da8e6 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Controllers.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Controllers.pm
@@ -13,7 +13,6 @@ sub doInventory {
     my (%params) = @_;
 
     my $inventory = $params{inventory};
-    my $logger    = $params{logger};
     my %seen;
 
     foreach my $class (qw/
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Drives.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Drives.pm
index baab2a4..433232a 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Drives.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Drives.pm
@@ -23,7 +23,6 @@ sub doInventory {
     my (%params) = @_;
 
     my $inventory = $params{inventory};
-    my $logger    = $params{logger};
 
     my $systemDrive;
     foreach my $object (getWmiObjects(
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Environment.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Environment.pm
index 0cc4eab..93e02b4 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Environment.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Environment.pm
@@ -6,7 +6,9 @@ use warnings;
 use FusionInventory::Agent::Tools::Win32;
 
 sub isEnabled {
-    return 1;
+    my (%params) = @_;
+
+    return !$params{no_category}->{environment};
 }
 
 sub doInventory {
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Inputs.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Inputs.pm
index 6d025f8..01c0c1d 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Inputs.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Inputs.pm
@@ -29,7 +29,6 @@ sub isEnabled {
 sub doInventory {
     my (%params) = @_;
 
-    my $logger    = $params{logger};
     my $inventory = $params{inventory};
 
     foreach my $object (getWmiObjects(
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/OS.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/OS.pm
index 6e7ce84..2795421 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/OS.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/OS.pm
@@ -6,6 +6,7 @@ use integer;
 
 use English qw(-no_match_vars);
 
+use FusionInventory::Agent::Tools;
 use FusionInventory::Agent::Tools::Hostname;
 use FusionInventory::Agent::Tools::Win32;
 
@@ -32,21 +33,28 @@ sub doInventory {
             path   => 'HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/lanmanserver/Parameters/srvcomment',
             logger => $logger
         ));
+        my $installDate = getFormatedLocalTime(hex2dec(
+            encodeFromRegistry(getRegistryValue(
+                path   => 'HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/InstallDate',
+                logger => $logger
+            ))
+        ));
 
         $object->{TotalSwapSpaceSize} = int($object->{TotalSwapSpaceSize} / (1024 * 1024))
             if $object->{TotalSwapSpaceSize};
 
         $inventory->setHardware({
-            WINLANG     => $object->{OSLanguage},
-            OSNAME      => $object->{Caption},
-            OSVERSION   => $object->{Version},
-            WINPRODKEY  => $key,
-            WINPRODID   => $object->{SerialNumber},
-            WINCOMPANY  => $object->{Organization},
-            WINOWNER    => $object->{RegistredUser},
-            OSCOMMENTS  => $object->{CSDVersion},
-            SWAP        => $object->{TotalSwapSpaceSize},
-            DESCRIPTION => $description,
+            WINLANG       => $object->{OSLanguage},
+            OSNAME        => $object->{Caption},
+            OSVERSION     => $object->{Version},
+            WINPRODKEY    => $key,
+            WINPRODID     => $object->{SerialNumber},
+            WINCOMPANY    => $object->{Organization},
+            WINOWNER      => $object->{RegistredUser},
+            OSCOMMENTS    => $object->{CSDVersion},
+            SWAP          => $object->{TotalSwapSpaceSize},
+            DESCRIPTION   => $description,
+            OSINSTALLDATE => $installDate
         });
 
         $inventory->setOperatingSystem({
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Printers.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Printers.pm
index 48e8e6d..d74b45b 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Printers.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Printers.pm
@@ -44,7 +44,8 @@ my @errStatus = (
 
 sub isEnabled {
     my (%params) = @_;
-    return !$params{no_printer};
+
+    return !$params{no_category}->{printer};
 }
 
 sub doInventory {
@@ -124,20 +125,26 @@ sub _getUSBPrinterSerial {
     return $serial;
 }
 
+# find the ParentIdPrefix value for the printer matching given portname
 sub _getUSBPrefix {
-    my ($printKey, $portName) = @_;
-
-    # find the printer entry matching given portname
-    foreach my $printerKey (values %$printKey) {
-        # look for a subkey with expected content
-        foreach my $subKeyName (keys %$printerKey) {
-            my $subKey = $printerKey->{$subKeyName};
+    my ($print, $portName) = @_;
+
+    # registry data structure:
+    # USBPRINT
+    # └── device
+    #     └── subdevice
+    #         └── Device Parameters
+    #             └── PortName:value
+
+    foreach my $device (values %$print) {
+        foreach my $subdeviceName (keys %$device) {
+            my $subdevice = $device->{$subdeviceName};
             next unless 
-                $subKey->{'Device Parameters/'}                &&
-                $subKey->{'Device Parameters/'}->{'/PortName'} &&
-                $subKey->{'Device Parameters/'}->{'/PortName'} eq $portName;
+                $subdevice->{'Device Parameters/'}                &&
+                $subdevice->{'Device Parameters/'}->{'/PortName'} &&
+                $subdevice->{'Device Parameters/'}->{'/PortName'} eq $portName;
             # got it
-            my $prefix = $subKeyName;
+            my $prefix = $subdeviceName;
             $prefix =~ s{&$portName/$}{};
             return $prefix;
         };
@@ -146,19 +153,26 @@ sub _getUSBPrefix {
     return;
 }
 
+# find the key name for the device matching given parentIdPrefix
 sub _getUSBSerial {
-    my ($usbKey, $prefix) = @_;
+    my ($usb, $prefix) = @_;
+
+    # registry data structure:
+    # USB
+    # └── device
+    #     └── subdevice
+    #         └── ParentIdPrefix:value
 
-    # find the device entry matching given container Id
-    foreach my $deviceKey (values %$usbKey) {
-        # look for a subkey with expected content
-        foreach my $subKeyName (keys %$deviceKey) {
-            my $subKey = $deviceKey->{$subKeyName};
+    foreach my $device (values %$usb) {
+        foreach my $subdeviceName (keys %$device) {
+            my $subdevice = $device->{$subdeviceName};
             next unless
-                $subKey->{'/ParentIdPrefix'} &&
-                $subKey->{'/ParentIdPrefix'} eq $prefix;
+                $subdevice->{'/ParentIdPrefix'} &&
+                $subdevice->{'/ParentIdPrefix'} eq $prefix;
             # got it
-            my $serial = $subKeyName;
+            my $serial = $subdeviceName;
+            # pseudo serial generated by windows
+            return if $serial =~ /&/;
             $serial =~ s{/$}{};
             return $serial;
         }
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm
index 4c6c9a7..e65d362 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm
@@ -20,14 +20,13 @@ my $seen = {};
 sub isEnabled {
     my (%params) = @_;
 
-    return !$params{no_software};
+    return !$params{no_category}->{software};
 }
 
 sub doInventory {
     my (%params) = @_;
 
     my $inventory = $params{inventory};
-    my $logger    = $params{logger};
 
     if (is64bit()) {
 
@@ -50,10 +49,9 @@ sub doInventory {
             _addSoftware(inventory => $inventory, entry => $software, logger => $logger);
         }
         _processMSIE(
-            machKey => $machKey64,
+            machKey   => $machKey64,
             inventory => $inventory,
-            is64bit => 1,
-            logger => $logger,
+            is64bit   => 1
         );
 
         my $machKey32 = $Registry->Open('LMachine', {
@@ -71,10 +69,9 @@ sub doInventory {
             _addSoftware(inventory => $inventory, entry => $software, logger => $logger);
         }
         _processMSIE(
-            machKey => $machKey32,
+            machKey   => $machKey32,
             inventory => $inventory,
-            is64bit => 0,
-            logger => $logger
+            is64bit   => 0
         );
 
 
@@ -93,10 +90,9 @@ sub doInventory {
             _addSoftware(inventory => $inventory, entry => $software, logger => $logger);
         }
         _processMSIE(
-            machKey => $machKey,
+            machKey   => $machKey,
             inventory => $inventory,
-            is64bit => 0,
-            logger => $logger
+            is64bit   => 0
         );
     }
 }
@@ -122,8 +118,6 @@ sub _getSoftwares {
     my (%params) = @_;
 
     my $softwares = $params{softwares};
-    my $is64bit   = $params{is64bit};
-    my $logger   = $params{logger};
 
     my @softwares;
 
@@ -155,7 +149,7 @@ sub _getSoftwares {
             VERSION_MINOR    => hex2dec($data->{'/MinorVersion'}),
             VERSION_MAJOR    => hex2dec($data->{'/MajorVersion'}),
             NO_REMOVE        => hex2dec($data->{'/NoRemove'}),
-            IS64BIT          => $is64bit,
+            IS64BIT          => $params{is64bit},
             GUID             => $guid,
         };
 
@@ -169,7 +163,7 @@ sub _getSoftwares {
 }
 
 sub _addSoftware {
-    my %params = @_;
+    my (%params) = @_;
 
     my $entry = $params{entry};
 
@@ -181,28 +175,25 @@ sub _addSoftware {
 }
 
 sub _processMSIE {
-    my %params = @_;
+    my (%params) = @_;
 
-    my $inventory = $params{inventory};
-    my $is64bit = $params{is64bit} || 0;
+    my $name = $params{is64bit} ?
+        "Internet Explorer (64bit)" : "Internet Explorer";
+    my $version = 
+        $params{machKey}->{"SOFTWARE/Microsoft/Internet Explorer/Version"};
 
-    my $name = "Internet Explorer";
-    if ($is64bit) {
-        $name .= " (64bit)";
-    }
-    my $version = $params{machKey}->{"SOFTWARE/Microsoft/Internet Explorer/Version"};
-    return unless $version;
+    return unless $version; # Not installed
 
     _addSoftware(
         inventory => $params{inventory},
-        logger => $params{logger},
-        entry => {
-            FROM => "registry",
-            IS64BIT => $is64bit,
-            NAME => $name,
-            VERSION => $version,
-        PUBLISHER => "Microsoft Corporation"
-    });
+        entry     => {
+            FROM      => "registry",
+            IS64BIT   => $params{is64bit},
+            NAME      => $name,
+            VERSION   => $version,
+            PUBLISHER => "Microsoft Corporation"
+        }
+    );
 
 }
 
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Inventory.pm b/lib/FusionInventory/Agent/Task/Inventory/Inventory.pm
index a2d864d..df701fd 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Inventory.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Inventory.pm
@@ -29,10 +29,11 @@ my %fields = (
     MODEMS      => [ qw/DESCRIPTION NAME/ ],
     MONITORS    => [ qw/BASE64 CAPTION DESCRIPTION MANUFACTURER SERIAL
                         UUENCODE/ ],
-    NETWORKS    => [ qw/DESCRIPTION DRIVER IPADDRESS IPADDRESS6 IPDHCP IPGATEWAY
-                        IPMASK IPSUBNET MACADDR MTU PCISLOT PNPDEVICEID STATUS
-                        TYPE VIRTUALDEV SLAVES SPEED MANAGEMENT BSSID SSID WWN
-                        MANUFACTURER FIRMWARE MODEL/ ],
+    NETWORKS    => [ qw/BSSID DESCRIPTION DRIVER FIRMWARE IPADDRESS IPADDRESS6 
+                        IPDHCP IPGATEWAY IPMASK IPMASK6 IPSUBNET IPSUBNET6
+                        MANAGEMENT MANUFACTURER MACADDR MODEL MTU PCISLOT 
+                        PNPDEVICEID STATUS SLAVES SPEED SSID TYPE VIRTUALDEV  
+                        WWN/ ],
     PORTS       => [ qw/CAPTION DESCRIPTION NAME TYPE/ ],
     PROCESSES   => [ qw/USER PID CPUUSAGE MEM VIRTUALMEMORY TTY STARTED CMD/ ],
     REGISTRY    => [ qw/NAME REGVALUE HIVE/ ],
@@ -51,11 +52,14 @@ my %fields = (
     PRINTERS    => [ qw/COMMENT DESCRIPTION DRIVER NAME NETWORK PORT RESOLUTION
                         SHARED STATUS ERRSTATUS SERVERNAME SHARENAME 
                         PRINTPROCESSOR SERIAL/ ],
-    VIRTUALMACHINES => [ qw/MEMORY NAME UUID STATUS SUBSYSTEM VMTYPE VCPU
-                            VMID MAC COMMENT OWNER/ ],
-    LOGICAL_VOLUMES => [ qw/LV_NAME VGN_AME ATTR SIZE LV_UUID SEG_COUNT VG_UUID/ ],
-    PHYSICAL_VOLUMES => [ qw/DEVICE PV_NAME PV_PE_COUNT PV_UUID FORMAT ATTR SIZE FREE PE_SIZE/ ],
-    VOLUME_GROUPS => [ qw/VG_NAME PV_COUNT LV_COUNT ATTR SIZE FREE VG_UUID VG_EXTENT_SIZE/ ],
+    VIRTUALMACHINES  => [ qw/MEMORY NAME UUID STATUS SUBSYSTEM VMTYPE VCPU
+                             VMID MAC COMMENT OWNER/ ],
+    LOGICAL_VOLUMES  => [ qw/LV_NAME VGN_AME ATTR SIZE LV_UUID SEG_COUNT 
+                             VG_UUID/ ],
+    PHYSICAL_VOLUMES => [ qw/DEVICE PV_NAME PV_PE_COUNT PV_UUID FORMAT ATTR 
+                             SIZE FREE PE_SIZE/ ],
+    VOLUME_GROUPS    => [ qw/VG_NAME PV_COUNT LV_COUNT ATTR SIZE FREE VG_UUID 
+                             VG_EXTENT_SIZE/ ],
 
 );
 
@@ -242,7 +246,7 @@ sub setHardware {
         PROCESSORT NAME PROCESSORS SWAP ETIME TYPE OSNAME IPADDR WORKGROUP
         DESCRIPTION MEMORY UUID DNS LASTLOGGEDUSER USERDOMAIN
         DATELASTLOGGEDUSER DEFAULTGATEWAY VMSYSTEM WINOWNER WINPRODID
-        WINPRODKEY WINCOMPANY WINLANG CHASSIS_TYPE/) {
+        WINPRODKEY WINCOMPANY WINLANG CHASSIS_TYPE OSINSTALLDATE/) {
 # WINLANG: Windows Language, see MSDN Win32_OperatingSystem documentation
         if (exists $args->{$key}) {
             my $string = getSanitizedString($args->{$key});
@@ -299,16 +303,6 @@ sub setTag {
 
 }
 
-sub checkContent {
-    my ($self, $args) = @_;
-
-    my $logger = $self->{logger};
-
-    my $missing = 0;
-    my $content = $self->{content};
-
-}
-
 sub computeChecksum {
     my ($self) = @_;
 
@@ -374,7 +368,7 @@ sub computeChecksum {
 }
 
 sub saveLastState {
-    my ($self, $args) = @_;
+    my ($self) = @_;
 
     my $logger = $self->{logger};
 
@@ -479,10 +473,6 @@ Set BIOS informations.
 
 What is that for? :)
 
-=head2 checkContent()
-
-Check inventory content.
-
 =head2 computeChecksum()
 
 Compute the inventory checksum. This information is used by the server to
@@ -548,8 +538,6 @@ Motherboard model
 
 =item ENCLOSURESERIAL
 
-=item BASEBOARDSERIAL
-
 =item BIOSSERIAL
 
 The optional asset tag for this machine.
diff --git a/lib/FusionInventory/Agent/Tools.pm b/lib/FusionInventory/Agent/Tools.pm
index 7ff5ed8..0e8e17d 100644
--- a/lib/FusionInventory/Agent/Tools.pm
+++ b/lib/FusionInventory/Agent/Tools.pm
@@ -202,7 +202,7 @@ sub getSanitizedString {
 }
 
 sub getDirectoryHandle {
-    my %params = @_;
+    my (%params) = @_;
 
     die "no directory parameter given" unless $params{directory};
 
@@ -218,7 +218,7 @@ sub getDirectoryHandle {
 }
 
 sub getFileHandle {
-    my %params = @_;
+    my (%params) = @_;
 
     my $handle;
 
@@ -252,7 +252,7 @@ sub getFileHandle {
 }
 
 sub getFirstLine {
-    my %params = @_;
+    my (%params) = @_;
 
     my $handle = getFileHandle(%params);
     return unless $handle;
@@ -265,7 +265,7 @@ sub getFirstLine {
 }
 
 sub getLastLine {
-    my %params = @_;
+    my (%params) = @_;
 
     my $handle = getFileHandle(%params);
     return unless $handle;
@@ -281,7 +281,7 @@ sub getLastLine {
 }
 
 sub getFirstMatch {
-    my %params = @_;
+    my (%params) = @_;
 
     return unless $params{pattern};
     my $handle = getFileHandle(%params);
@@ -298,7 +298,7 @@ sub getFirstMatch {
 }
 
 sub getAllLines {
-    my %params = @_;
+    my (%params) = @_;
 
     my $handle = getFileHandle(%params);
     return unless $handle;
@@ -316,7 +316,7 @@ sub getAllLines {
 }
 
 sub getLinesCount {
-    my %params = @_;
+    my (%params) = @_;
 
     my $handle = getFileHandle(%params);
     return unless $handle;
diff --git a/lib/FusionInventory/Agent/Tools/AIX.pm b/lib/FusionInventory/Agent/Tools/AIX.pm
index 4524400..2eb9538 100644
--- a/lib/FusionInventory/Agent/Tools/AIX.pm
+++ b/lib/FusionInventory/Agent/Tools/AIX.pm
@@ -18,7 +18,7 @@ memoize('getLsvpdInfos');
 memoize('getAdaptersFromLsdev');
 
 sub getLsvpdInfos {
-    my %params = (
+    my (%params) = (
         command => 'lsvpd',
         @_
     );
@@ -55,7 +55,7 @@ sub getLsvpdInfos {
 }
 
 sub getAdaptersFromLsdev {
-    my %params = (
+    my (%params) = (
         command => 'lsdev -Cc adapter -F "name:type:description"',
         @_
     );
diff --git a/lib/FusionInventory/Agent/Tools/Generic.pm b/lib/FusionInventory/Agent/Tools/Generic.pm
index ca807ba..03c1cc5 100644
--- a/lib/FusionInventory/Agent/Tools/Generic.pm
+++ b/lib/FusionInventory/Agent/Tools/Generic.pm
@@ -19,7 +19,7 @@ memoize('getDmidecodeInfos');
 memoize('getPCIDevices');
 
 sub getDmidecodeInfos {
-    my %params = (
+    my (%params) = (
         command => 'dmidecode',
         @_
     );
@@ -124,7 +124,7 @@ sub getCpusFromDmidecode {
 }
 
 sub getPCIDevices {
-    my %params = (
+    my (%params) = (
         command => 'lspci -vvv -nn',
         @_
     );
diff --git a/lib/FusionInventory/Agent/Tools/HPUX.pm b/lib/FusionInventory/Agent/Tools/HPUX.pm
index 700a9d6..f897029 100644
--- a/lib/FusionInventory/Agent/Tools/HPUX.pm
+++ b/lib/FusionInventory/Agent/Tools/HPUX.pm
@@ -18,7 +18,7 @@ memoize('getInfoFromMachinfo');
 memoize('isHPVMGuest');
 
 sub getInfoFromMachinfo {
-    my %params = (
+    my (%params) = (
         command => '/usr/contrib/bin/machinfo',
         @_
     );
diff --git a/lib/FusionInventory/Agent/Tools/Linux.pm b/lib/FusionInventory/Agent/Tools/Linux.pm
index 2559bef..f2e90d4 100644
--- a/lib/FusionInventory/Agent/Tools/Linux.pm
+++ b/lib/FusionInventory/Agent/Tools/Linux.pm
@@ -24,7 +24,7 @@ our @EXPORT = qw(
 memoize('getDevicesFromUdev');
 
 sub getDevicesFromUdev {
-    my %params = @_;
+    my (%params) = @_;
 
     my @devices;
 
@@ -45,7 +45,7 @@ sub getDevicesFromUdev {
 }
 
 sub _parseUdevEntry {
-    my %params = @_;
+    my (%params) = @_;
 
     my $handle = getFileHandle(%params);
     return unless $handle;
@@ -85,7 +85,7 @@ sub _parseUdevEntry {
 }
 
 sub getCPUsFromProc {
-    my %params = (
+    my (%params) = (
         file => '/proc/cpuinfo',
         @_
     );
@@ -120,7 +120,7 @@ sub _isValidCPU {
 
 
 sub getDevicesFromHal {
-    my %params = (
+    my (%params) = (
         command => '/usr/bin/lshal',
         @_
     );
@@ -164,7 +164,7 @@ sub getDevicesFromHal {
 }
 
 sub getDevicesFromProc {
-    my %params = @_;
+    my (%params) = @_;
 
     # compute list of devices
     my @names;
@@ -245,7 +245,7 @@ sub _getValueFromSysProc {
 }
 
 sub getSerialnumber {
-    my %params = @_;
+    my (%params) = @_;
 
     my ($serial) = getFirstMatch(
         command => $params{device} ? "smartctl -i $params{device}" : undef,
@@ -258,7 +258,7 @@ sub getSerialnumber {
 }
 
 sub getInterfacesFromIfconfig {
-    my %params = (
+    my (%params) = (
         command => '/sbin/ifconfig -a',
         @_
     );
@@ -307,7 +307,7 @@ sub getInterfacesFromIfconfig {
     return @interfaces;
 }
 sub getInterfacesFromIp {
-    my %params = (
+    my (%params) = (
         command => '/sbin/ip addr show',
         @_
     );
@@ -332,7 +332,7 @@ sub getInterfacesFromIp {
             $interface->{IPADDRESS6} = $1;
         } elsif ($line =~ /inet ($ip_address_pattern)\/(\d{1,3})/) {
             $interface->{IPADDRESS} = $1;
-            $interface->{IPMASK}    = getNetworkMask($1, $2);
+            $interface->{IPMASK}    = getNetworkMask($2);
             $interface->{IPSUBNET}  = getSubnetAddress(
                 $interface->{IPADDRESS}, $interface->{IPMASK}
             );
diff --git a/lib/FusionInventory/Agent/Tools/MacOS.pm b/lib/FusionInventory/Agent/Tools/MacOS.pm
index 321f906..bef132c 100644
--- a/lib/FusionInventory/Agent/Tools/MacOS.pm
+++ b/lib/FusionInventory/Agent/Tools/MacOS.pm
@@ -5,6 +5,7 @@ use warnings;
 use base 'Exporter';
 
 use English qw(-no_match_vars);
+use Memoize;
 
 use FusionInventory::Agent::Tools;
 
@@ -13,8 +14,10 @@ our @EXPORT = qw(
     getIODevices
 );
 
+memoize('getSystemProfilerInfos');
+
 sub getSystemProfilerInfos {
-    my %params = (
+    my (%params) = (
         command => '/usr/sbin/system_profiler',
         @_
     );
@@ -32,14 +35,32 @@ sub getSystemProfilerInfos {
         my $level = defined $1 ? length($1) : 0;
         my $key = $2;
         my $value = $3;
+        
+        my $parent = $parents[-1];
+        my $parent_level = $parent->[1];
+        my $parent_node  = $parent->[0];
+
+        if (defined $value) {
+            # check indentation level against parent node
+            if ($level <= $parent_level) {
+
+                if (keys %$parent_node == 0) {
+                    # discard just created node, and fix its parent
+                    my $parent_key = $parent->[2];
+                    $parents[-2]->[0]->{$parent_key} = undef;
+                }
+
+                # unstack nodes until a suitable parent is found
+                while ($level <= $parents[-1]->[1]) {
+                    pop @parents;
+                }
+                $parent_node = $parents[-1]->[0];
+            }
 
-        if ($value) {
-            # just add the value to the current parent
-            $parents[-1]->[0]->{$key} = $value;
+            # add the value to the current node
+            $parent_node->{$key} = $value;
         } else {
             # compare level with parent
-            my $parent_level = $parents[-1]->[1];
-
             if ($level > $parent_level) {
                 # down the tree: no change
             } elsif ($level < $parent_level) {
@@ -55,7 +76,7 @@ sub getSystemProfilerInfos {
             # create a new node, and push it to the stack
             my $parent_node = $parents[-1]->[0];
             $parent_node->{$key} = {};
-            push (@parents, [ $parent_node->{$key}, $level ]);
+            push (@parents, [ $parent_node->{$key}, $level, $key ]);
         }
     }
     close $handle;
@@ -64,7 +85,7 @@ sub getSystemProfilerInfos {
 }
 
 sub getIODevices {
-    my %params = @_;
+    my (%params) = @_;
 
     # passing expected class to the command ensure only instance of this class
     # are present in the output, reducing the size of the content to be parsed,
diff --git a/lib/FusionInventory/Agent/Tools/Network.pm b/lib/FusionInventory/Agent/Tools/Network.pm
index 65ce338..27bdd20 100644
--- a/lib/FusionInventory/Agent/Tools/Network.pm
+++ b/lib/FusionInventory/Agent/Tools/Network.pm
@@ -86,7 +86,7 @@ sub alt2canonical {
 }
 
 sub getNetworkMask {
-    my ($address, $prefix) = @_;
+    my ($prefix) = @_;
 
     my $mask;
     $mask .= 1 foreach(1..$prefix);
@@ -143,6 +143,6 @@ Returns the subnet address for IPv4.
 
 Returns the subnet address for IPv6.
 
-=head2 getNetworkMask($address, $prefix)
+=head2 getNetworkMask($prefix)
 
 Returns the network mask.
diff --git a/lib/FusionInventory/Agent/Tools/Unix.pm b/lib/FusionInventory/Agent/Tools/Unix.pm
index 428f54f..decc968 100644
--- a/lib/FusionInventory/Agent/Tools/Unix.pm
+++ b/lib/FusionInventory/Agent/Tools/Unix.pm
@@ -24,7 +24,7 @@ our @EXPORT = qw(
 memoize('getProcessesFromPs');
 
 sub getDeviceCapacity {
-    my %params = @_;
+    my (%params) = @_;
 
     return unless $params{device};
 
@@ -46,7 +46,7 @@ sub getDeviceCapacity {
 sub getIpDhcp {
     my ($logger, $if) = @_;
 
-    my $dhcpLeaseFile = _findDhcpLeaseFile($logger, $if);
+    my $dhcpLeaseFile = _findDhcpLeaseFile($if);
 
     return unless $dhcpLeaseFile;
 
@@ -54,8 +54,7 @@ sub getIpDhcp {
 }
 
 sub _findDhcpLeaseFile {
-    my ($logger, $if) = @_;
-
+    my ($if) = @_;
 
     my @directories = qw(
         /var/db
@@ -146,7 +145,7 @@ sub _parseDhcpLeaseFile {
 }
 
 sub getFilesystemsFromDf {
-    my %params = (@_);
+    my (%params) = @_;
     my $handle = getFileHandle(%params);
 
     my @filesystems;
@@ -197,7 +196,7 @@ sub getFilesystemsFromDf {
 }
 
 sub getFilesystemsTypesFromMount {
-    my %params = (
+    my (%params) = (
         command => 'mount',
         @_
     );
@@ -334,7 +333,7 @@ sub getProcessesFromPs {
 }
 
 sub getRoutingTable {
-    my %params = (
+    my (%params) = (
         command => 'netstat -nr -f inet',
         @_
     );
diff --git a/lib/FusionInventory/Agent/Tools/Win32.pm b/lib/FusionInventory/Agent/Tools/Win32.pm
index 6624a0e..1c49573 100644
--- a/lib/FusionInventory/Agent/Tools/Win32.pm
+++ b/lib/FusionInventory/Agent/Tools/Win32.pm
@@ -70,7 +70,7 @@ sub encodeFromRegistry {
 }
 
 sub getWmiObjects {
-    my %params = (
+    my (%params) = (
         moniker => 'winmgmts:{impersonationLevel=impersonate,(security)}!//./',
         @_
     );
@@ -93,7 +93,7 @@ sub getWmiObjects {
 }
 
 sub getRegistryValue {
-    my %params = @_;
+    my (%params) = @_;
 
     my ($root, $keyName, $valueName);
     if ($params{path} =~ /^(HKEY\S+?)\/(.*)\/([^\/.]*)/ ) {
diff --git a/lib/FusionInventory/Agent/XML/Query.pm b/lib/FusionInventory/Agent/XML/Query.pm
index 1c1e42d..0768f2e 100644
--- a/lib/FusionInventory/Agent/XML/Query.pm
+++ b/lib/FusionInventory/Agent/XML/Query.pm
@@ -21,7 +21,7 @@ sub new {
 }
 
 sub getContent {
-    my ($self, $args) = @_;
+    my ($self) = @_;
 
     my $tpp = XML::TreePP->new(indent => 2);
     return $tpp->write({ REQUEST => $self->{h} });
diff --git a/resources/win32/README b/resources/win32/README
new file mode 100644
index 0000000..92b1517
--- /dev/null
+++ b/resources/win32/README
@@ -0,0 +1,6 @@
+Windows specific command and file samples
+
+wmi: wmi queries results
+- *-CIM_LogicalDevice: wmic path CIM_LogicalDevice get /Format:list
+
+registry: registry exports
diff --git a/resources/win32/wmi/xppro2-CIM_LogicalDevice.wmi b/resources/win32/wmi/xppro2-CIM_LogicalDevice.wmi
new file mode 100644
index 0000000..010bbba
Binary files /dev/null and b/resources/win32/wmi/xppro2-CIM_LogicalDevice.wmi differ
diff --git a/t/05var.t b/t/05var.t
index 15bd4bf..2f1896b 100644
--- a/t/05var.t
+++ b/t/05var.t
@@ -23,5 +23,7 @@ if ($EVAL_ERROR) {
     plan(skip_all => 'Test::Vars required to validate the code');
 }
 
-Test::Vars::all_vars_ok();
+Test::Vars::all_vars_ok(
+    ignore_vars => { '$i' => 1, '%params' => 1, '$class' => 1 }
+);
 
diff --git a/t/apps/agent.t b/t/apps/agent.t
index 51f0fa7..ec53755 100755
--- a/t/apps/agent.t
+++ b/t/apps/agent.t
@@ -10,7 +10,7 @@ use XML::TreePP;
 
 use FusionInventory::Agent::Tools;
 
-use Test::More tests => 32;
+use Test::More tests => 37;
 
 my ($out, $err, $rc);
 
@@ -42,10 +42,12 @@ like(
 );
 is($out, '', 'no target stdin');
 
+my $base_options = "--stdout --no-task ocsdeploy,wakeonlan,snmpquery,netdiscovery";
+
 my $content;
 # first inventory
 ($out, $err, $rc) = run_agent(
-    "--stdout --no-ocsdeploy --no-wakeonlan --no-snmpquery --no-netdiscovery --no-printer"
+    "$base_options --no-category printer"
 );
 ok($rc == 0, 'exit status');
 
@@ -70,7 +72,7 @@ ok(
 
 # second inventory, without software
 ($out, $err, $rc) = run_agent(
-    "--stdout --no-ocsdeploy --no-wakeonlan --no-snmpquery --no-netdiscovery --no-printer --no-software"
+    "$base_options --no-category printer,software"
 );
 ok($rc == 0, 'exit status');
 
@@ -109,7 +111,7 @@ print $file <<EOF;
 EOF
 close($file);
 ($out, $err, $rc) = run_agent(
-    "--stdout --no-ocsdeploy --no-wakeonlan --no-snmpquery --no-netdiscovery --no-printer --no-software --additional-content $file"
+    "$base_options --no-category printer,software --additional-content $file"
 );
 ok($rc == 0, 'exit status');
 
@@ -129,7 +131,7 @@ ok(
 
 ok(
     ref $content->{REQUEST}->{CONTENT}->{SOFTWARES} eq 'HASH',
-    'software list has only one element'
+    'inventory has expected software list'
 );
 
 ok(
@@ -143,11 +145,10 @@ ok(
     'inventory has environment variables'
 );
 
-# create inventory targets
-$ENV{FOO} = 'bar';
+my $path = $ENV{PATH};
 
 ($out, $err, $rc) = run_agent(
-    "--stdout --no-ocsdeploy --no-wakeonlan --no-snmpquery --no-netdiscovery --no-printer --no-software"
+    "$base_options --no-category printer,software"
 );
 ok($rc == 0, 'exit status');
 
@@ -162,7 +163,7 @@ ok($content, 'output is valid XML');
 
 ok(
     !exists $content->{REQUEST}->{CONTENT}->{SOFTWARES},
-    "output doesn't have any software"
+    "inventory doesn't have any software"
 );
 
 ok(
@@ -170,16 +171,37 @@ ok(
     'inventory has environment variables'
 );
 
-SKIP: {
-skip '$ENV not set by IPC::Run on Windows', 1 if $OSNAME eq 'MSWin32';
 ok(
     (any
-        { $_->{KEY} eq 'FOO' && $_->{VAL} eq 'bar' } 
+        { $_->{KEY} eq 'PATH' && $_->{VAL} eq $path } 
         @{$content->{REQUEST}->{CONTENT}->{ENVS}}
     ),
-    'expected environment variable'
+    'inventory has expected environment variable value'
+);
+
+($out, $err, $rc) = run_agent(
+    "$base_options --no-category printer,software,environment"
+);
+ok($rc == 0, 'exit status');
+
+like(
+    $out,
+    qr/^<\?xml version="1.0" encoding="UTF-8" \?>/,
+    'output has correct encoding'
+);
+
+$content = XML::TreePP->new()->parse($out);
+ok($content, 'output is valid XML');
+
+ok(
+    !exists $content->{REQUEST}->{CONTENT}->{SOFTWARES},
+    "inventory doesn't have any software"
+);
+
+ok(
+    !exists $content->{REQUEST}->{CONTENT}->{ENVS},
+    "inventory doesn't have any environment variables"
 );
-}
 
 sub run_agent {
     my ($args) = @_;
diff --git a/t/inventory/macos/storages.t b/t/inventory/macos/storages.t
new file mode 100755
index 0000000..62a3759
--- /dev/null
+++ b/t/inventory/macos/storages.t
@@ -0,0 +1,98 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+use Test::More;
+
+use FusionInventory::Agent::Task::Inventory::Input::MacOS::Storages;
+
+my %tests = (
+    '10.4-powerpc' => [
+        {
+            NAME         => 'HL-DT-ST DVD-RW GWA-4165B',
+            FIRMWARE     => 'C006',
+            TYPE         => 'ATA',
+            SERIAL       => 'B6FD7234EC63',
+            DISKSIZE     => undef,
+            MANUFACTURER => 'HL-DT-ST DVD-RW GWA-4165B',
+            MODEL        => '',
+            DESCRIPTION  => 'CD-ROM Drive'
+        }
+    ],
+    '10.5-powerpc' => [
+        {
+            NAME         => 'HL-DT-ST DVD-RW GWA-4165B',
+            FIRMWARE     => 'C006',
+            TYPE         => 'ATA',
+            SERIAL       => 'B6FD7234EC63',
+            DISKSIZE     => undef,
+            MANUFACTURER => 'HL-DT-ST DVD-RW GWA-4165B',
+            MODEL        => '',
+            DESCRIPTION  => 'CD-ROM Drive'
+        },
+        {
+            NAME         => 'Flash Disk',
+            FIRMWARE     => undef,
+            TYPE         => 'USB',
+            SERIAL       => '110074973765',
+            DISKSIZE     => 2007,
+            MANUFACTURER => 'Flash Disk',
+            MODEL        => undef,
+            DESCRIPTION  => 'Disk drive'
+        },
+        {
+            NAME         => 'DataTraveler 2.0',
+            FIRMWARE     => undef,
+            TYPE         => 'USB',
+            SERIAL       => '89980116200801151425097A',
+            DISKSIZE     => 3850,
+            MANUFACTURER => 'DataTraveler 2.0',
+            MODEL        => undef,
+            DESCRIPTION  => 'Disk drive'
+        }
+    ],
+    '10.6-intel' => [
+        {
+            NAME         => 'MATSHITADVD-R   UJ-875',
+            FIRMWARE     => 'DB09',
+            TYPE         => 'ATA',
+            SERIAL       => '            fG424F9E',
+            DISKSIZE     => undef,
+            MANUFACTURER => 'Matshita',
+            MODEL        => 'DVD-R   UJ-875',
+            DESCRIPTION  => 'CD-ROM Drive'
+        },
+        {
+            NAME         => 'Flash Disk      ',
+            FIRMWARE     => undef,
+            TYPE         => 'USB',
+            SERIAL       => '110074973765',
+            DISKSIZE     => 2160,
+            MANUFACTURER => 'Flash Disk      ',
+            MODEL        => undef,
+            DESCRIPTION  => 'Disk drive'
+        }
+    ],
+    '10.6.6-intel' => [
+        {
+            NAME         => 'MATSHITACD-RW  CW-8221',
+            FIRMWARE     => 'GA0J',
+            TYPE         => 'ATA',
+            SERIAL       => undef,
+            DISKSIZE     => undef,
+            MANUFACTURER => 'Matshita',
+            MODEL        => 'CD-RW  CW-8221',
+            DESCRIPTION  => 'CD-ROM Drive'
+        }
+    ]
+);
+
+plan tests => scalar keys %tests;
+
+foreach my $test (keys %tests) {
+    my $file = "resources/macos/system_profiler/$test";
+    my @storages = FusionInventory::Agent::Task::Inventory::Input::MacOS::Storages::_getStorages(file => $file);
+    is_deeply(\@storages, $tests{$test}, $test) or print Dumper(\@storages);
+    use Data::Dumper;
+}
diff --git a/t/inventory/macos/video.t b/t/inventory/macos/video.t
deleted file mode 100755
index 3f5d3f7..0000000
--- a/t/inventory/macos/video.t
+++ /dev/null
@@ -1,88 +0,0 @@
-#!/usr/bin/perl
-
-use strict;
-use warnings;
-
-use Test::More;
-
-use FusionInventory::Agent::Task::Inventory::Input::MacOS::Videos;
-
-my %tests = (
-    '10.4-powerpc' => {
-        MONITORS => [
-            {
-                DESCRIPTION  => 'ASUS VH222',
-                CAPTION      => 'ASUS VH222'
-            }
-        ],
-        VIDEOS => [
-            {
-                NAME       => 'NVIDIA GeForce 6600',
-                RESOLUTION => '1360x768',
-                CHIPSET    => 'GeForce 6600',
-                MEMORY     => '256',
-                PCISLOT    => 'SLOT-1'
-            }
-        ]
-    },
-    '10.5-powerpc' => 
-        {
-        MONITORS => [
-            {
-                DESCRIPTION  => 'ASUS VH222',
-                CAPTION      => 'ASUS VH222'
-            }
-        ],
-        VIDEOS => [
-            {
-                NAME       => 'NVIDIA GeForce 6600',
-                RESOLUTION => '1680x1050',
-                CHIPSET    => 'GeForce 6600',
-                MEMORY     => '256',
-                PCISLOT    => 'SLOT-1'
-            }
-        ]
-    },
-    '10.6-intel' => {
-        MONITORS => [
-            {
-                DESCRIPTION  => 'iMac',
-                CAPTION      => 'iMac'
-            }
-        ],
-        VIDEOS => [
-            {
-                NAME       => 'ATI Radeon HD 2600 Pro',
-                RESOLUTION => '1920x1200',
-                CHIPSET    => 'ATI,RadeonHD2600',
-                MEMORY     => '256',
-                PCISLOT    => undef
-            }
-        ]
-    },
-    '10.6.6-intel' => {
-        MONITORS => [
-            {
-                DESCRIPTION  => 'Color LCD',
-                CAPTION      => 'Color LCD'
-            }
-        ],
-        VIDEOS => [
-            {
-                NAME       => 'Intel GMA 950',
-                RESOLUTION => '1280x800',
-                CHIPSET    => 'GMA 950',
-                MEMORY     => '64',
-                PCISLOT    => undef
-            }
-        ]
-    }
-);
-
-plan tests => scalar keys %tests;
-
-foreach my $test (keys %tests) {
-    my $file = "resources/macos/system_profiler/$test";
-    my %displays = FusionInventory::Agent::Task::Inventory::Input::MacOS::Videos::_getDisplays(file => $file);
-    is_deeply(\%displays, $tests{$test}, $test);
-}
diff --git a/t/inventory/macos/videos.t b/t/inventory/macos/videos.t
new file mode 100755
index 0000000..3f5d3f7
--- /dev/null
+++ b/t/inventory/macos/videos.t
@@ -0,0 +1,88 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+use Test::More;
+
+use FusionInventory::Agent::Task::Inventory::Input::MacOS::Videos;
+
+my %tests = (
+    '10.4-powerpc' => {
+        MONITORS => [
+            {
+                DESCRIPTION  => 'ASUS VH222',
+                CAPTION      => 'ASUS VH222'
+            }
+        ],
+        VIDEOS => [
+            {
+                NAME       => 'NVIDIA GeForce 6600',
+                RESOLUTION => '1360x768',
+                CHIPSET    => 'GeForce 6600',
+                MEMORY     => '256',
+                PCISLOT    => 'SLOT-1'
+            }
+        ]
+    },
+    '10.5-powerpc' => 
+        {
+        MONITORS => [
+            {
+                DESCRIPTION  => 'ASUS VH222',
+                CAPTION      => 'ASUS VH222'
+            }
+        ],
+        VIDEOS => [
+            {
+                NAME       => 'NVIDIA GeForce 6600',
+                RESOLUTION => '1680x1050',
+                CHIPSET    => 'GeForce 6600',
+                MEMORY     => '256',
+                PCISLOT    => 'SLOT-1'
+            }
+        ]
+    },
+    '10.6-intel' => {
+        MONITORS => [
+            {
+                DESCRIPTION  => 'iMac',
+                CAPTION      => 'iMac'
+            }
+        ],
+        VIDEOS => [
+            {
+                NAME       => 'ATI Radeon HD 2600 Pro',
+                RESOLUTION => '1920x1200',
+                CHIPSET    => 'ATI,RadeonHD2600',
+                MEMORY     => '256',
+                PCISLOT    => undef
+            }
+        ]
+    },
+    '10.6.6-intel' => {
+        MONITORS => [
+            {
+                DESCRIPTION  => 'Color LCD',
+                CAPTION      => 'Color LCD'
+            }
+        ],
+        VIDEOS => [
+            {
+                NAME       => 'Intel GMA 950',
+                RESOLUTION => '1280x800',
+                CHIPSET    => 'GMA 950',
+                MEMORY     => '64',
+                PCISLOT    => undef
+            }
+        ]
+    }
+);
+
+plan tests => scalar keys %tests;
+
+foreach my $test (keys %tests) {
+    my $file = "resources/macos/system_profiler/$test";
+    my %displays = FusionInventory::Agent::Task::Inventory::Input::MacOS::Videos::_getDisplays(file => $file);
+    is_deeply(\%displays, $tests{$test}, $test);
+}
diff --git a/t/inventory/windows/printers.t b/t/inventory/windows/printers.t
index 156549f..8199b06 100755
--- a/t/inventory/windows/printers.t
+++ b/t/inventory/windows/printers.t
@@ -15,23 +15,23 @@ use FusionInventory::Agent::Task::Inventory::Input::Win32::Printers;
 
 my %tests = (
     xppro1 => {
-        USB001 => [ '6&397bdcac&0', '49R8Ka' ],
-        USB002 => [ '6&2ad9257f&0', '5&19d1ce61&0&2' ],
-        USB003 => [ '6&1605722f&0', '5&2377f6ef&0&2' ],
+        USB001 => '49R8Ka',
+        USB002 => undef,
+        USB003 => undef
     },
     xppro2 => {
-        USB001 => [ '6&1086615&0',  'J5J126789' ],
-        USB003 => [ '6&159b6df2&0', 'JV40VNJ' ],
-        USB004 => [ '7&20bd29b5&0', '6&28e27c3d&0&0000' ],
+        USB001 => 'J5J126789',
+        USB003 => 'JV40VNJ',
+        USB004 => undef,
     },
     7 => {
-        USB001 => [ '7&17e8a3c3&0',  'MY26K1K34C2L' ],
+        USB001 => 'MY26K1K34C2L'
     }
 );
 
 my $plan = 0;
 foreach my $test (keys %tests) {
-    $plan += 2 * scalar (keys %{$tests{$test}});
+    $plan += scalar (keys %{$tests{$test}});
 }
 plan tests => $plan;
 
@@ -42,8 +42,7 @@ foreach my $test (keys %tests) {
         my $prefix = FusionInventory::Agent::Task::Inventory::Input::Win32::Printers::_getUSBPrefix($printKey, $port);
         my $serial = FusionInventory::Agent::Task::Inventory::Input::Win32::Printers::_getUSBSerial($usbKey, $prefix);
 
-        is($prefix, $tests{$test}->{$port}->[0], "prefix for printer $port");
-        is($serial, $tests{$test}->{$port}->[1], "serial for printer $port");
+        is($serial, $tests{$test}->{$port}, "serial for printer $port");
     }
 }
 
diff --git a/t/inventory/windows/usb.t b/t/inventory/windows/usb.t
index 6cc447f..f8a5147 100755
--- a/t/inventory/windows/usb.t
+++ b/t/inventory/windows/usb.t
@@ -48,6 +48,41 @@ my %tests = (
             VENDORID  => '046D',
             PRODUCTID => 'C30A'
         },
+    ],
+    xppro2 => [
+        {
+            NAME      => "Concentrador USB genérico",
+            VENDORID  => '046A',
+            PRODUCTID => '0009'
+        },
+        {
+            NAME      => 'Dispositivo compuesto USB',
+            VENDORID  => '046A',
+            PRODUCTID => '0019'
+        },
+        {
+            NAME      => 'SmartTerminal XX44',
+            VENDORID  => '046A',
+            PRODUCTID => '002D'
+        },
+        {
+            NAME      => 'Compatibilidad con impresoras USB',
+            SERIAL    => 'JV40VNJ',
+            VENDORID  => '03F0',
+            PRODUCTID => '3A17'
+        },
+        {
+            NAME      => 'Compatibilidad con impresoras USB',
+            SERIAL    => 'J5J126789',
+            VENDORID  => '04F9',
+            PRODUCTID => '002B'
+        },
+        {
+            NAME      => 'Dispositivo compuesto USB',
+            SERIAL    => '00CNBW86S20B',
+            VENDORID  => '03F0',
+            PRODUCTID => '3817'
+        }
     ]
 );
 
diff --git a/t/tools/macos.t b/t/tools/macos.t
index 01df645..34aefd5 100755
--- a/t/tools/macos.t
+++ b/t/tools/macos.t
@@ -18,9 +18,8 @@ my %system_profiler_tests = (
                 'BSD Device Name' => 'en1',
                 'Ethernet' => {
                     'MAC Address' => '00:14:51:61:ef:09',
-                    'Media Options' => {
-                        'Media Subtype' => 'autoselect'
-                    }
+                    'Media Options' => undef,
+                    'Media Subtype' => 'autoselect'
                 },
                 'Hardware' => 'Ethernet',
                 'Type' => 'Ethernet',
@@ -29,10 +28,9 @@ my %system_profiler_tests = (
                 },
                 'Proxies' => {
                     'Proxy Configuration Method' => 'Manual',
-                    'ExcludeSimpleHostnames' => {
-                        'Auto Discovery Enabled' => 'No',
-                        'FTP Passive Mode' => 'Yes'
-                    }
+                    'ExcludeSimpleHostnames' => 0,
+                    'Auto Discovery Enabled' => 'No',
+                    'FTP Passive Mode' => 'Yes'
                 }
             },
             'Modem interne' => {
@@ -48,10 +46,9 @@ my %system_profiler_tests = (
                 'Hardware' => 'Modem',
                 'Proxies' => {
                     'Proxy Configuration Method' => 'Manual',
-                    'ExcludeSimpleHostnames' => {
-                        'Auto Discovery Enabled' => 'No',
-                        'FTP Passive Mode' => 'Yes'
-                    }
+                    'ExcludeSimpleHostnames' => 0,
+                    'Auto Discovery Enabled' => 'No',
+                    'FTP Passive Mode' => 'Yes'
                 }
             },
             'Ethernet intégré' => {
@@ -74,12 +71,11 @@ my %system_profiler_tests = (
                 'IPv4 Addresses' => '10.0.1.110',
                 'DHCP Server Responses' => {
                     'Domain Name' => 'lan',
-                    'Lease Duration (seconds)' => {
-                        'Routers' => '10.0.1.1',
-                        'Subnet Mask' => '255.255.255.0',
-                        'Server Identifier' => '10.0.1.1',
-                        'DHCP Message Type' => '0x05'
-                    },
+                    'Lease Duration (seconds)' => 0,
+                    'Routers' => '10.0.1.1',
+                    'Subnet Mask' => '255.255.255.0',
+                    'Server Identifier' => '10.0.1.1',
+                    'DHCP Message Type' => '0x05',
                     'Domain Name Servers' => '10.0.1.1'
                 },
                 'IPv4' => {
@@ -112,10 +108,9 @@ my %system_profiler_tests = (
                 'Hardware' => 'Modem',
                 'Proxies' => {
                     'Proxy Configuration Method' => 'Manual',
-                    'ExcludeSimpleHostnames' => {
-                        'Auto Discovery Enabled' => 'No',
-                        'FTP Passive Mode' => 'Yes'
-                    }
+                    'ExcludeSimpleHostnames' => 0,
+                    'Auto Discovery Enabled' => 'No',
+                    'FTP Passive Mode' => 'Yes'
                 }
             },
             'FireWire intégré' => {
@@ -136,10 +131,9 @@ my %system_profiler_tests = (
                 },
                 'Proxies' => {
                     'Proxy Configuration Method' => 'Manual',
-                    'ExcludeSimpleHostnames' => {
-                        'Auto Discovery Enabled' => 'No',
-                        'FTP Passive Mode' => 'Yes'
-                    }
+                    'ExcludeSimpleHostnames' => 0,
+                    'Auto Discovery Enabled' => 'No',
+                    'FTP Passive Mode' => 'Yes'
                 }
             }
         },
@@ -159,11 +153,10 @@ my %system_profiler_tests = (
                             'Configuration Method' => 'DHCP'
                         },
                         'Proxies' => {
-                            'Auto Discovery Enabled' => {},
+                            'Auto Discovery Enabled' => 0,
                             'Proxy Configuration Method' => '2',
-                            'ExcludeSimpleHostnames' => {
-                                'FTP Passive Mode' => '1'
-                            }
+                            'ExcludeSimpleHostnames' => 0,
+                            'FTP Passive Mode' => '1'
                         },
                         'Hardware (MAC) Address' => '00:14:51:61:ef:09'
                     },
@@ -176,36 +169,32 @@ my %system_profiler_tests = (
                             'Configuration Method' => 'PPP'
                         },
                         'Proxies' => {
-                            'Auto Discovery Enabled' => {},
+                            'Auto Discovery Enabled' => 0,
                             'Proxy Configuration Method' => '2',
-                            'ExcludeSimpleHostnames' => {
-                                'FTP Passive Mode' => '1'
-                            }
+                            'ExcludeSimpleHostnames' => 0,
+                            'FTP Passive Mode' => '1'
                         },
                         'PPP' => {
-                            'ACSP Enabled' => {},
-                            'Idle Reminder' => {
-                                'IPCP Compression VJ' => '1',
-                                'LCP Echo Interval' => '10',
-                                'LCP Echo Enabled' => '1',
-                                'Log File' => '/var/log/ppp.log',
-                                'Idle Reminder Time' => '1800',
-                                'LCP Echo Failure' => '4'
-                            },
-                            'Verbose Logging' => {},
-                            'Dial On Demand' => {
-                                'Disconnect On Logout' => '1',
-                                'Disconnect On Idle Timer' => '600',
-                                'Disconnect On Idle' => '1',
-                                'Disconnect On Fast User Switch' => '1',
-                                'Disconnect On Sleep' => '1'
-                            },
-                            'Display Terminal Window' => {
-                               'Redial Enabled' => '1',
-                               'Redial Count' => '1',
-                               'Redial Interval' => '5'
-                             },
-                            'Use Terminal Script' => {}
+                            'ACSP Enabled' => 0,
+                            'Idle Reminder' => 0,
+                            'IPCP Compression VJ' => '1',
+                            'LCP Echo Interval' => '10',
+                            'LCP Echo Enabled' => '1',
+                            'Log File' => '/var/log/ppp.log',
+                            'Idle Reminder Time' => '1800',
+                            'LCP Echo Failure' => '4',
+                            'Verbose Logging' => 0,
+                            'Dial On Demand' => 0,
+                            'Disconnect On Logout' => '1',
+                            'Disconnect On Idle Timer' => '600',
+                            'Disconnect On Idle' => '1',
+                            'Disconnect On Fast User Switch' => '1',
+                            'Disconnect On Sleep' => '1',
+                            'Display Terminal Window' => 0,
+                            'Redial Enabled' => '1',
+                            'Redial Count' => '1',
+                            'Redial Interval' => '5',
+                            'Use Terminal Script' => 0,
                         }
                     },
                     'Ethernet intégré' => {
@@ -221,14 +210,13 @@ my %system_profiler_tests = (
                             'Configuration Method' => 'DHCP'
                         },
                         'Proxies' => {
-                            'SOCKS Proxy Enabled' => {},
-                            'HTTPS Proxy Enabled' => {},
-                            'FTP Proxy Enabled' => {
-                                'FTP Passive Mode' => '1'
-                            },
-                            'Gopher Proxy Enabled' => {},
-                            'HTTP Proxy Enabled' => {},
-                            'RTSP Proxy Enabled' => {}
+                            'SOCKS Proxy Enabled' => 0,
+                            'HTTPS Proxy Enabled' => 0,
+                            'FTP Proxy Enabled' => 0,
+                            'FTP Passive Mode' => '1',
+                            'Gopher Proxy Enabled' => 0,
+                            'HTTP Proxy Enabled' => 0,
+                            'RTSP Proxy Enabled' => 0,
                         },
                         'Hardware (MAC) Address' => '00:14:51:61:ef:08'
                     },
@@ -241,37 +229,32 @@ my %system_profiler_tests = (
                             'Configuration Method' => 'PPP'
                         },
                         'Proxies' => {
-                            'Auto Discovery Enabled' => {},
+                            'Auto Discovery Enabled' => 0,
                             'Proxy Configuration Method' => '2',
-                            'ExcludeSimpleHostnames' => {
-                                'FTP Passive Mode' => '1'
-                            }
+                            'ExcludeSimpleHostnames' => 0,
+                            'FTP Passive Mode' => '1'
                         },
                         'PPP' => {
-                            'ACSP Enabled' => {},
-                            'Idle Reminder' => {
-                                'IPCP Compression VJ' => '1',
-                                'Idle Reminder Time' => '1800'
-                            },
-                            'Verbose Logging' => {},
-                            'LCP Echo Enabled' => {
+                            'ACSP Enabled' => 0,
+                            'Idle Reminder' => 0,
+                            'IPCP Compression VJ' => '1',
+                            'Idle Reminder Time' => '1800',
+                            'Verbose Logging' => 0,
+                            'LCP Echo Enabled' => 0,
                             'LCP Echo Interval' => '10',
                             'Log File' => '/var/log/ppp.log',
-                            'LCP Echo Failure' => '4'
-                            },
-                            'Dial On Demand' => {
+                            'LCP Echo Failure' => '4',
+                            'Dial On Demand' => 0,
                             'Disconnect On Logout' => '1',
                             'Disconnect On Idle Timer' => '600',
                             'Disconnect On Idle' => '1',
                             'Disconnect On Fast User Switch' => '1',
-                            'Disconnect On Sleep' => '1'
-                        },
-                        'Display Terminal Window' => {
-                           'Redial Enabled' => '1',
-                           'Redial Count' => '1',
-                           'Redial Interval' => '5'
-                         },
-                        'Use Terminal Script' => {}
+                            'Disconnect On Sleep' => '1',
+                            'Display Terminal Window' => 0,
+                            'Redial Enabled' => '1',
+                            'Redial Count' => '1',
+                            'Redial Interval' => '5',
+                            'Use Terminal Script' => 0,
                         }
                     },
                     'FireWire intégré' => {
@@ -287,11 +270,10 @@ my %system_profiler_tests = (
                             'Configuration Method' => 'DHCP'
                         },
                         'Proxies' => {
-                            'Auto Discovery Enabled' => {},
+                            'Auto Discovery Enabled' => 0,
                             'Proxy Configuration Method' => '2',
-                            'ExcludeSimpleHostnames' => {
-                                'FTP Passive Mode' => '1'
-                            }
+                            'ExcludeSimpleHostnames' => 0,
+                            'FTP Passive Mode' => '1'
                         },
                         'Hardware (MAC) Address' => '00:14:51:ff:fe:1a:c8:e2'
                     }
@@ -344,12 +326,11 @@ my %system_profiler_tests = (
                     'Removable Media' => 'No',
                     'BSD Name' => 'disk0',
                     'Protocol' => 'ata',
-                    'Unit Number' => {
-                        'OS9 Drivers' => 'No',
-                        'Socket Type' => 'Serial-ATA',
-                        'S.M.A.R.T. status' => 'Verified',
-                        'Bay Name' => '"A (upper)"'
-                    }
+                    'Unit Number' => 0,
+                    'OS9 Drivers' => 'No',
+                    'Socket Type' => 'Serial-ATA',
+                    'S.M.A.R.T. status' => 'Verified',
+                    'Bay Name' => '"A (upper)"'
                 }
             }
         },
@@ -402,9 +383,8 @@ my %system_profiler_tests = (
                     'Detachable Drive' => 'No',
                     'Serial Number' => 'B6FD7234EC63',
                     'Protocol' => 'ATAPI',
-                    'Unit Number' => {
-                    'Socket Type' => 'Internal'
-                },
+                    'Unit Number' => 0,
+                    'Socket Type' => 'Internal',
                     'Model' => 'HL-DT-ST DVD-RW GWA-4165B'
                 }
             }
@@ -563,17 +543,16 @@ my %system_profiler_tests = (
         'Power' => {
             'System Power Settings' => {
                 'AC Power' => {
-                    'System Sleep Timer (Minutes)' => {
-                        'Reduce Processor Speed' => 'No',
-                        'Dynamic Power Step' => 'Yes',
-                        'Display Sleep Timer (Minutes)' => '10',
-                        'Disk Sleep Timer (Minutes)' => '10',
-                        'Automatic Restart On Power Loss' => 'No',
-                        'Sleep On Power Button' => 'Yes',
-                        'Wake On AC Change' => 'No',
-                        'Wake On Modem Ring' => 'Yes',
-                        'Wake On LAN' => 'Yes'
-                    }
+                    'System Sleep Timer (Minutes)' => 0,
+                    'Reduce Processor Speed' => 'No',
+                    'Dynamic Power Step' => 'Yes',
+                    'Display Sleep Timer (Minutes)' => '10',
+                    'Disk Sleep Timer (Minutes)' => '10',
+                    'Automatic Restart On Power Loss' => 'No',
+                    'Sleep On Power Button' => 'Yes',
+                    'Wake On AC Change' => 'No',
+                    'Wake On Modem Ring' => 'Yes',
+                    'Wake On LAN' => 'Yes'
                 }
             }
         }
@@ -790,11 +769,10 @@ my %system_profiler_tests = (
                     'Detachable Drive' => 'No',
                     'Serial Number' => 'B6FD7234EC63',
                     'Protocol' => 'ATAPI',
-                    'Unit Number' => {
-                        'Low Power Polling' => 'No',
-                        'Socket Type' => 'Internal',
-                        'Power Off' => 'No'
-                    },
+                    'Unit Number' => 0,
+                    'Low Power Polling' => 'No',
+                    'Socket Type' => 'Internal',
+                    'Power Off' => 'No',
                     'Model' => 'HL-DT-ST DVD-RW GWA-4165B'
                 }
             }
@@ -856,18 +834,17 @@ my %system_profiler_tests = (
             },
             'System Power Settings' => {
                 'AC Power' => {
-                    'System Sleep Timer (Minutes)' => {
-                        'Reduce Processor Speed' => 'No',
-                        'Dynamic Power Step' => 'Yes',
-                        'Display Sleep Timer (Minutes)' => '3',
-                        'Disk Sleep Timer (Minutes)' => '10',
-                        'Automatic Restart On Power Loss' => 'No',
-                        'Sleep On Power Button' => 'Yes',
-                        'Wake On AC Change' => 'No',
-                        'Wake On Clamshell Open' => 'Yes',
-                        'Wake On Modem Ring' => 'Yes',
-                        'Wake On LAN' => 'Yes'
-                    }
+                    'System Sleep Timer (Minutes)' => 0,
+                    'Reduce Processor Speed' => 'No',
+                    'Dynamic Power Step' => 'Yes',
+                    'Display Sleep Timer (Minutes)' => '3',
+                    'Disk Sleep Timer (Minutes)' => '10',
+                    'Automatic Restart On Power Loss' => 'No',
+                    'Sleep On Power Button' => 'Yes',
+                    'Wake On AC Change' => 'No',
+                    'Wake On Clamshell Open' => 'Yes',
+                    'Wake On Modem Ring' => 'Yes',
+                    'Wake On LAN' => 'Yes'
                 }
             }
         },
@@ -942,12 +919,11 @@ my %system_profiler_tests = (
                 },
                 'DHCP Server Responses' => {
                     'Domain Name' => 'lan',
-                    'Lease Duration (seconds)' => {
-                        'Routers' => '10.0.1.1',
-                        'Subnet Mask' => '255.255.255.0',
-                        'Server Identifier' => '10.0.1.1',
-                        'DHCP Message Type' => '0x05'
-                    },
+                    'Lease Duration (seconds)' => 0,
+                    'Routers' => '10.0.1.1',
+                    'Subnet Mask' => '255.255.255.0',
+                    'Server Identifier' => '10.0.1.1',
+                    'DHCP Message Type' => '0x05',
                     'Domain Name Servers' => '10.0.1.1'
                 },
                 'Type' => 'Ethernet',
@@ -988,9 +964,8 @@ my %system_profiler_tests = (
                 'BSD Device Name' => 'en1',
                 'Ethernet' => {
                     'MAC Address' => '00:14:51:61:ef:09',
-                    'Media Options' => {
-                        'Media Subtype' => 'Auto Select'
-                    }
+                    'Media Options' => undef,
+                    'Media Subtype' => 'Auto Select'
                 },
                 'Hardware' => 'AirPort',
                 'Type' => 'AirPort',
@@ -1049,13 +1024,12 @@ my %system_profiler_tests = (
                     'Removable Media' => 'No',
                     'BSD Name' => 'disk0',
                     'Protocol' => 'ata',
-                    'Unit Number' => {
-                        'Mac OS 9 Drivers' => 'No',
-                        'Socket Type' => 'Serial-ATA',
-                        'S.M.A.R.T. status' => 'Verified',
-                        'Partition Map Type' => 'APM (Apple Partition Map)',
-                        'Bay Name' => '"B (lower)"'
-                    }
+                    'Unit Number' => 0,
+                    'Mac OS 9 Drivers' => 'No',
+                    'Socket Type' => 'Serial-ATA',
+                    'S.M.A.R.T. status' => 'Verified',
+                    'Partition Map Type' => 'APM (Apple Partition Map)',
+                    'Bay Name' => '"B (lower)"'
                 }
             }
         },
@@ -1361,14 +1335,14 @@ my %system_profiler_tests = (
                         'IEEE80211' => {
                             'Join Mode' => 'Automatic',
                             'Disconnect on Logout' => 'No',
-                            'PowerEnabled' => {},
+                            'PowerEnabled' => 0,
                             'PreferredNetworks' => {
                                 'Unique Network ID' => '905AE8BA-BD26-48F3-9486-AE5BC72FE642',
-                                'RememberRecentNetworks' => '1',
                                 'SecurityType' => 'WPA2 Personal',
                                 'Unique Password ID' => '907EDC44-8C27-44A0-B5F5-2D04E1A5942A',
                                 'SSID_STR' => 'freewa'
                             },
+                            'RememberRecentNetworks' => '1',
                             'JoinModeFallback' => 'Prompt'
                         }
                     }
@@ -1386,7 +1360,7 @@ my %system_profiler_tests = (
                     'Current Available (mA)' => '500',
                     'Speed' => 'Up to 12 Mb/sec',
                     'Product ID' => '0x8206',
-                    'Current Required (mA)' => {},
+                    'Current Required (mA)' => 0,
                     'Manufacturer' => 'Apple Inc.',
                     'Vendor ID' => '0x05ac  (Apple Inc.)'
                 },
@@ -1469,11 +1443,10 @@ my %system_profiler_tests = (
                     'Detachable Drive' => 'No',
                     'Serial Number' => '            fG424F9E',
                     'Protocol' => 'ATAPI',
-                    'Unit Number' => {
-                        'Low Power Polling' => 'Yes',
-                        'Socket Type' => 'Internal',
-                        'Power Off' => 'No'
-                    },
+                    'Unit Number' => 0,
+                    'Low Power Polling' => 'Yes',
+                    'Socket Type' => 'Internal',
+                    'Power Off' => 'No',
                     'Model' => 'MATSHITADVD-R   UJ-875'
                 }
             }
@@ -1530,12 +1503,10 @@ my %system_profiler_tests = (
             'Apple Bluetooth Software Version' => '2.3.3f8',
             'Outgoing Serial Ports' => {
                 'Serial Port 1' => {
-                    'Address' => {
-                        'Name' => 'Bluetooth-Modem'
-                    },
-                    'RFCOMM Channel' => {
-                        'Requires Authentication' => 'No'
-                    }
+                    'Address' => undef,
+                    'Name' => 'Bluetooth-Modem',
+                    'RFCOMM Channel' => 0,
+                    'Requires Authentication' => 'No'
                 }
             },
             'Services' => {
@@ -1624,9 +1595,8 @@ my %system_profiler_tests = (
                 'BSD Device Name' => 'en3',
                 'Ethernet' => {
                     'MAC Address' => '00:1c:42:00:00:09',
-                    'Media Options' => {
-                        'Media Subtype' => 'Auto Select'
-                    }
+                    'Media Options' => undef,
+                    'Media Subtype' => 'Auto Select'
                 },
                 'Hardware' => 'Ethernet',
                 'Type' => 'Ethernet',
@@ -1638,13 +1608,12 @@ my %system_profiler_tests = (
                     'Addresses' => '192.168.1.16'
                 },
                 'Proxies' => {
-                    'Exclude Simple Hostnames' => {
-                        'Auto Discovery Enabled' => 'No',
-                        'FTP Passive Mode' => 'Yes',
-                        'Service Order' => '9'
-                    },
+                    'Exclude Simple Hostnames' => 0,
+                    'Auto Discovery Enabled' => 'No',
+                    'FTP Passive Mode' => 'Yes',
                     'Proxy Configuration Method' => 'Manual'
-                }
+                },
+                'Service Order' => '9',
             },
             'Parallels Shared Networking Adapter' => {
                 'Has IP Assigned' => 'Yes',
@@ -1654,9 +1623,8 @@ my %system_profiler_tests = (
                 'BSD Device Name' => 'en2',
                 'Ethernet' => {
                     'MAC Address' => '00:1c:42:00:00:08',
-                    'Media Options' => {
-                        'Media Subtype' => 'Auto Select'
-                    }
+                    'Media Options' => undef,
+                    'Media Subtype' => 'Auto Select'
                 },
                 'Hardware' => 'Ethernet',
                 'Type' => 'Ethernet',
@@ -1668,13 +1636,12 @@ my %system_profiler_tests = (
                     'Addresses' => '192.168.0.11'
                 },
                 'Proxies' => {
-                    'Exclude Simple Hostnames' => {
-                        'Auto Discovery Enabled' => 'No',
-                        'FTP Passive Mode' => 'Yes',
-                        'Service Order' => '8'
-                    },
+                    'Exclude Simple Hostnames' => 0,
+                    'Auto Discovery Enabled' => 'No',
+                    'FTP Passive Mode' => 'Yes',
                     'Proxy Configuration Method' => 'Manual'
-                }
+                },
+                'Service Order' => '8',
             },
             'FireWire' => {
                 'Has IP Assigned' => 'No',
@@ -1694,9 +1661,9 @@ my %system_profiler_tests = (
                 'Hardware' => 'FireWire',
                 'Proxies' => {
                     'FTP Passive Mode' => 'Yes',
-                    'Service Order' => '2',
                     'Exceptions List' => '*.local, 169.254/16'
-                }
+                },
+                'Service Order' => '2',
             },
             'Ethernet' => {
                 'Has IP Assigned' => 'Yes',
@@ -1718,12 +1685,11 @@ my %system_profiler_tests = (
                 'IPv4 Addresses' => '10.0.1.101',
                 'DHCP Server Responses' => {
                     'Domain Name' => 'lan',
-                    'Lease Duration (seconds)' => {
-                        'Routers' => '10.0.1.1',
-                        'Subnet Mask' => '255.255.255.0',
-                        'Server Identifier' => '10.0.1.1',
-                        'DHCP Message Type' => '0x05'
-                    },
+                    'Lease Duration (seconds)' => 0,
+                    'Routers' => '10.0.1.1',
+                    'Subnet Mask' => '255.255.255.0',
+                    'Server Identifier' => '10.0.1.1',
+                    'DHCP Message Type' => '0x05',
                     'Domain Name Servers' => '10.0.1.1'
                 },
                 'IPv4' => {
@@ -1736,9 +1702,9 @@ my %system_profiler_tests = (
                 },
                 'Proxies' => {
                     'FTP Passive Mode' => 'Yes',
-                    'Service Order' => '1',
                     'Exceptions List' => '*.local, 169.254/16'
-                }
+                },
+                'Service Order' => '1',
             },
             'Bluetooth' => {
                 'Has IP Assigned' => 'No',
@@ -1754,7 +1720,7 @@ my %system_profiler_tests = (
                 'Proxies' => {
                     'FTP Passive Mode' => 'Yes'
                 },
-                'Service Order' => {}
+                'Service Order' => 0,
             },
             'AirPort' => {
                 'Has IP Assigned' => 'No',
@@ -1765,9 +1731,8 @@ my %system_profiler_tests = (
                 'BSD Device Name' => 'en1',
                 'Ethernet' => {
                     'MAC Address' => '00:1e:c2:a7:26:6f',
-                    'Media Options' => {
-                        'Media Subtype' => 'Auto Select'
-                    }
+                    'Media Options' => undef,
+                    'Media Subtype' => 'Auto Select'
                 },
                 'IPv4' => {
                     'Configuration Method' => 'DHCP'
@@ -1778,9 +1743,9 @@ my %system_profiler_tests = (
                     'HTTP Proxy Port' => '80',
                     'FTP Passive Mode' => 'Yes',
                     'HTTP Proxy Enabled' => 'No',
-                    'Service Order' => '3',
                     'Exceptions List' => '*.local, 169.254/16'
-                }
+                },
+                'Service Order' => '3',
             }
         },
         'Ethernet Cards' => {
@@ -1886,16 +1851,16 @@ my %system_profiler_tests = (
                 },
                 'Applications' => {
                     'org.sip-communicator' => 'Allow all connections',
-                    'Firewall Logging' => 'No',
                     'com.skype.skype' => 'Allow all connections',
                     'com.Growl.GrowlHelperApp' => 'Allow all connections',
                     'com.hp.scan.app' => 'Allow all connections',
                     'com.parallels.desktop.dispatcher' => 'Allow all connections',
-                    'Stealth Mode' => 'No',
                     'net.sourceforge.xmeeting.XMeeting' => 'Allow all connections',
                     'com.getdropbox.dropbox' => 'Allow all connections'
                 },
-                'Mode' => 'Limit incoming connections to specific services and applications'
+                'Mode' => 'Limit incoming connections to specific services and applications',
+                'Firewall Logging' => 'No',
+                'Stealth Mode' => 'No',
             }
         },
         'Software' => {
@@ -2124,17 +2089,17 @@ my %system_profiler_tests = (
                         },
                         'Hardware (MAC) Address' => '00:1c:b3:c0:56:85',
                         'IEEE80211' => {
-                            'Join Mode' => 'Automatic',
                             'Disconnect on Logout' => 'Yes',
+                            'Join Mode' => 'Automatic',
+                            'JoinModeFallback' => 'Prompt',
                             'PowerEnabled' => '1',
-                            'RememberRecentNetworks' => {},
-                            'RequireAdmin' => {},
                             'PreferredNetworks' => {
                                 'Unique Network ID' => 'A628B3F5-DB6B-48A6-A3A4-17D33697041B',
                                 'SecurityType' => 'Open',
                                 'SSID_STR' => 'univ-paris1.fr'
                             },
-                            'JoinModeFallback' => 'Prompt'
+                            'RememberRecentNetworks' => 0,
+                            'RequireAdmin' => 0,
                         }
                     }
                 },
@@ -2224,8 +2189,8 @@ my %system_profiler_tests = (
                             'Join Mode' => 'Automatic',
                             'Disconnect on Logout' => 'Yes',
                             'PowerEnabled' => '1',
-                            'RememberRecentNetworks' => {},
-                            'RequireAdmin' => {},
+                            'RememberRecentNetworks' => 0,
+                            'RequireAdmin' => 0,
                             'PreferredNetworks' => {
                                  'Unique Network ID' => '963478B4-1AC3-4B35-A4BB-3510FEA2FEF2',
                                  'SecurityType' => 'WPA2 Enterprise',
@@ -2321,8 +2286,8 @@ my %system_profiler_tests = (
                         'IEEE80211' => {
                             'Join Mode' => 'Automatic',
                             'Disconnect on Logout' => 'Yes',
-                            'PowerEnabled' => {},
-                            'RememberRecentNetworks' => {},
+                            'PowerEnabled' => 0,
+                            'RememberRecentNetworks' => 0,
                             'PreferredNetworks' => {
                                 'Unique Network ID' => '46A33A68-7109-48AD-9255-900F0134903E',
                                 'SecurityType' => 'WPA Personal',
@@ -2379,15 +2344,13 @@ my %system_profiler_tests = (
             'ATA Bus' => {
                 'MATSHITACD-RW  CW-8221' => {
                     'Revision' => 'GA0J',
-                    'Serial Number' => {
-                        'Detachable Drive' => 'No',
-                        'Protocol' => 'ATAPI'
-                    },
-                    'Unit Number' => {
-                        'Low Power Polling' => 'Yes',
-                        'Socket Type' => 'Internal',
-                        'Power Off' => 'Yes'
-                    },
+                    'Serial Number' => undef,
+                    'Detachable Drive' => 'No',
+                    'Protocol' => 'ATAPI',
+                    'Unit Number' => 0,
+                    'Low Power Polling' => 'Yes',
+                    'Socket Type' => 'Internal',
+                    'Power Off' => 'Yes',
                     'Model' => 'MATSHITACD-RW  CW-8221'
                 }
             }
@@ -2431,12 +2394,10 @@ my %system_profiler_tests = (
             'Apple Bluetooth Software Version' => '2.3.8f7',
             'Outgoing Serial Ports' => {
                 'Serial Port 1' => {
-                    'Address' => {
-                        'Name' => 'Bluetooth-Modem'
-                    },
-                    'RFCOMM Channel' => {
-                        'Requires Authentication' => 'No'
-                    }
+                    'Address' => undef,
+                    'Name' => 'Bluetooth-Modem',
+                    'RFCOMM Channel' => 0,
+                    'Requires Authentication' => 'No'
                 }
             },
             'Services' => {
@@ -2479,19 +2440,18 @@ my %system_profiler_tests = (
             },
             'Battery Information' => {
                 'Charge Information' => {
-                    'Full charge capacity (mAh)' => {},
-                    'Charge remaining (mAh)' => {
-                        'Fully charged' => 'No',
-                        'Charging' => 'No'
-                    }
+                    'Full charge capacity (mAh)' => 0,
+                    'Charge remaining (mAh)' => 0,
+                    'Fully charged' => 'No',
+                    'Charging' => 'No'
                 },
                 'Health Information' => {
-                    'Voltage (mV)' => '3908',
-                    'Battery Installed' => 'Yes',
                     'Cycle count' => '5',
                     'Condition' => 'Replace Now',
-                    'Amperage (mA)' => '74'
                 },
+                'Voltage (mV)' => '3908',
+                'Battery Installed' => 'Yes',
+                'Amperage (mA)' => '74',
                 'Model Information' => {
                     'PCB Lot Code' => '0000',
                     'Firmware Version' => '102a',
@@ -2504,16 +2464,15 @@ my %system_profiler_tests = (
             },
             'System Power Settings' => {
                 'AC Power' => {
-                    'System Sleep Timer (Minutes)' => {
-                        'Display Sleep Timer (Minutes)' => '10',
-                        'Disk Sleep Timer (Minutes)' => '10',
-                        'Automatic Restart On Power Loss' => 'No',
-                        'Wake On AC Change' => 'No',
-                        'Current Power Source' => 'Yes',
-                        'Wake On Clamshell Open' => 'Yes',
-                        'Display Sleep Uses Dim' => 'Yes',
-                        'Wake On LAN' => 'Yes'
-                    }
+                    'System Sleep Timer (Minutes)' => 0,
+                    'Display Sleep Timer (Minutes)' => '10',
+                    'Disk Sleep Timer (Minutes)' => '10',
+                    'Automatic Restart On Power Loss' => 'No',
+                    'Wake On AC Change' => 'No',
+                    'Current Power Source' => 'Yes',
+                    'Wake On Clamshell Open' => 'Yes',
+                    'Display Sleep Uses Dim' => 'Yes',
+                    'Wake On LAN' => 'Yes'
                 },
                 'Battery Power' => {
                     'Reduce Brightness' => 'Yes',
@@ -2580,9 +2539,9 @@ my %system_profiler_tests = (
                 'Hardware' => 'FireWire',
                 'Proxies' => {
                     'FTP Passive Mode' => 'Yes',
-                    'Service Order' => '2',
                     'Exceptions List' => '*.local, 169.254/16'
-                }
+                },
+                'Service Order' => '2',
             },
             'Ethernet' => {
                 'Has IP Assigned' => 'Yes',
@@ -2609,12 +2568,11 @@ my %system_profiler_tests = (
                 'IPv4 Addresses' => '172.20.10.171',
                 'DHCP Server Responses' => {
                     'Domain Name' => 'univ-paris1.fr',
-                    'Lease Duration (seconds)' => {
-                        'Routers' => '172.20.10.72',
-                        'Subnet Mask' => '255.255.254.0',
-                        'Server Identifier' => '172.20.0.2',
-                        'DHCP Message Type' => '0x05'
-                    },
+                    'Lease Duration (seconds)' => 0,
+                    'Routers' => '172.20.10.72',
+                    'Subnet Mask' => '255.255.254.0',
+                    'Server Identifier' => '172.20.0.2',
+                    'DHCP Message Type' => '0x05',
                     'Domain Name Servers' => '193.55.96.84,193.55.99.70,194.214.33.181'
                 },
                 'IPv4' => {
@@ -2634,12 +2592,12 @@ my %system_profiler_tests = (
                         'Portability' => '37',
                         'Type' => '50',
                         'Metric' => '503771',
-                        'IPv6 Address' => '2001:0660:3305:0100:021b:63ff:fe36:1ec3',
                         'Marginal Power' => '71',
-                        'Service Order' => '1',
                         'Total Power' => '72'
                     }
-                }
+                },
+                'IPv6 Address' => '2001:0660:3305:0100:021b:63ff:fe36:1ec3',
+                'Service Order' => '1',
             },
             'Bluetooth' => {
                 'Has IP Assigned' => 'No',
@@ -2655,7 +2613,7 @@ my %system_profiler_tests = (
                 'Proxies' => {
                     'FTP Passive Mode' => 'Yes'
                 },
-                'Service Order' => {}
+                'Service Order' => 0,
             },
             'AirPort' => {
                 'Has IP Assigned' => 'No',
@@ -2663,9 +2621,8 @@ my %system_profiler_tests = (
                 'BSD Device Name' => 'en1',
                 'Ethernet' => {
                     'MAC Address' => '00:1c:b3:c0:56:85',
-                    'Media Options' => {
-                        'Media Subtype' => 'Auto Select'
-                    }
+                    'Media Options' => undef,
+                    'Media Subtype' => 'Auto Select'
                 },
                 'IPv4' => {
                     'Configuration Method' => 'DHCP'
@@ -2673,9 +2630,9 @@ my %system_profiler_tests = (
                 'Hardware' => 'AirPort',
                 'Proxies' => {
                     'FTP Passive Mode' => 'Yes',
-                    'Service Order' => '3',
                     'Exceptions List' => '*.local, 169.254/16'
-                }
+                },
+                'Service Order' => '3',
             }
         },
         'Ethernet Cards' => {
@@ -2853,11 +2810,10 @@ my %system_profiler_tests = (
                     'Firmware Version' => 'Atheros 5416: 2.1.14.5',
                     'Locale' => 'ETSI',
                     'Card Type' => 'AirPort Extreme  (0x168C, 0x87)',
-                    'Country Code' => {
-                        'Supported PHY Modes' => '802.11 a/b/g/n',
-                        'Status' => 'Off',
-                        'Supported Channels' => '1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140'
-                    }
+                    'Country Code' => undef,
+                    'Supported PHY Modes' => '802.11 a/b/g/n',
+                    'Status' => 'Off',
+                    'Supported Channels' => '1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140'
                 }
             }
         },
@@ -3047,6 +3003,7 @@ foreach my $test (keys %system_profiler_tests) {
     my $file = "resources/macos/system_profiler/$test";
     my $infos = getSystemProfilerInfos(file => $file);
     is_deeply($infos, $system_profiler_tests{$test}, "$test system profiler parsing");
+    use Data::Dumper;
 }
 
 foreach my $test (keys %ioreg_tests) {


================================================================
  Commit: a5899f02d0746d7605129d9ea60fa153fd347536
      https://github.com/fusinv/fusioninventory-agent/commit/a5899f02d0746d7605129d9ea60fa153fd347536
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-01 (Thu, 01 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/OS.pm
    M lib/FusionInventory/Agent/Task/Inventory/Inventory.pm

  Log Message:
  -----------
  move to operating system info section


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/OS.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/OS.pm
index 2795421..afa52fa 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/OS.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/OS.pm
@@ -54,11 +54,11 @@ sub doInventory {
             OSCOMMENTS    => $object->{CSDVersion},
             SWAP          => $object->{TotalSwapSpaceSize},
             DESCRIPTION   => $description,
-            OSINSTALLDATE => $installDate
         });
 
         $inventory->setOperatingSystem({
             NAME           => "Windows",
+            INSTALL_DATE   => $installDate
     #        VERSION       => $OSVersion,
             KERNEL_VERSION => $object->{Version},
             FULL_NAME      => $object->{Caption},
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Inventory.pm b/lib/FusionInventory/Agent/Task/Inventory/Inventory.pm
index df701fd..21273fb 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Inventory.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Inventory.pm
@@ -246,7 +246,7 @@ sub setHardware {
         PROCESSORT NAME PROCESSORS SWAP ETIME TYPE OSNAME IPADDR WORKGROUP
         DESCRIPTION MEMORY UUID DNS LASTLOGGEDUSER USERDOMAIN
         DATELASTLOGGEDUSER DEFAULTGATEWAY VMSYSTEM WINOWNER WINPRODID
-        WINPRODKEY WINCOMPANY WINLANG CHASSIS_TYPE OSINSTALLDATE/) {
+        WINPRODKEY WINCOMPANY WINLANG CHASSIS_TYPE/) {
 # WINLANG: Windows Language, see MSDN Win32_OperatingSystem documentation
         if (exists $args->{$key}) {
             my $string = getSanitizedString($args->{$key});
@@ -258,7 +258,7 @@ sub setHardware {
 sub setOperatingSystem {
     my ($self, $args) = @_;
 
-    foreach my $key (qw/KERNEL_NAME KERNEL_VERSION NAME VERSION FULL_NAME SERVICE_PACK/) {
+    foreach my $key (qw/KERNEL_NAME KERNEL_VERSION NAME VERSION FULL_NAME SERVICE_PACK INSTALL_DATE/) {
         next unless exists $args->{$key};
 
         my $string = getSanitizedString($args->{$key});
@@ -887,6 +887,10 @@ deprecated in the future.
 The Service Pack level reported by the operating system. This field is only
 present on systems which use this notion.
 
+=item INSTALL_DATE
+
+The operating system installation date.
+
 =back
 
 =head2 MONITORS


================================================================
  Commit: 015cce7624d42d0055a63118e3025ea098cdb4fc
      https://github.com/fusinv/fusioninventory-agent/commit/015cce7624d42d0055a63118e3025ea098cdb4fc
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-01 (Thu, 01 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/OS.pm

  Log Message:
  -----------
  oops


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/OS.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/OS.pm
index afa52fa..7595ecd 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/OS.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/OS.pm
@@ -58,7 +58,7 @@ sub doInventory {
 
         $inventory->setOperatingSystem({
             NAME           => "Windows",
-            INSTALL_DATE   => $installDate
+            INSTALL_DATE   => $installDate,
     #        VERSION       => $OSVersion,
             KERNEL_VERSION => $object->{Version},
             FULL_NAME      => $object->{Caption},


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

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Inventory.pm

  Log Message:
  -----------
  manage allowed field in a single place


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Inventory.pm b/lib/FusionInventory/Agent/Task/Inventory/Inventory.pm
index 21273fb..c0fd89b 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Inventory.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Inventory.pm
@@ -52,6 +52,19 @@ my %fields = (
     PRINTERS    => [ qw/COMMENT DESCRIPTION DRIVER NAME NETWORK PORT RESOLUTION
                         SHARED STATUS ERRSTATUS SERVERNAME SHARENAME 
                         PRINTPROCESSOR SERIAL/ ],
+    BIOS             => [ qw/SMODEL SMANUFACTURER SSN BDATE BVERSION 
+                             BMANUFACTURER MMANUFACTURER MSN MMODEL ASSETTAG 
+                             ENCLOSURESERIAL BASEBOARDSERIAL BIOSSERIAL 
+                             TYPE SKUNUMBER/ ],
+    HARDWARE         => [ qw/USERID OSVERSION PROCESSORN OSCOMMENTS CHECKSUM
+                             PROCESSORT NAME PROCESSORS SWAP ETIME TYPE OSNAME
+                             IPADDR WORKGROUP DESCRIPTION MEMORY UUID DNS 
+                             LASTLOGGEDUSER USERDOMAIN DATELASTLOGGEDUSER 
+                             DEFAULTGATEWAY VMSYSTEM WINOWNER WINPRODID
+                             WINPRODKEY WINCOMPANY WINLANG CHASSIS_TYPE/ ],
+    OPERATINGSYSTEM  => [ qw/KERNEL_NAME KERNEL_VERSION NAME VERSION FULL_NAME 
+                            SERVICE_PACK INSTALL_DATE/ ],
+    ACCESSLOG        => [ qw/USERID LOGDATE/ ],
     VIRTUALMACHINES  => [ qw/MEMORY NAME UUID STATUS SUBSYSTEM VMTYPE VCPU
                              VMID MAC COMMENT OWNER/ ],
     LOGICAL_VOLUMES  => [ qw/LV_NAME VGN_AME ATTR SIZE LV_UUID SEG_COUNT 
@@ -60,7 +73,6 @@ my %fields = (
                              SIZE FREE PE_SIZE/ ],
     VOLUME_GROUPS    => [ qw/VG_NAME PV_COUNT LV_COUNT ATTR SIZE FREE VG_UUID 
                              VG_EXTENT_SIZE/ ],
-
 );
 
 my %checks = (
@@ -242,52 +254,58 @@ sub computeLegacyValues {
 sub setHardware {
     my ($self, $args) = @_;
 
-    foreach my $key (qw/USERID OSVERSION PROCESSORN OSCOMMENTS CHECKSUM
-        PROCESSORT NAME PROCESSORS SWAP ETIME TYPE OSNAME IPADDR WORKGROUP
-        DESCRIPTION MEMORY UUID DNS LASTLOGGEDUSER USERDOMAIN
-        DATELASTLOGGEDUSER DEFAULTGATEWAY VMSYSTEM WINOWNER WINPRODID
-        WINPRODKEY WINCOMPANY WINLANG CHASSIS_TYPE/) {
-# WINLANG: Windows Language, see MSDN Win32_OperatingSystem documentation
-        if (exists $args->{$key}) {
-            my $string = getSanitizedString($args->{$key});
-            $self->{content}{HARDWARE}{$key} = $string;
+    foreach my $field (keys %$args) {
+        if (!$fields{HARDWARE}->{$field}) {
+            $self->{logger}->debug("unknown field $field for section HARDWARE");
+            next
         }
+        $self->{content}->{HARDWARE}->{$field} =
+            getSanitizedString($args->{$field});
     }
 }
 
 sub setOperatingSystem {
     my ($self, $args) = @_;
 
-    foreach my $key (qw/KERNEL_NAME KERNEL_VERSION NAME VERSION FULL_NAME SERVICE_PACK INSTALL_DATE/) {
-        next unless exists $args->{$key};
-
-        my $string = getSanitizedString($args->{$key});
-        $self->{content}{OPERATINGSYSTEM}{$key} = $string;
+    foreach my $field (keys %$args) {
+        if (!$fields{OPERATINGSYSTEM}->{$field}) {
+            $self->{logger}->debug(
+                "unknown field $field for section OPERATINGSYSTEM"
+            );
+            next
+        }
+        $self->{content}->{OPERATINGSYSTEM}->{$field} = 
+            getSanitizedString($args->{$field});
     }
 }
 
 sub setBios {
     my ($self, $args) = @_;
 
-    foreach my $key (qw/SMODEL SMANUFACTURER SSN BDATE BVERSION BMANUFACTURER
-        MMANUFACTURER MSN MMODEL ASSETTAG ENCLOSURESERIAL BASEBOARDSERIAL
-        BIOSSERIAL TYPE SKUNUMBER/) {
-
-        if (exists $args->{$key}) {
-            my $string = getSanitizedString($args->{$key});
-            $self->{content}{BIOS}{$key} = $string;
+    foreach my $field (keys %$args) {
+        if (!$fields{BIOS}->{$field}) {
+            $self->{logger}->debug("unknown field $field for section BIOS");
+            next
         }
+
+        $self->{content}->{BIOS}->{$field} =
+            getSanitizedString($args->{$field});
     }
 }
 
 sub setAccessLog {
     my ($self, $args) = @_;
 
-    foreach my $key (qw/USERID LOGDATE/) {
-
-        if (exists $args->{$key}) {
-            $self->{content}{ACCESSLOG}{$key} = $args->{$key};
+    foreach my $field (keys %$args) {
+        if (!$fields{ACCESSLOG}->{$field}) {
+            $self->{logger}->debug(
+                "unknown field $field for section ACCESSLOG"
+            );
+            next
         }
+
+        $self->{content}->{ACCESSLOG}->{$field} = 
+            getSanitizedString($args->{$field});
     }
 }
 


================================================================
  Commit: 6330c52d151a999b167ef5587dfcb9e7b01fbb5d
      https://github.com/fusinv/fusioninventory-agent/commit/6330c52d151a999b167ef5587dfcb9e7b01fbb5d
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-01 (Thu, 01 Mar 2012)

  Changed paths:
    A resources/solaris/showrev-x86-3

  Log Message:
  -----------
  initial import


diff --git a/resources/solaris/showrev-x86-3 b/resources/solaris/showrev-x86-3
new file mode 100644
index 0000000..5285802
--- /dev/null
+++ b/resources/solaris/showrev-x86-3
@@ -0,0 +1,8 @@
+Hostname: plop
+Hostid: 7c31a36
+Release: 5.10
+Kernel architecture: i86pc
+Application architecture: i386
+Hardware provider:
+Domain:
+Kernel version: SunOS 5.10 Generic_147441-09


================================================================
  Commit: 213c33293b28b44fa9086f4f87ac4d89732b93a1
      https://github.com/fusinv/fusioninventory-agent/commit/213c33293b28b44fa9086f4f87ac4d89732b93a1
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-01 (Thu, 01 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Bios.pm

  Log Message:
  -----------
  change interface for testability


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Bios.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Bios.pm
index 08de6b0..1967608 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Bios.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Bios.pm
@@ -26,7 +26,7 @@ sub doInventory {
 
         my $arch;
         if (canRun('showrev')) {
-            my $infos = _parseShowRev($logger);
+            my $infos = _parseShowRev(logger => $logger);
             $SystemModel        = $infos->{'Application architecture'};
             $SystemManufacturer = $infos->{'Hardware provider'};
             $arch               = $infos->{'Application architecture'};
@@ -87,12 +87,12 @@ sub doInventory {
 }
 
 sub _parseShowRev {
-    my ($logger) = @_;
-
-    my $handle = getFileHandle(
-        command => "showrev",
-        logger  => $logger
+    my (%params) = (
+        command => 'showrev',
+        @_
     );
+
+    my $handle = getFileHandle(%params);
     return unless $handle;
 
     my $infos;


================================================================
  Commit: a6119dcc14593f663e249f68cd8346bc91e0531e
      https://github.com/fusinv/fusioninventory-agent/commit/a6119dcc14593f663e249f68cd8346bc91e0531e
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-01 (Thu, 01 Mar 2012)

  Changed paths:
    A t/inventory/solaris/bios.t

  Log Message:
  -----------
  initial import


diff --git a/t/inventory/solaris/bios.t b/t/inventory/solaris/bios.t
new file mode 100755
index 0000000..88d34ce
--- /dev/null
+++ b/t/inventory/solaris/bios.t
@@ -0,0 +1,82 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+use Test::More;
+
+use FusionInventory::Agent::Task::Inventory::Input::Solaris::Bios;
+
+my %showrev_tests = (
+    'SPARC-1' => {
+        '    breakpoint-trap' => '0000007f',
+        '    banner-name' => '\'Sun',
+        '    compatible' => '\'SUNW,Serengeti\'',
+        '    scsi-initiator-id' => '00000007',
+        'Release' => '5.10',
+        '    name' => '\'SUNW,Sun-Fire\'',
+        'Memory size' => '16384',
+        '    #size-cells' => '00000002',
+        'System Configuration' => 'Sun',
+        'Hostname' => '157501s021plc',
+        'Kernel version' => 'SunOS',
+        'Kernel architecture' => 'sun4u',
+        'Hardware provider' => 'Sun_Microsystem',
+        '    node#' => '00000000',
+        '    newio-addr' => '00000001',
+        'Domain' => 'be.cnamts.fr',
+        'Application architecture' => 'sparc',
+        '    stick-frequency' => '00bebc20',
+        'Hostid' => '83249bbf',
+        '    clock-frequency' => '08f0d180',
+        '    idprom' => '01840014.4f4162cb.45255cf4.4162cb16.55555555.55555555.55555555.55555555',
+        '    device_type' => '\'gptwo\''
+    },
+    'SPARC-2' => {
+        'Kernel version' => 'SunOS',
+        'Release' => '5.10',
+        'Hostname' => 'mysunserver',
+        'Hardware provider' => 'Sun_Microsystems',
+        'Kernel architecture' => 'sun4v',
+        'Application architecture' => 'sparc',
+        'Hostid' => 'mabox'
+    },
+    'x86-1' => {
+        'Kernel version' => 'SunOS',
+        'Hostname' => 'stlaurent',
+        'Kernel architecture' => 'i86pc',
+        '  Manufacturer' => 'Sun',
+        'Application architecture' => 'i386',
+        '  Serial Number' => 'R00T34E0009',
+        '  Product' => 'Sun',
+        'Hostid' => '403100b',
+        'Release' => '5.10',
+        '  Wake-Up Event' => '0x6',
+        '  UUID' => 'be1630df-d130-41a4-be32-fd28bb4bd1ac',
+        '  Version' => '00'
+    },
+    'x86-2' => {
+        'Kernel version' => 'SunOS',
+        'Release' => '5.10',
+        'Hostname' => 'mamachine',
+        'Kernel architecture' => 'i86pc',
+        'Application architecture' => 'i386',
+        'Hostid' => '7c31a88'
+    },
+    'x86-3' => {
+        'Kernel version' => 'SunOS',
+        'Release' => '5.10',
+        'Hostname' => 'plop',
+        'Kernel architecture' => 'i86pc',
+        'Application architecture' => 'i386',
+        'Hostid' => '7c31a36'
+    }
+);
+
+plan tests => scalar keys %showrev_tests;
+
+foreach my $test (keys %showrev_tests) {
+    my $file   = "resources/solaris/showrev-$test";
+    my $result = FusionInventory::Agent::Task::Inventory::Input::Solaris::Bios::_parseShowRev(file => $file);
+    is_deeply($result, $showrev_tests{$test}, "showrev parsing: $test");
+}


================================================================
  Commit: 25c6dc36e42c0761f844c99d4f6b8bc83fd17d49
      https://github.com/fusinv/fusioninventory-agent/commit/25c6dc36e42c0761f844c99d4f6b8bc83fd17d49
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-01 (Thu, 01 Mar 2012)

  Changed paths:
    R resources/solaris/showrev-SPARC-1
    R resources/solaris/showrev-SPARC-2
    R resources/solaris/showrev-x86-1
    R resources/solaris/showrev-x86-2
    R resources/solaris/showrev-x86-3
    A resources/solaris/showrev/SPARC-1
    A resources/solaris/showrev/SPARC-2
    A resources/solaris/showrev/x86-1
    A resources/solaris/showrev/x86-2
    A resources/solaris/showrev/x86-3
    M t/inventory/solaris/bios.t

  Log Message:
  -----------
  use a specific subdirectory


diff --git a/resources/solaris/showrev-SPARC-1 b/resources/solaris/showrev-SPARC-1
deleted file mode 100644
index 7019112..0000000
--- a/resources/solaris/showrev-SPARC-1
+++ /dev/null
@@ -1,27 +0,0 @@
-Hostname: 157501s021plc
-Hostid: 83249bbf
-Release: 5.10
-Kernel architecture: sun4u
-Application architecture: sparc
-Hardware provider: Sun_Microsystem
-Domain: be.cnamts.fr
-Kernel version: SunOS 5.10 Generic_118833-17
-
- $ prtconf -pv    (-b would be great...but doesn't work before S10)
-System Configuration:  Sun Microsystems  sun4u
-Memory size: 16384 Megabyte
-System Peripherals (PROM Nodes):
-
-Node 0xf0819f00
-    scsi-initiator-id:  00000007
-    node#:  00000000
-    #size-cells:  00000002
-    stick-frequency:  00bebc20
-    clock-frequency:  08f0d180
-    idprom:  01840014.4f4162cb.45255cf4.4162cb16.55555555.55555555.55555555.55555555
-    breakpoint-trap:  0000007f
-    device_type:  'gptwo'
-    banner-name:  'Sun Fire E6900'
-    compatible: 'SUNW,Serengeti'
-    newio-addr:  00000001
-    name:  'SUNW,Sun-Fire'
diff --git a/resources/solaris/showrev-SPARC-2 b/resources/solaris/showrev-SPARC-2
deleted file mode 100644
index 2d3d320..0000000
--- a/resources/solaris/showrev-SPARC-2
+++ /dev/null
@@ -1,8 +0,0 @@
-Hostname: mysunserver
-Hostid: mabox
-Release: 5.10
-Kernel architecture: sun4v
-Application architecture: sparc
-Hardware provider: Sun_Microsystems
-Domain:
-Kernel version: SunOS 5.10 Generic_125100-06
diff --git a/resources/solaris/showrev-x86-1 b/resources/solaris/showrev-x86-1
deleted file mode 100644
index aabf729..0000000
--- a/resources/solaris/showrev-x86-1
+++ /dev/null
@@ -1,22 +0,0 @@
-Hostname: stlaurent
-Hostid: 403100b
-Release: 5.10
-Kernel architecture: i86pc
-Application architecture: i386
-Hardware provider:
-Domain:
-Kernel version: SunOS 5.10 Generic_127112-07
-
- $ smbios -t SMB_TYPE_SYSTEM
-ID    SIZE TYPE
-1     76   SMB_TYPE_SYSTEM (system information)
-
-  Manufacturer: Sun Microsystems, Inc.
-  Product: Sun Fire V40z
-  Version: 00
-  Serial Number: R00T34E0009
-
-  UUID: be1630df-d130-41a4-be32-fd28bb4bd1ac
-  Wake-Up Event: 0x6 (power switch)
-  SKU Number: 
-  Family:
diff --git a/resources/solaris/showrev-x86-2 b/resources/solaris/showrev-x86-2
deleted file mode 100644
index 4b8f705..0000000
--- a/resources/solaris/showrev-x86-2
+++ /dev/null
@@ -1,8 +0,0 @@
-Hostname: mamachine
-Hostid: 7c31a88
-Release: 5.10
-Kernel architecture: i86pc
-Application architecture: i386
-Hardware provider:
-Domain:
-Kernel version: SunOS 5.10 Generic_144489-03
diff --git a/resources/solaris/showrev-x86-3 b/resources/solaris/showrev-x86-3
deleted file mode 100644
index 5285802..0000000
--- a/resources/solaris/showrev-x86-3
+++ /dev/null
@@ -1,8 +0,0 @@
-Hostname: plop
-Hostid: 7c31a36
-Release: 5.10
-Kernel architecture: i86pc
-Application architecture: i386
-Hardware provider:
-Domain:
-Kernel version: SunOS 5.10 Generic_147441-09
diff --git a/resources/solaris/showrev/SPARC-1 b/resources/solaris/showrev/SPARC-1
new file mode 100644
index 0000000..7019112
--- /dev/null
+++ b/resources/solaris/showrev/SPARC-1
@@ -0,0 +1,27 @@
+Hostname: 157501s021plc
+Hostid: 83249bbf
+Release: 5.10
+Kernel architecture: sun4u
+Application architecture: sparc
+Hardware provider: Sun_Microsystem
+Domain: be.cnamts.fr
+Kernel version: SunOS 5.10 Generic_118833-17
+
+ $ prtconf -pv    (-b would be great...but doesn't work before S10)
+System Configuration:  Sun Microsystems  sun4u
+Memory size: 16384 Megabyte
+System Peripherals (PROM Nodes):
+
+Node 0xf0819f00
+    scsi-initiator-id:  00000007
+    node#:  00000000
+    #size-cells:  00000002
+    stick-frequency:  00bebc20
+    clock-frequency:  08f0d180
+    idprom:  01840014.4f4162cb.45255cf4.4162cb16.55555555.55555555.55555555.55555555
+    breakpoint-trap:  0000007f
+    device_type:  'gptwo'
+    banner-name:  'Sun Fire E6900'
+    compatible: 'SUNW,Serengeti'
+    newio-addr:  00000001
+    name:  'SUNW,Sun-Fire'
diff --git a/resources/solaris/showrev/SPARC-2 b/resources/solaris/showrev/SPARC-2
new file mode 100644
index 0000000..2d3d320
--- /dev/null
+++ b/resources/solaris/showrev/SPARC-2
@@ -0,0 +1,8 @@
+Hostname: mysunserver
+Hostid: mabox
+Release: 5.10
+Kernel architecture: sun4v
+Application architecture: sparc
+Hardware provider: Sun_Microsystems
+Domain:
+Kernel version: SunOS 5.10 Generic_125100-06
diff --git a/resources/solaris/showrev/x86-1 b/resources/solaris/showrev/x86-1
new file mode 100644
index 0000000..aabf729
--- /dev/null
+++ b/resources/solaris/showrev/x86-1
@@ -0,0 +1,22 @@
+Hostname: stlaurent
+Hostid: 403100b
+Release: 5.10
+Kernel architecture: i86pc
+Application architecture: i386
+Hardware provider:
+Domain:
+Kernel version: SunOS 5.10 Generic_127112-07
+
+ $ smbios -t SMB_TYPE_SYSTEM
+ID    SIZE TYPE
+1     76   SMB_TYPE_SYSTEM (system information)
+
+  Manufacturer: Sun Microsystems, Inc.
+  Product: Sun Fire V40z
+  Version: 00
+  Serial Number: R00T34E0009
+
+  UUID: be1630df-d130-41a4-be32-fd28bb4bd1ac
+  Wake-Up Event: 0x6 (power switch)
+  SKU Number: 
+  Family:
diff --git a/resources/solaris/showrev/x86-2 b/resources/solaris/showrev/x86-2
new file mode 100644
index 0000000..4b8f705
--- /dev/null
+++ b/resources/solaris/showrev/x86-2
@@ -0,0 +1,8 @@
+Hostname: mamachine
+Hostid: 7c31a88
+Release: 5.10
+Kernel architecture: i86pc
+Application architecture: i386
+Hardware provider:
+Domain:
+Kernel version: SunOS 5.10 Generic_144489-03
diff --git a/resources/solaris/showrev/x86-3 b/resources/solaris/showrev/x86-3
new file mode 100644
index 0000000..5285802
--- /dev/null
+++ b/resources/solaris/showrev/x86-3
@@ -0,0 +1,8 @@
+Hostname: plop
+Hostid: 7c31a36
+Release: 5.10
+Kernel architecture: i86pc
+Application architecture: i386
+Hardware provider:
+Domain:
+Kernel version: SunOS 5.10 Generic_147441-09
diff --git a/t/inventory/solaris/bios.t b/t/inventory/solaris/bios.t
index 88d34ce..828435c 100755
--- a/t/inventory/solaris/bios.t
+++ b/t/inventory/solaris/bios.t
@@ -76,7 +76,7 @@ my %showrev_tests = (
 plan tests => scalar keys %showrev_tests;
 
 foreach my $test (keys %showrev_tests) {
-    my $file   = "resources/solaris/showrev-$test";
+    my $file   = "resources/solaris/showrev/$test";
     my $result = FusionInventory::Agent::Task::Inventory::Input::Solaris::Bios::_parseShowRev(file => $file);
     is_deeply($result, $showrev_tests{$test}, "showrev parsing: $test");
 }


================================================================
  Commit: 59daa627d09eacd58387de92e69ea8f33037c868
      https://github.com/fusinv/fusioninventory-agent/commit/59daa627d09eacd58387de92e69ea8f33037c868
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-01 (Thu, 01 Mar 2012)

  Changed paths:
    A resources/solaris/prtconf/SPARC-1
    M resources/solaris/showrev/SPARC-1
    M resources/solaris/showrev/x86-1
    A resources/solaris/smbios/x86-1
    M t/inventory/solaris/bios.t

  Log Message:
  -----------
  extract unrelated content


diff --git a/resources/solaris/prtconf/SPARC-1 b/resources/solaris/prtconf/SPARC-1
new file mode 100644
index 0000000..8229c44
--- /dev/null
+++ b/resources/solaris/prtconf/SPARC-1
@@ -0,0 +1,17 @@
+System Configuration:  Sun Microsystems  sun4u
+Memory size: 16384 Megabyte
+System Peripherals (PROM Nodes):
+
+Node 0xf0819f00
+    scsi-initiator-id:  00000007
+    node#:  00000000
+    #size-cells:  00000002
+    stick-frequency:  00bebc20
+    clock-frequency:  08f0d180
+    idprom:  01840014.4f4162cb.45255cf4.4162cb16.55555555.55555555.55555555.55555555
+    breakpoint-trap:  0000007f
+    device_type:  'gptwo'
+    banner-name:  'Sun Fire E6900'
+    compatible: 'SUNW,Serengeti'
+    newio-addr:  00000001
+    name:  'SUNW,Sun-Fire'
diff --git a/resources/solaris/showrev/SPARC-1 b/resources/solaris/showrev/SPARC-1
index 7019112..2e37a0a 100644
--- a/resources/solaris/showrev/SPARC-1
+++ b/resources/solaris/showrev/SPARC-1
@@ -6,22 +6,3 @@ Application architecture: sparc
 Hardware provider: Sun_Microsystem
 Domain: be.cnamts.fr
 Kernel version: SunOS 5.10 Generic_118833-17
-
- $ prtconf -pv    (-b would be great...but doesn't work before S10)
-System Configuration:  Sun Microsystems  sun4u
-Memory size: 16384 Megabyte
-System Peripherals (PROM Nodes):
-
-Node 0xf0819f00
-    scsi-initiator-id:  00000007
-    node#:  00000000
-    #size-cells:  00000002
-    stick-frequency:  00bebc20
-    clock-frequency:  08f0d180
-    idprom:  01840014.4f4162cb.45255cf4.4162cb16.55555555.55555555.55555555.55555555
-    breakpoint-trap:  0000007f
-    device_type:  'gptwo'
-    banner-name:  'Sun Fire E6900'
-    compatible: 'SUNW,Serengeti'
-    newio-addr:  00000001
-    name:  'SUNW,Sun-Fire'
diff --git a/resources/solaris/showrev/x86-1 b/resources/solaris/showrev/x86-1
index aabf729..0365490 100644
--- a/resources/solaris/showrev/x86-1
+++ b/resources/solaris/showrev/x86-1
@@ -6,17 +6,3 @@ Application architecture: i386
 Hardware provider:
 Domain:
 Kernel version: SunOS 5.10 Generic_127112-07
-
- $ smbios -t SMB_TYPE_SYSTEM
-ID    SIZE TYPE
-1     76   SMB_TYPE_SYSTEM (system information)
-
-  Manufacturer: Sun Microsystems, Inc.
-  Product: Sun Fire V40z
-  Version: 00
-  Serial Number: R00T34E0009
-
-  UUID: be1630df-d130-41a4-be32-fd28bb4bd1ac
-  Wake-Up Event: 0x6 (power switch)
-  SKU Number: 
-  Family:
diff --git a/resources/solaris/smbios/x86-1 b/resources/solaris/smbios/x86-1
new file mode 100644
index 0000000..a9fbe69
--- /dev/null
+++ b/resources/solaris/smbios/x86-1
@@ -0,0 +1,12 @@
+ID    SIZE TYPE
+1     76   SMB_TYPE_SYSTEM (system information)
+
+  Manufacturer: Sun Microsystems, Inc.
+  Product: Sun Fire V40z
+  Version: 00
+  Serial Number: R00T34E0009
+
+  UUID: be1630df-d130-41a4-be32-fd28bb4bd1ac
+  Wake-Up Event: 0x6 (power switch)
+  SKU Number: 
+  Family:
diff --git a/t/inventory/solaris/bios.t b/t/inventory/solaris/bios.t
index 828435c..e6c8344 100755
--- a/t/inventory/solaris/bios.t
+++ b/t/inventory/solaris/bios.t
@@ -9,28 +9,14 @@ use FusionInventory::Agent::Task::Inventory::Input::Solaris::Bios;
 
 my %showrev_tests = (
     'SPARC-1' => {
-        '    breakpoint-trap' => '0000007f',
-        '    banner-name' => '\'Sun',
-        '    compatible' => '\'SUNW,Serengeti\'',
-        '    scsi-initiator-id' => '00000007',
         'Release' => '5.10',
-        '    name' => '\'SUNW,Sun-Fire\'',
-        'Memory size' => '16384',
-        '    #size-cells' => '00000002',
-        'System Configuration' => 'Sun',
         'Hostname' => '157501s021plc',
         'Kernel version' => 'SunOS',
         'Kernel architecture' => 'sun4u',
         'Hardware provider' => 'Sun_Microsystem',
-        '    node#' => '00000000',
-        '    newio-addr' => '00000001',
         'Domain' => 'be.cnamts.fr',
         'Application architecture' => 'sparc',
-        '    stick-frequency' => '00bebc20',
         'Hostid' => '83249bbf',
-        '    clock-frequency' => '08f0d180',
-        '    idprom' => '01840014.4f4162cb.45255cf4.4162cb16.55555555.55555555.55555555.55555555',
-        '    device_type' => '\'gptwo\''
     },
     'SPARC-2' => {
         'Kernel version' => 'SunOS',
@@ -45,15 +31,9 @@ my %showrev_tests = (
         'Kernel version' => 'SunOS',
         'Hostname' => 'stlaurent',
         'Kernel architecture' => 'i86pc',
-        '  Manufacturer' => 'Sun',
         'Application architecture' => 'i386',
-        '  Serial Number' => 'R00T34E0009',
-        '  Product' => 'Sun',
         'Hostid' => '403100b',
         'Release' => '5.10',
-        '  Wake-Up Event' => '0x6',
-        '  UUID' => 'be1630df-d130-41a4-be32-fd28bb4bd1ac',
-        '  Version' => '00'
     },
     'x86-2' => {
         'Kernel version' => 'SunOS',


================================================================
  Commit: 9ef7e0e2cede70088af10d96113f5d5447534b45
      https://github.com/fusinv/fusioninventory-agent/commit/9ef7e0e2cede70088af10d96113f5d5447534b45
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-01 (Thu, 01 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Bios.pm

  Log Message:
  -----------
  change interface for testability


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Bios.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Bios.pm
index 1967608..2791296 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Bios.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Bios.pm
@@ -106,12 +106,12 @@ sub _parseShowRev {
 }
 
 sub _parseSmbios {
-    my ($logger) = @_;
-
-    my $handle = getFileHandle(
-        command => "/usr/sbin/smbios",
-        logger  => $logger
+    my (%params) = (
+        command => '/usr/sbin/smbios',
+        @_
     );
+
+    my $handle = getFileHandle(%params);
     return unless $handle;
 
     my $infos;


================================================================
  Commit: c6583f321c61ccc718be6a1b8ac9df429894d6dd
      https://github.com/fusinv/fusioninventory-agent/commit/c6583f321c61ccc718be6a1b8ac9df429894d6dd
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-01 (Thu, 01 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Bios.pm

  Log Message:
  -----------
  change interface for testability


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Bios.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Bios.pm
index 2791296..4895ef3 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Bios.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Bios.pm
@@ -125,12 +125,12 @@ sub _parseSmbios {
 }
 
 sub _parsePrtconf {
-    my ($logger) = @_;
-
-    my $handle = getFileHandle(
-        command => "/usr/sbin/prtconf -pv",
-        logger  => $logger
+    my (%params) = (
+        command => '/usr/sbin/prtconf -pv',
+        @_
     );
+
+    my $handle = getFileHandle(%params);
     return unless $handle;
 
     my $infos;


================================================================
  Commit: 39251254c305a84a060dc9e49e26e2f6c87deb9c
      https://github.com/fusinv/fusioninventory-agent/commit/39251254c305a84a060dc9e49e26e2f6c87deb9c
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-01 (Thu, 01 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Bios.pm

  Log Message:
  -----------
  fix method calls


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Bios.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Bios.pm
index 4895ef3..995816e 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Bios.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Bios.pm
@@ -36,7 +36,7 @@ sub doInventory {
         }
 
         if ($arch eq "i386") {
-            my $infos = _parseSmbios($logger);
+            my $infos = _parseSmbios(logger => $logger);
             $SystemManufacturer = $infos->{'Manufacturer'};
             $SystemSerial       = $infos->{'Serial Number'};
             $SystemModel        = $infos->{'Product'};
@@ -45,7 +45,7 @@ sub doInventory {
             $BiosDate           = $infos->{'Release Date'};
             $uuid               = $infos->{'UUID'};
         } elsif ($arch =~ /sparc/i) {
-            my $infos = _parsePrtconf($logger);
+            my $infos = _parsePrtconf(logger => $logger);
             $SystemModel = $infos->{'banner-name'};
             $SystemModel .= " ($infos->{name})" if $infos->{name};
 
@@ -67,7 +67,7 @@ sub doInventory {
             );
         }
     } else {
-        my $infos = _parseShowRev($logger);
+        my $infos = _parseShowRev(logger => $logger);
         $SystemManufacturer = $infos->{'Hardware provider'};
         $SystemModel        = "Solaris Containers";
     }


================================================================
  Commit: a083e5342afafeaa43f01408453eb8d0d486c10b
      https://github.com/fusinv/fusioninventory-agent/commit/a083e5342afafeaa43f01408453eb8d0d486c10b
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-01 (Thu, 01 Mar 2012)

  Changed paths:
    M t/inventory/solaris/bios.t

  Log Message:
  -----------
  add prtconf and smbios parsing tests


diff --git a/t/inventory/solaris/bios.t b/t/inventory/solaris/bios.t
index e6c8344..c2ccc34 100755
--- a/t/inventory/solaris/bios.t
+++ b/t/inventory/solaris/bios.t
@@ -53,10 +53,87 @@ my %showrev_tests = (
     }
 );
 
-plan tests => scalar keys %showrev_tests;
+my %smbios_tests = (
+    'x86-1' => {
+        'Version' => '00',
+        'SKU Number' => ' ',
+        'Serial Number' => 'R00T34E0009',
+        'Product' => 'Sun Fire V40z',
+        'Manufacturer' => 'Sun Microsystems, Inc.',
+        'UUID' => 'be1630df-d130-41a4-be32-fd28bb4bd1ac',
+        'Wake-Up Event' => '0x6 (power switch)'
+    },
+    'x86-3' => {
+        'Flags' => '0x9',
+        'Serial Number' => 'QSDH1234567',
+        'Family' => ' ',
+        'Type' => '1 (KCS: Keyboard Controller Style)',
+        'ROM Size' => '8388608 bytes',
+        'Release Date' => '07/12/2009',
+        'Product' => 'S7000FC4UR',
+        'Manufacturer' => 'TRANSTEC',
+        'Characteristics' => '0x15c099a80',
+        'Version Number' => '0.0',
+        'Chassis Height' => '1u',
+        'Power Supply State' => '0x3 (safe)',
+        'Lock Present' => 'N',
+        'Interrupt Number' => '0',
+        'Version' => 'E10476-011',
+        'Version String' => 'SFC4UR.86B.01.00.0029.071220092126',
+        'Board Type' => '0xa (motherboard)',
+        'i2c Bus Slave Address' => '0x20',
+        'SKU Number' => '6I012345TF',
+        'Vendor' => 'Intel Corporation',
+        'Image Size' => '98304 bytes',
+        'Chassis Type' => '0x17 (rack mount chassis)',
+        'Power Cords' => '1',
+        'Address Segment' => '0xe800',
+        'BMC Base Address' => '0xca2',
+        'Boot-Up State' => '0x3 (safe)',
+        'UUID' => '4b713db6-6d40-11dd-b32c-000123456789',
+        'Chassis' => '0',
+        'NV Storage Device Bus ID' => '0xffffffff',
+        'BMC IPMI Version' => '2.0',
+        'Element Records' => '0',
+        'Thermal State' => '0x3 (safe)',
+        'Register Spacing' => '1',
+        'Asset Tag' => '6I012345TF',
+        'Characteristics Extension Byte 2' => '0x7',
+        'Characteristics Extension Byte 1' => '0x33',
+        'Embedded Ctlr Firmware Version Number' => '0.0',
+        'OEM Data' => '0x81581cf8',
+        'Wake-Up Event' => '0x6 (power switch)'
+      }
+);
+
+my %prtconf_tests = (
+    'SPARC-1' => {
+        'compatible' => 'SUNW,Serengeti',
+        'device_type' => 'gptwo',
+        'banner-name' => 'Sun Fire E6900',
+        'name' => 'SUNW,Sun-Fire'
+    }
+);
+
+plan tests => 
+    (scalar keys %showrev_tests) +
+    (scalar keys %smbios_tests)  +
+    (scalar keys %prtconf_tests);
 
 foreach my $test (keys %showrev_tests) {
     my $file   = "resources/solaris/showrev/$test";
     my $result = FusionInventory::Agent::Task::Inventory::Input::Solaris::Bios::_parseShowRev(file => $file);
     is_deeply($result, $showrev_tests{$test}, "showrev parsing: $test");
 }
+
+foreach my $test (keys %smbios_tests) {
+    my $file   = "resources/solaris/smbios/$test";
+    my $result = FusionInventory::Agent::Task::Inventory::Input::Solaris::Bios::_parseSmbios(file => $file);
+    is_deeply($result, $smbios_tests{$test}, "smbios parsing: $test");
+}
+
+foreach my $test (keys %prtconf_tests) {
+    my $file   = "resources/solaris/prtconf/$test";
+    my $result = FusionInventory::Agent::Task::Inventory::Input::Solaris::Bios::_parsePrtconf(file => $file);
+    is_deeply($result, $prtconf_tests{$test}, "prtconf parsing: $test");
+}


================================================================
  Commit: 792cdbb4a667422206aa7f6380cc78a071ad1e78
      https://github.com/fusinv/fusioninventory-agent/commit/792cdbb4a667422206aa7f6380cc78a071ad1e78
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-03-01 (Thu, 01 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/OS.pm

  Log Message:
  -----------
  read the productid from DigitalProductId4

WinProductId is collected from
HKEY_LOCAL_MACHINE/Software/Microsoft/Windows NT/CurrentVersion/DigitalProductId
Some time the value returned is empty or invalid (BBBB-BBBB-...)

In such cases, we failback on
HKEY_LOCAL_MACHINE/Software/Microsoft/Windows NT/CurrentVersion/DigitalProductId4

closes: #582

Reported-by: David Durieux <d.durieux at siprossii.com>
Reported-by: Ionut Bujor <ionut_bujor at hotmail.com>
Reported-by: Xavier Caillaud <tsmr at thetsmr.fr>


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/OS.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/OS.pm
index 2795421..6350989 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/OS.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/OS.pm
@@ -28,7 +28,10 @@ sub doInventory {
             / ]
         )) {
 
-        my $key = _getXPkey();
+        my $key = _getXPkey(path => 'HKEY_LOCAL_MACHINE/Software/Microsoft/Windows NT/CurrentVersion/DigitalProductId');
+        if (!$key) { # 582
+           $key = _getXPkey(path => 'HKEY_LOCAL_MACHINE/Software/Microsoft/Windows NT/CurrentVersion/DigitalProductId4');
+        }
         my $description = encodeFromRegistry(getRegistryValue(
             path   => 'HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/lanmanserver/Parameters/srvcomment',
             logger => $logger
@@ -119,10 +122,9 @@ sub doInventory {
 #http://www.perlmonks.org/?node_id=497616
 # Thanks William Gannon && Charles Clarkson
 sub _getXPkey {
-    my $key = getRegistryValue(
-        path => 'HKEY_LOCAL_MACHINE/Software/Microsoft/Windows NT/CurrentVersion/DigitalProductId',
-    );
+    my $key = getRegistryValue(@_);
     return unless $key;
+
     my @encoded = ( unpack 'C*', $key )[ reverse 52 .. 66 ];
 
     # Get indices
@@ -147,6 +149,7 @@ sub _getXPkey {
         join '-',
         $cd_key =~ /(.{5})/g;
 
+    return if $cd_key =~ /^[B-]*$/;
     return $cd_key;
 }
 


================================================================
  Commit: 61b4de3228182397f433102cb5f0f7c7892bcdeb
      https://github.com/fusinv/fusioninventory-agent/commit/61b4de3228182397f433102cb5f0f7c7892bcdeb
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-01 (Thu, 01 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Bios.pm
    M t/inventory/solaris/bios.t

  Log Message:
  -----------
  rework smbios parser

information is actually hierarchized in sections


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Bios.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Bios.pm
index 995816e..074d414 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Bios.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Bios.pm
@@ -114,10 +114,17 @@ sub _parseSmbios {
     my $handle = getFileHandle(%params);
     return unless $handle;
 
-    my $infos;
+    my ($infos, $current);
     while (my $line = <$handle>) {
-        next unless $line =~ /^ \s* ([^:]+) : \s* (.+) $/x;
-        $infos->{$1} = $2;
+        if ($line =~ /^ \d+ \s+ \d+ \s+ (\S+)/x) {
+            $current = $1;
+            next;
+        }
+
+        if ($line =~ /^ \s* ([^:]+) : \s* (.+) $/x) {
+            $infos->{$current}->{$1} = $2;
+            next;
+        }
     }
     close $handle;
 
diff --git a/t/inventory/solaris/bios.t b/t/inventory/solaris/bios.t
index c2ccc34..b649dbd 100755
--- a/t/inventory/solaris/bios.t
+++ b/t/inventory/solaris/bios.t
@@ -55,55 +55,73 @@ my %showrev_tests = (
 
 my %smbios_tests = (
     'x86-1' => {
-        'Version' => '00',
-        'SKU Number' => ' ',
-        'Serial Number' => 'R00T34E0009',
-        'Product' => 'Sun Fire V40z',
-        'Manufacturer' => 'Sun Microsystems, Inc.',
-        'UUID' => 'be1630df-d130-41a4-be32-fd28bb4bd1ac',
-        'Wake-Up Event' => '0x6 (power switch)'
+        'SMB_TYPE_SYSTEM' => {
+            'Version' => '00',
+            'SKU Number' => ' ',
+            'Serial Number' => 'R00T34E0009',
+            'Product' => 'Sun Fire V40z',
+            'Manufacturer' => 'Sun Microsystems, Inc.',
+            'UUID' => 'be1630df-d130-41a4-be32-fd28bb4bd1ac',
+            'Wake-Up Event' => '0x6 (power switch)'
+        }
     },
     'x86-3' => {
-        'Flags' => '0x9',
-        'Serial Number' => 'QSDH1234567',
-        'Family' => ' ',
-        'Type' => '1 (KCS: Keyboard Controller Style)',
-        'ROM Size' => '8388608 bytes',
-        'Release Date' => '07/12/2009',
-        'Product' => 'S7000FC4UR',
-        'Manufacturer' => 'TRANSTEC',
-        'Characteristics' => '0x15c099a80',
-        'Version Number' => '0.0',
-        'Chassis Height' => '1u',
-        'Power Supply State' => '0x3 (safe)',
-        'Lock Present' => 'N',
-        'Interrupt Number' => '0',
-        'Version' => 'E10476-011',
-        'Version String' => 'SFC4UR.86B.01.00.0029.071220092126',
-        'Board Type' => '0xa (motherboard)',
-        'i2c Bus Slave Address' => '0x20',
-        'SKU Number' => '6I012345TF',
-        'Vendor' => 'Intel Corporation',
-        'Image Size' => '98304 bytes',
-        'Chassis Type' => '0x17 (rack mount chassis)',
-        'Power Cords' => '1',
-        'Address Segment' => '0xe800',
-        'BMC Base Address' => '0xca2',
-        'Boot-Up State' => '0x3 (safe)',
-        'UUID' => '4b713db6-6d40-11dd-b32c-000123456789',
-        'Chassis' => '0',
-        'NV Storage Device Bus ID' => '0xffffffff',
-        'BMC IPMI Version' => '2.0',
-        'Element Records' => '0',
-        'Thermal State' => '0x3 (safe)',
-        'Register Spacing' => '1',
-        'Asset Tag' => '6I012345TF',
-        'Characteristics Extension Byte 2' => '0x7',
-        'Characteristics Extension Byte 1' => '0x33',
-        'Embedded Ctlr Firmware Version Number' => '0.0',
-        'OEM Data' => '0x81581cf8',
-        'Wake-Up Event' => '0x6 (power switch)'
-      }
+        SMB_TYPE_CHASSIS => {
+            'Chassis Height' => '1u',
+            'Power Supply State' => '0x3 (safe)',
+            'Element Records' => '0',
+            'Serial Number' => 'QSDH1234567',
+            'Thermal State' => '0x3 (safe)',
+            'Lock Present' => 'N',
+            'Asset Tag' => '6I012345TF',
+            'Chassis Type' => '0x17 (rack mount chassis)',
+            'Power Cords' => '1',
+            'Version' => 'E10476-011',
+            'OEM Data' => '0x81581cf8',
+            'Boot-Up State' => '0x3 (safe)',
+            'Manufacturer' => 'TRANSTEC'
+        },
+        SMB_TYPE_BIOS => {
+            'Characteristics' => '0x15c099a80',
+            'Version Number' => '0.0',
+            'Vendor' => 'Intel Corporation',
+            'Image Size' => '98304 bytes',
+            'Characteristics Extension Byte 2' => '0x7',
+            'Characteristics Extension Byte 1' => '0x33',
+            'Address Segment' => '0xe800',
+            'Version String' => 'SFC4UR.86B.01.00.0029.071220092126',
+            'Embedded Ctlr Firmware Version Number' => '0.0',
+            'Release Date' => '07/12/2009',
+            'ROM Size' => '8388608 bytes'
+        },
+        SMB_TYPE_IPMIDEV => {
+            'Flags' => '0x9',
+            'NV Storage Device Bus ID' => '0xffffffff',
+            'BMC IPMI Version' => '2.0',
+            'Register Spacing' => '1',
+            'Interrupt Number' => '0',
+            'Type' => '1 (KCS: Keyboard Controller Style)',
+            'i2c Bus Slave Address' => '0x20',
+            'BMC Base Address' => '0xca2'
+        },
+        SMB_TYPE_BASEBOARD => {
+            'Board Type' => '0xa (motherboard)',
+            'Flags' => '0x9',
+            'Serial Number' => 'QSFX12345678',
+            'Product' => 'S7000FC4UR',
+            'Manufacturer' => 'Intel',
+            'Chassis' => '0',
+            'Asset Tag' => '6I012345TF'
+        },
+        SMB_TYPE_SYSTEM => {
+            'Family' => ' ',
+            'SKU Number' => '6I012345TF',
+            'Product' => 'MP Server',
+            'Manufacturer' => 'Intel',
+            'UUID' => '4b713db6-6d40-11dd-b32c-000123456789',
+            'Wake-Up Event' => '0x6 (power switch)'
+        }
+    }
 );
 
 my %prtconf_tests = (


================================================================
  Commit: f3c6757dcb70f5b8851c0f57b3c5b039d556b723
      https://github.com/fusinv/fusioninventory-agent/commit/f3c6757dcb70f5b8851c0f57b3c5b039d556b723
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-03-01 (Thu, 01 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm

  Log Message:
  -----------
  Win32/softwares: various fixes


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm
index e65d362..a0a89c6 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm
@@ -27,6 +27,7 @@ sub doInventory {
     my (%params) = @_;
 
     my $inventory = $params{inventory};
+    my $logger = $params{logger};
 
     if (is64bit()) {
 
@@ -43,10 +44,9 @@ sub doInventory {
 
         foreach my $software (_getSoftwares(
             softwares => $softwares64,
-            is64bit   => 1,
-            logger => $logger
+            is64bit   => 1
         )) {
-            _addSoftware(inventory => $inventory, entry => $software, logger => $logger);
+            _addSoftware(inventory => $inventory, entry => $software);
         }
         _processMSIE(
             machKey   => $machKey64,
@@ -66,7 +66,7 @@ sub doInventory {
             is64bit   => 0,
             logger => $logger
         )) {
-            _addSoftware(inventory => $inventory, entry => $software, logger => $logger);
+            _addSoftware(inventory => $inventory, entry => $software);
         }
         _processMSIE(
             machKey   => $machKey32,
@@ -87,7 +87,7 @@ sub doInventory {
             softwares => $softwares,
             is64bit   => 0
         )) {
-            _addSoftware(inventory => $inventory, entry => $software, logger => $logger);
+            _addSoftware(inventory => $inventory, entry => $software);
         }
         _processMSIE(
             machKey   => $machKey,
@@ -167,7 +167,6 @@ sub _addSoftware {
 
     my $entry = $params{entry};
 
-    $params{logger}->debug("_addSoftware() begin") if $params{logger};
     # avoid duplicates
     return if $seen->{$entry->{NAME}}->{$entry->{IS64BIT}}{$entry->{VERSION} || '_undef_'}++;
 


================================================================
  Commit: 3ab8e5cf2205f7e75876f941df1ed8f657a6b88d
      https://github.com/fusinv/fusioninventory-agent/commit/3ab8e5cf2205f7e75876f941df1ed8f657a6b88d
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-03-01 (Thu, 01 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/CPU.pm

  Log Message:
  -----------
  do not disable the module if dmidecode is avalaible

We don't use dmidecode directly to collect the CPU.
The $runMeIfTheseChecksFailed value was false but
$runMeIfTheseChecksFailed itself was broken.
That's why the problem append only now.

see:334935af3019d47304c1556ca4e0675a2c7e7ecb

closes: #1470

Reported-by: Olivier Moron <olivier.moron at raynet-it.com>


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/CPU.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/CPU.pm
index 8f1d49c..57d4e95 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/CPU.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/CPU.pm
@@ -15,9 +15,6 @@ use FusionInventory::Agent::Tools;
 use FusionInventory::Agent::Tools::Win32;
 use FusionInventory::Agent::Tools::Generic;
 
-our $runMeIfTheseChecksFailed =
-    ["FusionInventory::Agent::Task::Inventory::Input::Generic::Dmidecode"];
-
 sub isEnabled {
     return 1;
 }


================================================================
  Commit: 688289d74d2e60213d65421e3724a046115083c6
      https://github.com/fusinv/fusioninventory-agent/commit/688289d74d2e60213d65421e3724a046115083c6
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-01 (Thu, 01 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Inventory.pm

  Log Message:
  -----------
  no more BASEBOARDSERIAL


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Inventory.pm b/lib/FusionInventory/Agent/Task/Inventory/Inventory.pm
index c0fd89b..1242d90 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Inventory.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Inventory.pm
@@ -54,7 +54,7 @@ my %fields = (
                         PRINTPROCESSOR SERIAL/ ],
     BIOS             => [ qw/SMODEL SMANUFACTURER SSN BDATE BVERSION 
                              BMANUFACTURER MMANUFACTURER MSN MMODEL ASSETTAG 
-                             ENCLOSURESERIAL BASEBOARDSERIAL BIOSSERIAL 
+                             ENCLOSURESERIAL BIOSSERIAL 
                              TYPE SKUNUMBER/ ],
     HARDWARE         => [ qw/USERID OSVERSION PROCESSORN OSCOMMENTS CHECKSUM
                              PROCESSORT NAME PROCESSORS SWAP ETIME TYPE OSNAME


================================================================
  Commit: ec5722d864771ef14d488057a55d620a35397f81
      https://github.com/fusinv/fusioninventory-agent/commit/ec5722d864771ef14d488057a55d620a35397f81
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-01 (Thu, 01 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Bios.pm

  Log Message:
  -----------
  use structured smbios information

- fix confusion between system, bios and motherboard information (close
  #1315)
- add SKU number, motherboard model, manufacturer and serial


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Bios.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Bios.pm
index 074d414..404ea2d 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Bios.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Bios.pm
@@ -19,7 +19,8 @@ sub doInventory {
     my $logger    = $params{logger};
 
     my ($SystemSerial, $SystemModel, $SystemManufacturer, $BiosManufacturer,
-        $BiosVersion, $BiosDate, $uuid);
+        $BiosVersion, $BiosDate, $uuid, $sku, $MotherboardSerial, 
+        $MotherboardManufacturer, $MotherboardModel);
 
     my $zone = getZone();
     if ($zone) {
@@ -37,13 +38,20 @@ sub doInventory {
 
         if ($arch eq "i386") {
             my $infos = _parseSmbios(logger => $logger);
-            $SystemManufacturer = $infos->{'Manufacturer'};
-            $SystemSerial       = $infos->{'Serial Number'};
-            $SystemModel        = $infos->{'Product'};
-            $BiosManufacturer   = $infos->{'Vendor'};
-            $BiosVersion        = $infos->{'Version String'};
-            $BiosDate           = $infos->{'Release Date'};
-            $uuid               = $infos->{'UUID'};
+            my $motherboardInfos = $infos->{SMB_TYPE_BASEBOARD};
+            my $systemInfos = $infos->{SMB_TYPE_SYSTEM};
+            my $biosInfos = $infos->{SMB_TYPE_BIOS};
+
+            $BiosManufacturer   = $biosInfos->{'Vendor'};
+            $BiosVersion        = $biosInfos->{'Version String'};
+            $BiosDate           = $biosInfos->{'Release Date'};
+            $SystemManufacturer = $systemInfos->{'Manufacturer'};
+            $SystemModel        = $systemInfos->{'Product'};
+            $uuid               = $systemInfos->{'UUID'};
+            $sku                = $systemInfos->{'SKU Number'};
+            $MotherboardModel        = $motherboardInfos->{'Product'};
+            $MotherboardSerial       = $motherboardInfos->{'Serial Number'};
+            $MotherboardManufacturer = $motherboardInfos->{'Manufacturer'};
         } elsif ($arch =~ /sparc/i) {
             my $infos = _parsePrtconf(logger => $logger);
             $SystemModel = $infos->{'banner-name'};
@@ -78,7 +86,11 @@ sub doInventory {
         BMANUFACTURER => $BiosManufacturer,
         SMANUFACTURER => $SystemManufacturer,
         SMODEL        => $SystemModel,
-        SSN           => $SystemSerial
+        SSN           => $SystemSerial,
+        SKUNUMBER     => $sku,
+        MSN           => $MotherboardSerial,
+        MMANUFACTURER => $MotherboardManufacturer,
+        MMODEL        => $MotherboardModel
     });
 
     $inventory->setHardware({


================================================================
  Commit: f4c93290f600fa3cdf8ae9cea9ede69604f134c2
      https://github.com/fusinv/fusioninventory-agent/commit/f4c93290f600fa3cdf8ae9cea9ede69604f134c2
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-01 (Thu, 01 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Bios.pm

  Log Message:
  -----------
  less intermediate variables


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Bios.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Bios.pm
index 404ea2d..65c1546 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Bios.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Bios.pm
@@ -18,9 +18,7 @@ sub doInventory {
     my $inventory = $params{inventory};
     my $logger    = $params{logger};
 
-    my ($SystemSerial, $SystemModel, $SystemManufacturer, $BiosManufacturer,
-        $BiosVersion, $BiosDate, $uuid, $sku, $MotherboardSerial, 
-        $MotherboardManufacturer, $MotherboardModel);
+    my ($bios, $hardware);
 
     my $zone = getZone();
     if ($zone) {
@@ -28,8 +26,8 @@ sub doInventory {
         my $arch;
         if (canRun('showrev')) {
             my $infos = _parseShowRev(logger => $logger);
-            $SystemModel        = $infos->{'Application architecture'};
-            $SystemManufacturer = $infos->{'Hardware provider'};
+            $bios->{SMODEL}        = $infos->{'Application architecture'};
+            $bios->{SMANUFACTURER} = $infos->{'Hardware provider'};
             $arch               = $infos->{'Application architecture'};
         } else {
             $arch =
@@ -38,64 +36,52 @@ sub doInventory {
 
         if ($arch eq "i386") {
             my $infos = _parseSmbios(logger => $logger);
-            my $motherboardInfos = $infos->{SMB_TYPE_BASEBOARD};
-            my $systemInfos = $infos->{SMB_TYPE_SYSTEM};
+
             my $biosInfos = $infos->{SMB_TYPE_BIOS};
+            $bios->{BMANUFACTURER} = $biosInfos->{'Vendor'};
+            $bios->{BVERSION}      = $biosInfos->{'Version String'};
+            $bios->{BDATE}         = $biosInfos->{'Release Date'};
 
-            $BiosManufacturer   = $biosInfos->{'Vendor'};
-            $BiosVersion        = $biosInfos->{'Version String'};
-            $BiosDate           = $biosInfos->{'Release Date'};
-            $SystemManufacturer = $systemInfos->{'Manufacturer'};
-            $SystemModel        = $systemInfos->{'Product'};
-            $uuid               = $systemInfos->{'UUID'};
-            $sku                = $systemInfos->{'SKU Number'};
-            $MotherboardModel        = $motherboardInfos->{'Product'};
-            $MotherboardSerial       = $motherboardInfos->{'Serial Number'};
-            $MotherboardManufacturer = $motherboardInfos->{'Manufacturer'};
+            my $systemInfos = $infos->{SMB_TYPE_SYSTEM};
+            $bios->{SMANUFACTURER} = $systemInfos->{'Manufacturer'};
+            $bios->{SMODEL}        = $systemInfos->{'Product'};
+            $bios->{SKUNUMBER}     = $systemInfos->{'SKU Number'};
+            $hardware->{UUID}      = $systemInfos->{'UUID'};
+
+            my $motherboardInfos = $infos->{SMB_TYPE_BASEBOARD};
+            $bios->{MMODEL}        = $motherboardInfos->{'Product'};
+            $bios->{MSN}           = $motherboardInfos->{'Serial Number'};
+            $bios->{MMANUFACTURER} = $motherboardInfos->{'Manufacturer'};
         } elsif ($arch =~ /sparc/i) {
             my $infos = _parsePrtconf(logger => $logger);
-            $SystemModel = $infos->{'banner-name'};
-            $SystemModel .= " ($infos->{name})" if $infos->{name};
+            $bios->{SMODEL} = $infos->{'banner-name'};
+            $bios->{SMODEL} .= " ($infos->{name})" if $infos->{name};
 
             # looks like : "OBP 4.16.4 2004/12/18 05:18"
             #    with further informations sometime
             if ($infos->{version} =~ m{OBP\s+([\d|\.]+)\s+(\d+)/(\d+)/(\d+)}) {
-                $BiosVersion = "OBP $1";
-                $BiosDate    = "$2/$3/$4";
+                $bios->{BVERSION} = "OBP $1";
+                $bios->{BDATE}    = "$2/$3/$4";
             } else {
-                $BiosVersion = $infos->{version};
+                $bios->{BVERSION} = $infos->{version};
             }
 
             my $command = -x '/opt/SUNWsneep/bin/sneep' ?
                 '/opt/SUNWsneep/bin/sneep' : 'sneep';
 
-            $SystemSerial = getFirstLine(
+            $bios->{SSN} = getFirstLine(
                 command => $command,
                 logger  => $logger
             );
         }
     } else {
         my $infos = _parseShowRev(logger => $logger);
-        $SystemManufacturer = $infos->{'Hardware provider'};
-        $SystemModel        = "Solaris Containers";
+        $bios->{SMANUFACTURER} = $infos->{'Hardware provider'};
+        $bios->{SMODEL}        = "Solaris Containers";
     }
 
-    $inventory->setBios({
-        BVERSION      => $BiosVersion,
-        BDATE         => $BiosDate,
-        BMANUFACTURER => $BiosManufacturer,
-        SMANUFACTURER => $SystemManufacturer,
-        SMODEL        => $SystemModel,
-        SSN           => $SystemSerial,
-        SKUNUMBER     => $sku,
-        MSN           => $MotherboardSerial,
-        MMANUFACTURER => $MotherboardManufacturer,
-        MMODEL        => $MotherboardModel
-    });
-
-    $inventory->setHardware({
-        UUID => $uuid
-    });
+    $inventory->setBios($bios);
+    $inventory->setHardware($hardware);
 }
 
 sub _parseShowRev {


================================================================
  Commit: d36d3570cf7ce387710b1153653fc654d555163e
      https://github.com/fusinv/fusioninventory-agent/commit/d36d3570cf7ce387710b1153653fc654d555163e
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-01 (Thu, 01 Mar 2012)

  Changed paths:
    M Changes
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/OS.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm

  Log Message:
  -----------
  Merge remote-tracking branch 'forge/2.2.x' into 2.2.x


diff --git a/Changes b/Changes
index 73837f2..a6da7ba 100644
--- a/Changes
+++ b/Changes
@@ -59,7 +59,41 @@ Minor changes:
 * Linux: Use /sbin/ip to get the interface IP addresses (#854)
 * HPUX: don't report unoccupied memory slots
 
-2.1.12  Wed, 14 Dec 2011 13:06:44 +0100
+2.1.14  Wed, 22 Feb 2012 14:56:51 -0000
+
+LINUX
+ ✔ Detected OS is "RedHat" for CentOS servers if lsb_release not available
+       commit:d3a252
+     http://forge.fusioninventory.org/issues/1193
+   thanks: Jonathan Clarke
+
+MACOSX
+ ✔ no-software option doesn't work as advertised
+       commit:18dfaf
+     http://forge.fusioninventory.org/issues/1476
+   thanks: Ronan Mejecaze
+ ✔ syntax error in Video module
+   thanks: Walid Nouh
+
+WINDOWS
+ ✔ No 2007 Microsoft Office system into XML
+       commit:39f3c7
+     http://forge.fusioninventory.org/issues/1065
+   thanks: Walid Nouh, Xavier Caillaud, jerome slayer
+ ✔ On Windows Vista Office 2007 is not correctly gathered
+       commit:39f3c7
+     http://forge.fusioninventory.org/issues/1425
+   thanks: Walid Nouh, Xavier Caillaud
+ ✔ VM System incorrect
+       commit:259996
+     http://forge.fusioninventory.org/issues/1436
+   thanks: Mario Gzuk
+ ✔ Inventory Internet Explorer when it's not present in Add/remove programs
+       commit:39f3c7
+     http://forge.fusioninventory.org/issues/1441
+   thanks: Walid Nouh, Xavier Caillaud, jerome slayer
+
+2.1.13  Wed, 14 Dec 2011 13:06:44 +0100
 
 TEST-SUITE
  ✔ 2.1.10 Test suite fails
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/OS.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/OS.pm
index 7595ecd..794b4cd 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/OS.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/OS.pm
@@ -28,7 +28,10 @@ sub doInventory {
             / ]
         )) {
 
-        my $key = _getXPkey();
+        my $key = _getXPkey(path => 'HKEY_LOCAL_MACHINE/Software/Microsoft/Windows NT/CurrentVersion/DigitalProductId');
+        if (!$key) { # 582
+           $key = _getXPkey(path => 'HKEY_LOCAL_MACHINE/Software/Microsoft/Windows NT/CurrentVersion/DigitalProductId4');
+        }
         my $description = encodeFromRegistry(getRegistryValue(
             path   => 'HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/lanmanserver/Parameters/srvcomment',
             logger => $logger
@@ -119,10 +122,9 @@ sub doInventory {
 #http://www.perlmonks.org/?node_id=497616
 # Thanks William Gannon && Charles Clarkson
 sub _getXPkey {
-    my $key = getRegistryValue(
-        path => 'HKEY_LOCAL_MACHINE/Software/Microsoft/Windows NT/CurrentVersion/DigitalProductId',
-    );
+    my $key = getRegistryValue(@_);
     return unless $key;
+
     my @encoded = ( unpack 'C*', $key )[ reverse 52 .. 66 ];
 
     # Get indices
@@ -147,6 +149,7 @@ sub _getXPkey {
         join '-',
         $cd_key =~ /(.{5})/g;
 
+    return if $cd_key =~ /^[B-]*$/;
     return $cd_key;
 }
 
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm
index 6b11a72..e65d362 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm
@@ -15,7 +15,7 @@ use Win32::TieRegistry (
 use FusionInventory::Agent::Tools;
 use FusionInventory::Agent::Tools::Win32;
 
-my $seen;
+my $seen = {};
 
 sub isEnabled {
     my (%params) = @_;
@@ -36,16 +36,17 @@ sub doInventory {
 
         my $machKey64 = $Registry->Open('LMachine', {
             Access => KEY_READ | KEY_WOW64_64 ## no critic (ProhibitBitwise)
-        }) or die "Can't open HKEY_LOCAL_MACHINE key: $EXTENDED_OS_ERROR";
+        }) or $logger->error("Can't open HKEY_LOCAL_MACHINE key: $EXTENDED_OS_ERROR");
 
         my $softwares64 =
             $machKey64->{"SOFTWARE/Microsoft/Windows/CurrentVersion/Uninstall"};
 
         foreach my $software (_getSoftwares(
             softwares => $softwares64,
-            is64bit   => 1
+            is64bit   => 1,
+            logger => $logger
         )) {
-            _addSoftware(inventory => $inventory, entry => $software);
+            _addSoftware(inventory => $inventory, entry => $software, logger => $logger);
         }
         _processMSIE(
             machKey   => $machKey64,
@@ -55,16 +56,17 @@ sub doInventory {
 
         my $machKey32 = $Registry->Open('LMachine', {
             Access => KEY_READ | KEY_WOW64_32 ## no critic (ProhibitBitwise)
-        }) or die "Can't open HKEY_LOCAL_MACHINE key: $EXTENDED_OS_ERROR";
+        }) or $logger->error("Can't open HKEY_LOCAL_MACHINE key: $EXTENDED_OS_ERROR");
 
         my $softwares32 =
             $machKey32->{"SOFTWARE/Microsoft/Windows/CurrentVersion/Uninstall"};
 
         foreach my $software (_getSoftwares(
             softwares => $softwares32,
-            is64bit   => 0
+            is64bit   => 0,
+            logger => $logger
         )) {
-            _addSoftware(inventory => $inventory, entry => $software);
+            _addSoftware(inventory => $inventory, entry => $software, logger => $logger);
         }
         _processMSIE(
             machKey   => $machKey32,
@@ -76,7 +78,7 @@ sub doInventory {
     } else {
         my $machKey = $Registry->Open('LMachine', {
             Access => KEY_READ
-        }) or die "Can't open HKEY_LOCAL_MACHINE key: $EXTENDED_OS_ERROR";
+        }) or $logger->error("Can't open HKEY_LOCAL_MACHINE key: $EXTENDED_OS_ERROR");
 
         my $softwares =
             $machKey->{"SOFTWARE/Microsoft/Windows/CurrentVersion/Uninstall"};
@@ -85,7 +87,7 @@ sub doInventory {
             softwares => $softwares,
             is64bit   => 0
         )) {
-            _addSoftware(inventory => $inventory, entry => $software);
+            _addSoftware(inventory => $inventory, entry => $software, logger => $logger);
         }
         _processMSIE(
             machKey   => $machKey,
@@ -96,7 +98,7 @@ sub doInventory {
 }
 
 sub _dateFormat {
-    my ($date) = @_; 
+    my ($date) = @_;
 
     ## no critic (ExplicitReturnUndef)
     return undef unless $date;
@@ -119,13 +121,18 @@ sub _getSoftwares {
 
     my @softwares;
 
+    return unless $softwares;
+
     foreach my $rawGuid (keys %$softwares) {
         my $data = $softwares->{$rawGuid};
+
+        next unless $data;
+
         # odd, found on Win2003
         next unless keys %$data > 2;
 
         my $guid = $rawGuid;
-        $guid =~ s/\/$//; # drop the tailing / 
+        $guid =~ s/\/$//; # drop the tailing /
 
         my $software = {
             FROM             => "registry",
@@ -160,6 +167,7 @@ sub _addSoftware {
 
     my $entry = $params{entry};
 
+    $params{logger}->debug("_addSoftware() begin") if $params{logger};
     # avoid duplicates
     return if $seen->{$entry->{NAME}}->{$entry->{IS64BIT}}{$entry->{VERSION} || '_undef_'}++;
 
@@ -174,6 +182,8 @@ sub _processMSIE {
     my $version = 
         $params{machKey}->{"SOFTWARE/Microsoft/Internet Explorer/Version"};
 
+    return unless $version; # Not installed
+
     _addSoftware(
         inventory => $params{inventory},
         entry     => {


================================================================
  Commit: 1b2636c27b62d7fd7e6f237c514c38a90b9f3ea4
      https://github.com/fusinv/fusioninventory-agent/commit/1b2636c27b62d7fd7e6f237c514c38a90b9f3ea4
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-02 (Fri, 02 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/AIX/Bios.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/Alpha.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/MIPS.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/SPARC.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Archs/PowerPC.pm

  Log Message:
  -----------
  less intermediate variables


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/AIX/Bios.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/AIX/Bios.pm
index 245c73b..00dc9ee 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/AIX/Bios.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/AIX/Bios.pm
@@ -22,30 +22,26 @@ sub doInventory {
     my $inventory = $params{inventory};
     my $logger    = $params{logger};
 
-    my ($serial, $model, $version, $date);
+    my $bios = {
+        BMANUFACTURER => 'IBM',
+        SMANUFACTURER => 'IBM',
+    };
 
     my @infos = getLsvpdInfos(logger => $logger);
 
     my $system = first { $_->{DS} eq 'System Firmware' } @infos;
-    $version = $system->{RM} if $system;
+    $bios->{BVERSION} = $system->{RM} if $system;
 
     my $platform = first { $_->{DS} eq 'Platform Firmware' } @infos;
-    $version .= "(Firmware : $platform->{RM})" if $platform;
+    $bios->{BVERSION} .= "(Firmware : $platform->{RM})" if $platform;
 
     my $vpd = first { $_->{DS} eq 'System VPD' } @infos;
     if ($vpd) {
-        $model = $vpd->{TM};
-        $serial = $vpd->{SE};
+        $bios->{SMODEL} = $vpd->{TM};
+        $bios->{SSN} = $vpd->{SE};
     }
 
-    $inventory->setBios({
-        BVERSION      => $version,
-        BDATE         => $date,
-        BMANUFACTURER => 'IBM',
-        SMANUFACTURER => 'IBM',
-        SMODEL        => $model,
-        SSN           => $serial,
-    });
+    $inventory->setBios($bios);
 }
 
 1;
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/Alpha.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/Alpha.pm
index b9d5d21..f83dc0b 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/Alpha.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/Alpha.pm
@@ -16,10 +16,14 @@ sub doInventory {
 
     my $inventory = $params{inventory};
 
+    my $bios = {
+        SMANUFACTURER => 'DEC',
+    };
+
     # sysctl infos
 
     # example on *BSD: AlphaStation 255 4/232
-    my $SystemModel = getFirstLine(command => 'sysctl -n hw.model');
+    $bios->{SMODEL} = getFirstLine(command => 'sysctl -n hw.model');
 
     my $processorn = getFirstLine(command => 'sysctl -n hw.ncpu');
 
@@ -37,14 +41,11 @@ sub doInventory {
 
     my ($processort, $processors);
     foreach my $line (getAllLines(command => 'dmesg')) {
-        if ($line =~ /$SystemModel,\s*(\S+)\s*MHz/) { $processors = $1; }
+        if ($line =~ /$bios->{SMODEL},\s*(\S+)\s*MHz/) { $processors = $1; }
         if ($line =~ /^cpu[^:]*:\s*(.*)$/i)         { $processort = $1; }
     }
 
-    $inventory->setBios({
-        SMANUFACTURER => 'DEC',
-        SMODEL        => $SystemModel,
-    });
+    $inventory->setBios($bios);
 
     for my $i (1 .. $processorn) {
         $inventory->addEntry(
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/MIPS.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/MIPS.pm
index e79dbd0..4109b5e 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/MIPS.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/MIPS.pm
@@ -15,12 +15,16 @@ sub doInventory {
     my (%params) = @_;
 
     my $inventory = $params{inventory};
+    
+    my $bios = {
+        SMANUFACTURER => 'SGI',
+    };
 
     # sysctl infos
 
     # example on NetBSD: SGI-IP22
     # example on OpenBSD: SGI-O2 (IP32)
-    my $SystemModel = getFirstLine(command => 'sysctl -n hw.model');
+    $bios->{SMODEL} = getFirstLine(command => 'sysctl -n hw.model');
 
     my $processorn = getFirstLine(command => 'sysctl -n hw.ncpu');
 
@@ -41,18 +45,14 @@ sub doInventory {
     # cpu0 at mainbus0: MIPS R5000 CPU rev 2.1 180 MHz with R5000 based FPC rev 1.0
     # cpu0: cache L1-I 32KB D 32KB 2 way, L2 512KB direct
 
-    my ($SystemSerial, $processort, $processors);
+    my ($processort, $processors);
     foreach my $line (getAllLines(command => 'dmesg')) {
-        if ($line =~ /$SystemModel\s*\[\S*\s*(\S*)\]/) { $SystemSerial = $1; }
-        if ($line =~ /cpu0 at mainbus0:\s*(.*)$/)      { $processort = $1;   }
-        if ($line =~ /CPU\s*.*\D(\d+)\s*MHz/)          { $processors = $1;   }
+        if ($line =~ /$bios->{SMODEL}\s*\[\S*\s*(\S*)\]/) { $bios->{SSN} = $1; }
+        if ($line =~ /cpu0 at mainbus0:\s*(.*)$/)         { $processort = $1;  }
+        if ($line =~ /CPU\s*.*\D(\d+)\s*MHz/)             { $processors = $1;  }
     }
 
-    $inventory->setBios({
-        SMANUFACTURER => 'SGI',
-        SMODEL        => $SystemModel,
-        SSN           => $SystemSerial,
-    });
+    $inventory->setBios($bios);
 
     for my $i (1 .. $processorn) {
         $inventory->addEntry(
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/SPARC.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/SPARC.pm
index 9cb1786..7fbdf3b 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/SPARC.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/SPARC.pm
@@ -16,17 +16,21 @@ sub doInventory {
 
     my $inventory = $params{inventory};
 
+    my $bios = {
+        SMANUFACTURER => 'SUN',
+    };
+
     # sysctl infos
 
     # it gives only the CPU on OpenBSD/sparc64
-    my $SystemModel = getFirstLine(command => 'sysctl -n hw.model');
+    $bios->{SMODEL} = getFirstLine(command => 'sysctl -n hw.model');
 
     # example on NetBSD: 0x807b65c
     # example on OpenBSD: 2155570635
-    my $SystemSerial = getFirstLine(command => 'sysctl -n kern.hostid');
+    $bios->{SSN} = getFirstLine(command => 'sysctl -n kern.hostid');
     # force hexadecimal, but remove 0x to make it appear as in the firmware
-    $SystemSerial = dec2hex($SystemSerial);
-    $SystemSerial =~ s/^0x//;
+    $bios->{SSN} = dec2hex($bios->{SSN});
+    $bios->{SSN} =~ s/^0x//;
 
     my $processorn = getFirstLine(command => 'sysctl -n hw.ncpu');
 
@@ -52,14 +56,14 @@ sub doInventory {
 
     my $processort;
     foreach my $line (getAllLines(command => 'dmesg')) {
-        if ($line=~ /^mainbus0 \(root\):\s*(.*)$/) { $SystemModel = $1; }
+        if ($line=~ /^mainbus0 \(root\):\s*(.*)$/) { $bios->{SMODEL} = $1; }
         if ($line =~ /^cpu[^:]*:\s*(.*)$/i)        { $processort = $1; }
     }
 
-    $SystemModel =~ s/SUNW,//;
-    $SystemModel =~ s/[:\(].*$//;
-    $SystemModel =~ s/^\s*//;
-    $SystemModel =~ s/\s*$//;
+    $bios->{SMODEL} =~ s/SUNW,//;
+    $bios->{SMODEL} =~ s/[:\(].*$//;
+    $bios->{SMODEL} =~ s/^\s*//;
+    $bios->{SMODEL} =~ s/\s*$//;
 
     $processort =~ s/SUNW,//;
     $processort =~ s/^\s*//;
@@ -71,11 +75,7 @@ sub doInventory {
         $processors = sprintf("%.0f", "$1$2"); # round number
     }
 
-    $inventory->setBios({
-        SMANUFACTURER => 'SUN',
-        SMODEL        => $SystemModel,
-        SSN           => $SystemSerial,
-    });
+    $inventory->setBios($bios);
 
     for my $i (1 .. $processorn) {
         $inventory->addEntry(
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Archs/PowerPC.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Archs/PowerPC.pm
index b8c4fc0..50433f3 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Archs/PowerPC.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Archs/PowerPC.pm
@@ -44,35 +44,30 @@ sub doInventory {
         );
     }
 
-    my $SystemSerial = getFirstLine(file => '/proc/device-tree/serial-number');
-    $SystemSerial =~ s/[^\,^\.^\w^\ ]//g; # I remove some unprintable char
+    my $bios;
 
-    my $SystemModel = getFirstLine(file => '/proc/device-tree/model');
-    $SystemModel =~ s/[^\,^\.^\w^\ ]//g;
+    $bios->{SSN} = getFirstLine(file => '/proc/device-tree/serial-number');
+    $bios->{SSN} =~ s/[^\,^\.^\w^\ ]//g; # I remove some unprintable char
+
+    $bios->{SMODEL} = getFirstLine(file => '/proc/device-tree/model');
+    $bios->{SMODEL} =~ s/[^\,^\.^\w^\ ]//g;
 
     my $colorCode = getFirstLine(file => '/proc/device-tree/color-code');
     my ($color) = unpack "h7" , $colorCode;
-    $SystemModel .= " color: $color" if $color;
+    $bios->{SMODEL} .= " color: $color" if $color;
 
-    my $BiosVersion = getFirstLine(file => '/proc/device-tree/openprom/model');
-    $BiosVersion =~ s/[^\,^\.^\w^\ ]//g;
+    $bios->{BVERSION} =
+        getFirstLine(file => '/proc/device-tree/openprom/model');
+    $bios->{BVERSION} =~ s/[^\,^\.^\w^\ ]//g;
 
-    my ($BiosManufacturer, $SystemManufacturer);
     my $copyright = getFirstLine(file => '/proc/device-tree/copyright');
     if ($copyright && $copyright =~ /Apple/) {
         # What about the Apple clone?
-        $BiosManufacturer = "Apple Computer, Inc.";
-        $SystemManufacturer = "Apple Computer, Inc." 
+        $bios->{BMANUFACTURER} = "Apple Computer, Inc.";
+        $bios->{SMANUFACTURER} = "Apple Computer, Inc." 
     }
 
-    $inventory->setBios({
-        SMANUFACTURER => $SystemManufacturer,
-        SMODEL        => $SystemModel,
-        SSN           => $SystemSerial,
-        BMANUFACTURER => $BiosManufacturer,
-        BVERSION      => $BiosVersion,
-    });
-
+    $inventory->setBios($bios);
 }
 
 sub _getCPUsFromProc {


================================================================
  Commit: c73bc5a565023734735cef9f171098b0d81bd07f
      https://github.com/fusinv/fusioninventory-agent/commit/c73bc5a565023734735cef9f171098b0d81bd07f
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-02 (Fri, 02 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/AIX/LVM.pm

  Log Message:
  -----------
  move additional parsing into another function


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/AIX/LVM.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/AIX/LVM.pm
index f8c6bc0..3bb8c7f 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/AIX/LVM.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/AIX/LVM.pm
@@ -76,19 +76,37 @@ sub _getLogicalVolume {
     }
     close $handle;
 
-    my $size;
-    foreach (`lslv $volume->{LV_NAME}`) {
-        if (/.*PP SIZE:\s+(\d+) .*/) {
+    my ($size, $uuid) = _getVolumeInfo(
+        name   => $volume->{LV_NAME},
+        logger => $logger
+    );
+    $volume->{SIZE} = int($volume->{SEG_COUNT} * $size);
+    $volume->{LV_UUID} = $uuid;
+
+    return $volume;
+}
+
+sub _getVolumeInfo {
+    my (%params) = @_;
+
+    my $handle = getFileHandle( 
+        command => "lslv $params{name}",
+        logger  => $params{logger}
+    );
+    return unless $handle;
+
+    my ($size, $uuid);
+    while (my $line = <$handle>) {
+        if ($line =~ /.*PP SIZE:\s+(\d+) .*/) {
             $size = $1;
         }
-        if (/LV IDENTIFIER:\s+(\S+)/) {
-            $volume->{LV_UUID} = $1;
+        if ($line =~ /LV IDENTIFIER:\s+(\S+)/) {
+            $uuid = $1;
         }
     }
+    close $handle;
 
-    $volume->{SIZE} = int($volume->{SEG_COUNT} * $size);
-
-    return $volume;
+    return ($size, $uuid);
 }
 
 sub _getPhysicalVolumes {


================================================================
  Commit: 178f31f17a5f1c4ea03717a0581f0ac12df79792
      https://github.com/fusinv/fusioninventory-agent/commit/178f31f17a5f1c4ea03717a0581f0ac12df79792
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-02 (Fri, 02 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/CPU.pm

  Log Message:
  -----------
  isolate parsing for testing purposes


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/CPU.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/CPU.pm
index ee3b03b..aaa93a4 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/CPU.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/CPU.pm
@@ -25,13 +25,7 @@ sub doInventory {
 
     # fallback on generic method
     if (!$count) {
-        foreach (`psrinfo -v`) {
-            if (/^\s+The\s(\w+)\sprocessor\soperates\sat\s(\d+)\sMHz,/) {
-                $cpu->{NAME}  = $1;
-                $cpu->{SPEED} = $2;
-                $count++;
-            }
-        }
+        ($count, $cpu->{NAME}, $cpu->{SPEED}) = _parsePsrinfo();
     }
 
     $cpu->{MANUFACTURER} = "SPARC";
@@ -172,6 +166,30 @@ sub _parseSpec {
 
 }
 
+sub _parsePsrinfo {
+    my (%params) = (
+        command => 'psrinfo -v',
+        @_
+    );
+
+    my $handle = getFileHandle(%params);
+    return unless $handle;
+
+    my $count = 0;
+    my ($name, $speed);
+    while (my $line = <$handle>) {
+        next unless $line =~ 
+            /^\s+The\s(\w+)\sprocessor\soperates\sat\s(\d+)\sMHz,/;
+
+        $name  = $1;
+        $speed = $2;
+        $count++;
+    }
+    close $handle;
+
+    return ($count, $name, $speed);
+}
+
 sub _getCPUFromPrtcl {
     my ($count, $cpu);
 


================================================================
  Commit: 51d89e2757a8b6dbdd665899aa54f18ebd681648
      https://github.com/fusinv/fusioninventory-agent/commit/51d89e2757a8b6dbdd665899aa54f18ebd681648
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-02 (Fri, 02 Mar 2012)

  Changed paths:
    A resources/generic/dmidecode/windows-xppro
    M t/tools/generic.t

  Log Message:
  -----------
  add new windows xp sample


diff --git a/resources/generic/dmidecode/windows-xppro b/resources/generic/dmidecode/windows-xppro
new file mode 100644
index 0000000..6b999c7
--- /dev/null
+++ b/resources/generic/dmidecode/windows-xppro
@@ -0,0 +1,586 @@
+# dmidecode 2.11
+SMBIOS 2.4 present.
+57 structures occupying 2822 bytes.
+Table at 0x000F6570.
+
+Handle 0xDA00, DMI type 218, 251 bytes
+OEM-specific Type
+	Header and Data:
+		DA FB 00 DA B2 00 0D 5F 1F 37 40 7D 00 00 00 00
+		00 40 00 02 00 01 00 41 00 02 00 00 00 65 00 03
+		00 00 00 66 00 03 00 01 00 F1 00 04 00 00 00 F2
+		00 04 00 01 00 F3 00 04 00 02 00 0F 00 05 00 00
+		00 11 00 05 00 01 00 05 00 05 00 02 00 12 00 05
+		00 03 00 06 00 05 00 04 00 07 00 06 00 00 00 0B
+		00 06 00 01 00 0C 00 06 00 02 00 0D 00 06 00 03
+		00 89 01 07 00 00 00 8A 01 07 00 01 00 42 00 08
+		00 01 00 43 00 08 00 00 00 55 00 09 00 00 00 6D
+		00 09 00 01 00 16 02 09 00 02 00 98 01 09 00 03
+		00 0A 01 0A 00 01 00 0B 01 0A 00 00 00 2D 00 0B
+		00 02 00 6E 00 0B 00 01 00 2E 00 0B 00 00 00 11
+		01 0C 00 00 00 10 01 0C 00 01 00 F0 00 0D 00 01
+		00 ED 00 0D 00 00 00 41 01 0E 00 01 00 40 01 0E
+		00 00 00 47 01 0F 00 01 00 46 01 0F 00 00 00 4A
+		01 10 00 00 00 FF FF 00 00 00 00
+
+Handle 0xDA01, DMI type 218, 251 bytes
+OEM-specific Type
+	Header and Data:
+		DA FB 01 DA B2 00 0D 5F 1F 37 40 4B 01 10 00 01
+		00 04 02 11 00 00 00 05 02 11 00 01 00 02 02 12
+		00 00 00 03 02 12 00 01 00 52 01 13 00 01 00 53
+		01 13 00 00 00 80 01 14 00 01 00 7F 01 14 00 00
+		00 7C 01 15 00 01 00 7B 01 15 00 00 00 E8 02 16
+		00 00 00 E9 02 16 00 01 00 7E 01 17 00 01 00 7D
+		01 17 00 00 00 92 01 18 00 00 00 91 01 18 00 01
+		00 94 01 19 00 00 00 93 01 19 00 01 00 86 01 1A
+		00 01 00 85 01 1A 00 00 00 82 01 1B 00 01 00 81
+		01 1B 00 00 00 84 01 1C 00 01 00 83 01 1C 00 00
+		00 9B 01 1D 00 00 00 9C 01 1D 00 01 00 9D 01 1D
+		00 02 00 9E 01 1D 00 03 00 8D 01 1E 00 00 00 8E
+		01 1E 00 01 00 85 02 1F 00 00 00 86 02 1F 00 01
+		00 EA 00 20 00 00 00 EB 00 20 00 01 00 EC 00 20
+		00 02 00 A1 00 21 00 00 00 A3 00 21 00 01 00 28
+		00 22 00 00 00 FF FF 00 00 00 00
+
+Handle 0xDA02, DMI type 218, 251 bytes
+OEM-specific Type
+	Header and Data:
+		DA FB 02 DA B2 00 0D 5F 1F 37 40 29 00 22 00 01
+		00 2A 00 22 00 02 00 2B 00 23 00 00 00 2C 00 24
+		00 00 00 0E 01 25 00 01 00 0F 01 25 00 00 00 9B
+		00 26 00 01 00 9C 00 26 00 00 00 4D 01 27 00 01
+		00 4C 01 27 00 00 00 87 01 28 00 00 00 88 01 28
+		00 01 00 35 01 29 00 03 00 37 01 29 00 00 00 38
+		01 29 00 01 00 39 01 29 00 02 00 D9 01 2A 00 01
+		00 D8 01 2A 00 00 00 DF 01 2B 00 01 00 DE 01 2B
+		00 00 00 45 02 2C 00 00 00 44 02 2C 00 01 00 49
+		02 2D 00 00 00 48 02 2D 00 01 00 45 01 45 01 01
+		00 44 01 44 01 00 00 76 01 76 01 01 00 75 01 75
+		01 01 00 9F 00 9F 00 00 00 A0 00 A0 00 01 00 E1
+		01 E1 01 00 00 E3 01 E3 01 01 00 E2 01 E2 01 02
+		00 29 02 29 02 01 00 28 02 28 02 02 00 2A 02 2A
+		02 03 00 30 02 30 02 01 00 2F 02 2F 02 00 00 35
+		02 35 02 01 00 FF FF 00 00 00 00
+
+Handle 0xDA03, DMI type 218, 77 bytes
+OEM-specific Type
+	Header and Data:
+		DA 4D 03 DA B2 00 0D 5F 1F 37 40 36 02 36 02 00
+		00 37 02 37 02 02 00 4A 02 4A 02 01 00 0C 80 0C
+		80 01 00 6C 02 6C 02 01 00 6D 02 6D 02 00 00 01
+		F0 01 F0 00 00 02 F0 02 F0 00 00 03 F0 03 F0 00
+		00 04 F0 04 F0 00 00 FF FF 00 00 00 00
+
+Handle 0x0000, DMI type 0, 24 bytes
+BIOS Information
+	Vendor: Dell Inc.
+	Version: A24
+	Release Date: 08/19/2010
+	Address: 0xF0000
+	Runtime Size: 64 kB
+	ROM Size: 1728 kB
+	Characteristics:
+		ISA is supported
+		PCI is supported
+		PC Card (PCMCIA) is supported
+		PNP is supported
+		BIOS is upgradeable
+		BIOS shadowing is allowed
+		Boot from CD is supported
+		Selectable boot is supported
+		3.5"/720 kB floppy services are supported (int 13h)
+		Print screen service is supported (int 5h)
+		8042 keyboard services are supported (int 9h)
+		Serial services are supported (int 14h)
+		Printer services are supported (int 17h)
+		CGA/mono video services are supported (int 10h)
+		ACPI is supported
+		USB legacy is supported
+		AGP is supported
+		Smart battery is supported
+		BIOS boot specification is supported
+		Function key-initiated network boot is supported
+		Targeted content distribution is supported
+	BIOS Revision: 2.4
+	Firmware Revision: 2.4
+
+Handle 0x0100, DMI type 1, 27 bytes
+System Information
+	Manufacturer: Dell Inc.
+	Product Name: Precision M4400                 
+	Version: Not Specified
+	Serial Number: HLG964J
+	UUID: 44454C4C-4C00-1047-8039-C8C04F36344A
+	Wake-up Type: Power Switch
+	SKU Number: Not Specified
+	Family:  
+
+Handle 0x0200, DMI type 2, 9 bytes
+Base Board Information
+	Manufacturer: Dell Inc.
+	Product Name: 0P019G
+	Version:    
+	Serial Number: .HLG964J.CN129618C52450.
+	Asset Tag:           
+
+Handle 0x0300, DMI type 3, 13 bytes
+Chassis Information
+	Manufacturer: Dell Inc.
+	Type: Portable
+	Lock: Not Present
+	Version: Not Specified
+	Serial Number: HLG964J
+	Asset Tag: Not Specified
+	Boot-up State: Safe
+	Power Supply State: Safe
+	Thermal State: Safe
+	Security Status: None
+
+Handle 0x0400, DMI type 4, 40 bytes
+Processor Information
+	Socket Designation: Microprocessor
+	Type: Central Processor
+	Family: Core 2 Duo
+	Manufacturer: Intel
+	ID: 76 06 01 00 FF FB EB BF
+	Signature: Type 0, Family 6, Model 23, Stepping 6
+	Flags:
+		FPU (Floating-point unit on-chip)
+		VME (Virtual mode extension)
+		DE (Debugging extension)
+		PSE (Page size extension)
+		TSC (Time stamp counter)
+		MSR (Model specific registers)
+		PAE (Physical address extension)
+		MCE (Machine check exception)
+		CX8 (CMPXCHG8 instruction supported)
+		APIC (On-chip APIC hardware supported)
+		SEP (Fast system call)
+		MTRR (Memory type range registers)
+		PGE (Page global enable)
+		MCA (Machine check architecture)
+		CMOV (Conditional move instruction supported)
+		PAT (Page attribute table)
+		PSE-36 (36-bit page size extension)
+		CLFSH (CLFLUSH instruction supported)
+		DS (Debug store)
+		ACPI (ACPI supported)
+		MMX (MMX technology supported)
+		FXSR (FXSAVE and FXSTOR instructions supported)
+		SSE (Streaming SIMD extensions)
+		SSE2 (Streaming SIMD extensions 2)
+		SS (Self-snoop)
+		HTT (Multi-threading)
+		TM (Thermal monitor supported)
+		PBE (Pending break enabled)
+	Version: Not Specified
+	Voltage: 3.3 V
+	External Clock: 266 MHz
+	Max Speed: 2534 MHz
+	Current Speed: 2534 MHz
+	Status: Populated, Enabled
+	Upgrade: None
+	L1 Cache Handle: 0x0700
+	L2 Cache Handle: 0x0701
+	L3 Cache Handle: Not Provided
+	Serial Number: Not Specified
+	Asset Tag: Not Specified
+	Part Number: Not Specified
+	Core Count: 2
+	Core Enabled: 2
+	Thread Count: 2
+	Characteristics:
+		64-bit capable
+
+Handle 0x0700, DMI type 7, 19 bytes
+Cache Information
+	Socket Designation: Not Specified
+	Configuration: Enabled, Not Socketed, Level 1
+	Operational Mode: Write Back
+	Location: Internal
+	Installed Size: 128 kB
+	Maximum Size: 128 kB
+	Supported SRAM Types:
+		Unknown
+	Installed SRAM Type: Unknown
+	Speed: Unknown
+	Error Correction Type: None
+	System Type: Data
+	Associativity: 4-way Set-associative
+
+Handle 0x0701, DMI type 7, 19 bytes
+Cache Information
+	Socket Designation: Not Specified
+	Configuration: Enabled, Not Socketed, Level 2
+	Operational Mode: Varies With Memory Address
+	Location: Internal
+	Installed Size: 6144 kB
+	Maximum Size: 6144 kB
+	Supported SRAM Types:
+		Pipeline Burst
+	Installed SRAM Type: Pipeline Burst
+	Speed: 15 ns
+	Error Correction Type: None
+	System Type: Unified
+	Associativity: Other
+
+Handle 0x0800, DMI type 8, 9 bytes
+Port Connector Information
+	Internal Reference Designator: PARALLEL
+	Internal Connector Type: None
+	External Reference Designator: Not Specified
+	External Connector Type: DB-25 female
+	Port Type: Parallel Port PS/2
+
+Handle 0x0801, DMI type 8, 9 bytes
+Port Connector Information
+	Internal Reference Designator: SERIAL1
+	Internal Connector Type: None
+	External Reference Designator: Not Specified
+	External Connector Type: DB-9 male
+	Port Type: Serial Port 16550A Compatible
+
+Handle 0x0804, DMI type 8, 9 bytes
+Port Connector Information
+	Internal Reference Designator: USB
+	Internal Connector Type: None
+	External Reference Designator: Not Specified
+	External Connector Type: Access Bus (USB)
+	Port Type: USB
+
+Handle 0x0806, DMI type 8, 9 bytes
+Port Connector Information
+	Internal Reference Designator: MONITOR
+	Internal Connector Type: None
+	External Reference Designator: Not Specified
+	External Connector Type: DB-15 female
+	Port Type: Video Port
+
+Handle 0x080B, DMI type 8, 9 bytes
+Port Connector Information
+	Internal Reference Designator: FireWire
+	Internal Connector Type: None
+	External Reference Designator: Not Specified
+	External Connector Type: IEEE 1394
+	Port Type: Firewire (IEEE P1394)
+
+Handle 0x080C, DMI type 8, 9 bytes
+Port Connector Information
+	Internal Reference Designator: Modem
+	Internal Connector Type: None
+	External Reference Designator: Not Specified
+	External Connector Type: RJ-11
+	Port Type: Modem Port
+
+Handle 0x080D, DMI type 8, 9 bytes
+Port Connector Information
+	Internal Reference Designator: Ethernet
+	Internal Connector Type: None
+	External Reference Designator: Not Specified
+	External Connector Type: RJ-45
+	Port Type: Network Port
+
+Handle 0x0900, DMI type 9, 13 bytes
+System Slot Information
+	Designation: PCMCIA 0
+	Type: 32-bit PC Card (PCMCIA)
+	Current Usage: Available
+	Length: Other
+	ID: Adapter 0, Socket 0
+	Characteristics:
+		5.0 V is provided
+		3.3 V is provided
+		PC Card-16 is supported
+		Cardbus is supported
+		Zoom Video is supported
+		Modem ring resume is supported
+
+Handle 0x0A00, DMI type 10, 6 bytes
+On Board Device Information
+	Type: Video
+	Status: Enabled
+	Description: NVIDIA Quadro FX 1700M        
+
+Handle 0x0A01, DMI type 10, 6 bytes
+On Board Device Information
+	Type: Sound
+	Status: Enabled
+	Description: IDT 92HD71
+
+Handle 0x0B00, DMI type 11, 5 bytes
+OEM Strings
+	String 1: Dell System
+	String 2: 5[0003]
+	String 3: 13[PP04X]
+
+Handle 0x0D00, DMI type 13, 22 bytes
+BIOS Language Information
+	Language Description Format: Long
+	Installable Languages: 1
+		en|US|iso8859-1
+	Currently Installed Language: en|US|iso8859-1
+
+Handle 0x1000, DMI type 16, 15 bytes
+Physical Memory Array
+	Location: System Board Or Motherboard
+	Use: System Memory
+	Error Correction Type: None
+	Maximum Capacity: 8 GB
+	Error Information Handle: Not Provided
+	Number Of Devices: 2
+
+Handle 0x1100, DMI type 17, 27 bytes
+Memory Device
+	Array Handle: 0x1000
+	Error Information Handle: Not Provided
+	Total Width: 64 bits
+	Data Width: 64 bits
+	Size: 2048 MB
+	Form Factor: DIMM
+	Set: None
+	Locator: DIMM_A
+	Bank Locator: Not Specified
+	Type: DDR2
+	Type Detail: Synchronous
+	Speed: 800 MHz
+	Manufacturer: 7F7FFE0000000000
+	Serial Number: 14FA6621
+	Asset Tag: 200840
+	Part Number: EBE21UE8ACUA-8G-E 
+
+Handle 0x1101, DMI type 17, 27 bytes
+Memory Device
+	Array Handle: 0x1000
+	Error Information Handle: Not Provided
+	Total Width: 64 bits
+	Data Width: 64 bits
+	Size: 2048 MB
+	Form Factor: DIMM
+	Set: None
+	Locator: DIMM_B
+	Bank Locator: Not Specified
+	Type: DDR2
+	Type Detail: Synchronous
+	Speed: 800 MHz
+	Manufacturer: 7F7FFE0000000000
+	Serial Number: AEF96621
+	Asset Tag: 200840
+	Part Number: EBE21UE8ACUA-8G-E 
+
+Handle 0x1301, DMI type 19, 15 bytes
+Memory Array Mapped Address
+	Starting Address: 0x00000000000
+	Ending Address: 0x000FFFFFFFF
+	Range Size: 4 GB
+	Physical Array Handle: 0x1000
+	Partition Width: 1
+
+Handle 0x1401, DMI type 20, 19 bytes
+Memory Device Mapped Address
+	Starting Address: 0x00000000000
+	Ending Address: 0x000FFFFFFFF
+	Range Size: 4 GB
+	Physical Device Handle: 0x1100
+	Memory Array Mapped Address Handle: 0x1301
+	Partition Row Position: 1
+	Interleave Position: 1
+	Interleaved Data Depth: 8
+
+Handle 0x1411, DMI type 126, 19 bytes
+Inactive
+
+Handle 0x1402, DMI type 20, 19 bytes
+Memory Device Mapped Address
+	Starting Address: 0x00000000000
+	Ending Address: 0x000FFFFFFFF
+	Range Size: 4 GB
+	Physical Device Handle: 0x1101
+	Memory Array Mapped Address Handle: 0x1301
+	Partition Row Position: 1
+	Interleave Position: 2
+	Interleaved Data Depth: 8
+
+Handle 0x1412, DMI type 126, 19 bytes
+Inactive
+
+Handle 0x1500, DMI type 21, 7 bytes
+Built-in Pointing Device
+	Type: Touch Pad
+	Interface: Bus Mouse
+	Buttons: 2
+
+Handle 0x1600, DMI type 22, 26 bytes
+Portable Battery
+	Location: Sys. Battery Bay
+	Manufacturer: SMP             
+	Name: DELL HJ59008    
+	Design Capacity: 84000 mWh
+	Design Voltage: 11100 mV
+	SBDS Version: 1.0
+	Maximum Error: 3%
+	SBDS Serial Number: 02C7
+	SBDS Manufacture Date: 2010-08-31
+	SBDS Chemistry: LION            
+	OEM-specific Information: 0x00000001
+
+Handle 0x1601, DMI type 126, 26 bytes
+Inactive
+
+Handle 0x1B00, DMI type 27, 12 bytes
+Cooling Device
+	Type: Fan
+	Status: OK
+	OEM-specific Information: 0x0000DD00
+
+Handle 0x1C00, DMI type 28, 20 bytes
+Temperature Probe
+	Description: CPU Internal Temperature
+	Location: Processor
+	Status: OK
+	Maximum Value: 127.0 deg C
+	Minimum Value: 0.0 deg C
+	Resolution: 1.000 deg C
+	Tolerance: 0.5 deg C
+	Accuracy: Unknown
+	OEM-specific Information: 0x0000DC00
+
+Handle 0x2000, DMI type 32, 11 bytes
+System Boot Information
+	Status: No errors detected
+
+Handle 0xB000, DMI type 176, 5 bytes
+OEM-specific Type
+	Header and Data:
+		B0 05 00 B0 3A
+
+Handle 0xB100, DMI type 177, 12 bytes
+OEM-specific Type
+	Header and Data:
+		B1 0C 00 B1 82 00 00 00 00 00 00 00
+
+Handle 0xB200, DMI type 178, 96 bytes
+OEM-specific Type
+	Header and Data:
+		B2 60 00 B2 07 01 0C 00 08 01 0A 00 09 01 0B 00
+		0A 01 12 00 3B 00 20 00 3C 00 1F 00 3D 00 0E 00
+		41 00 12 00 42 00 18 00 00 02 FF FF 4B 00 15 00
+		48 00 14 00 50 00 13 00 10 00 FF 00 11 00 FF 00
+		12 00 FF 00 13 00 FF 00 14 00 FF 00 1E 00 FF 00
+		1F 00 FF 00 20 00 FF 00 21 00 FF 00 22 00 FF 00
+
+Handle 0xD000, DMI type 208, 10 bytes
+OEM-specific Type
+	Header and Data:
+		D0 0A 00 D0 01 04 FE 00 50 02
+
+Handle 0xD100, DMI type 209, 12 bytes
+OEM-specific Type
+	Header and Data:
+		D1 0C 00 D1 00 00 00 03 04 07 80 05
+
+Handle 0xD200, DMI type 210, 12 bytes
+OEM-specific Type
+	Header and Data:
+		D2 0C 00 D2 00 00 06 03 06 80 04 05
+
+Handle 0xD800, DMI type 216, 9 bytes
+OEM-specific Type
+	Header and Data:
+		D8 09 00 D8 01 03 01 F0 03
+	Strings:
+		NVidia Corp.         
+		 
+		62.94.8F.00.04        
+		  
+
+Handle 0xD900, DMI type 217, 8 bytes
+OEM-specific Type
+	Header and Data:
+		D9 08 00 D9 01 02 01 03
+	Strings:
+		US-101
+		Proprietary
+
+Handle 0xDB00, DMI type 219, 9 bytes
+OEM-specific Type
+	Header and Data:
+		DB 09 00 DB 03 01 02 03 FF
+	Strings:
+		System Device Bay
+		Battery, CD-ROM, CD-RW, DVD, DVD+RW, DVD+/-RW, Hard Disk
+		DVD+/-RW  
+
+Handle 0xDB01, DMI type 219, 9 bytes
+OEM-specific Type
+	Header and Data:
+		DB 09 01 DB 03 01 02 03 FF
+	Strings:
+		System eSATA Bay
+		CD-ROM, CD-RW, DVD, DVD+RW, DVD+/-RW, Hard Disk
+		EMPTY     
+
+Handle 0xDB02, DMI type 219, 9 bytes
+OEM-specific Type
+	Header and Data:
+		DB 09 02 DB 03 01 02 03 FF
+	Strings:
+		System eSATA Dock Bay
+		CD-ROM, CD-RW, DVD, DVD+RW, DVD+/-RW, Hard Disk
+		EMPTY     
+
+Handle 0x8100, DMI type 129, 8 bytes
+OEM-specific Type
+	Header and Data:
+		81 08 00 81 01 01 02 01
+	Strings:
+		Intel_ASF
+		Intel_ASF_001
+
+Handle 0x8200, DMI type 130, 20 bytes
+OEM-specific Type
+	Header and Data:
+		82 14 00 82 24 41 4D 54 01 00 00 00 01 A5 0B 02
+		00 00 00 00
+
+Handle 0x8300, DMI type 131, 64 bytes
+OEM-specific Type
+	Header and Data:
+		83 40 00 83 35 00 00 00 00 00 40 2A 0F 00 00 00
+		F8 00 17 29 00 00 00 00 00 00 00 00 00 00 00 00
+		00 00 00 00 03 00 01 02 C8 00 F5 10 00 00 00 0C
+		00 00 00 00 28 00 00 00 76 50 72 6F 00 00 00 00
+
+Handle 0xDC00, DMI type 220, 22 bytes
+OEM-specific Type
+	Header and Data:
+		DC 16 00 DC 01 F0 00 00 02 F0 00 00 00 00 03 F0
+		04 F0 00 00 00 00
+
+Handle 0xDD00, DMI type 221, 19 bytes
+OEM-specific Type
+	Header and Data:
+		DD 13 00 DD 00 00 00 00 00 00 00 00 00 00 00 00
+		00 00 00
+
+Handle 0xD400, DMI type 212, 47 bytes
+OEM-specific Type
+	Header and Data:
+		D4 2F 00 D4 74 00 75 00 00 10 2D 2E 5C 00 78 BF
+		40 5D 00 78 BF 00 2D 01 1D EF 10 2E 01 1D EF 00
+		08 00 1D DF 00 03 00 1D DF 00 FF FF 00 00 00
+
+Handle 0xD401, DMI type 212, 17 bytes
+OEM-specific Type
+	Header and Data:
+		D4 11 01 D4 74 00 75 00 03 40 49 4A FF FF 00 00
+		00
+
+Handle 0xDE00, DMI type 222, 16 bytes
+OEM-specific Type
+	Header and Data:
+		DE 10 00 DE 01 02 FF FF 00 00 00 00 00 00 00 01
+
+Handle 0x7F00, DMI type 127, 4 bytes
+End Of Table
+
diff --git a/t/tools/generic.t b/t/tools/generic.t
index 55ac597..6961deb 100755
--- a/t/tools/generic.t
+++ b/t/tools/generic.t
@@ -4513,6 +4513,298 @@ my %dmidecode_tests = (
                 'Ending Address' => '0x000400003FF'
             }
         ]
+    },
+    'windows-xppro' => {
+        '32' => [
+            {
+                'Status' => 'No errors detected'
+            }
+        ],
+        '11' => [
+            {
+                'String 1' => 'Dell System',
+                'String 3' => '13[PP04X]',
+                'String 2' => '5[0003]'
+            }
+        ],
+        '21' => [
+            {
+                'Type' => 'Touch Pad',
+                'Buttons' => '2',
+                'Interface' => 'Bus Mouse'
+            }
+        ],
+        '7' => [
+            {
+                'Error Correction Type' => 'None',
+                'Installed Size' => '128 kB',
+                'Operational Mode' => 'Write Back',
+                'Configuration' => 'Enabled, Not Socketed, Level 1',
+                'Installed SRAM Type' => 'Unknown',
+                'System Type' => 'Data',
+                'Speed' => 'Unknown',
+                'Associativity' => '4-way Set-associative',
+                'Location' => 'Internal',
+                'Maximum Size' => '128 kB'
+            },
+            {
+                'Error Correction Type' => 'None',
+                'Installed Size' => '6144 kB',
+                'Operational Mode' => 'Varies With Memory Address',
+                'Configuration' => 'Enabled, Not Socketed, Level 2',
+                'Installed SRAM Type' => 'Pipeline Burst',
+                'System Type' => 'Unified',
+                'Speed' => '15 ns',
+                'Associativity' => 'Other',
+                'Location' => 'Internal',
+                'Maximum Size' => '6144 kB'
+            }
+        ],
+        '17' => [
+            {
+                'Part Number' => 'EBE21UE8ACUA-8G-E',
+                'Serial Number' => '14FA6621',
+                'Data Width' => '64 bits',
+                'Array Handle' => '0x1000',
+                'Type Detail' => 'Synchronous',
+                'Set' => 'None',
+                'Asset Tag' => '200840',
+                'Total Width' => '64 bits',
+                'Type' => 'DDR2',
+                'Speed' => '800 MHz',
+                'Size' => '2048 MB',
+                'Error Information Handle' => 'Not Provided',
+                'Locator' => 'DIMM_A',
+                'Manufacturer' => '7F7FFE0000000000',
+                'Form Factor' => 'DIMM'
+            },
+            {
+                'Part Number' => 'EBE21UE8ACUA-8G-E',
+                'Serial Number' => 'AEF96621',
+                'Data Width' => '64 bits',
+                'Array Handle' => '0x1000',
+                'Type Detail' => 'Synchronous',
+                'Set' => 'None',
+                'Asset Tag' => '200840',
+                'Total Width' => '64 bits',
+                'Type' => 'DDR2',
+                'Speed' => '800 MHz',
+                'Size' => '2048 MB',
+                'Error Information Handle' => 'Not Provided',
+                'Locator' => 'DIMM_B',
+                'Manufacturer' => '7F7FFE0000000000',
+                'Form Factor' => 'DIMM'
+            }
+        ],
+        '2' => [
+            {
+                'Product Name' => '0P019G',
+                'Serial Number' => '.HLG964J.CN129618C52450.',
+                'Manufacturer' => 'Dell Inc.'
+            }
+        ],
+        '22' => [
+            {
+                'Design Capacity' => '84000 mWh',
+                'Maximum Error' => '3%',
+                'OEM-specific Information' => '0x00000001',
+                'Design Voltage' => '11100 mV',
+                'SBDS Manufacture Date' => '2010-08-31',
+                'SBDS Chemistry' => 'LION',
+                'Location' => 'Sys. Battery Bay',
+                'Manufacturer' => 'SMP',
+                'Name' => 'DELL HJ59008',
+                'SBDS Version' => '1.0',
+                'SBDS Serial Number' => '02C7'
+            }
+        ],
+        '1' => [
+            {
+                'Wake-up Type' => 'Power Switch',
+                'Product Name' => 'Precision M4400',
+                'Serial Number' => 'HLG964J',
+                'Manufacturer' => 'Dell Inc.',
+                'UUID' => '44454C4C-4C00-1047-8039-C8C04F36344A'
+            }
+        ],
+        '0' => [
+            {
+                'BIOS Revision' => '2.4',
+                'Address' => '0xF0000',
+                'Vendor' => 'Dell Inc.',
+                'Version' => 'A24',
+                'Runtime Size' => '64 kB',
+                'Firmware Revision' => '2.4',
+                'Release Date' => '08/19/2010',
+                'ROM Size' => '1728 kB'
+            }
+        ],
+        '16' => [
+            {
+                'Number Of Devices' => '2',
+                'Error Correction Type' => 'None',
+                'Error Information Handle' => 'Not Provided',
+                'Location' => 'System Board Or Motherboard',
+                'Maximum Capacity' => '8 GB',
+                'Use' => 'System Memory'
+            }
+        ],
+        '13' => [
+            {
+                'Language Description Format' => 'Long',
+                'Installable Languages' => '1',
+                'Currently Installed Language' => 'en|US|iso8859-1'
+            }
+        ],
+        '27' => [
+            {
+                'Type' => 'Fan',
+                'Status' => 'OK',
+                'OEM-specific Information' => '0x0000DD00'
+            }
+        ],
+        '28' => [
+            {
+                'Status' => 'OK',
+                'Minimum Value' => '0.0 deg C',
+                'OEM-specific Information' => '0x0000DC00',
+                'Accuracy' => 'Unknown',
+                'Maximum Value' => '127.0 deg C',
+                'Resolution' => '1.000 deg C',
+                'Location' => 'Processor',
+                'Tolerance' => '0.5 deg C',
+                'Description' => 'CPU Internal Temperature'
+            }
+        ],
+        '3' => [
+            {
+                'Type' => 'Portable',
+                'Power Supply State' => 'Safe',
+                'Security Status' => 'None',
+                'Serial Number' => 'HLG964J',
+                'Thermal State' => 'Safe',
+                'Boot-up State' => 'Safe',
+                'Manufacturer' => 'Dell Inc.'
+            }
+        ],
+        '9' => [
+            {
+                'ID' => 'Adapter 0, Socket 0',
+                'Length' => 'Other',
+                'Designation' => 'PCMCIA 0',
+                'Type' => '32-bit PC Card (PCMCIA)',
+                'Current Usage' => 'Available'
+            }
+        ],
+        '20' => [
+            {
+                'Range Size' => '4 GB',
+                'Partition Row Position' => '1',
+                'Starting Address' => '0x00000000000',
+                'Memory Array Mapped Address Handle' => '0x1301',
+                'Physical Device Handle' => '0x1100',
+                'Interleaved Data Depth' => '8',
+                'Interleave Position' => '1',
+                'Ending Address' => '0x000FFFFFFFF'
+            },
+            {
+                'Range Size' => '4 GB',
+                'Partition Row Position' => '1',
+                'Starting Address' => '0x00000000000',
+                'Memory Array Mapped Address Handle' => '0x1301',
+                'Physical Device Handle' => '0x1101',
+                'Interleaved Data Depth' => '8',
+                'Interleave Position' => '2',
+                'Ending Address' => '0x000FFFFFFFF'
+            }
+        ],
+        '8' => [
+            {
+                'Port Type' => 'Parallel Port PS/2',
+                'External Connector Type' => 'DB-25 female',
+                'Internal Reference Designator' => 'PARALLEL',
+                'Internal Connector Type' => 'None'
+            },
+            {
+                'Port Type' => 'Serial Port 16550A Compatible',
+                'External Connector Type' => 'DB-9 male',
+                'Internal Reference Designator' => 'SERIAL1',
+                'Internal Connector Type' => 'None'
+            },
+            {
+                'Port Type' => 'USB',
+                'External Connector Type' => 'Access Bus (USB)',
+                'Internal Reference Designator' => 'USB',
+                'Internal Connector Type' => 'None'
+            },
+            {
+                'Port Type' => 'Video Port',
+                'External Connector Type' => 'DB-15 female',
+                'Internal Reference Designator' => 'MONITOR',
+                'Internal Connector Type' => 'None'
+            },
+            {
+                'Port Type' => 'Firewire (IEEE P1394)',
+                'External Connector Type' => 'IEEE 1394',
+                'Internal Reference Designator' => 'FireWire',
+                'Internal Connector Type' => 'None'
+            },
+            {
+                'Port Type' => 'Modem Port',
+                'External Connector Type' => 'RJ-11',
+                'Internal Reference Designator' => 'Modem',
+                'Internal Connector Type' => 'None'
+            },
+            {
+                'Port Type' => 'Network Port',
+                'External Connector Type' => 'RJ-45',
+                'Internal Reference Designator' => 'Ethernet',
+                'Internal Connector Type' => 'None'
+            }
+        ],
+        '4' => [
+            {
+                'ID' => '76 06 01 00 FF FB EB BF',
+                'Socket Designation' => 'Microprocessor',
+                'Status' => 'Populated, Enabled',
+                'Max Speed' => '2534 MHz',
+                'Family' => 'Core 2 Duo',
+                'Thread Count' => '2',
+                'Current Speed' => '2534 MHz',
+                'L2 Cache Handle' => '0x0701',
+                'Type' => 'Central Processor',
+                'Signature' => 'Type 0, Family 6, Model 23, Stepping 6',
+                'L1 Cache Handle' => '0x0700',
+                'Manufacturer' => 'Intel',
+                'Core Enabled' => '2',
+                'External Clock' => '266 MHz',
+                'Upgrade' => 'None',
+                'Core Count' => '2',
+                'Voltage' => '3.3 V',
+                'L3 Cache Handle' => 'Not Provided'
+            }
+        ],
+        '10' => [
+            {
+                'Type' => 'Video',
+                'Status' => 'Enabled',
+                'Description' => 'NVIDIA Quadro FX 1700M'
+            },
+            {
+                'Type' => 'Sound',
+                'Status' => 'Enabled',
+                'Description' => 'IDT 92HD71'
+            }
+        ],
+        '19' => [
+            {
+                'Range Size' => '4 GB',
+                'Partition Width' => '1',
+                'Starting Address' => '0x00000000000',
+                'Physical Array Handle' => '0x1000',
+                'Ending Address' => '0x000FFFFFFFF'
+            }
+        ]
     }
 );
 


================================================================
  Commit: dbbda17c554648c3079702dda169471cfeda0984
      https://github.com/fusinv/fusioninventory-agent/commit/dbbda17c554648c3079702dda169471cfeda0984
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-02 (Fri, 02 Mar 2012)

  Changed paths:
    R resources/solaris/psrinfo/sample-1
    M t/inventory/solaris/cpu.t

  Log Message:
  -----------
  test psrinfo parsing


diff --git a/resources/solaris/psrinfo/sample-1 b/resources/solaris/psrinfo/sample-1
deleted file mode 100644
index a3394c3..0000000
--- a/resources/solaris/psrinfo/sample-1
+++ /dev/null
@@ -1,32 +0,0 @@
-Status of virtual processor 0 as of: 08/10/2011 11:48:03
-  on-line since 08/02/2011 11:06:56.
-  The i386 processor operates at 2133 MHz,
-        and has an i387 compatible floating point processor.
-Status of virtual processor 1 as of: 08/10/2011 11:48:03
-  on-line since 08/02/2011 11:07:02.
-  The i386 processor operates at 2133 MHz,
-        and has an i387 compatible floating point processor.
-Status of virtual processor 2 as of: 08/10/2011 11:48:03
-  on-line since 08/02/2011 11:07:02.
-  The i386 processor operates at 2133 MHz,
-        and has an i387 compatible floating point processor.
-Status of virtual processor 3 as of: 08/10/2011 11:48:03
-  on-line since 08/02/2011 11:07:02.
-  The i386 processor operates at 2133 MHz,
-        and has an i387 compatible floating point processor.
-Status of virtual processor 4 as of: 08/10/2011 11:48:03
-  on-line since 08/02/2011 11:07:02.
-  The i386 processor operates at 2133 MHz,
-        and has an i387 compatible floating point processor.
-Status of virtual processor 5 as of: 08/10/2011 11:48:03
-  on-line since 08/02/2011 11:07:02.
-  The i386 processor operates at 2133 MHz,
-        and has an i387 compatible floating point processor.
-Status of virtual processor 6 as of: 08/10/2011 11:48:03
-  on-line since 08/02/2011 11:07:03.
-  The i386 processor operates at 2133 MHz,
-        and has an i387 compatible floating point processor.
-Status of virtual processor 7 as of: 08/10/2011 11:48:03
-  on-line since 08/02/2011 11:07:03.
-  The i386 processor operates at 2133 MHz,
-        and has an i387 compatible floating point processor.
diff --git a/t/inventory/solaris/cpu.t b/t/inventory/solaris/cpu.t
index 44f3e3c..2dab52a 100755
--- a/t/inventory/solaris/cpu.t
+++ b/t/inventory/solaris/cpu.t
@@ -37,6 +37,10 @@ my %memconf_tests = (
     ]
 );
 
+my %psrinfo_tests = (
+    sample1 => [ 8, 'i386', 2133 ]
+);
+
 my %spec_tests = (
     'Sun Microsystems, Inc. Sun-Fire-T200 (Sun Fire T2000) (8-core quad-thread UltraSPARC-T1 1000MHz)' => [
         1,
@@ -140,6 +144,7 @@ my %spec_tests = (
 
 plan tests => 
     (scalar keys %memconf_tests) +
+    (scalar keys %psrinfo_tests) +
     (scalar keys %spec_tests)    ;
 
 foreach my $test (keys %memconf_tests) {
@@ -148,6 +153,12 @@ foreach my $test (keys %memconf_tests) {
     is_deeply(\@results, $memconf_tests{$test}, "memconf parsing: $test" );
 }
 
+foreach my $test (keys %psrinfo_tests) {
+    my $file    = "resources/solaris/psrinfo/$test";
+    my @results = FusionInventory::Agent::Task::Inventory::Input::Solaris::CPU::_parsePsrinfo(file => $file);
+    is_deeply(\@results, $psrinfo_tests{$test}, "psrinfo parsing: $test" );
+}
+
 foreach my $test (keys %spec_tests) {
     my @results = FusionInventory::Agent::Task::Inventory::Input::Solaris::CPU::_parseSpec($test);
     is_deeply(\@results, $spec_tests{$test}, "spec parsing: $test" );


================================================================
  Commit: 6ad78f6f27154f5bceb9ffcc5ca61c52fab4f59c
      https://github.com/fusinv/fusioninventory-agent/commit/6ad78f6f27154f5bceb9ffcc5ca61c52fab4f59c
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-02 (Fri, 02 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/CPU.pm

  Log Message:
  -----------
  more compact version


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/CPU.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/CPU.pm
index aaa93a4..e32d6be 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/CPU.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/CPU.pm
@@ -62,22 +62,13 @@ sub _getCPUFromMemconf {
 sub _parseCoreString {
     my ($v) = @_;
 
-    if ($v =~ /Dual/i) {
-        return 2;
-    } elsif ($v =~ /Quad/i) {
-        return 4;
-    } elsif ($v =~ /(\d+)-(core|thread)/) {
-        return $1;
-    }elsif ($v =~ /^dual/) {
-        return 2;
-    } elsif ($v =~ /^quad/) {
-        return 4;
-    }
-
-    return $v;
+    return
+        $v =~ /dual/i               ? 2  :
+        $v =~ /quad/i               ? 4  :
+        $v =~ /(\d+)-(core|thread)/ ? $1 :
+        $v;
 }
 
-
 sub _parseSpec {
     my ($spec) = @_;
 


================================================================
  Commit: 3652d8658479d2ea8102737a776eb43c88c5e7e0
      https://github.com/fusinv/fusioninventory-agent/commit/3652d8658479d2ea8102737a776eb43c88c5e7e0
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-02 (Fri, 02 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/CPU.pm

  Log Message:
  -----------
  fix prototype and use getFileHandle


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/CPU.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/CPU.pm
index e32d6be..8847a47 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/CPU.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/CPU.pm
@@ -182,11 +182,18 @@ sub _parsePsrinfo {
 }
 
 sub _getCPUFromPrtcl {
-    my ($count, $cpu);
+    my (%params) = (
+        command => "prctl -n zone.cpu-shares $$",
+        @_
+    );
+
+    my $handle = getFileHandle(%params);
+    return unless $handle;
 
-    foreach (`prctl -n zone.cpu-shares $$`) {
-        $cpu->{NAME} = $1 if /^zone.(\S+)$/;
-        $cpu->{NAME} .= " " . $1 if /^\s*privileged+\s*(\d+)/;
+    my ($count, $cpu);
+    while (my $line = <$handle>) {
+        $cpu->{NAME} = $1 if $line =~ /^zone.(\S+)$/;
+        $cpu->{NAME} .= " " . $1 if $line =~ /^\s*privileged+\s*(\d+)/;
         #$count = 1 if /^\s*privileged+\s*(\d+)/;
         foreach (`memconf 2>&1`) {
             if(/\s+\((\d+).*\s+(\d+)MHz/) {
@@ -195,6 +202,7 @@ sub _getCPUFromPrtcl {
             }
         }
     }
+    close $handle;
 
     return ($count, $cpu);
 }


================================================================
  Commit: 4d23261b484cb392b01ba1d65524124e75010bec
      https://github.com/fusinv/fusioninventory-agent/commit/4d23261b484cb392b01ba1d65524124e75010bec
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-02 (Fri, 02 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/CPU.pm
    M t/inventory/solaris/cpu.t

  Log Message:
  -----------
  use consistent interface and function name


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/CPU.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/CPU.pm
index 8847a47..10bff38 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/CPU.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/CPU.pm
@@ -24,9 +24,7 @@ sub doInventory {
             _getCPUFromMemconf(logger => $logger);
 
     # fallback on generic method
-    if (!$count) {
-        ($count, $cpu->{NAME}, $cpu->{SPEED}) = _parsePsrinfo();
-    }
+    ($count, $cpu) = _getCPUFromPrsinfo(logger => $logger) if !$count;
 
     $cpu->{MANUFACTURER} = "SPARC";
 
@@ -157,7 +155,7 @@ sub _parseSpec {
 
 }
 
-sub _parsePsrinfo {
+sub _getCPUFromPsrinfo {
     my (%params) = (
         command => 'psrinfo -v',
         @_
@@ -167,18 +165,18 @@ sub _parsePsrinfo {
     return unless $handle;
 
     my $count = 0;
-    my ($name, $speed);
+    my $cpu;
     while (my $line = <$handle>) {
         next unless $line =~ 
             /^\s+The\s(\w+)\sprocessor\soperates\sat\s(\d+)\sMHz,/;
 
-        $name  = $1;
-        $speed = $2;
+        $cpu->{NAME}  = $1;
+        $cpu->{SPEED} = $2;
         $count++;
     }
     close $handle;
 
-    return ($count, $name, $speed);
+    return ($count, $cpu);
 }
 
 sub _getCPUFromPrtcl {
diff --git a/t/inventory/solaris/cpu.t b/t/inventory/solaris/cpu.t
index 2dab52a..c71b4ea 100755
--- a/t/inventory/solaris/cpu.t
+++ b/t/inventory/solaris/cpu.t
@@ -38,7 +38,13 @@ my %memconf_tests = (
 );
 
 my %psrinfo_tests = (
-    sample1 => [ 8, 'i386', 2133 ]
+    sample1 => [
+        8,
+        {
+            NAME  => 'i386',
+            SPEED => 2133
+        }
+    ]
 );
 
 my %spec_tests = (
@@ -155,7 +161,7 @@ foreach my $test (keys %memconf_tests) {
 
 foreach my $test (keys %psrinfo_tests) {
     my $file    = "resources/solaris/psrinfo/$test";
-    my @results = FusionInventory::Agent::Task::Inventory::Input::Solaris::CPU::_parsePsrinfo(file => $file);
+    my @results = FusionInventory::Agent::Task::Inventory::Input::Solaris::CPU::_getCPUFromPsrinfo(file => $file);
     is_deeply(\@results, $psrinfo_tests{$test}, "psrinfo parsing: $test" );
 }
 


================================================================
  Commit: a1872280832b20cff6ecc502dd8365af706c06d3
      https://github.com/fusinv/fusioninventory-agent/commit/a1872280832b20cff6ecc502dd8365af706c06d3
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-02 (Fri, 02 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/CPU.pm

  Log Message:
  -----------
  use explicit name for magic variables


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/CPU.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/CPU.pm
index 10bff38..6fc0d9f 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/CPU.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/CPU.pm
@@ -3,6 +3,8 @@ package FusionInventory::Agent::Task::Inventory::Input::Solaris::CPU;
 use strict;
 use warnings;
 
+use English qw(-no_match_vars);
+
 use FusionInventory::Agent::Tools;
 use FusionInventory::Agent::Tools::Solaris;
 
@@ -181,7 +183,7 @@ sub _getCPUFromPsrinfo {
 
 sub _getCPUFromPrtcl {
     my (%params) = (
-        command => "prctl -n zone.cpu-shares $$",
+        command => "prctl -n zone.cpu-shares $PID",
         @_
     );
 


================================================================
  Commit: 7a77d621bbdc533c6f2c86eb12cae7abb1aac188
      https://github.com/fusinv/fusioninventory-agent/commit/7a77d621bbdc533c6f2c86eb12cae7abb1aac188
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-02 (Fri, 02 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm

  Log Message:
  -----------
  fix compilation


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm
index e65d362..d845e9d 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm
@@ -27,6 +27,7 @@ sub doInventory {
     my (%params) = @_;
 
     my $inventory = $params{inventory};
+    my $logger =    $params{logger};
 
     if (is64bit()) {
 


================================================================
  Commit: 3a2bc1e884bd7e8212650c36fd5ed781231a040d
      https://github.com/fusinv/fusioninventory-agent/commit/3a2bc1e884bd7e8212650c36fd5ed781231a040d
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-02 (Fri, 02 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/Alpha.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/MIPS.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/SPARC.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/i386.pm

  Log Message:
  -----------
  use less intermediate variables


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/Alpha.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/Alpha.pm
index f83dc0b..f89f671 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/Alpha.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/Alpha.pm
@@ -25,7 +25,7 @@ sub doInventory {
     # example on *BSD: AlphaStation 255 4/232
     $bios->{SMODEL} = getFirstLine(command => 'sysctl -n hw.model');
 
-    my $processorn = getFirstLine(command => 'sysctl -n hw.ncpu');
+    my $count = getFirstLine(command => 'sysctl -n hw.ncpu');
 
     # dmesg infos
 
@@ -39,21 +39,18 @@ sub doInventory {
     # AlphaStation 255 4/232, 232MHz
     # CPU: EV45 (21064A) major=6 minor=2
 
-    my ($processort, $processors);
+    my $cpu;
     foreach my $line (getAllLines(command => 'dmesg')) {
-        if ($line =~ /$bios->{SMODEL},\s*(\S+)\s*MHz/) { $processors = $1; }
-        if ($line =~ /^cpu[^:]*:\s*(.*)$/i)         { $processort = $1; }
+        if ($line =~ /$bios->{SMODEL},\s*(\S+)\s*MHz/) { $cpu->{SPEED} = $1; }
+        if ($line =~ /^cpu[^:]*:\s*(.*)$/i)            { $cpu->{NAME} = $1;  }
     }
 
     $inventory->setBios($bios);
 
-    for my $i (1 .. $processorn) {
+    while ($count--) {
         $inventory->addEntry(
             section => 'CPUS',
-            entry   => {
-                NAME  => $processort,
-                SPEED => $processors,
-            }
+            entry   => $cpu
         );
     }
 
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/MIPS.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/MIPS.pm
index 4109b5e..00a7464 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/MIPS.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/MIPS.pm
@@ -26,7 +26,7 @@ sub doInventory {
     # example on OpenBSD: SGI-O2 (IP32)
     $bios->{SMODEL} = getFirstLine(command => 'sysctl -n hw.model');
 
-    my $processorn = getFirstLine(command => 'sysctl -n hw.ncpu');
+    my $count = getFirstLine(command => 'sysctl -n hw.ncpu');
 
     # dmesg infos
     
@@ -45,22 +45,19 @@ sub doInventory {
     # cpu0 at mainbus0: MIPS R5000 CPU rev 2.1 180 MHz with R5000 based FPC rev 1.0
     # cpu0: cache L1-I 32KB D 32KB 2 way, L2 512KB direct
 
-    my ($processort, $processors);
+    my $cpu;
     foreach my $line (getAllLines(command => 'dmesg')) {
         if ($line =~ /$bios->{SMODEL}\s*\[\S*\s*(\S*)\]/) { $bios->{SSN} = $1; }
-        if ($line =~ /cpu0 at mainbus0:\s*(.*)$/)         { $processort = $1;  }
-        if ($line =~ /CPU\s*.*\D(\d+)\s*MHz/)             { $processors = $1;  }
+        if ($line =~ /cpu0 at mainbus0:\s*(.*)$/)         { $cpu->{NAME} = $1; }
+        if ($line =~ /CPU\s*.*\D(\d+)\s*MHz/)             { $cpu->{SPEED} = $1;  }
     }
 
     $inventory->setBios($bios);
 
-    for my $i (1 .. $processorn) {
+    while ($count--) {
         $inventory->addEntry(
             section => 'CPUS',
-            entry   => {
-                NAME  => $processort,
-                SPEED => $processors,
-            }
+            entry   => $cpu
         );
     }
 }
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/SPARC.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/SPARC.pm
index 7fbdf3b..e467769 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/SPARC.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/SPARC.pm
@@ -32,7 +32,7 @@ sub doInventory {
     $bios->{SSN} = dec2hex($bios->{SSN});
     $bios->{SSN} =~ s/^0x//;
 
-    my $processorn = getFirstLine(command => 'sysctl -n hw.ncpu');
+    my $count = getFirstLine(command => 'sysctl -n hw.ncpu');
 
     # dmesg infos
 
@@ -54,10 +54,10 @@ sub doInventory {
     # FreeBSD:
     # cpu0: Sun Microsystems UltraSparc-I Processor (167.00 MHz CPU)
 
-    my $processort;
+    my $cpu;
     foreach my $line (getAllLines(command => 'dmesg')) {
         if ($line=~ /^mainbus0 \(root\):\s*(.*)$/) { $bios->{SMODEL} = $1; }
-        if ($line =~ /^cpu[^:]*:\s*(.*)$/i)        { $processort = $1; }
+        if ($line =~ /^cpu[^:]*:\s*(.*)$/i)        { $cpu->{NAME}    = $1; }
     }
 
     $bios->{SMODEL} =~ s/SUNW,//;
@@ -65,25 +65,21 @@ sub doInventory {
     $bios->{SMODEL} =~ s/^\s*//;
     $bios->{SMODEL} =~ s/\s*$//;
 
-    $processort =~ s/SUNW,//;
-    $processort =~ s/^\s*//;
-    $processort =~ s/\s*$//;
+    $cpu->{NAME} =~ s/SUNW,//;
+    $cpu->{NAME} =~ s/^\s*//;
+    $cpu->{NAME} =~ s/\s*$//;
 
-    my $processors;
     # XXX quick and dirty _attempt_ to get proc speed
-    if ( $processort =~ /(\d+)(\.\d+|)\s*mhz/i ) { # possible decimal point
-        $processors = sprintf("%.0f", "$1$2"); # round number
+    if ($cpu->{NAME} =~ /(\d+)(\.\d+|)\s*mhz/i ) { # possible decimal point
+        $cpu->{SPEED} = sprintf("%.0f", "$1$2"); # round number
     }
 
     $inventory->setBios($bios);
 
-    for my $i (1 .. $processorn) {
+    while ($count--) {
         $inventory->addEntry(
             section => 'CPUS',
-            entry   => {
-                NAME  => $processort,
-                SPEED => $processors,
-            }
+            entry   => $cpu
         );
     }
 
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/i386.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/i386.pm
index 3cfefbf..bfa8b96 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/i386.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/i386.pm
@@ -24,29 +24,25 @@ sub doInventory {
     my $logger    = $params{logger};
 
     # sysctl infos
+    my $bios = {
+        SMODEL => getFirstLine(command => 'sysctl -n hw.model')
+    };
+    my $cpu = {
+        NAME  => getFirstLine(command => 'sysctl -n hw.machine'),
+        SPEED => (getCanonicalSpeed(split(/\s+/, $bios->{SMODEL})))[-1]
+    };
+    my $count = getFirstLine(command => 'sysctl -n hw.ncpu');
 
-    my $SystemModel = getFirstLine(command => 'sysctl -n hw.model');
-    my $processorn = getFirstLine(command => 'sysctl -n hw.ncpu');
-    my $processort = getFirstLine(command => 'sysctl -n hw.machine');
-    my $processors = getCanonicalSpeed(
-        (split(/\s+/, $SystemModel))[-1]
-    );
-
-    $inventory->setBios({
-        SMODEL => $SystemModel,
-    });
+    $inventory->setBios($bios);
 
     # don't deal with CPUs if information can be computed from dmidecode
     my $infos = getInfosFromDmidecode(logger => $logger);
     return if $infos->{4};
 
-    for my $i (1 .. $processorn) {
+    while ($count--) {
         $inventory->addEntry(
             section => 'CPUS',
-            entry   => {
-                NAME  => $processort,
-                SPEED => $processors,
-            }
+            entry   => $cpu
         );
     }
 


================================================================
  Commit: cbe4585b928fe8ac9ed985c7c40940d2e3b440ee
      https://github.com/fusinv/fusioninventory-agent/commit/cbe4585b928fe8ac9ed985c7c40940d2e3b440ee
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-02 (Fri, 02 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/CPU.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm

  Log Message:
  -----------
  Merge remote-tracking branch 'forge/2.2.x' into 2.2.x


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/CPU.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/CPU.pm
index 8f1d49c..57d4e95 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/CPU.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/CPU.pm
@@ -15,9 +15,6 @@ use FusionInventory::Agent::Tools;
 use FusionInventory::Agent::Tools::Win32;
 use FusionInventory::Agent::Tools::Generic;
 
-our $runMeIfTheseChecksFailed =
-    ["FusionInventory::Agent::Task::Inventory::Input::Generic::Dmidecode"];
-
 sub isEnabled {
     return 1;
 }
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm
index d845e9d..5b182ee 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm
@@ -27,7 +27,7 @@ sub doInventory {
     my (%params) = @_;
 
     my $inventory = $params{inventory};
-    my $logger =    $params{logger};
+    my $logger    = $params{logger};
 
     if (is64bit()) {
 
@@ -44,10 +44,9 @@ sub doInventory {
 
         foreach my $software (_getSoftwares(
             softwares => $softwares64,
-            is64bit   => 1,
-            logger => $logger
+            is64bit   => 1
         )) {
-            _addSoftware(inventory => $inventory, entry => $software, logger => $logger);
+            _addSoftware(inventory => $inventory, entry => $software);
         }
         _processMSIE(
             machKey   => $machKey64,
@@ -67,7 +66,7 @@ sub doInventory {
             is64bit   => 0,
             logger => $logger
         )) {
-            _addSoftware(inventory => $inventory, entry => $software, logger => $logger);
+            _addSoftware(inventory => $inventory, entry => $software);
         }
         _processMSIE(
             machKey   => $machKey32,
@@ -88,7 +87,7 @@ sub doInventory {
             softwares => $softwares,
             is64bit   => 0
         )) {
-            _addSoftware(inventory => $inventory, entry => $software, logger => $logger);
+            _addSoftware(inventory => $inventory, entry => $software);
         }
         _processMSIE(
             machKey   => $machKey,
@@ -168,7 +167,6 @@ sub _addSoftware {
 
     my $entry = $params{entry};
 
-    $params{logger}->debug("_addSoftware() begin") if $params{logger};
     # avoid duplicates
     return if $seen->{$entry->{NAME}}->{$entry->{IS64BIT}}{$entry->{VERSION} || '_undef_'}++;
 


================================================================
  Commit: 08278ee3311bd3d1bcf1769c81ef5bfd4a3e10d6
      https://github.com/fusinv/fusioninventory-agent/commit/08278ee3311bd3d1bcf1769c81ef5bfd4a3e10d6
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-02 (Fri, 02 Mar 2012)

  Changed paths:
    A resources/win32/registry/2003-CentralProcessor.reg
    A resources/win32/registry/2003SP2-CentralProcessor.reg
    A resources/win32/registry/xp-CentralProcessor.reg
    A resources/win32/wmi/2003-Win32_PhysicalMemory.wmi
    A resources/win32/wmi/2003-Win32_Processor.wmi
    A resources/win32/wmi/2003SP2-Win32_PhysicalMemory.wmi
    A resources/win32/wmi/2003SP2-Win32_Processor.wmi
    A resources/win32/wmi/xp-Win32_PhysicalMemory.wmi
    A resources/win32/wmi/xp-Win32_Processor.wmi

  Log Message:
  -----------
  new bunch of windows resources


diff --git a/resources/win32/registry/2003-CentralProcessor.reg b/resources/win32/registry/2003-CentralProcessor.reg
new file mode 100644
index 0000000..f96533d
Binary files /dev/null and b/resources/win32/registry/2003-CentralProcessor.reg differ
diff --git a/resources/win32/registry/2003SP2-CentralProcessor.reg b/resources/win32/registry/2003SP2-CentralProcessor.reg
new file mode 100644
index 0000000..48818d3
Binary files /dev/null and b/resources/win32/registry/2003SP2-CentralProcessor.reg differ
diff --git a/resources/win32/registry/xp-CentralProcessor.reg b/resources/win32/registry/xp-CentralProcessor.reg
new file mode 100644
index 0000000..2de1ab6
Binary files /dev/null and b/resources/win32/registry/xp-CentralProcessor.reg differ
diff --git a/resources/win32/wmi/2003-Win32_PhysicalMemory.wmi b/resources/win32/wmi/2003-Win32_PhysicalMemory.wmi
new file mode 100644
index 0000000..0e86608
Binary files /dev/null and b/resources/win32/wmi/2003-Win32_PhysicalMemory.wmi differ
diff --git a/resources/win32/wmi/2003-Win32_Processor.wmi b/resources/win32/wmi/2003-Win32_Processor.wmi
new file mode 100644
index 0000000..56c6d71
Binary files /dev/null and b/resources/win32/wmi/2003-Win32_Processor.wmi differ
diff --git a/resources/win32/wmi/2003SP2-Win32_PhysicalMemory.wmi b/resources/win32/wmi/2003SP2-Win32_PhysicalMemory.wmi
new file mode 100644
index 0000000..87b20cc
Binary files /dev/null and b/resources/win32/wmi/2003SP2-Win32_PhysicalMemory.wmi differ
diff --git a/resources/win32/wmi/2003SP2-Win32_Processor.wmi b/resources/win32/wmi/2003SP2-Win32_Processor.wmi
new file mode 100644
index 0000000..4c32dac
Binary files /dev/null and b/resources/win32/wmi/2003SP2-Win32_Processor.wmi differ
diff --git a/resources/win32/wmi/xp-Win32_PhysicalMemory.wmi b/resources/win32/wmi/xp-Win32_PhysicalMemory.wmi
new file mode 100644
index 0000000..63775de
Binary files /dev/null and b/resources/win32/wmi/xp-Win32_PhysicalMemory.wmi differ
diff --git a/resources/win32/wmi/xp-Win32_Processor.wmi b/resources/win32/wmi/xp-Win32_Processor.wmi
new file mode 100644
index 0000000..68ba953
Binary files /dev/null and b/resources/win32/wmi/xp-Win32_Processor.wmi differ


================================================================
  Commit: fe77c9eb22b9a8e5aba2a102bbf0e29eb6ce1cff
      https://github.com/fusinv/fusioninventory-agent/commit/fe77c9eb22b9a8e5aba2a102bbf0e29eb6ce1cff
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-02 (Fri, 02 Mar 2012)

  Changed paths:
    M t/inventory/generic/dmidecode/memory.t

  Log Message:
  -----------
  add windows xp sample


diff --git a/t/inventory/generic/dmidecode/memory.t b/t/inventory/generic/dmidecode/memory.t
index 025453f..41ab935 100755
--- a/t/inventory/generic/dmidecode/memory.t
+++ b/t/inventory/generic/dmidecode/memory.t
@@ -908,6 +908,28 @@ my %tests = (
             MEMORYCORRECTION => 'None'
         }
     ],
+    'windows-xppro' => [
+        {
+            NUMSLOTS         => 1,
+            SERIALNUMBER     => '14FA6621',
+            TYPE             => 'DDR2',
+            SPEED            => '800 MHz',
+            CAPTION          => 'DIMM_A',
+            MEMORYCORRECTION => 'None',
+            DESCRIPTION      => 'DIMM (None)',
+            CAPACITY         => '2048'
+        },
+        {
+            NUMSLOTS         => 2,
+            SERIALNUMBER     => 'AEF96621',
+            TYPE             => 'DDR2',
+            SPEED            => '800 MHz',
+            CAPTION          => 'DIMM_B',
+            MEMORYCORRECTION => 'None',
+            DESCRIPTION      => 'DIMM (None)',
+            CAPACITY         => '2048'
+        }
+    ],
     'windows-hyperV' => [
         {
             NUMSLOTS     => 1,


================================================================
  Commit: dd7bc22e22c10fc5e155137c8c5b010575ed5b22
      https://github.com/fusinv/fusioninventory-agent/commit/dd7bc22e22c10fc5e155137c8c5b010575ed5b22
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-02 (Fri, 02 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Memory.pm

  Log Message:
  -----------
  split parsing for testing purposes


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Memory.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Memory.pm
index 4d74c2e..b2799b8 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Memory.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Memory.pm
@@ -80,6 +80,16 @@ sub doInventory {
 
     my $inventory = $params{inventory};
 
+    foreach my $memory (_getMemories()) {
+        $inventory->addEntry(
+            section => 'MEMORIES',
+            entry   => $memory
+        );
+    }
+}
+
+sub _getMemories {
+
     my $cpt = 0;
     my @memories;
 
@@ -134,13 +144,7 @@ sub doInventory {
         }
     }
 
-    foreach my $memory (@memories) {
-        $inventory->addEntry(
-            section => 'MEMORIES',
-            entry   => $memory
-        );
-    }
-
+    return @memories;
 }
 
 1;


================================================================
  Commit: e5249140d7654a3e7921f9d062d912fd9ac8dddb
      https://github.com/fusinv/fusioninventory-agent/commit/e5249140d7654a3e7921f9d062d912fd9ac8dddb
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-03 (Sat, 03 Mar 2012)

  Changed paths:
    A resources/win32/wmi/7-Win32_PhysicalMemory.wmi
    A resources/win32/wmi/7-Win32_PhysicalMemoryArray.wmi
    A resources/win32/wmi/7-Win32_Processor.wmi

  Log Message:
  -----------
  more wmi queries results


diff --git a/resources/win32/wmi/7-Win32_PhysicalMemory.wmi b/resources/win32/wmi/7-Win32_PhysicalMemory.wmi
new file mode 100644
index 0000000..e5aad73
Binary files /dev/null and b/resources/win32/wmi/7-Win32_PhysicalMemory.wmi differ
diff --git a/resources/win32/wmi/7-Win32_PhysicalMemoryArray.wmi b/resources/win32/wmi/7-Win32_PhysicalMemoryArray.wmi
new file mode 100644
index 0000000..d4a7646
Binary files /dev/null and b/resources/win32/wmi/7-Win32_PhysicalMemoryArray.wmi differ
diff --git a/resources/win32/wmi/7-Win32_Processor.wmi b/resources/win32/wmi/7-Win32_Processor.wmi
new file mode 100644
index 0000000..ba554d1
Binary files /dev/null and b/resources/win32/wmi/7-Win32_Processor.wmi differ


================================================================
  Commit: 6e43cafd6aa0cf88350e365a5e2db4acc0e643b6
      https://github.com/fusinv/fusioninventory-agent/commit/6e43cafd6aa0cf88350e365a5e2db4acc0e643b6
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-03 (Sat, 03 Mar 2012)

  Changed paths:
    A t/inventory/windows/memory.t

  Log Message:
  -----------
  initial import


diff --git a/t/inventory/windows/memory.t b/t/inventory/windows/memory.t
new file mode 100755
index 0000000..6a42f78
--- /dev/null
+++ b/t/inventory/windows/memory.t
@@ -0,0 +1,100 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+use utf8;
+
+use English qw(-no_match_vars);
+use Test::More;
+use Test::MockModule;
+
+BEGIN {
+    # use mock modules for non-available ones
+    push @INC, 't/fake/windows' if $OSNAME ne 'MSWin32';
+}
+
+use FusionInventory::Agent::Task::Inventory::Input::Win32::Memory;
+
+my %tests = (
+    7 => [
+        {
+            NUMSLOTS     => 0,
+            FORMFACTOR   => 'DIMM',
+            SERIALNUMBER => '0000000',
+            TYPE         => 'Unknown',
+            SPEED        => '1600',
+            CAPTION      => "Mémoire physique",
+            REMOVABLE    => 0,
+            DESCRIPTION  => "Mémoire physique",
+            CAPACITY     => '2048'
+        },
+        {
+            NUMSLOTS     => 1,
+            FORMFACTOR   => 'DIMM',
+            SERIALNUMBER => '0000000',
+            TYPE         => 'Unknown',
+            SPEED        => '1600',
+            CAPTION      => "Mémoire physique",
+            REMOVABLE    => 0,
+            DESCRIPTION  => "Mémoire physique",
+            CAPACITY     => '2048'
+        }
+    ]
+);
+
+plan tests => scalar keys %tests;
+
+my $module = Test::MockModule->new(
+    'FusionInventory::Agent::Task::Inventory::Input::Win32::Memory'
+);
+
+foreach my $test (keys %tests) {
+    # redefine getWmiObjects function
+    $module->mock(
+        'getWmiObjects',
+        sub {
+            my (%params) = @_;
+
+            my $file = "resources/win32/wmi/$test-$params{class}.wmi";
+            open (my $handle, '<', $file) or die "can't open $file: $ERRNO";
+
+            # this is a windows file
+            binmode $handle, ':encoding(UTF-16LE)';
+            local $INPUT_RECORD_SEPARATOR="\r\n";
+
+            # build a list of desired properties indexes
+            my %properties = map { $_ => 1 } @{$params{properties}};
+
+            my @objects;
+            my $object;
+            while (my $line = <$handle>) {
+                chomp $line;
+
+                if ($line =~ /^ (\w+) = (.+) $/x) {
+                    my $key = $1;
+                    my $value = $2;
+                    next unless $properties{$key};
+                    $value =~ s/&/&/g;
+                    $object->{$key} = $value;
+                    next;
+                }
+
+                if ($line =~ /^$/) {
+                    push @objects, $object if $object;
+                    undef $object;
+                    next;
+                }
+            }
+            close $handle;
+
+            return @objects;
+        }
+    );
+
+    my @memories = FusionInventory::Agent::Task::Inventory::Input::Win32::Memory::_getMemories();
+    is_deeply(
+        \@memories,
+        $tests{$test},
+        "$test memory"
+    );
+}


================================================================
  Commit: f22286f7f0693aa3baece545d98f0f6f782f0fb2
      https://github.com/fusinv/fusioninventory-agent/commit/f22286f7f0693aa3baece545d98f0f6f782f0fb2
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-03 (Sat, 03 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/CPU.pm

  Log Message:
  -----------
  less intermediate variables


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/CPU.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/CPU.pm
index 57d4e95..117bc09 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/CPU.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/CPU.pm
@@ -38,66 +38,60 @@ sub doInventory {
         # the CPU description in WMI is false, we use the registry instead
         # Hardware\Description\System\CentralProcessor\1
         # thank you Nicolas Richard 
-        my $info = getRegistryValue(
+        my $registryInfo = getRegistryValue(
             path   => "HKEY_LOCAL_MACHINE/Hardware/Description/System/CentralProcessor/$cpuId",
             logger => $logger
         );
 
-#        my $cache = $object->{L2CacheSize}+$object->{L3CacheSize};
-        my $core = $dmidecodeCpu[$cpuId]->{CORE} || $object->{NumberOfCores};
-        my $thread = $dmidecodeCpu[$cpuId]->{THREAD};
-        my $description = $info->{Identifier};
-        my $name = $info->{ProcessorNameString};
-        my $manufacturer = $info->{VendorIdentifier};
-        my $id = $dmidecodeCpu[$cpuId]->{ID} || $object->{ProcessorId};
-        my $speed = $dmidecodeCpu[$cpuId]->{SPEED} || $object->{MaxClockSpeed};
-        my $serial = $dmidecodeCpu[$cpuId]->{SERIAL};
+        my $dmidecodeInfo = $dmidecodeCpu[$cpuId];
+
+        my $cpu = {
+            CORE         => $dmidecodeInfo->{CORE} || $object->{NumberOfCores},
+            THREAD       => $dmidecodeInfo->{THREAD},
+            DESCRIPTION  => $registryInfo->{Identifier},
+            NAME         => $registryInfo->{ProcessorNameString},
+            MANUFACTURER => $registryInfo->{VendorIdentifier},
+            SERIAL       => $dmidecodeInfo->{SERIAL},
+            SPEED        => $dmidecodeInfo->{SPEED} || $object->{MaxClockSpeed},
+            ID           => $dmidecodeInfo->{ID} || $object->{ProcessorId}
+        };
 
         # Some information are missing on Win2000
-        if (!$name) {
-            $name = $ENV{PROCESSOR_IDENTIFIER};
-            if ($name =~ s/,\s(\S+)$//) {
-                $manufacturer = $1;
+        if (!$cpu->{NAME}) {
+            $cpu->{NAME} = $ENV{PROCESSOR_IDENTIFIER};
+            if ($cpu->{NAME} =~ s/,\s(\S+)$//) {
+                $cpu->{MANUFACTURER} = $1;
             }
         }
 
-        if ($manufacturer) {
-            $manufacturer =~ s/Genuine//;
-            $manufacturer =~ s/(TMx86|TransmetaCPU)/Transmeta/;
-            $manufacturer =~ s/CyrixInstead/Cyrix/;
-            $manufacturer=~ s/CentaurHauls/VIA/;
+        if ($cpu->{MANUFACTURER}) {
+            $cpu->{MANUFACTURER} =~ s/Genuine//;
+            $cpu->{MANUFACTURER} =~ s/(TMx86|TransmetaCPU)/Transmeta/;
+            $cpu->{MANUFACTURER} =~ s/CyrixInstead/Cyrix/;
+            $cpu->{MANUFACTURER} =~ s/CentaurHauls/VIA/;
         }
-        if ($serial) {
-            $serial =~ s/\s//g;
+
+        if ($cpu->{SERIAL}) {
+            $cpu->{SERIAL} =~ s/\s//g;
         }
 
-        if ($name) {
-            $name =~ s/^\s+//;
-            $name =~ s/\s+$//;
+        if ($cpu->{NAME}) {
+            $cpu->{NAME} =~ s/^\s+//;
+            $cpu->{NAME} =~ s/\s+$//;
 
-            $vmsystem = "QEMU"if $name =~ /QEMU/i;
+            $vmsystem = "QEMU" if $cpu->{NAME} =~ /QEMU/i;
 
-            if ($name =~ /([\d\.]+)s*(GHZ)/i) {
-                $speed = {
+            if ($cpu->{NAME} =~ /([\d\.]+)s*(GHZ)/i) {
+                $cpu->{SPEED} = {
                     ghz => 1000,
                     mhz => 1,
-                }->{lc($2)}*$1;
+                }->{lc($2)} * $1;
             }
-
         }
 
         $inventory->addEntry(
             section => 'CPUS',
-            entry   => {
-                CORE         => $core,
-                THREAD       => $thread,
-                DESCRIPTION  => $description,
-                NAME         => $name,
-                MANUFACTURER => $manufacturer,
-                SERIAL       => $serial,
-                SPEED        => $speed,
-                ID           => $id
-            }
+            entry   => $cpu
         );
 
         $cpuId++;


================================================================
  Commit: 619bfd9e276e7cfc788c40f70dfeb1bb5f7bd0c0
      https://github.com/fusinv/fusioninventory-agent/commit/619bfd9e276e7cfc788c40f70dfeb1bb5f7bd0c0
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-04 (Sun, 04 Mar 2012)

  Changed paths:
    M t/FusionInventory/Test/Utils.pm
    M t/inventory/windows/memory.t
    M t/inventory/windows/usb.t

  Log Message:
  -----------
  code factorisation


diff --git a/t/FusionInventory/Test/Utils.pm b/t/FusionInventory/Test/Utils.pm
index 8d1cb0a..9041766 100644
--- a/t/FusionInventory/Test/Utils.pm
+++ b/t/FusionInventory/Test/Utils.pm
@@ -4,10 +4,12 @@ use strict;
 use warnings;
 use base 'Exporter';
 
+use English qw(-no_match_vars);
 use Socket;
 
 our @EXPORT = qw(
     test_port
+    mockGetWmiObjects
 );
 
 sub test_port {
@@ -25,3 +27,45 @@ sub test_port {
 
     return 0;
 }
+
+sub mockGetWmiObjects {
+    my ($test) = @_;
+
+    return sub {
+        my (%params) = @_;
+
+        my $file = "resources/win32/wmi/$test-$params{class}.wmi";
+        open (my $handle, '<', $file) or die "can't open $file: $ERRNO";
+
+        # this is a windows file
+        binmode $handle, ':encoding(UTF-16LE)';
+        local $INPUT_RECORD_SEPARATOR="\r\n";
+
+        # build a list of desired properties indexes
+        my %properties = map { $_ => 1 } @{$params{properties}};
+
+        my @objects;
+        my $object;
+        while (my $line = <$handle>) {
+            chomp $line;
+
+            if ($line =~ /^ (\w+) = (.+) $/x) {
+                my $key = $1;
+                my $value = $2;
+                next unless $properties{$key};
+                $value =~ s/&/&/g;
+                $object->{$key} = $value;
+                next;
+            }
+
+            if ($line =~ /^$/) {
+                push @objects, $object if $object;
+                undef $object;
+                next;
+            }
+        }
+        close $handle;
+
+        return @objects;
+    };
+}
diff --git a/t/inventory/windows/memory.t b/t/inventory/windows/memory.t
index 6a42f78..4192e95 100755
--- a/t/inventory/windows/memory.t
+++ b/t/inventory/windows/memory.t
@@ -3,11 +3,14 @@
 use strict;
 use warnings;
 use utf8;
+use lib 't';
 
 use English qw(-no_match_vars);
 use Test::More;
 use Test::MockModule;
 
+use FusionInventory::Test::Utils;
+
 BEGIN {
     # use mock modules for non-available ones
     push @INC, 't/fake/windows' if $OSNAME ne 'MSWin32';
@@ -52,43 +55,7 @@ foreach my $test (keys %tests) {
     # redefine getWmiObjects function
     $module->mock(
         'getWmiObjects',
-        sub {
-            my (%params) = @_;
-
-            my $file = "resources/win32/wmi/$test-$params{class}.wmi";
-            open (my $handle, '<', $file) or die "can't open $file: $ERRNO";
-
-            # this is a windows file
-            binmode $handle, ':encoding(UTF-16LE)';
-            local $INPUT_RECORD_SEPARATOR="\r\n";
-
-            # build a list of desired properties indexes
-            my %properties = map { $_ => 1 } @{$params{properties}};
-
-            my @objects;
-            my $object;
-            while (my $line = <$handle>) {
-                chomp $line;
-
-                if ($line =~ /^ (\w+) = (.+) $/x) {
-                    my $key = $1;
-                    my $value = $2;
-                    next unless $properties{$key};
-                    $value =~ s/&/&/g;
-                    $object->{$key} = $value;
-                    next;
-                }
-
-                if ($line =~ /^$/) {
-                    push @objects, $object if $object;
-                    undef $object;
-                    next;
-                }
-            }
-            close $handle;
-
-            return @objects;
-        }
+        mockGetWmiObjects($test)
     );
 
     my @memories = FusionInventory::Agent::Task::Inventory::Input::Win32::Memory::_getMemories();
diff --git a/t/inventory/windows/usb.t b/t/inventory/windows/usb.t
index f8a5147..85300c7 100755
--- a/t/inventory/windows/usb.t
+++ b/t/inventory/windows/usb.t
@@ -3,11 +3,14 @@
 use strict;
 use warnings;
 use utf8;
+use lib 't';
 
 use English qw(-no_match_vars);
 use Test::More;
 use Test::MockModule;
 
+use FusionInventory::Test::Utils;
+
 BEGIN {
     # use mock modules for non-available ones
     push @INC, 't/fake/windows' if $OSNAME ne 'MSWin32';
@@ -96,43 +99,7 @@ foreach my $test (keys %tests) {
     # redefine getWmiObjects function
     $module->mock(
         'getWmiObjects',
-        sub {
-            my (%params) = @_;
-
-            my $file = "resources/win32/wmi/$test-$params{class}.wmi";
-            open (my $handle, '<', $file) or die "can't open $file: $ERRNO";
-
-            # this is a windows file
-            binmode $handle, ':encoding(UTF-16LE)';
-            local $INPUT_RECORD_SEPARATOR="\r\n";
-
-            # build a list of desired properties indexes
-            my %properties = map { $_ => 1 } @{$params{properties}};
-
-            my @objects;
-            my $object;
-            while (my $line = <$handle>) {
-                chomp $line;
-
-                if ($line =~ /^ (\w+) = (.+) $/x) {
-                    my $key = $1;
-                    my $value = $2;
-                    next unless $properties{$key};
-                    $value =~ s/&/&/g;
-                    $object->{$key} = $value;
-                    next;
-                }
-
-                if ($line =~ /^$/) {
-                    push @objects, $object if $object;
-                    undef $object;
-                    next;
-                }
-            }
-            close $handle;
-
-            return @objects;
-        }
+        mockGetWmiObjects($test)
     );
 
     my @devices = FusionInventory::Agent::Task::Inventory::Input::Win32::USB::_getUSBDevices();


================================================================
  Commit: 27827f100995e98b2ebd65494f0aa467aa64cef8
      https://github.com/fusinv/fusioninventory-agent/commit/27827f100995e98b2ebd65494f0aa467aa64cef8
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-04 (Sun, 04 Mar 2012)

  Changed paths:
    A resources/generic/dmidecode/windows-7
    M t/inventory/generic/dmidecode/memory.t
    M t/tools/generic.t

  Log Message:
  -----------
  add windows 7 sample


diff --git a/resources/generic/dmidecode/windows-7 b/resources/generic/dmidecode/windows-7
new file mode 100644
index 0000000..3ff0578
--- /dev/null
+++ b/resources/generic/dmidecode/windows-7
@@ -0,0 +1,1034 @@
+# dmidecode 2.10
+SMBIOS 2.6 present.
+101 structures occupying 3552 bytes.
+Table at 0x003B3688.
+
+Handle 0x0000, DMI type 0, 24 bytes
+BIOS Information
+	Vendor: American Megatrends Inc.
+	Version: 1503
+	Release Date: 03/10/2011
+	Address: 0xF0000
+	Runtime Size: 64 kB
+	ROM Size: 4096 kB
+	Characteristics:
+		PCI is supported
+		BIOS is upgradeable
+		BIOS shadowing is allowed
+		Boot from CD is supported
+		Selectable boot is supported
+		BIOS ROM is socketed
+		EDD is supported
+		5.25"/1.2 MB floppy services are supported (int 13h)
+		3.5"/720 kB floppy services are supported (int 13h)
+		3.5"/2.88 MB floppy services are supported (int 13h)
+		Print screen service is supported (int 5h)
+		8042 keyboard services are supported (int 9h)
+		Serial services are supported (int 14h)
+		Printer services are supported (int 17h)
+		ACPI is supported
+		USB legacy is supported
+		BIOS boot specification is supported
+		Targeted content distribution is supported
+	BIOS Revision: 4.6
+
+Handle 0x0001, DMI type 1, 27 bytes
+System Information
+	Manufacturer: System manufacturer
+	Product Name: System Product Name
+	Version: System Version
+	Serial Number: System Serial Number
+	UUID: 1E00E6E0-008C-4400-9AAD-F46D04972D3E
+	Wake-up Type: Power Switch
+	SKU Number: To be filled by O.E.M.
+	Family: To be filled by O.E.M.
+
+Handle 0x0002, DMI type 2, 15 bytes
+Base Board Information
+	Manufacturer: ASUSTeK Computer INC.
+	Product Name: P8P67
+	Version: Rev 1.xx
+	Serial Number: MT7013K30709271
+	Asset Tag: To be filled by O.E.M.
+	Features:
+		Board is a hosting board
+		Board is replaceable
+	Location In Chassis: To be filled by O.E.M.
+	Chassis Handle: 0x0003
+	Type: Motherboard
+	Contained Object Handles: 0
+
+Handle 0x0003, DMI type 3, 21 bytes
+Chassis Information
+	Manufacturer: Chassis Manufacture
+	Type: Desktop
+	Lock: Not Present
+	Version: Chassis Version
+	Serial Number: Chassis Serial Number
+	Asset Tag: Asset-1234567890
+	Boot-up State: Safe
+	Power Supply State: Safe
+	Thermal State: Safe
+	Security Status: None
+	OEM Information: 0x00000000
+	Height: Unspecified
+	Number Of Power Cords: 1
+	Contained Elements: 0
+
+Handle 0x0004, DMI type 4, 42 bytes
+Processor Information
+	Socket Designation: LGA1155
+	Type: Central Processor
+	Family: Core 2 Duo
+	Manufacturer: Intel            
+	ID: A7 06 02 00 FF FB EB BF
+	Signature: Type 0, Family 6, Model 42, Stepping 7
+	Flags:
+		FPU (Floating-point unit on-chip)
+		VME (Virtual mode extension)
+		DE (Debugging extension)
+		PSE (Page size extension)
+		TSC (Time stamp counter)
+		MSR (Model specific registers)
+		PAE (Physical address extension)
+		MCE (Machine check exception)
+		CX8 (CMPXCHG8 instruction supported)
+		APIC (On-chip APIC hardware supported)
+		SEP (Fast system call)
+		MTRR (Memory type range registers)
+		PGE (Page global enable)
+		MCA (Machine check architecture)
+		CMOV (Conditional move instruction supported)
+		PAT (Page attribute table)
+		PSE-36 (36-bit page size extension)
+		CLFSH (CLFLUSH instruction supported)
+		DS (Debug store)
+		ACPI (ACPI supported)
+		MMX (MMX technology supported)
+		FXSR (Fast floating-point save and restore)
+		SSE (Streaming SIMD extensions)
+		SSE2 (Streaming SIMD extensions 2)
+		SS (Self-snoop)
+		HTT (Hyper-threading technology)
+		TM (Thermal monitor supported)
+		PBE (Pending break enabled)
+	Version: Intel(R) Core(TM) i5-2300 CPU @ 2.80GHz        
+	Voltage: 1.0 V
+	External Clock: 100 MHz
+	Max Speed: 3800 MHz
+	Current Speed: 2800 MHz
+	Status: Populated, Enabled
+	Upgrade: Other
+	L1 Cache Handle: 0x0005
+	L2 Cache Handle: 0x0006
+	L3 Cache Handle: 0x0007
+	Serial Number: To Be Filled By O.E.M.
+	Asset Tag: To Be Filled By O.E.M.
+	Part Number: To Be Filled By O.E.M.
+	Core Count: 4
+	Core Enabled: 1
+	Characteristics:
+		64-bit capable
+
+Handle 0x0005, DMI type 7, 19 bytes
+Cache Information
+	Socket Designation: L1-Cache
+	Configuration: Enabled, Not Socketed, Level 1
+	Operational Mode: Write Back
+	Location: Internal
+	Installed Size: 256 kB
+	Maximum Size: 256 kB
+	Supported SRAM Types:
+		Other
+	Installed SRAM Type: Other
+	Speed: Unknown
+	Error Correction Type: None
+	System Type: Unified
+	Associativity: 8-way Set-associative
+
+Handle 0x0006, DMI type 7, 19 bytes
+Cache Information
+	Socket Designation: L2-Cache
+	Configuration: Enabled, Not Socketed, Level 2
+	Operational Mode: Varies With Memory Address
+	Location: Internal
+	Installed Size: 1024 kB
+	Maximum Size: 1024 kB
+	Supported SRAM Types:
+		Other
+	Installed SRAM Type: Other
+	Speed: Unknown
+	Error Correction Type: None
+	System Type: Unified
+	Associativity: 8-way Set-associative
+
+Handle 0x0007, DMI type 7, 19 bytes
+Cache Information
+	Socket Designation: L3-Cache
+	Configuration: Disabled, Not Socketed, Level 3
+	Operational Mode: Unknown
+	Location: Internal
+	Installed Size: 6144 kB
+	Maximum Size: 6144 kB
+	Supported SRAM Types:
+		Other
+	Installed SRAM Type: Other
+	Speed: Unknown
+	Error Correction Type: None
+	System Type: Unified
+	Associativity: Other
+
+Handle 0x0008, DMI type 8, 9 bytes
+Port Connector Information
+	Internal Reference Designator: PS/2 Keyboard
+	Internal Connector Type: None
+	External Reference Designator: PS/2 Keyboard
+	External Connector Type: PS/2
+	Port Type: Keyboard Port
+
+Handle 0x0009, DMI type 8, 9 bytes
+Port Connector Information
+	Internal Reference Designator: USB9_10
+	Internal Connector Type: None
+	External Reference Designator: USB9_10
+	External Connector Type: Access Bus (USB)
+	Port Type: USB
+
+Handle 0x000A, DMI type 8, 9 bytes
+Port Connector Information
+	Internal Reference Designator: USB11_12
+	Internal Connector Type: None
+	External Reference Designator: USB11_12
+	External Connector Type: Access Bus (USB)
+	Port Type: USB
+
+Handle 0x000B, DMI type 8, 9 bytes
+Port Connector Information
+	Internal Reference Designator: GbE LAN
+	Internal Connector Type: None
+	External Reference Designator: GbE LAN
+	External Connector Type: RJ-45
+	Port Type: Network Port
+
+Handle 0x000C, DMI type 8, 9 bytes
+Port Connector Information
+	Internal Reference Designator: AUDIO
+	Internal Connector Type: None
+	External Reference Designator: AUDIO
+	External Connector Type: Other
+	Port Type: Audio Port
+
+Handle 0x000D, DMI type 8, 9 bytes
+Port Connector Information
+	Internal Reference Designator: SATA1
+	Internal Connector Type: SAS/SATA Plug Receptacle
+	External Reference Designator: Not Specified
+	External Connector Type: None
+	Port Type: SATA
+
+Handle 0x000E, DMI type 8, 9 bytes
+Port Connector Information
+	Internal Reference Designator: SATA2
+	Internal Connector Type: SAS/SATA Plug Receptacle
+	External Reference Designator: Not Specified
+	External Connector Type: None
+	Port Type: SATA
+
+Handle 0x000F, DMI type 8, 9 bytes
+Port Connector Information
+	Internal Reference Designator: SATA3
+	Internal Connector Type: SAS/SATA Plug Receptacle
+	External Reference Designator: Not Specified
+	External Connector Type: None
+	Port Type: SATA
+
+Handle 0x0010, DMI type 8, 9 bytes
+Port Connector Information
+	Internal Reference Designator: SATA4
+	Internal Connector Type: SAS/SATA Plug Receptacle
+	External Reference Designator: Not Specified
+	External Connector Type: None
+	Port Type: SATA
+
+Handle 0x0011, DMI type 8, 9 bytes
+Port Connector Information
+	Internal Reference Designator: SATA5
+	Internal Connector Type: SAS/SATA Plug Receptacle
+	External Reference Designator: Not Specified
+	External Connector Type: None
+	Port Type: SATA
+
+Handle 0x0012, DMI type 8, 9 bytes
+Port Connector Information
+	Internal Reference Designator: SATA6
+	Internal Connector Type: SAS/SATA Plug Receptacle
+	External Reference Designator: Not Specified
+	External Connector Type: None
+	Port Type: SATA
+
+Handle 0x0013, DMI type 8, 9 bytes
+Port Connector Information
+	Internal Reference Designator: USB1_2
+	Internal Connector Type: Access Bus (USB)
+	External Reference Designator: Not Specified
+	External Connector Type: None
+	Port Type: USB
+
+Handle 0x0014, DMI type 8, 9 bytes
+Port Connector Information
+	Internal Reference Designator: USB3_4
+	Internal Connector Type: Access Bus (USB)
+	External Reference Designator: Not Specified
+	External Connector Type: None
+	Port Type: USB
+
+Handle 0x0015, DMI type 8, 9 bytes
+Port Connector Information
+	Internal Reference Designator: USB5_6
+	Internal Connector Type: Access Bus (USB)
+	External Reference Designator: Not Specified
+	External Connector Type: None
+	Port Type: USB
+
+Handle 0x0016, DMI type 8, 9 bytes
+Port Connector Information
+	Internal Reference Designator: USB7_8
+	Internal Connector Type: Access Bus (USB)
+	External Reference Designator: Not Specified
+	External Connector Type: None
+	Port Type: USB
+
+Handle 0x0017, DMI type 8, 9 bytes
+Port Connector Information
+	Internal Reference Designator: AAFP
+	Internal Connector Type: Mini Jack (headphones)
+	External Reference Designator: Not Specified
+	External Connector Type: None
+	Port Type: Audio Port
+
+Handle 0x0018, DMI type 8, 9 bytes
+Port Connector Information
+	Internal Reference Designator: CPU_FAN
+	Internal Connector Type: Other
+	External Reference Designator: Not Specified
+	External Connector Type: None
+	Port Type: Other
+
+Handle 0x0019, DMI type 8, 9 bytes
+Port Connector Information
+	Internal Reference Designator: CHA_FAN1
+	Internal Connector Type: Other
+	External Reference Designator: Not Specified
+	External Connector Type: None
+	Port Type: Other
+
+Handle 0x001A, DMI type 8, 9 bytes
+Port Connector Information
+	Internal Reference Designator: PWR_FAN
+	Internal Connector Type: Other
+	External Reference Designator: Not Specified
+	External Connector Type: None
+	Port Type: Other
+
+Handle 0x001B, DMI type 8, 9 bytes
+Port Connector Information
+	Internal Reference Designator: PATA_IDE
+	Internal Connector Type: On Board IDE
+	External Reference Designator: Not Specified
+	External Connector Type: None
+	Port Type: Other
+
+Handle 0x001C, DMI type 8, 9 bytes
+Port Connector Information
+	Internal Reference Designator: F_ESATA
+	Internal Connector Type: SAS/SATA Plug Receptacle
+	External Reference Designator: Not Specified
+	External Connector Type: None
+	Port Type: SATA
+
+Handle 0x001D, DMI type 9, 17 bytes
+System Slot Information
+	Designation: PCIEX16_1
+	Type: 32-bit PCI Express
+	Current Usage: In Use
+	Length: Short
+	ID: 1
+	Characteristics:
+		3.3 V is provided
+		Opening is shared
+		PME signal is supported
+	Bus Address: 0000:00:01.0
+
+Handle 0x001E, DMI type 9, 17 bytes
+System Slot Information
+	Designation: PCIEX1_1
+	Type: 32-bit PCI Express
+	Current Usage: In Use
+	Length: Short
+	ID: 2
+	Characteristics:
+		3.3 V is provided
+		Opening is shared
+		PME signal is supported
+	Bus Address: 0000:00:1c.3
+
+Handle 0x001F, DMI type 9, 17 bytes
+System Slot Information
+	Designation: PCIEX1_2
+	Type: 32-bit PCI Express
+	Current Usage: In Use
+	Length: Short
+	ID: 3
+	Characteristics:
+		3.3 V is provided
+		Opening is shared
+		PME signal is supported
+	Bus Address: 0000:00:1c.4
+
+Handle 0x0020, DMI type 9, 17 bytes
+System Slot Information
+	Designation: PCI1
+	Type: 32-bit PCI
+	Current Usage: In Use
+	Length: Short
+	ID: 4
+	Characteristics:
+		3.3 V is provided
+		Opening is shared
+		PME signal is supported
+	Bus Address: 0000:00:1c.6
+
+Handle 0x0021, DMI type 10, 6 bytes
+On Board Device Information
+	Type: Ethernet
+	Status: Enabled
+	Description: Onboard Ethernet
+
+Handle 0x0022, DMI type 11, 5 bytes
+OEM Strings
+	String 1: To Be Filled By O.E.M.
+
+Handle 0x0023, DMI type 12, 5 bytes
+System Configuration Options
+	Option 1: To Be Filled By O.E.M.
+
+Handle 0x0024, DMI type 16, 15 bytes
+Physical Memory Array
+	Location: System Board Or Motherboard
+	Use: System Memory
+	Error Correction Type: None
+	Maximum Capacity: 32 GB
+	Error Information Handle: No Error
+	Number Of Devices: 4
+
+Handle 0x0025, DMI type 18, 23 bytes
+32-bit Memory Error Information
+	Type: OK
+	Granularity: Unknown
+	Operation: Unknown
+	Vendor Syndrome: Unknown
+	Memory Array Address: Unknown
+	Device Address: Unknown
+	Resolution: Unknown
+
+Handle 0x0026, DMI type 19, 15 bytes
+Memory Array Mapped Address
+	Starting Address: 0x00000000000
+	Ending Address: 0x000FFFFFFFF
+	Range Size: 4 GB
+	Physical Array Handle: 0x0024
+	Partition Width: 0
+
+Handle 0x0027, DMI type 17, 28 bytes
+Memory Device
+	Array Handle: 0x0024
+	Error Information Handle: No Error
+	Total Width: 64 bits
+	Data Width: 64 bits
+	Size: No Module Installed
+	Form Factor: DIMM
+	Set: None
+	Locator: DIMM0
+	Bank Locator: BANK0
+	Type: Unknown
+	Type Detail: Synchronous
+	Speed: Unknown
+	Manufacturer: Manufacturer0
+	Serial Number: SerNum0
+	Asset Tag: AssetTagNum0
+	Part Number: Array1_PartNumber0
+	Rank: Unknown
+
+Handle 0x0028, DMI type 18, 23 bytes
+32-bit Memory Error Information
+	Type: OK
+	Granularity: Unknown
+	Operation: Unknown
+	Vendor Syndrome: Unknown
+	Memory Array Address: Unknown
+	Device Address: Unknown
+	Resolution: Unknown
+
+Handle 0x0029, DMI type 126, 19 bytes
+Inactive
+
+Handle 0x002A, DMI type 17, 28 bytes
+Memory Device
+	Array Handle: 0x0024
+	Error Information Handle: No Error
+	Total Width: 64 bits
+	Data Width: 64 bits
+	Size: 2048 MB
+	Form Factor: DIMM
+	Set: None
+	Locator: DIMM1
+	Bank Locator: BANK1
+	Type: <OUT OF SPEC>
+	Type Detail: Synchronous
+	Speed: 1600 MHz
+	Manufacturer: Undefined    
+	Serial Number: 0000000
+	Asset Tag: AssetTagNum1
+	Part Number: F3-12800CL9-2GBXL 
+	Rank: 2
+
+Handle 0x002B, DMI type 18, 23 bytes
+32-bit Memory Error Information
+	Type: OK
+	Granularity: Unknown
+	Operation: Unknown
+	Vendor Syndrome: Unknown
+	Memory Array Address: Unknown
+	Device Address: Unknown
+	Resolution: Unknown
+
+Handle 0x002C, DMI type 20, 19 bytes
+Memory Device Mapped Address
+	Starting Address: 0x00000000000
+	Ending Address: 0x0007FFFFFFF
+	Range Size: 2 GB
+	Physical Device Handle: 0x002A
+	Memory Array Mapped Address Handle: 0x0026
+	Partition Row Position: 1
+
+Handle 0x002D, DMI type 17, 28 bytes
+Memory Device
+	Array Handle: 0x0024
+	Error Information Handle: No Error
+	Total Width: 64 bits
+	Data Width: 64 bits
+	Size: No Module Installed
+	Form Factor: DIMM
+	Set: None
+	Locator: DIMM2
+	Bank Locator: BANK2
+	Type: Unknown
+	Type Detail: Synchronous
+	Speed: Unknown
+	Manufacturer: Manufacturer2
+	Serial Number: SerNum2
+	Asset Tag: AssetTagNum2
+	Part Number: Array1_PartNumber2
+	Rank: Unknown
+
+Handle 0x002E, DMI type 18, 23 bytes
+32-bit Memory Error Information
+	Type: OK
+	Granularity: Unknown
+	Operation: Unknown
+	Vendor Syndrome: Unknown
+	Memory Array Address: Unknown
+	Device Address: Unknown
+	Resolution: Unknown
+
+Handle 0x002F, DMI type 126, 19 bytes
+Inactive
+
+Handle 0x0030, DMI type 17, 28 bytes
+Memory Device
+	Array Handle: 0x0024
+	Error Information Handle: No Error
+	Total Width: 64 bits
+	Data Width: 64 bits
+	Size: 2048 MB
+	Form Factor: DIMM
+	Set: None
+	Locator: DIMM3
+	Bank Locator: BANK3
+	Type: <OUT OF SPEC>
+	Type Detail: Synchronous
+	Speed: 1600 MHz
+	Manufacturer: Undefined    
+	Serial Number: 0000000
+	Asset Tag: AssetTagNum3
+	Part Number: F3-12800CL9-2GBXL 
+	Rank: 2
+
+Handle 0x0031, DMI type 18, 23 bytes
+32-bit Memory Error Information
+	Type: OK
+	Granularity: Unknown
+	Operation: Unknown
+	Vendor Syndrome: Unknown
+	Memory Array Address: Unknown
+	Device Address: Unknown
+	Resolution: Unknown
+
+Handle 0x0032, DMI type 20, 19 bytes
+Memory Device Mapped Address
+	Starting Address: 0x00080000000
+	Ending Address: 0x000FFFFFFFF
+	Range Size: 2 GB
+	Physical Device Handle: 0x0030
+	Memory Array Mapped Address Handle: 0x0026
+	Partition Row Position: 1
+
+Handle 0x0033, DMI type 32, 20 bytes
+System Boot Information
+	Status: No errors detected
+
+Handle 0x0034, DMI type 34, 11 bytes
+Management Device
+	Description: LM78-1
+	Type: LM78
+	Address: 0x00000000
+	Address Type: I/O Port
+
+Handle 0x0035, DMI type 26, 22 bytes
+Voltage Probe
+	Description: LM78A
+	Location: <OUT OF SPEC>
+	Status: <OUT OF SPEC>
+	Maximum Value: Unknown
+	Minimum Value: Unknown
+	Resolution: Unknown
+	Tolerance: Unknown
+	Accuracy: Unknown
+	OEM-specific Information: 0x00000000
+	Nominal Value: Unknown
+
+Handle 0x0036, DMI type 36, 16 bytes
+Management Device Threshold Data
+	Lower Non-critical Threshold: 1
+	Upper Non-critical Threshold: 2
+	Lower Critical Threshold: 3
+	Upper Critical Threshold: 4
+	Lower Non-recoverable Threshold: 5
+	Upper Non-recoverable Threshold: 6
+
+Handle 0x0037, DMI type 35, 11 bytes
+Management Device Component
+	Description: To Be Filled By O.E.M.
+	Management Device Handle: 0x0034
+	Component Handle: 0x0034
+	Threshold Handle: 0x0035
+
+Handle 0x0038, DMI type 28, 22 bytes
+Temperature Probe
+	Description: LM78A
+	Location: <OUT OF SPEC>
+	Status: <OUT OF SPEC>
+	Maximum Value: Unknown
+	Minimum Value: Unknown
+	Resolution: Unknown
+	Tolerance: Unknown
+	Accuracy: Unknown
+	OEM-specific Information: 0x00000000
+	Nominal Value: Unknown
+
+Handle 0x0039, DMI type 36, 16 bytes
+Management Device Threshold Data
+	Lower Non-critical Threshold: 1
+	Upper Non-critical Threshold: 2
+	Lower Critical Threshold: 3
+	Upper Critical Threshold: 4
+	Lower Non-recoverable Threshold: 5
+	Upper Non-recoverable Threshold: 6
+
+Handle 0x003A, DMI type 35, 11 bytes
+Management Device Component
+	Description: To Be Filled By O.E.M.
+	Management Device Handle: 0x0034
+	Component Handle: 0x0037
+	Threshold Handle: 0x0038
+
+Handle 0x003B, DMI type 27, 14 bytes
+Cooling Device
+	Temperature Probe Handle: 0x0038
+	Type: <OUT OF SPEC>
+	Status: <OUT OF SPEC>
+	Cooling Unit Group: 1
+	OEM-specific Information: 0x00000000
+	Nominal Speed: Unknown Or Non-rotating
+
+Handle 0x003C, DMI type 36, 16 bytes
+Management Device Threshold Data
+	Lower Non-critical Threshold: 1
+	Upper Non-critical Threshold: 2
+	Lower Critical Threshold: 3
+	Upper Critical Threshold: 4
+	Lower Non-recoverable Threshold: 5
+	Upper Non-recoverable Threshold: 6
+
+Handle 0x003D, DMI type 35, 11 bytes
+Management Device Component
+	Description: To Be Filled By O.E.M.
+	Management Device Handle: 0x0034
+	Component Handle: 0x003A
+	Threshold Handle: 0x003B
+
+Handle 0x003E, DMI type 27, 14 bytes
+Cooling Device
+	Temperature Probe Handle: 0x0038
+	Type: <OUT OF SPEC>
+	Status: <OUT OF SPEC>
+	Cooling Unit Group: 1
+	OEM-specific Information: 0x00000000
+	Nominal Speed: Unknown Or Non-rotating
+
+Handle 0x003F, DMI type 36, 16 bytes
+Management Device Threshold Data
+	Lower Non-critical Threshold: 1
+	Upper Non-critical Threshold: 2
+	Lower Critical Threshold: 3
+	Upper Critical Threshold: 4
+	Lower Non-recoverable Threshold: 5
+	Upper Non-recoverable Threshold: 6
+
+Handle 0x0040, DMI type 35, 11 bytes
+Management Device Component
+	Description: To Be Filled By O.E.M.
+	Management Device Handle: 0x0034
+	Component Handle: 0x003D
+	Threshold Handle: 0x003E
+
+Handle 0x0041, DMI type 29, 22 bytes
+Electrical Current Probe
+	Description: ABC
+	Location: <OUT OF SPEC>
+	Status: <OUT OF SPEC>
+	Maximum Value: Unknown
+	Minimum Value: Unknown
+	Resolution: Unknown
+	Tolerance: Unknown
+	Accuracy: Unknown
+	OEM-specific Information: 0x00000000
+	Nominal Value: Unknown
+
+Handle 0x0042, DMI type 36, 16 bytes
+Management Device Threshold Data
+
+Handle 0x0043, DMI type 35, 11 bytes
+Management Device Component
+	Description: To Be Filled By O.E.M.
+	Management Device Handle: 0x0034
+	Component Handle: 0x0040
+	Threshold Handle: 0x003E
+
+Handle 0x0044, DMI type 39, 22 bytes
+System Power Supply
+	Power Unit Group: 1
+	Location: To Be Filled By O.E.M.
+	Name: To Be Filled By O.E.M.
+	Manufacturer: To Be Filled By O.E.M.
+	Serial Number: To Be Filled By O.E.M.
+	Asset Tag: To Be Filled By O.E.M.
+	Model Part Number: To Be Filled By O.E.M.
+	Revision: To Be Filled By O.E.M.
+	Max Power Capacity: Unknown
+	Status: Not Present
+	Type: <OUT OF SPEC>
+	Input Voltage Range Switching: <OUT OF SPEC>
+	Plugged: Yes
+	Hot Replaceable: No
+	Input Voltage Probe Handle: 0x0035
+	Cooling Device Handle: 0x003B
+	Input Current Probe Handle: 0x0041
+
+Handle 0x0045, DMI type 34, 16 bytes
+Management Device
+	Description: 2
+	Type: LM78
+	Address: 0x00000000
+	Address Type: I/O Port
+
+Handle 0x0046, DMI type 26, 22 bytes
+Voltage Probe
+	Description: LM78B
+	Location: <OUT OF SPEC>
+	Status: <OUT OF SPEC>
+	Maximum Value: Unknown
+	Minimum Value: Unknown
+	Resolution: Unknown
+	Tolerance: Unknown
+	Accuracy: Unknown
+	OEM-specific Information: 0x00000000
+	Nominal Value: Unknown
+
+Handle 0x0047, DMI type 36, 16 bytes
+Management Device Threshold Data
+	Lower Non-critical Threshold: 7
+	Upper Non-critical Threshold: 8
+	Lower Critical Threshold: 8
+	Upper Critical Threshold: 10
+	Lower Non-recoverable Threshold: 11
+	Upper Non-recoverable Threshold: 12
+
+Handle 0x0048, DMI type 35, 11 bytes
+Management Device Component
+	Description: To Be Filled By O.E.M.
+	Management Device Handle: 0x0045
+	Component Handle: 0x0045
+	Threshold Handle: 0x0046
+
+Handle 0x0049, DMI type 26, 22 bytes
+Voltage Probe
+	Description: LM78B
+	Location: <OUT OF SPEC>
+	Status: <OUT OF SPEC>
+	Maximum Value: Unknown
+	Minimum Value: Unknown
+	Resolution: Unknown
+	Tolerance: Unknown
+	Accuracy: Unknown
+	OEM-specific Information: 0x00000000
+	Nominal Value: Unknown
+
+Handle 0x004A, DMI type 36, 16 bytes
+Management Device Threshold Data
+	Lower Non-critical Threshold: 13
+	Upper Non-critical Threshold: 14
+	Lower Critical Threshold: 15
+	Upper Critical Threshold: 16
+	Lower Non-recoverable Threshold: 17
+	Upper Non-recoverable Threshold: 18
+
+Handle 0x004B, DMI type 35, 11 bytes
+Management Device Component
+	Description: To Be Filled By O.E.M.
+	Management Device Handle: 0x0045
+	Component Handle: 0x0048
+	Threshold Handle: 0x0049
+
+Handle 0x004C, DMI type 28, 22 bytes
+Temperature Probe
+	Description: LM78B
+	Location: <OUT OF SPEC>
+	Status: <OUT OF SPEC>
+	Maximum Value: Unknown
+	Minimum Value: Unknown
+	Resolution: Unknown
+	Tolerance: Unknown
+	Accuracy: Unknown
+	OEM-specific Information: 0x00000000
+	Nominal Value: Unknown
+
+Handle 0x004D, DMI type 36, 16 bytes
+Management Device Threshold Data
+	Lower Non-critical Threshold: 1
+	Upper Non-critical Threshold: 2
+	Lower Critical Threshold: 3
+	Upper Critical Threshold: 4
+	Lower Non-recoverable Threshold: 5
+	Upper Non-recoverable Threshold: 6
+
+Handle 0x004E, DMI type 35, 11 bytes
+Management Device Component
+	Description: To Be Filled By O.E.M.
+	Management Device Handle: 0x0045
+	Component Handle: 0x004B
+	Threshold Handle: 0x004C
+
+Handle 0x004F, DMI type 27, 14 bytes
+Cooling Device
+	Temperature Probe Handle: 0x004C
+	Type: <OUT OF SPEC>
+	Status: <OUT OF SPEC>
+	Cooling Unit Group: 1
+	OEM-specific Information: 0x00000000
+	Nominal Speed: Unknown Or Non-rotating
+
+Handle 0x0050, DMI type 36, 16 bytes
+Management Device Threshold Data
+	Lower Non-critical Threshold: 1
+	Upper Non-critical Threshold: 2
+	Lower Critical Threshold: 3
+	Upper Critical Threshold: 4
+	Lower Non-recoverable Threshold: 5
+	Upper Non-recoverable Threshold: 6
+
+Handle 0x0051, DMI type 35, 11 bytes
+Management Device Component
+	Description: To Be Filled By O.E.M.
+	Management Device Handle: 0x0045
+	Component Handle: 0x004E
+	Threshold Handle: 0x004F
+
+Handle 0x0052, DMI type 28, 22 bytes
+Temperature Probe
+	Description: LM78B
+	Location: <OUT OF SPEC>
+	Status: <OUT OF SPEC>
+	Maximum Value: Unknown
+	Minimum Value: Unknown
+	Resolution: Unknown
+	Tolerance: Unknown
+	Accuracy: Unknown
+	OEM-specific Information: 0x00000000
+	Nominal Value: Unknown
+
+Handle 0x0053, DMI type 36, 16 bytes
+Management Device Threshold Data
+	Lower Non-critical Threshold: 1
+	Upper Non-critical Threshold: 2
+	Lower Critical Threshold: 3
+	Upper Critical Threshold: 4
+	Lower Non-recoverable Threshold: 5
+	Upper Non-recoverable Threshold: 6
+
+Handle 0x0054, DMI type 35, 11 bytes
+Management Device Component
+	Description: To Be Filled By O.E.M.
+	Management Device Handle: 0x0045
+	Component Handle: 0x0051
+	Threshold Handle: 0x0052
+
+Handle 0x0055, DMI type 27, 14 bytes
+Cooling Device
+	Temperature Probe Handle: 0x0052
+	Type: <OUT OF SPEC>
+	Status: <OUT OF SPEC>
+	Cooling Unit Group: 1
+	OEM-specific Information: 0x00000000
+	Nominal Speed: Unknown Or Non-rotating
+
+Handle 0x0056, DMI type 36, 16 bytes
+Management Device Threshold Data
+	Lower Non-critical Threshold: 1
+	Upper Non-critical Threshold: 2
+	Lower Critical Threshold: 3
+	Upper Critical Threshold: 4
+	Lower Non-recoverable Threshold: 5
+	Upper Non-recoverable Threshold: 6
+
+Handle 0x0057, DMI type 35, 11 bytes
+Management Device Component
+	Description: To Be Filled By O.E.M.
+	Management Device Handle: 0x0045
+	Component Handle: 0x0054
+	Threshold Handle: 0x0055
+
+Handle 0x0058, DMI type 29, 22 bytes
+Electrical Current Probe
+	Description: DEF
+	Location: <OUT OF SPEC>
+	Status: <OUT OF SPEC>
+	Maximum Value: Unknown
+	Minimum Value: Unknown
+	Resolution: Unknown
+	Tolerance: Unknown
+	Accuracy: Unknown
+	OEM-specific Information: 0x00000000
+	Nominal Value: Unknown
+
+Handle 0x0059, DMI type 36, 16 bytes
+Management Device Threshold Data
+
+Handle 0x005A, DMI type 35, 11 bytes
+Management Device Component
+	Description: To Be Filled By O.E.M.
+	Management Device Handle: 0x0045
+	Component Handle: 0x0057
+	Threshold Handle: 0x0055
+
+Handle 0x005B, DMI type 29, 22 bytes
+Electrical Current Probe
+	Description: GHI
+	Location: <OUT OF SPEC>
+	Status: <OUT OF SPEC>
+	Maximum Value: Unknown
+	Minimum Value: Unknown
+	Resolution: Unknown
+	Tolerance: Unknown
+	Accuracy: Unknown
+	OEM-specific Information: 0x00000000
+	Nominal Value: Unknown
+
+Handle 0x005C, DMI type 36, 16 bytes
+Management Device Threshold Data
+
+Handle 0x005D, DMI type 35, 11 bytes
+Management Device Component
+	Description: To Be Filled By O.E.M.
+	Management Device Handle: 0x0045
+	Component Handle: 0x005A
+	Threshold Handle: 0x0055
+
+Handle 0x005E, DMI type 39, 22 bytes
+System Power Supply
+	Power Unit Group: 1
+	Location: To Be Filled By O.E.M.
+	Name: To Be Filled By O.E.M.
+	Manufacturer: To Be Filled By O.E.M.
+	Serial Number: To Be Filled By O.E.M.
+	Asset Tag: To Be Filled By O.E.M.
+	Model Part Number: To Be Filled By O.E.M.
+	Revision: To Be Filled By O.E.M.
+	Max Power Capacity: Unknown
+	Status: Not Present
+	Type: <OUT OF SPEC>
+	Input Voltage Range Switching: <OUT OF SPEC>
+	Plugged: Yes
+	Hot Replaceable: No
+	Input Voltage Probe Handle: 0x0035
+	Cooling Device Handle: 0x003B
+	Input Current Probe Handle: 0x0041
+
+Handle 0x005F, DMI type 41, 11 bytes
+Onboard Device
+	Reference Designation:  Onboard IGD
+	Type: Video
+	Status: Enabled
+	Type Instance: 1
+	Bus Address: 0000:00:02.0
+
+Handle 0x0060, DMI type 41, 11 bytes
+Onboard Device
+	Reference Designation:  Onboard LAN
+	Type: Ethernet
+	Status: Enabled
+	Type Instance: 1
+	Bus Address: 0000:00:19.0
+
+Handle 0x0061, DMI type 41, 11 bytes
+Onboard Device
+	Reference Designation:  Onboard 1394
+	Type: Other
+	Status: Enabled
+	Type Instance: 1
+	Bus Address: 0000:03:1c.2
+
+Handle 0x0062, DMI type 139, 54 bytes
+OEM-specific Type
+	Header and Data:
+		8B 36 62 00 00 1E 8C 00 00 44 9A AD 04 04 32 55
+		F8 00 A2 02 A1 00 40 63 43 10 FE 81 03 DF 40 B2
+		00 20 00 73 3C 10 08 00 00 00 00 00 00 00 00 00
+		00 00 00 00 00 01
+	Strings:
+		V1394GUID
+
+Handle 0x0063, DMI type 13, 22 bytes
+BIOS Language Information
+	Installable Languages: 6
+		eng
+		fra
+		ger
+		chs
+		chi
+		jpn
+	Currently Installed Language: eng
+
+Handle 0x0064, DMI type 127, 4 bytes
+End Of Table
+
diff --git a/t/inventory/generic/dmidecode/memory.t b/t/inventory/generic/dmidecode/memory.t
index 41ab935..37067c5 100755
--- a/t/inventory/generic/dmidecode/memory.t
+++ b/t/inventory/generic/dmidecode/memory.t
@@ -930,6 +930,46 @@ my %tests = (
             CAPACITY         => '2048'
         }
     ],
+    'windows-7' => [
+        {
+            NUMSLOTS         => 1,
+            MEMORYCORRECTION => 'None',
+            SERIALNUMBER     => 'SerNum0',
+            DESCRIPTION      => 'DIMM (None)',
+            TYPE             => 'Unknown',
+            SPEED            => 'Unknown',
+            CAPTION          => 'DIMM0'
+        },
+        {
+            NUMSLOTS         => 2,
+            SERIALNUMBER     => '0000000',
+            TYPE             => '<OUT OF SPEC>',
+            SPEED            => '1600 MHz',
+            CAPTION          => 'DIMM1',
+            MEMORYCORRECTION => 'None',
+            DESCRIPTION      => 'DIMM (None)',
+            CAPACITY         => '2048'
+        },
+        {
+            NUMSLOTS         => 3,
+            MEMORYCORRECTION => 'None',
+            SERIALNUMBER     => 'SerNum2',
+            DESCRIPTION      => 'DIMM (None)',
+            TYPE             => 'Unknown',
+            SPEED            => 'Unknown',
+            CAPTION          => 'DIMM2'
+        },
+        {
+            NUMSLOTS         => 4,
+            SERIALNUMBER     => '0000000',
+            TYPE             => '<OUT OF SPEC>',
+            SPEED            => '1600 MHz',
+            CAPTION          => 'DIMM3',
+            MEMORYCORRECTION => 'None',
+            DESCRIPTION      => 'DIMM (None)',
+            CAPACITY         => '2048'
+        }
+    ],
     'windows-hyperV' => [
         {
             NUMSLOTS     => 1,
diff --git a/t/tools/generic.t b/t/tools/generic.t
index 6961deb..7ae2863 100755
--- a/t/tools/generic.t
+++ b/t/tools/generic.t
@@ -4805,6 +4805,869 @@ my %dmidecode_tests = (
                 'Ending Address' => '0x000FFFFFFFF'
             }
         ]
+    },
+    'windows-7' => {
+        '35' => [
+            {
+                'Threshold Handle' => '0x0035',
+                'Management Device Handle' => '0x0034',
+                'Description' => 'To Be Filled By O.E.M.',
+                'Component Handle' => '0x0034'
+            },
+            {
+                'Threshold Handle' => '0x0038',
+                'Management Device Handle' => '0x0034',
+                'Description' => 'To Be Filled By O.E.M.',
+                'Component Handle' => '0x0037'
+            },
+            {
+                'Threshold Handle' => '0x003B',
+                'Management Device Handle' => '0x0034',
+                'Description' => 'To Be Filled By O.E.M.',
+                'Component Handle' => '0x003A'
+            },
+            {
+                'Threshold Handle' => '0x003E',
+                'Management Device Handle' => '0x0034',
+                'Description' => 'To Be Filled By O.E.M.',
+                'Component Handle' => '0x003D'
+            },
+            {
+                'Threshold Handle' => '0x003E',
+                'Management Device Handle' => '0x0034',
+                'Description' => 'To Be Filled By O.E.M.',
+                'Component Handle' => '0x0040'
+            },
+            {
+                'Threshold Handle' => '0x0046',
+                'Management Device Handle' => '0x0045',
+                'Description' => 'To Be Filled By O.E.M.',
+                'Component Handle' => '0x0045'
+            },
+            {
+                'Threshold Handle' => '0x0049',
+                'Management Device Handle' => '0x0045',
+                'Description' => 'To Be Filled By O.E.M.',
+                'Component Handle' => '0x0048'
+            },
+            {
+                'Threshold Handle' => '0x004C',
+                'Management Device Handle' => '0x0045',
+                'Description' => 'To Be Filled By O.E.M.',
+                'Component Handle' => '0x004B'
+            },
+            {
+                'Threshold Handle' => '0x004F',
+                'Management Device Handle' => '0x0045',
+                'Description' => 'To Be Filled By O.E.M.',
+                'Component Handle' => '0x004E'
+            },
+            {
+                'Threshold Handle' => '0x0052',
+                'Management Device Handle' => '0x0045',
+                'Description' => 'To Be Filled By O.E.M.',
+                'Component Handle' => '0x0051'
+            },
+            {
+                'Threshold Handle' => '0x0055',
+                'Management Device Handle' => '0x0045',
+                'Description' => 'To Be Filled By O.E.M.',
+                'Component Handle' => '0x0054'
+            },
+            {
+                'Threshold Handle' => '0x0055',
+                'Management Device Handle' => '0x0045',
+                'Description' => 'To Be Filled By O.E.M.',
+                'Component Handle' => '0x0057'
+            },
+            {
+                'Threshold Handle' => '0x0055',
+                'Management Device Handle' => '0x0045',
+                'Description' => 'To Be Filled By O.E.M.',
+                'Component Handle' => '0x005A'
+            }
+        ],
+        '32' => [
+            {
+            'Status' => 'No errors detected'
+            }
+        ],
+        '11' => [
+            {
+            'String 1' => 'To Be Filled By O.E.M.'
+            }
+        ],
+        '7' => [
+            {
+                'Error Correction Type' => 'None',
+                'Installed Size' => '256 kB',
+                'Operational Mode' => 'Write Back',
+                'Socket Designation' => 'L1-Cache',
+                'Configuration' => 'Enabled, Not Socketed, Level 1',
+                'Installed SRAM Type' => 'Other',
+                'System Type' => 'Unified',
+                'Speed' => 'Unknown',
+                'Associativity' => '8-way Set-associative',
+                'Location' => 'Internal',
+                'Maximum Size' => '256 kB'
+            },
+            {
+                'Error Correction Type' => 'None',
+                'Installed Size' => '1024 kB',
+                'Operational Mode' => 'Varies With Memory Address',
+                'Socket Designation' => 'L2-Cache',
+                'Configuration' => 'Enabled, Not Socketed, Level 2',
+                'Installed SRAM Type' => 'Other',
+                'System Type' => 'Unified',
+                'Speed' => 'Unknown',
+                'Associativity' => '8-way Set-associative',
+                'Location' => 'Internal',
+                'Maximum Size' => '1024 kB'
+            },
+            {
+                'Error Correction Type' => 'None',
+                'Installed Size' => '6144 kB',
+                'Operational Mode' => 'Unknown',
+                'Socket Designation' => 'L3-Cache',
+                'Configuration' => 'Disabled, Not Socketed, Level 3',
+                'Installed SRAM Type' => 'Other',
+                'System Type' => 'Unified',
+                'Speed' => 'Unknown',
+                'Associativity' => 'Other',
+                'Location' => 'Internal',
+                'Maximum Size' => '6144 kB'
+            }
+        ],
+        '26' => [
+            {
+                'Nominal Value' => 'Unknown',
+                'Status' => '<OUT OF SPEC>',
+                'Minimum Value' => 'Unknown',
+                'OEM-specific Information' => '0x00000000',
+                'Accuracy' => 'Unknown',
+                'Maximum Value' => 'Unknown',
+                'Resolution' => 'Unknown',
+                'Location' => '<OUT OF SPEC>',
+                'Tolerance' => 'Unknown',
+                'Description' => 'LM78A'
+            },
+            {
+                'Nominal Value' => 'Unknown',
+                'Status' => '<OUT OF SPEC>',
+                'Minimum Value' => 'Unknown',
+                'OEM-specific Information' => '0x00000000',
+                'Accuracy' => 'Unknown',
+                'Maximum Value' => 'Unknown',
+                'Resolution' => 'Unknown',
+                'Location' => '<OUT OF SPEC>',
+                'Tolerance' => 'Unknown',
+                'Description' => 'LM78B'
+            },
+            {
+                'Nominal Value' => 'Unknown',
+                'Status' => '<OUT OF SPEC>',
+                'Minimum Value' => 'Unknown',
+                'OEM-specific Information' => '0x00000000',
+                'Accuracy' => 'Unknown',
+                'Maximum Value' => 'Unknown',
+                'Resolution' => 'Unknown',
+                'Location' => '<OUT OF SPEC>',
+                'Tolerance' => 'Unknown',
+                'Description' => 'LM78B'
+            }
+        ],
+        '17' => [
+            {
+                'Part Number' => 'Array1_PartNumber0',
+                'Serial Number' => 'SerNum0',
+                'Type Detail' => 'Synchronous',
+                'Set' => 'None',
+                'Type' => 'Unknown',
+                'Speed' => 'Unknown',
+                'Size' => 'No Module Installed',
+                'Manufacturer' => 'Manufacturer0',
+                'Bank Locator' => 'BANK0',
+                'Array Handle' => '0x0024',
+                'Data Width' => '64 bits',
+                'Total Width' => '64 bits',
+                'Asset Tag' => 'AssetTagNum0',
+                'Rank' => 'Unknown',
+                'Locator' => 'DIMM0',
+                'Error Information Handle' => 'No Error',
+                'Form Factor' => 'DIMM'
+            },
+            {
+                'Part Number' => 'F3-12800CL9-2GBXL',
+                'Serial Number' => '0000000',
+                'Type Detail' => 'Synchronous',
+                'Set' => 'None',
+                'Type' => '<OUT OF SPEC>',
+                'Speed' => '1600 MHz',
+                'Size' => '2048 MB',
+                'Manufacturer' => 'Undefined',
+                'Bank Locator' => 'BANK1',
+                'Array Handle' => '0x0024',
+                'Data Width' => '64 bits',
+                'Total Width' => '64 bits',
+                'Asset Tag' => 'AssetTagNum1',
+                'Rank' => '2',
+                'Locator' => 'DIMM1',
+                'Error Information Handle' => 'No Error',
+                'Form Factor' => 'DIMM'
+            },
+            {
+                'Part Number' => 'Array1_PartNumber2',
+                'Serial Number' => 'SerNum2',
+                'Type Detail' => 'Synchronous',
+                'Set' => 'None',
+                'Type' => 'Unknown',
+                'Speed' => 'Unknown',
+                'Size' => 'No Module Installed',
+                'Manufacturer' => 'Manufacturer2',
+                'Bank Locator' => 'BANK2',
+                'Array Handle' => '0x0024',
+                'Data Width' => '64 bits',
+                'Total Width' => '64 bits',
+                'Asset Tag' => 'AssetTagNum2',
+                'Rank' => 'Unknown',
+                'Locator' => 'DIMM2',
+                'Error Information Handle' => 'No Error',
+                'Form Factor' => 'DIMM'
+            },
+            {
+                'Part Number' => 'F3-12800CL9-2GBXL',
+                'Serial Number' => '0000000',
+                'Type Detail' => 'Synchronous',
+                'Set' => 'None',
+                'Type' => '<OUT OF SPEC>',
+                'Speed' => '1600 MHz',
+                'Size' => '2048 MB',
+                'Manufacturer' => 'Undefined',
+                'Bank Locator' => 'BANK3',
+                'Array Handle' => '0x0024',
+                'Data Width' => '64 bits',
+                'Total Width' => '64 bits',
+                'Asset Tag' => 'AssetTagNum3',
+                'Rank' => '2',
+                'Locator' => 'DIMM3',
+                'Error Information Handle' => 'No Error',
+                'Form Factor' => 'DIMM'
+            }
+        ],
+        '2' => [
+            {
+                'Product Name' => 'P8P67',
+                'Chassis Handle' => '0x0003',
+                'Serial Number' => 'MT7013K30709271',
+                'Asset Tag' => 'To be filled by O.E.M.',
+                'Version' => 'Rev 1.xx',
+                'Type' => 'Motherboard',
+                'Manufacturer' => 'ASUSTeK Computer INC.',
+                'Location In Chassis' => 'To be filled by O.E.M.',
+                'Contained Object Handles' => '0'
+            }
+        ],
+        '1' => [
+            {
+                'Product Name' => 'System Product Name',
+                'Family' => 'To be filled by O.E.M.',
+                'Serial Number' => 'System Serial Number',
+                'Version' => 'System Version',
+                'Wake-up Type' => 'Power Switch',
+                'SKU Number' => 'To be filled by O.E.M.',
+                'Manufacturer' => 'System manufacturer',
+                'UUID' => '1E00E6E0-008C-4400-9AAD-F46D04972D3E'
+            }
+        ],
+        '18' => [
+            {
+                'Memory Array Address' => 'Unknown',
+                'Vendor Syndrome' => 'Unknown',
+                'Granularity' => 'Unknown',
+                'Type' => 'OK',
+                'Resolution' => 'Unknown',
+                'Device Address' => 'Unknown',
+                'Operation' => 'Unknown'
+            },
+            {
+                'Memory Array Address' => 'Unknown',
+                'Vendor Syndrome' => 'Unknown',
+                'Granularity' => 'Unknown',
+                'Type' => 'OK',
+                'Resolution' => 'Unknown',
+                'Device Address' => 'Unknown',
+                'Operation' => 'Unknown'
+            },
+            {
+                'Memory Array Address' => 'Unknown',
+                'Vendor Syndrome' => 'Unknown',
+                'Granularity' => 'Unknown',
+                'Type' => 'OK',
+                'Resolution' => 'Unknown',
+                'Device Address' => 'Unknown',
+                'Operation' => 'Unknown'
+            },
+            {
+                'Memory Array Address' => 'Unknown',
+                'Vendor Syndrome' => 'Unknown',
+                'Granularity' => 'Unknown',
+                'Type' => 'OK',
+                'Resolution' => 'Unknown',
+                'Device Address' => 'Unknown',
+                'Operation' => 'Unknown'
+            },
+            {
+                'Memory Array Address' => 'Unknown',
+                'Vendor Syndrome' => 'Unknown',
+                'Granularity' => 'Unknown',
+                'Type' => 'OK',
+                'Resolution' => 'Unknown',
+                'Device Address' => 'Unknown',
+                'Operation' => 'Unknown'
+            }
+        ],
+        '0' => [
+            {
+                'Runtime Size' => '64 kB',
+                'Version' => '1503',
+                'BIOS Revision' => '4.6',
+                'Address' => '0xF0000',
+                'ROM Size' => '4096 kB',
+                'Release Date' => '03/10/2011',
+                'Vendor' => 'American Megatrends Inc.'
+            }
+        ],
+        '13' => [
+            {
+                'Installable Languages' => '6',
+                'Currently Installed Language' => 'eng'
+            }
+        ],
+        '16' => [
+            {
+                'Number Of Devices' => '4',
+                'Error Correction Type' => 'None',
+                'Error Information Handle' => 'No Error',
+                'Location' => 'System Board Or Motherboard',
+                'Maximum Capacity' => '32 GB',
+                'Use' => 'System Memory'
+            }
+        ],
+        '29' => [
+            {
+                'Nominal Value' => 'Unknown',
+                'Status' => '<OUT OF SPEC>',
+                'Minimum Value' => 'Unknown',
+                'OEM-specific Information' => '0x00000000',
+                'Accuracy' => 'Unknown',
+                'Maximum Value' => 'Unknown',
+                'Resolution' => 'Unknown',
+                'Location' => '<OUT OF SPEC>',
+                'Tolerance' => 'Unknown',
+                'Description' => 'ABC'
+            },
+            {
+                'Nominal Value' => 'Unknown',
+                'Status' => '<OUT OF SPEC>',
+                'Minimum Value' => 'Unknown',
+                'OEM-specific Information' => '0x00000000',
+                'Accuracy' => 'Unknown',
+                'Maximum Value' => 'Unknown',
+                'Resolution' => 'Unknown',
+                'Location' => '<OUT OF SPEC>',
+                'Tolerance' => 'Unknown',
+                'Description' => 'DEF'
+            },
+            {
+                'Nominal Value' => 'Unknown',
+                'Status' => '<OUT OF SPEC>',
+                'Minimum Value' => 'Unknown',
+                'OEM-specific Information' => '0x00000000',
+                'Accuracy' => 'Unknown',
+                'Maximum Value' => 'Unknown',
+                'Resolution' => 'Unknown',
+                'Location' => '<OUT OF SPEC>',
+                'Tolerance' => 'Unknown',
+                'Description' => 'GHI'
+            }
+        ],
+        '27' => [
+            {
+                'Temperature Probe Handle' => '0x0038',
+                'Type' => '<OUT OF SPEC>',
+                'Status' => '<OUT OF SPEC>',
+                'OEM-specific Information' => '0x00000000',
+                'Cooling Unit Group' => '1',
+                'Nominal Speed' => 'Unknown Or Non-rotating'
+            },
+            {
+                'Temperature Probe Handle' => '0x0038',
+                'Type' => '<OUT OF SPEC>',
+                'Status' => '<OUT OF SPEC>',
+                'OEM-specific Information' => '0x00000000',
+                'Cooling Unit Group' => '1',
+                'Nominal Speed' => 'Unknown Or Non-rotating'
+            },
+            {
+                'Temperature Probe Handle' => '0x004C',
+                'Type' => '<OUT OF SPEC>',
+                'Status' => '<OUT OF SPEC>',
+                'OEM-specific Information' => '0x00000000',
+                'Cooling Unit Group' => '1',
+                'Nominal Speed' => 'Unknown Or Non-rotating'
+            },
+            {
+                'Temperature Probe Handle' => '0x0052',
+                'Type' => '<OUT OF SPEC>',
+                'Status' => '<OUT OF SPEC>',
+                'OEM-specific Information' => '0x00000000',
+                'Cooling Unit Group' => '1',
+                'Nominal Speed' => 'Unknown Or Non-rotating'
+            }
+        ],
+        '39' => [
+            {
+                'Input Voltage Probe Handle' => '0x0035',
+                'Revision' => 'To Be Filled By O.E.M.',
+                'Input Voltage Range Switching' => '<OUT OF SPEC>',
+                'Serial Number' => 'To Be Filled By O.E.M.',
+                'Hot Replaceable' => 'No',
+                'Asset Tag' => 'To Be Filled By O.E.M.',
+                'Input Current Probe Handle' => '0x0041',
+                'Type' => '<OUT OF SPEC>',
+                'Model Part Number' => 'To Be Filled By O.E.M.',
+                'Cooling Device Handle' => '0x003B',
+                'Plugged' => 'Yes',
+                'Power Unit Group' => '1',
+                'Location' => 'To Be Filled By O.E.M.',
+                'Manufacturer' => 'To Be Filled By O.E.M.',
+                'Name' => 'To Be Filled By O.E.M.',
+                'Max Power Capacity' => 'Unknown'
+            },
+            {
+                'Input Voltage Probe Handle' => '0x0035',
+                'Revision' => 'To Be Filled By O.E.M.',
+                'Input Voltage Range Switching' => '<OUT OF SPEC>',
+                'Serial Number' => 'To Be Filled By O.E.M.',
+                'Hot Replaceable' => 'No',
+                'Asset Tag' => 'To Be Filled By O.E.M.',
+                'Input Current Probe Handle' => '0x0041',
+                'Type' => '<OUT OF SPEC>',
+                'Model Part Number' => 'To Be Filled By O.E.M.',
+                'Cooling Device Handle' => '0x003B',
+                'Plugged' => 'Yes',
+                'Power Unit Group' => '1',
+                'Location' => 'To Be Filled By O.E.M.',
+                'Manufacturer' => 'To Be Filled By O.E.M.',
+                'Name' => 'To Be Filled By O.E.M.',
+                'Max Power Capacity' => 'Unknown'
+            }
+        ],
+        '28' => [
+            {
+                'Nominal Value' => 'Unknown',
+                'Status' => '<OUT OF SPEC>',
+                'Minimum Value' => 'Unknown',
+                'OEM-specific Information' => '0x00000000',
+                'Accuracy' => 'Unknown',
+                'Maximum Value' => 'Unknown',
+                'Resolution' => 'Unknown',
+                'Location' => '<OUT OF SPEC>',
+                'Tolerance' => 'Unknown',
+                'Description' => 'LM78A'
+            },
+            {
+                'Nominal Value' => 'Unknown',
+                'Status' => '<OUT OF SPEC>',
+                'Minimum Value' => 'Unknown',
+                'OEM-specific Information' => '0x00000000',
+                'Accuracy' => 'Unknown',
+                'Maximum Value' => 'Unknown',
+                'Resolution' => 'Unknown',
+                'Location' => '<OUT OF SPEC>',
+                'Tolerance' => 'Unknown',
+                'Description' => 'LM78B'
+            },
+            {
+                'Nominal Value' => 'Unknown',
+                'Status' => '<OUT OF SPEC>',
+                'Minimum Value' => 'Unknown',
+                'OEM-specific Information' => '0x00000000',
+                'Accuracy' => 'Unknown',
+                'Maximum Value' => 'Unknown',
+                'Resolution' => 'Unknown',
+                'Location' => '<OUT OF SPEC>',
+                'Tolerance' => 'Unknown',
+                'Description' => 'LM78B'
+            }
+        ],
+        '36' => [
+            {
+                'Lower Non-critical Threshold' => '1',
+                'Upper Critical Threshold' => '4',
+                'Lower Critical Threshold' => '3',
+                'Lower Non-recoverable Threshold' => '5',
+                'Upper Non-recoverable Threshold' => '6',
+                'Upper Non-critical Threshold' => '2'
+            },
+            {
+                'Lower Non-critical Threshold' => '1',
+                'Upper Critical Threshold' => '4',
+                'Lower Critical Threshold' => '3',
+                'Lower Non-recoverable Threshold' => '5',
+                'Upper Non-recoverable Threshold' => '6',
+                'Upper Non-critical Threshold' => '2'
+            },
+            {
+                'Lower Non-critical Threshold' => '1',
+                'Upper Critical Threshold' => '4',
+                'Lower Critical Threshold' => '3',
+                'Lower Non-recoverable Threshold' => '5',
+                'Upper Non-recoverable Threshold' => '6',
+                'Upper Non-critical Threshold' => '2'
+            },
+            {
+                'Lower Non-critical Threshold' => '1',
+                'Upper Critical Threshold' => '4',
+                'Lower Critical Threshold' => '3',
+                'Lower Non-recoverable Threshold' => '5',
+                'Upper Non-recoverable Threshold' => '6',
+                'Upper Non-critical Threshold' => '2'
+            },
+            {
+                'Lower Non-critical Threshold' => '7',
+                'Upper Critical Threshold' => '10',
+                'Lower Critical Threshold' => '8',
+                'Lower Non-recoverable Threshold' => '11',
+                'Upper Non-recoverable Threshold' => '12',
+                'Upper Non-critical Threshold' => '8'
+            },
+            {
+                'Lower Non-critical Threshold' => '13',
+                'Upper Critical Threshold' => '16',
+                'Lower Critical Threshold' => '15',
+                'Lower Non-recoverable Threshold' => '17',
+                'Upper Non-recoverable Threshold' => '18',
+                'Upper Non-critical Threshold' => '14'
+            },
+            {
+                'Lower Non-critical Threshold' => '1',
+                'Upper Critical Threshold' => '4',
+                'Lower Critical Threshold' => '3',
+                'Lower Non-recoverable Threshold' => '5',
+                'Upper Non-recoverable Threshold' => '6',
+                'Upper Non-critical Threshold' => '2'
+            },
+            {
+                'Lower Non-critical Threshold' => '1',
+                'Upper Critical Threshold' => '4',
+                'Lower Critical Threshold' => '3',
+                'Lower Non-recoverable Threshold' => '5',
+                'Upper Non-recoverable Threshold' => '6',
+                'Upper Non-critical Threshold' => '2'
+            },
+            {
+                'Lower Non-critical Threshold' => '1',
+                'Upper Critical Threshold' => '4',
+                'Lower Critical Threshold' => '3',
+                'Lower Non-recoverable Threshold' => '5',
+                'Upper Non-recoverable Threshold' => '6',
+                'Upper Non-critical Threshold' => '2'
+            },
+            {
+                'Lower Non-critical Threshold' => '1',
+                'Upper Critical Threshold' => '4',
+                'Lower Critical Threshold' => '3',
+                'Lower Non-recoverable Threshold' => '5',
+                'Upper Non-recoverable Threshold' => '6',
+                'Upper Non-critical Threshold' => '2'
+            }
+        ],
+        '3' => [
+            {
+                'Height' => 'Unspecified',
+                'Power Supply State' => 'Safe',
+                'Serial Number' => 'Chassis Serial Number',
+                'Thermal State' => 'Safe',
+                'Contained Elements' => '0',
+                'Asset Tag' => 'Asset-1234567890',
+                'Type' => 'Desktop',
+                'Version' => 'Chassis Version',
+                'Number Of Power Cords' => '1',
+                'Security Status' => 'None',
+                'OEM Information' => '0x00000000',
+                'Manufacturer' => 'Chassis Manufacture',
+                'Boot-up State' => 'Safe'
+            }
+        ],
+        '9' => [
+            {
+                'Bus Address' => '0000:00:01.0',
+                'ID' => '1',
+                'Length' => 'Short',
+                'Designation' => 'PCIEX16_1',
+                'Type' => '32-bit PCI Express',
+                'Current Usage' => 'In Use'
+            },
+            {
+                'Bus Address' => '0000:00:1c.3',
+                'ID' => '2',
+                'Length' => 'Short',
+                'Designation' => 'PCIEX1_1',
+                'Type' => '32-bit PCI Express',
+                'Current Usage' => 'In Use'
+            },
+            {
+                'Bus Address' => '0000:00:1c.4',
+                'ID' => '3',
+                'Length' => 'Short',
+                'Designation' => 'PCIEX1_2',
+                'Type' => '32-bit PCI Express',
+                'Current Usage' => 'In Use'
+            },
+            {
+                'Bus Address' => '0000:00:1c.6',
+                'ID' => '4',
+                'Length' => 'Short',
+                'Designation' => 'PCI1',
+                'Type' => '32-bit PCI',
+                'Current Usage' => 'In Use'
+            }
+        ],
+        '41' => [
+            {
+                'Bus Address' => '0000:00:02.0',
+                'Type' => 'Video',
+                'Reference Designation' => ' Onboard IGD',
+                'Type Instance' => '1',
+                'Status' => 'Enabled'
+            },
+            {
+                'Bus Address' => '0000:00:19.0',
+                'Type' => 'Ethernet',
+                'Reference Designation' => ' Onboard LAN',
+                'Type Instance' => '1',
+                'Status' => 'Enabled'
+            },
+            {
+                'Bus Address' => '0000:03:1c.2',
+                'Type' => 'Other',
+                'Reference Designation' => ' Onboard 1394',
+                'Type Instance' => '1',
+                'Status' => 'Enabled'
+            }
+        ],
+        '12' => [
+            {
+                'Option 1' => 'To Be Filled By O.E.M.'
+            }
+        ],
+        '20' => [
+            {
+                'Memory Array Mapped Address Handle' => '0x0026',
+                'Range Size' => '2 GB',
+                'Physical Device Handle' => '0x002A',
+                'Partition Row Position' => '1',
+                'Starting Address' => '0x00000000000',
+                'Ending Address' => '0x0007FFFFFFF'
+            },
+            {
+                'Memory Array Mapped Address Handle' => '0x0026',
+                'Range Size' => '2 GB',
+                'Physical Device Handle' => '0x0030',
+                'Partition Row Position' => '1',
+                'Starting Address' => '0x00080000000',
+                'Ending Address' => '0x000FFFFFFFF'
+            }
+        ],
+        '8' => [
+            {
+                'External Reference Designator' => 'PS/2 Keyboard',
+                'Port Type' => 'Keyboard Port',
+                'External Connector Type' => 'PS/2',
+                'Internal Reference Designator' => 'PS/2 Keyboard',
+                'Internal Connector Type' => 'None'
+            },
+            {
+                'External Reference Designator' => 'USB9_10',
+                'Port Type' => 'USB',
+                'External Connector Type' => 'Access Bus (USB)',
+                'Internal Reference Designator' => 'USB9_10',
+                'Internal Connector Type' => 'None'
+            },
+            {
+                'External Reference Designator' => 'USB11_12',
+                'Port Type' => 'USB',
+                'External Connector Type' => 'Access Bus (USB)',
+                'Internal Reference Designator' => 'USB11_12',
+                'Internal Connector Type' => 'None'
+            },
+            {
+                'External Reference Designator' => 'GbE LAN',
+                'Port Type' => 'Network Port',
+                'External Connector Type' => 'RJ-45',
+                'Internal Reference Designator' => 'GbE LAN',
+                'Internal Connector Type' => 'None'
+            },
+            {
+                'External Reference Designator' => 'AUDIO',
+                'Port Type' => 'Audio Port',
+                'External Connector Type' => 'Other',
+                'Internal Reference Designator' => 'AUDIO',
+                'Internal Connector Type' => 'None'
+            },
+            {
+                'Port Type' => 'SATA',
+                'External Connector Type' => 'None',
+                'Internal Reference Designator' => 'SATA1',
+                'Internal Connector Type' => 'SAS/SATA Plug Receptacle'
+            },
+            {
+                'Port Type' => 'SATA',
+                'External Connector Type' => 'None',
+                'Internal Reference Designator' => 'SATA2',
+                'Internal Connector Type' => 'SAS/SATA Plug Receptacle'
+            },
+            {
+                'Port Type' => 'SATA',
+                'External Connector Type' => 'None',
+                'Internal Reference Designator' => 'SATA3',
+                'Internal Connector Type' => 'SAS/SATA Plug Receptacle'
+            },
+            {
+                'Port Type' => 'SATA',
+                'External Connector Type' => 'None',
+                'Internal Reference Designator' => 'SATA4',
+                'Internal Connector Type' => 'SAS/SATA Plug Receptacle'
+            },
+            {
+                'Port Type' => 'SATA',
+                'External Connector Type' => 'None',
+                'Internal Reference Designator' => 'SATA5',
+                'Internal Connector Type' => 'SAS/SATA Plug Receptacle'
+            },
+            {
+                'Port Type' => 'SATA',
+                'External Connector Type' => 'None',
+                'Internal Reference Designator' => 'SATA6',
+                'Internal Connector Type' => 'SAS/SATA Plug Receptacle'
+            },
+            {
+                'Port Type' => 'USB',
+                'External Connector Type' => 'None',
+                'Internal Reference Designator' => 'USB1_2',
+                'Internal Connector Type' => 'Access Bus (USB)'
+            },
+            {
+                'Port Type' => 'USB',
+                'External Connector Type' => 'None',
+                'Internal Reference Designator' => 'USB3_4',
+                'Internal Connector Type' => 'Access Bus (USB)'
+            },
+            {
+                'Port Type' => 'USB',
+                'External Connector Type' => 'None',
+                'Internal Reference Designator' => 'USB5_6',
+                'Internal Connector Type' => 'Access Bus (USB)'
+            },
+            {
+                'Port Type' => 'USB',
+                'External Connector Type' => 'None',
+                'Internal Reference Designator' => 'USB7_8',
+                'Internal Connector Type' => 'Access Bus (USB)'
+            },
+            {
+                'Port Type' => 'Audio Port',
+                'External Connector Type' => 'None',
+                'Internal Reference Designator' => 'AAFP',
+                'Internal Connector Type' => 'Mini Jack (headphones)'
+            },
+            {
+                'Port Type' => 'Other',
+                'External Connector Type' => 'None',
+                'Internal Reference Designator' => 'CPU_FAN',
+                'Internal Connector Type' => 'Other'
+            },
+            {
+                'Port Type' => 'Other',
+                'External Connector Type' => 'None',
+                'Internal Reference Designator' => 'CHA_FAN1',
+                'Internal Connector Type' => 'Other'
+            },
+            {
+                'Port Type' => 'Other',
+                'External Connector Type' => 'None',
+                'Internal Reference Designator' => 'PWR_FAN',
+                'Internal Connector Type' => 'Other'
+            },
+            {
+                'Port Type' => 'Other',
+                'External Connector Type' => 'None',
+                'Internal Reference Designator' => 'PATA_IDE',
+                'Internal Connector Type' => 'On Board IDE'
+            },
+            {
+                'Port Type' => 'SATA',
+                'External Connector Type' => 'None',
+                'Internal Reference Designator' => 'F_ESATA',
+                'Internal Connector Type' => 'SAS/SATA Plug Receptacle'
+            }
+        ],
+        '4' => [
+            {
+                'ID' => 'A7 06 02 00 FF FB EB BF',
+                'Socket Designation' => 'LGA1155',
+                'Part Number' => 'To Be Filled By O.E.M.',
+                'Status' => 'Populated, Enabled',
+                'Max Speed' => '3800 MHz',
+                'Serial Number' => 'To Be Filled By O.E.M.',
+                'Family' => 'Core 2 Duo',
+                'Current Speed' => '2800 MHz',
+                'L2 Cache Handle' => '0x0006',
+                'Type' => 'Central Processor',
+                'Signature' => 'Type 0, Family 6, Model 42, Stepping 7',
+                'L1 Cache Handle' => '0x0005',
+                'Manufacturer' => 'Intel',
+                'Core Enabled' => '1',
+                'External Clock' => '100 MHz',
+                'Asset Tag' => 'To Be Filled By O.E.M.',
+                'Version' => 'Intel(R) Core(TM) i5-2300 CPU @ 2.80GHz',
+                'Core Count' => '4',
+                'Upgrade' => 'Other',
+                'Voltage' => '1.0 V',
+                'L3 Cache Handle' => '0x0007'
+            }
+        ],
+        '34' => [
+            {
+                'Type' => 'LM78',
+                'Address Type' => 'I/O Port',
+                'Address' => '0x00000000',
+                'Description' => 'LM78-1'
+            },
+            {
+                'Type' => 'LM78',
+                'Address Type' => 'I/O Port',
+                'Address' => '0x00000000',
+                'Description' => '2'
+            }
+        ],
+        '10' => [
+            {
+                'Type' => 'Ethernet',
+                'Status' => 'Enabled',
+                'Description' => 'Onboard Ethernet'
+            }
+        ],
+        '19' => [
+            {
+                'Range Size' => '4 GB',
+                'Partition Width' => '0',
+                'Starting Address' => '0x00000000000',
+                'Physical Array Handle' => '0x0024',
+                'Ending Address' => '0x000FFFFFFFF'
+            }
+        ]
     }
 );
 
@@ -5071,6 +5934,30 @@ my %cpu_tests = (
             MANUFACTURER   => 'GenuineIntel',
             CORE           => undef
         }
+    ],
+    'windows-xppro' => [
+        {
+            ID             => '76 06 01 00 FF FB EB BF',
+            NAME           => 'Core 2 Duo',
+            EXTERNAL_CLOCK => '266',
+            SPEED          => '2534',
+            THREAD         => '2',
+            SERIAL         => undef,
+            MANUFACTURER   => 'Intel',
+            CORE           => '2'
+        }
+    ],
+    'windows-7' => [
+        {
+            ID             => 'A7 06 02 00 FF FB EB BF',
+            NAME           => 'Core 2 Duo',
+            EXTERNAL_CLOCK => '100',
+            SPEED          => '2800',
+            THREAD         => undef,
+            SERIAL         => 'To Be Filled By O.E.M.',
+            MANUFACTURER   => 'Intel',
+            CORE           => '4'
+        }
     ]
 );
 
@@ -5301,12 +6188,13 @@ foreach my $test (keys %dmidecode_tests) {
     my $file = "resources/generic/dmidecode/$test";
     my $infos = getDmidecodeInfos(file => $file);
     is_deeply($infos, $dmidecode_tests{$test}, "$test dmidecode parsing");
+    use Data::Dumper;
 }
 
 foreach my $test (keys %cpu_tests) {
     my $file = "resources/generic/dmidecode/$test";
     my @cpus = getCpusFromDmidecode(file => $file);
-    is_deeply(\@cpus, $cpu_tests{$test}, "$test dmidecode cpu extraction");
+    is_deeply(\@cpus, $cpu_tests{$test}, "$test dmidecode cpu extraction") or print Dumper(\@cpus);
 }
 
 foreach my $test (keys %lspci_tests) {


================================================================
  Commit: 68eaf8368066b2580a5eebfc6e64888b8c7a5db9
      https://github.com/fusinv/fusioninventory-agent/commit/68eaf8368066b2580a5eebfc6e64888b8c7a5db9
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-04 (Sun, 04 Mar 2012)

  Changed paths:
    M t/inventory/generic/dmidecode/memory.t

  Log Message:
  -----------
  cosmetics


diff --git a/t/inventory/generic/dmidecode/memory.t b/t/inventory/generic/dmidecode/memory.t
index 37067c5..b2c713b 100755
--- a/t/inventory/generic/dmidecode/memory.t
+++ b/t/inventory/generic/dmidecode/memory.t
@@ -10,901 +10,901 @@ use FusionInventory::Agent::Task::Inventory::Input::Generic::Dmidecode::Memory;
 my %tests = (
     'freebsd-6.2' => [
         {
-            NUMSLOTS     => 1,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'DIMM (None)',
-            SPEED        => 'Unknown',
-            TYPE         => 'Unknown',
-            CAPTION      => 'A0',
-            CAPACITY    => '512',
+            NUMSLOTS         => 1,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'DIMM (None)',
+            SPEED            => 'Unknown',
+            TYPE             => 'Unknown',
+            CAPTION          => 'A0',
+            CAPACITY         => '512',
             MEMORYCORRECTION => 'None'
 
         }
     ],
     'freebsd-8.1' => [
         {
-            NUMSLOTS     => 1,
-            SERIALNUMBER => '1A1541FC',
-            DESCRIPTION  => 'SODIMM (None)',
-            TYPE         => '<OUT OF SPEC>',
-            SPEED        => '1067 MHz',
-            CAPACITY     => '2048',
-            CAPTION      => 'Bottom - Slot 1',
+            NUMSLOTS         => 1,
+            SERIALNUMBER     => '1A1541FC',
+            DESCRIPTION      => 'SODIMM (None)',
+            TYPE             => '<OUT OF SPEC>',
+            SPEED            => '1067 MHz',
+            CAPACITY         => '2048',
+            CAPTION          => 'Bottom - Slot 1',
             MEMORYCORRECTION => 'None'
         },
         {
-            NUMSLOTS     => 2,
-            SERIALNUMBER => '1A554239',
-            DESCRIPTION  => 'SODIMM (None)',
-            TYPE         => '<OUT OF SPEC>',
-            SPEED        => '1067 MHz',
-            CAPACITY     => '2048',
-            CAPTION      => 'Bottom - Slot 2',
+            NUMSLOTS         => 2,
+            SERIALNUMBER     => '1A554239',
+            DESCRIPTION      => 'SODIMM (None)',
+            TYPE             => '<OUT OF SPEC>',
+            SPEED            => '1067 MHz',
+            CAPACITY         => '2048',
+            CAPTION          => 'Bottom - Slot 2',
             MEMORYCORRECTION => 'None'
 
         }
     ],
     'linux-1' => [
         {
-            NUMSLOTS     => 1,
-            SERIALNUMBER => 'SerNum00',
-            DESCRIPTION  => 'DIMM (None)',
-            TYPE         => 'DDR2',
-            SPEED        => '1066 MHz',
-            CAPACITY     => '1024',
-            CAPTION      => 'DIMM0',
+            NUMSLOTS         => 1,
+            SERIALNUMBER     => 'SerNum00',
+            DESCRIPTION      => 'DIMM (None)',
+            TYPE             => 'DDR2',
+            SPEED            => '1066 MHz',
+            CAPACITY         => '1024',
+            CAPTION          => 'DIMM0',
             MEMORYCORRECTION => 'None'
         },
         {
-            NUMSLOTS     => 2,
-            SERIALNUMBER => 'SerNum01',
-            DESCRIPTION  => 'DIMM (None)',
-            TYPE         => 'DDR2',
-            SPEED        => '1066 MHz',
-            CAPACITY     => '1024',
-            CAPTION      => 'DIMM1',
+            NUMSLOTS         => 2,
+            SERIALNUMBER     => 'SerNum01',
+            DESCRIPTION      => 'DIMM (None)',
+            TYPE             => 'DDR2',
+            SPEED            => '1066 MHz',
+            CAPACITY         => '1024',
+            CAPTION          => 'DIMM1',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 3,
-            SERIALNUMBER => 'SerNum02',
-            DESCRIPTION  => 'DIMM (None)',
-            TYPE         => 'DDR2',
-            SPEED        => '1066 MHz',
-            CAPACITY     => '1024',
-            CAPTION      => 'DIMM2',
+            NUMSLOTS         => 3,
+            SERIALNUMBER     => 'SerNum02',
+            DESCRIPTION      => 'DIMM (None)',
+            TYPE             => 'DDR2',
+            SPEED            => '1066 MHz',
+            CAPACITY         => '1024',
+            CAPTION          => 'DIMM2',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 4,
-            SERIALNUMBER => 'SerNum03',
-            DESCRIPTION  => 'DIMM (None)',
-            TYPE         => 'DDR2',
-            SPEED        => '1066 MHz',
-            CAPACITY     => '1024',
-            CAPTION      => 'DIMM3',
+            NUMSLOTS         => 4,
+            SERIALNUMBER     => 'SerNum03',
+            DESCRIPTION      => 'DIMM (None)',
+            TYPE             => 'DDR2',
+            SPEED            => '1066 MHz',
+            CAPACITY         => '1024',
+            CAPTION          => 'DIMM3',
             MEMORYCORRECTION => 'None'
 
         }
     ],
     'linux-2.6' => [
         {
-            NUMSLOTS     => 1,
-            SERIALNUMBER => '02132010',
-            DESCRIPTION  => 'DIMM (None)',
-            SPEED        => '533 MHz (1.9 ns)',
-            TYPE         => 'DDR',
-            CAPTION      => 'DIMM_A',
-            CAPACITY    => '1024',
+            NUMSLOTS         => 1,
+            SERIALNUMBER     => '02132010',
+            DESCRIPTION      => 'DIMM (None)',
+            SPEED            => '533 MHz (1.9 ns)',
+            TYPE             => 'DDR',
+            CAPTION          => 'DIMM_A',
+            CAPACITY         => '1024',
             MEMORYCORRECTION => 'None'
         },
         {
-            NUMSLOTS     => 2,
-            SERIALNUMBER => '02132216',
-            DESCRIPTION  => 'DIMM (None)',
-            SPEED        => '533 MHz (1.9 ns)',
-            TYPE         => 'DDR',
-            CAPTION      => 'DIMM_B',
-            CAPACITY    => '1024',
+            NUMSLOTS         => 2,
+            SERIALNUMBER     => '02132216',
+            DESCRIPTION      => 'DIMM (None)',
+            SPEED            => '533 MHz (1.9 ns)',
+            TYPE             => 'DDR',
+            CAPTION          => 'DIMM_B',
+            CAPACITY         => '1024',
             MEMORYCORRECTION => 'None'
         }
     ],
     'openbsd-3.7' => [
         {
-            NUMSLOTS     => 1,
-            TYPE         => 'Unknown'
+            NUMSLOTS         => 1,
+            TYPE             => 'Unknown'
         },
         {
-            NUMSLOTS     => 2,
-            TYPE         => 'DIMM SDRAM',
-            CAPACITY     => '64'
+            NUMSLOTS         => 2,
+            TYPE             => 'DIMM SDRAM',
+            CAPACITY         => '64'
         },
         {
-            NUMSLOTS     => 3,
-            TYPE         => 'Unknown'
+            NUMSLOTS         => 3,
+            TYPE             => 'Unknown'
         },
         {
-            NUMSLOTS     => 4,
-            TYPE         => 'DIMM SDRAM',
-            CAPACITY     => '64'
+            NUMSLOTS         => 4,
+            TYPE             => 'DIMM SDRAM',
+            CAPACITY         => '64'
         },
         {
-            NUMSLOTS     => 5,
-            TYPE         => 'DIMM SDRAM',
-            CAPACITY     => '64'
+            NUMSLOTS         => 5,
+            TYPE             => 'DIMM SDRAM',
+            CAPACITY         => '64'
         },
         {
-            NUMSLOTS     => 6,
-            TYPE         => 'Unknown'
+            NUMSLOTS         => 6,
+            TYPE             => 'Unknown'
         },
         {
-            NUMSLOTS     => 7,
-            TYPE         => 'Unknown'
+            NUMSLOTS         => 7,
+            TYPE             => 'Unknown'
         }
     ],
     'openbsd-3.8' => [
         {
-            NUMSLOTS     => 1,
-            SERIALNUMBER => '50075483',
-            DESCRIPTION  => 'DIMM (Multi-bit ECC)',
-            SPEED        => '400 MHz (2.5 ns)',
-            TYPE         => '<OUT OF SPEC>',
-            CAPTION      => 'DIMM1_A',
-            CAPACITY    => '512',
+            NUMSLOTS         => 1,
+            SERIALNUMBER     => '50075483',
+            DESCRIPTION      => 'DIMM (Multi-bit ECC)',
+            SPEED            => '400 MHz (2.5 ns)',
+            TYPE             => '<OUT OF SPEC>',
+            CAPTION          => 'DIMM1_A',
+            CAPACITY         => '512',
             MEMORYCORRECTION => 'Multi-bit ECC'
         },
         {
-            NUMSLOTS     => 2,
-            SERIALNUMBER => '500355A1',
-            DESCRIPTION  => 'DIMM (Multi-bit ECC)',
-            SPEED        => '400 MHz (2.5 ns)',
-            TYPE         => '<OUT OF SPEC>',
-            CAPTION      => 'DIMM1_B',
-            CAPACITY    => '512',
+            NUMSLOTS         => 2,
+            SERIALNUMBER     => '500355A1',
+            DESCRIPTION      => 'DIMM (Multi-bit ECC)',
+            SPEED            => '400 MHz (2.5 ns)',
+            TYPE             => '<OUT OF SPEC>',
+            CAPTION          => 'DIMM1_B',
+            CAPACITY         => '512',
             MEMORYCORRECTION => 'Multi-bit ECC'
         },
         {
-            NUMSLOTS     => 3,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (Multi-bit ECC)',
-            SPEED        => '400 MHz (2.5 ns)',
-            TYPE         => '<OUT OF SPEC>',
-            CAPTION      => 'DIMM2_A',
+            NUMSLOTS         => 3,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (Multi-bit ECC)',
+            SPEED            => '400 MHz (2.5 ns)',
+            TYPE             => '<OUT OF SPEC>',
+            CAPTION          => 'DIMM2_A',
             MEMORYCORRECTION => 'Multi-bit ECC'
         },
         {
-            NUMSLOTS     => 4,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (Multi-bit ECC)',
-            SPEED        => '400 MHz (2.5 ns)',
-            TYPE         => '<OUT OF SPEC>',
-            CAPTION      => 'DIMM2_B',
+            NUMSLOTS         => 4,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (Multi-bit ECC)',
+            SPEED            => '400 MHz (2.5 ns)',
+            TYPE             => '<OUT OF SPEC>',
+            CAPTION          => 'DIMM2_B',
             MEMORYCORRECTION => 'Multi-bit ECC'
 
         },
         {
-            NUMSLOTS     => 5,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (Multi-bit ECC)',
-            SPEED        => '400 MHz (2.5 ns)',
-            TYPE         => '<OUT OF SPEC>',
-            CAPTION      => 'DIMM3_A',
+            NUMSLOTS         => 5,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (Multi-bit ECC)',
+            SPEED            => '400 MHz (2.5 ns)',
+            TYPE             => '<OUT OF SPEC>',
+            CAPTION          => 'DIMM3_A',
             MEMORYCORRECTION => 'Multi-bit ECC'
         },
         {
-            NUMSLOTS     => 6,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (Multi-bit ECC)',
-            SPEED        => '400 MHz (2.5 ns)',
-            TYPE         => '<OUT OF SPEC>',
-            CAPTION      => 'DIMM3_B',
+            NUMSLOTS         => 6,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (Multi-bit ECC)',
+            SPEED            => '400 MHz (2.5 ns)',
+            TYPE             => '<OUT OF SPEC>',
+            CAPTION          => 'DIMM3_B',
             MEMORYCORRECTION => 'Multi-bit ECC'
         }
     ],
     'openbsd-4.5' => [
         {
-            NUMSLOTS     => 1,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (Multi-bit ECC)',
-            TYPE         => 'DDR',
-            SPEED        => '266 MHz',
-            CAPACITY     => '512',
-            CAPTION      => 'DIMM A',
+            NUMSLOTS         => 1,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (Multi-bit ECC)',
+            TYPE             => 'DDR',
+            SPEED            => '266 MHz',
+            CAPACITY         => '512',
+            CAPTION          => 'DIMM A',
             MEMORYCORRECTION => 'Multi-bit ECC'
 
         },
         {
-            NUMSLOTS     => 2,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (Multi-bit ECC)',
-            TYPE         => 'DDR',
-            SPEED        => '266 MHz',
-            CAPTION      => 'DIMM B',
+            NUMSLOTS         => 2,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (Multi-bit ECC)',
+            TYPE             => 'DDR',
+            SPEED            => '266 MHz',
+            CAPTION          => 'DIMM B',
             MEMORYCORRECTION => 'Multi-bit ECC'
 
         },
         {
-            NUMSLOTS     => 3,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (Multi-bit ECC)',
-            TYPE         => 'DDR',
-            SPEED        => '266 MHz',
-            CAPTION      => 'DIMM C',
+            NUMSLOTS         => 3,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (Multi-bit ECC)',
+            TYPE             => 'DDR',
+            SPEED            => '266 MHz',
+            CAPTION          => 'DIMM C',
             MEMORYCORRECTION => 'Multi-bit ECC'
 
         },
         {
-            NUMSLOTS     => 4,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (Multi-bit ECC)',
-            TYPE         => 'DDR',
-            SPEED        => '266 MHz',
-            CAPTION      => 'DIMM D',
+            NUMSLOTS         => 4,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (Multi-bit ECC)',
+            TYPE             => 'DDR',
+            SPEED            => '266 MHz',
+            CAPTION          => 'DIMM D',
             MEMORYCORRECTION => 'Multi-bit ECC'
 
         }
     ],
     'rhel-2.1' => [
         {
-            NUMSLOTS     => 1,
-            TYPE         => 'ECC DIMM SDRAM',
-            CAPACITY     => '256'
+            NUMSLOTS         => 1,
+            TYPE             => 'ECC DIMM SDRAM',
+            CAPACITY         => '256'
         },
         {
-            NUMSLOTS     => 2,
-            TYPE         => 'UNKNOWN'
+            NUMSLOTS         => 2,
+            TYPE             => 'UNKNOWN'
         }
     ],
     'rhel-3.4' => [
         {
-            NUMSLOTS     => 1,
-            SERIALNUMBER => '460360BB',
-            DESCRIPTION  => 'DIMM (Single-bit ECC)',
-            SPEED        => '400 MHz (2.5 ns)',
-            TYPE         => 'DDR',
-            CAPTION      => 'DIMM 1',
-            CAPACITY    => '512',
+            NUMSLOTS         => 1,
+            SERIALNUMBER     => '460360BB',
+            DESCRIPTION      => 'DIMM (Single-bit ECC)',
+            SPEED            => '400 MHz (2.5 ns)',
+            TYPE             => 'DDR',
+            CAPTION          => 'DIMM 1',
+            CAPACITY         => '512',
             MEMORYCORRECTION => 'Single-bit ECC'
         },
         {
-            NUMSLOTS     => 2,
-            SERIALNUMBER => '460360E8',
-            DESCRIPTION  => 'DIMM (Single-bit ECC)',
-            SPEED        => '400 MHz (2.5 ns)',
-            TYPE         => 'DDR',
-            CAPTION      => 'DIMM 2',
-            CAPACITY    => '512',
+            NUMSLOTS         => 2,
+            SERIALNUMBER     => '460360E8',
+            DESCRIPTION      => 'DIMM (Single-bit ECC)',
+            SPEED            => '400 MHz (2.5 ns)',
+            TYPE             => 'DDR',
+            CAPTION          => 'DIMM 2',
+            CAPACITY         => '512',
             MEMORYCORRECTION => 'Single-bit ECC'
         }
     ],
     'rhel-4.3' => [
         {
-            NUMSLOTS     => 1,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (Multi-bit ECC)',
-            SPEED        => undef,
-            TYPE         => 'DDR',
-            CAPTION      => 'DIMM1',
-            CAPACITY    => '512',
+            NUMSLOTS         => 1,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (Multi-bit ECC)',
+            SPEED            => undef,
+            TYPE             => 'DDR',
+            CAPTION          => 'DIMM1',
+            CAPACITY         => '512',
             MEMORYCORRECTION => 'Multi-bit ECC'
         },
         {
-            NUMSLOTS     => 2,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (Multi-bit ECC)',
-            SPEED        => undef,
-            TYPE         => 'DDR',
-            CAPTION      => 'DIMM2',
-            CAPACITY    => '512',
+            NUMSLOTS         => 2,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (Multi-bit ECC)',
+            SPEED            => undef,
+            TYPE             => 'DDR',
+            CAPTION          => 'DIMM2',
+            CAPACITY         => '512',
             MEMORYCORRECTION => 'Multi-bit ECC'
         },
         {
-            NUMSLOTS     => 3,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (Multi-bit ECC)',
-            SPEED        => undef,
-            TYPE         => 'DDR',
-            CAPTION      => 'DIMM3',
-            CAPACITY    => '512',
+            NUMSLOTS         => 3,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (Multi-bit ECC)',
+            SPEED            => undef,
+            TYPE             => 'DDR',
+            CAPTION          => 'DIMM3',
+            CAPACITY         => '512',
             MEMORYCORRECTION => 'Multi-bit ECC'
         },
         {
-            NUMSLOTS     => 4,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (Multi-bit ECC)',
-            SPEED        => undef,
-            TYPE         => 'DDR',
-            CAPTION      => 'DIMM4',
-            CAPACITY    => '512',
+            NUMSLOTS         => 4,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (Multi-bit ECC)',
+            SPEED            => undef,
+            TYPE             => 'DDR',
+            CAPTION          => 'DIMM4',
+            CAPACITY         => '512',
             MEMORYCORRECTION => 'Multi-bit ECC'
         }
     ],
     'rhel-4.6' => [
         {
-            NUMSLOTS     => 1,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => '<OUT OF SPEC> (Single-bit ECC)',
-            SPEED        => '667 MHz (1.5 ns)',
-            TYPE         => '<OUT OF SPEC>',
-            CAPTION      => 'DIMM 1A',
-            CAPACITY    => '512',
+            NUMSLOTS         => 1,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => '<OUT OF SPEC> (Single-bit ECC)',
+            SPEED            => '667 MHz (1.5 ns)',
+            TYPE             => '<OUT OF SPEC>',
+            CAPTION          => 'DIMM 1A',
+            CAPACITY         => '512',
             MEMORYCORRECTION => 'Single-bit ECC'
 
         },
         {
-            NUMSLOTS     => 2,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => '<OUT OF SPEC> (Single-bit ECC)',
-            SPEED        => '667 MHz (1.5 ns)',
-            TYPE         => '<OUT OF SPEC>',
-            CAPTION      => 'DIMM 2B',
-            CAPACITY    => '1024',
+            NUMSLOTS         => 2,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => '<OUT OF SPEC> (Single-bit ECC)',
+            SPEED            => '667 MHz (1.5 ns)',
+            TYPE             => '<OUT OF SPEC>',
+            CAPTION          => 'DIMM 2B',
+            CAPACITY         => '1024',
             MEMORYCORRECTION => 'Single-bit ECC'
         },
         {
-            NUMSLOTS     => 3,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => '<OUT OF SPEC> (Single-bit ECC)',
-            SPEED        => '667 MHz (1.5 ns)',
-            TYPE         => '<OUT OF SPEC>',
-            CAPTION      => 'DIMM 3C',
-            CAPACITY    => '1024',
+            NUMSLOTS         => 3,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => '<OUT OF SPEC> (Single-bit ECC)',
+            SPEED            => '667 MHz (1.5 ns)',
+            TYPE             => '<OUT OF SPEC>',
+            CAPTION          => 'DIMM 3C',
+            CAPACITY         => '1024',
             MEMORYCORRECTION => 'Single-bit ECC'
         },
         {
-            NUMSLOTS     => 4,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => '<OUT OF SPEC> (Single-bit ECC)',
-            SPEED        => 'Unknown',
-            TYPE         => '<OUT OF SPEC>',
-            CAPTION      => 'DIMM 4D',
+            NUMSLOTS         => 4,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => '<OUT OF SPEC> (Single-bit ECC)',
+            SPEED            => 'Unknown',
+            TYPE             => '<OUT OF SPEC>',
+            CAPTION          => 'DIMM 4D',
             MEMORYCORRECTION => 'Single-bit ECC'
         },
         {
-            NUMSLOTS     => 5,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => '<OUT OF SPEC> (Single-bit ECC)',
-            SPEED        => '667 MHz (1.5 ns)',
-            TYPE         => '<OUT OF SPEC>',
-            CAPTION      => 'DIMM 5A',
-            CAPACITY    => '512',
+            NUMSLOTS         => 5,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => '<OUT OF SPEC> (Single-bit ECC)',
+            SPEED            => '667 MHz (1.5 ns)',
+            TYPE             => '<OUT OF SPEC>',
+            CAPTION          => 'DIMM 5A',
+            CAPACITY         => '512',
             MEMORYCORRECTION => 'Single-bit ECC'
         },
         {
-            NUMSLOTS     => 6,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => '<OUT OF SPEC> (Single-bit ECC)',
-            SPEED        => '667 MHz (1.5 ns)',
-            TYPE         => '<OUT OF SPEC>',
-            CAPTION      => 'DIMM 6B',
-            CAPACITY    => '1024',
+            NUMSLOTS         => 6,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => '<OUT OF SPEC> (Single-bit ECC)',
+            SPEED            => '667 MHz (1.5 ns)',
+            TYPE             => '<OUT OF SPEC>',
+            CAPTION          => 'DIMM 6B',
+            CAPACITY         => '1024',
             MEMORYCORRECTION => 'Single-bit ECC'
         },
         {
-            NUMSLOTS     => 7,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => '<OUT OF SPEC> (Single-bit ECC)',
-            SPEED        => '667 MHz (1.5 ns)',
-            TYPE         => '<OUT OF SPEC>',
-            CAPTION      => 'DIMM 7C',
-            CAPACITY    => '1024',
+            NUMSLOTS         => 7,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => '<OUT OF SPEC> (Single-bit ECC)',
+            SPEED            => '667 MHz (1.5 ns)',
+            TYPE             => '<OUT OF SPEC>',
+            CAPTION          => 'DIMM 7C',
+            CAPACITY         => '1024',
             MEMORYCORRECTION => 'Single-bit ECC'
         },
         {
-            NUMSLOTS     => 8,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => '<OUT OF SPEC> (Single-bit ECC)',
-            SPEED        => 'Unknown',
-            TYPE         => '<OUT OF SPEC>',
-            CAPTION      => 'DIMM 8D',
+            NUMSLOTS         => 8,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => '<OUT OF SPEC> (Single-bit ECC)',
+            SPEED            => 'Unknown',
+            TYPE             => '<OUT OF SPEC>',
+            CAPTION          => 'DIMM 8D',
             MEMORYCORRECTION => 'Single-bit ECC'
         }
     ],
     'hp-dl180' => [
         {
-            NUMSLOTS     => 1,
-            SERIALNUMBER => '94D657D7',
-            DESCRIPTION  => 'DIMM (Single-bit ECC)',
-            TYPE         => '<OUT OF SPEC>',
-            SPEED        => '1333 MHz (0.8 ns)',
-            CAPACITY     => '2048',
-            CAPTION      => 'PROC 1 DIMM 2A',
+            NUMSLOTS         => 1,
+            SERIALNUMBER     => '94D657D7',
+            DESCRIPTION      => 'DIMM (Single-bit ECC)',
+            TYPE             => '<OUT OF SPEC>',
+            SPEED            => '1333 MHz (0.8 ns)',
+            CAPACITY         => '2048',
+            CAPTION          => 'PROC 1 DIMM 2A',
             MEMORYCORRECTION => 'Single-bit ECC'
 
         },
         {
-            NUMSLOTS     => 2,
-            SERIALNUMBER => 'SerNum01',
-            DESCRIPTION  => 'DIMM (Single-bit ECC)',
-            TYPE         => '<OUT OF SPEC>',
-            SPEED        => 'Unknown',
-            CAPTION      => 'PROC 1 DIMM 1D',
+            NUMSLOTS         => 2,
+            SERIALNUMBER     => 'SerNum01',
+            DESCRIPTION      => 'DIMM (Single-bit ECC)',
+            TYPE             => '<OUT OF SPEC>',
+            SPEED            => 'Unknown',
+            CAPTION          => 'PROC 1 DIMM 1D',
             MEMORYCORRECTION => 'Single-bit ECC'
         },
         {
-            NUMSLOTS     => 3,
-            SERIALNUMBER => '93D657D7',
-            DESCRIPTION  => 'DIMM (Single-bit ECC)',
-            TYPE         => '<OUT OF SPEC>',
-            SPEED        => '1333 MHz (0.8 ns)',
-            CAPACITY     => '2048',
-            CAPTION      => 'PROC 1 DIMM 4B',
+            NUMSLOTS         => 3,
+            SERIALNUMBER     => '93D657D7',
+            DESCRIPTION      => 'DIMM (Single-bit ECC)',
+            TYPE             => '<OUT OF SPEC>',
+            SPEED            => '1333 MHz (0.8 ns)',
+            CAPACITY         => '2048',
+            CAPTION          => 'PROC 1 DIMM 4B',
             MEMORYCORRECTION => 'Single-bit ECC'
         },
         {
-            NUMSLOTS     => 4,
-            SERIALNUMBER => 'SerNum03',
-            DESCRIPTION  => 'DIMM (Single-bit ECC)',
-            TYPE         => '<OUT OF SPEC>',
-            SPEED        => 'Unknown',
-            CAPTION      => 'PROC 1 DIMM 3E',
+            NUMSLOTS         => 4,
+            SERIALNUMBER     => 'SerNum03',
+            DESCRIPTION      => 'DIMM (Single-bit ECC)',
+            TYPE             => '<OUT OF SPEC>',
+            SPEED            => 'Unknown',
+            CAPTION          => 'PROC 1 DIMM 3E',
             MEMORYCORRECTION => 'Single-bit ECC'
         },
         {
-            NUMSLOTS     => 5,
-            SERIALNUMBER => 'SerNum04',
-            DESCRIPTION  => 'DIMM (Single-bit ECC)',
-            TYPE         => '<OUT OF SPEC>',
-            SPEED        => 'Unknown',
-            CAPTION      => 'PROC 1 DIMM 6C',
+            NUMSLOTS         => 5,
+            SERIALNUMBER     => 'SerNum04',
+            DESCRIPTION      => 'DIMM (Single-bit ECC)',
+            TYPE             => '<OUT OF SPEC>',
+            SPEED            => 'Unknown',
+            CAPTION          => 'PROC 1 DIMM 6C',
             MEMORYCORRECTION => 'Single-bit ECC'
         },
         {
-            NUMSLOTS     => 6,
-            SERIALNUMBER => 'SerNum05',
-            DESCRIPTION  => 'DIMM (Single-bit ECC)',
-            TYPE         => '<OUT OF SPEC>',
-            SPEED        => 'Unknown',
-            CAPTION      => 'PROC 1 DIMM 5F',
+            NUMSLOTS         => 6,
+            SERIALNUMBER     => 'SerNum05',
+            DESCRIPTION      => 'DIMM (Single-bit ECC)',
+            TYPE             => '<OUT OF SPEC>',
+            SPEED            => 'Unknown',
+            CAPTION          => 'PROC 1 DIMM 5F',
             MEMORYCORRECTION => 'Single-bit ECC'
         },
         {
-            NUMSLOTS     => 7,
-            SERIALNUMBER => 'SerNum06',
-            DESCRIPTION  => 'DIMM (Single-bit ECC)',
-            TYPE         => '<OUT OF SPEC>',
-            SPEED        => 'Unknown',
-            CAPTION      => 'PROC 2 DIMM 2A',
+            NUMSLOTS         => 7,
+            SERIALNUMBER     => 'SerNum06',
+            DESCRIPTION      => 'DIMM (Single-bit ECC)',
+            TYPE             => '<OUT OF SPEC>',
+            SPEED            => 'Unknown',
+            CAPTION          => 'PROC 2 DIMM 2A',
             MEMORYCORRECTION => 'Single-bit ECC'
         },
         {
-            NUMSLOTS     => 8,
-            SERIALNUMBER => 'SerNum07',
-            DESCRIPTION  => 'DIMM (Single-bit ECC)',
-            TYPE         => '<OUT OF SPEC>',
-            SPEED        => 'Unknown',
-            CAPTION      => 'PROC 2 DIMM 1D',
+            NUMSLOTS         => 8,
+            SERIALNUMBER     => 'SerNum07',
+            DESCRIPTION      => 'DIMM (Single-bit ECC)',
+            TYPE             => '<OUT OF SPEC>',
+            SPEED            => 'Unknown',
+            CAPTION          => 'PROC 2 DIMM 1D',
             MEMORYCORRECTION => 'Single-bit ECC'
         },
         {
-            NUMSLOTS     => 9,
-            SERIALNUMBER => 'SerNum08',
-            DESCRIPTION  => 'DIMM (Single-bit ECC)',
-            TYPE         => '<OUT OF SPEC>',
-            SPEED        => 'Unknown',
-            CAPTION      => 'PROC 2 DIMM 4B',
+            NUMSLOTS         => 9,
+            SERIALNUMBER     => 'SerNum08',
+            DESCRIPTION      => 'DIMM (Single-bit ECC)',
+            TYPE             => '<OUT OF SPEC>',
+            SPEED            => 'Unknown',
+            CAPTION          => 'PROC 2 DIMM 4B',
             MEMORYCORRECTION => 'Single-bit ECC'
         },
         {
-            NUMSLOTS     => 10,
-            SERIALNUMBER => 'SerNum09',
-            DESCRIPTION  => 'DIMM (Single-bit ECC)',
-            TYPE         => '<OUT OF SPEC>',
-            SPEED        => 'Unknown',
-            CAPTION      => 'PROC 2 DIMM 3E',
+            NUMSLOTS         => 10,
+            SERIALNUMBER     => 'SerNum09',
+            DESCRIPTION      => 'DIMM (Single-bit ECC)',
+            TYPE             => '<OUT OF SPEC>',
+            SPEED            => 'Unknown',
+            CAPTION          => 'PROC 2 DIMM 3E',
             MEMORYCORRECTION => 'Single-bit ECC'
         },
         {
-            NUMSLOTS     => 11,
-            SERIALNUMBER => 'SerNum10',
-            DESCRIPTION  => 'DIMM (Single-bit ECC)',
-            TYPE         => '<OUT OF SPEC>',
-            SPEED        => 'Unknown',
-            CAPTION      => 'PROC 2 DIMM 6C',
+            NUMSLOTS         => 11,
+            SERIALNUMBER     => 'SerNum10',
+            DESCRIPTION      => 'DIMM (Single-bit ECC)',
+            TYPE             => '<OUT OF SPEC>',
+            SPEED            => 'Unknown',
+            CAPTION          => 'PROC 2 DIMM 6C',
             MEMORYCORRECTION => 'Single-bit ECC'
         },
         {
-            NUMSLOTS     => 12,
-            SERIALNUMBER => 'SerNum11',
-            DESCRIPTION  => 'DIMM (Single-bit ECC)',
-            TYPE         => '<OUT OF SPEC>',
-            SPEED        => 'Unknown',
-            CAPTION      => 'PROC 2 DIMM 5F',
+            NUMSLOTS         => 12,
+            SERIALNUMBER     => 'SerNum11',
+            DESCRIPTION      => 'DIMM (Single-bit ECC)',
+            TYPE             => '<OUT OF SPEC>',
+            SPEED            => 'Unknown',
+            CAPTION          => 'PROC 2 DIMM 5F',
             MEMORYCORRECTION => 'Single-bit ECC'
         }
     ],
     'S3000AHLX' => [
         {
-            NUMSLOTS     => 1,
-            SERIALNUMBER => '0x750174F7',
-            DESCRIPTION  => 'DIMM (None)',
-            TYPE         => 'DDR2',
-            SPEED        => '533 MHz (1.9 ns)',
-            CAPACITY     => '1024',
-            CAPTION      => 'J8J1',
+            NUMSLOTS         => 1,
+            SERIALNUMBER     => '0x750174F7',
+            DESCRIPTION      => 'DIMM (None)',
+            TYPE             => 'DDR2',
+            SPEED            => '533 MHz (1.9 ns)',
+            CAPACITY         => '1024',
+            CAPTION          => 'J8J1',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 2,
-            SERIALNUMBER => '0x9DCCE4ED',
-            DESCRIPTION  => 'DIMM (None)',
-            TYPE         => 'DDR2',
-            SPEED        => '533 MHz (1.9 ns)',
-            CAPACITY     => '2048',
-            CAPTION      => 'J8J2',
+            NUMSLOTS         => 2,
+            SERIALNUMBER     => '0x9DCCE4ED',
+            DESCRIPTION      => 'DIMM (None)',
+            TYPE             => 'DDR2',
+            SPEED            => '533 MHz (1.9 ns)',
+            CAPACITY         => '2048',
+            CAPTION          => 'J8J2',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 3,
-            SERIALNUMBER => '0x750174FF',
-            DESCRIPTION  => 'DIMM (None)',
-            TYPE         => 'DDR2',
-            SPEED        => '533 MHz (1.9 ns)',
-            CAPACITY     => '1024',
-            CAPTION      => 'J9J1',
+            NUMSLOTS         => 3,
+            SERIALNUMBER     => '0x750174FF',
+            DESCRIPTION      => 'DIMM (None)',
+            TYPE             => 'DDR2',
+            SPEED            => '533 MHz (1.9 ns)',
+            CAPACITY         => '1024',
+            CAPTION          => 'J9J1',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 4,
-            SERIALNUMBER => 'NO DIMM',
-            DESCRIPTION  => 'DIMM (None)',
-            TYPE         => 'DDR2',
-            SPEED        => 'Unknown',
-            CAPTION      => 'J9J2',
+            NUMSLOTS         => 4,
+            SERIALNUMBER     => 'NO DIMM',
+            DESCRIPTION      => 'DIMM (None)',
+            TYPE             => 'DDR2',
+            SPEED            => 'Unknown',
+            CAPTION          => 'J9J2',
             MEMORYCORRECTION => 'None'
 
         }
     ],
     'S5000VSA' => [
         {
-            NUMSLOTS     => 1,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (Multi-bit ECC)',
-            TYPE         => 'DDR2',
-            SPEED        => '667 MHz (1.5 ns)',
-            CAPACITY     => '1024',
-            CAPTION      => 'ONBOARD DIMM_A1',
+            NUMSLOTS         => 1,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (Multi-bit ECC)',
+            TYPE             => 'DDR2',
+            SPEED            => '667 MHz (1.5 ns)',
+            CAPACITY         => '1024',
+            CAPTION          => 'ONBOARD DIMM_A1',
             MEMORYCORRECTION => 'Multi-bit ECC'
         },
         {
-            NUMSLOTS     => 2,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (Multi-bit ECC)',
-            TYPE         => 'DDR2',
-            SPEED        => '667 MHz (1.5 ns)',
-            CAPACITY     => '1024',
-            CAPTION      => 'ONBOARD DIMM_A2',
+            NUMSLOTS         => 2,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (Multi-bit ECC)',
+            TYPE             => 'DDR2',
+            SPEED            => '667 MHz (1.5 ns)',
+            CAPACITY         => '1024',
+            CAPTION          => 'ONBOARD DIMM_A2',
             MEMORYCORRECTION => 'Multi-bit ECC'
         },
         {
-            NUMSLOTS     => 3,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (Multi-bit ECC)',
-            TYPE         => 'DDR2',
-            SPEED        => '667 MHz (1.5 ns)',
-            CAPACITY     => '1024',
-            CAPTION      => 'ONBOARD DIMM_A3',
+            NUMSLOTS         => 3,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (Multi-bit ECC)',
+            TYPE             => 'DDR2',
+            SPEED            => '667 MHz (1.5 ns)',
+            CAPACITY         => '1024',
+            CAPTION          => 'ONBOARD DIMM_A3',
             MEMORYCORRECTION => 'Multi-bit ECC'
         },
         {
-            NUMSLOTS     => 4,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (Multi-bit ECC)',
-            TYPE         => 'DDR2',
-            SPEED        => '667 MHz (1.5 ns)',
-            CAPACITY     => '1024',
-            CAPTION      => 'ONBOARD DIMM_A4',
+            NUMSLOTS         => 4,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (Multi-bit ECC)',
+            TYPE             => 'DDR2',
+            SPEED            => '667 MHz (1.5 ns)',
+            CAPACITY         => '1024',
+            CAPTION          => 'ONBOARD DIMM_A4',
             MEMORYCORRECTION => 'Multi-bit ECC'
         },
         {
-            NUMSLOTS     => 5,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (Multi-bit ECC)',
-            TYPE         => 'DDR2',
-            SPEED        => '667 MHz (1.5 ns)',
-            CAPACITY     => '1024',
-            CAPTION      => 'ONBOARD DIMM_B1',
+            NUMSLOTS         => 5,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (Multi-bit ECC)',
+            TYPE             => 'DDR2',
+            SPEED            => '667 MHz (1.5 ns)',
+            CAPACITY         => '1024',
+            CAPTION          => 'ONBOARD DIMM_B1',
             MEMORYCORRECTION => 'Multi-bit ECC'
         },
         {
-            NUMSLOTS     => 6,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (Multi-bit ECC)',
-            TYPE         => 'DDR2',
-            SPEED        => '667 MHz (1.5 ns)',
-            CAPACITY     => '1024',
-            CAPTION      => 'ONBOARD DIMM_B2',
+            NUMSLOTS         => 6,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (Multi-bit ECC)',
+            TYPE             => 'DDR2',
+            SPEED            => '667 MHz (1.5 ns)',
+            CAPACITY         => '1024',
+            CAPTION          => 'ONBOARD DIMM_B2',
             MEMORYCORRECTION => 'Multi-bit ECC'
         },
         {
-            NUMSLOTS     => 7,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (Multi-bit ECC)',
-            TYPE         => 'DDR2',
-            SPEED        => '667 MHz (1.5 ns)',
-            CAPACITY     => '1024',
-            CAPTION      => 'ONBOARD DIMM_B3',
+            NUMSLOTS         => 7,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (Multi-bit ECC)',
+            TYPE             => 'DDR2',
+            SPEED            => '667 MHz (1.5 ns)',
+            CAPACITY         => '1024',
+            CAPTION          => 'ONBOARD DIMM_B3',
             MEMORYCORRECTION => 'Multi-bit ECC'
         },
         {
-            NUMSLOTS     => 8,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (Multi-bit ECC)',
-            TYPE         => 'DDR2',
-            SPEED        => '667 MHz (1.5 ns)',
-            CAPACITY     => '1024',
-            CAPTION      => 'ONBOARD DIMM_B4',
+            NUMSLOTS         => 8,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (Multi-bit ECC)',
+            TYPE             => 'DDR2',
+            SPEED            => '667 MHz (1.5 ns)',
+            CAPACITY         => '1024',
+            CAPTION          => 'ONBOARD DIMM_B4',
             MEMORYCORRECTION => 'Multi-bit ECC'
         }
     ],
     'vmware' => [
         {
-            NUMSLOTS     => 1,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (None)',
-            TYPE         => 'DRAM',
-            SPEED        => 'Unknown',
-            CAPACITY     => '2048',
-            CAPTION      => 'RAM slot #0',
+            NUMSLOTS         => 1,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (None)',
+            TYPE             => 'DRAM',
+            SPEED            => 'Unknown',
+            CAPACITY         => '2048',
+            CAPTION          => 'RAM slot #0',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 2,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (None)',
-            TYPE         => 'DRAM',
-            SPEED        => 'Unknown',
-            CAPTION      => 'RAM slot #1',
+            NUMSLOTS         => 2,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (None)',
+            TYPE             => 'DRAM',
+            SPEED            => 'Unknown',
+            CAPTION          => 'RAM slot #1',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 3,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (None)',
-            TYPE         => 'DRAM',
-            SPEED        => 'Unknown',
-            CAPTION      => 'RAM slot #2',
+            NUMSLOTS         => 3,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (None)',
+            TYPE             => 'DRAM',
+            SPEED            => 'Unknown',
+            CAPTION          => 'RAM slot #2',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 4,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (None)',
-            TYPE         => 'DRAM',
-            SPEED        => 'Unknown',
-            CAPTION      => 'RAM slot #3',
+            NUMSLOTS         => 4,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (None)',
+            TYPE             => 'DRAM',
+            SPEED            => 'Unknown',
+            CAPTION          => 'RAM slot #3',
             MEMORYCORRECTION => 'None'
 
         }
     ],
     'vmware-esx' => [
         {
-            NUMSLOTS     => 1,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (None)',
-            TYPE         => 'DRAM',
-            SPEED        => 'Unknown',
-            CAPACITY     => '2048',
-            CAPTION      => 'RAM slot #0',
+            NUMSLOTS         => 1,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (None)',
+            TYPE             => 'DRAM',
+            SPEED            => 'Unknown',
+            CAPACITY         => '2048',
+            CAPTION          => 'RAM slot #0',
             MEMORYCORRECTION => 'None'
         },
         {
-            NUMSLOTS     => 2,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (None)',
-            TYPE         => 'DRAM',
-            SPEED        => 'Unknown',
-            CAPTION      => 'RAM slot #1',
+            NUMSLOTS         => 2,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (None)',
+            TYPE             => 'DRAM',
+            SPEED            => 'Unknown',
+            CAPTION          => 'RAM slot #1',
             MEMORYCORRECTION => 'None'
         },
         {
-            NUMSLOTS     => 3,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (None)',
-            TYPE         => 'DRAM',
-            SPEED        => 'Unknown',
-            CAPTION      => 'RAM slot #2',
+            NUMSLOTS         => 3,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (None)',
+            TYPE             => 'DRAM',
+            SPEED            => 'Unknown',
+            CAPTION          => 'RAM slot #2',
             MEMORYCORRECTION => 'None'
         },
         {
-            NUMSLOTS     => 4,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (None)',
-            TYPE         => 'DRAM',
-            SPEED        => 'Unknown',
-            CAPTION      => 'RAM slot #3',
+            NUMSLOTS         => 4,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (None)',
+            TYPE             => 'DRAM',
+            SPEED            => 'Unknown',
+            CAPTION          => 'RAM slot #3',
             MEMORYCORRECTION => 'None'
         },
         {
-            NUMSLOTS     => 5,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (None)',
-            TYPE         => 'DRAM',
-            SPEED        => 'Unknown',
-            CAPTION      => 'RAM slot #4',
+            NUMSLOTS         => 5,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (None)',
+            TYPE             => 'DRAM',
+            SPEED            => 'Unknown',
+            CAPTION          => 'RAM slot #4',
             MEMORYCORRECTION => 'None'
         },
         {
-            NUMSLOTS     => 6,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (None)',
-            TYPE         => 'DRAM',
-            SPEED        => 'Unknown',
-            CAPTION      => 'RAM slot #5',
+            NUMSLOTS         => 6,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (None)',
+            TYPE             => 'DRAM',
+            SPEED            => 'Unknown',
+            CAPTION          => 'RAM slot #5',
             MEMORYCORRECTION => 'None'
         },
         {
-            NUMSLOTS     => 7,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (None)',
-            TYPE         => 'DRAM',
-            SPEED        => 'Unknown',
-            CAPTION      => 'RAM slot #6',
+            NUMSLOTS         => 7,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (None)',
+            TYPE             => 'DRAM',
+            SPEED            => 'Unknown',
+            CAPTION          => 'RAM slot #6',
             MEMORYCORRECTION => 'None'
         },
         {
-            NUMSLOTS     => 8,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (None)',
-            TYPE         => 'DRAM',
-            SPEED        => 'Unknown',
-            CAPTION      => 'RAM slot #7',
+            NUMSLOTS         => 8,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (None)',
+            TYPE             => 'DRAM',
+            SPEED            => 'Unknown',
+            CAPTION          => 'RAM slot #7',
             MEMORYCORRECTION => 'None'
         },
         {
-            NUMSLOTS     => 9,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (None)',
-            TYPE         => 'DRAM',
-            SPEED        => 'Unknown',
-            CAPTION      => 'RAM slot #8',
+            NUMSLOTS         => 9,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (None)',
+            TYPE             => 'DRAM',
+            SPEED            => 'Unknown',
+            CAPTION          => 'RAM slot #8',
             MEMORYCORRECTION => 'None'
         },
         {
-            NUMSLOTS     => 10,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (None)',
-            TYPE         => 'DRAM',
-            SPEED        => 'Unknown',
-            CAPTION      => 'RAM slot #9',
+            NUMSLOTS         => 10,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (None)',
+            TYPE             => 'DRAM',
+            SPEED            => 'Unknown',
+            CAPTION          => 'RAM slot #9',
             MEMORYCORRECTION => 'None'
         },
         {
-            NUMSLOTS     => 11,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (None)',
-            TYPE         => 'DRAM',
-            SPEED        => 'Unknown',
-            CAPTION      => 'RAM slot #10',
+            NUMSLOTS         => 11,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (None)',
+            TYPE             => 'DRAM',
+            SPEED            => 'Unknown',
+            CAPTION          => 'RAM slot #10',
             MEMORYCORRECTION => 'None'
         },
         {
-            NUMSLOTS     => 12,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (None)',
-            TYPE         => 'DRAM',
-            SPEED        => 'Unknown',
-            CAPTION      => 'RAM slot #11',
+            NUMSLOTS         => 12,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (None)',
+            TYPE             => 'DRAM',
+            SPEED            => 'Unknown',
+            CAPTION          => 'RAM slot #11',
             MEMORYCORRECTION => 'None'
         },
         {
-            NUMSLOTS     => 13,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (None)',
-            TYPE         => 'DRAM',
-            SPEED        => 'Unknown',
-            CAPTION      => 'RAM slot #12',
+            NUMSLOTS         => 13,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (None)',
+            TYPE             => 'DRAM',
+            SPEED            => 'Unknown',
+            CAPTION          => 'RAM slot #12',
             MEMORYCORRECTION => 'None'
         },
         {
-            NUMSLOTS     => 14,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (None)',
-            TYPE         => 'DRAM',
-            SPEED        => 'Unknown',
-            CAPTION      => 'RAM slot #13',
+            NUMSLOTS         => 14,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (None)',
+            TYPE             => 'DRAM',
+            SPEED            => 'Unknown',
+            CAPTION          => 'RAM slot #13',
             MEMORYCORRECTION => 'None'
         },
         {
-            NUMSLOTS     => 15,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (None)',
-            TYPE         => 'DRAM',
-            SPEED        => 'Unknown',
-            CAPTION      => 'RAM slot #14',
+            NUMSLOTS         => 15,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (None)',
+            TYPE             => 'DRAM',
+            SPEED            => 'Unknown',
+            CAPTION          => 'RAM slot #14',
             MEMORYCORRECTION => 'None'
         }
     ],
     'vmware-esx-2.5' => [
         {
-            NUMSLOTS     => 1,
-            TYPE         => 'EDO DIMM',
-            CAPACITY     => '1024'
+            NUMSLOTS         => 1,
+            TYPE             => 'EDO DIMM',
+            CAPACITY         => '1024'
         },
         {
-            NUMSLOTS     => 2,
-            TYPE         => 'DIMM'
+            NUMSLOTS         => 2,
+            TYPE             => 'DIMM'
         },
         {
-            NUMSLOTS     => 3,
-            TYPE         => 'DIMM'
+            NUMSLOTS         => 3,
+            TYPE             => 'DIMM'
         },
         {
-            NUMSLOTS     => 4,
-            TYPE         => 'DIMM'
+            NUMSLOTS         => 4,
+            TYPE             => 'DIMM'
         },
         {
-            NUMSLOTS     => 5,
-            TYPE         => 'DIMM'
+            NUMSLOTS         => 5,
+            TYPE             => 'DIMM'
         },
         {
-            NUMSLOTS     => 6,
-            TYPE         => 'DIMM'
+            NUMSLOTS         => 6,
+            TYPE             => 'DIMM'
         },
         {
-            NUMSLOTS     => 7,
-            TYPE         => 'DIMM'
+            NUMSLOTS         => 7,
+            TYPE             => 'DIMM'
         },
         {
-            NUMSLOTS     => 8,
-            TYPE         => 'DIMM'
+            NUMSLOTS         => 8,
+            TYPE             => 'DIMM'
         },
         {
-            NUMSLOTS     => 9,
-            TYPE         => 'DIMM'
+            NUMSLOTS         => 9,
+            TYPE             => 'DIMM'
         },
         {
-            NUMSLOTS     => 10,
-            TYPE         => 'DIMM'
+            NUMSLOTS         => 10,
+            TYPE             => 'DIMM'
         },
         {
-            NUMSLOTS     => 11,
-            TYPE         => 'DIMM'
+            NUMSLOTS         => 11,
+            TYPE             => 'DIMM'
         },
         {
-            NUMSLOTS     => 12,
-            TYPE         => 'DIMM'
+            NUMSLOTS         => 12,
+            TYPE             => 'DIMM'
         },
         {
-            NUMSLOTS     => 13,
-            TYPE         => 'DIMM'
+            NUMSLOTS         => 13,
+            TYPE             => 'DIMM'
         },
         {
-            NUMSLOTS     => 14,
-            TYPE         => 'DIMM'
+            NUMSLOTS         => 14,
+            TYPE             => 'DIMM'
         },
         {
-            NUMSLOTS     => 15,
-            TYPE         => 'DIMM'
+            NUMSLOTS         => 15,
+            TYPE             => 'DIMM'
         }
     ],
     'windows' => [
         {
-            NUMSLOTS     => 1,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'SODIMM (None)',
-            SPEED        => 'Unknown',
-            TYPE         => 'SDRAM',
-            CAPTION      => 'DIMM 0',
-            CAPACITY    => '256',
+            NUMSLOTS         => 1,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'SODIMM (None)',
+            SPEED            => 'Unknown',
+            TYPE             => 'SDRAM',
+            CAPTION          => 'DIMM 0',
+            CAPACITY         => '256',
             MEMORYCORRECTION => 'None'
         },
         {
-            NUMSLOTS     => 2,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'SODIMM (None)',
-            SPEED        => 'Unknown',
-            TYPE         => 'SDRAM',
-            CAPTION      => 'DIMM 1',
-            CAPACITY    => '512',
+            NUMSLOTS         => 2,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'SODIMM (None)',
+            SPEED            => 'Unknown',
+            TYPE             => 'SDRAM',
+            CAPTION          => 'DIMM 1',
+            CAPACITY         => '512',
             MEMORYCORRECTION => 'None'
         }
     ],
@@ -972,643 +972,643 @@ my %tests = (
     ],
     'windows-hyperV' => [
         {
-            NUMSLOTS     => 1,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPACITY     => '1024',
-            CAPTION      => 'M0',
+            NUMSLOTS         => 1,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPACITY         => '1024',
+            CAPTION          => 'M0',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 2,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M1',
+            NUMSLOTS         => 2,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M1',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 3,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M2',
+            NUMSLOTS         => 3,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M2',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 4,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M3',
+            NUMSLOTS         => 4,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M3',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 5,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M4',
+            NUMSLOTS         => 5,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M4',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 6,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M5',
+            NUMSLOTS         => 6,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M5',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 7,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M6',
+            NUMSLOTS         => 7,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M6',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 8,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M7',
+            NUMSLOTS         => 8,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M7',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 9,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M8',
+            NUMSLOTS         => 9,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M8',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 10,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M9',
+            NUMSLOTS         => 10,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M9',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 11,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M10',
+            NUMSLOTS         => 11,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M10',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 12,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M11',
+            NUMSLOTS         => 12,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M11',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 13,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M12',
+            NUMSLOTS         => 13,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M12',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 14,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M13',
+            NUMSLOTS         => 14,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M13',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 15,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M14',
+            NUMSLOTS         => 15,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M14',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 16,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M15',
+            NUMSLOTS         => 16,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M15',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 17,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M16',
+            NUMSLOTS         => 17,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M16',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 18,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M17',
+            NUMSLOTS         => 18,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M17',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 19,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M18',
+            NUMSLOTS         => 19,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M18',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 20,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M19',
+            NUMSLOTS         => 20,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M19',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 21,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M20',
+            NUMSLOTS         => 21,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M20',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 22,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M21',
+            NUMSLOTS         => 22,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M21',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 23,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M22',
+            NUMSLOTS         => 23,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M22',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 24,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M23',
+            NUMSLOTS         => 24,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M23',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 25,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M24',
+            NUMSLOTS         => 25,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M24',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 26,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M25',
+            NUMSLOTS         => 26,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M25',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 27,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M26',
+            NUMSLOTS         => 27,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M26',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 28,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M27',
+            NUMSLOTS         => 28,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M27',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 29,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M28',
+            NUMSLOTS         => 29,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M28',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 30,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M29',
+            NUMSLOTS         => 30,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M29',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 31,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M30',
+            NUMSLOTS         => 31,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M30',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 32,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M31',
+            NUMSLOTS         => 32,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M31',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 33,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M32',
+            NUMSLOTS         => 33,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M32',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 34,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M33',
+            NUMSLOTS         => 34,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M33',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 35,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M34',
+            NUMSLOTS         => 35,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M34',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 36,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M35',
+            NUMSLOTS         => 36,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M35',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 37,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M36',
+            NUMSLOTS         => 37,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M36',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 38,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M37',
+            NUMSLOTS         => 38,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M37',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 39,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M38',
+            NUMSLOTS         => 39,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M38',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 40,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M39',
+            NUMSLOTS         => 40,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M39',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 41,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M40',
+            NUMSLOTS         => 41,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M40',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 42,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M41',
+            NUMSLOTS         => 42,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M41',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 43,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M42',
+            NUMSLOTS         => 43,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M42',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 44,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M43',
+            NUMSLOTS         => 44,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M43',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 45,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M44',
+            NUMSLOTS         => 45,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M44',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 46,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M45',
+            NUMSLOTS         => 46,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M45',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 47,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M46',
+            NUMSLOTS         => 47,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M46',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 48,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M47',
+            NUMSLOTS         => 48,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M47',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 49,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M48',
+            NUMSLOTS         => 49,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M48',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 50,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M49',
+            NUMSLOTS         => 50,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M49',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 51,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M50',
+            NUMSLOTS         => 51,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M50',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 52,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M51',
+            NUMSLOTS         => 52,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M51',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 53,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M52',
+            NUMSLOTS         => 53,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M52',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 54,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M53',
+            NUMSLOTS         => 54,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M53',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 55,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M54',
+            NUMSLOTS         => 55,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M54',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 56,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M55',
+            NUMSLOTS         => 56,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M55',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 57,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M56',
+            NUMSLOTS         => 57,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M56',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 58,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M57',
+            NUMSLOTS         => 58,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M57',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 59,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M58',
+            NUMSLOTS         => 59,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M58',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 60,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M59',
+            NUMSLOTS         => 60,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M59',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 61,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M60',
+            NUMSLOTS         => 61,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M60',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 62,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M61',
+            NUMSLOTS         => 62,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M61',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 63,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M62',
+            NUMSLOTS         => 63,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M62',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 64,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M63',
+            NUMSLOTS         => 64,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M63',
             MEMORYCORRECTION => 'None'
 
         }


================================================================
  Commit: af93ee7b60fcc229c8985ed801cc0c1b4da0bbc4
      https://github.com/fusinv/fusioninventory-agent/commit/af93ee7b60fcc229c8985ed801cc0c1b4da0bbc4
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-04 (Sun, 04 Mar 2012)

  Changed paths:
    M t/FusionInventory/Test/Utils.pm
    M t/inventory/windows/printers.t

  Log Message:
  -----------
  move load_registry function into Test::Utils


diff --git a/t/FusionInventory/Test/Utils.pm b/t/FusionInventory/Test/Utils.pm
index 9041766..2b0df4f 100644
--- a/t/FusionInventory/Test/Utils.pm
+++ b/t/FusionInventory/Test/Utils.pm
@@ -10,6 +10,7 @@ use Socket;
 our @EXPORT = qw(
     test_port
     mockGetWmiObjects
+    load_registry
 );
 
 sub test_port {
@@ -69,3 +70,58 @@ sub mockGetWmiObjects {
         return @objects;
     };
 }
+
+sub load_registry {
+    my ($file) = @_;
+
+    my $root_offset;
+    my $root_key = {};
+    my $current_key;
+
+    open (my $handle, '<', $file) or die "can't open $file: $ERRNO";
+
+    # this is a windows file
+    binmode $handle, ':encoding(UTF-16LE)';
+    local $INPUT_RECORD_SEPARATOR="\r\n";
+
+    while (my $line = <$handle>) {
+        chomp $line;
+
+        if ($line =~ /^ \[ ([^]]+) \] $/x) {
+            my $path = $1;
+            my @path = split(/\\/, $path);
+
+            if ($root_offset) {
+                splice @path, 0, $root_offset;
+                $current_key = $root_key;
+                foreach my $element (@path) {
+                    my $key_path = $element . '/';
+
+                    if (!defined $current_key->{$key_path}) {
+                        my $new_key = {};
+                        $current_key->{$key_path} = $new_key;
+                    }
+
+                    $current_key = $current_key->{$key_path};
+                }
+            } else {
+                $root_offset = scalar @path;
+            }
+            next;
+        }
+
+        if ($line =~ /^ " ([^"]+) " = dword:(\d+)/x) {
+            $current_key->{'/' . $1} = "0x$2";
+            next;
+        }
+
+        if ($line =~ /^ " ([^"]+) " = " ([^"]+) "/x) {
+            $current_key->{'/' . $1} = $2;
+            next;
+        }
+
+    }
+    close $handle;
+
+    return $root_key;
+}
diff --git a/t/inventory/windows/printers.t b/t/inventory/windows/printers.t
index 8199b06..8bec29f 100755
--- a/t/inventory/windows/printers.t
+++ b/t/inventory/windows/printers.t
@@ -2,10 +2,13 @@
 
 use strict;
 use warnings;
+use lib 't';
 
 use English qw(-no_match_vars);
 use Test::More;
 
+use FusionInventory::Test::Utils;
+
 BEGIN {
     # use mock modules for non-available ones
     push @INC, 't/fake/windows' if $OSNAME ne 'MSWin32';
@@ -45,58 +48,3 @@ foreach my $test (keys %tests) {
         is($serial, $tests{$test}->{$port}, "serial for printer $port");
     }
 }
-
-sub load_registry {
-    my ($file) = @_;
-
-    my $root_offset;
-    my $root_key = {};
-    my $current_key;
-
-    open (my $handle, '<', $file) or die "can't open $file: $ERRNO";
-
-    # this is a windows file
-    binmode $handle, ':encoding(UTF-16LE)';
-    local $INPUT_RECORD_SEPARATOR="\r\n";
-
-    while (my $line = <$handle>) {
-        chomp $line;
-
-        if ($line =~ /^ \[ ([^]]+) \] $/x) {
-            my $path = $1;
-            my @path = split(/\\/, $path);
-
-            if ($root_offset) {
-                splice @path, 0, $root_offset;
-                $current_key = $root_key;
-                foreach my $element (@path) {
-                    my $key_path = $element . '/';
-
-                    if (!defined $current_key->{$key_path}) {
-                        my $new_key = {};
-                        $current_key->{$key_path} = $new_key;
-                    }
-
-                    $current_key = $current_key->{$key_path};
-                }
-            } else {
-                $root_offset = scalar @path;
-            }
-            next;
-        }
-
-        if ($line =~ /^ " ([^"]+) " = dword:(\d+)/x) {
-            $current_key->{'/' . $1} = "0x$2";
-            next;
-        }
-
-        if ($line =~ /^ " ([^"]+) " = " ([^"]+) "/x) {
-            $current_key->{'/' . $1} = $2;
-            next;
-        }
-
-    }
-    close $handle;
-
-    return $root_key;
-}


================================================================
  Commit: 83f943e4181bd6cca54331d12aaac3778ee4ff16
      https://github.com/fusinv/fusioninventory-agent/commit/83f943e4181bd6cca54331d12aaac3778ee4ff16
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-04 (Sun, 04 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Bios.pm

  Log Message:
  -----------
  cosmetics


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Bios.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Bios.pm
index 5ec74eb..58f6602 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Bios.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Bios.pm
@@ -89,30 +89,36 @@ sub doInventory {
 
     $inventory->setBios($bios);
 
-    if (
-        ($bios->{VERSION} && ($bios->{VERSION} eq 'VirtualBox'))
-         ||
-        ($bios->{MMODEL} && ($bios->{MMODEL} eq 'VirtualBox'))
-       ) {
-        $inventory->setHardware ({
-            VMSYSTEM => 'VirtualBox'
-        });
-    } elsif (
-        ($bios->{BIOSSERIAL} && ($bios->{BIOSSERIAL} =~ /VMware/i))
-         ||
-        ($bios->{SMODEL} && ($bios->{SMODEL} eq 'VirtualBox'))
-       ) {
-        $inventory->setHardware ({
-            VMSYSTEM => 'VMware'
-        });
-    } elsif (
-        ($bios->{SMANUFACTURER} eq 'Xen')
-         ||
-        ($bios->{BMANUFACTURER} eq 'Xen')
-       ) {
-        $inventory->setHardware ({
-            VMSYSTEM => 'Xen'
-        });
+    SWITCH: {
+        if (
+            ($bios->{VERSION} && $bios->{VERSION} eq 'VirtualBox') ||
+            ($bios->{MMODEL}  && $bios->{MMODEL} eq 'VirtualBox')
+           ) {
+            $inventory->setHardware ({
+                VMSYSTEM => 'VirtualBox'
+            });
+            last SWITCH;
+        }
+
+        if (
+            ($bios->{BIOSSERIAL} && $bios->{BIOSSERIAL} =~ /VMware/i) ||
+            ($bios->{SMODEL}     && $bios->{SMODEL} eq 'VirtualBox')
+           ) {
+            $inventory->setHardware ({
+                VMSYSTEM => 'VMware'
+            });
+            last SWITCH;
+        }
+
+        if (
+            ($bios->{SMANUFACTURER} && $bios->{SMANUFACTURER} eq 'Xen') ||
+            ($bios->{BMANUFACTURER} && $bios->{BMANUFACTURER} eq 'Xen')
+           ) {
+            $inventory->setHardware ({
+                VMSYSTEM => 'Xen'
+            });
+            last SWITCH;
+        }
     }
 
 }


================================================================
  Commit: 76f4339662851a9daae5b69870a8a54b4cca1a82
      https://github.com/fusinv/fusioninventory-agent/commit/76f4339662851a9daae5b69870a8a54b4cca1a82
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-04 (Sun, 04 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/CPU.pm

  Log Message:
  -----------
  split for testing purposes


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/CPU.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/CPU.pm
index 117bc09..333231d 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/CPU.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/CPU.pm
@@ -25,10 +25,28 @@ sub doInventory {
     my $inventory = $params{inventory};
     my $logger    = $params{logger};
 
-    my @dmidecodeCpu = getCpusFromDmidecode();
+    my @cpus = _getCPUs($logger);
 
-    my $vmsystem;
+    foreach my $cpu (@cpus) {
+        $inventory->addEntry(
+            section => 'CPUS',
+            entry   => $cpu
+        );
+    }
+
+    if (any { $_->{NAME} =~ /QEMU/i } @cpus) {
+        $inventory->setHardware ({
+            VMSYSTEM => 'QEMU'
+        });
+    }
+}
+
+sub _getCPUs {
+    my ($logger) = @_;
+
+    my @dmidecodeCpu = getCpusFromDmidecode();
     my $cpuId = 0;
+    my @cpus;
 
     foreach my $object (getWmiObjects(
         class      => 'Win32_Processor',
@@ -79,7 +97,6 @@ sub doInventory {
             $cpu->{NAME} =~ s/^\s+//;
             $cpu->{NAME} =~ s/\s+$//;
 
-            $vmsystem = "QEMU" if $cpu->{NAME} =~ /QEMU/i;
 
             if ($cpu->{NAME} =~ /([\d\.]+)s*(GHZ)/i) {
                 $cpu->{SPEED} = {
@@ -89,19 +106,12 @@ sub doInventory {
             }
         }
 
-        $inventory->addEntry(
-            section => 'CPUS',
-            entry   => $cpu
-        );
+        push @cpus, $cpu;
 
         $cpuId++;
     }
 
-    if ($vmsystem) {
-        $inventory->setHardware ({
-            VMSYSTEM => $vmsystem 
-        });
-    }
+    return @cpus;
 }
 
 1;


================================================================
  Commit: 9fcd8bfb907ee4dce07f2955989319de43801b12
      https://github.com/fusinv/fusioninventory-agent/commit/9fcd8bfb907ee4dce07f2955989319de43801b12
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-04 (Sun, 04 Mar 2012)

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

  Log Message:
  -----------
  add a distinct getRegistryKey function


diff --git a/lib/FusionInventory/Agent/Tools/Win32.pm b/lib/FusionInventory/Agent/Tools/Win32.pm
index 1c49573..eaa0396 100644
--- a/lib/FusionInventory/Agent/Tools/Win32.pm
+++ b/lib/FusionInventory/Agent/Tools/Win32.pm
@@ -30,6 +30,7 @@ our @EXPORT = qw(
     KEY_WOW64_64
     KEY_WOW64_32
     getRegistryValue
+    getRegistryKey
     getWmiObjects
     getLocalCodepage
 );
@@ -96,7 +97,7 @@ sub getRegistryValue {
     my (%params) = @_;
 
     my ($root, $keyName, $valueName);
-    if ($params{path} =~ /^(HKEY\S+?)\/(.*)\/([^\/.]*)/ ) {
+    if ($params{path} =~ /^(HKEY_\S+)\/(.+)\/([^\/]+)/ ) {
         $root      = $1;
         $keyName   = $2;
         $valueName = $3;
@@ -107,20 +108,52 @@ sub getRegistryValue {
         return;
     }
 
-    my $machKey = is64bit() ?
-        $Registry->Open($root, { Access=> KEY_READ | KEY_WOW64_64 } ) : ## no critic (ProhibitBitwise)
-	$Registry->Open($root, { Access=> KEY_READ } )                ;
+    my $key = _getRegistryKey(
+        logger  => $params{logger},
+        root    => $root,
+        keyName => $keyName
+    );
+    return $key->{"/$valueName"};
+}
+
+sub getRegistryKey {
+    my (%params) = @_;
+
+    my ($root, $keyName);
+    if ($params{path} =~ /^(HKEY_\S+)\/(.+)/ ) {
+        $root      = $1;
+        $keyName   = $2;
+    } else {
+        $params{logger}->error(
+	    "Failed to parse '$params{path}'. Does it start with HKEY_?"
+	) if $params{logger};
+        return;
+    }
+
+    return _getRegistryKey(
+        logger  => $params{logger},
+        root    => $root,
+        keyName => $keyName
+    );
+}
+
+sub _getRegistryKey {
+    my (%params) = @_;
 
-    if (!$machKey) {
-        $params{logger}->error("Can't open 'root': $EXTENDED_OS_ERROR")
-	    if $params{logger};
+    ## no critic (ProhibitBitwise)
+    my $rootKey = is64bit() ?
+        $Registry->Open($params{root}, { Access=> KEY_READ | KEY_WOW64_64 } ) :
+	$Registry->Open($params{root}, { Access=> KEY_READ } )                ;
+
+    if (!$rootKey) {
+        $params{logger}->error(
+            "Can't open $params{root} key: $EXTENDED_OS_ERROR"
+        ) if $params{logger};
         return;
     }
-    my $key = $machKey->Open($keyName);
-    my $value = $key->{$valueName};
+    my $key = $rootKey->Open($params{keyName});
 
-    return if ref $value;
-    return $value;
+    return $key;
 }
 
 1;


================================================================
  Commit: 24d85a685400f5d6c2bcd0544ec0e6aa9e6d5cf9
      https://github.com/fusinv/fusioninventory-agent/commit/24d85a685400f5d6c2bcd0544ec0e6aa9e6d5cf9
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-04 (Sun, 04 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Printers.pm

  Log Message:
  -----------
  don't access registry directly, use dedicated function


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Printers.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Printers.pm
index d74b45b..e07e9b7 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Printers.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Printers.pm
@@ -4,11 +4,6 @@ use strict;
 use warnings;
 
 use English qw(-no_match_vars);
-use Win32::TieRegistry (
-    Delimiter   => '/',
-    ArrayValues => 0,
-    qw/KEY_READ/
-);
 
 use FusionInventory::Agent::Tools::Win32;
 
@@ -52,6 +47,7 @@ sub doInventory {
     my (%params) = @_;
 
     my $inventory = $params{inventory};
+    my $logger    = $params{logger};
 
     foreach my $object (getWmiObjects(
         class      => 'Win32_Printer',
@@ -76,7 +72,7 @@ sub doInventory {
                 $object->{VerticalResolution};
         }
 
-        $object->{Serial} = _getUSBPrinterSerial($object->{PortName})
+        $object->{Serial} = _getUSBPrinterSerial($object->{PortName}, $logger)
             if $object->{PortName} && $object->{PortName} =~ /USB/;
 
         $inventory->addEntry(
@@ -103,22 +99,24 @@ sub doInventory {
 }
 
 sub _getUSBPrinterSerial {
-    my ($portName) = @_;
-
-    my $machKey = $Registry->Open('LMachine', { 
-        Access => KEY_READ | KEY_WOW64_64 ## no critic (ProhibitBitwise)
-    }) or die "Can't open HKEY_LOCAL_MACHINE key: $EXTENDED_OS_ERROR";
+    my ($portName, $logger) = @_;
 
     # first, find the USB container ID for this printer
     my $prefix = _getUSBPrefix(
-        $machKey->{"SYSTEM/CurrentControlSet/Enum/USBPRINT"},
+        getRegistryKey(
+            path => "HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Enum/USBPRINT",
+            logger => $logger
+        ),
         $portName
     );
     return unless $prefix;
 
     # second, get the serial number from the ID container entry
     my $serial = _getUSBSerial(
-        $machKey->{"SYSTEM/CurrentControlSet/Enum/USB"},
+        getRegistryKey(
+            path => "HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Enum/USB",
+            logger => $logger
+        ),
         $prefix
     );
 


================================================================
  Commit: 53fcf60d25874ce68fb645814dbcb026bebb4e18
      https://github.com/fusinv/fusioninventory-agent/commit/53fcf60d25874ce68fb645814dbcb026bebb4e18
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-04 (Sun, 04 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Bios.pm

  Log Message:
  -----------
  useless import


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Bios.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Bios.pm
index 58f6602..b664c67 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Bios.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Bios.pm
@@ -4,11 +4,6 @@ use strict;
 use warnings;
 
 use English qw(-no_match_vars);
-use Win32::TieRegistry (
-    Delimiter   => '/',
-    ArrayValues => 0,
-    qw/KEY_READ/
-);
 
 use FusionInventory::Agent::Tools::Win32;
 


================================================================
  Commit: ee55a455bca888d98a86fe2b53dac87b43cd3467
      https://github.com/fusinv/fusioninventory-agent/commit/ee55a455bca888d98a86fe2b53dac87b43cd3467
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-04 (Sun, 04 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/CPU.pm

  Log Message:
  -----------
  access registry only once, using dedicated function


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/CPU.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/CPU.pm
index 333231d..768d796 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/CPU.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/CPU.pm
@@ -4,12 +4,6 @@ use strict;
 use warnings;
 
 use English qw(-no_match_vars);
-use Win32;
-use Win32::TieRegistry (
-    Delimiter   => '/',
-    ArrayValues => 0,
-    qw/KEY_READ/
-);
 
 use FusionInventory::Agent::Tools;
 use FusionInventory::Agent::Tools::Win32;
@@ -44,7 +38,13 @@ sub doInventory {
 sub _getCPUs {
     my ($logger) = @_;
 
-    my @dmidecodeCpu = getCpusFromDmidecode();
+    my @dmidecodeInfos = getCpusFromDmidecode();
+    # the CPU description in WMI is false, we use the registry instead
+    my $registryInfos = getRegistryKey(
+        path   => "HKEY_LOCAL_MACHINE/Hardware/Description/System/CentralProcessor",
+        logger => $logger
+    );
+
     my $cpuId = 0;
     my @cpus;
 
@@ -53,22 +53,15 @@ sub _getCPUs {
         properties => [ qw/NumberOfCores ProcessorId MaxClockSpeed/ ]
     )) {
 
-        # the CPU description in WMI is false, we use the registry instead
-        # Hardware\Description\System\CentralProcessor\1
-        # thank you Nicolas Richard 
-        my $registryInfo = getRegistryValue(
-            path   => "HKEY_LOCAL_MACHINE/Hardware/Description/System/CentralProcessor/$cpuId",
-            logger => $logger
-        );
-
-        my $dmidecodeInfo = $dmidecodeCpu[$cpuId];
+        my $dmidecodeInfo = $dmidecodeInfos[$cpuId];
+        my $registryInfo  = $registryInfos->{"$cpuId/"};
 
         my $cpu = {
             CORE         => $dmidecodeInfo->{CORE} || $object->{NumberOfCores},
             THREAD       => $dmidecodeInfo->{THREAD},
-            DESCRIPTION  => $registryInfo->{Identifier},
-            NAME         => $registryInfo->{ProcessorNameString},
-            MANUFACTURER => $registryInfo->{VendorIdentifier},
+            DESCRIPTION  => $registryInfo->{'/Identifier'},
+            NAME         => $registryInfo->{'/ProcessorNameString'},
+            MANUFACTURER => $registryInfo->{'/VendorIdentifier'},
             SERIAL       => $dmidecodeInfo->{SERIAL},
             SPEED        => $dmidecodeInfo->{SPEED} || $object->{MaxClockSpeed},
             ID           => $dmidecodeInfo->{ID} || $object->{ProcessorId}


================================================================
  Commit: 71d081e74fc2584873fe4cf17100149936bfebad
      https://github.com/fusinv/fusioninventory-agent/commit/71d081e74fc2584873fe4cf17100149936bfebad
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-04 (Sun, 04 Mar 2012)

  Changed paths:
    A resources/win32/registry/7-CentralProcessor.reg

  Log Message:
  -----------
  initial import


diff --git a/resources/win32/registry/7-CentralProcessor.reg b/resources/win32/registry/7-CentralProcessor.reg
new file mode 100644
index 0000000..1d34b8c
Binary files /dev/null and b/resources/win32/registry/7-CentralProcessor.reg differ


================================================================
  Commit: f0ae793175dd9e4d9662efe0c4392b7b2044c570
      https://github.com/fusinv/fusioninventory-agent/commit/f0ae793175dd9e4d9662efe0c4392b7b2044c570
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-04 (Sun, 04 Mar 2012)

  Changed paths:
    M t/FusionInventory/Test/Utils.pm

  Log Message:
  -----------
  mock getRegistryKey too


diff --git a/t/FusionInventory/Test/Utils.pm b/t/FusionInventory/Test/Utils.pm
index 2b0df4f..0c82d26 100644
--- a/t/FusionInventory/Test/Utils.pm
+++ b/t/FusionInventory/Test/Utils.pm
@@ -10,6 +10,7 @@ use Socket;
 our @EXPORT = qw(
     test_port
     mockGetWmiObjects
+    mockGetRegistryKey
     load_registry
 );
 
@@ -71,6 +72,19 @@ sub mockGetWmiObjects {
     };
 }
 
+sub mockGetRegistryKey {
+    my ($test) = @_;
+
+    return sub {
+        my (%params) = @_;
+
+        my $last_elt = (split(/\//, $params{path}))[-1];
+        my $file = "resources/win32/registry/$test-$last_elt.reg";
+        return load_registry($file);
+    };
+}
+
+
 sub load_registry {
     my ($file) = @_;
 


================================================================
  Commit: 0452c419bfe0bb9535cd75935250978350490e48
      https://github.com/fusinv/fusioninventory-agent/commit/0452c419bfe0bb9535cd75935250978350490e48
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-04 (Sun, 04 Mar 2012)

  Changed paths:
    A t/inventory/windows/cpu.t

  Log Message:
  -----------
  initial import


diff --git a/t/inventory/windows/cpu.t b/t/inventory/windows/cpu.t
new file mode 100755
index 0000000..f895342
--- /dev/null
+++ b/t/inventory/windows/cpu.t
@@ -0,0 +1,69 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+use utf8;
+use lib 't';
+
+use English qw(-no_match_vars);
+use Test::More;
+use Test::MockModule;
+
+use FusionInventory::Test::Utils;
+
+BEGIN {
+    # use mock modules for non-available ones
+    push @INC, 't/fake/windows' if $OSNAME ne 'MSWin32';
+}
+
+use FusionInventory::Agent::Task::Inventory::Input::Win32::CPU;
+
+my %tests = (
+    7 => [
+        {
+            ID           => 'A7 06 02 00 FF FB EB BF',
+            NAME         => 'Intel(R) Core(TM) i5-2300 CPU @ 2.80GHz',
+            SERIAL       => 'ToBeFilledByO.E.M.',
+            MANUFACTURER => 'Intel',
+            DESCRIPTION  => 'x86 Family 6 Model 42 Stepping 7',
+            SPEED        => '2800',
+            THREAD       => undef,
+            CORE         => '4'
+        }
+    ]
+);
+
+plan tests => scalar keys %tests;
+
+my $module = Test::MockModule->new(
+    'FusionInventory::Agent::Task::Inventory::Input::Win32::CPU'
+);
+
+foreach my $test (keys %tests) {
+    $module->mock(
+        'getWmiObjects',
+        mockGetWmiObjects($test)
+    );
+
+    $module->mock(
+        'getCpusFromDmidecode',
+        sub {
+            return
+                FusionInventory::Agent::Tools::Generic::getCpusFromDmidecode(
+                    file => "resources/generic/dmidecode/windows-$test"
+                );
+        }
+    );
+
+    $module->mock(
+        'getRegistryKey',
+        mockGetRegistryKey($test)
+    );
+
+    my @cpus = FusionInventory::Agent::Task::Inventory::Input::Win32::CPU::_getCPUs();
+    is_deeply(
+        \@cpus,
+        $tests{$test},
+        "$test cpu"
+    );
+}


================================================================
  Commit: 91cd73e0403266ba0360c12a13ae93448996de5a
      https://github.com/fusinv/fusioninventory-agent/commit/91cd73e0403266ba0360c12a13ae93448996de5a
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-04 (Sun, 04 Mar 2012)

  Changed paths:
    M t/inventory/windows/printers.t

  Log Message:
  -----------
  mock getRegistryKey directly


diff --git a/t/inventory/windows/printers.t b/t/inventory/windows/printers.t
index 8bec29f..ca6ba26 100755
--- a/t/inventory/windows/printers.t
+++ b/t/inventory/windows/printers.t
@@ -6,6 +6,7 @@ use lib 't';
 
 use English qw(-no_match_vars);
 use Test::More;
+use Test::MockModule;
 
 use FusionInventory::Test::Utils;
 
@@ -38,13 +39,21 @@ foreach my $test (keys %tests) {
 }
 plan tests => $plan;
 
+my $module = Test::MockModule->new(
+    'FusionInventory::Agent::Task::Inventory::Input::Win32::Printers'
+);
+
 foreach my $test (keys %tests) {
-    my $printKey = load_registry("resources/win32/registry/$test-USBPRINT.reg");
-    my $usbKey   = load_registry("resources/win32/registry/$test-USB.reg");
-    foreach my $port (keys %{$tests{$test}}) {
-        my $prefix = FusionInventory::Agent::Task::Inventory::Input::Win32::Printers::_getUSBPrefix($printKey, $port);
-        my $serial = FusionInventory::Agent::Task::Inventory::Input::Win32::Printers::_getUSBSerial($usbKey, $prefix);
+    $module->mock(
+        'getRegistryKey',
+        mockGetRegistryKey($test)
+    );
 
-        is($serial, $tests{$test}->{$port}, "serial for printer $port");
+    foreach my $port (keys %{$tests{$test}}) {
+        is(
+            FusionInventory::Agent::Task::Inventory::Input::Win32::Printers::_getUSBPrinterSerial($port),
+            $tests{$test}->{$port},
+            "serial for printer $port"
+        );
     }
 }


================================================================
  Commit: 580da47173663b1d548ad74834b13316648cb6ae
      https://github.com/fusinv/fusioninventory-agent/commit/580da47173663b1d548ad74834b13316648cb6ae
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-04 (Sun, 04 Mar 2012)

  Changed paths:
    M t/FusionInventory/Test/Utils.pm

  Log Message:
  -----------
  split mocking from parsing function


diff --git a/t/FusionInventory/Test/Utils.pm b/t/FusionInventory/Test/Utils.pm
index 0c82d26..9de910c 100644
--- a/t/FusionInventory/Test/Utils.pm
+++ b/t/FusionInventory/Test/Utils.pm
@@ -11,7 +11,6 @@ our @EXPORT = qw(
     test_port
     mockGetWmiObjects
     mockGetRegistryKey
-    load_registry
 );
 
 sub test_port {
@@ -37,39 +36,45 @@ sub mockGetWmiObjects {
         my (%params) = @_;
 
         my $file = "resources/win32/wmi/$test-$params{class}.wmi";
-        open (my $handle, '<', $file) or die "can't open $file: $ERRNO";
-
-        # this is a windows file
-        binmode $handle, ':encoding(UTF-16LE)';
-        local $INPUT_RECORD_SEPARATOR="\r\n";
-
-        # build a list of desired properties indexes
-        my %properties = map { $_ => 1 } @{$params{properties}};
-
-        my @objects;
-        my $object;
-        while (my $line = <$handle>) {
-            chomp $line;
-
-            if ($line =~ /^ (\w+) = (.+) $/x) {
-                my $key = $1;
-                my $value = $2;
-                next unless $properties{$key};
-                $value =~ s/&/&/g;
-                $object->{$key} = $value;
-                next;
-            }
+        return loadWMIDump($file, $params{properties});
+    };
+}
 
-            if ($line =~ /^$/) {
-                push @objects, $object if $object;
-                undef $object;
-                next;
-            }
+sub loadWMIDump {
+    my ($file, $properties) = @_;
+
+    open (my $handle, '<', $file) or die "can't open $file: $ERRNO";
+
+    # this is a windows file
+    binmode $handle, ':encoding(UTF-16LE)';
+    local $INPUT_RECORD_SEPARATOR="\r\n";
+
+    # build a list of desired properties indexes
+    my %properties = map { $_ => 1 } @{$properties};
+
+    my @objects;
+    my $object;
+    while (my $line = <$handle>) {
+        chomp $line;
+
+        if ($line =~ /^ (\w+) = (.+) $/x) {
+            my $key = $1;
+            my $value = $2;
+            next unless $properties{$key};
+            $value =~ s/&/&/g;
+            $object->{$key} = $value;
+            next;
         }
-        close $handle;
 
-        return @objects;
-    };
+        if ($line =~ /^$/) {
+            push @objects, $object if $object;
+            undef $object;
+            next;
+        }
+    }
+    close $handle;
+
+    return @objects;
 }
 
 sub mockGetRegistryKey {
@@ -80,12 +85,11 @@ sub mockGetRegistryKey {
 
         my $last_elt = (split(/\//, $params{path}))[-1];
         my $file = "resources/win32/registry/$test-$last_elt.reg";
-        return load_registry($file);
+        return loadRegistryDump($file);
     };
 }
 
-
-sub load_registry {
+sub loadRegistryDump {
     my ($file) = @_;
 
     my $root_offset;


================================================================
  Commit: 6432160083ffab724d2f574e8246b22ec582a3c0
      https://github.com/fusinv/fusioninventory-agent/commit/6432160083ffab724d2f574e8246b22ec582a3c0
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-04 (Sun, 04 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Printers.pm

  Log Message:
  -----------
  fix comments


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Printers.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Printers.pm
index e07e9b7..9db485d 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Printers.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Printers.pm
@@ -101,7 +101,7 @@ sub doInventory {
 sub _getUSBPrinterSerial {
     my ($portName, $logger) = @_;
 
-    # first, find the USB container ID for this printer
+    # find the ParentIdPrefix value for the printer matching given portname
     my $prefix = _getUSBPrefix(
         getRegistryKey(
             path => "HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Enum/USBPRINT",
@@ -111,7 +111,7 @@ sub _getUSBPrinterSerial {
     );
     return unless $prefix;
 
-    # second, get the serial number from the ID container entry
+    # find the key name for the device matching given parentIdPrefix
     my $serial = _getUSBSerial(
         getRegistryKey(
             path => "HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Enum/USB",
@@ -123,7 +123,6 @@ sub _getUSBPrinterSerial {
     return $serial;
 }
 
-# find the ParentIdPrefix value for the printer matching given portname
 sub _getUSBPrefix {
     my ($print, $portName) = @_;
 
@@ -151,7 +150,6 @@ sub _getUSBPrefix {
     return;
 }
 
-# find the key name for the device matching given parentIdPrefix
 sub _getUSBSerial {
     my ($usb, $prefix) = @_;
 


================================================================
  Commit: eab879d17072ddc554d66db523a86e2b4ff61b12
      https://github.com/fusinv/fusioninventory-agent/commit/eab879d17072ddc554d66db523a86e2b4ff61b12
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-04 (Sun, 04 Mar 2012)

  Changed paths:
    M Makefile.PL

  Log Message:
  -----------
  sort test modules alphabetically


diff --git a/Makefile.PL b/Makefile.PL
index a5863a6..e2d1561 100644
--- a/Makefile.PL
+++ b/Makefile.PL
@@ -37,13 +37,13 @@ if ($OSNAME ne 'MSWin32') {
 }
 
 # test dependencies
-test_requires  'Test::More'                   => '0.93'; # subtest
-test_requires  'IPC::Run'                     => undef;
 test_requires  'HTTP::Proxy'                  => undef;
 test_requires  'HTTP::Server::Simple'         => undef;
 test_requires  'HTTP::Server::Simple::Authen' => undef;
 test_requires  'IO::Capture::Stderr'          => undef;
+test_requires  'IPC::Run'                     => undef;
 test_requires  'Test::Exception'              => undef;
+test_requires  'Test::More'                   => '0.93'; # subtest
 test_requires  'YAML'                         => undef;
 
 install_script  'fusioninventory-agent';


================================================================
  Commit: 9344d82df697bf5980db1e8e09956adce8171e84
      https://github.com/fusinv/fusioninventory-agent/commit/9344d82df697bf5980db1e8e09956adce8171e84
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-04 (Sun, 04 Mar 2012)

  Changed paths:
    M Makefile.PL

  Log Message:
  -----------
  add Test::MockModule


diff --git a/Makefile.PL b/Makefile.PL
index e2d1561..f325069 100644
--- a/Makefile.PL
+++ b/Makefile.PL
@@ -43,6 +43,7 @@ test_requires  'HTTP::Server::Simple::Authen' => undef;
 test_requires  'IO::Capture::Stderr'          => undef;
 test_requires  'IPC::Run'                     => undef;
 test_requires  'Test::Exception'              => undef;
+test_requires  'Test::MockModule'             => undef;
 test_requires  'Test::More'                   => '0.93'; # subtest
 test_requires  'YAML'                         => undef;
 


================================================================
  Commit: 53a6736565d8ccc85d7ebc1599d5ebd23c48f111
      https://github.com/fusinv/fusioninventory-agent/commit/53a6736565d8ccc85d7ebc1599d5ebd23c48f111
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-04 (Sun, 04 Mar 2012)

  Changed paths:
    M t/inventory/windows/cpu.t
    M t/inventory/windows/memory.t
    M t/inventory/windows/printers.t
    M t/inventory/windows/usb.t

  Log Message:
  -----------
  better tests description


diff --git a/t/inventory/windows/cpu.t b/t/inventory/windows/cpu.t
index f895342..ef03d46 100755
--- a/t/inventory/windows/cpu.t
+++ b/t/inventory/windows/cpu.t
@@ -64,6 +64,6 @@ foreach my $test (keys %tests) {
     is_deeply(
         \@cpus,
         $tests{$test},
-        "$test cpu"
+        "$test sample"
     );
 }
diff --git a/t/inventory/windows/memory.t b/t/inventory/windows/memory.t
index 4192e95..3ff1983 100755
--- a/t/inventory/windows/memory.t
+++ b/t/inventory/windows/memory.t
@@ -52,7 +52,6 @@ my $module = Test::MockModule->new(
 );
 
 foreach my $test (keys %tests) {
-    # redefine getWmiObjects function
     $module->mock(
         'getWmiObjects',
         mockGetWmiObjects($test)
@@ -62,6 +61,6 @@ foreach my $test (keys %tests) {
     is_deeply(
         \@memories,
         $tests{$test},
-        "$test memory"
+        "$test sample"
     );
 }
diff --git a/t/inventory/windows/printers.t b/t/inventory/windows/printers.t
index ca6ba26..f890c4d 100755
--- a/t/inventory/windows/printers.t
+++ b/t/inventory/windows/printers.t
@@ -53,7 +53,7 @@ foreach my $test (keys %tests) {
         is(
             FusionInventory::Agent::Task::Inventory::Input::Win32::Printers::_getUSBPrinterSerial($port),
             $tests{$test}->{$port},
-            "serial for printer $port"
+            "$test sample, $port printer"
         );
     }
 }
diff --git a/t/inventory/windows/usb.t b/t/inventory/windows/usb.t
index 85300c7..4312095 100755
--- a/t/inventory/windows/usb.t
+++ b/t/inventory/windows/usb.t
@@ -96,7 +96,6 @@ my $module = Test::MockModule->new(
 );
 
 foreach my $test (keys %tests) {
-    # redefine getWmiObjects function
     $module->mock(
         'getWmiObjects',
         mockGetWmiObjects($test)
@@ -106,6 +105,6 @@ foreach my $test (keys %tests) {
     is_deeply(
         \@devices,
         $tests{$test},
-        "$test USB devices list"
+        "$test sample"
     );
 }


================================================================
  Commit: 2bef74b1cbcc141ec7ddc8b4b245f5f738c59e22
      https://github.com/fusinv/fusioninventory-agent/commit/2bef74b1cbcc141ec7ddc8b4b245f5f738c59e22
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-04 (Sun, 04 Mar 2012)

  Changed paths:
    A resources/bsd/fstab/freebsd-1
    A t/inventory/bsd/storages.t

  Log Message:
  -----------
  initial import


diff --git a/resources/bsd/fstab/freebsd-1 b/resources/bsd/fstab/freebsd-1
new file mode 100644
index 0000000..41bfd9a
--- /dev/null
+++ b/resources/bsd/fstab/freebsd-1
@@ -0,0 +1,5 @@
+# Device                Mountpoint      FStype  Options         Dump    Pass#
+/dev/da0s1b             none            swap    sw              0       0
+/dev/da0s1a             /               ufs     rw              1       1
+/dev/da0s1d             /usr            ufs     rw              2       2
+/dev/acd0               /cdrom          cd9660  ro,noauto       0       0
diff --git a/t/inventory/bsd/storages.t b/t/inventory/bsd/storages.t
new file mode 100755
index 0000000..feb6f3e
--- /dev/null
+++ b/t/inventory/bsd/storages.t
@@ -0,0 +1,33 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+use Test::More;
+
+use FusionInventory::Agent::Task::Inventory::Input::BSD::Storages;
+
+my %tests = (
+    'freebsd-1' => [
+        {
+            'DESCRIPTION' => 'da0s1b'
+        },
+        {
+            'DESCRIPTION' => 'da0s1a'
+        },
+        {
+            'DESCRIPTION' => 'da0s1d'
+        },
+        {
+            'DESCRIPTION' => 'acd0'
+        }
+    ]
+);
+
+plan tests => scalar keys %tests;
+
+foreach my $test (keys %tests) {
+    my $file = "resources/bsd/fstab/$test";
+    my @results = FusionInventory::Agent::Task::Inventory::Input::BSD::Storages::_getDevicesFromFstab(file => $file);
+    is_deeply(\@results, $tests{$test}, $test);
+}


================================================================
  Commit: 94ec4c2342968a442e7313a70bbe22781b07d49b
      https://github.com/fusinv/fusioninventory-agent/commit/94ec4c2342968a442e7313a70bbe22781b07d49b
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-04 (Sun, 04 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Storages.pm

  Log Message:
  -----------
  isolate parsing for testing purposes


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Storages.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Storages.pm
index 1da4c35..5ccb884 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Storages.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Storages.pm
@@ -16,16 +16,7 @@ sub doInventory {
     my $logger    = $params{logger};
 
     # get a list of devices from /etc/fstab
-    my $handle = getFileHandle(file => '/etc/fstab', logger => $logger);
-    return unless $handle;
-
-    my (@devices, %seen);
-    while (my $line = <$handle>) {
-        next unless $line =~ m{/^/dev/(\S+)};
-        next if $seen{$1}++;
-        push @devices, { DESCRIPTION => $1 };
-    }
-    close $handle;
+    my @devices = _getDevicesFromFstab();
 
     # parse dmesg
     my @lines = getAllLines(
@@ -60,4 +51,24 @@ sub doInventory {
     }
 }
 
+sub _getDevicesFromFstab {
+    my (%params) = (
+        file => '/etc/fstab',
+        @_
+    );
+
+    my $handle = getFileHandle(%params);
+    return unless $handle;
+
+    my (@devices, %seen);
+    while (my $line = <$handle>) {
+        next unless $line =~ m{/^/dev/(\S+)};
+        next if $seen{$1}++;
+        push @devices, { DESCRIPTION => $1 };
+    }
+    close $handle;
+
+    return @devices;
+}
+
 1;


================================================================
  Commit: 607b2207a388d8c87a78ad2e324616945b87acca
      https://github.com/fusinv/fusioninventory-agent/commit/607b2207a388d8c87a78ad2e324616945b87acca
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-04 (Sun, 04 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Storages.pm

  Log Message:
  -----------
  fix  regexp


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Storages.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Storages.pm
index 5ccb884..e024296 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Storages.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Storages.pm
@@ -62,7 +62,7 @@ sub _getDevicesFromFstab {
 
     my (@devices, %seen);
     while (my $line = <$handle>) {
-        next unless $line =~ m{/^/dev/(\S+)};
+        next unless $line =~ m{^/dev/(\S+)};
         next if $seen{$1}++;
         push @devices, { DESCRIPTION => $1 };
     }


================================================================
  Commit: 39f87ead622d564c64e4f11712be3e81290776a6
      https://github.com/fusinv/fusioninventory-agent/commit/39f87ead622d564c64e4f11712be3e81290776a6
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-04 (Sun, 04 Mar 2012)

  Changed paths:
    M README

  Log Message:
  -----------
  out of topic


diff --git a/README b/README
index 754f87c..70d3950 100644
--- a/README
+++ b/README
@@ -58,12 +58,6 @@ The available workaround:
 
 System-specific informations
 ----------------------------
-
-On Solaris, Sun Studio seems to be needed to build the dependency. The
-generated Makefile needs gmake to be executed. The default installation will
-install the binary in /usr/perl5/5.XXXXX/bin, set your $PATH variable according
-to that.
-
 On Solaris/SPARC, you must install sneep and record the Serial Number with it.
 Download it from http://www.sun.com/download/products.xml?id=4304155a.
 


================================================================
  Commit: 9b21653d60dd929c0ddcb4c2aeed808c5030e473
      https://github.com/fusinv/fusioninventory-agent/commit/9b21653d60dd929c0ddcb4c2aeed808c5030e473
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-04 (Sun, 04 Mar 2012)

  Changed paths:
    M README

  Log Message:
  -----------
  documentation update


diff --git a/README b/README
index 70d3950..de519d3 100644
--- a/README
+++ b/README
@@ -72,10 +72,10 @@ They are two different ways to run the agent:
 - as a permanent process, staying in memory permanently (daemon under Unix,
   service under Windows)
 
-In the first case, the agent execution scheduling is completly controlled by
-the agent, through a dedicated system, such as cron under Unix, or XXX under
-Windows. In second case, the agent execution scheduling is server-controlled,
-as the agent runs regulary according to a parameter initially set in its
+In the first case, the agent execution scheduling is controlled from local
+system, through cron under Unix, or scheduled tasks under Windows. In second
+case, the agent execution scheduling is controlled from GLPI server, as the
+agent runs regulary according to a parameter initially set in its
 configuration (delaytime), overrided by the server at the first connection
 (PROLOG_FREQ). Additionaly, the server may also initiate additional
 out-of-schedule executions by sending HTTP requests if the web interface is


================================================================
  Commit: 004fb32f1388b69eab7a07b5a99bfb5c38277054
      https://github.com/fusinv/fusioninventory-agent/commit/004fb32f1388b69eab7a07b5a99bfb5c38277054
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-04 (Sun, 04 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Storages.pm

  Log Message:
  -----------
  cosmetics


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Storages.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Storages.pm
index d0733bb..1b01862 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Storages.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Storages.pm
@@ -106,15 +106,13 @@ sub _getDescription {
 
     # detected as USB by udev
     # TODO maybe we should trust udev detection by default?
-    return "USB" if (defined ($description) && $description =~ /usb/i);
+    return "USB" if ($description && $description =~ /usb/i);
 
     if ($name =~ /^s/) { # /dev/sd* are SCSI _OR_ SATA
         if (
-        ($manufacturer && ($manufacturer =~ /ATA/))
-        ||
-        ($serialnumber && ($serialnumber =~ /ATA/))
-        ||
-        ($description && ($description =~ /ATA/))
+            ($manufacturer && $manufacturer =~ /ATA/) ||
+            ($serialnumber && $serialnumber =~ /ATA/) ||
+            ($description && $description =~ /ATA/)
         ) {
             return  "SATA";
         } else {


================================================================
  Commit: a6229d0d217f17d0206b8333dbc5fbec20aada09
      https://github.com/fusinv/fusioninventory-agent/commit/a6229d0d217f17d0206b8333dbc5fbec20aada09
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-04 (Sun, 04 Mar 2012)

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

  Log Message:
  -----------
  better regexp


diff --git a/lib/FusionInventory/Agent/Tools/Linux.pm b/lib/FusionInventory/Agent/Tools/Linux.pm
index f2e90d4..f4c8b07 100644
--- a/lib/FusionInventory/Agent/Tools/Linux.pm
+++ b/lib/FusionInventory/Agent/Tools/Linux.pm
@@ -186,7 +186,7 @@ sub getDevicesFromProc {
     return unless $handle;
 
     while (my $line = <$handle>) {
-        next unless $line =~ (/^\/dev\/([sh]d[a-z])/);
+        next unless $line =~ m{^/dev/([sh]d[a-z])};
         push(@names, $1);
     }
     close $handle;


================================================================
  Commit: 20620c2efce96d8ad78edfe890abe067789f8df0
      https://github.com/fusinv/fusioninventory-agent/commit/20620c2efce96d8ad78edfe890abe067789f8df0
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-04 (Sun, 04 Mar 2012)

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

  Log Message:
  -----------
  handle virtual drives too (#1075)


diff --git a/lib/FusionInventory/Agent/Tools/Linux.pm b/lib/FusionInventory/Agent/Tools/Linux.pm
index f4c8b07..7745423 100644
--- a/lib/FusionInventory/Agent/Tools/Linux.pm
+++ b/lib/FusionInventory/Agent/Tools/Linux.pm
@@ -170,7 +170,7 @@ sub getDevicesFromProc {
     my @names;
 
     foreach my $file (glob ("/sys/block/*")) {
-        next unless $file =~ /([sh]d[a-z]|fd\d)$/;
+        next unless $file =~ /([shv]d[a-z]|fd\d)$/;
         push(@names, $1);
     }
 
@@ -186,7 +186,7 @@ sub getDevicesFromProc {
     return unless $handle;
 
     while (my $line = <$handle>) {
-        next unless $line =~ m{^/dev/([sh]d[a-z])};
+        next unless $line =~ m{^/dev/([shv]d[a-z])};
         push(@names, $1);
     }
     close $handle;


================================================================
  Commit: 9c47ab4e9bb6bff17fa14d0ae4afb537f370229c
      https://github.com/fusinv/fusioninventory-agent/commit/9c47ab4e9bb6bff17fa14d0ae4afb537f370229c
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-04 (Sun, 04 Mar 2012)

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

  Log Message:
  -----------
  fix _getValueFromSysProc usage

pass it the device name, not the device object
make _getValueFromSysProc return undef in whatever context


diff --git a/lib/FusionInventory/Agent/Tools/Linux.pm b/lib/FusionInventory/Agent/Tools/Linux.pm
index 7745423..ec5a364 100644
--- a/lib/FusionInventory/Agent/Tools/Linux.pm
+++ b/lib/FusionInventory/Agent/Tools/Linux.pm
@@ -166,12 +166,14 @@ sub getDevicesFromHal {
 sub getDevicesFromProc {
     my (%params) = @_;
 
+    my $logger = $params{logger};
+
     # compute list of devices
     my @names;
 
     foreach my $file (glob ("/sys/block/*")) {
         next unless $file =~ /([shv]d[a-z]|fd\d)$/;
-        push(@names, $1);
+        push @names, $1;
     }
 
     my $command = getFirstLine(command => '/sbin/fdisk -v') =~ '^GNU' ?
@@ -180,14 +182,14 @@ sub getDevicesFromProc {
 
     my $handle = getFileHandle(
         command => $command,
-        logger => $params{logger}
+        logger  => $logger
     );
 
     return unless $handle;
 
     while (my $line = <$handle>) {
         next unless $line =~ m{^/dev/([shv]d[a-z])};
-        push(@names, $1);
+        push @names, $1;
     }
     close $handle;
 
@@ -198,25 +200,17 @@ sub getDevicesFromProc {
     # extract informations
     my @devices;
     foreach my $name (@names) {
-        my $device;
-        $device->{NAME}         = $name;
-        $device->{MANUFACTURER} = _getValueFromSysProc(
-            $params{logger}, $device, 'vendor'
-        );
-        $device->{MODEL}        = _getValueFromSysProc(
-            $params{logger}, $device, 'model'
-        );
-        $device->{FIRMWARE}     = _getValueFromSysProc(
-            $params{logger}, $device, 'rev'
-        );
-        $device->{SERIALNUMBER} = _getValueFromSysProc(
-            $params{logger}, $device, 'serial'
-        );
-        $device->{TYPE}         = _getValueFromSysProc(
-            $params{logger}, $device, 'removable'
-        ) ?
-            'removable' : 'disk';
-        push (@devices, $device);
+        my $device = {
+            NAME         => $name,
+            MANUFACTURER => _getValueFromSysProc($logger, $name, 'vendor'),
+            MODEL        => _getValueFromSysProc($logger, $name, 'model'),
+            FIRMWARE     => _getValueFromSysProc($logger, $name, 'rev'),
+            SERIALNUMBER => _getValueFromSysProc($logger, $name, 'serial'),
+            TYPE         =>
+                _getValueFromSysProc($logger, $name, 'removable') ?
+                    'removable' : 'disk'
+        };
+        push @devices, $device;
     }
 
     return @devices;
@@ -225,15 +219,17 @@ sub getDevicesFromProc {
 sub _getValueFromSysProc {
     my ($logger, $device, $key) = @_;
 
+    ## no critic (ExplicitReturnUndef)
+
     my $file =
         -f "/sys/block/$device/device/$key" ? "/sys/block/$device/device/$key" :
         -f "/proc/ide/$device/$key"         ? "/proc/ide/$device/$key" :
                                               undef;
 
-    return unless $file;
+    return undef unless $file;
 
     my $handle = getFileHandle(file => $file, logger => $logger);
-    return unless $handle;
+    return undef unless $handle;
 
     my $value = <$handle>;
     close $handle;


================================================================
  Commit: 1b660ce0b1d4e7293938a2c0221055509c844f07
      https://github.com/fusinv/fusioninventory-agent/commit/1b660ce0b1d4e7293938a2c0221055509c844f07
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-04 (Sun, 04 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory.pm

  Log Message:
  -----------
  use default PATH if needed (close #1129)


diff --git a/lib/FusionInventory/Agent/Task/Inventory.pm b/lib/FusionInventory/Agent/Task/Inventory.pm
index 0e25fd0..9c9aac7 100644
--- a/lib/FusionInventory/Agent/Task/Inventory.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory.pm
@@ -60,6 +60,14 @@ sub run {
         );
     }
 
+    if (not $ENV{PATH}) {
+        # set a minimal PATH if none is set (#1129)
+        $ENV{PATH} = '/sbin:/usr/sbin:/bin:/usr/bin';
+        $self->{logger}->debug(
+            "PATH is not set, using /sbin:/usr/sbin:/bin:/usr/bin as default"
+        );
+    }
+
     my %disabled = map { $_ => 1 } @{$self->{config}->{'no-category'}};
 
     $self->_initModulesList(\%disabled);


================================================================
  Commit: ed800a6a315aa5b3e04dc073e9daf2a6445938bf
      https://github.com/fusinv/fusioninventory-agent/commit/ed800a6a315aa5b3e04dc073e9daf2a6445938bf
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-04 (Sun, 04 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/Vmsystem.pm

  Log Message:
  -----------
  fix function name


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/Vmsystem.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/Vmsystem.pm
index fd478b7..fdf2227 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/Vmsystem.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/Vmsystem.pm
@@ -200,7 +200,7 @@ sub _getStatus {
             file => '/proc/scsi/scsi',
             logger => $logger
         );
-        $result = _matchPattern($handle);
+        $result = _matchPatterns($handle);
         close $handle;
     }
     return $result if $result;


================================================================
  Commit: 3737dbb5864feb5c18ade6751c87a3046e93b370
      https://github.com/fusinv/fusioninventory-agent/commit/3737dbb5864feb5c18ade6751c87a3046e93b370
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-04 (Sun, 04 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Storages.pm

  Log Message:
  -----------
  pass logger object


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Storages.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Storages.pm
index e024296..ea790ad 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Storages.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Storages.pm
@@ -16,7 +16,7 @@ sub doInventory {
     my $logger    = $params{logger};
 
     # get a list of devices from /etc/fstab
-    my @devices = _getDevicesFromFstab();
+    my @devices = _getDevicesFromFstab(logger => $logger);
 
     # parse dmesg
     my @lines = getAllLines(


================================================================
  Commit: 52596773e88e4faed6e28ed41705956b8fa9c302
      https://github.com/fusinv/fusioninventory-agent/commit/52596773e88e4faed6e28ed41705956b8fa9c302
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-04 (Sun, 04 Mar 2012)

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

  Log Message:
  -----------
  document new function


diff --git a/lib/FusionInventory/Agent/Tools/Win32.pm b/lib/FusionInventory/Agent/Tools/Win32.pm
index eaa0396..8654023 100644
--- a/lib/FusionInventory/Agent/Tools/Win32.pm
+++ b/lib/FusionInventory/Agent/Tools/Win32.pm
@@ -209,6 +209,20 @@ E.g: HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/ProductName
 
 =back
 
+=head2 getRegistryKey(%params)
+
+Returns a key from the registry.
+
+=over
+
+=item path a string in hive/key format
+
+E.g: HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion
+
+=item logger
+
+=back
+
 =head2 getHostnameFromKernel32
 
 Returns the computer name and its domain, as a list.


================================================================
  Commit: fa98dee777dc5da225b0a529cca3bdf9882f0ac5
      https://github.com/fusinv/fusioninventory-agent/commit/fa98dee777dc5da225b0a529cca3bdf9882f0ac5
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-04 (Sun, 04 Mar 2012)

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

  Log Message:
  -----------
  drop removed function documentation


diff --git a/lib/FusionInventory/Agent/Tools/Win32.pm b/lib/FusionInventory/Agent/Tools/Win32.pm
index 8654023..f062ac7 100644
--- a/lib/FusionInventory/Agent/Tools/Win32.pm
+++ b/lib/FusionInventory/Agent/Tools/Win32.pm
@@ -222,7 +222,3 @@ E.g: HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion
 =item logger
 
 =back
-
-=head2 getHostnameFromKernel32
-
-Returns the computer name and its domain, as a list.


================================================================
  Commit: 3b17ce63274c17f2ae13a0648d11afab77ff1408
      https://github.com/fusinv/fusioninventory-agent/commit/3b17ce63274c17f2ae13a0648d11afab77ff1408
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-04 (Sun, 04 Mar 2012)

  Changed paths:
    M Makefile.PL

  Log Message:
  -----------
  revert junit format test target for now

it breaks test harness files list


diff --git a/Makefile.PL b/Makefile.PL
index f325069..baf80b9 100644
--- a/Makefile.PL
+++ b/Makefile.PL
@@ -203,16 +203,3 @@ fusioninventory-agent.1.html: fusioninventory-agent
 EOF
     return $manifypods;
 }
-
-sub test {
-    my ($self) = @_;
-    my $test = $self->SUPER::test(@_);
-
-    $test .= <<'EOF';
-%-junit.xml:
-	prove --lib --timer --recurse --formatter TAP::Formatter::JUnit t \
-	    > $@
-EOF
-
-    return $test;
-}


================================================================
  Commit: 14ae58d0df7ea077b82e8a54654dabc794ea164e
      https://github.com/fusinv/fusioninventory-agent/commit/14ae58d0df7ea077b82e8a54654dabc794ea164e
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-04 (Sun, 04 Mar 2012)

  Changed paths:
    M t/tools/network.t

  Log Message:
  -----------
  fix getNetworkMask usage


diff --git a/t/tools/network.t b/t/tools/network.t
index 915d24e..6bb1121 100755
--- a/t/tools/network.t
+++ b/t/tools/network.t
@@ -67,7 +67,7 @@ foreach my $test (@alt2canonical_tests) {
 
 foreach my $test (@mask_tests) {
     is(
-        getNetworkMask($test->[0], $test->[1]),
+        getNetworkMask($test->[1]),
         $test->[2],
         "$test->[0]/$test->[1] mask extraction"
     );


================================================================
  Commit: f6d43adcffb8590235cfe16f4429e27c90b51ad9
      https://github.com/fusinv/fusioninventory-agent/commit/f6d43adcffb8590235cfe16f4429e27c90b51ad9
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-04 (Sun, 04 Mar 2012)

  Changed paths:
    A resources/solaris/psrinfo/sample1
    A resources/solaris/smbios/x86-3

  Log Message:
  -----------
  initial import


diff --git a/resources/solaris/psrinfo/sample1 b/resources/solaris/psrinfo/sample1
new file mode 100644
index 0000000..a3394c3
--- /dev/null
+++ b/resources/solaris/psrinfo/sample1
@@ -0,0 +1,32 @@
+Status of virtual processor 0 as of: 08/10/2011 11:48:03
+  on-line since 08/02/2011 11:06:56.
+  The i386 processor operates at 2133 MHz,
+        and has an i387 compatible floating point processor.
+Status of virtual processor 1 as of: 08/10/2011 11:48:03
+  on-line since 08/02/2011 11:07:02.
+  The i386 processor operates at 2133 MHz,
+        and has an i387 compatible floating point processor.
+Status of virtual processor 2 as of: 08/10/2011 11:48:03
+  on-line since 08/02/2011 11:07:02.
+  The i386 processor operates at 2133 MHz,
+        and has an i387 compatible floating point processor.
+Status of virtual processor 3 as of: 08/10/2011 11:48:03
+  on-line since 08/02/2011 11:07:02.
+  The i386 processor operates at 2133 MHz,
+        and has an i387 compatible floating point processor.
+Status of virtual processor 4 as of: 08/10/2011 11:48:03
+  on-line since 08/02/2011 11:07:02.
+  The i386 processor operates at 2133 MHz,
+        and has an i387 compatible floating point processor.
+Status of virtual processor 5 as of: 08/10/2011 11:48:03
+  on-line since 08/02/2011 11:07:02.
+  The i386 processor operates at 2133 MHz,
+        and has an i387 compatible floating point processor.
+Status of virtual processor 6 as of: 08/10/2011 11:48:03
+  on-line since 08/02/2011 11:07:03.
+  The i386 processor operates at 2133 MHz,
+        and has an i387 compatible floating point processor.
+Status of virtual processor 7 as of: 08/10/2011 11:48:03
+  on-line since 08/02/2011 11:07:03.
+  The i386 processor operates at 2133 MHz,
+        and has an i387 compatible floating point processor.
diff --git a/resources/solaris/smbios/x86-3 b/resources/solaris/smbios/x86-3
new file mode 100644
index 0000000..834f8c0
--- /dev/null
+++ b/resources/solaris/smbios/x86-3
@@ -0,0 +1,90 @@
+ID    SIZE TYPE
+1     18   SMB_TYPE_IPMIDEV (IPMI device information)
+
+  Type: 1 (KCS: Keyboard Controller Style)
+  BMC IPMI Version: 2.0
+  i2c Bus Slave Address: 0x20
+  NV Storage Device Bus ID: 0xffffffff
+  BMC Base Address: 0xca2
+  Interrupt Number: 0
+  Register Spacing: 1
+  Flags: 0x9
+    SMB_IPMI_F_IOADDR (base address is in i/o space)
+    SMB_IPMI_F_INTREDGE (intr is edge triggered (else lvl))
+
+ID    SIZE TYPE
+2     53   SMB_TYPE_SYSTEM (system information)
+
+  Manufacturer: Intel
+  Product: MP Server
+
+  UUID: 4b713db6-6d40-11dd-b32c-000123456789
+  Wake-Up Event: 0x6 (power switch)
+  SKU Number: 6I012345TF
+  Family: 
+
+ID    SIZE TYPE
+3     56   SMB_TYPE_BASEBOARD (base board)
+
+  Manufacturer: Intel
+  Product: S7000FC4UR
+  Serial Number: QSFX12345678
+  Asset Tag: 6I012345TF
+
+  Chassis: 0
+  Flags: 0x9
+    SMB_BBFL_MOTHERBOARD (board is a motherboard)
+    SMB_BBFL_REPLACABLE (board is field-replacable)
+  Board Type: 0xa (motherboard)
+
+ID    SIZE TYPE
+4     64   SMB_TYPE_CHASSIS (system enclosure or chassis)
+
+  Manufacturer: TRANSTEC
+  Version: E10476-011
+  Serial Number: QSDH1234567
+  Asset Tag: 6I012345TF
+
+  OEM Data: 0x81581cf8
+  Lock Present: N
+  Chassis Type: 0x17 (rack mount chassis)
+  Boot-Up State: 0x3 (safe)
+  Power Supply State: 0x3 (safe)
+  Thermal State: 0x3 (safe)
+  Chassis Height: 1u
+  Power Cords: 1
+  Element Records: 0
+
+ID    SIZE TYPE
+5     87   SMB_TYPE_BIOS (BIOS information)
+
+  Vendor: Intel Corporation
+  Version String: SFC4UR.86B.01.00.0029.071220092126
+  Release Date: 07/12/2009
+  Address Segment: 0xe800
+  ROM Size: 8388608 bytes
+  Image Size: 98304 bytes
+  Characteristics: 0x15c099a80
+    SMB_BIOSFL_PCI (PCI is supported)
+    SMB_BIOSFL_PLUGNPLAY (Plug and Play is supported)
+    SMB_BIOSFL_FLASH (BIOS is Flash Upgradeable)
+    SMB_BIOSFL_SHADOW (BIOS shadowing is allowed)
+    SMB_BIOSFL_CDBOOT (Boot from CD is supported)
+    SMB_BIOSFL_SELBOOT (Selectable Boot supported)
+    SMB_BIOSFL_EDD (EDD Spec is supported)
+    SMB_BIOSFL_I5_PRINT (int 0x5 print screen svcs)
+    SMB_BIOSFL_I9_KBD (int 0x9 8042 keyboard svcs)
+    SMB_BIOSFL_I14_SER (int 0x14 serial svcs)
+    SMB_BIOSFL_I10_CGA (int 0x10 CGA svcs)
+    0x100000000
+  Characteristics Extension Byte 1: 0x33
+    SMB_BIOSXB1_ACPI (ACPI is supported)
+    SMB_BIOSXB1_USBL (USB legacy is supported)
+    SMB_BIOSXB1_LS120 (LS-120 boot is supported)
+    SMB_BIOSXB1_ATZIP (ATAPI ZIP drive boot is supported)
+  Characteristics Extension Byte 2: 0x7
+    SMB_BIOSXB2_BBOOT (BIOS Boot Specification supported)
+    SMB_BIOSXB2_FKNETSVC (F-key Network Svc boot supported)
+    SMB_BIOSXB2_ETCDIST (Enable Targeted Content Distrib.)
+  Version Number: 0.0
+  Embedded Ctlr Firmware Version Number: 0.0


================================================================
  Commit: 919b1ca2312d9de05b0ede4d30ea632e817fe018
      https://github.com/fusinv/fusioninventory-agent/commit/919b1ca2312d9de05b0ede4d30ea632e817fe018
  Author: Guillaume Rousse <guillomovitch at gmail.com>
  Date:   2012-03-04 (Sun, 04 Mar 2012)

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

  Log Message:
  -----------
  silent warning, end user don't care


diff --git a/lib/FusionInventory/Agent/Tools/Hostname.pm b/lib/FusionInventory/Agent/Tools/Hostname.pm
index 3c73a80..fdc2091 100644
--- a/lib/FusionInventory/Agent/Tools/Hostname.pm
+++ b/lib/FusionInventory/Agent/Tools/Hostname.pm
@@ -9,6 +9,7 @@ use English qw(-no_match_vars);
 
 BEGIN {
     if ($OSNAME eq 'MSWin32') {
+        no warnings 'redefine';
         Win32::API->require();
         # Kernel32.dll is used more or less everywhere.
         # Without this, Win32::API will release the DLL even


================================================================
  Commit: d6a36a8f1a2a2d4e935d4d44c7231784efc68009
      https://github.com/fusinv/fusioninventory-agent/commit/d6a36a8f1a2a2d4e935d4d44c7231784efc68009
  Author: Guillaume Rousse <guillomovitch at gmail.com>
  Date:   2012-03-04 (Sun, 04 Mar 2012)

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

  Log Message:
  -----------
  cosmetics


diff --git a/lib/FusionInventory/Agent/Tools/Hostname.pm b/lib/FusionInventory/Agent/Tools/Hostname.pm
index fdc2091..16fcfed 100644
--- a/lib/FusionInventory/Agent/Tools/Hostname.pm
+++ b/lib/FusionInventory/Agent/Tools/Hostname.pm
@@ -20,21 +20,22 @@ BEGIN {
 
 sub getHostname {
 
-    if ($OSNAME eq 'MSWin32') {
-        my $GetComputerName = Win32::API->new("kernel32", "GetComputerNameExW", ["I", "P", "P"], "N");
-        my $buffer = "\x00" x 1024;
-        my $N=1024;#pack ("c4", 160,0,0,0);
-
-        $GetComputerName->Call(3, $buffer, $N);
-
-        # GetComputerNameExW returns the string in UTF16, we have to change it
-        # to UTF8
-        return encode("UTF-8", substr(decode("UCS-2le", $buffer),0,ord $N));
-    } else {
+    if ($OSNAME ne 'MSWin32') {
         Sys::Hostname->require();
         return Sys::Hostname::hostname();
     }
 
+    my $getComputerName = Win32::API->new(
+        "kernel32", "GetComputerNameExW", ["I", "P", "P"], "N"
+    );
+    my $buffer = "\x00" x 1024;
+    my $n = 1024; #pack ("c4", 160,0,0,0);
+
+    $getComputerName->Call(3, $buffer, $n);
+
+    # GetComputerNameExW returns the string in UTF16, we have to change it
+    # to UTF8
+    return encode("UTF-8", substr(decode("UCS-2le", $buffer), 0, ord $n));
 }
 
 1;


================================================================
  Commit: 6787614687d5fc4262e86ae399c5185f6102cdc6
      https://github.com/fusinv/fusioninventory-agent/commit/6787614687d5fc4262e86ae399c5185f6102cdc6
  Author: Guillaume Rousse <guillomovitch at gmail.com>
  Date:   2012-03-04 (Sun, 04 Mar 2012)

  Changed paths:
    M t/apps/agent.t

  Log Message:
  -----------
  use another variable under Windows


diff --git a/t/apps/agent.t b/t/apps/agent.t
index ec53755..a76ebdd 100755
--- a/t/apps/agent.t
+++ b/t/apps/agent.t
@@ -145,7 +145,10 @@ ok(
     'inventory has environment variables'
 );
 
-my $path = $ENV{PATH};
+# PATH through WMI appears with %SystemRoot% templates, preventing direct
+# comparaison with %ENV content
+my $name = $OSNAME eq 'MSWin32' ? 'PATHEXT' : 'PATH';
+my $value = $ENV{$name};
 
 ($out, $err, $rc) = run_agent(
     "$base_options --no-category printer,software"
@@ -173,7 +176,7 @@ ok(
 
 ok(
     (any
-        { $_->{KEY} eq 'PATH' && $_->{VAL} eq $path } 
+        { $_->{KEY} eq $name && $_->{VAL} eq $value } 
         @{$content->{REQUEST}->{CONTENT}->{ENVS}}
     ),
     'inventory has expected environment variable value'


================================================================
  Commit: 9d4cdff42dde567ad77894a6ec4b69e7490b52da
      https://github.com/fusinv/fusioninventory-agent/commit/9d4cdff42dde567ad77894a6ec4b69e7490b52da
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-03-05 (Mon, 05 Mar 2012)

  Changed paths:
    M README

  Log Message:
  -----------
  doc: add comment regarding printer in user settings

closes: #980

Reported-by: jerome slayer <slayerjerome at yahoo.fr>


diff --git a/README b/README
index 754f87c..8a6ed04 100644
--- a/README
+++ b/README
@@ -67,6 +67,12 @@ to that.
 On Solaris/SPARC, you must install sneep and record the Serial Number with it.
 Download it from http://www.sun.com/download/products.xml?id=4304155a.
 
+The Windows installer will run the agent with the SYSTEM account. If you use
+an user GPO to configure the printer, the information will hidden and so not
+collected.
+To avoid this situation, you can turn off the server, and run the agent with
+user privilege, for example during the login.
+
 On Windows, if you don't want to use the installer for Windows you can follow
 the installation process avalailable from
 http://forge.fusioninventory.org/projects/fusioninventory-agent/wiki/RunAgentWin32.


================================================================
  Commit: 69c7d3869b82249e3eadf222d4af808092cd3b16
      https://github.com/fusinv/fusioninventory-agent/commit/69c7d3869b82249e3eadf222d4af808092cd3b16
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-03-05 (Mon, 05 Mar 2012)

  Changed paths:
    M Makefile.PL
    M README
    M lib/FusionInventory/Agent/Task/Inventory.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/AIX/Bios.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/AIX/LVM.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/Alpha.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/MIPS.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/SPARC.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/i386.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Storages.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Archs/PowerPC.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Storages.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Bios.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/CPU.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/Vmsystem.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Bios.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/CPU.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Memory.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/OS.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Printers.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm
    M lib/FusionInventory/Agent/Task/Inventory/Inventory.pm
    M lib/FusionInventory/Agent/Tools/Hostname.pm
    M lib/FusionInventory/Agent/Tools/Linux.pm
    M lib/FusionInventory/Agent/Tools/Win32.pm
    A resources/bsd/fstab/freebsd-1
    A resources/generic/dmidecode/windows-7
    A resources/generic/dmidecode/windows-xppro
    A resources/solaris/prtconf/SPARC-1
    R resources/solaris/psrinfo/sample-1
    A resources/solaris/psrinfo/sample1
    R resources/solaris/showrev-SPARC-1
    R resources/solaris/showrev-SPARC-2
    R resources/solaris/showrev-x86-1
    R resources/solaris/showrev-x86-2
    A resources/solaris/showrev/SPARC-1
    A resources/solaris/showrev/SPARC-2
    A resources/solaris/showrev/x86-1
    A resources/solaris/showrev/x86-2
    A resources/solaris/showrev/x86-3
    A resources/solaris/smbios/x86-1
    A resources/solaris/smbios/x86-3
    A resources/win32/registry/2003-CentralProcessor.reg
    A resources/win32/registry/2003SP2-CentralProcessor.reg
    A resources/win32/registry/7-CentralProcessor.reg
    A resources/win32/registry/xp-CentralProcessor.reg
    A resources/win32/wmi/2003-Win32_PhysicalMemory.wmi
    A resources/win32/wmi/2003-Win32_Processor.wmi
    A resources/win32/wmi/2003SP2-Win32_PhysicalMemory.wmi
    A resources/win32/wmi/2003SP2-Win32_Processor.wmi
    A resources/win32/wmi/7-Win32_PhysicalMemory.wmi
    A resources/win32/wmi/7-Win32_PhysicalMemoryArray.wmi
    A resources/win32/wmi/7-Win32_Processor.wmi
    A resources/win32/wmi/xp-Win32_PhysicalMemory.wmi
    A resources/win32/wmi/xp-Win32_Processor.wmi
    M t/FusionInventory/Test/Utils.pm
    M t/apps/agent.t
    A t/inventory/bsd/storages.t
    M t/inventory/generic/dmidecode/memory.t
    A t/inventory/solaris/bios.t
    M t/inventory/solaris/cpu.t
    A t/inventory/windows/cpu.t
    A t/inventory/windows/memory.t
    M t/inventory/windows/printers.t
    M t/inventory/windows/usb.t
    M t/tools/generic.t
    M t/tools/network.t

  Log Message:
  -----------
  Merge remote-tracking branch 'origin/2.2.x' into 2.2.x


diff --git a/Makefile.PL b/Makefile.PL
index a5863a6..baf80b9 100644
--- a/Makefile.PL
+++ b/Makefile.PL
@@ -37,13 +37,14 @@ if ($OSNAME ne 'MSWin32') {
 }
 
 # test dependencies
-test_requires  'Test::More'                   => '0.93'; # subtest
-test_requires  'IPC::Run'                     => undef;
 test_requires  'HTTP::Proxy'                  => undef;
 test_requires  'HTTP::Server::Simple'         => undef;
 test_requires  'HTTP::Server::Simple::Authen' => undef;
 test_requires  'IO::Capture::Stderr'          => undef;
+test_requires  'IPC::Run'                     => undef;
 test_requires  'Test::Exception'              => undef;
+test_requires  'Test::MockModule'             => undef;
+test_requires  'Test::More'                   => '0.93'; # subtest
 test_requires  'YAML'                         => undef;
 
 install_script  'fusioninventory-agent';
@@ -202,16 +203,3 @@ fusioninventory-agent.1.html: fusioninventory-agent
 EOF
     return $manifypods;
 }
-
-sub test {
-    my ($self) = @_;
-    my $test = $self->SUPER::test(@_);
-
-    $test .= <<'EOF';
-%-junit.xml:
-	prove --lib --timer --recurse --formatter TAP::Formatter::JUnit t \
-	    > $@
-EOF
-
-    return $test;
-}
diff --git a/README b/README
index 8a6ed04..893398d 100644
--- a/README
+++ b/README
@@ -58,12 +58,6 @@ The available workaround:
 
 System-specific informations
 ----------------------------
-
-On Solaris, Sun Studio seems to be needed to build the dependency. The
-generated Makefile needs gmake to be executed. The default installation will
-install the binary in /usr/perl5/5.XXXXX/bin, set your $PATH variable according
-to that.
-
 On Solaris/SPARC, you must install sneep and record the Serial Number with it.
 Download it from http://www.sun.com/download/products.xml?id=4304155a.
 
@@ -84,10 +78,10 @@ They are two different ways to run the agent:
 - as a permanent process, staying in memory permanently (daemon under Unix,
   service under Windows)
 
-In the first case, the agent execution scheduling is completly controlled by
-the agent, through a dedicated system, such as cron under Unix, or XXX under
-Windows. In second case, the agent execution scheduling is server-controlled,
-as the agent runs regulary according to a parameter initially set in its
+In the first case, the agent execution scheduling is controlled from local
+system, through cron under Unix, or scheduled tasks under Windows. In second
+case, the agent execution scheduling is controlled from GLPI server, as the
+agent runs regulary according to a parameter initially set in its
 configuration (delaytime), overrided by the server at the first connection
 (PROLOG_FREQ). Additionaly, the server may also initiate additional
 out-of-schedule executions by sending HTTP requests if the web interface is
diff --git a/lib/FusionInventory/Agent/Task/Inventory.pm b/lib/FusionInventory/Agent/Task/Inventory.pm
index 0e25fd0..9c9aac7 100644
--- a/lib/FusionInventory/Agent/Task/Inventory.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory.pm
@@ -60,6 +60,14 @@ sub run {
         );
     }
 
+    if (not $ENV{PATH}) {
+        # set a minimal PATH if none is set (#1129)
+        $ENV{PATH} = '/sbin:/usr/sbin:/bin:/usr/bin';
+        $self->{logger}->debug(
+            "PATH is not set, using /sbin:/usr/sbin:/bin:/usr/bin as default"
+        );
+    }
+
     my %disabled = map { $_ => 1 } @{$self->{config}->{'no-category'}};
 
     $self->_initModulesList(\%disabled);
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/AIX/Bios.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/AIX/Bios.pm
index 245c73b..00dc9ee 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/AIX/Bios.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/AIX/Bios.pm
@@ -22,30 +22,26 @@ sub doInventory {
     my $inventory = $params{inventory};
     my $logger    = $params{logger};
 
-    my ($serial, $model, $version, $date);
+    my $bios = {
+        BMANUFACTURER => 'IBM',
+        SMANUFACTURER => 'IBM',
+    };
 
     my @infos = getLsvpdInfos(logger => $logger);
 
     my $system = first { $_->{DS} eq 'System Firmware' } @infos;
-    $version = $system->{RM} if $system;
+    $bios->{BVERSION} = $system->{RM} if $system;
 
     my $platform = first { $_->{DS} eq 'Platform Firmware' } @infos;
-    $version .= "(Firmware : $platform->{RM})" if $platform;
+    $bios->{BVERSION} .= "(Firmware : $platform->{RM})" if $platform;
 
     my $vpd = first { $_->{DS} eq 'System VPD' } @infos;
     if ($vpd) {
-        $model = $vpd->{TM};
-        $serial = $vpd->{SE};
+        $bios->{SMODEL} = $vpd->{TM};
+        $bios->{SSN} = $vpd->{SE};
     }
 
-    $inventory->setBios({
-        BVERSION      => $version,
-        BDATE         => $date,
-        BMANUFACTURER => 'IBM',
-        SMANUFACTURER => 'IBM',
-        SMODEL        => $model,
-        SSN           => $serial,
-    });
+    $inventory->setBios($bios);
 }
 
 1;
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/AIX/LVM.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/AIX/LVM.pm
index f8c6bc0..3bb8c7f 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/AIX/LVM.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/AIX/LVM.pm
@@ -76,19 +76,37 @@ sub _getLogicalVolume {
     }
     close $handle;
 
-    my $size;
-    foreach (`lslv $volume->{LV_NAME}`) {
-        if (/.*PP SIZE:\s+(\d+) .*/) {
+    my ($size, $uuid) = _getVolumeInfo(
+        name   => $volume->{LV_NAME},
+        logger => $logger
+    );
+    $volume->{SIZE} = int($volume->{SEG_COUNT} * $size);
+    $volume->{LV_UUID} = $uuid;
+
+    return $volume;
+}
+
+sub _getVolumeInfo {
+    my (%params) = @_;
+
+    my $handle = getFileHandle( 
+        command => "lslv $params{name}",
+        logger  => $params{logger}
+    );
+    return unless $handle;
+
+    my ($size, $uuid);
+    while (my $line = <$handle>) {
+        if ($line =~ /.*PP SIZE:\s+(\d+) .*/) {
             $size = $1;
         }
-        if (/LV IDENTIFIER:\s+(\S+)/) {
-            $volume->{LV_UUID} = $1;
+        if ($line =~ /LV IDENTIFIER:\s+(\S+)/) {
+            $uuid = $1;
         }
     }
+    close $handle;
 
-    $volume->{SIZE} = int($volume->{SEG_COUNT} * $size);
-
-    return $volume;
+    return ($size, $uuid);
 }
 
 sub _getPhysicalVolumes {
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/Alpha.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/Alpha.pm
index b9d5d21..f89f671 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/Alpha.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/Alpha.pm
@@ -16,12 +16,16 @@ sub doInventory {
 
     my $inventory = $params{inventory};
 
+    my $bios = {
+        SMANUFACTURER => 'DEC',
+    };
+
     # sysctl infos
 
     # example on *BSD: AlphaStation 255 4/232
-    my $SystemModel = getFirstLine(command => 'sysctl -n hw.model');
+    $bios->{SMODEL} = getFirstLine(command => 'sysctl -n hw.model');
 
-    my $processorn = getFirstLine(command => 'sysctl -n hw.ncpu');
+    my $count = getFirstLine(command => 'sysctl -n hw.ncpu');
 
     # dmesg infos
 
@@ -35,24 +39,18 @@ sub doInventory {
     # AlphaStation 255 4/232, 232MHz
     # CPU: EV45 (21064A) major=6 minor=2
 
-    my ($processort, $processors);
+    my $cpu;
     foreach my $line (getAllLines(command => 'dmesg')) {
-        if ($line =~ /$SystemModel,\s*(\S+)\s*MHz/) { $processors = $1; }
-        if ($line =~ /^cpu[^:]*:\s*(.*)$/i)         { $processort = $1; }
+        if ($line =~ /$bios->{SMODEL},\s*(\S+)\s*MHz/) { $cpu->{SPEED} = $1; }
+        if ($line =~ /^cpu[^:]*:\s*(.*)$/i)            { $cpu->{NAME} = $1;  }
     }
 
-    $inventory->setBios({
-        SMANUFACTURER => 'DEC',
-        SMODEL        => $SystemModel,
-    });
+    $inventory->setBios($bios);
 
-    for my $i (1 .. $processorn) {
+    while ($count--) {
         $inventory->addEntry(
             section => 'CPUS',
-            entry   => {
-                NAME  => $processort,
-                SPEED => $processors,
-            }
+            entry   => $cpu
         );
     }
 
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/MIPS.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/MIPS.pm
index e79dbd0..00a7464 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/MIPS.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/MIPS.pm
@@ -15,14 +15,18 @@ sub doInventory {
     my (%params) = @_;
 
     my $inventory = $params{inventory};
+    
+    my $bios = {
+        SMANUFACTURER => 'SGI',
+    };
 
     # sysctl infos
 
     # example on NetBSD: SGI-IP22
     # example on OpenBSD: SGI-O2 (IP32)
-    my $SystemModel = getFirstLine(command => 'sysctl -n hw.model');
+    $bios->{SMODEL} = getFirstLine(command => 'sysctl -n hw.model');
 
-    my $processorn = getFirstLine(command => 'sysctl -n hw.ncpu');
+    my $count = getFirstLine(command => 'sysctl -n hw.ncpu');
 
     # dmesg infos
     
@@ -41,26 +45,19 @@ sub doInventory {
     # cpu0 at mainbus0: MIPS R5000 CPU rev 2.1 180 MHz with R5000 based FPC rev 1.0
     # cpu0: cache L1-I 32KB D 32KB 2 way, L2 512KB direct
 
-    my ($SystemSerial, $processort, $processors);
+    my $cpu;
     foreach my $line (getAllLines(command => 'dmesg')) {
-        if ($line =~ /$SystemModel\s*\[\S*\s*(\S*)\]/) { $SystemSerial = $1; }
-        if ($line =~ /cpu0 at mainbus0:\s*(.*)$/)      { $processort = $1;   }
-        if ($line =~ /CPU\s*.*\D(\d+)\s*MHz/)          { $processors = $1;   }
+        if ($line =~ /$bios->{SMODEL}\s*\[\S*\s*(\S*)\]/) { $bios->{SSN} = $1; }
+        if ($line =~ /cpu0 at mainbus0:\s*(.*)$/)         { $cpu->{NAME} = $1; }
+        if ($line =~ /CPU\s*.*\D(\d+)\s*MHz/)             { $cpu->{SPEED} = $1;  }
     }
 
-    $inventory->setBios({
-        SMANUFACTURER => 'SGI',
-        SMODEL        => $SystemModel,
-        SSN           => $SystemSerial,
-    });
+    $inventory->setBios($bios);
 
-    for my $i (1 .. $processorn) {
+    while ($count--) {
         $inventory->addEntry(
             section => 'CPUS',
-            entry   => {
-                NAME  => $processort,
-                SPEED => $processors,
-            }
+            entry   => $cpu
         );
     }
 }
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/SPARC.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/SPARC.pm
index 9cb1786..e467769 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/SPARC.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/SPARC.pm
@@ -16,19 +16,23 @@ sub doInventory {
 
     my $inventory = $params{inventory};
 
+    my $bios = {
+        SMANUFACTURER => 'SUN',
+    };
+
     # sysctl infos
 
     # it gives only the CPU on OpenBSD/sparc64
-    my $SystemModel = getFirstLine(command => 'sysctl -n hw.model');
+    $bios->{SMODEL} = getFirstLine(command => 'sysctl -n hw.model');
 
     # example on NetBSD: 0x807b65c
     # example on OpenBSD: 2155570635
-    my $SystemSerial = getFirstLine(command => 'sysctl -n kern.hostid');
+    $bios->{SSN} = getFirstLine(command => 'sysctl -n kern.hostid');
     # force hexadecimal, but remove 0x to make it appear as in the firmware
-    $SystemSerial = dec2hex($SystemSerial);
-    $SystemSerial =~ s/^0x//;
+    $bios->{SSN} = dec2hex($bios->{SSN});
+    $bios->{SSN} =~ s/^0x//;
 
-    my $processorn = getFirstLine(command => 'sysctl -n hw.ncpu');
+    my $count = getFirstLine(command => 'sysctl -n hw.ncpu');
 
     # dmesg infos
 
@@ -50,40 +54,32 @@ sub doInventory {
     # FreeBSD:
     # cpu0: Sun Microsystems UltraSparc-I Processor (167.00 MHz CPU)
 
-    my $processort;
+    my $cpu;
     foreach my $line (getAllLines(command => 'dmesg')) {
-        if ($line=~ /^mainbus0 \(root\):\s*(.*)$/) { $SystemModel = $1; }
-        if ($line =~ /^cpu[^:]*:\s*(.*)$/i)        { $processort = $1; }
+        if ($line=~ /^mainbus0 \(root\):\s*(.*)$/) { $bios->{SMODEL} = $1; }
+        if ($line =~ /^cpu[^:]*:\s*(.*)$/i)        { $cpu->{NAME}    = $1; }
     }
 
-    $SystemModel =~ s/SUNW,//;
-    $SystemModel =~ s/[:\(].*$//;
-    $SystemModel =~ s/^\s*//;
-    $SystemModel =~ s/\s*$//;
+    $bios->{SMODEL} =~ s/SUNW,//;
+    $bios->{SMODEL} =~ s/[:\(].*$//;
+    $bios->{SMODEL} =~ s/^\s*//;
+    $bios->{SMODEL} =~ s/\s*$//;
 
-    $processort =~ s/SUNW,//;
-    $processort =~ s/^\s*//;
-    $processort =~ s/\s*$//;
+    $cpu->{NAME} =~ s/SUNW,//;
+    $cpu->{NAME} =~ s/^\s*//;
+    $cpu->{NAME} =~ s/\s*$//;
 
-    my $processors;
     # XXX quick and dirty _attempt_ to get proc speed
-    if ( $processort =~ /(\d+)(\.\d+|)\s*mhz/i ) { # possible decimal point
-        $processors = sprintf("%.0f", "$1$2"); # round number
+    if ($cpu->{NAME} =~ /(\d+)(\.\d+|)\s*mhz/i ) { # possible decimal point
+        $cpu->{SPEED} = sprintf("%.0f", "$1$2"); # round number
     }
 
-    $inventory->setBios({
-        SMANUFACTURER => 'SUN',
-        SMODEL        => $SystemModel,
-        SSN           => $SystemSerial,
-    });
+    $inventory->setBios($bios);
 
-    for my $i (1 .. $processorn) {
+    while ($count--) {
         $inventory->addEntry(
             section => 'CPUS',
-            entry   => {
-                NAME  => $processort,
-                SPEED => $processors,
-            }
+            entry   => $cpu
         );
     }
 
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/i386.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/i386.pm
index 3cfefbf..bfa8b96 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/i386.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Archs/i386.pm
@@ -24,29 +24,25 @@ sub doInventory {
     my $logger    = $params{logger};
 
     # sysctl infos
+    my $bios = {
+        SMODEL => getFirstLine(command => 'sysctl -n hw.model')
+    };
+    my $cpu = {
+        NAME  => getFirstLine(command => 'sysctl -n hw.machine'),
+        SPEED => (getCanonicalSpeed(split(/\s+/, $bios->{SMODEL})))[-1]
+    };
+    my $count = getFirstLine(command => 'sysctl -n hw.ncpu');
 
-    my $SystemModel = getFirstLine(command => 'sysctl -n hw.model');
-    my $processorn = getFirstLine(command => 'sysctl -n hw.ncpu');
-    my $processort = getFirstLine(command => 'sysctl -n hw.machine');
-    my $processors = getCanonicalSpeed(
-        (split(/\s+/, $SystemModel))[-1]
-    );
-
-    $inventory->setBios({
-        SMODEL => $SystemModel,
-    });
+    $inventory->setBios($bios);
 
     # don't deal with CPUs if information can be computed from dmidecode
     my $infos = getInfosFromDmidecode(logger => $logger);
     return if $infos->{4};
 
-    for my $i (1 .. $processorn) {
+    while ($count--) {
         $inventory->addEntry(
             section => 'CPUS',
-            entry   => {
-                NAME  => $processort,
-                SPEED => $processors,
-            }
+            entry   => $cpu
         );
     }
 
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Storages.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Storages.pm
index 1da4c35..ea790ad 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Storages.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Storages.pm
@@ -16,16 +16,7 @@ sub doInventory {
     my $logger    = $params{logger};
 
     # get a list of devices from /etc/fstab
-    my $handle = getFileHandle(file => '/etc/fstab', logger => $logger);
-    return unless $handle;
-
-    my (@devices, %seen);
-    while (my $line = <$handle>) {
-        next unless $line =~ m{/^/dev/(\S+)};
-        next if $seen{$1}++;
-        push @devices, { DESCRIPTION => $1 };
-    }
-    close $handle;
+    my @devices = _getDevicesFromFstab(logger => $logger);
 
     # parse dmesg
     my @lines = getAllLines(
@@ -60,4 +51,24 @@ sub doInventory {
     }
 }
 
+sub _getDevicesFromFstab {
+    my (%params) = (
+        file => '/etc/fstab',
+        @_
+    );
+
+    my $handle = getFileHandle(%params);
+    return unless $handle;
+
+    my (@devices, %seen);
+    while (my $line = <$handle>) {
+        next unless $line =~ m{^/dev/(\S+)};
+        next if $seen{$1}++;
+        push @devices, { DESCRIPTION => $1 };
+    }
+    close $handle;
+
+    return @devices;
+}
+
 1;
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Archs/PowerPC.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Archs/PowerPC.pm
index b8c4fc0..50433f3 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Archs/PowerPC.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Archs/PowerPC.pm
@@ -44,35 +44,30 @@ sub doInventory {
         );
     }
 
-    my $SystemSerial = getFirstLine(file => '/proc/device-tree/serial-number');
-    $SystemSerial =~ s/[^\,^\.^\w^\ ]//g; # I remove some unprintable char
+    my $bios;
 
-    my $SystemModel = getFirstLine(file => '/proc/device-tree/model');
-    $SystemModel =~ s/[^\,^\.^\w^\ ]//g;
+    $bios->{SSN} = getFirstLine(file => '/proc/device-tree/serial-number');
+    $bios->{SSN} =~ s/[^\,^\.^\w^\ ]//g; # I remove some unprintable char
+
+    $bios->{SMODEL} = getFirstLine(file => '/proc/device-tree/model');
+    $bios->{SMODEL} =~ s/[^\,^\.^\w^\ ]//g;
 
     my $colorCode = getFirstLine(file => '/proc/device-tree/color-code');
     my ($color) = unpack "h7" , $colorCode;
-    $SystemModel .= " color: $color" if $color;
+    $bios->{SMODEL} .= " color: $color" if $color;
 
-    my $BiosVersion = getFirstLine(file => '/proc/device-tree/openprom/model');
-    $BiosVersion =~ s/[^\,^\.^\w^\ ]//g;
+    $bios->{BVERSION} =
+        getFirstLine(file => '/proc/device-tree/openprom/model');
+    $bios->{BVERSION} =~ s/[^\,^\.^\w^\ ]//g;
 
-    my ($BiosManufacturer, $SystemManufacturer);
     my $copyright = getFirstLine(file => '/proc/device-tree/copyright');
     if ($copyright && $copyright =~ /Apple/) {
         # What about the Apple clone?
-        $BiosManufacturer = "Apple Computer, Inc.";
-        $SystemManufacturer = "Apple Computer, Inc." 
+        $bios->{BMANUFACTURER} = "Apple Computer, Inc.";
+        $bios->{SMANUFACTURER} = "Apple Computer, Inc." 
     }
 
-    $inventory->setBios({
-        SMANUFACTURER => $SystemManufacturer,
-        SMODEL        => $SystemModel,
-        SSN           => $SystemSerial,
-        BMANUFACTURER => $BiosManufacturer,
-        BVERSION      => $BiosVersion,
-    });
-
+    $inventory->setBios($bios);
 }
 
 sub _getCPUsFromProc {
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Storages.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Storages.pm
index d0733bb..1b01862 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Storages.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Storages.pm
@@ -106,15 +106,13 @@ sub _getDescription {
 
     # detected as USB by udev
     # TODO maybe we should trust udev detection by default?
-    return "USB" if (defined ($description) && $description =~ /usb/i);
+    return "USB" if ($description && $description =~ /usb/i);
 
     if ($name =~ /^s/) { # /dev/sd* are SCSI _OR_ SATA
         if (
-        ($manufacturer && ($manufacturer =~ /ATA/))
-        ||
-        ($serialnumber && ($serialnumber =~ /ATA/))
-        ||
-        ($description && ($description =~ /ATA/))
+            ($manufacturer && $manufacturer =~ /ATA/) ||
+            ($serialnumber && $serialnumber =~ /ATA/) ||
+            ($description && $description =~ /ATA/)
         ) {
             return  "SATA";
         } else {
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Bios.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Bios.pm
index 08de6b0..65c1546 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Bios.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Bios.pm
@@ -18,17 +18,16 @@ sub doInventory {
     my $inventory = $params{inventory};
     my $logger    = $params{logger};
 
-    my ($SystemSerial, $SystemModel, $SystemManufacturer, $BiosManufacturer,
-        $BiosVersion, $BiosDate, $uuid);
+    my ($bios, $hardware);
 
     my $zone = getZone();
     if ($zone) {
 
         my $arch;
         if (canRun('showrev')) {
-            my $infos = _parseShowRev($logger);
-            $SystemModel        = $infos->{'Application architecture'};
-            $SystemManufacturer = $infos->{'Hardware provider'};
+            my $infos = _parseShowRev(logger => $logger);
+            $bios->{SMODEL}        = $infos->{'Application architecture'};
+            $bios->{SMANUFACTURER} = $infos->{'Hardware provider'};
             $arch               = $infos->{'Application architecture'};
         } else {
             $arch =
@@ -36,63 +35,62 @@ sub doInventory {
         }
 
         if ($arch eq "i386") {
-            my $infos = _parseSmbios($logger);
-            $SystemManufacturer = $infos->{'Manufacturer'};
-            $SystemSerial       = $infos->{'Serial Number'};
-            $SystemModel        = $infos->{'Product'};
-            $BiosManufacturer   = $infos->{'Vendor'};
-            $BiosVersion        = $infos->{'Version String'};
-            $BiosDate           = $infos->{'Release Date'};
-            $uuid               = $infos->{'UUID'};
+            my $infos = _parseSmbios(logger => $logger);
+
+            my $biosInfos = $infos->{SMB_TYPE_BIOS};
+            $bios->{BMANUFACTURER} = $biosInfos->{'Vendor'};
+            $bios->{BVERSION}      = $biosInfos->{'Version String'};
+            $bios->{BDATE}         = $biosInfos->{'Release Date'};
+
+            my $systemInfos = $infos->{SMB_TYPE_SYSTEM};
+            $bios->{SMANUFACTURER} = $systemInfos->{'Manufacturer'};
+            $bios->{SMODEL}        = $systemInfos->{'Product'};
+            $bios->{SKUNUMBER}     = $systemInfos->{'SKU Number'};
+            $hardware->{UUID}      = $systemInfos->{'UUID'};
+
+            my $motherboardInfos = $infos->{SMB_TYPE_BASEBOARD};
+            $bios->{MMODEL}        = $motherboardInfos->{'Product'};
+            $bios->{MSN}           = $motherboardInfos->{'Serial Number'};
+            $bios->{MMANUFACTURER} = $motherboardInfos->{'Manufacturer'};
         } elsif ($arch =~ /sparc/i) {
-            my $infos = _parsePrtconf($logger);
-            $SystemModel = $infos->{'banner-name'};
-            $SystemModel .= " ($infos->{name})" if $infos->{name};
+            my $infos = _parsePrtconf(logger => $logger);
+            $bios->{SMODEL} = $infos->{'banner-name'};
+            $bios->{SMODEL} .= " ($infos->{name})" if $infos->{name};
 
             # looks like : "OBP 4.16.4 2004/12/18 05:18"
             #    with further informations sometime
             if ($infos->{version} =~ m{OBP\s+([\d|\.]+)\s+(\d+)/(\d+)/(\d+)}) {
-                $BiosVersion = "OBP $1";
-                $BiosDate    = "$2/$3/$4";
+                $bios->{BVERSION} = "OBP $1";
+                $bios->{BDATE}    = "$2/$3/$4";
             } else {
-                $BiosVersion = $infos->{version};
+                $bios->{BVERSION} = $infos->{version};
             }
 
             my $command = -x '/opt/SUNWsneep/bin/sneep' ?
                 '/opt/SUNWsneep/bin/sneep' : 'sneep';
 
-            $SystemSerial = getFirstLine(
+            $bios->{SSN} = getFirstLine(
                 command => $command,
                 logger  => $logger
             );
         }
     } else {
-        my $infos = _parseShowRev($logger);
-        $SystemManufacturer = $infos->{'Hardware provider'};
-        $SystemModel        = "Solaris Containers";
+        my $infos = _parseShowRev(logger => $logger);
+        $bios->{SMANUFACTURER} = $infos->{'Hardware provider'};
+        $bios->{SMODEL}        = "Solaris Containers";
     }
 
-    $inventory->setBios({
-        BVERSION      => $BiosVersion,
-        BDATE         => $BiosDate,
-        BMANUFACTURER => $BiosManufacturer,
-        SMANUFACTURER => $SystemManufacturer,
-        SMODEL        => $SystemModel,
-        SSN           => $SystemSerial
-    });
-
-    $inventory->setHardware({
-        UUID => $uuid
-    });
+    $inventory->setBios($bios);
+    $inventory->setHardware($hardware);
 }
 
 sub _parseShowRev {
-    my ($logger) = @_;
-
-    my $handle = getFileHandle(
-        command => "showrev",
-        logger  => $logger
+    my (%params) = (
+        command => 'showrev',
+        @_
     );
+
+    my $handle = getFileHandle(%params);
     return unless $handle;
 
     my $infos;
@@ -106,18 +104,25 @@ sub _parseShowRev {
 }
 
 sub _parseSmbios {
-    my ($logger) = @_;
-
-    my $handle = getFileHandle(
-        command => "/usr/sbin/smbios",
-        logger  => $logger
+    my (%params) = (
+        command => '/usr/sbin/smbios',
+        @_
     );
+
+    my $handle = getFileHandle(%params);
     return unless $handle;
 
-    my $infos;
+    my ($infos, $current);
     while (my $line = <$handle>) {
-        next unless $line =~ /^ \s* ([^:]+) : \s* (.+) $/x;
-        $infos->{$1} = $2;
+        if ($line =~ /^ \d+ \s+ \d+ \s+ (\S+)/x) {
+            $current = $1;
+            next;
+        }
+
+        if ($line =~ /^ \s* ([^:]+) : \s* (.+) $/x) {
+            $infos->{$current}->{$1} = $2;
+            next;
+        }
     }
     close $handle;
 
@@ -125,12 +130,12 @@ sub _parseSmbios {
 }
 
 sub _parsePrtconf {
-    my ($logger) = @_;
-
-    my $handle = getFileHandle(
-        command => "/usr/sbin/prtconf -pv",
-        logger  => $logger
+    my (%params) = (
+        command => '/usr/sbin/prtconf -pv',
+        @_
     );
+
+    my $handle = getFileHandle(%params);
     return unless $handle;
 
     my $infos;
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/CPU.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/CPU.pm
index ee3b03b..6fc0d9f 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/CPU.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/CPU.pm
@@ -3,6 +3,8 @@ package FusionInventory::Agent::Task::Inventory::Input::Solaris::CPU;
 use strict;
 use warnings;
 
+use English qw(-no_match_vars);
+
 use FusionInventory::Agent::Tools;
 use FusionInventory::Agent::Tools::Solaris;
 
@@ -24,15 +26,7 @@ sub doInventory {
             _getCPUFromMemconf(logger => $logger);
 
     # fallback on generic method
-    if (!$count) {
-        foreach (`psrinfo -v`) {
-            if (/^\s+The\s(\w+)\sprocessor\soperates\sat\s(\d+)\sMHz,/) {
-                $cpu->{NAME}  = $1;
-                $cpu->{SPEED} = $2;
-                $count++;
-            }
-        }
-    }
+    ($count, $cpu) = _getCPUFromPrsinfo(logger => $logger) if !$count;
 
     $cpu->{MANUFACTURER} = "SPARC";
 
@@ -68,22 +62,13 @@ sub _getCPUFromMemconf {
 sub _parseCoreString {
     my ($v) = @_;
 
-    if ($v =~ /Dual/i) {
-        return 2;
-    } elsif ($v =~ /Quad/i) {
-        return 4;
-    } elsif ($v =~ /(\d+)-(core|thread)/) {
-        return $1;
-    }elsif ($v =~ /^dual/) {
-        return 2;
-    } elsif ($v =~ /^quad/) {
-        return 4;
-    }
-
-    return $v;
+    return
+        $v =~ /dual/i               ? 2  :
+        $v =~ /quad/i               ? 4  :
+        $v =~ /(\d+)-(core|thread)/ ? $1 :
+        $v;
 }
 
-
 sub _parseSpec {
     my ($spec) = @_;
 
@@ -172,12 +157,43 @@ sub _parseSpec {
 
 }
 
+sub _getCPUFromPsrinfo {
+    my (%params) = (
+        command => 'psrinfo -v',
+        @_
+    );
+
+    my $handle = getFileHandle(%params);
+    return unless $handle;
+
+    my $count = 0;
+    my $cpu;
+    while (my $line = <$handle>) {
+        next unless $line =~ 
+            /^\s+The\s(\w+)\sprocessor\soperates\sat\s(\d+)\sMHz,/;
+
+        $cpu->{NAME}  = $1;
+        $cpu->{SPEED} = $2;
+        $count++;
+    }
+    close $handle;
+
+    return ($count, $cpu);
+}
+
 sub _getCPUFromPrtcl {
-    my ($count, $cpu);
+    my (%params) = (
+        command => "prctl -n zone.cpu-shares $PID",
+        @_
+    );
 
-    foreach (`prctl -n zone.cpu-shares $$`) {
-        $cpu->{NAME} = $1 if /^zone.(\S+)$/;
-        $cpu->{NAME} .= " " . $1 if /^\s*privileged+\s*(\d+)/;
+    my $handle = getFileHandle(%params);
+    return unless $handle;
+
+    my ($count, $cpu);
+    while (my $line = <$handle>) {
+        $cpu->{NAME} = $1 if $line =~ /^zone.(\S+)$/;
+        $cpu->{NAME} .= " " . $1 if $line =~ /^\s*privileged+\s*(\d+)/;
         #$count = 1 if /^\s*privileged+\s*(\d+)/;
         foreach (`memconf 2>&1`) {
             if(/\s+\((\d+).*\s+(\d+)MHz/) {
@@ -186,6 +202,7 @@ sub _getCPUFromPrtcl {
             }
         }
     }
+    close $handle;
 
     return ($count, $cpu);
 }
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/Vmsystem.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/Vmsystem.pm
index fd478b7..fdf2227 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/Vmsystem.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/Vmsystem.pm
@@ -200,7 +200,7 @@ sub _getStatus {
             file => '/proc/scsi/scsi',
             logger => $logger
         );
-        $result = _matchPattern($handle);
+        $result = _matchPatterns($handle);
         close $handle;
     }
     return $result if $result;
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Bios.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Bios.pm
index 5ec74eb..b664c67 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Bios.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Bios.pm
@@ -4,11 +4,6 @@ use strict;
 use warnings;
 
 use English qw(-no_match_vars);
-use Win32::TieRegistry (
-    Delimiter   => '/',
-    ArrayValues => 0,
-    qw/KEY_READ/
-);
 
 use FusionInventory::Agent::Tools::Win32;
 
@@ -89,30 +84,36 @@ sub doInventory {
 
     $inventory->setBios($bios);
 
-    if (
-        ($bios->{VERSION} && ($bios->{VERSION} eq 'VirtualBox'))
-         ||
-        ($bios->{MMODEL} && ($bios->{MMODEL} eq 'VirtualBox'))
-       ) {
-        $inventory->setHardware ({
-            VMSYSTEM => 'VirtualBox'
-        });
-    } elsif (
-        ($bios->{BIOSSERIAL} && ($bios->{BIOSSERIAL} =~ /VMware/i))
-         ||
-        ($bios->{SMODEL} && ($bios->{SMODEL} eq 'VirtualBox'))
-       ) {
-        $inventory->setHardware ({
-            VMSYSTEM => 'VMware'
-        });
-    } elsif (
-        ($bios->{SMANUFACTURER} eq 'Xen')
-         ||
-        ($bios->{BMANUFACTURER} eq 'Xen')
-       ) {
-        $inventory->setHardware ({
-            VMSYSTEM => 'Xen'
-        });
+    SWITCH: {
+        if (
+            ($bios->{VERSION} && $bios->{VERSION} eq 'VirtualBox') ||
+            ($bios->{MMODEL}  && $bios->{MMODEL} eq 'VirtualBox')
+           ) {
+            $inventory->setHardware ({
+                VMSYSTEM => 'VirtualBox'
+            });
+            last SWITCH;
+        }
+
+        if (
+            ($bios->{BIOSSERIAL} && $bios->{BIOSSERIAL} =~ /VMware/i) ||
+            ($bios->{SMODEL}     && $bios->{SMODEL} eq 'VirtualBox')
+           ) {
+            $inventory->setHardware ({
+                VMSYSTEM => 'VMware'
+            });
+            last SWITCH;
+        }
+
+        if (
+            ($bios->{SMANUFACTURER} && $bios->{SMANUFACTURER} eq 'Xen') ||
+            ($bios->{BMANUFACTURER} && $bios->{BMANUFACTURER} eq 'Xen')
+           ) {
+            $inventory->setHardware ({
+                VMSYSTEM => 'Xen'
+            });
+            last SWITCH;
+        }
     }
 
 }
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/CPU.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/CPU.pm
index 8f1d49c..768d796 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/CPU.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/CPU.pm
@@ -4,20 +4,11 @@ use strict;
 use warnings;
 
 use English qw(-no_match_vars);
-use Win32;
-use Win32::TieRegistry (
-    Delimiter   => '/',
-    ArrayValues => 0,
-    qw/KEY_READ/
-);
 
 use FusionInventory::Agent::Tools;
 use FusionInventory::Agent::Tools::Win32;
 use FusionInventory::Agent::Tools::Generic;
 
-our $runMeIfTheseChecksFailed =
-    ["FusionInventory::Agent::Task::Inventory::Input::Generic::Dmidecode"];
-
 sub isEnabled {
     return 1;
 }
@@ -28,89 +19,92 @@ sub doInventory {
     my $inventory = $params{inventory};
     my $logger    = $params{logger};
 
-    my @dmidecodeCpu = getCpusFromDmidecode();
+    my @cpus = _getCPUs($logger);
+
+    foreach my $cpu (@cpus) {
+        $inventory->addEntry(
+            section => 'CPUS',
+            entry   => $cpu
+        );
+    }
+
+    if (any { $_->{NAME} =~ /QEMU/i } @cpus) {
+        $inventory->setHardware ({
+            VMSYSTEM => 'QEMU'
+        });
+    }
+}
+
+sub _getCPUs {
+    my ($logger) = @_;
+
+    my @dmidecodeInfos = getCpusFromDmidecode();
+    # the CPU description in WMI is false, we use the registry instead
+    my $registryInfos = getRegistryKey(
+        path   => "HKEY_LOCAL_MACHINE/Hardware/Description/System/CentralProcessor",
+        logger => $logger
+    );
 
-    my $vmsystem;
     my $cpuId = 0;
+    my @cpus;
 
     foreach my $object (getWmiObjects(
         class      => 'Win32_Processor',
         properties => [ qw/NumberOfCores ProcessorId MaxClockSpeed/ ]
     )) {
 
-        # the CPU description in WMI is false, we use the registry instead
-        # Hardware\Description\System\CentralProcessor\1
-        # thank you Nicolas Richard 
-        my $info = getRegistryValue(
-            path   => "HKEY_LOCAL_MACHINE/Hardware/Description/System/CentralProcessor/$cpuId",
-            logger => $logger
-        );
+        my $dmidecodeInfo = $dmidecodeInfos[$cpuId];
+        my $registryInfo  = $registryInfos->{"$cpuId/"};
 
-#        my $cache = $object->{L2CacheSize}+$object->{L3CacheSize};
-        my $core = $dmidecodeCpu[$cpuId]->{CORE} || $object->{NumberOfCores};
-        my $thread = $dmidecodeCpu[$cpuId]->{THREAD};
-        my $description = $info->{Identifier};
-        my $name = $info->{ProcessorNameString};
-        my $manufacturer = $info->{VendorIdentifier};
-        my $id = $dmidecodeCpu[$cpuId]->{ID} || $object->{ProcessorId};
-        my $speed = $dmidecodeCpu[$cpuId]->{SPEED} || $object->{MaxClockSpeed};
-        my $serial = $dmidecodeCpu[$cpuId]->{SERIAL};
+        my $cpu = {
+            CORE         => $dmidecodeInfo->{CORE} || $object->{NumberOfCores},
+            THREAD       => $dmidecodeInfo->{THREAD},
+            DESCRIPTION  => $registryInfo->{'/Identifier'},
+            NAME         => $registryInfo->{'/ProcessorNameString'},
+            MANUFACTURER => $registryInfo->{'/VendorIdentifier'},
+            SERIAL       => $dmidecodeInfo->{SERIAL},
+            SPEED        => $dmidecodeInfo->{SPEED} || $object->{MaxClockSpeed},
+            ID           => $dmidecodeInfo->{ID} || $object->{ProcessorId}
+        };
 
         # Some information are missing on Win2000
-        if (!$name) {
-            $name = $ENV{PROCESSOR_IDENTIFIER};
-            if ($name =~ s/,\s(\S+)$//) {
-                $manufacturer = $1;
+        if (!$cpu->{NAME}) {
+            $cpu->{NAME} = $ENV{PROCESSOR_IDENTIFIER};
+            if ($cpu->{NAME} =~ s/,\s(\S+)$//) {
+                $cpu->{MANUFACTURER} = $1;
             }
         }
 
-        if ($manufacturer) {
-            $manufacturer =~ s/Genuine//;
-            $manufacturer =~ s/(TMx86|TransmetaCPU)/Transmeta/;
-            $manufacturer =~ s/CyrixInstead/Cyrix/;
-            $manufacturer=~ s/CentaurHauls/VIA/;
+        if ($cpu->{MANUFACTURER}) {
+            $cpu->{MANUFACTURER} =~ s/Genuine//;
+            $cpu->{MANUFACTURER} =~ s/(TMx86|TransmetaCPU)/Transmeta/;
+            $cpu->{MANUFACTURER} =~ s/CyrixInstead/Cyrix/;
+            $cpu->{MANUFACTURER} =~ s/CentaurHauls/VIA/;
         }
-        if ($serial) {
-            $serial =~ s/\s//g;
+
+        if ($cpu->{SERIAL}) {
+            $cpu->{SERIAL} =~ s/\s//g;
         }
 
-        if ($name) {
-            $name =~ s/^\s+//;
-            $name =~ s/\s+$//;
+        if ($cpu->{NAME}) {
+            $cpu->{NAME} =~ s/^\s+//;
+            $cpu->{NAME} =~ s/\s+$//;
 
-            $vmsystem = "QEMU"if $name =~ /QEMU/i;
 
-            if ($name =~ /([\d\.]+)s*(GHZ)/i) {
-                $speed = {
+            if ($cpu->{NAME} =~ /([\d\.]+)s*(GHZ)/i) {
+                $cpu->{SPEED} = {
                     ghz => 1000,
                     mhz => 1,
-                }->{lc($2)}*$1;
+                }->{lc($2)} * $1;
             }
-
         }
 
-        $inventory->addEntry(
-            section => 'CPUS',
-            entry   => {
-                CORE         => $core,
-                THREAD       => $thread,
-                DESCRIPTION  => $description,
-                NAME         => $name,
-                MANUFACTURER => $manufacturer,
-                SERIAL       => $serial,
-                SPEED        => $speed,
-                ID           => $id
-            }
-        );
+        push @cpus, $cpu;
 
         $cpuId++;
     }
 
-    if ($vmsystem) {
-        $inventory->setHardware ({
-            VMSYSTEM => $vmsystem 
-        });
-    }
+    return @cpus;
 }
 
 1;
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Memory.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Memory.pm
index 4d74c2e..b2799b8 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Memory.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Memory.pm
@@ -80,6 +80,16 @@ sub doInventory {
 
     my $inventory = $params{inventory};
 
+    foreach my $memory (_getMemories()) {
+        $inventory->addEntry(
+            section => 'MEMORIES',
+            entry   => $memory
+        );
+    }
+}
+
+sub _getMemories {
+
     my $cpt = 0;
     my @memories;
 
@@ -134,13 +144,7 @@ sub doInventory {
         }
     }
 
-    foreach my $memory (@memories) {
-        $inventory->addEntry(
-            section => 'MEMORIES',
-            entry   => $memory
-        );
-    }
-
+    return @memories;
 }
 
 1;
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/OS.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/OS.pm
index 6350989..794b4cd 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/OS.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/OS.pm
@@ -57,11 +57,11 @@ sub doInventory {
             OSCOMMENTS    => $object->{CSDVersion},
             SWAP          => $object->{TotalSwapSpaceSize},
             DESCRIPTION   => $description,
-            OSINSTALLDATE => $installDate
         });
 
         $inventory->setOperatingSystem({
             NAME           => "Windows",
+            INSTALL_DATE   => $installDate,
     #        VERSION       => $OSVersion,
             KERNEL_VERSION => $object->{Version},
             FULL_NAME      => $object->{Caption},
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Printers.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Printers.pm
index d74b45b..9db485d 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Printers.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Printers.pm
@@ -4,11 +4,6 @@ use strict;
 use warnings;
 
 use English qw(-no_match_vars);
-use Win32::TieRegistry (
-    Delimiter   => '/',
-    ArrayValues => 0,
-    qw/KEY_READ/
-);
 
 use FusionInventory::Agent::Tools::Win32;
 
@@ -52,6 +47,7 @@ sub doInventory {
     my (%params) = @_;
 
     my $inventory = $params{inventory};
+    my $logger    = $params{logger};
 
     foreach my $object (getWmiObjects(
         class      => 'Win32_Printer',
@@ -76,7 +72,7 @@ sub doInventory {
                 $object->{VerticalResolution};
         }
 
-        $object->{Serial} = _getUSBPrinterSerial($object->{PortName})
+        $object->{Serial} = _getUSBPrinterSerial($object->{PortName}, $logger)
             if $object->{PortName} && $object->{PortName} =~ /USB/;
 
         $inventory->addEntry(
@@ -103,29 +99,30 @@ sub doInventory {
 }
 
 sub _getUSBPrinterSerial {
-    my ($portName) = @_;
-
-    my $machKey = $Registry->Open('LMachine', { 
-        Access => KEY_READ | KEY_WOW64_64 ## no critic (ProhibitBitwise)
-    }) or die "Can't open HKEY_LOCAL_MACHINE key: $EXTENDED_OS_ERROR";
+    my ($portName, $logger) = @_;
 
-    # first, find the USB container ID for this printer
+    # find the ParentIdPrefix value for the printer matching given portname
     my $prefix = _getUSBPrefix(
-        $machKey->{"SYSTEM/CurrentControlSet/Enum/USBPRINT"},
+        getRegistryKey(
+            path => "HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Enum/USBPRINT",
+            logger => $logger
+        ),
         $portName
     );
     return unless $prefix;
 
-    # second, get the serial number from the ID container entry
+    # find the key name for the device matching given parentIdPrefix
     my $serial = _getUSBSerial(
-        $machKey->{"SYSTEM/CurrentControlSet/Enum/USB"},
+        getRegistryKey(
+            path => "HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Enum/USB",
+            logger => $logger
+        ),
         $prefix
     );
 
     return $serial;
 }
 
-# find the ParentIdPrefix value for the printer matching given portname
 sub _getUSBPrefix {
     my ($print, $portName) = @_;
 
@@ -153,7 +150,6 @@ sub _getUSBPrefix {
     return;
 }
 
-# find the key name for the device matching given parentIdPrefix
 sub _getUSBSerial {
     my ($usb, $prefix) = @_;
 
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm
index e65d362..5b182ee 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm
@@ -27,6 +27,7 @@ sub doInventory {
     my (%params) = @_;
 
     my $inventory = $params{inventory};
+    my $logger    = $params{logger};
 
     if (is64bit()) {
 
@@ -43,10 +44,9 @@ sub doInventory {
 
         foreach my $software (_getSoftwares(
             softwares => $softwares64,
-            is64bit   => 1,
-            logger => $logger
+            is64bit   => 1
         )) {
-            _addSoftware(inventory => $inventory, entry => $software, logger => $logger);
+            _addSoftware(inventory => $inventory, entry => $software);
         }
         _processMSIE(
             machKey   => $machKey64,
@@ -66,7 +66,7 @@ sub doInventory {
             is64bit   => 0,
             logger => $logger
         )) {
-            _addSoftware(inventory => $inventory, entry => $software, logger => $logger);
+            _addSoftware(inventory => $inventory, entry => $software);
         }
         _processMSIE(
             machKey   => $machKey32,
@@ -87,7 +87,7 @@ sub doInventory {
             softwares => $softwares,
             is64bit   => 0
         )) {
-            _addSoftware(inventory => $inventory, entry => $software, logger => $logger);
+            _addSoftware(inventory => $inventory, entry => $software);
         }
         _processMSIE(
             machKey   => $machKey,
@@ -167,7 +167,6 @@ sub _addSoftware {
 
     my $entry = $params{entry};
 
-    $params{logger}->debug("_addSoftware() begin") if $params{logger};
     # avoid duplicates
     return if $seen->{$entry->{NAME}}->{$entry->{IS64BIT}}{$entry->{VERSION} || '_undef_'}++;
 
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Inventory.pm b/lib/FusionInventory/Agent/Task/Inventory/Inventory.pm
index df701fd..1242d90 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Inventory.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Inventory.pm
@@ -52,6 +52,19 @@ my %fields = (
     PRINTERS    => [ qw/COMMENT DESCRIPTION DRIVER NAME NETWORK PORT RESOLUTION
                         SHARED STATUS ERRSTATUS SERVERNAME SHARENAME 
                         PRINTPROCESSOR SERIAL/ ],
+    BIOS             => [ qw/SMODEL SMANUFACTURER SSN BDATE BVERSION 
+                             BMANUFACTURER MMANUFACTURER MSN MMODEL ASSETTAG 
+                             ENCLOSURESERIAL BIOSSERIAL 
+                             TYPE SKUNUMBER/ ],
+    HARDWARE         => [ qw/USERID OSVERSION PROCESSORN OSCOMMENTS CHECKSUM
+                             PROCESSORT NAME PROCESSORS SWAP ETIME TYPE OSNAME
+                             IPADDR WORKGROUP DESCRIPTION MEMORY UUID DNS 
+                             LASTLOGGEDUSER USERDOMAIN DATELASTLOGGEDUSER 
+                             DEFAULTGATEWAY VMSYSTEM WINOWNER WINPRODID
+                             WINPRODKEY WINCOMPANY WINLANG CHASSIS_TYPE/ ],
+    OPERATINGSYSTEM  => [ qw/KERNEL_NAME KERNEL_VERSION NAME VERSION FULL_NAME 
+                            SERVICE_PACK INSTALL_DATE/ ],
+    ACCESSLOG        => [ qw/USERID LOGDATE/ ],
     VIRTUALMACHINES  => [ qw/MEMORY NAME UUID STATUS SUBSYSTEM VMTYPE VCPU
                              VMID MAC COMMENT OWNER/ ],
     LOGICAL_VOLUMES  => [ qw/LV_NAME VGN_AME ATTR SIZE LV_UUID SEG_COUNT 
@@ -60,7 +73,6 @@ my %fields = (
                              SIZE FREE PE_SIZE/ ],
     VOLUME_GROUPS    => [ qw/VG_NAME PV_COUNT LV_COUNT ATTR SIZE FREE VG_UUID 
                              VG_EXTENT_SIZE/ ],
-
 );
 
 my %checks = (
@@ -242,52 +254,58 @@ sub computeLegacyValues {
 sub setHardware {
     my ($self, $args) = @_;
 
-    foreach my $key (qw/USERID OSVERSION PROCESSORN OSCOMMENTS CHECKSUM
-        PROCESSORT NAME PROCESSORS SWAP ETIME TYPE OSNAME IPADDR WORKGROUP
-        DESCRIPTION MEMORY UUID DNS LASTLOGGEDUSER USERDOMAIN
-        DATELASTLOGGEDUSER DEFAULTGATEWAY VMSYSTEM WINOWNER WINPRODID
-        WINPRODKEY WINCOMPANY WINLANG CHASSIS_TYPE OSINSTALLDATE/) {
-# WINLANG: Windows Language, see MSDN Win32_OperatingSystem documentation
-        if (exists $args->{$key}) {
-            my $string = getSanitizedString($args->{$key});
-            $self->{content}{HARDWARE}{$key} = $string;
+    foreach my $field (keys %$args) {
+        if (!$fields{HARDWARE}->{$field}) {
+            $self->{logger}->debug("unknown field $field for section HARDWARE");
+            next
         }
+        $self->{content}->{HARDWARE}->{$field} =
+            getSanitizedString($args->{$field});
     }
 }
 
 sub setOperatingSystem {
     my ($self, $args) = @_;
 
-    foreach my $key (qw/KERNEL_NAME KERNEL_VERSION NAME VERSION FULL_NAME SERVICE_PACK/) {
-        next unless exists $args->{$key};
-
-        my $string = getSanitizedString($args->{$key});
-        $self->{content}{OPERATINGSYSTEM}{$key} = $string;
+    foreach my $field (keys %$args) {
+        if (!$fields{OPERATINGSYSTEM}->{$field}) {
+            $self->{logger}->debug(
+                "unknown field $field for section OPERATINGSYSTEM"
+            );
+            next
+        }
+        $self->{content}->{OPERATINGSYSTEM}->{$field} = 
+            getSanitizedString($args->{$field});
     }
 }
 
 sub setBios {
     my ($self, $args) = @_;
 
-    foreach my $key (qw/SMODEL SMANUFACTURER SSN BDATE BVERSION BMANUFACTURER
-        MMANUFACTURER MSN MMODEL ASSETTAG ENCLOSURESERIAL BASEBOARDSERIAL
-        BIOSSERIAL TYPE SKUNUMBER/) {
-
-        if (exists $args->{$key}) {
-            my $string = getSanitizedString($args->{$key});
-            $self->{content}{BIOS}{$key} = $string;
+    foreach my $field (keys %$args) {
+        if (!$fields{BIOS}->{$field}) {
+            $self->{logger}->debug("unknown field $field for section BIOS");
+            next
         }
+
+        $self->{content}->{BIOS}->{$field} =
+            getSanitizedString($args->{$field});
     }
 }
 
 sub setAccessLog {
     my ($self, $args) = @_;
 
-    foreach my $key (qw/USERID LOGDATE/) {
-
-        if (exists $args->{$key}) {
-            $self->{content}{ACCESSLOG}{$key} = $args->{$key};
+    foreach my $field (keys %$args) {
+        if (!$fields{ACCESSLOG}->{$field}) {
+            $self->{logger}->debug(
+                "unknown field $field for section ACCESSLOG"
+            );
+            next
         }
+
+        $self->{content}->{ACCESSLOG}->{$field} = 
+            getSanitizedString($args->{$field});
     }
 }
 
@@ -887,6 +905,10 @@ deprecated in the future.
 The Service Pack level reported by the operating system. This field is only
 present on systems which use this notion.
 
+=item INSTALL_DATE
+
+The operating system installation date.
+
 =back
 
 =head2 MONITORS
diff --git a/lib/FusionInventory/Agent/Tools/Hostname.pm b/lib/FusionInventory/Agent/Tools/Hostname.pm
index 3c73a80..16fcfed 100644
--- a/lib/FusionInventory/Agent/Tools/Hostname.pm
+++ b/lib/FusionInventory/Agent/Tools/Hostname.pm
@@ -9,6 +9,7 @@ use English qw(-no_match_vars);
 
 BEGIN {
     if ($OSNAME eq 'MSWin32') {
+        no warnings 'redefine';
         Win32::API->require();
         # Kernel32.dll is used more or less everywhere.
         # Without this, Win32::API will release the DLL even
@@ -19,21 +20,22 @@ BEGIN {
 
 sub getHostname {
 
-    if ($OSNAME eq 'MSWin32') {
-        my $GetComputerName = Win32::API->new("kernel32", "GetComputerNameExW", ["I", "P", "P"], "N");
-        my $buffer = "\x00" x 1024;
-        my $N=1024;#pack ("c4", 160,0,0,0);
-
-        $GetComputerName->Call(3, $buffer, $N);
-
-        # GetComputerNameExW returns the string in UTF16, we have to change it
-        # to UTF8
-        return encode("UTF-8", substr(decode("UCS-2le", $buffer),0,ord $N));
-    } else {
+    if ($OSNAME ne 'MSWin32') {
         Sys::Hostname->require();
         return Sys::Hostname::hostname();
     }
 
+    my $getComputerName = Win32::API->new(
+        "kernel32", "GetComputerNameExW", ["I", "P", "P"], "N"
+    );
+    my $buffer = "\x00" x 1024;
+    my $n = 1024; #pack ("c4", 160,0,0,0);
+
+    $getComputerName->Call(3, $buffer, $n);
+
+    # GetComputerNameExW returns the string in UTF16, we have to change it
+    # to UTF8
+    return encode("UTF-8", substr(decode("UCS-2le", $buffer), 0, ord $n));
 }
 
 1;
diff --git a/lib/FusionInventory/Agent/Tools/Linux.pm b/lib/FusionInventory/Agent/Tools/Linux.pm
index f2e90d4..ec5a364 100644
--- a/lib/FusionInventory/Agent/Tools/Linux.pm
+++ b/lib/FusionInventory/Agent/Tools/Linux.pm
@@ -166,12 +166,14 @@ sub getDevicesFromHal {
 sub getDevicesFromProc {
     my (%params) = @_;
 
+    my $logger = $params{logger};
+
     # compute list of devices
     my @names;
 
     foreach my $file (glob ("/sys/block/*")) {
-        next unless $file =~ /([sh]d[a-z]|fd\d)$/;
-        push(@names, $1);
+        next unless $file =~ /([shv]d[a-z]|fd\d)$/;
+        push @names, $1;
     }
 
     my $command = getFirstLine(command => '/sbin/fdisk -v') =~ '^GNU' ?
@@ -180,14 +182,14 @@ sub getDevicesFromProc {
 
     my $handle = getFileHandle(
         command => $command,
-        logger => $params{logger}
+        logger  => $logger
     );
 
     return unless $handle;
 
     while (my $line = <$handle>) {
-        next unless $line =~ (/^\/dev\/([sh]d[a-z])/);
-        push(@names, $1);
+        next unless $line =~ m{^/dev/([shv]d[a-z])};
+        push @names, $1;
     }
     close $handle;
 
@@ -198,25 +200,17 @@ sub getDevicesFromProc {
     # extract informations
     my @devices;
     foreach my $name (@names) {
-        my $device;
-        $device->{NAME}         = $name;
-        $device->{MANUFACTURER} = _getValueFromSysProc(
-            $params{logger}, $device, 'vendor'
-        );
-        $device->{MODEL}        = _getValueFromSysProc(
-            $params{logger}, $device, 'model'
-        );
-        $device->{FIRMWARE}     = _getValueFromSysProc(
-            $params{logger}, $device, 'rev'
-        );
-        $device->{SERIALNUMBER} = _getValueFromSysProc(
-            $params{logger}, $device, 'serial'
-        );
-        $device->{TYPE}         = _getValueFromSysProc(
-            $params{logger}, $device, 'removable'
-        ) ?
-            'removable' : 'disk';
-        push (@devices, $device);
+        my $device = {
+            NAME         => $name,
+            MANUFACTURER => _getValueFromSysProc($logger, $name, 'vendor'),
+            MODEL        => _getValueFromSysProc($logger, $name, 'model'),
+            FIRMWARE     => _getValueFromSysProc($logger, $name, 'rev'),
+            SERIALNUMBER => _getValueFromSysProc($logger, $name, 'serial'),
+            TYPE         =>
+                _getValueFromSysProc($logger, $name, 'removable') ?
+                    'removable' : 'disk'
+        };
+        push @devices, $device;
     }
 
     return @devices;
@@ -225,15 +219,17 @@ sub getDevicesFromProc {
 sub _getValueFromSysProc {
     my ($logger, $device, $key) = @_;
 
+    ## no critic (ExplicitReturnUndef)
+
     my $file =
         -f "/sys/block/$device/device/$key" ? "/sys/block/$device/device/$key" :
         -f "/proc/ide/$device/$key"         ? "/proc/ide/$device/$key" :
                                               undef;
 
-    return unless $file;
+    return undef unless $file;
 
     my $handle = getFileHandle(file => $file, logger => $logger);
-    return unless $handle;
+    return undef unless $handle;
 
     my $value = <$handle>;
     close $handle;
diff --git a/lib/FusionInventory/Agent/Tools/Win32.pm b/lib/FusionInventory/Agent/Tools/Win32.pm
index 1c49573..f062ac7 100644
--- a/lib/FusionInventory/Agent/Tools/Win32.pm
+++ b/lib/FusionInventory/Agent/Tools/Win32.pm
@@ -30,6 +30,7 @@ our @EXPORT = qw(
     KEY_WOW64_64
     KEY_WOW64_32
     getRegistryValue
+    getRegistryKey
     getWmiObjects
     getLocalCodepage
 );
@@ -96,7 +97,7 @@ sub getRegistryValue {
     my (%params) = @_;
 
     my ($root, $keyName, $valueName);
-    if ($params{path} =~ /^(HKEY\S+?)\/(.*)\/([^\/.]*)/ ) {
+    if ($params{path} =~ /^(HKEY_\S+)\/(.+)\/([^\/]+)/ ) {
         $root      = $1;
         $keyName   = $2;
         $valueName = $3;
@@ -107,20 +108,52 @@ sub getRegistryValue {
         return;
     }
 
-    my $machKey = is64bit() ?
-        $Registry->Open($root, { Access=> KEY_READ | KEY_WOW64_64 } ) : ## no critic (ProhibitBitwise)
-	$Registry->Open($root, { Access=> KEY_READ } )                ;
+    my $key = _getRegistryKey(
+        logger  => $params{logger},
+        root    => $root,
+        keyName => $keyName
+    );
+    return $key->{"/$valueName"};
+}
+
+sub getRegistryKey {
+    my (%params) = @_;
+
+    my ($root, $keyName);
+    if ($params{path} =~ /^(HKEY_\S+)\/(.+)/ ) {
+        $root      = $1;
+        $keyName   = $2;
+    } else {
+        $params{logger}->error(
+	    "Failed to parse '$params{path}'. Does it start with HKEY_?"
+	) if $params{logger};
+        return;
+    }
+
+    return _getRegistryKey(
+        logger  => $params{logger},
+        root    => $root,
+        keyName => $keyName
+    );
+}
+
+sub _getRegistryKey {
+    my (%params) = @_;
 
-    if (!$machKey) {
-        $params{logger}->error("Can't open 'root': $EXTENDED_OS_ERROR")
-	    if $params{logger};
+    ## no critic (ProhibitBitwise)
+    my $rootKey = is64bit() ?
+        $Registry->Open($params{root}, { Access=> KEY_READ | KEY_WOW64_64 } ) :
+	$Registry->Open($params{root}, { Access=> KEY_READ } )                ;
+
+    if (!$rootKey) {
+        $params{logger}->error(
+            "Can't open $params{root} key: $EXTENDED_OS_ERROR"
+        ) if $params{logger};
         return;
     }
-    my $key = $machKey->Open($keyName);
-    my $value = $key->{$valueName};
+    my $key = $rootKey->Open($params{keyName});
 
-    return if ref $value;
-    return $value;
+    return $key;
 }
 
 1;
@@ -176,6 +209,16 @@ E.g: HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/ProductName
 
 =back
 
-=head2 getHostnameFromKernel32
+=head2 getRegistryKey(%params)
+
+Returns a key from the registry.
 
-Returns the computer name and its domain, as a list.
+=over
+
+=item path a string in hive/key format
+
+E.g: HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion
+
+=item logger
+
+=back
diff --git a/resources/bsd/fstab/freebsd-1 b/resources/bsd/fstab/freebsd-1
new file mode 100644
index 0000000..41bfd9a
--- /dev/null
+++ b/resources/bsd/fstab/freebsd-1
@@ -0,0 +1,5 @@
+# Device                Mountpoint      FStype  Options         Dump    Pass#
+/dev/da0s1b             none            swap    sw              0       0
+/dev/da0s1a             /               ufs     rw              1       1
+/dev/da0s1d             /usr            ufs     rw              2       2
+/dev/acd0               /cdrom          cd9660  ro,noauto       0       0
diff --git a/resources/generic/dmidecode/windows-7 b/resources/generic/dmidecode/windows-7
new file mode 100644
index 0000000..3ff0578
--- /dev/null
+++ b/resources/generic/dmidecode/windows-7
@@ -0,0 +1,1034 @@
+# dmidecode 2.10
+SMBIOS 2.6 present.
+101 structures occupying 3552 bytes.
+Table at 0x003B3688.
+
+Handle 0x0000, DMI type 0, 24 bytes
+BIOS Information
+	Vendor: American Megatrends Inc.
+	Version: 1503
+	Release Date: 03/10/2011
+	Address: 0xF0000
+	Runtime Size: 64 kB
+	ROM Size: 4096 kB
+	Characteristics:
+		PCI is supported
+		BIOS is upgradeable
+		BIOS shadowing is allowed
+		Boot from CD is supported
+		Selectable boot is supported
+		BIOS ROM is socketed
+		EDD is supported
+		5.25"/1.2 MB floppy services are supported (int 13h)
+		3.5"/720 kB floppy services are supported (int 13h)
+		3.5"/2.88 MB floppy services are supported (int 13h)
+		Print screen service is supported (int 5h)
+		8042 keyboard services are supported (int 9h)
+		Serial services are supported (int 14h)
+		Printer services are supported (int 17h)
+		ACPI is supported
+		USB legacy is supported
+		BIOS boot specification is supported
+		Targeted content distribution is supported
+	BIOS Revision: 4.6
+
+Handle 0x0001, DMI type 1, 27 bytes
+System Information
+	Manufacturer: System manufacturer
+	Product Name: System Product Name
+	Version: System Version
+	Serial Number: System Serial Number
+	UUID: 1E00E6E0-008C-4400-9AAD-F46D04972D3E
+	Wake-up Type: Power Switch
+	SKU Number: To be filled by O.E.M.
+	Family: To be filled by O.E.M.
+
+Handle 0x0002, DMI type 2, 15 bytes
+Base Board Information
+	Manufacturer: ASUSTeK Computer INC.
+	Product Name: P8P67
+	Version: Rev 1.xx
+	Serial Number: MT7013K30709271
+	Asset Tag: To be filled by O.E.M.
+	Features:
+		Board is a hosting board
+		Board is replaceable
+	Location In Chassis: To be filled by O.E.M.
+	Chassis Handle: 0x0003
+	Type: Motherboard
+	Contained Object Handles: 0
+
+Handle 0x0003, DMI type 3, 21 bytes
+Chassis Information
+	Manufacturer: Chassis Manufacture
+	Type: Desktop
+	Lock: Not Present
+	Version: Chassis Version
+	Serial Number: Chassis Serial Number
+	Asset Tag: Asset-1234567890
+	Boot-up State: Safe
+	Power Supply State: Safe
+	Thermal State: Safe
+	Security Status: None
+	OEM Information: 0x00000000
+	Height: Unspecified
+	Number Of Power Cords: 1
+	Contained Elements: 0
+
+Handle 0x0004, DMI type 4, 42 bytes
+Processor Information
+	Socket Designation: LGA1155
+	Type: Central Processor
+	Family: Core 2 Duo
+	Manufacturer: Intel            
+	ID: A7 06 02 00 FF FB EB BF
+	Signature: Type 0, Family 6, Model 42, Stepping 7
+	Flags:
+		FPU (Floating-point unit on-chip)
+		VME (Virtual mode extension)
+		DE (Debugging extension)
+		PSE (Page size extension)
+		TSC (Time stamp counter)
+		MSR (Model specific registers)
+		PAE (Physical address extension)
+		MCE (Machine check exception)
+		CX8 (CMPXCHG8 instruction supported)
+		APIC (On-chip APIC hardware supported)
+		SEP (Fast system call)
+		MTRR (Memory type range registers)
+		PGE (Page global enable)
+		MCA (Machine check architecture)
+		CMOV (Conditional move instruction supported)
+		PAT (Page attribute table)
+		PSE-36 (36-bit page size extension)
+		CLFSH (CLFLUSH instruction supported)
+		DS (Debug store)
+		ACPI (ACPI supported)
+		MMX (MMX technology supported)
+		FXSR (Fast floating-point save and restore)
+		SSE (Streaming SIMD extensions)
+		SSE2 (Streaming SIMD extensions 2)
+		SS (Self-snoop)
+		HTT (Hyper-threading technology)
+		TM (Thermal monitor supported)
+		PBE (Pending break enabled)
+	Version: Intel(R) Core(TM) i5-2300 CPU @ 2.80GHz        
+	Voltage: 1.0 V
+	External Clock: 100 MHz
+	Max Speed: 3800 MHz
+	Current Speed: 2800 MHz
+	Status: Populated, Enabled
+	Upgrade: Other
+	L1 Cache Handle: 0x0005
+	L2 Cache Handle: 0x0006
+	L3 Cache Handle: 0x0007
+	Serial Number: To Be Filled By O.E.M.
+	Asset Tag: To Be Filled By O.E.M.
+	Part Number: To Be Filled By O.E.M.
+	Core Count: 4
+	Core Enabled: 1
+	Characteristics:
+		64-bit capable
+
+Handle 0x0005, DMI type 7, 19 bytes
+Cache Information
+	Socket Designation: L1-Cache
+	Configuration: Enabled, Not Socketed, Level 1
+	Operational Mode: Write Back
+	Location: Internal
+	Installed Size: 256 kB
+	Maximum Size: 256 kB
+	Supported SRAM Types:
+		Other
+	Installed SRAM Type: Other
+	Speed: Unknown
+	Error Correction Type: None
+	System Type: Unified
+	Associativity: 8-way Set-associative
+
+Handle 0x0006, DMI type 7, 19 bytes
+Cache Information
+	Socket Designation: L2-Cache
+	Configuration: Enabled, Not Socketed, Level 2
+	Operational Mode: Varies With Memory Address
+	Location: Internal
+	Installed Size: 1024 kB
+	Maximum Size: 1024 kB
+	Supported SRAM Types:
+		Other
+	Installed SRAM Type: Other
+	Speed: Unknown
+	Error Correction Type: None
+	System Type: Unified
+	Associativity: 8-way Set-associative
+
+Handle 0x0007, DMI type 7, 19 bytes
+Cache Information
+	Socket Designation: L3-Cache
+	Configuration: Disabled, Not Socketed, Level 3
+	Operational Mode: Unknown
+	Location: Internal
+	Installed Size: 6144 kB
+	Maximum Size: 6144 kB
+	Supported SRAM Types:
+		Other
+	Installed SRAM Type: Other
+	Speed: Unknown
+	Error Correction Type: None
+	System Type: Unified
+	Associativity: Other
+
+Handle 0x0008, DMI type 8, 9 bytes
+Port Connector Information
+	Internal Reference Designator: PS/2 Keyboard
+	Internal Connector Type: None
+	External Reference Designator: PS/2 Keyboard
+	External Connector Type: PS/2
+	Port Type: Keyboard Port
+
+Handle 0x0009, DMI type 8, 9 bytes
+Port Connector Information
+	Internal Reference Designator: USB9_10
+	Internal Connector Type: None
+	External Reference Designator: USB9_10
+	External Connector Type: Access Bus (USB)
+	Port Type: USB
+
+Handle 0x000A, DMI type 8, 9 bytes
+Port Connector Information
+	Internal Reference Designator: USB11_12
+	Internal Connector Type: None
+	External Reference Designator: USB11_12
+	External Connector Type: Access Bus (USB)
+	Port Type: USB
+
+Handle 0x000B, DMI type 8, 9 bytes
+Port Connector Information
+	Internal Reference Designator: GbE LAN
+	Internal Connector Type: None
+	External Reference Designator: GbE LAN
+	External Connector Type: RJ-45
+	Port Type: Network Port
+
+Handle 0x000C, DMI type 8, 9 bytes
+Port Connector Information
+	Internal Reference Designator: AUDIO
+	Internal Connector Type: None
+	External Reference Designator: AUDIO
+	External Connector Type: Other
+	Port Type: Audio Port
+
+Handle 0x000D, DMI type 8, 9 bytes
+Port Connector Information
+	Internal Reference Designator: SATA1
+	Internal Connector Type: SAS/SATA Plug Receptacle
+	External Reference Designator: Not Specified
+	External Connector Type: None
+	Port Type: SATA
+
+Handle 0x000E, DMI type 8, 9 bytes
+Port Connector Information
+	Internal Reference Designator: SATA2
+	Internal Connector Type: SAS/SATA Plug Receptacle
+	External Reference Designator: Not Specified
+	External Connector Type: None
+	Port Type: SATA
+
+Handle 0x000F, DMI type 8, 9 bytes
+Port Connector Information
+	Internal Reference Designator: SATA3
+	Internal Connector Type: SAS/SATA Plug Receptacle
+	External Reference Designator: Not Specified
+	External Connector Type: None
+	Port Type: SATA
+
+Handle 0x0010, DMI type 8, 9 bytes
+Port Connector Information
+	Internal Reference Designator: SATA4
+	Internal Connector Type: SAS/SATA Plug Receptacle
+	External Reference Designator: Not Specified
+	External Connector Type: None
+	Port Type: SATA
+
+Handle 0x0011, DMI type 8, 9 bytes
+Port Connector Information
+	Internal Reference Designator: SATA5
+	Internal Connector Type: SAS/SATA Plug Receptacle
+	External Reference Designator: Not Specified
+	External Connector Type: None
+	Port Type: SATA
+
+Handle 0x0012, DMI type 8, 9 bytes
+Port Connector Information
+	Internal Reference Designator: SATA6
+	Internal Connector Type: SAS/SATA Plug Receptacle
+	External Reference Designator: Not Specified
+	External Connector Type: None
+	Port Type: SATA
+
+Handle 0x0013, DMI type 8, 9 bytes
+Port Connector Information
+	Internal Reference Designator: USB1_2
+	Internal Connector Type: Access Bus (USB)
+	External Reference Designator: Not Specified
+	External Connector Type: None
+	Port Type: USB
+
+Handle 0x0014, DMI type 8, 9 bytes
+Port Connector Information
+	Internal Reference Designator: USB3_4
+	Internal Connector Type: Access Bus (USB)
+	External Reference Designator: Not Specified
+	External Connector Type: None
+	Port Type: USB
+
+Handle 0x0015, DMI type 8, 9 bytes
+Port Connector Information
+	Internal Reference Designator: USB5_6
+	Internal Connector Type: Access Bus (USB)
+	External Reference Designator: Not Specified
+	External Connector Type: None
+	Port Type: USB
+
+Handle 0x0016, DMI type 8, 9 bytes
+Port Connector Information
+	Internal Reference Designator: USB7_8
+	Internal Connector Type: Access Bus (USB)
+	External Reference Designator: Not Specified
+	External Connector Type: None
+	Port Type: USB
+
+Handle 0x0017, DMI type 8, 9 bytes
+Port Connector Information
+	Internal Reference Designator: AAFP
+	Internal Connector Type: Mini Jack (headphones)
+	External Reference Designator: Not Specified
+	External Connector Type: None
+	Port Type: Audio Port
+
+Handle 0x0018, DMI type 8, 9 bytes
+Port Connector Information
+	Internal Reference Designator: CPU_FAN
+	Internal Connector Type: Other
+	External Reference Designator: Not Specified
+	External Connector Type: None
+	Port Type: Other
+
+Handle 0x0019, DMI type 8, 9 bytes
+Port Connector Information
+	Internal Reference Designator: CHA_FAN1
+	Internal Connector Type: Other
+	External Reference Designator: Not Specified
+	External Connector Type: None
+	Port Type: Other
+
+Handle 0x001A, DMI type 8, 9 bytes
+Port Connector Information
+	Internal Reference Designator: PWR_FAN
+	Internal Connector Type: Other
+	External Reference Designator: Not Specified
+	External Connector Type: None
+	Port Type: Other
+
+Handle 0x001B, DMI type 8, 9 bytes
+Port Connector Information
+	Internal Reference Designator: PATA_IDE
+	Internal Connector Type: On Board IDE
+	External Reference Designator: Not Specified
+	External Connector Type: None
+	Port Type: Other
+
+Handle 0x001C, DMI type 8, 9 bytes
+Port Connector Information
+	Internal Reference Designator: F_ESATA
+	Internal Connector Type: SAS/SATA Plug Receptacle
+	External Reference Designator: Not Specified
+	External Connector Type: None
+	Port Type: SATA
+
+Handle 0x001D, DMI type 9, 17 bytes
+System Slot Information
+	Designation: PCIEX16_1
+	Type: 32-bit PCI Express
+	Current Usage: In Use
+	Length: Short
+	ID: 1
+	Characteristics:
+		3.3 V is provided
+		Opening is shared
+		PME signal is supported
+	Bus Address: 0000:00:01.0
+
+Handle 0x001E, DMI type 9, 17 bytes
+System Slot Information
+	Designation: PCIEX1_1
+	Type: 32-bit PCI Express
+	Current Usage: In Use
+	Length: Short
+	ID: 2
+	Characteristics:
+		3.3 V is provided
+		Opening is shared
+		PME signal is supported
+	Bus Address: 0000:00:1c.3
+
+Handle 0x001F, DMI type 9, 17 bytes
+System Slot Information
+	Designation: PCIEX1_2
+	Type: 32-bit PCI Express
+	Current Usage: In Use
+	Length: Short
+	ID: 3
+	Characteristics:
+		3.3 V is provided
+		Opening is shared
+		PME signal is supported
+	Bus Address: 0000:00:1c.4
+
+Handle 0x0020, DMI type 9, 17 bytes
+System Slot Information
+	Designation: PCI1
+	Type: 32-bit PCI
+	Current Usage: In Use
+	Length: Short
+	ID: 4
+	Characteristics:
+		3.3 V is provided
+		Opening is shared
+		PME signal is supported
+	Bus Address: 0000:00:1c.6
+
+Handle 0x0021, DMI type 10, 6 bytes
+On Board Device Information
+	Type: Ethernet
+	Status: Enabled
+	Description: Onboard Ethernet
+
+Handle 0x0022, DMI type 11, 5 bytes
+OEM Strings
+	String 1: To Be Filled By O.E.M.
+
+Handle 0x0023, DMI type 12, 5 bytes
+System Configuration Options
+	Option 1: To Be Filled By O.E.M.
+
+Handle 0x0024, DMI type 16, 15 bytes
+Physical Memory Array
+	Location: System Board Or Motherboard
+	Use: System Memory
+	Error Correction Type: None
+	Maximum Capacity: 32 GB
+	Error Information Handle: No Error
+	Number Of Devices: 4
+
+Handle 0x0025, DMI type 18, 23 bytes
+32-bit Memory Error Information
+	Type: OK
+	Granularity: Unknown
+	Operation: Unknown
+	Vendor Syndrome: Unknown
+	Memory Array Address: Unknown
+	Device Address: Unknown
+	Resolution: Unknown
+
+Handle 0x0026, DMI type 19, 15 bytes
+Memory Array Mapped Address
+	Starting Address: 0x00000000000
+	Ending Address: 0x000FFFFFFFF
+	Range Size: 4 GB
+	Physical Array Handle: 0x0024
+	Partition Width: 0
+
+Handle 0x0027, DMI type 17, 28 bytes
+Memory Device
+	Array Handle: 0x0024
+	Error Information Handle: No Error
+	Total Width: 64 bits
+	Data Width: 64 bits
+	Size: No Module Installed
+	Form Factor: DIMM
+	Set: None
+	Locator: DIMM0
+	Bank Locator: BANK0
+	Type: Unknown
+	Type Detail: Synchronous
+	Speed: Unknown
+	Manufacturer: Manufacturer0
+	Serial Number: SerNum0
+	Asset Tag: AssetTagNum0
+	Part Number: Array1_PartNumber0
+	Rank: Unknown
+
+Handle 0x0028, DMI type 18, 23 bytes
+32-bit Memory Error Information
+	Type: OK
+	Granularity: Unknown
+	Operation: Unknown
+	Vendor Syndrome: Unknown
+	Memory Array Address: Unknown
+	Device Address: Unknown
+	Resolution: Unknown
+
+Handle 0x0029, DMI type 126, 19 bytes
+Inactive
+
+Handle 0x002A, DMI type 17, 28 bytes
+Memory Device
+	Array Handle: 0x0024
+	Error Information Handle: No Error
+	Total Width: 64 bits
+	Data Width: 64 bits
+	Size: 2048 MB
+	Form Factor: DIMM
+	Set: None
+	Locator: DIMM1
+	Bank Locator: BANK1
+	Type: <OUT OF SPEC>
+	Type Detail: Synchronous
+	Speed: 1600 MHz
+	Manufacturer: Undefined    
+	Serial Number: 0000000
+	Asset Tag: AssetTagNum1
+	Part Number: F3-12800CL9-2GBXL 
+	Rank: 2
+
+Handle 0x002B, DMI type 18, 23 bytes
+32-bit Memory Error Information
+	Type: OK
+	Granularity: Unknown
+	Operation: Unknown
+	Vendor Syndrome: Unknown
+	Memory Array Address: Unknown
+	Device Address: Unknown
+	Resolution: Unknown
+
+Handle 0x002C, DMI type 20, 19 bytes
+Memory Device Mapped Address
+	Starting Address: 0x00000000000
+	Ending Address: 0x0007FFFFFFF
+	Range Size: 2 GB
+	Physical Device Handle: 0x002A
+	Memory Array Mapped Address Handle: 0x0026
+	Partition Row Position: 1
+
+Handle 0x002D, DMI type 17, 28 bytes
+Memory Device
+	Array Handle: 0x0024
+	Error Information Handle: No Error
+	Total Width: 64 bits
+	Data Width: 64 bits
+	Size: No Module Installed
+	Form Factor: DIMM
+	Set: None
+	Locator: DIMM2
+	Bank Locator: BANK2
+	Type: Unknown
+	Type Detail: Synchronous
+	Speed: Unknown
+	Manufacturer: Manufacturer2
+	Serial Number: SerNum2
+	Asset Tag: AssetTagNum2
+	Part Number: Array1_PartNumber2
+	Rank: Unknown
+
+Handle 0x002E, DMI type 18, 23 bytes
+32-bit Memory Error Information
+	Type: OK
+	Granularity: Unknown
+	Operation: Unknown
+	Vendor Syndrome: Unknown
+	Memory Array Address: Unknown
+	Device Address: Unknown
+	Resolution: Unknown
+
+Handle 0x002F, DMI type 126, 19 bytes
+Inactive
+
+Handle 0x0030, DMI type 17, 28 bytes
+Memory Device
+	Array Handle: 0x0024
+	Error Information Handle: No Error
+	Total Width: 64 bits
+	Data Width: 64 bits
+	Size: 2048 MB
+	Form Factor: DIMM
+	Set: None
+	Locator: DIMM3
+	Bank Locator: BANK3
+	Type: <OUT OF SPEC>
+	Type Detail: Synchronous
+	Speed: 1600 MHz
+	Manufacturer: Undefined    
+	Serial Number: 0000000
+	Asset Tag: AssetTagNum3
+	Part Number: F3-12800CL9-2GBXL 
+	Rank: 2
+
+Handle 0x0031, DMI type 18, 23 bytes
+32-bit Memory Error Information
+	Type: OK
+	Granularity: Unknown
+	Operation: Unknown
+	Vendor Syndrome: Unknown
+	Memory Array Address: Unknown
+	Device Address: Unknown
+	Resolution: Unknown
+
+Handle 0x0032, DMI type 20, 19 bytes
+Memory Device Mapped Address
+	Starting Address: 0x00080000000
+	Ending Address: 0x000FFFFFFFF
+	Range Size: 2 GB
+	Physical Device Handle: 0x0030
+	Memory Array Mapped Address Handle: 0x0026
+	Partition Row Position: 1
+
+Handle 0x0033, DMI type 32, 20 bytes
+System Boot Information
+	Status: No errors detected
+
+Handle 0x0034, DMI type 34, 11 bytes
+Management Device
+	Description: LM78-1
+	Type: LM78
+	Address: 0x00000000
+	Address Type: I/O Port
+
+Handle 0x0035, DMI type 26, 22 bytes
+Voltage Probe
+	Description: LM78A
+	Location: <OUT OF SPEC>
+	Status: <OUT OF SPEC>
+	Maximum Value: Unknown
+	Minimum Value: Unknown
+	Resolution: Unknown
+	Tolerance: Unknown
+	Accuracy: Unknown
+	OEM-specific Information: 0x00000000
+	Nominal Value: Unknown
+
+Handle 0x0036, DMI type 36, 16 bytes
+Management Device Threshold Data
+	Lower Non-critical Threshold: 1
+	Upper Non-critical Threshold: 2
+	Lower Critical Threshold: 3
+	Upper Critical Threshold: 4
+	Lower Non-recoverable Threshold: 5
+	Upper Non-recoverable Threshold: 6
+
+Handle 0x0037, DMI type 35, 11 bytes
+Management Device Component
+	Description: To Be Filled By O.E.M.
+	Management Device Handle: 0x0034
+	Component Handle: 0x0034
+	Threshold Handle: 0x0035
+
+Handle 0x0038, DMI type 28, 22 bytes
+Temperature Probe
+	Description: LM78A
+	Location: <OUT OF SPEC>
+	Status: <OUT OF SPEC>
+	Maximum Value: Unknown
+	Minimum Value: Unknown
+	Resolution: Unknown
+	Tolerance: Unknown
+	Accuracy: Unknown
+	OEM-specific Information: 0x00000000
+	Nominal Value: Unknown
+
+Handle 0x0039, DMI type 36, 16 bytes
+Management Device Threshold Data
+	Lower Non-critical Threshold: 1
+	Upper Non-critical Threshold: 2
+	Lower Critical Threshold: 3
+	Upper Critical Threshold: 4
+	Lower Non-recoverable Threshold: 5
+	Upper Non-recoverable Threshold: 6
+
+Handle 0x003A, DMI type 35, 11 bytes
+Management Device Component
+	Description: To Be Filled By O.E.M.
+	Management Device Handle: 0x0034
+	Component Handle: 0x0037
+	Threshold Handle: 0x0038
+
+Handle 0x003B, DMI type 27, 14 bytes
+Cooling Device
+	Temperature Probe Handle: 0x0038
+	Type: <OUT OF SPEC>
+	Status: <OUT OF SPEC>
+	Cooling Unit Group: 1
+	OEM-specific Information: 0x00000000
+	Nominal Speed: Unknown Or Non-rotating
+
+Handle 0x003C, DMI type 36, 16 bytes
+Management Device Threshold Data
+	Lower Non-critical Threshold: 1
+	Upper Non-critical Threshold: 2
+	Lower Critical Threshold: 3
+	Upper Critical Threshold: 4
+	Lower Non-recoverable Threshold: 5
+	Upper Non-recoverable Threshold: 6
+
+Handle 0x003D, DMI type 35, 11 bytes
+Management Device Component
+	Description: To Be Filled By O.E.M.
+	Management Device Handle: 0x0034
+	Component Handle: 0x003A
+	Threshold Handle: 0x003B
+
+Handle 0x003E, DMI type 27, 14 bytes
+Cooling Device
+	Temperature Probe Handle: 0x0038
+	Type: <OUT OF SPEC>
+	Status: <OUT OF SPEC>
+	Cooling Unit Group: 1
+	OEM-specific Information: 0x00000000
+	Nominal Speed: Unknown Or Non-rotating
+
+Handle 0x003F, DMI type 36, 16 bytes
+Management Device Threshold Data
+	Lower Non-critical Threshold: 1
+	Upper Non-critical Threshold: 2
+	Lower Critical Threshold: 3
+	Upper Critical Threshold: 4
+	Lower Non-recoverable Threshold: 5
+	Upper Non-recoverable Threshold: 6
+
+Handle 0x0040, DMI type 35, 11 bytes
+Management Device Component
+	Description: To Be Filled By O.E.M.
+	Management Device Handle: 0x0034
+	Component Handle: 0x003D
+	Threshold Handle: 0x003E
+
+Handle 0x0041, DMI type 29, 22 bytes
+Electrical Current Probe
+	Description: ABC
+	Location: <OUT OF SPEC>
+	Status: <OUT OF SPEC>
+	Maximum Value: Unknown
+	Minimum Value: Unknown
+	Resolution: Unknown
+	Tolerance: Unknown
+	Accuracy: Unknown
+	OEM-specific Information: 0x00000000
+	Nominal Value: Unknown
+
+Handle 0x0042, DMI type 36, 16 bytes
+Management Device Threshold Data
+
+Handle 0x0043, DMI type 35, 11 bytes
+Management Device Component
+	Description: To Be Filled By O.E.M.
+	Management Device Handle: 0x0034
+	Component Handle: 0x0040
+	Threshold Handle: 0x003E
+
+Handle 0x0044, DMI type 39, 22 bytes
+System Power Supply
+	Power Unit Group: 1
+	Location: To Be Filled By O.E.M.
+	Name: To Be Filled By O.E.M.
+	Manufacturer: To Be Filled By O.E.M.
+	Serial Number: To Be Filled By O.E.M.
+	Asset Tag: To Be Filled By O.E.M.
+	Model Part Number: To Be Filled By O.E.M.
+	Revision: To Be Filled By O.E.M.
+	Max Power Capacity: Unknown
+	Status: Not Present
+	Type: <OUT OF SPEC>
+	Input Voltage Range Switching: <OUT OF SPEC>
+	Plugged: Yes
+	Hot Replaceable: No
+	Input Voltage Probe Handle: 0x0035
+	Cooling Device Handle: 0x003B
+	Input Current Probe Handle: 0x0041
+
+Handle 0x0045, DMI type 34, 16 bytes
+Management Device
+	Description: 2
+	Type: LM78
+	Address: 0x00000000
+	Address Type: I/O Port
+
+Handle 0x0046, DMI type 26, 22 bytes
+Voltage Probe
+	Description: LM78B
+	Location: <OUT OF SPEC>
+	Status: <OUT OF SPEC>
+	Maximum Value: Unknown
+	Minimum Value: Unknown
+	Resolution: Unknown
+	Tolerance: Unknown
+	Accuracy: Unknown
+	OEM-specific Information: 0x00000000
+	Nominal Value: Unknown
+
+Handle 0x0047, DMI type 36, 16 bytes
+Management Device Threshold Data
+	Lower Non-critical Threshold: 7
+	Upper Non-critical Threshold: 8
+	Lower Critical Threshold: 8
+	Upper Critical Threshold: 10
+	Lower Non-recoverable Threshold: 11
+	Upper Non-recoverable Threshold: 12
+
+Handle 0x0048, DMI type 35, 11 bytes
+Management Device Component
+	Description: To Be Filled By O.E.M.
+	Management Device Handle: 0x0045
+	Component Handle: 0x0045
+	Threshold Handle: 0x0046
+
+Handle 0x0049, DMI type 26, 22 bytes
+Voltage Probe
+	Description: LM78B
+	Location: <OUT OF SPEC>
+	Status: <OUT OF SPEC>
+	Maximum Value: Unknown
+	Minimum Value: Unknown
+	Resolution: Unknown
+	Tolerance: Unknown
+	Accuracy: Unknown
+	OEM-specific Information: 0x00000000
+	Nominal Value: Unknown
+
+Handle 0x004A, DMI type 36, 16 bytes
+Management Device Threshold Data
+	Lower Non-critical Threshold: 13
+	Upper Non-critical Threshold: 14
+	Lower Critical Threshold: 15
+	Upper Critical Threshold: 16
+	Lower Non-recoverable Threshold: 17
+	Upper Non-recoverable Threshold: 18
+
+Handle 0x004B, DMI type 35, 11 bytes
+Management Device Component
+	Description: To Be Filled By O.E.M.
+	Management Device Handle: 0x0045
+	Component Handle: 0x0048
+	Threshold Handle: 0x0049
+
+Handle 0x004C, DMI type 28, 22 bytes
+Temperature Probe
+	Description: LM78B
+	Location: <OUT OF SPEC>
+	Status: <OUT OF SPEC>
+	Maximum Value: Unknown
+	Minimum Value: Unknown
+	Resolution: Unknown
+	Tolerance: Unknown
+	Accuracy: Unknown
+	OEM-specific Information: 0x00000000
+	Nominal Value: Unknown
+
+Handle 0x004D, DMI type 36, 16 bytes
+Management Device Threshold Data
+	Lower Non-critical Threshold: 1
+	Upper Non-critical Threshold: 2
+	Lower Critical Threshold: 3
+	Upper Critical Threshold: 4
+	Lower Non-recoverable Threshold: 5
+	Upper Non-recoverable Threshold: 6
+
+Handle 0x004E, DMI type 35, 11 bytes
+Management Device Component
+	Description: To Be Filled By O.E.M.
+	Management Device Handle: 0x0045
+	Component Handle: 0x004B
+	Threshold Handle: 0x004C
+
+Handle 0x004F, DMI type 27, 14 bytes
+Cooling Device
+	Temperature Probe Handle: 0x004C
+	Type: <OUT OF SPEC>
+	Status: <OUT OF SPEC>
+	Cooling Unit Group: 1
+	OEM-specific Information: 0x00000000
+	Nominal Speed: Unknown Or Non-rotating
+
+Handle 0x0050, DMI type 36, 16 bytes
+Management Device Threshold Data
+	Lower Non-critical Threshold: 1
+	Upper Non-critical Threshold: 2
+	Lower Critical Threshold: 3
+	Upper Critical Threshold: 4
+	Lower Non-recoverable Threshold: 5
+	Upper Non-recoverable Threshold: 6
+
+Handle 0x0051, DMI type 35, 11 bytes
+Management Device Component
+	Description: To Be Filled By O.E.M.
+	Management Device Handle: 0x0045
+	Component Handle: 0x004E
+	Threshold Handle: 0x004F
+
+Handle 0x0052, DMI type 28, 22 bytes
+Temperature Probe
+	Description: LM78B
+	Location: <OUT OF SPEC>
+	Status: <OUT OF SPEC>
+	Maximum Value: Unknown
+	Minimum Value: Unknown
+	Resolution: Unknown
+	Tolerance: Unknown
+	Accuracy: Unknown
+	OEM-specific Information: 0x00000000
+	Nominal Value: Unknown
+
+Handle 0x0053, DMI type 36, 16 bytes
+Management Device Threshold Data
+	Lower Non-critical Threshold: 1
+	Upper Non-critical Threshold: 2
+	Lower Critical Threshold: 3
+	Upper Critical Threshold: 4
+	Lower Non-recoverable Threshold: 5
+	Upper Non-recoverable Threshold: 6
+
+Handle 0x0054, DMI type 35, 11 bytes
+Management Device Component
+	Description: To Be Filled By O.E.M.
+	Management Device Handle: 0x0045
+	Component Handle: 0x0051
+	Threshold Handle: 0x0052
+
+Handle 0x0055, DMI type 27, 14 bytes
+Cooling Device
+	Temperature Probe Handle: 0x0052
+	Type: <OUT OF SPEC>
+	Status: <OUT OF SPEC>
+	Cooling Unit Group: 1
+	OEM-specific Information: 0x00000000
+	Nominal Speed: Unknown Or Non-rotating
+
+Handle 0x0056, DMI type 36, 16 bytes
+Management Device Threshold Data
+	Lower Non-critical Threshold: 1
+	Upper Non-critical Threshold: 2
+	Lower Critical Threshold: 3
+	Upper Critical Threshold: 4
+	Lower Non-recoverable Threshold: 5
+	Upper Non-recoverable Threshold: 6
+
+Handle 0x0057, DMI type 35, 11 bytes
+Management Device Component
+	Description: To Be Filled By O.E.M.
+	Management Device Handle: 0x0045
+	Component Handle: 0x0054
+	Threshold Handle: 0x0055
+
+Handle 0x0058, DMI type 29, 22 bytes
+Electrical Current Probe
+	Description: DEF
+	Location: <OUT OF SPEC>
+	Status: <OUT OF SPEC>
+	Maximum Value: Unknown
+	Minimum Value: Unknown
+	Resolution: Unknown
+	Tolerance: Unknown
+	Accuracy: Unknown
+	OEM-specific Information: 0x00000000
+	Nominal Value: Unknown
+
+Handle 0x0059, DMI type 36, 16 bytes
+Management Device Threshold Data
+
+Handle 0x005A, DMI type 35, 11 bytes
+Management Device Component
+	Description: To Be Filled By O.E.M.
+	Management Device Handle: 0x0045
+	Component Handle: 0x0057
+	Threshold Handle: 0x0055
+
+Handle 0x005B, DMI type 29, 22 bytes
+Electrical Current Probe
+	Description: GHI
+	Location: <OUT OF SPEC>
+	Status: <OUT OF SPEC>
+	Maximum Value: Unknown
+	Minimum Value: Unknown
+	Resolution: Unknown
+	Tolerance: Unknown
+	Accuracy: Unknown
+	OEM-specific Information: 0x00000000
+	Nominal Value: Unknown
+
+Handle 0x005C, DMI type 36, 16 bytes
+Management Device Threshold Data
+
+Handle 0x005D, DMI type 35, 11 bytes
+Management Device Component
+	Description: To Be Filled By O.E.M.
+	Management Device Handle: 0x0045
+	Component Handle: 0x005A
+	Threshold Handle: 0x0055
+
+Handle 0x005E, DMI type 39, 22 bytes
+System Power Supply
+	Power Unit Group: 1
+	Location: To Be Filled By O.E.M.
+	Name: To Be Filled By O.E.M.
+	Manufacturer: To Be Filled By O.E.M.
+	Serial Number: To Be Filled By O.E.M.
+	Asset Tag: To Be Filled By O.E.M.
+	Model Part Number: To Be Filled By O.E.M.
+	Revision: To Be Filled By O.E.M.
+	Max Power Capacity: Unknown
+	Status: Not Present
+	Type: <OUT OF SPEC>
+	Input Voltage Range Switching: <OUT OF SPEC>
+	Plugged: Yes
+	Hot Replaceable: No
+	Input Voltage Probe Handle: 0x0035
+	Cooling Device Handle: 0x003B
+	Input Current Probe Handle: 0x0041
+
+Handle 0x005F, DMI type 41, 11 bytes
+Onboard Device
+	Reference Designation:  Onboard IGD
+	Type: Video
+	Status: Enabled
+	Type Instance: 1
+	Bus Address: 0000:00:02.0
+
+Handle 0x0060, DMI type 41, 11 bytes
+Onboard Device
+	Reference Designation:  Onboard LAN
+	Type: Ethernet
+	Status: Enabled
+	Type Instance: 1
+	Bus Address: 0000:00:19.0
+
+Handle 0x0061, DMI type 41, 11 bytes
+Onboard Device
+	Reference Designation:  Onboard 1394
+	Type: Other
+	Status: Enabled
+	Type Instance: 1
+	Bus Address: 0000:03:1c.2
+
+Handle 0x0062, DMI type 139, 54 bytes
+OEM-specific Type
+	Header and Data:
+		8B 36 62 00 00 1E 8C 00 00 44 9A AD 04 04 32 55
+		F8 00 A2 02 A1 00 40 63 43 10 FE 81 03 DF 40 B2
+		00 20 00 73 3C 10 08 00 00 00 00 00 00 00 00 00
+		00 00 00 00 00 01
+	Strings:
+		V1394GUID
+
+Handle 0x0063, DMI type 13, 22 bytes
+BIOS Language Information
+	Installable Languages: 6
+		eng
+		fra
+		ger
+		chs
+		chi
+		jpn
+	Currently Installed Language: eng
+
+Handle 0x0064, DMI type 127, 4 bytes
+End Of Table
+
diff --git a/resources/generic/dmidecode/windows-xppro b/resources/generic/dmidecode/windows-xppro
new file mode 100644
index 0000000..6b999c7
--- /dev/null
+++ b/resources/generic/dmidecode/windows-xppro
@@ -0,0 +1,586 @@
+# dmidecode 2.11
+SMBIOS 2.4 present.
+57 structures occupying 2822 bytes.
+Table at 0x000F6570.
+
+Handle 0xDA00, DMI type 218, 251 bytes
+OEM-specific Type
+	Header and Data:
+		DA FB 00 DA B2 00 0D 5F 1F 37 40 7D 00 00 00 00
+		00 40 00 02 00 01 00 41 00 02 00 00 00 65 00 03
+		00 00 00 66 00 03 00 01 00 F1 00 04 00 00 00 F2
+		00 04 00 01 00 F3 00 04 00 02 00 0F 00 05 00 00
+		00 11 00 05 00 01 00 05 00 05 00 02 00 12 00 05
+		00 03 00 06 00 05 00 04 00 07 00 06 00 00 00 0B
+		00 06 00 01 00 0C 00 06 00 02 00 0D 00 06 00 03
+		00 89 01 07 00 00 00 8A 01 07 00 01 00 42 00 08
+		00 01 00 43 00 08 00 00 00 55 00 09 00 00 00 6D
+		00 09 00 01 00 16 02 09 00 02 00 98 01 09 00 03
+		00 0A 01 0A 00 01 00 0B 01 0A 00 00 00 2D 00 0B
+		00 02 00 6E 00 0B 00 01 00 2E 00 0B 00 00 00 11
+		01 0C 00 00 00 10 01 0C 00 01 00 F0 00 0D 00 01
+		00 ED 00 0D 00 00 00 41 01 0E 00 01 00 40 01 0E
+		00 00 00 47 01 0F 00 01 00 46 01 0F 00 00 00 4A
+		01 10 00 00 00 FF FF 00 00 00 00
+
+Handle 0xDA01, DMI type 218, 251 bytes
+OEM-specific Type
+	Header and Data:
+		DA FB 01 DA B2 00 0D 5F 1F 37 40 4B 01 10 00 01
+		00 04 02 11 00 00 00 05 02 11 00 01 00 02 02 12
+		00 00 00 03 02 12 00 01 00 52 01 13 00 01 00 53
+		01 13 00 00 00 80 01 14 00 01 00 7F 01 14 00 00
+		00 7C 01 15 00 01 00 7B 01 15 00 00 00 E8 02 16
+		00 00 00 E9 02 16 00 01 00 7E 01 17 00 01 00 7D
+		01 17 00 00 00 92 01 18 00 00 00 91 01 18 00 01
+		00 94 01 19 00 00 00 93 01 19 00 01 00 86 01 1A
+		00 01 00 85 01 1A 00 00 00 82 01 1B 00 01 00 81
+		01 1B 00 00 00 84 01 1C 00 01 00 83 01 1C 00 00
+		00 9B 01 1D 00 00 00 9C 01 1D 00 01 00 9D 01 1D
+		00 02 00 9E 01 1D 00 03 00 8D 01 1E 00 00 00 8E
+		01 1E 00 01 00 85 02 1F 00 00 00 86 02 1F 00 01
+		00 EA 00 20 00 00 00 EB 00 20 00 01 00 EC 00 20
+		00 02 00 A1 00 21 00 00 00 A3 00 21 00 01 00 28
+		00 22 00 00 00 FF FF 00 00 00 00
+
+Handle 0xDA02, DMI type 218, 251 bytes
+OEM-specific Type
+	Header and Data:
+		DA FB 02 DA B2 00 0D 5F 1F 37 40 29 00 22 00 01
+		00 2A 00 22 00 02 00 2B 00 23 00 00 00 2C 00 24
+		00 00 00 0E 01 25 00 01 00 0F 01 25 00 00 00 9B
+		00 26 00 01 00 9C 00 26 00 00 00 4D 01 27 00 01
+		00 4C 01 27 00 00 00 87 01 28 00 00 00 88 01 28
+		00 01 00 35 01 29 00 03 00 37 01 29 00 00 00 38
+		01 29 00 01 00 39 01 29 00 02 00 D9 01 2A 00 01
+		00 D8 01 2A 00 00 00 DF 01 2B 00 01 00 DE 01 2B
+		00 00 00 45 02 2C 00 00 00 44 02 2C 00 01 00 49
+		02 2D 00 00 00 48 02 2D 00 01 00 45 01 45 01 01
+		00 44 01 44 01 00 00 76 01 76 01 01 00 75 01 75
+		01 01 00 9F 00 9F 00 00 00 A0 00 A0 00 01 00 E1
+		01 E1 01 00 00 E3 01 E3 01 01 00 E2 01 E2 01 02
+		00 29 02 29 02 01 00 28 02 28 02 02 00 2A 02 2A
+		02 03 00 30 02 30 02 01 00 2F 02 2F 02 00 00 35
+		02 35 02 01 00 FF FF 00 00 00 00
+
+Handle 0xDA03, DMI type 218, 77 bytes
+OEM-specific Type
+	Header and Data:
+		DA 4D 03 DA B2 00 0D 5F 1F 37 40 36 02 36 02 00
+		00 37 02 37 02 02 00 4A 02 4A 02 01 00 0C 80 0C
+		80 01 00 6C 02 6C 02 01 00 6D 02 6D 02 00 00 01
+		F0 01 F0 00 00 02 F0 02 F0 00 00 03 F0 03 F0 00
+		00 04 F0 04 F0 00 00 FF FF 00 00 00 00
+
+Handle 0x0000, DMI type 0, 24 bytes
+BIOS Information
+	Vendor: Dell Inc.
+	Version: A24
+	Release Date: 08/19/2010
+	Address: 0xF0000
+	Runtime Size: 64 kB
+	ROM Size: 1728 kB
+	Characteristics:
+		ISA is supported
+		PCI is supported
+		PC Card (PCMCIA) is supported
+		PNP is supported
+		BIOS is upgradeable
+		BIOS shadowing is allowed
+		Boot from CD is supported
+		Selectable boot is supported
+		3.5"/720 kB floppy services are supported (int 13h)
+		Print screen service is supported (int 5h)
+		8042 keyboard services are supported (int 9h)
+		Serial services are supported (int 14h)
+		Printer services are supported (int 17h)
+		CGA/mono video services are supported (int 10h)
+		ACPI is supported
+		USB legacy is supported
+		AGP is supported
+		Smart battery is supported
+		BIOS boot specification is supported
+		Function key-initiated network boot is supported
+		Targeted content distribution is supported
+	BIOS Revision: 2.4
+	Firmware Revision: 2.4
+
+Handle 0x0100, DMI type 1, 27 bytes
+System Information
+	Manufacturer: Dell Inc.
+	Product Name: Precision M4400                 
+	Version: Not Specified
+	Serial Number: HLG964J
+	UUID: 44454C4C-4C00-1047-8039-C8C04F36344A
+	Wake-up Type: Power Switch
+	SKU Number: Not Specified
+	Family:  
+
+Handle 0x0200, DMI type 2, 9 bytes
+Base Board Information
+	Manufacturer: Dell Inc.
+	Product Name: 0P019G
+	Version:    
+	Serial Number: .HLG964J.CN129618C52450.
+	Asset Tag:           
+
+Handle 0x0300, DMI type 3, 13 bytes
+Chassis Information
+	Manufacturer: Dell Inc.
+	Type: Portable
+	Lock: Not Present
+	Version: Not Specified
+	Serial Number: HLG964J
+	Asset Tag: Not Specified
+	Boot-up State: Safe
+	Power Supply State: Safe
+	Thermal State: Safe
+	Security Status: None
+
+Handle 0x0400, DMI type 4, 40 bytes
+Processor Information
+	Socket Designation: Microprocessor
+	Type: Central Processor
+	Family: Core 2 Duo
+	Manufacturer: Intel
+	ID: 76 06 01 00 FF FB EB BF
+	Signature: Type 0, Family 6, Model 23, Stepping 6
+	Flags:
+		FPU (Floating-point unit on-chip)
+		VME (Virtual mode extension)
+		DE (Debugging extension)
+		PSE (Page size extension)
+		TSC (Time stamp counter)
+		MSR (Model specific registers)
+		PAE (Physical address extension)
+		MCE (Machine check exception)
+		CX8 (CMPXCHG8 instruction supported)
+		APIC (On-chip APIC hardware supported)
+		SEP (Fast system call)
+		MTRR (Memory type range registers)
+		PGE (Page global enable)
+		MCA (Machine check architecture)
+		CMOV (Conditional move instruction supported)
+		PAT (Page attribute table)
+		PSE-36 (36-bit page size extension)
+		CLFSH (CLFLUSH instruction supported)
+		DS (Debug store)
+		ACPI (ACPI supported)
+		MMX (MMX technology supported)
+		FXSR (FXSAVE and FXSTOR instructions supported)
+		SSE (Streaming SIMD extensions)
+		SSE2 (Streaming SIMD extensions 2)
+		SS (Self-snoop)
+		HTT (Multi-threading)
+		TM (Thermal monitor supported)
+		PBE (Pending break enabled)
+	Version: Not Specified
+	Voltage: 3.3 V
+	External Clock: 266 MHz
+	Max Speed: 2534 MHz
+	Current Speed: 2534 MHz
+	Status: Populated, Enabled
+	Upgrade: None
+	L1 Cache Handle: 0x0700
+	L2 Cache Handle: 0x0701
+	L3 Cache Handle: Not Provided
+	Serial Number: Not Specified
+	Asset Tag: Not Specified
+	Part Number: Not Specified
+	Core Count: 2
+	Core Enabled: 2
+	Thread Count: 2
+	Characteristics:
+		64-bit capable
+
+Handle 0x0700, DMI type 7, 19 bytes
+Cache Information
+	Socket Designation: Not Specified
+	Configuration: Enabled, Not Socketed, Level 1
+	Operational Mode: Write Back
+	Location: Internal
+	Installed Size: 128 kB
+	Maximum Size: 128 kB
+	Supported SRAM Types:
+		Unknown
+	Installed SRAM Type: Unknown
+	Speed: Unknown
+	Error Correction Type: None
+	System Type: Data
+	Associativity: 4-way Set-associative
+
+Handle 0x0701, DMI type 7, 19 bytes
+Cache Information
+	Socket Designation: Not Specified
+	Configuration: Enabled, Not Socketed, Level 2
+	Operational Mode: Varies With Memory Address
+	Location: Internal
+	Installed Size: 6144 kB
+	Maximum Size: 6144 kB
+	Supported SRAM Types:
+		Pipeline Burst
+	Installed SRAM Type: Pipeline Burst
+	Speed: 15 ns
+	Error Correction Type: None
+	System Type: Unified
+	Associativity: Other
+
+Handle 0x0800, DMI type 8, 9 bytes
+Port Connector Information
+	Internal Reference Designator: PARALLEL
+	Internal Connector Type: None
+	External Reference Designator: Not Specified
+	External Connector Type: DB-25 female
+	Port Type: Parallel Port PS/2
+
+Handle 0x0801, DMI type 8, 9 bytes
+Port Connector Information
+	Internal Reference Designator: SERIAL1
+	Internal Connector Type: None
+	External Reference Designator: Not Specified
+	External Connector Type: DB-9 male
+	Port Type: Serial Port 16550A Compatible
+
+Handle 0x0804, DMI type 8, 9 bytes
+Port Connector Information
+	Internal Reference Designator: USB
+	Internal Connector Type: None
+	External Reference Designator: Not Specified
+	External Connector Type: Access Bus (USB)
+	Port Type: USB
+
+Handle 0x0806, DMI type 8, 9 bytes
+Port Connector Information
+	Internal Reference Designator: MONITOR
+	Internal Connector Type: None
+	External Reference Designator: Not Specified
+	External Connector Type: DB-15 female
+	Port Type: Video Port
+
+Handle 0x080B, DMI type 8, 9 bytes
+Port Connector Information
+	Internal Reference Designator: FireWire
+	Internal Connector Type: None
+	External Reference Designator: Not Specified
+	External Connector Type: IEEE 1394
+	Port Type: Firewire (IEEE P1394)
+
+Handle 0x080C, DMI type 8, 9 bytes
+Port Connector Information
+	Internal Reference Designator: Modem
+	Internal Connector Type: None
+	External Reference Designator: Not Specified
+	External Connector Type: RJ-11
+	Port Type: Modem Port
+
+Handle 0x080D, DMI type 8, 9 bytes
+Port Connector Information
+	Internal Reference Designator: Ethernet
+	Internal Connector Type: None
+	External Reference Designator: Not Specified
+	External Connector Type: RJ-45
+	Port Type: Network Port
+
+Handle 0x0900, DMI type 9, 13 bytes
+System Slot Information
+	Designation: PCMCIA 0
+	Type: 32-bit PC Card (PCMCIA)
+	Current Usage: Available
+	Length: Other
+	ID: Adapter 0, Socket 0
+	Characteristics:
+		5.0 V is provided
+		3.3 V is provided
+		PC Card-16 is supported
+		Cardbus is supported
+		Zoom Video is supported
+		Modem ring resume is supported
+
+Handle 0x0A00, DMI type 10, 6 bytes
+On Board Device Information
+	Type: Video
+	Status: Enabled
+	Description: NVIDIA Quadro FX 1700M        
+
+Handle 0x0A01, DMI type 10, 6 bytes
+On Board Device Information
+	Type: Sound
+	Status: Enabled
+	Description: IDT 92HD71
+
+Handle 0x0B00, DMI type 11, 5 bytes
+OEM Strings
+	String 1: Dell System
+	String 2: 5[0003]
+	String 3: 13[PP04X]
+
+Handle 0x0D00, DMI type 13, 22 bytes
+BIOS Language Information
+	Language Description Format: Long
+	Installable Languages: 1
+		en|US|iso8859-1
+	Currently Installed Language: en|US|iso8859-1
+
+Handle 0x1000, DMI type 16, 15 bytes
+Physical Memory Array
+	Location: System Board Or Motherboard
+	Use: System Memory
+	Error Correction Type: None
+	Maximum Capacity: 8 GB
+	Error Information Handle: Not Provided
+	Number Of Devices: 2
+
+Handle 0x1100, DMI type 17, 27 bytes
+Memory Device
+	Array Handle: 0x1000
+	Error Information Handle: Not Provided
+	Total Width: 64 bits
+	Data Width: 64 bits
+	Size: 2048 MB
+	Form Factor: DIMM
+	Set: None
+	Locator: DIMM_A
+	Bank Locator: Not Specified
+	Type: DDR2
+	Type Detail: Synchronous
+	Speed: 800 MHz
+	Manufacturer: 7F7FFE0000000000
+	Serial Number: 14FA6621
+	Asset Tag: 200840
+	Part Number: EBE21UE8ACUA-8G-E 
+
+Handle 0x1101, DMI type 17, 27 bytes
+Memory Device
+	Array Handle: 0x1000
+	Error Information Handle: Not Provided
+	Total Width: 64 bits
+	Data Width: 64 bits
+	Size: 2048 MB
+	Form Factor: DIMM
+	Set: None
+	Locator: DIMM_B
+	Bank Locator: Not Specified
+	Type: DDR2
+	Type Detail: Synchronous
+	Speed: 800 MHz
+	Manufacturer: 7F7FFE0000000000
+	Serial Number: AEF96621
+	Asset Tag: 200840
+	Part Number: EBE21UE8ACUA-8G-E 
+
+Handle 0x1301, DMI type 19, 15 bytes
+Memory Array Mapped Address
+	Starting Address: 0x00000000000
+	Ending Address: 0x000FFFFFFFF
+	Range Size: 4 GB
+	Physical Array Handle: 0x1000
+	Partition Width: 1
+
+Handle 0x1401, DMI type 20, 19 bytes
+Memory Device Mapped Address
+	Starting Address: 0x00000000000
+	Ending Address: 0x000FFFFFFFF
+	Range Size: 4 GB
+	Physical Device Handle: 0x1100
+	Memory Array Mapped Address Handle: 0x1301
+	Partition Row Position: 1
+	Interleave Position: 1
+	Interleaved Data Depth: 8
+
+Handle 0x1411, DMI type 126, 19 bytes
+Inactive
+
+Handle 0x1402, DMI type 20, 19 bytes
+Memory Device Mapped Address
+	Starting Address: 0x00000000000
+	Ending Address: 0x000FFFFFFFF
+	Range Size: 4 GB
+	Physical Device Handle: 0x1101
+	Memory Array Mapped Address Handle: 0x1301
+	Partition Row Position: 1
+	Interleave Position: 2
+	Interleaved Data Depth: 8
+
+Handle 0x1412, DMI type 126, 19 bytes
+Inactive
+
+Handle 0x1500, DMI type 21, 7 bytes
+Built-in Pointing Device
+	Type: Touch Pad
+	Interface: Bus Mouse
+	Buttons: 2
+
+Handle 0x1600, DMI type 22, 26 bytes
+Portable Battery
+	Location: Sys. Battery Bay
+	Manufacturer: SMP             
+	Name: DELL HJ59008    
+	Design Capacity: 84000 mWh
+	Design Voltage: 11100 mV
+	SBDS Version: 1.0
+	Maximum Error: 3%
+	SBDS Serial Number: 02C7
+	SBDS Manufacture Date: 2010-08-31
+	SBDS Chemistry: LION            
+	OEM-specific Information: 0x00000001
+
+Handle 0x1601, DMI type 126, 26 bytes
+Inactive
+
+Handle 0x1B00, DMI type 27, 12 bytes
+Cooling Device
+	Type: Fan
+	Status: OK
+	OEM-specific Information: 0x0000DD00
+
+Handle 0x1C00, DMI type 28, 20 bytes
+Temperature Probe
+	Description: CPU Internal Temperature
+	Location: Processor
+	Status: OK
+	Maximum Value: 127.0 deg C
+	Minimum Value: 0.0 deg C
+	Resolution: 1.000 deg C
+	Tolerance: 0.5 deg C
+	Accuracy: Unknown
+	OEM-specific Information: 0x0000DC00
+
+Handle 0x2000, DMI type 32, 11 bytes
+System Boot Information
+	Status: No errors detected
+
+Handle 0xB000, DMI type 176, 5 bytes
+OEM-specific Type
+	Header and Data:
+		B0 05 00 B0 3A
+
+Handle 0xB100, DMI type 177, 12 bytes
+OEM-specific Type
+	Header and Data:
+		B1 0C 00 B1 82 00 00 00 00 00 00 00
+
+Handle 0xB200, DMI type 178, 96 bytes
+OEM-specific Type
+	Header and Data:
+		B2 60 00 B2 07 01 0C 00 08 01 0A 00 09 01 0B 00
+		0A 01 12 00 3B 00 20 00 3C 00 1F 00 3D 00 0E 00
+		41 00 12 00 42 00 18 00 00 02 FF FF 4B 00 15 00
+		48 00 14 00 50 00 13 00 10 00 FF 00 11 00 FF 00
+		12 00 FF 00 13 00 FF 00 14 00 FF 00 1E 00 FF 00
+		1F 00 FF 00 20 00 FF 00 21 00 FF 00 22 00 FF 00
+
+Handle 0xD000, DMI type 208, 10 bytes
+OEM-specific Type
+	Header and Data:
+		D0 0A 00 D0 01 04 FE 00 50 02
+
+Handle 0xD100, DMI type 209, 12 bytes
+OEM-specific Type
+	Header and Data:
+		D1 0C 00 D1 00 00 00 03 04 07 80 05
+
+Handle 0xD200, DMI type 210, 12 bytes
+OEM-specific Type
+	Header and Data:
+		D2 0C 00 D2 00 00 06 03 06 80 04 05
+
+Handle 0xD800, DMI type 216, 9 bytes
+OEM-specific Type
+	Header and Data:
+		D8 09 00 D8 01 03 01 F0 03
+	Strings:
+		NVidia Corp.         
+		 
+		62.94.8F.00.04        
+		  
+
+Handle 0xD900, DMI type 217, 8 bytes
+OEM-specific Type
+	Header and Data:
+		D9 08 00 D9 01 02 01 03
+	Strings:
+		US-101
+		Proprietary
+
+Handle 0xDB00, DMI type 219, 9 bytes
+OEM-specific Type
+	Header and Data:
+		DB 09 00 DB 03 01 02 03 FF
+	Strings:
+		System Device Bay
+		Battery, CD-ROM, CD-RW, DVD, DVD+RW, DVD+/-RW, Hard Disk
+		DVD+/-RW  
+
+Handle 0xDB01, DMI type 219, 9 bytes
+OEM-specific Type
+	Header and Data:
+		DB 09 01 DB 03 01 02 03 FF
+	Strings:
+		System eSATA Bay
+		CD-ROM, CD-RW, DVD, DVD+RW, DVD+/-RW, Hard Disk
+		EMPTY     
+
+Handle 0xDB02, DMI type 219, 9 bytes
+OEM-specific Type
+	Header and Data:
+		DB 09 02 DB 03 01 02 03 FF
+	Strings:
+		System eSATA Dock Bay
+		CD-ROM, CD-RW, DVD, DVD+RW, DVD+/-RW, Hard Disk
+		EMPTY     
+
+Handle 0x8100, DMI type 129, 8 bytes
+OEM-specific Type
+	Header and Data:
+		81 08 00 81 01 01 02 01
+	Strings:
+		Intel_ASF
+		Intel_ASF_001
+
+Handle 0x8200, DMI type 130, 20 bytes
+OEM-specific Type
+	Header and Data:
+		82 14 00 82 24 41 4D 54 01 00 00 00 01 A5 0B 02
+		00 00 00 00
+
+Handle 0x8300, DMI type 131, 64 bytes
+OEM-specific Type
+	Header and Data:
+		83 40 00 83 35 00 00 00 00 00 40 2A 0F 00 00 00
+		F8 00 17 29 00 00 00 00 00 00 00 00 00 00 00 00
+		00 00 00 00 03 00 01 02 C8 00 F5 10 00 00 00 0C
+		00 00 00 00 28 00 00 00 76 50 72 6F 00 00 00 00
+
+Handle 0xDC00, DMI type 220, 22 bytes
+OEM-specific Type
+	Header and Data:
+		DC 16 00 DC 01 F0 00 00 02 F0 00 00 00 00 03 F0
+		04 F0 00 00 00 00
+
+Handle 0xDD00, DMI type 221, 19 bytes
+OEM-specific Type
+	Header and Data:
+		DD 13 00 DD 00 00 00 00 00 00 00 00 00 00 00 00
+		00 00 00
+
+Handle 0xD400, DMI type 212, 47 bytes
+OEM-specific Type
+	Header and Data:
+		D4 2F 00 D4 74 00 75 00 00 10 2D 2E 5C 00 78 BF
+		40 5D 00 78 BF 00 2D 01 1D EF 10 2E 01 1D EF 00
+		08 00 1D DF 00 03 00 1D DF 00 FF FF 00 00 00
+
+Handle 0xD401, DMI type 212, 17 bytes
+OEM-specific Type
+	Header and Data:
+		D4 11 01 D4 74 00 75 00 03 40 49 4A FF FF 00 00
+		00
+
+Handle 0xDE00, DMI type 222, 16 bytes
+OEM-specific Type
+	Header and Data:
+		DE 10 00 DE 01 02 FF FF 00 00 00 00 00 00 00 01
+
+Handle 0x7F00, DMI type 127, 4 bytes
+End Of Table
+
diff --git a/resources/solaris/prtconf/SPARC-1 b/resources/solaris/prtconf/SPARC-1
new file mode 100644
index 0000000..8229c44
--- /dev/null
+++ b/resources/solaris/prtconf/SPARC-1
@@ -0,0 +1,17 @@
+System Configuration:  Sun Microsystems  sun4u
+Memory size: 16384 Megabyte
+System Peripherals (PROM Nodes):
+
+Node 0xf0819f00
+    scsi-initiator-id:  00000007
+    node#:  00000000
+    #size-cells:  00000002
+    stick-frequency:  00bebc20
+    clock-frequency:  08f0d180
+    idprom:  01840014.4f4162cb.45255cf4.4162cb16.55555555.55555555.55555555.55555555
+    breakpoint-trap:  0000007f
+    device_type:  'gptwo'
+    banner-name:  'Sun Fire E6900'
+    compatible: 'SUNW,Serengeti'
+    newio-addr:  00000001
+    name:  'SUNW,Sun-Fire'
diff --git a/resources/solaris/psrinfo/sample-1 b/resources/solaris/psrinfo/sample-1
deleted file mode 100644
index a3394c3..0000000
--- a/resources/solaris/psrinfo/sample-1
+++ /dev/null
@@ -1,32 +0,0 @@
-Status of virtual processor 0 as of: 08/10/2011 11:48:03
-  on-line since 08/02/2011 11:06:56.
-  The i386 processor operates at 2133 MHz,
-        and has an i387 compatible floating point processor.
-Status of virtual processor 1 as of: 08/10/2011 11:48:03
-  on-line since 08/02/2011 11:07:02.
-  The i386 processor operates at 2133 MHz,
-        and has an i387 compatible floating point processor.
-Status of virtual processor 2 as of: 08/10/2011 11:48:03
-  on-line since 08/02/2011 11:07:02.
-  The i386 processor operates at 2133 MHz,
-        and has an i387 compatible floating point processor.
-Status of virtual processor 3 as of: 08/10/2011 11:48:03
-  on-line since 08/02/2011 11:07:02.
-  The i386 processor operates at 2133 MHz,
-        and has an i387 compatible floating point processor.
-Status of virtual processor 4 as of: 08/10/2011 11:48:03
-  on-line since 08/02/2011 11:07:02.
-  The i386 processor operates at 2133 MHz,
-        and has an i387 compatible floating point processor.
-Status of virtual processor 5 as of: 08/10/2011 11:48:03
-  on-line since 08/02/2011 11:07:02.
-  The i386 processor operates at 2133 MHz,
-        and has an i387 compatible floating point processor.
-Status of virtual processor 6 as of: 08/10/2011 11:48:03
-  on-line since 08/02/2011 11:07:03.
-  The i386 processor operates at 2133 MHz,
-        and has an i387 compatible floating point processor.
-Status of virtual processor 7 as of: 08/10/2011 11:48:03
-  on-line since 08/02/2011 11:07:03.
-  The i386 processor operates at 2133 MHz,
-        and has an i387 compatible floating point processor.
diff --git a/resources/solaris/psrinfo/sample1 b/resources/solaris/psrinfo/sample1
new file mode 100644
index 0000000..a3394c3
--- /dev/null
+++ b/resources/solaris/psrinfo/sample1
@@ -0,0 +1,32 @@
+Status of virtual processor 0 as of: 08/10/2011 11:48:03
+  on-line since 08/02/2011 11:06:56.
+  The i386 processor operates at 2133 MHz,
+        and has an i387 compatible floating point processor.
+Status of virtual processor 1 as of: 08/10/2011 11:48:03
+  on-line since 08/02/2011 11:07:02.
+  The i386 processor operates at 2133 MHz,
+        and has an i387 compatible floating point processor.
+Status of virtual processor 2 as of: 08/10/2011 11:48:03
+  on-line since 08/02/2011 11:07:02.
+  The i386 processor operates at 2133 MHz,
+        and has an i387 compatible floating point processor.
+Status of virtual processor 3 as of: 08/10/2011 11:48:03
+  on-line since 08/02/2011 11:07:02.
+  The i386 processor operates at 2133 MHz,
+        and has an i387 compatible floating point processor.
+Status of virtual processor 4 as of: 08/10/2011 11:48:03
+  on-line since 08/02/2011 11:07:02.
+  The i386 processor operates at 2133 MHz,
+        and has an i387 compatible floating point processor.
+Status of virtual processor 5 as of: 08/10/2011 11:48:03
+  on-line since 08/02/2011 11:07:02.
+  The i386 processor operates at 2133 MHz,
+        and has an i387 compatible floating point processor.
+Status of virtual processor 6 as of: 08/10/2011 11:48:03
+  on-line since 08/02/2011 11:07:03.
+  The i386 processor operates at 2133 MHz,
+        and has an i387 compatible floating point processor.
+Status of virtual processor 7 as of: 08/10/2011 11:48:03
+  on-line since 08/02/2011 11:07:03.
+  The i386 processor operates at 2133 MHz,
+        and has an i387 compatible floating point processor.
diff --git a/resources/solaris/showrev-SPARC-1 b/resources/solaris/showrev-SPARC-1
deleted file mode 100644
index 7019112..0000000
--- a/resources/solaris/showrev-SPARC-1
+++ /dev/null
@@ -1,27 +0,0 @@
-Hostname: 157501s021plc
-Hostid: 83249bbf
-Release: 5.10
-Kernel architecture: sun4u
-Application architecture: sparc
-Hardware provider: Sun_Microsystem
-Domain: be.cnamts.fr
-Kernel version: SunOS 5.10 Generic_118833-17
-
- $ prtconf -pv    (-b would be great...but doesn't work before S10)
-System Configuration:  Sun Microsystems  sun4u
-Memory size: 16384 Megabyte
-System Peripherals (PROM Nodes):
-
-Node 0xf0819f00
-    scsi-initiator-id:  00000007
-    node#:  00000000
-    #size-cells:  00000002
-    stick-frequency:  00bebc20
-    clock-frequency:  08f0d180
-    idprom:  01840014.4f4162cb.45255cf4.4162cb16.55555555.55555555.55555555.55555555
-    breakpoint-trap:  0000007f
-    device_type:  'gptwo'
-    banner-name:  'Sun Fire E6900'
-    compatible: 'SUNW,Serengeti'
-    newio-addr:  00000001
-    name:  'SUNW,Sun-Fire'
diff --git a/resources/solaris/showrev-SPARC-2 b/resources/solaris/showrev-SPARC-2
deleted file mode 100644
index 2d3d320..0000000
--- a/resources/solaris/showrev-SPARC-2
+++ /dev/null
@@ -1,8 +0,0 @@
-Hostname: mysunserver
-Hostid: mabox
-Release: 5.10
-Kernel architecture: sun4v
-Application architecture: sparc
-Hardware provider: Sun_Microsystems
-Domain:
-Kernel version: SunOS 5.10 Generic_125100-06
diff --git a/resources/solaris/showrev-x86-1 b/resources/solaris/showrev-x86-1
deleted file mode 100644
index aabf729..0000000
--- a/resources/solaris/showrev-x86-1
+++ /dev/null
@@ -1,22 +0,0 @@
-Hostname: stlaurent
-Hostid: 403100b
-Release: 5.10
-Kernel architecture: i86pc
-Application architecture: i386
-Hardware provider:
-Domain:
-Kernel version: SunOS 5.10 Generic_127112-07
-
- $ smbios -t SMB_TYPE_SYSTEM
-ID    SIZE TYPE
-1     76   SMB_TYPE_SYSTEM (system information)
-
-  Manufacturer: Sun Microsystems, Inc.
-  Product: Sun Fire V40z
-  Version: 00
-  Serial Number: R00T34E0009
-
-  UUID: be1630df-d130-41a4-be32-fd28bb4bd1ac
-  Wake-Up Event: 0x6 (power switch)
-  SKU Number: 
-  Family:
diff --git a/resources/solaris/showrev-x86-2 b/resources/solaris/showrev-x86-2
deleted file mode 100644
index 4b8f705..0000000
--- a/resources/solaris/showrev-x86-2
+++ /dev/null
@@ -1,8 +0,0 @@
-Hostname: mamachine
-Hostid: 7c31a88
-Release: 5.10
-Kernel architecture: i86pc
-Application architecture: i386
-Hardware provider:
-Domain:
-Kernel version: SunOS 5.10 Generic_144489-03
diff --git a/resources/solaris/showrev/SPARC-1 b/resources/solaris/showrev/SPARC-1
new file mode 100644
index 0000000..2e37a0a
--- /dev/null
+++ b/resources/solaris/showrev/SPARC-1
@@ -0,0 +1,8 @@
+Hostname: 157501s021plc
+Hostid: 83249bbf
+Release: 5.10
+Kernel architecture: sun4u
+Application architecture: sparc
+Hardware provider: Sun_Microsystem
+Domain: be.cnamts.fr
+Kernel version: SunOS 5.10 Generic_118833-17
diff --git a/resources/solaris/showrev/SPARC-2 b/resources/solaris/showrev/SPARC-2
new file mode 100644
index 0000000..2d3d320
--- /dev/null
+++ b/resources/solaris/showrev/SPARC-2
@@ -0,0 +1,8 @@
+Hostname: mysunserver
+Hostid: mabox
+Release: 5.10
+Kernel architecture: sun4v
+Application architecture: sparc
+Hardware provider: Sun_Microsystems
+Domain:
+Kernel version: SunOS 5.10 Generic_125100-06
diff --git a/resources/solaris/showrev/x86-1 b/resources/solaris/showrev/x86-1
new file mode 100644
index 0000000..0365490
--- /dev/null
+++ b/resources/solaris/showrev/x86-1
@@ -0,0 +1,8 @@
+Hostname: stlaurent
+Hostid: 403100b
+Release: 5.10
+Kernel architecture: i86pc
+Application architecture: i386
+Hardware provider:
+Domain:
+Kernel version: SunOS 5.10 Generic_127112-07
diff --git a/resources/solaris/showrev/x86-2 b/resources/solaris/showrev/x86-2
new file mode 100644
index 0000000..4b8f705
--- /dev/null
+++ b/resources/solaris/showrev/x86-2
@@ -0,0 +1,8 @@
+Hostname: mamachine
+Hostid: 7c31a88
+Release: 5.10
+Kernel architecture: i86pc
+Application architecture: i386
+Hardware provider:
+Domain:
+Kernel version: SunOS 5.10 Generic_144489-03
diff --git a/resources/solaris/showrev/x86-3 b/resources/solaris/showrev/x86-3
new file mode 100644
index 0000000..5285802
--- /dev/null
+++ b/resources/solaris/showrev/x86-3
@@ -0,0 +1,8 @@
+Hostname: plop
+Hostid: 7c31a36
+Release: 5.10
+Kernel architecture: i86pc
+Application architecture: i386
+Hardware provider:
+Domain:
+Kernel version: SunOS 5.10 Generic_147441-09
diff --git a/resources/solaris/smbios/x86-1 b/resources/solaris/smbios/x86-1
new file mode 100644
index 0000000..a9fbe69
--- /dev/null
+++ b/resources/solaris/smbios/x86-1
@@ -0,0 +1,12 @@
+ID    SIZE TYPE
+1     76   SMB_TYPE_SYSTEM (system information)
+
+  Manufacturer: Sun Microsystems, Inc.
+  Product: Sun Fire V40z
+  Version: 00
+  Serial Number: R00T34E0009
+
+  UUID: be1630df-d130-41a4-be32-fd28bb4bd1ac
+  Wake-Up Event: 0x6 (power switch)
+  SKU Number: 
+  Family:
diff --git a/resources/solaris/smbios/x86-3 b/resources/solaris/smbios/x86-3
new file mode 100644
index 0000000..834f8c0
--- /dev/null
+++ b/resources/solaris/smbios/x86-3
@@ -0,0 +1,90 @@
+ID    SIZE TYPE
+1     18   SMB_TYPE_IPMIDEV (IPMI device information)
+
+  Type: 1 (KCS: Keyboard Controller Style)
+  BMC IPMI Version: 2.0
+  i2c Bus Slave Address: 0x20
+  NV Storage Device Bus ID: 0xffffffff
+  BMC Base Address: 0xca2
+  Interrupt Number: 0
+  Register Spacing: 1
+  Flags: 0x9
+    SMB_IPMI_F_IOADDR (base address is in i/o space)
+    SMB_IPMI_F_INTREDGE (intr is edge triggered (else lvl))
+
+ID    SIZE TYPE
+2     53   SMB_TYPE_SYSTEM (system information)
+
+  Manufacturer: Intel
+  Product: MP Server
+
+  UUID: 4b713db6-6d40-11dd-b32c-000123456789
+  Wake-Up Event: 0x6 (power switch)
+  SKU Number: 6I012345TF
+  Family: 
+
+ID    SIZE TYPE
+3     56   SMB_TYPE_BASEBOARD (base board)
+
+  Manufacturer: Intel
+  Product: S7000FC4UR
+  Serial Number: QSFX12345678
+  Asset Tag: 6I012345TF
+
+  Chassis: 0
+  Flags: 0x9
+    SMB_BBFL_MOTHERBOARD (board is a motherboard)
+    SMB_BBFL_REPLACABLE (board is field-replacable)
+  Board Type: 0xa (motherboard)
+
+ID    SIZE TYPE
+4     64   SMB_TYPE_CHASSIS (system enclosure or chassis)
+
+  Manufacturer: TRANSTEC
+  Version: E10476-011
+  Serial Number: QSDH1234567
+  Asset Tag: 6I012345TF
+
+  OEM Data: 0x81581cf8
+  Lock Present: N
+  Chassis Type: 0x17 (rack mount chassis)
+  Boot-Up State: 0x3 (safe)
+  Power Supply State: 0x3 (safe)
+  Thermal State: 0x3 (safe)
+  Chassis Height: 1u
+  Power Cords: 1
+  Element Records: 0
+
+ID    SIZE TYPE
+5     87   SMB_TYPE_BIOS (BIOS information)
+
+  Vendor: Intel Corporation
+  Version String: SFC4UR.86B.01.00.0029.071220092126
+  Release Date: 07/12/2009
+  Address Segment: 0xe800
+  ROM Size: 8388608 bytes
+  Image Size: 98304 bytes
+  Characteristics: 0x15c099a80
+    SMB_BIOSFL_PCI (PCI is supported)
+    SMB_BIOSFL_PLUGNPLAY (Plug and Play is supported)
+    SMB_BIOSFL_FLASH (BIOS is Flash Upgradeable)
+    SMB_BIOSFL_SHADOW (BIOS shadowing is allowed)
+    SMB_BIOSFL_CDBOOT (Boot from CD is supported)
+    SMB_BIOSFL_SELBOOT (Selectable Boot supported)
+    SMB_BIOSFL_EDD (EDD Spec is supported)
+    SMB_BIOSFL_I5_PRINT (int 0x5 print screen svcs)
+    SMB_BIOSFL_I9_KBD (int 0x9 8042 keyboard svcs)
+    SMB_BIOSFL_I14_SER (int 0x14 serial svcs)
+    SMB_BIOSFL_I10_CGA (int 0x10 CGA svcs)
+    0x100000000
+  Characteristics Extension Byte 1: 0x33
+    SMB_BIOSXB1_ACPI (ACPI is supported)
+    SMB_BIOSXB1_USBL (USB legacy is supported)
+    SMB_BIOSXB1_LS120 (LS-120 boot is supported)
+    SMB_BIOSXB1_ATZIP (ATAPI ZIP drive boot is supported)
+  Characteristics Extension Byte 2: 0x7
+    SMB_BIOSXB2_BBOOT (BIOS Boot Specification supported)
+    SMB_BIOSXB2_FKNETSVC (F-key Network Svc boot supported)
+    SMB_BIOSXB2_ETCDIST (Enable Targeted Content Distrib.)
+  Version Number: 0.0
+  Embedded Ctlr Firmware Version Number: 0.0
diff --git a/resources/win32/registry/2003-CentralProcessor.reg b/resources/win32/registry/2003-CentralProcessor.reg
new file mode 100644
index 0000000..f96533d
Binary files /dev/null and b/resources/win32/registry/2003-CentralProcessor.reg differ
diff --git a/resources/win32/registry/2003SP2-CentralProcessor.reg b/resources/win32/registry/2003SP2-CentralProcessor.reg
new file mode 100644
index 0000000..48818d3
Binary files /dev/null and b/resources/win32/registry/2003SP2-CentralProcessor.reg differ
diff --git a/resources/win32/registry/7-CentralProcessor.reg b/resources/win32/registry/7-CentralProcessor.reg
new file mode 100644
index 0000000..1d34b8c
Binary files /dev/null and b/resources/win32/registry/7-CentralProcessor.reg differ
diff --git a/resources/win32/registry/xp-CentralProcessor.reg b/resources/win32/registry/xp-CentralProcessor.reg
new file mode 100644
index 0000000..2de1ab6
Binary files /dev/null and b/resources/win32/registry/xp-CentralProcessor.reg differ
diff --git a/resources/win32/wmi/2003-Win32_PhysicalMemory.wmi b/resources/win32/wmi/2003-Win32_PhysicalMemory.wmi
new file mode 100644
index 0000000..0e86608
Binary files /dev/null and b/resources/win32/wmi/2003-Win32_PhysicalMemory.wmi differ
diff --git a/resources/win32/wmi/2003-Win32_Processor.wmi b/resources/win32/wmi/2003-Win32_Processor.wmi
new file mode 100644
index 0000000..56c6d71
Binary files /dev/null and b/resources/win32/wmi/2003-Win32_Processor.wmi differ
diff --git a/resources/win32/wmi/2003SP2-Win32_PhysicalMemory.wmi b/resources/win32/wmi/2003SP2-Win32_PhysicalMemory.wmi
new file mode 100644
index 0000000..87b20cc
Binary files /dev/null and b/resources/win32/wmi/2003SP2-Win32_PhysicalMemory.wmi differ
diff --git a/resources/win32/wmi/2003SP2-Win32_Processor.wmi b/resources/win32/wmi/2003SP2-Win32_Processor.wmi
new file mode 100644
index 0000000..4c32dac
Binary files /dev/null and b/resources/win32/wmi/2003SP2-Win32_Processor.wmi differ
diff --git a/resources/win32/wmi/7-Win32_PhysicalMemory.wmi b/resources/win32/wmi/7-Win32_PhysicalMemory.wmi
new file mode 100644
index 0000000..e5aad73
Binary files /dev/null and b/resources/win32/wmi/7-Win32_PhysicalMemory.wmi differ
diff --git a/resources/win32/wmi/7-Win32_PhysicalMemoryArray.wmi b/resources/win32/wmi/7-Win32_PhysicalMemoryArray.wmi
new file mode 100644
index 0000000..d4a7646
Binary files /dev/null and b/resources/win32/wmi/7-Win32_PhysicalMemoryArray.wmi differ
diff --git a/resources/win32/wmi/7-Win32_Processor.wmi b/resources/win32/wmi/7-Win32_Processor.wmi
new file mode 100644
index 0000000..ba554d1
Binary files /dev/null and b/resources/win32/wmi/7-Win32_Processor.wmi differ
diff --git a/resources/win32/wmi/xp-Win32_PhysicalMemory.wmi b/resources/win32/wmi/xp-Win32_PhysicalMemory.wmi
new file mode 100644
index 0000000..63775de
Binary files /dev/null and b/resources/win32/wmi/xp-Win32_PhysicalMemory.wmi differ
diff --git a/resources/win32/wmi/xp-Win32_Processor.wmi b/resources/win32/wmi/xp-Win32_Processor.wmi
new file mode 100644
index 0000000..68ba953
Binary files /dev/null and b/resources/win32/wmi/xp-Win32_Processor.wmi differ
diff --git a/t/FusionInventory/Test/Utils.pm b/t/FusionInventory/Test/Utils.pm
index 8d1cb0a..9de910c 100644
--- a/t/FusionInventory/Test/Utils.pm
+++ b/t/FusionInventory/Test/Utils.pm
@@ -4,10 +4,13 @@ use strict;
 use warnings;
 use base 'Exporter';
 
+use English qw(-no_match_vars);
 use Socket;
 
 our @EXPORT = qw(
     test_port
+    mockGetWmiObjects
+    mockGetRegistryKey
 );
 
 sub test_port {
@@ -25,3 +28,118 @@ sub test_port {
 
     return 0;
 }
+
+sub mockGetWmiObjects {
+    my ($test) = @_;
+
+    return sub {
+        my (%params) = @_;
+
+        my $file = "resources/win32/wmi/$test-$params{class}.wmi";
+        return loadWMIDump($file, $params{properties});
+    };
+}
+
+sub loadWMIDump {
+    my ($file, $properties) = @_;
+
+    open (my $handle, '<', $file) or die "can't open $file: $ERRNO";
+
+    # this is a windows file
+    binmode $handle, ':encoding(UTF-16LE)';
+    local $INPUT_RECORD_SEPARATOR="\r\n";
+
+    # build a list of desired properties indexes
+    my %properties = map { $_ => 1 } @{$properties};
+
+    my @objects;
+    my $object;
+    while (my $line = <$handle>) {
+        chomp $line;
+
+        if ($line =~ /^ (\w+) = (.+) $/x) {
+            my $key = $1;
+            my $value = $2;
+            next unless $properties{$key};
+            $value =~ s/&/&/g;
+            $object->{$key} = $value;
+            next;
+        }
+
+        if ($line =~ /^$/) {
+            push @objects, $object if $object;
+            undef $object;
+            next;
+        }
+    }
+    close $handle;
+
+    return @objects;
+}
+
+sub mockGetRegistryKey {
+    my ($test) = @_;
+
+    return sub {
+        my (%params) = @_;
+
+        my $last_elt = (split(/\//, $params{path}))[-1];
+        my $file = "resources/win32/registry/$test-$last_elt.reg";
+        return loadRegistryDump($file);
+    };
+}
+
+sub loadRegistryDump {
+    my ($file) = @_;
+
+    my $root_offset;
+    my $root_key = {};
+    my $current_key;
+
+    open (my $handle, '<', $file) or die "can't open $file: $ERRNO";
+
+    # this is a windows file
+    binmode $handle, ':encoding(UTF-16LE)';
+    local $INPUT_RECORD_SEPARATOR="\r\n";
+
+    while (my $line = <$handle>) {
+        chomp $line;
+
+        if ($line =~ /^ \[ ([^]]+) \] $/x) {
+            my $path = $1;
+            my @path = split(/\\/, $path);
+
+            if ($root_offset) {
+                splice @path, 0, $root_offset;
+                $current_key = $root_key;
+                foreach my $element (@path) {
+                    my $key_path = $element . '/';
+
+                    if (!defined $current_key->{$key_path}) {
+                        my $new_key = {};
+                        $current_key->{$key_path} = $new_key;
+                    }
+
+                    $current_key = $current_key->{$key_path};
+                }
+            } else {
+                $root_offset = scalar @path;
+            }
+            next;
+        }
+
+        if ($line =~ /^ " ([^"]+) " = dword:(\d+)/x) {
+            $current_key->{'/' . $1} = "0x$2";
+            next;
+        }
+
+        if ($line =~ /^ " ([^"]+) " = " ([^"]+) "/x) {
+            $current_key->{'/' . $1} = $2;
+            next;
+        }
+
+    }
+    close $handle;
+
+    return $root_key;
+}
diff --git a/t/apps/agent.t b/t/apps/agent.t
index ec53755..a76ebdd 100755
--- a/t/apps/agent.t
+++ b/t/apps/agent.t
@@ -145,7 +145,10 @@ ok(
     'inventory has environment variables'
 );
 
-my $path = $ENV{PATH};
+# PATH through WMI appears with %SystemRoot% templates, preventing direct
+# comparaison with %ENV content
+my $name = $OSNAME eq 'MSWin32' ? 'PATHEXT' : 'PATH';
+my $value = $ENV{$name};
 
 ($out, $err, $rc) = run_agent(
     "$base_options --no-category printer,software"
@@ -173,7 +176,7 @@ ok(
 
 ok(
     (any
-        { $_->{KEY} eq 'PATH' && $_->{VAL} eq $path } 
+        { $_->{KEY} eq $name && $_->{VAL} eq $value } 
         @{$content->{REQUEST}->{CONTENT}->{ENVS}}
     ),
     'inventory has expected environment variable value'
diff --git a/t/inventory/bsd/storages.t b/t/inventory/bsd/storages.t
new file mode 100755
index 0000000..feb6f3e
--- /dev/null
+++ b/t/inventory/bsd/storages.t
@@ -0,0 +1,33 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+use Test::More;
+
+use FusionInventory::Agent::Task::Inventory::Input::BSD::Storages;
+
+my %tests = (
+    'freebsd-1' => [
+        {
+            'DESCRIPTION' => 'da0s1b'
+        },
+        {
+            'DESCRIPTION' => 'da0s1a'
+        },
+        {
+            'DESCRIPTION' => 'da0s1d'
+        },
+        {
+            'DESCRIPTION' => 'acd0'
+        }
+    ]
+);
+
+plan tests => scalar keys %tests;
+
+foreach my $test (keys %tests) {
+    my $file = "resources/bsd/fstab/$test";
+    my @results = FusionInventory::Agent::Task::Inventory::Input::BSD::Storages::_getDevicesFromFstab(file => $file);
+    is_deeply(\@results, $tests{$test}, $test);
+}
diff --git a/t/inventory/generic/dmidecode/memory.t b/t/inventory/generic/dmidecode/memory.t
index 025453f..b2c713b 100755
--- a/t/inventory/generic/dmidecode/memory.t
+++ b/t/inventory/generic/dmidecode/memory.t
@@ -10,1543 +10,1605 @@ use FusionInventory::Agent::Task::Inventory::Input::Generic::Dmidecode::Memory;
 my %tests = (
     'freebsd-6.2' => [
         {
-            NUMSLOTS     => 1,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'DIMM (None)',
-            SPEED        => 'Unknown',
-            TYPE         => 'Unknown',
-            CAPTION      => 'A0',
-            CAPACITY    => '512',
+            NUMSLOTS         => 1,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'DIMM (None)',
+            SPEED            => 'Unknown',
+            TYPE             => 'Unknown',
+            CAPTION          => 'A0',
+            CAPACITY         => '512',
             MEMORYCORRECTION => 'None'
 
         }
     ],
     'freebsd-8.1' => [
         {
-            NUMSLOTS     => 1,
-            SERIALNUMBER => '1A1541FC',
-            DESCRIPTION  => 'SODIMM (None)',
-            TYPE         => '<OUT OF SPEC>',
-            SPEED        => '1067 MHz',
-            CAPACITY     => '2048',
-            CAPTION      => 'Bottom - Slot 1',
+            NUMSLOTS         => 1,
+            SERIALNUMBER     => '1A1541FC',
+            DESCRIPTION      => 'SODIMM (None)',
+            TYPE             => '<OUT OF SPEC>',
+            SPEED            => '1067 MHz',
+            CAPACITY         => '2048',
+            CAPTION          => 'Bottom - Slot 1',
             MEMORYCORRECTION => 'None'
         },
         {
-            NUMSLOTS     => 2,
-            SERIALNUMBER => '1A554239',
-            DESCRIPTION  => 'SODIMM (None)',
-            TYPE         => '<OUT OF SPEC>',
-            SPEED        => '1067 MHz',
-            CAPACITY     => '2048',
-            CAPTION      => 'Bottom - Slot 2',
+            NUMSLOTS         => 2,
+            SERIALNUMBER     => '1A554239',
+            DESCRIPTION      => 'SODIMM (None)',
+            TYPE             => '<OUT OF SPEC>',
+            SPEED            => '1067 MHz',
+            CAPACITY         => '2048',
+            CAPTION          => 'Bottom - Slot 2',
             MEMORYCORRECTION => 'None'
 
         }
     ],
     'linux-1' => [
         {
-            NUMSLOTS     => 1,
-            SERIALNUMBER => 'SerNum00',
-            DESCRIPTION  => 'DIMM (None)',
-            TYPE         => 'DDR2',
-            SPEED        => '1066 MHz',
-            CAPACITY     => '1024',
-            CAPTION      => 'DIMM0',
+            NUMSLOTS         => 1,
+            SERIALNUMBER     => 'SerNum00',
+            DESCRIPTION      => 'DIMM (None)',
+            TYPE             => 'DDR2',
+            SPEED            => '1066 MHz',
+            CAPACITY         => '1024',
+            CAPTION          => 'DIMM0',
             MEMORYCORRECTION => 'None'
         },
         {
-            NUMSLOTS     => 2,
-            SERIALNUMBER => 'SerNum01',
-            DESCRIPTION  => 'DIMM (None)',
-            TYPE         => 'DDR2',
-            SPEED        => '1066 MHz',
-            CAPACITY     => '1024',
-            CAPTION      => 'DIMM1',
+            NUMSLOTS         => 2,
+            SERIALNUMBER     => 'SerNum01',
+            DESCRIPTION      => 'DIMM (None)',
+            TYPE             => 'DDR2',
+            SPEED            => '1066 MHz',
+            CAPACITY         => '1024',
+            CAPTION          => 'DIMM1',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 3,
-            SERIALNUMBER => 'SerNum02',
-            DESCRIPTION  => 'DIMM (None)',
-            TYPE         => 'DDR2',
-            SPEED        => '1066 MHz',
-            CAPACITY     => '1024',
-            CAPTION      => 'DIMM2',
+            NUMSLOTS         => 3,
+            SERIALNUMBER     => 'SerNum02',
+            DESCRIPTION      => 'DIMM (None)',
+            TYPE             => 'DDR2',
+            SPEED            => '1066 MHz',
+            CAPACITY         => '1024',
+            CAPTION          => 'DIMM2',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 4,
-            SERIALNUMBER => 'SerNum03',
-            DESCRIPTION  => 'DIMM (None)',
-            TYPE         => 'DDR2',
-            SPEED        => '1066 MHz',
-            CAPACITY     => '1024',
-            CAPTION      => 'DIMM3',
+            NUMSLOTS         => 4,
+            SERIALNUMBER     => 'SerNum03',
+            DESCRIPTION      => 'DIMM (None)',
+            TYPE             => 'DDR2',
+            SPEED            => '1066 MHz',
+            CAPACITY         => '1024',
+            CAPTION          => 'DIMM3',
             MEMORYCORRECTION => 'None'
 
         }
     ],
     'linux-2.6' => [
         {
-            NUMSLOTS     => 1,
-            SERIALNUMBER => '02132010',
-            DESCRIPTION  => 'DIMM (None)',
-            SPEED        => '533 MHz (1.9 ns)',
-            TYPE         => 'DDR',
-            CAPTION      => 'DIMM_A',
-            CAPACITY    => '1024',
+            NUMSLOTS         => 1,
+            SERIALNUMBER     => '02132010',
+            DESCRIPTION      => 'DIMM (None)',
+            SPEED            => '533 MHz (1.9 ns)',
+            TYPE             => 'DDR',
+            CAPTION          => 'DIMM_A',
+            CAPACITY         => '1024',
             MEMORYCORRECTION => 'None'
         },
         {
-            NUMSLOTS     => 2,
-            SERIALNUMBER => '02132216',
-            DESCRIPTION  => 'DIMM (None)',
-            SPEED        => '533 MHz (1.9 ns)',
-            TYPE         => 'DDR',
-            CAPTION      => 'DIMM_B',
-            CAPACITY    => '1024',
+            NUMSLOTS         => 2,
+            SERIALNUMBER     => '02132216',
+            DESCRIPTION      => 'DIMM (None)',
+            SPEED            => '533 MHz (1.9 ns)',
+            TYPE             => 'DDR',
+            CAPTION          => 'DIMM_B',
+            CAPACITY         => '1024',
             MEMORYCORRECTION => 'None'
         }
     ],
     'openbsd-3.7' => [
         {
-            NUMSLOTS     => 1,
-            TYPE         => 'Unknown'
+            NUMSLOTS         => 1,
+            TYPE             => 'Unknown'
         },
         {
-            NUMSLOTS     => 2,
-            TYPE         => 'DIMM SDRAM',
-            CAPACITY     => '64'
+            NUMSLOTS         => 2,
+            TYPE             => 'DIMM SDRAM',
+            CAPACITY         => '64'
         },
         {
-            NUMSLOTS     => 3,
-            TYPE         => 'Unknown'
+            NUMSLOTS         => 3,
+            TYPE             => 'Unknown'
         },
         {
-            NUMSLOTS     => 4,
-            TYPE         => 'DIMM SDRAM',
-            CAPACITY     => '64'
+            NUMSLOTS         => 4,
+            TYPE             => 'DIMM SDRAM',
+            CAPACITY         => '64'
         },
         {
-            NUMSLOTS     => 5,
-            TYPE         => 'DIMM SDRAM',
-            CAPACITY     => '64'
+            NUMSLOTS         => 5,
+            TYPE             => 'DIMM SDRAM',
+            CAPACITY         => '64'
         },
         {
-            NUMSLOTS     => 6,
-            TYPE         => 'Unknown'
+            NUMSLOTS         => 6,
+            TYPE             => 'Unknown'
         },
         {
-            NUMSLOTS     => 7,
-            TYPE         => 'Unknown'
+            NUMSLOTS         => 7,
+            TYPE             => 'Unknown'
         }
     ],
     'openbsd-3.8' => [
         {
-            NUMSLOTS     => 1,
-            SERIALNUMBER => '50075483',
-            DESCRIPTION  => 'DIMM (Multi-bit ECC)',
-            SPEED        => '400 MHz (2.5 ns)',
-            TYPE         => '<OUT OF SPEC>',
-            CAPTION      => 'DIMM1_A',
-            CAPACITY    => '512',
+            NUMSLOTS         => 1,
+            SERIALNUMBER     => '50075483',
+            DESCRIPTION      => 'DIMM (Multi-bit ECC)',
+            SPEED            => '400 MHz (2.5 ns)',
+            TYPE             => '<OUT OF SPEC>',
+            CAPTION          => 'DIMM1_A',
+            CAPACITY         => '512',
             MEMORYCORRECTION => 'Multi-bit ECC'
         },
         {
-            NUMSLOTS     => 2,
-            SERIALNUMBER => '500355A1',
-            DESCRIPTION  => 'DIMM (Multi-bit ECC)',
-            SPEED        => '400 MHz (2.5 ns)',
-            TYPE         => '<OUT OF SPEC>',
-            CAPTION      => 'DIMM1_B',
-            CAPACITY    => '512',
+            NUMSLOTS         => 2,
+            SERIALNUMBER     => '500355A1',
+            DESCRIPTION      => 'DIMM (Multi-bit ECC)',
+            SPEED            => '400 MHz (2.5 ns)',
+            TYPE             => '<OUT OF SPEC>',
+            CAPTION          => 'DIMM1_B',
+            CAPACITY         => '512',
             MEMORYCORRECTION => 'Multi-bit ECC'
         },
         {
-            NUMSLOTS     => 3,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (Multi-bit ECC)',
-            SPEED        => '400 MHz (2.5 ns)',
-            TYPE         => '<OUT OF SPEC>',
-            CAPTION      => 'DIMM2_A',
+            NUMSLOTS         => 3,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (Multi-bit ECC)',
+            SPEED            => '400 MHz (2.5 ns)',
+            TYPE             => '<OUT OF SPEC>',
+            CAPTION          => 'DIMM2_A',
             MEMORYCORRECTION => 'Multi-bit ECC'
         },
         {
-            NUMSLOTS     => 4,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (Multi-bit ECC)',
-            SPEED        => '400 MHz (2.5 ns)',
-            TYPE         => '<OUT OF SPEC>',
-            CAPTION      => 'DIMM2_B',
+            NUMSLOTS         => 4,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (Multi-bit ECC)',
+            SPEED            => '400 MHz (2.5 ns)',
+            TYPE             => '<OUT OF SPEC>',
+            CAPTION          => 'DIMM2_B',
             MEMORYCORRECTION => 'Multi-bit ECC'
 
         },
         {
-            NUMSLOTS     => 5,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (Multi-bit ECC)',
-            SPEED        => '400 MHz (2.5 ns)',
-            TYPE         => '<OUT OF SPEC>',
-            CAPTION      => 'DIMM3_A',
+            NUMSLOTS         => 5,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (Multi-bit ECC)',
+            SPEED            => '400 MHz (2.5 ns)',
+            TYPE             => '<OUT OF SPEC>',
+            CAPTION          => 'DIMM3_A',
             MEMORYCORRECTION => 'Multi-bit ECC'
         },
         {
-            NUMSLOTS     => 6,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (Multi-bit ECC)',
-            SPEED        => '400 MHz (2.5 ns)',
-            TYPE         => '<OUT OF SPEC>',
-            CAPTION      => 'DIMM3_B',
+            NUMSLOTS         => 6,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (Multi-bit ECC)',
+            SPEED            => '400 MHz (2.5 ns)',
+            TYPE             => '<OUT OF SPEC>',
+            CAPTION          => 'DIMM3_B',
             MEMORYCORRECTION => 'Multi-bit ECC'
         }
     ],
     'openbsd-4.5' => [
         {
-            NUMSLOTS     => 1,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (Multi-bit ECC)',
-            TYPE         => 'DDR',
-            SPEED        => '266 MHz',
-            CAPACITY     => '512',
-            CAPTION      => 'DIMM A',
+            NUMSLOTS         => 1,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (Multi-bit ECC)',
+            TYPE             => 'DDR',
+            SPEED            => '266 MHz',
+            CAPACITY         => '512',
+            CAPTION          => 'DIMM A',
             MEMORYCORRECTION => 'Multi-bit ECC'
 
         },
         {
-            NUMSLOTS     => 2,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (Multi-bit ECC)',
-            TYPE         => 'DDR',
-            SPEED        => '266 MHz',
-            CAPTION      => 'DIMM B',
+            NUMSLOTS         => 2,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (Multi-bit ECC)',
+            TYPE             => 'DDR',
+            SPEED            => '266 MHz',
+            CAPTION          => 'DIMM B',
             MEMORYCORRECTION => 'Multi-bit ECC'
 
         },
         {
-            NUMSLOTS     => 3,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (Multi-bit ECC)',
-            TYPE         => 'DDR',
-            SPEED        => '266 MHz',
-            CAPTION      => 'DIMM C',
+            NUMSLOTS         => 3,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (Multi-bit ECC)',
+            TYPE             => 'DDR',
+            SPEED            => '266 MHz',
+            CAPTION          => 'DIMM C',
             MEMORYCORRECTION => 'Multi-bit ECC'
 
         },
         {
-            NUMSLOTS     => 4,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (Multi-bit ECC)',
-            TYPE         => 'DDR',
-            SPEED        => '266 MHz',
-            CAPTION      => 'DIMM D',
+            NUMSLOTS         => 4,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (Multi-bit ECC)',
+            TYPE             => 'DDR',
+            SPEED            => '266 MHz',
+            CAPTION          => 'DIMM D',
             MEMORYCORRECTION => 'Multi-bit ECC'
 
         }
     ],
     'rhel-2.1' => [
         {
-            NUMSLOTS     => 1,
-            TYPE         => 'ECC DIMM SDRAM',
-            CAPACITY     => '256'
+            NUMSLOTS         => 1,
+            TYPE             => 'ECC DIMM SDRAM',
+            CAPACITY         => '256'
         },
         {
-            NUMSLOTS     => 2,
-            TYPE         => 'UNKNOWN'
+            NUMSLOTS         => 2,
+            TYPE             => 'UNKNOWN'
         }
     ],
     'rhel-3.4' => [
         {
-            NUMSLOTS     => 1,
-            SERIALNUMBER => '460360BB',
-            DESCRIPTION  => 'DIMM (Single-bit ECC)',
-            SPEED        => '400 MHz (2.5 ns)',
-            TYPE         => 'DDR',
-            CAPTION      => 'DIMM 1',
-            CAPACITY    => '512',
+            NUMSLOTS         => 1,
+            SERIALNUMBER     => '460360BB',
+            DESCRIPTION      => 'DIMM (Single-bit ECC)',
+            SPEED            => '400 MHz (2.5 ns)',
+            TYPE             => 'DDR',
+            CAPTION          => 'DIMM 1',
+            CAPACITY         => '512',
             MEMORYCORRECTION => 'Single-bit ECC'
         },
         {
-            NUMSLOTS     => 2,
-            SERIALNUMBER => '460360E8',
-            DESCRIPTION  => 'DIMM (Single-bit ECC)',
-            SPEED        => '400 MHz (2.5 ns)',
-            TYPE         => 'DDR',
-            CAPTION      => 'DIMM 2',
-            CAPACITY    => '512',
+            NUMSLOTS         => 2,
+            SERIALNUMBER     => '460360E8',
+            DESCRIPTION      => 'DIMM (Single-bit ECC)',
+            SPEED            => '400 MHz (2.5 ns)',
+            TYPE             => 'DDR',
+            CAPTION          => 'DIMM 2',
+            CAPACITY         => '512',
             MEMORYCORRECTION => 'Single-bit ECC'
         }
     ],
     'rhel-4.3' => [
         {
-            NUMSLOTS     => 1,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (Multi-bit ECC)',
-            SPEED        => undef,
-            TYPE         => 'DDR',
-            CAPTION      => 'DIMM1',
-            CAPACITY    => '512',
+            NUMSLOTS         => 1,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (Multi-bit ECC)',
+            SPEED            => undef,
+            TYPE             => 'DDR',
+            CAPTION          => 'DIMM1',
+            CAPACITY         => '512',
             MEMORYCORRECTION => 'Multi-bit ECC'
         },
         {
-            NUMSLOTS     => 2,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (Multi-bit ECC)',
-            SPEED        => undef,
-            TYPE         => 'DDR',
-            CAPTION      => 'DIMM2',
-            CAPACITY    => '512',
+            NUMSLOTS         => 2,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (Multi-bit ECC)',
+            SPEED            => undef,
+            TYPE             => 'DDR',
+            CAPTION          => 'DIMM2',
+            CAPACITY         => '512',
             MEMORYCORRECTION => 'Multi-bit ECC'
         },
         {
-            NUMSLOTS     => 3,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (Multi-bit ECC)',
-            SPEED        => undef,
-            TYPE         => 'DDR',
-            CAPTION      => 'DIMM3',
-            CAPACITY    => '512',
+            NUMSLOTS         => 3,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (Multi-bit ECC)',
+            SPEED            => undef,
+            TYPE             => 'DDR',
+            CAPTION          => 'DIMM3',
+            CAPACITY         => '512',
             MEMORYCORRECTION => 'Multi-bit ECC'
         },
         {
-            NUMSLOTS     => 4,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (Multi-bit ECC)',
-            SPEED        => undef,
-            TYPE         => 'DDR',
-            CAPTION      => 'DIMM4',
-            CAPACITY    => '512',
+            NUMSLOTS         => 4,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (Multi-bit ECC)',
+            SPEED            => undef,
+            TYPE             => 'DDR',
+            CAPTION          => 'DIMM4',
+            CAPACITY         => '512',
             MEMORYCORRECTION => 'Multi-bit ECC'
         }
     ],
     'rhel-4.6' => [
         {
-            NUMSLOTS     => 1,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => '<OUT OF SPEC> (Single-bit ECC)',
-            SPEED        => '667 MHz (1.5 ns)',
-            TYPE         => '<OUT OF SPEC>',
-            CAPTION      => 'DIMM 1A',
-            CAPACITY    => '512',
+            NUMSLOTS         => 1,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => '<OUT OF SPEC> (Single-bit ECC)',
+            SPEED            => '667 MHz (1.5 ns)',
+            TYPE             => '<OUT OF SPEC>',
+            CAPTION          => 'DIMM 1A',
+            CAPACITY         => '512',
             MEMORYCORRECTION => 'Single-bit ECC'
 
         },
         {
-            NUMSLOTS     => 2,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => '<OUT OF SPEC> (Single-bit ECC)',
-            SPEED        => '667 MHz (1.5 ns)',
-            TYPE         => '<OUT OF SPEC>',
-            CAPTION      => 'DIMM 2B',
-            CAPACITY    => '1024',
+            NUMSLOTS         => 2,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => '<OUT OF SPEC> (Single-bit ECC)',
+            SPEED            => '667 MHz (1.5 ns)',
+            TYPE             => '<OUT OF SPEC>',
+            CAPTION          => 'DIMM 2B',
+            CAPACITY         => '1024',
             MEMORYCORRECTION => 'Single-bit ECC'
         },
         {
-            NUMSLOTS     => 3,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => '<OUT OF SPEC> (Single-bit ECC)',
-            SPEED        => '667 MHz (1.5 ns)',
-            TYPE         => '<OUT OF SPEC>',
-            CAPTION      => 'DIMM 3C',
-            CAPACITY    => '1024',
+            NUMSLOTS         => 3,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => '<OUT OF SPEC> (Single-bit ECC)',
+            SPEED            => '667 MHz (1.5 ns)',
+            TYPE             => '<OUT OF SPEC>',
+            CAPTION          => 'DIMM 3C',
+            CAPACITY         => '1024',
             MEMORYCORRECTION => 'Single-bit ECC'
         },
         {
-            NUMSLOTS     => 4,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => '<OUT OF SPEC> (Single-bit ECC)',
-            SPEED        => 'Unknown',
-            TYPE         => '<OUT OF SPEC>',
-            CAPTION      => 'DIMM 4D',
+            NUMSLOTS         => 4,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => '<OUT OF SPEC> (Single-bit ECC)',
+            SPEED            => 'Unknown',
+            TYPE             => '<OUT OF SPEC>',
+            CAPTION          => 'DIMM 4D',
             MEMORYCORRECTION => 'Single-bit ECC'
         },
         {
-            NUMSLOTS     => 5,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => '<OUT OF SPEC> (Single-bit ECC)',
-            SPEED        => '667 MHz (1.5 ns)',
-            TYPE         => '<OUT OF SPEC>',
-            CAPTION      => 'DIMM 5A',
-            CAPACITY    => '512',
+            NUMSLOTS         => 5,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => '<OUT OF SPEC> (Single-bit ECC)',
+            SPEED            => '667 MHz (1.5 ns)',
+            TYPE             => '<OUT OF SPEC>',
+            CAPTION          => 'DIMM 5A',
+            CAPACITY         => '512',
             MEMORYCORRECTION => 'Single-bit ECC'
         },
         {
-            NUMSLOTS     => 6,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => '<OUT OF SPEC> (Single-bit ECC)',
-            SPEED        => '667 MHz (1.5 ns)',
-            TYPE         => '<OUT OF SPEC>',
-            CAPTION      => 'DIMM 6B',
-            CAPACITY    => '1024',
+            NUMSLOTS         => 6,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => '<OUT OF SPEC> (Single-bit ECC)',
+            SPEED            => '667 MHz (1.5 ns)',
+            TYPE             => '<OUT OF SPEC>',
+            CAPTION          => 'DIMM 6B',
+            CAPACITY         => '1024',
             MEMORYCORRECTION => 'Single-bit ECC'
         },
         {
-            NUMSLOTS     => 7,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => '<OUT OF SPEC> (Single-bit ECC)',
-            SPEED        => '667 MHz (1.5 ns)',
-            TYPE         => '<OUT OF SPEC>',
-            CAPTION      => 'DIMM 7C',
-            CAPACITY    => '1024',
+            NUMSLOTS         => 7,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => '<OUT OF SPEC> (Single-bit ECC)',
+            SPEED            => '667 MHz (1.5 ns)',
+            TYPE             => '<OUT OF SPEC>',
+            CAPTION          => 'DIMM 7C',
+            CAPACITY         => '1024',
             MEMORYCORRECTION => 'Single-bit ECC'
         },
         {
-            NUMSLOTS     => 8,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => '<OUT OF SPEC> (Single-bit ECC)',
-            SPEED        => 'Unknown',
-            TYPE         => '<OUT OF SPEC>',
-            CAPTION      => 'DIMM 8D',
+            NUMSLOTS         => 8,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => '<OUT OF SPEC> (Single-bit ECC)',
+            SPEED            => 'Unknown',
+            TYPE             => '<OUT OF SPEC>',
+            CAPTION          => 'DIMM 8D',
             MEMORYCORRECTION => 'Single-bit ECC'
         }
     ],
     'hp-dl180' => [
         {
-            NUMSLOTS     => 1,
-            SERIALNUMBER => '94D657D7',
-            DESCRIPTION  => 'DIMM (Single-bit ECC)',
-            TYPE         => '<OUT OF SPEC>',
-            SPEED        => '1333 MHz (0.8 ns)',
-            CAPACITY     => '2048',
-            CAPTION      => 'PROC 1 DIMM 2A',
+            NUMSLOTS         => 1,
+            SERIALNUMBER     => '94D657D7',
+            DESCRIPTION      => 'DIMM (Single-bit ECC)',
+            TYPE             => '<OUT OF SPEC>',
+            SPEED            => '1333 MHz (0.8 ns)',
+            CAPACITY         => '2048',
+            CAPTION          => 'PROC 1 DIMM 2A',
             MEMORYCORRECTION => 'Single-bit ECC'
 
         },
         {
-            NUMSLOTS     => 2,
-            SERIALNUMBER => 'SerNum01',
-            DESCRIPTION  => 'DIMM (Single-bit ECC)',
-            TYPE         => '<OUT OF SPEC>',
-            SPEED        => 'Unknown',
-            CAPTION      => 'PROC 1 DIMM 1D',
+            NUMSLOTS         => 2,
+            SERIALNUMBER     => 'SerNum01',
+            DESCRIPTION      => 'DIMM (Single-bit ECC)',
+            TYPE             => '<OUT OF SPEC>',
+            SPEED            => 'Unknown',
+            CAPTION          => 'PROC 1 DIMM 1D',
             MEMORYCORRECTION => 'Single-bit ECC'
         },
         {
-            NUMSLOTS     => 3,
-            SERIALNUMBER => '93D657D7',
-            DESCRIPTION  => 'DIMM (Single-bit ECC)',
-            TYPE         => '<OUT OF SPEC>',
-            SPEED        => '1333 MHz (0.8 ns)',
-            CAPACITY     => '2048',
-            CAPTION      => 'PROC 1 DIMM 4B',
+            NUMSLOTS         => 3,
+            SERIALNUMBER     => '93D657D7',
+            DESCRIPTION      => 'DIMM (Single-bit ECC)',
+            TYPE             => '<OUT OF SPEC>',
+            SPEED            => '1333 MHz (0.8 ns)',
+            CAPACITY         => '2048',
+            CAPTION          => 'PROC 1 DIMM 4B',
             MEMORYCORRECTION => 'Single-bit ECC'
         },
         {
-            NUMSLOTS     => 4,
-            SERIALNUMBER => 'SerNum03',
-            DESCRIPTION  => 'DIMM (Single-bit ECC)',
-            TYPE         => '<OUT OF SPEC>',
-            SPEED        => 'Unknown',
-            CAPTION      => 'PROC 1 DIMM 3E',
+            NUMSLOTS         => 4,
+            SERIALNUMBER     => 'SerNum03',
+            DESCRIPTION      => 'DIMM (Single-bit ECC)',
+            TYPE             => '<OUT OF SPEC>',
+            SPEED            => 'Unknown',
+            CAPTION          => 'PROC 1 DIMM 3E',
             MEMORYCORRECTION => 'Single-bit ECC'
         },
         {
-            NUMSLOTS     => 5,
-            SERIALNUMBER => 'SerNum04',
-            DESCRIPTION  => 'DIMM (Single-bit ECC)',
-            TYPE         => '<OUT OF SPEC>',
-            SPEED        => 'Unknown',
-            CAPTION      => 'PROC 1 DIMM 6C',
+            NUMSLOTS         => 5,
+            SERIALNUMBER     => 'SerNum04',
+            DESCRIPTION      => 'DIMM (Single-bit ECC)',
+            TYPE             => '<OUT OF SPEC>',
+            SPEED            => 'Unknown',
+            CAPTION          => 'PROC 1 DIMM 6C',
             MEMORYCORRECTION => 'Single-bit ECC'
         },
         {
-            NUMSLOTS     => 6,
-            SERIALNUMBER => 'SerNum05',
-            DESCRIPTION  => 'DIMM (Single-bit ECC)',
-            TYPE         => '<OUT OF SPEC>',
-            SPEED        => 'Unknown',
-            CAPTION      => 'PROC 1 DIMM 5F',
+            NUMSLOTS         => 6,
+            SERIALNUMBER     => 'SerNum05',
+            DESCRIPTION      => 'DIMM (Single-bit ECC)',
+            TYPE             => '<OUT OF SPEC>',
+            SPEED            => 'Unknown',
+            CAPTION          => 'PROC 1 DIMM 5F',
             MEMORYCORRECTION => 'Single-bit ECC'
         },
         {
-            NUMSLOTS     => 7,
-            SERIALNUMBER => 'SerNum06',
-            DESCRIPTION  => 'DIMM (Single-bit ECC)',
-            TYPE         => '<OUT OF SPEC>',
-            SPEED        => 'Unknown',
-            CAPTION      => 'PROC 2 DIMM 2A',
+            NUMSLOTS         => 7,
+            SERIALNUMBER     => 'SerNum06',
+            DESCRIPTION      => 'DIMM (Single-bit ECC)',
+            TYPE             => '<OUT OF SPEC>',
+            SPEED            => 'Unknown',
+            CAPTION          => 'PROC 2 DIMM 2A',
             MEMORYCORRECTION => 'Single-bit ECC'
         },
         {
-            NUMSLOTS     => 8,
-            SERIALNUMBER => 'SerNum07',
-            DESCRIPTION  => 'DIMM (Single-bit ECC)',
-            TYPE         => '<OUT OF SPEC>',
-            SPEED        => 'Unknown',
-            CAPTION      => 'PROC 2 DIMM 1D',
+            NUMSLOTS         => 8,
+            SERIALNUMBER     => 'SerNum07',
+            DESCRIPTION      => 'DIMM (Single-bit ECC)',
+            TYPE             => '<OUT OF SPEC>',
+            SPEED            => 'Unknown',
+            CAPTION          => 'PROC 2 DIMM 1D',
             MEMORYCORRECTION => 'Single-bit ECC'
         },
         {
-            NUMSLOTS     => 9,
-            SERIALNUMBER => 'SerNum08',
-            DESCRIPTION  => 'DIMM (Single-bit ECC)',
-            TYPE         => '<OUT OF SPEC>',
-            SPEED        => 'Unknown',
-            CAPTION      => 'PROC 2 DIMM 4B',
+            NUMSLOTS         => 9,
+            SERIALNUMBER     => 'SerNum08',
+            DESCRIPTION      => 'DIMM (Single-bit ECC)',
+            TYPE             => '<OUT OF SPEC>',
+            SPEED            => 'Unknown',
+            CAPTION          => 'PROC 2 DIMM 4B',
             MEMORYCORRECTION => 'Single-bit ECC'
         },
         {
-            NUMSLOTS     => 10,
-            SERIALNUMBER => 'SerNum09',
-            DESCRIPTION  => 'DIMM (Single-bit ECC)',
-            TYPE         => '<OUT OF SPEC>',
-            SPEED        => 'Unknown',
-            CAPTION      => 'PROC 2 DIMM 3E',
+            NUMSLOTS         => 10,
+            SERIALNUMBER     => 'SerNum09',
+            DESCRIPTION      => 'DIMM (Single-bit ECC)',
+            TYPE             => '<OUT OF SPEC>',
+            SPEED            => 'Unknown',
+            CAPTION          => 'PROC 2 DIMM 3E',
             MEMORYCORRECTION => 'Single-bit ECC'
         },
         {
-            NUMSLOTS     => 11,
-            SERIALNUMBER => 'SerNum10',
-            DESCRIPTION  => 'DIMM (Single-bit ECC)',
-            TYPE         => '<OUT OF SPEC>',
-            SPEED        => 'Unknown',
-            CAPTION      => 'PROC 2 DIMM 6C',
+            NUMSLOTS         => 11,
+            SERIALNUMBER     => 'SerNum10',
+            DESCRIPTION      => 'DIMM (Single-bit ECC)',
+            TYPE             => '<OUT OF SPEC>',
+            SPEED            => 'Unknown',
+            CAPTION          => 'PROC 2 DIMM 6C',
             MEMORYCORRECTION => 'Single-bit ECC'
         },
         {
-            NUMSLOTS     => 12,
-            SERIALNUMBER => 'SerNum11',
-            DESCRIPTION  => 'DIMM (Single-bit ECC)',
-            TYPE         => '<OUT OF SPEC>',
-            SPEED        => 'Unknown',
-            CAPTION      => 'PROC 2 DIMM 5F',
+            NUMSLOTS         => 12,
+            SERIALNUMBER     => 'SerNum11',
+            DESCRIPTION      => 'DIMM (Single-bit ECC)',
+            TYPE             => '<OUT OF SPEC>',
+            SPEED            => 'Unknown',
+            CAPTION          => 'PROC 2 DIMM 5F',
             MEMORYCORRECTION => 'Single-bit ECC'
         }
     ],
     'S3000AHLX' => [
         {
-            NUMSLOTS     => 1,
-            SERIALNUMBER => '0x750174F7',
-            DESCRIPTION  => 'DIMM (None)',
-            TYPE         => 'DDR2',
-            SPEED        => '533 MHz (1.9 ns)',
-            CAPACITY     => '1024',
-            CAPTION      => 'J8J1',
+            NUMSLOTS         => 1,
+            SERIALNUMBER     => '0x750174F7',
+            DESCRIPTION      => 'DIMM (None)',
+            TYPE             => 'DDR2',
+            SPEED            => '533 MHz (1.9 ns)',
+            CAPACITY         => '1024',
+            CAPTION          => 'J8J1',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 2,
-            SERIALNUMBER => '0x9DCCE4ED',
-            DESCRIPTION  => 'DIMM (None)',
-            TYPE         => 'DDR2',
-            SPEED        => '533 MHz (1.9 ns)',
-            CAPACITY     => '2048',
-            CAPTION      => 'J8J2',
+            NUMSLOTS         => 2,
+            SERIALNUMBER     => '0x9DCCE4ED',
+            DESCRIPTION      => 'DIMM (None)',
+            TYPE             => 'DDR2',
+            SPEED            => '533 MHz (1.9 ns)',
+            CAPACITY         => '2048',
+            CAPTION          => 'J8J2',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 3,
-            SERIALNUMBER => '0x750174FF',
-            DESCRIPTION  => 'DIMM (None)',
-            TYPE         => 'DDR2',
-            SPEED        => '533 MHz (1.9 ns)',
-            CAPACITY     => '1024',
-            CAPTION      => 'J9J1',
+            NUMSLOTS         => 3,
+            SERIALNUMBER     => '0x750174FF',
+            DESCRIPTION      => 'DIMM (None)',
+            TYPE             => 'DDR2',
+            SPEED            => '533 MHz (1.9 ns)',
+            CAPACITY         => '1024',
+            CAPTION          => 'J9J1',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 4,
-            SERIALNUMBER => 'NO DIMM',
-            DESCRIPTION  => 'DIMM (None)',
-            TYPE         => 'DDR2',
-            SPEED        => 'Unknown',
-            CAPTION      => 'J9J2',
+            NUMSLOTS         => 4,
+            SERIALNUMBER     => 'NO DIMM',
+            DESCRIPTION      => 'DIMM (None)',
+            TYPE             => 'DDR2',
+            SPEED            => 'Unknown',
+            CAPTION          => 'J9J2',
             MEMORYCORRECTION => 'None'
 
         }
     ],
     'S5000VSA' => [
         {
-            NUMSLOTS     => 1,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (Multi-bit ECC)',
-            TYPE         => 'DDR2',
-            SPEED        => '667 MHz (1.5 ns)',
-            CAPACITY     => '1024',
-            CAPTION      => 'ONBOARD DIMM_A1',
+            NUMSLOTS         => 1,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (Multi-bit ECC)',
+            TYPE             => 'DDR2',
+            SPEED            => '667 MHz (1.5 ns)',
+            CAPACITY         => '1024',
+            CAPTION          => 'ONBOARD DIMM_A1',
             MEMORYCORRECTION => 'Multi-bit ECC'
         },
         {
-            NUMSLOTS     => 2,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (Multi-bit ECC)',
-            TYPE         => 'DDR2',
-            SPEED        => '667 MHz (1.5 ns)',
-            CAPACITY     => '1024',
-            CAPTION      => 'ONBOARD DIMM_A2',
+            NUMSLOTS         => 2,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (Multi-bit ECC)',
+            TYPE             => 'DDR2',
+            SPEED            => '667 MHz (1.5 ns)',
+            CAPACITY         => '1024',
+            CAPTION          => 'ONBOARD DIMM_A2',
             MEMORYCORRECTION => 'Multi-bit ECC'
         },
         {
-            NUMSLOTS     => 3,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (Multi-bit ECC)',
-            TYPE         => 'DDR2',
-            SPEED        => '667 MHz (1.5 ns)',
-            CAPACITY     => '1024',
-            CAPTION      => 'ONBOARD DIMM_A3',
+            NUMSLOTS         => 3,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (Multi-bit ECC)',
+            TYPE             => 'DDR2',
+            SPEED            => '667 MHz (1.5 ns)',
+            CAPACITY         => '1024',
+            CAPTION          => 'ONBOARD DIMM_A3',
             MEMORYCORRECTION => 'Multi-bit ECC'
         },
         {
-            NUMSLOTS     => 4,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (Multi-bit ECC)',
-            TYPE         => 'DDR2',
-            SPEED        => '667 MHz (1.5 ns)',
-            CAPACITY     => '1024',
-            CAPTION      => 'ONBOARD DIMM_A4',
+            NUMSLOTS         => 4,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (Multi-bit ECC)',
+            TYPE             => 'DDR2',
+            SPEED            => '667 MHz (1.5 ns)',
+            CAPACITY         => '1024',
+            CAPTION          => 'ONBOARD DIMM_A4',
             MEMORYCORRECTION => 'Multi-bit ECC'
         },
         {
-            NUMSLOTS     => 5,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (Multi-bit ECC)',
-            TYPE         => 'DDR2',
-            SPEED        => '667 MHz (1.5 ns)',
-            CAPACITY     => '1024',
-            CAPTION      => 'ONBOARD DIMM_B1',
+            NUMSLOTS         => 5,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (Multi-bit ECC)',
+            TYPE             => 'DDR2',
+            SPEED            => '667 MHz (1.5 ns)',
+            CAPACITY         => '1024',
+            CAPTION          => 'ONBOARD DIMM_B1',
             MEMORYCORRECTION => 'Multi-bit ECC'
         },
         {
-            NUMSLOTS     => 6,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (Multi-bit ECC)',
-            TYPE         => 'DDR2',
-            SPEED        => '667 MHz (1.5 ns)',
-            CAPACITY     => '1024',
-            CAPTION      => 'ONBOARD DIMM_B2',
+            NUMSLOTS         => 6,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (Multi-bit ECC)',
+            TYPE             => 'DDR2',
+            SPEED            => '667 MHz (1.5 ns)',
+            CAPACITY         => '1024',
+            CAPTION          => 'ONBOARD DIMM_B2',
             MEMORYCORRECTION => 'Multi-bit ECC'
         },
         {
-            NUMSLOTS     => 7,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (Multi-bit ECC)',
-            TYPE         => 'DDR2',
-            SPEED        => '667 MHz (1.5 ns)',
-            CAPACITY     => '1024',
-            CAPTION      => 'ONBOARD DIMM_B3',
+            NUMSLOTS         => 7,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (Multi-bit ECC)',
+            TYPE             => 'DDR2',
+            SPEED            => '667 MHz (1.5 ns)',
+            CAPACITY         => '1024',
+            CAPTION          => 'ONBOARD DIMM_B3',
             MEMORYCORRECTION => 'Multi-bit ECC'
         },
         {
-            NUMSLOTS     => 8,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (Multi-bit ECC)',
-            TYPE         => 'DDR2',
-            SPEED        => '667 MHz (1.5 ns)',
-            CAPACITY     => '1024',
-            CAPTION      => 'ONBOARD DIMM_B4',
+            NUMSLOTS         => 8,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (Multi-bit ECC)',
+            TYPE             => 'DDR2',
+            SPEED            => '667 MHz (1.5 ns)',
+            CAPACITY         => '1024',
+            CAPTION          => 'ONBOARD DIMM_B4',
             MEMORYCORRECTION => 'Multi-bit ECC'
         }
     ],
     'vmware' => [
         {
-            NUMSLOTS     => 1,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (None)',
-            TYPE         => 'DRAM',
-            SPEED        => 'Unknown',
-            CAPACITY     => '2048',
-            CAPTION      => 'RAM slot #0',
+            NUMSLOTS         => 1,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (None)',
+            TYPE             => 'DRAM',
+            SPEED            => 'Unknown',
+            CAPACITY         => '2048',
+            CAPTION          => 'RAM slot #0',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 2,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (None)',
-            TYPE         => 'DRAM',
-            SPEED        => 'Unknown',
-            CAPTION      => 'RAM slot #1',
+            NUMSLOTS         => 2,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (None)',
+            TYPE             => 'DRAM',
+            SPEED            => 'Unknown',
+            CAPTION          => 'RAM slot #1',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 3,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (None)',
-            TYPE         => 'DRAM',
-            SPEED        => 'Unknown',
-            CAPTION      => 'RAM slot #2',
+            NUMSLOTS         => 3,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (None)',
+            TYPE             => 'DRAM',
+            SPEED            => 'Unknown',
+            CAPTION          => 'RAM slot #2',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 4,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (None)',
-            TYPE         => 'DRAM',
-            SPEED        => 'Unknown',
-            CAPTION      => 'RAM slot #3',
+            NUMSLOTS         => 4,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (None)',
+            TYPE             => 'DRAM',
+            SPEED            => 'Unknown',
+            CAPTION          => 'RAM slot #3',
             MEMORYCORRECTION => 'None'
 
         }
     ],
     'vmware-esx' => [
         {
-            NUMSLOTS     => 1,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (None)',
-            TYPE         => 'DRAM',
-            SPEED        => 'Unknown',
-            CAPACITY     => '2048',
-            CAPTION      => 'RAM slot #0',
+            NUMSLOTS         => 1,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (None)',
+            TYPE             => 'DRAM',
+            SPEED            => 'Unknown',
+            CAPACITY         => '2048',
+            CAPTION          => 'RAM slot #0',
             MEMORYCORRECTION => 'None'
         },
         {
-            NUMSLOTS     => 2,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (None)',
-            TYPE         => 'DRAM',
-            SPEED        => 'Unknown',
-            CAPTION      => 'RAM slot #1',
+            NUMSLOTS         => 2,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (None)',
+            TYPE             => 'DRAM',
+            SPEED            => 'Unknown',
+            CAPTION          => 'RAM slot #1',
             MEMORYCORRECTION => 'None'
         },
         {
-            NUMSLOTS     => 3,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (None)',
-            TYPE         => 'DRAM',
-            SPEED        => 'Unknown',
-            CAPTION      => 'RAM slot #2',
+            NUMSLOTS         => 3,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (None)',
+            TYPE             => 'DRAM',
+            SPEED            => 'Unknown',
+            CAPTION          => 'RAM slot #2',
             MEMORYCORRECTION => 'None'
         },
         {
-            NUMSLOTS     => 4,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (None)',
-            TYPE         => 'DRAM',
-            SPEED        => 'Unknown',
-            CAPTION      => 'RAM slot #3',
+            NUMSLOTS         => 4,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (None)',
+            TYPE             => 'DRAM',
+            SPEED            => 'Unknown',
+            CAPTION          => 'RAM slot #3',
             MEMORYCORRECTION => 'None'
         },
         {
-            NUMSLOTS     => 5,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (None)',
-            TYPE         => 'DRAM',
-            SPEED        => 'Unknown',
-            CAPTION      => 'RAM slot #4',
+            NUMSLOTS         => 5,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (None)',
+            TYPE             => 'DRAM',
+            SPEED            => 'Unknown',
+            CAPTION          => 'RAM slot #4',
             MEMORYCORRECTION => 'None'
         },
         {
-            NUMSLOTS     => 6,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (None)',
-            TYPE         => 'DRAM',
-            SPEED        => 'Unknown',
-            CAPTION      => 'RAM slot #5',
+            NUMSLOTS         => 6,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (None)',
+            TYPE             => 'DRAM',
+            SPEED            => 'Unknown',
+            CAPTION          => 'RAM slot #5',
             MEMORYCORRECTION => 'None'
         },
         {
-            NUMSLOTS     => 7,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (None)',
-            TYPE         => 'DRAM',
-            SPEED        => 'Unknown',
-            CAPTION      => 'RAM slot #6',
+            NUMSLOTS         => 7,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (None)',
+            TYPE             => 'DRAM',
+            SPEED            => 'Unknown',
+            CAPTION          => 'RAM slot #6',
             MEMORYCORRECTION => 'None'
         },
         {
-            NUMSLOTS     => 8,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (None)',
-            TYPE         => 'DRAM',
-            SPEED        => 'Unknown',
-            CAPTION      => 'RAM slot #7',
+            NUMSLOTS         => 8,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (None)',
+            TYPE             => 'DRAM',
+            SPEED            => 'Unknown',
+            CAPTION          => 'RAM slot #7',
             MEMORYCORRECTION => 'None'
         },
         {
-            NUMSLOTS     => 9,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (None)',
-            TYPE         => 'DRAM',
-            SPEED        => 'Unknown',
-            CAPTION      => 'RAM slot #8',
+            NUMSLOTS         => 9,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (None)',
+            TYPE             => 'DRAM',
+            SPEED            => 'Unknown',
+            CAPTION          => 'RAM slot #8',
             MEMORYCORRECTION => 'None'
         },
         {
-            NUMSLOTS     => 10,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (None)',
-            TYPE         => 'DRAM',
-            SPEED        => 'Unknown',
-            CAPTION      => 'RAM slot #9',
+            NUMSLOTS         => 10,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (None)',
+            TYPE             => 'DRAM',
+            SPEED            => 'Unknown',
+            CAPTION          => 'RAM slot #9',
             MEMORYCORRECTION => 'None'
         },
         {
-            NUMSLOTS     => 11,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (None)',
-            TYPE         => 'DRAM',
-            SPEED        => 'Unknown',
-            CAPTION      => 'RAM slot #10',
+            NUMSLOTS         => 11,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (None)',
+            TYPE             => 'DRAM',
+            SPEED            => 'Unknown',
+            CAPTION          => 'RAM slot #10',
             MEMORYCORRECTION => 'None'
         },
         {
-            NUMSLOTS     => 12,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (None)',
-            TYPE         => 'DRAM',
-            SPEED        => 'Unknown',
-            CAPTION      => 'RAM slot #11',
+            NUMSLOTS         => 12,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (None)',
+            TYPE             => 'DRAM',
+            SPEED            => 'Unknown',
+            CAPTION          => 'RAM slot #11',
             MEMORYCORRECTION => 'None'
         },
         {
-            NUMSLOTS     => 13,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (None)',
-            TYPE         => 'DRAM',
-            SPEED        => 'Unknown',
-            CAPTION      => 'RAM slot #12',
+            NUMSLOTS         => 13,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (None)',
+            TYPE             => 'DRAM',
+            SPEED            => 'Unknown',
+            CAPTION          => 'RAM slot #12',
             MEMORYCORRECTION => 'None'
         },
         {
-            NUMSLOTS     => 14,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (None)',
-            TYPE         => 'DRAM',
-            SPEED        => 'Unknown',
-            CAPTION      => 'RAM slot #13',
+            NUMSLOTS         => 14,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (None)',
+            TYPE             => 'DRAM',
+            SPEED            => 'Unknown',
+            CAPTION          => 'RAM slot #13',
             MEMORYCORRECTION => 'None'
         },
         {
-            NUMSLOTS     => 15,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'DIMM (None)',
-            TYPE         => 'DRAM',
-            SPEED        => 'Unknown',
-            CAPTION      => 'RAM slot #14',
+            NUMSLOTS         => 15,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'DIMM (None)',
+            TYPE             => 'DRAM',
+            SPEED            => 'Unknown',
+            CAPTION          => 'RAM slot #14',
             MEMORYCORRECTION => 'None'
         }
     ],
     'vmware-esx-2.5' => [
         {
-            NUMSLOTS     => 1,
-            TYPE         => 'EDO DIMM',
-            CAPACITY     => '1024'
+            NUMSLOTS         => 1,
+            TYPE             => 'EDO DIMM',
+            CAPACITY         => '1024'
         },
         {
-            NUMSLOTS     => 2,
-            TYPE         => 'DIMM'
+            NUMSLOTS         => 2,
+            TYPE             => 'DIMM'
         },
         {
-            NUMSLOTS     => 3,
-            TYPE         => 'DIMM'
+            NUMSLOTS         => 3,
+            TYPE             => 'DIMM'
         },
         {
-            NUMSLOTS     => 4,
-            TYPE         => 'DIMM'
+            NUMSLOTS         => 4,
+            TYPE             => 'DIMM'
         },
         {
-            NUMSLOTS     => 5,
-            TYPE         => 'DIMM'
+            NUMSLOTS         => 5,
+            TYPE             => 'DIMM'
         },
         {
-            NUMSLOTS     => 6,
-            TYPE         => 'DIMM'
+            NUMSLOTS         => 6,
+            TYPE             => 'DIMM'
         },
         {
-            NUMSLOTS     => 7,
-            TYPE         => 'DIMM'
+            NUMSLOTS         => 7,
+            TYPE             => 'DIMM'
         },
         {
-            NUMSLOTS     => 8,
-            TYPE         => 'DIMM'
+            NUMSLOTS         => 8,
+            TYPE             => 'DIMM'
         },
         {
-            NUMSLOTS     => 9,
-            TYPE         => 'DIMM'
+            NUMSLOTS         => 9,
+            TYPE             => 'DIMM'
         },
         {
-            NUMSLOTS     => 10,
-            TYPE         => 'DIMM'
+            NUMSLOTS         => 10,
+            TYPE             => 'DIMM'
         },
         {
-            NUMSLOTS     => 11,
-            TYPE         => 'DIMM'
+            NUMSLOTS         => 11,
+            TYPE             => 'DIMM'
         },
         {
-            NUMSLOTS     => 12,
-            TYPE         => 'DIMM'
+            NUMSLOTS         => 12,
+            TYPE             => 'DIMM'
         },
         {
-            NUMSLOTS     => 13,
-            TYPE         => 'DIMM'
+            NUMSLOTS         => 13,
+            TYPE             => 'DIMM'
         },
         {
-            NUMSLOTS     => 14,
-            TYPE         => 'DIMM'
+            NUMSLOTS         => 14,
+            TYPE             => 'DIMM'
         },
         {
-            NUMSLOTS     => 15,
-            TYPE         => 'DIMM'
+            NUMSLOTS         => 15,
+            TYPE             => 'DIMM'
         }
     ],
     'windows' => [
         {
-            NUMSLOTS     => 1,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'SODIMM (None)',
-            SPEED        => 'Unknown',
-            TYPE         => 'SDRAM',
-            CAPTION      => 'DIMM 0',
-            CAPACITY    => '256',
+            NUMSLOTS         => 1,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'SODIMM (None)',
+            SPEED            => 'Unknown',
+            TYPE             => 'SDRAM',
+            CAPTION          => 'DIMM 0',
+            CAPACITY         => '256',
             MEMORYCORRECTION => 'None'
         },
         {
-            NUMSLOTS     => 2,
-            SERIALNUMBER => undef,
-            DESCRIPTION  => 'SODIMM (None)',
-            SPEED        => 'Unknown',
-            TYPE         => 'SDRAM',
-            CAPTION      => 'DIMM 1',
-            CAPACITY    => '512',
+            NUMSLOTS         => 2,
+            SERIALNUMBER     => undef,
+            DESCRIPTION      => 'SODIMM (None)',
+            SPEED            => 'Unknown',
+            TYPE             => 'SDRAM',
+            CAPTION          => 'DIMM 1',
+            CAPACITY         => '512',
             MEMORYCORRECTION => 'None'
         }
     ],
+    'windows-xppro' => [
+        {
+            NUMSLOTS         => 1,
+            SERIALNUMBER     => '14FA6621',
+            TYPE             => 'DDR2',
+            SPEED            => '800 MHz',
+            CAPTION          => 'DIMM_A',
+            MEMORYCORRECTION => 'None',
+            DESCRIPTION      => 'DIMM (None)',
+            CAPACITY         => '2048'
+        },
+        {
+            NUMSLOTS         => 2,
+            SERIALNUMBER     => 'AEF96621',
+            TYPE             => 'DDR2',
+            SPEED            => '800 MHz',
+            CAPTION          => 'DIMM_B',
+            MEMORYCORRECTION => 'None',
+            DESCRIPTION      => 'DIMM (None)',
+            CAPACITY         => '2048'
+        }
+    ],
+    'windows-7' => [
+        {
+            NUMSLOTS         => 1,
+            MEMORYCORRECTION => 'None',
+            SERIALNUMBER     => 'SerNum0',
+            DESCRIPTION      => 'DIMM (None)',
+            TYPE             => 'Unknown',
+            SPEED            => 'Unknown',
+            CAPTION          => 'DIMM0'
+        },
+        {
+            NUMSLOTS         => 2,
+            SERIALNUMBER     => '0000000',
+            TYPE             => '<OUT OF SPEC>',
+            SPEED            => '1600 MHz',
+            CAPTION          => 'DIMM1',
+            MEMORYCORRECTION => 'None',
+            DESCRIPTION      => 'DIMM (None)',
+            CAPACITY         => '2048'
+        },
+        {
+            NUMSLOTS         => 3,
+            MEMORYCORRECTION => 'None',
+            SERIALNUMBER     => 'SerNum2',
+            DESCRIPTION      => 'DIMM (None)',
+            TYPE             => 'Unknown',
+            SPEED            => 'Unknown',
+            CAPTION          => 'DIMM2'
+        },
+        {
+            NUMSLOTS         => 4,
+            SERIALNUMBER     => '0000000',
+            TYPE             => '<OUT OF SPEC>',
+            SPEED            => '1600 MHz',
+            CAPTION          => 'DIMM3',
+            MEMORYCORRECTION => 'None',
+            DESCRIPTION      => 'DIMM (None)',
+            CAPACITY         => '2048'
+        }
+    ],
     'windows-hyperV' => [
         {
-            NUMSLOTS     => 1,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPACITY     => '1024',
-            CAPTION      => 'M0',
+            NUMSLOTS         => 1,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPACITY         => '1024',
+            CAPTION          => 'M0',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 2,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M1',
+            NUMSLOTS         => 2,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M1',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 3,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M2',
+            NUMSLOTS         => 3,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M2',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 4,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M3',
+            NUMSLOTS         => 4,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M3',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 5,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M4',
+            NUMSLOTS         => 5,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M4',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 6,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M5',
+            NUMSLOTS         => 6,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M5',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 7,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M6',
+            NUMSLOTS         => 7,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M6',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 8,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M7',
+            NUMSLOTS         => 8,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M7',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 9,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M8',
+            NUMSLOTS         => 9,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M8',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 10,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M9',
+            NUMSLOTS         => 10,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M9',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 11,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M10',
+            NUMSLOTS         => 11,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M10',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 12,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M11',
+            NUMSLOTS         => 12,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M11',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 13,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M12',
+            NUMSLOTS         => 13,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M12',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 14,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M13',
+            NUMSLOTS         => 14,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M13',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 15,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M14',
+            NUMSLOTS         => 15,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M14',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 16,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M15',
+            NUMSLOTS         => 16,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M15',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 17,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M16',
+            NUMSLOTS         => 17,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M16',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 18,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M17',
+            NUMSLOTS         => 18,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M17',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 19,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M18',
+            NUMSLOTS         => 19,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M18',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 20,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M19',
+            NUMSLOTS         => 20,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M19',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 21,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M20',
+            NUMSLOTS         => 21,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M20',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 22,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M21',
+            NUMSLOTS         => 22,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M21',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 23,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M22',
+            NUMSLOTS         => 23,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M22',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 24,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M23',
+            NUMSLOTS         => 24,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M23',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 25,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M24',
+            NUMSLOTS         => 25,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M24',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 26,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M25',
+            NUMSLOTS         => 26,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M25',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 27,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M26',
+            NUMSLOTS         => 27,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M26',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 28,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M27',
+            NUMSLOTS         => 28,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M27',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 29,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M28',
+            NUMSLOTS         => 29,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M28',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 30,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M29',
+            NUMSLOTS         => 30,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M29',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 31,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M30',
+            NUMSLOTS         => 31,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M30',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 32,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M31',
+            NUMSLOTS         => 32,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M31',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 33,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M32',
+            NUMSLOTS         => 33,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M32',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 34,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M33',
+            NUMSLOTS         => 34,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M33',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 35,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M34',
+            NUMSLOTS         => 35,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M34',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 36,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M35',
+            NUMSLOTS         => 36,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M35',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 37,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M36',
+            NUMSLOTS         => 37,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M36',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 38,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M37',
+            NUMSLOTS         => 38,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M37',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 39,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M38',
+            NUMSLOTS         => 39,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M38',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 40,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M39',
+            NUMSLOTS         => 40,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M39',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 41,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M40',
+            NUMSLOTS         => 41,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M40',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 42,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M41',
+            NUMSLOTS         => 42,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M41',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 43,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M42',
+            NUMSLOTS         => 43,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M42',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 44,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M43',
+            NUMSLOTS         => 44,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M43',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 45,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M44',
+            NUMSLOTS         => 45,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M44',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 46,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M45',
+            NUMSLOTS         => 46,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M45',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 47,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M46',
+            NUMSLOTS         => 47,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M46',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 48,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M47',
+            NUMSLOTS         => 48,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M47',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 49,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M48',
+            NUMSLOTS         => 49,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M48',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 50,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M49',
+            NUMSLOTS         => 50,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M49',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 51,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M50',
+            NUMSLOTS         => 51,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M50',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 52,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M51',
+            NUMSLOTS         => 52,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M51',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 53,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M52',
+            NUMSLOTS         => 53,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M52',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 54,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M53',
+            NUMSLOTS         => 54,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M53',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 55,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M54',
+            NUMSLOTS         => 55,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M54',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 56,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M55',
+            NUMSLOTS         => 56,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M55',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 57,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M56',
+            NUMSLOTS         => 57,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M56',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 58,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M57',
+            NUMSLOTS         => 58,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M57',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 59,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M58',
+            NUMSLOTS         => 59,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M58',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 60,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M59',
+            NUMSLOTS         => 60,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M59',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 61,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M60',
+            NUMSLOTS         => 61,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M60',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 62,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M61',
+            NUMSLOTS         => 62,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M61',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 63,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M62',
+            NUMSLOTS         => 63,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M62',
             MEMORYCORRECTION => 'None'
 
         },
         {
-            NUMSLOTS     => 64,
-            SERIALNUMBER => 'None',
-            DESCRIPTION  => 'Unknown (None)',
-            TYPE         => 'Other',
-            SPEED        => 'Unknown',
-            CAPTION      => 'M63',
+            NUMSLOTS         => 64,
+            SERIALNUMBER     => 'None',
+            DESCRIPTION      => 'Unknown (None)',
+            TYPE             => 'Other',
+            SPEED            => 'Unknown',
+            CAPTION          => 'M63',
             MEMORYCORRECTION => 'None'
 
         }
diff --git a/t/inventory/solaris/bios.t b/t/inventory/solaris/bios.t
new file mode 100755
index 0000000..b649dbd
--- /dev/null
+++ b/t/inventory/solaris/bios.t
@@ -0,0 +1,157 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+use Test::More;
+
+use FusionInventory::Agent::Task::Inventory::Input::Solaris::Bios;
+
+my %showrev_tests = (
+    'SPARC-1' => {
+        'Release' => '5.10',
+        'Hostname' => '157501s021plc',
+        'Kernel version' => 'SunOS',
+        'Kernel architecture' => 'sun4u',
+        'Hardware provider' => 'Sun_Microsystem',
+        'Domain' => 'be.cnamts.fr',
+        'Application architecture' => 'sparc',
+        'Hostid' => '83249bbf',
+    },
+    'SPARC-2' => {
+        'Kernel version' => 'SunOS',
+        'Release' => '5.10',
+        'Hostname' => 'mysunserver',
+        'Hardware provider' => 'Sun_Microsystems',
+        'Kernel architecture' => 'sun4v',
+        'Application architecture' => 'sparc',
+        'Hostid' => 'mabox'
+    },
+    'x86-1' => {
+        'Kernel version' => 'SunOS',
+        'Hostname' => 'stlaurent',
+        'Kernel architecture' => 'i86pc',
+        'Application architecture' => 'i386',
+        'Hostid' => '403100b',
+        'Release' => '5.10',
+    },
+    'x86-2' => {
+        'Kernel version' => 'SunOS',
+        'Release' => '5.10',
+        'Hostname' => 'mamachine',
+        'Kernel architecture' => 'i86pc',
+        'Application architecture' => 'i386',
+        'Hostid' => '7c31a88'
+    },
+    'x86-3' => {
+        'Kernel version' => 'SunOS',
+        'Release' => '5.10',
+        'Hostname' => 'plop',
+        'Kernel architecture' => 'i86pc',
+        'Application architecture' => 'i386',
+        'Hostid' => '7c31a36'
+    }
+);
+
+my %smbios_tests = (
+    'x86-1' => {
+        'SMB_TYPE_SYSTEM' => {
+            'Version' => '00',
+            'SKU Number' => ' ',
+            'Serial Number' => 'R00T34E0009',
+            'Product' => 'Sun Fire V40z',
+            'Manufacturer' => 'Sun Microsystems, Inc.',
+            'UUID' => 'be1630df-d130-41a4-be32-fd28bb4bd1ac',
+            'Wake-Up Event' => '0x6 (power switch)'
+        }
+    },
+    'x86-3' => {
+        SMB_TYPE_CHASSIS => {
+            'Chassis Height' => '1u',
+            'Power Supply State' => '0x3 (safe)',
+            'Element Records' => '0',
+            'Serial Number' => 'QSDH1234567',
+            'Thermal State' => '0x3 (safe)',
+            'Lock Present' => 'N',
+            'Asset Tag' => '6I012345TF',
+            'Chassis Type' => '0x17 (rack mount chassis)',
+            'Power Cords' => '1',
+            'Version' => 'E10476-011',
+            'OEM Data' => '0x81581cf8',
+            'Boot-Up State' => '0x3 (safe)',
+            'Manufacturer' => 'TRANSTEC'
+        },
+        SMB_TYPE_BIOS => {
+            'Characteristics' => '0x15c099a80',
+            'Version Number' => '0.0',
+            'Vendor' => 'Intel Corporation',
+            'Image Size' => '98304 bytes',
+            'Characteristics Extension Byte 2' => '0x7',
+            'Characteristics Extension Byte 1' => '0x33',
+            'Address Segment' => '0xe800',
+            'Version String' => 'SFC4UR.86B.01.00.0029.071220092126',
+            'Embedded Ctlr Firmware Version Number' => '0.0',
+            'Release Date' => '07/12/2009',
+            'ROM Size' => '8388608 bytes'
+        },
+        SMB_TYPE_IPMIDEV => {
+            'Flags' => '0x9',
+            'NV Storage Device Bus ID' => '0xffffffff',
+            'BMC IPMI Version' => '2.0',
+            'Register Spacing' => '1',
+            'Interrupt Number' => '0',
+            'Type' => '1 (KCS: Keyboard Controller Style)',
+            'i2c Bus Slave Address' => '0x20',
+            'BMC Base Address' => '0xca2'
+        },
+        SMB_TYPE_BASEBOARD => {
+            'Board Type' => '0xa (motherboard)',
+            'Flags' => '0x9',
+            'Serial Number' => 'QSFX12345678',
+            'Product' => 'S7000FC4UR',
+            'Manufacturer' => 'Intel',
+            'Chassis' => '0',
+            'Asset Tag' => '6I012345TF'
+        },
+        SMB_TYPE_SYSTEM => {
+            'Family' => ' ',
+            'SKU Number' => '6I012345TF',
+            'Product' => 'MP Server',
+            'Manufacturer' => 'Intel',
+            'UUID' => '4b713db6-6d40-11dd-b32c-000123456789',
+            'Wake-Up Event' => '0x6 (power switch)'
+        }
+    }
+);
+
+my %prtconf_tests = (
+    'SPARC-1' => {
+        'compatible' => 'SUNW,Serengeti',
+        'device_type' => 'gptwo',
+        'banner-name' => 'Sun Fire E6900',
+        'name' => 'SUNW,Sun-Fire'
+    }
+);
+
+plan tests => 
+    (scalar keys %showrev_tests) +
+    (scalar keys %smbios_tests)  +
+    (scalar keys %prtconf_tests);
+
+foreach my $test (keys %showrev_tests) {
+    my $file   = "resources/solaris/showrev/$test";
+    my $result = FusionInventory::Agent::Task::Inventory::Input::Solaris::Bios::_parseShowRev(file => $file);
+    is_deeply($result, $showrev_tests{$test}, "showrev parsing: $test");
+}
+
+foreach my $test (keys %smbios_tests) {
+    my $file   = "resources/solaris/smbios/$test";
+    my $result = FusionInventory::Agent::Task::Inventory::Input::Solaris::Bios::_parseSmbios(file => $file);
+    is_deeply($result, $smbios_tests{$test}, "smbios parsing: $test");
+}
+
+foreach my $test (keys %prtconf_tests) {
+    my $file   = "resources/solaris/prtconf/$test";
+    my $result = FusionInventory::Agent::Task::Inventory::Input::Solaris::Bios::_parsePrtconf(file => $file);
+    is_deeply($result, $prtconf_tests{$test}, "prtconf parsing: $test");
+}
diff --git a/t/inventory/solaris/cpu.t b/t/inventory/solaris/cpu.t
index 44f3e3c..c71b4ea 100755
--- a/t/inventory/solaris/cpu.t
+++ b/t/inventory/solaris/cpu.t
@@ -37,6 +37,16 @@ my %memconf_tests = (
     ]
 );
 
+my %psrinfo_tests = (
+    sample1 => [
+        8,
+        {
+            NAME  => 'i386',
+            SPEED => 2133
+        }
+    ]
+);
+
 my %spec_tests = (
     'Sun Microsystems, Inc. Sun-Fire-T200 (Sun Fire T2000) (8-core quad-thread UltraSPARC-T1 1000MHz)' => [
         1,
@@ -140,6 +150,7 @@ my %spec_tests = (
 
 plan tests => 
     (scalar keys %memconf_tests) +
+    (scalar keys %psrinfo_tests) +
     (scalar keys %spec_tests)    ;
 
 foreach my $test (keys %memconf_tests) {
@@ -148,6 +159,12 @@ foreach my $test (keys %memconf_tests) {
     is_deeply(\@results, $memconf_tests{$test}, "memconf parsing: $test" );
 }
 
+foreach my $test (keys %psrinfo_tests) {
+    my $file    = "resources/solaris/psrinfo/$test";
+    my @results = FusionInventory::Agent::Task::Inventory::Input::Solaris::CPU::_getCPUFromPsrinfo(file => $file);
+    is_deeply(\@results, $psrinfo_tests{$test}, "psrinfo parsing: $test" );
+}
+
 foreach my $test (keys %spec_tests) {
     my @results = FusionInventory::Agent::Task::Inventory::Input::Solaris::CPU::_parseSpec($test);
     is_deeply(\@results, $spec_tests{$test}, "spec parsing: $test" );
diff --git a/t/inventory/windows/cpu.t b/t/inventory/windows/cpu.t
new file mode 100755
index 0000000..ef03d46
--- /dev/null
+++ b/t/inventory/windows/cpu.t
@@ -0,0 +1,69 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+use utf8;
+use lib 't';
+
+use English qw(-no_match_vars);
+use Test::More;
+use Test::MockModule;
+
+use FusionInventory::Test::Utils;
+
+BEGIN {
+    # use mock modules for non-available ones
+    push @INC, 't/fake/windows' if $OSNAME ne 'MSWin32';
+}
+
+use FusionInventory::Agent::Task::Inventory::Input::Win32::CPU;
+
+my %tests = (
+    7 => [
+        {
+            ID           => 'A7 06 02 00 FF FB EB BF',
+            NAME         => 'Intel(R) Core(TM) i5-2300 CPU @ 2.80GHz',
+            SERIAL       => 'ToBeFilledByO.E.M.',
+            MANUFACTURER => 'Intel',
+            DESCRIPTION  => 'x86 Family 6 Model 42 Stepping 7',
+            SPEED        => '2800',
+            THREAD       => undef,
+            CORE         => '4'
+        }
+    ]
+);
+
+plan tests => scalar keys %tests;
+
+my $module = Test::MockModule->new(
+    'FusionInventory::Agent::Task::Inventory::Input::Win32::CPU'
+);
+
+foreach my $test (keys %tests) {
+    $module->mock(
+        'getWmiObjects',
+        mockGetWmiObjects($test)
+    );
+
+    $module->mock(
+        'getCpusFromDmidecode',
+        sub {
+            return
+                FusionInventory::Agent::Tools::Generic::getCpusFromDmidecode(
+                    file => "resources/generic/dmidecode/windows-$test"
+                );
+        }
+    );
+
+    $module->mock(
+        'getRegistryKey',
+        mockGetRegistryKey($test)
+    );
+
+    my @cpus = FusionInventory::Agent::Task::Inventory::Input::Win32::CPU::_getCPUs();
+    is_deeply(
+        \@cpus,
+        $tests{$test},
+        "$test sample"
+    );
+}
diff --git a/t/inventory/windows/memory.t b/t/inventory/windows/memory.t
new file mode 100755
index 0000000..3ff1983
--- /dev/null
+++ b/t/inventory/windows/memory.t
@@ -0,0 +1,66 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+use utf8;
+use lib 't';
+
+use English qw(-no_match_vars);
+use Test::More;
+use Test::MockModule;
+
+use FusionInventory::Test::Utils;
+
+BEGIN {
+    # use mock modules for non-available ones
+    push @INC, 't/fake/windows' if $OSNAME ne 'MSWin32';
+}
+
+use FusionInventory::Agent::Task::Inventory::Input::Win32::Memory;
+
+my %tests = (
+    7 => [
+        {
+            NUMSLOTS     => 0,
+            FORMFACTOR   => 'DIMM',
+            SERIALNUMBER => '0000000',
+            TYPE         => 'Unknown',
+            SPEED        => '1600',
+            CAPTION      => "Mémoire physique",
+            REMOVABLE    => 0,
+            DESCRIPTION  => "Mémoire physique",
+            CAPACITY     => '2048'
+        },
+        {
+            NUMSLOTS     => 1,
+            FORMFACTOR   => 'DIMM',
+            SERIALNUMBER => '0000000',
+            TYPE         => 'Unknown',
+            SPEED        => '1600',
+            CAPTION      => "Mémoire physique",
+            REMOVABLE    => 0,
+            DESCRIPTION  => "Mémoire physique",
+            CAPACITY     => '2048'
+        }
+    ]
+);
+
+plan tests => scalar keys %tests;
+
+my $module = Test::MockModule->new(
+    'FusionInventory::Agent::Task::Inventory::Input::Win32::Memory'
+);
+
+foreach my $test (keys %tests) {
+    $module->mock(
+        'getWmiObjects',
+        mockGetWmiObjects($test)
+    );
+
+    my @memories = FusionInventory::Agent::Task::Inventory::Input::Win32::Memory::_getMemories();
+    is_deeply(
+        \@memories,
+        $tests{$test},
+        "$test sample"
+    );
+}
diff --git a/t/inventory/windows/printers.t b/t/inventory/windows/printers.t
index 8199b06..f890c4d 100755
--- a/t/inventory/windows/printers.t
+++ b/t/inventory/windows/printers.t
@@ -2,9 +2,13 @@
 
 use strict;
 use warnings;
+use lib 't';
 
 use English qw(-no_match_vars);
 use Test::More;
+use Test::MockModule;
+
+use FusionInventory::Test::Utils;
 
 BEGIN {
     # use mock modules for non-available ones
@@ -35,68 +39,21 @@ foreach my $test (keys %tests) {
 }
 plan tests => $plan;
 
-foreach my $test (keys %tests) {
-    my $printKey = load_registry("resources/win32/registry/$test-USBPRINT.reg");
-    my $usbKey   = load_registry("resources/win32/registry/$test-USB.reg");
-    foreach my $port (keys %{$tests{$test}}) {
-        my $prefix = FusionInventory::Agent::Task::Inventory::Input::Win32::Printers::_getUSBPrefix($printKey, $port);
-        my $serial = FusionInventory::Agent::Task::Inventory::Input::Win32::Printers::_getUSBSerial($usbKey, $prefix);
-
-        is($serial, $tests{$test}->{$port}, "serial for printer $port");
-    }
-}
-
-sub load_registry {
-    my ($file) = @_;
-
-    my $root_offset;
-    my $root_key = {};
-    my $current_key;
-
-    open (my $handle, '<', $file) or die "can't open $file: $ERRNO";
-
-    # this is a windows file
-    binmode $handle, ':encoding(UTF-16LE)';
-    local $INPUT_RECORD_SEPARATOR="\r\n";
-
-    while (my $line = <$handle>) {
-        chomp $line;
-
-        if ($line =~ /^ \[ ([^]]+) \] $/x) {
-            my $path = $1;
-            my @path = split(/\\/, $path);
-
-            if ($root_offset) {
-                splice @path, 0, $root_offset;
-                $current_key = $root_key;
-                foreach my $element (@path) {
-                    my $key_path = $element . '/';
-
-                    if (!defined $current_key->{$key_path}) {
-                        my $new_key = {};
-                        $current_key->{$key_path} = $new_key;
-                    }
-
-                    $current_key = $current_key->{$key_path};
-                }
-            } else {
-                $root_offset = scalar @path;
-            }
-            next;
-        }
-
-        if ($line =~ /^ " ([^"]+) " = dword:(\d+)/x) {
-            $current_key->{'/' . $1} = "0x$2";
-            next;
-        }
+my $module = Test::MockModule->new(
+    'FusionInventory::Agent::Task::Inventory::Input::Win32::Printers'
+);
 
-        if ($line =~ /^ " ([^"]+) " = " ([^"]+) "/x) {
-            $current_key->{'/' . $1} = $2;
-            next;
-        }
+foreach my $test (keys %tests) {
+    $module->mock(
+        'getRegistryKey',
+        mockGetRegistryKey($test)
+    );
 
+    foreach my $port (keys %{$tests{$test}}) {
+        is(
+            FusionInventory::Agent::Task::Inventory::Input::Win32::Printers::_getUSBPrinterSerial($port),
+            $tests{$test}->{$port},
+            "$test sample, $port printer"
+        );
     }
-    close $handle;
-
-    return $root_key;
 }
diff --git a/t/inventory/windows/usb.t b/t/inventory/windows/usb.t
index f8a5147..4312095 100755
--- a/t/inventory/windows/usb.t
+++ b/t/inventory/windows/usb.t
@@ -3,11 +3,14 @@
 use strict;
 use warnings;
 use utf8;
+use lib 't';
 
 use English qw(-no_match_vars);
 use Test::More;
 use Test::MockModule;
 
+use FusionInventory::Test::Utils;
+
 BEGIN {
     # use mock modules for non-available ones
     push @INC, 't/fake/windows' if $OSNAME ne 'MSWin32';
@@ -93,52 +96,15 @@ my $module = Test::MockModule->new(
 );
 
 foreach my $test (keys %tests) {
-    # redefine getWmiObjects function
     $module->mock(
         'getWmiObjects',
-        sub {
-            my (%params) = @_;
-
-            my $file = "resources/win32/wmi/$test-$params{class}.wmi";
-            open (my $handle, '<', $file) or die "can't open $file: $ERRNO";
-
-            # this is a windows file
-            binmode $handle, ':encoding(UTF-16LE)';
-            local $INPUT_RECORD_SEPARATOR="\r\n";
-
-            # build a list of desired properties indexes
-            my %properties = map { $_ => 1 } @{$params{properties}};
-
-            my @objects;
-            my $object;
-            while (my $line = <$handle>) {
-                chomp $line;
-
-                if ($line =~ /^ (\w+) = (.+) $/x) {
-                    my $key = $1;
-                    my $value = $2;
-                    next unless $properties{$key};
-                    $value =~ s/&/&/g;
-                    $object->{$key} = $value;
-                    next;
-                }
-
-                if ($line =~ /^$/) {
-                    push @objects, $object if $object;
-                    undef $object;
-                    next;
-                }
-            }
-            close $handle;
-
-            return @objects;
-        }
+        mockGetWmiObjects($test)
     );
 
     my @devices = FusionInventory::Agent::Task::Inventory::Input::Win32::USB::_getUSBDevices();
     is_deeply(
         \@devices,
         $tests{$test},
-        "$test USB devices list"
+        "$test sample"
     );
 }
diff --git a/t/tools/generic.t b/t/tools/generic.t
index 55ac597..7ae2863 100755
--- a/t/tools/generic.t
+++ b/t/tools/generic.t
@@ -4513,6 +4513,1161 @@ my %dmidecode_tests = (
                 'Ending Address' => '0x000400003FF'
             }
         ]
+    },
+    'windows-xppro' => {
+        '32' => [
+            {
+                'Status' => 'No errors detected'
+            }
+        ],
+        '11' => [
+            {
+                'String 1' => 'Dell System',
+                'String 3' => '13[PP04X]',
+                'String 2' => '5[0003]'
+            }
+        ],
+        '21' => [
+            {
+                'Type' => 'Touch Pad',
+                'Buttons' => '2',
+                'Interface' => 'Bus Mouse'
+            }
+        ],
+        '7' => [
+            {
+                'Error Correction Type' => 'None',
+                'Installed Size' => '128 kB',
+                'Operational Mode' => 'Write Back',
+                'Configuration' => 'Enabled, Not Socketed, Level 1',
+                'Installed SRAM Type' => 'Unknown',
+                'System Type' => 'Data',
+                'Speed' => 'Unknown',
+                'Associativity' => '4-way Set-associative',
+                'Location' => 'Internal',
+                'Maximum Size' => '128 kB'
+            },
+            {
+                'Error Correction Type' => 'None',
+                'Installed Size' => '6144 kB',
+                'Operational Mode' => 'Varies With Memory Address',
+                'Configuration' => 'Enabled, Not Socketed, Level 2',
+                'Installed SRAM Type' => 'Pipeline Burst',
+                'System Type' => 'Unified',
+                'Speed' => '15 ns',
+                'Associativity' => 'Other',
+                'Location' => 'Internal',
+                'Maximum Size' => '6144 kB'
+            }
+        ],
+        '17' => [
+            {
+                'Part Number' => 'EBE21UE8ACUA-8G-E',
+                'Serial Number' => '14FA6621',
+                'Data Width' => '64 bits',
+                'Array Handle' => '0x1000',
+                'Type Detail' => 'Synchronous',
+                'Set' => 'None',
+                'Asset Tag' => '200840',
+                'Total Width' => '64 bits',
+                'Type' => 'DDR2',
+                'Speed' => '800 MHz',
+                'Size' => '2048 MB',
+                'Error Information Handle' => 'Not Provided',
+                'Locator' => 'DIMM_A',
+                'Manufacturer' => '7F7FFE0000000000',
+                'Form Factor' => 'DIMM'
+            },
+            {
+                'Part Number' => 'EBE21UE8ACUA-8G-E',
+                'Serial Number' => 'AEF96621',
+                'Data Width' => '64 bits',
+                'Array Handle' => '0x1000',
+                'Type Detail' => 'Synchronous',
+                'Set' => 'None',
+                'Asset Tag' => '200840',
+                'Total Width' => '64 bits',
+                'Type' => 'DDR2',
+                'Speed' => '800 MHz',
+                'Size' => '2048 MB',
+                'Error Information Handle' => 'Not Provided',
+                'Locator' => 'DIMM_B',
+                'Manufacturer' => '7F7FFE0000000000',
+                'Form Factor' => 'DIMM'
+            }
+        ],
+        '2' => [
+            {
+                'Product Name' => '0P019G',
+                'Serial Number' => '.HLG964J.CN129618C52450.',
+                'Manufacturer' => 'Dell Inc.'
+            }
+        ],
+        '22' => [
+            {
+                'Design Capacity' => '84000 mWh',
+                'Maximum Error' => '3%',
+                'OEM-specific Information' => '0x00000001',
+                'Design Voltage' => '11100 mV',
+                'SBDS Manufacture Date' => '2010-08-31',
+                'SBDS Chemistry' => 'LION',
+                'Location' => 'Sys. Battery Bay',
+                'Manufacturer' => 'SMP',
+                'Name' => 'DELL HJ59008',
+                'SBDS Version' => '1.0',
+                'SBDS Serial Number' => '02C7'
+            }
+        ],
+        '1' => [
+            {
+                'Wake-up Type' => 'Power Switch',
+                'Product Name' => 'Precision M4400',
+                'Serial Number' => 'HLG964J',
+                'Manufacturer' => 'Dell Inc.',
+                'UUID' => '44454C4C-4C00-1047-8039-C8C04F36344A'
+            }
+        ],
+        '0' => [
+            {
+                'BIOS Revision' => '2.4',
+                'Address' => '0xF0000',
+                'Vendor' => 'Dell Inc.',
+                'Version' => 'A24',
+                'Runtime Size' => '64 kB',
+                'Firmware Revision' => '2.4',
+                'Release Date' => '08/19/2010',
+                'ROM Size' => '1728 kB'
+            }
+        ],
+        '16' => [
+            {
+                'Number Of Devices' => '2',
+                'Error Correction Type' => 'None',
+                'Error Information Handle' => 'Not Provided',
+                'Location' => 'System Board Or Motherboard',
+                'Maximum Capacity' => '8 GB',
+                'Use' => 'System Memory'
+            }
+        ],
+        '13' => [
+            {
+                'Language Description Format' => 'Long',
+                'Installable Languages' => '1',
+                'Currently Installed Language' => 'en|US|iso8859-1'
+            }
+        ],
+        '27' => [
+            {
+                'Type' => 'Fan',
+                'Status' => 'OK',
+                'OEM-specific Information' => '0x0000DD00'
+            }
+        ],
+        '28' => [
+            {
+                'Status' => 'OK',
+                'Minimum Value' => '0.0 deg C',
+                'OEM-specific Information' => '0x0000DC00',
+                'Accuracy' => 'Unknown',
+                'Maximum Value' => '127.0 deg C',
+                'Resolution' => '1.000 deg C',
+                'Location' => 'Processor',
+                'Tolerance' => '0.5 deg C',
+                'Description' => 'CPU Internal Temperature'
+            }
+        ],
+        '3' => [
+            {
+                'Type' => 'Portable',
+                'Power Supply State' => 'Safe',
+                'Security Status' => 'None',
+                'Serial Number' => 'HLG964J',
+                'Thermal State' => 'Safe',
+                'Boot-up State' => 'Safe',
+                'Manufacturer' => 'Dell Inc.'
+            }
+        ],
+        '9' => [
+            {
+                'ID' => 'Adapter 0, Socket 0',
+                'Length' => 'Other',
+                'Designation' => 'PCMCIA 0',
+                'Type' => '32-bit PC Card (PCMCIA)',
+                'Current Usage' => 'Available'
+            }
+        ],
+        '20' => [
+            {
+                'Range Size' => '4 GB',
+                'Partition Row Position' => '1',
+                'Starting Address' => '0x00000000000',
+                'Memory Array Mapped Address Handle' => '0x1301',
+                'Physical Device Handle' => '0x1100',
+                'Interleaved Data Depth' => '8',
+                'Interleave Position' => '1',
+                'Ending Address' => '0x000FFFFFFFF'
+            },
+            {
+                'Range Size' => '4 GB',
+                'Partition Row Position' => '1',
+                'Starting Address' => '0x00000000000',
+                'Memory Array Mapped Address Handle' => '0x1301',
+                'Physical Device Handle' => '0x1101',
+                'Interleaved Data Depth' => '8',
+                'Interleave Position' => '2',
+                'Ending Address' => '0x000FFFFFFFF'
+            }
+        ],
+        '8' => [
+            {
+                'Port Type' => 'Parallel Port PS/2',
+                'External Connector Type' => 'DB-25 female',
+                'Internal Reference Designator' => 'PARALLEL',
+                'Internal Connector Type' => 'None'
+            },
+            {
+                'Port Type' => 'Serial Port 16550A Compatible',
+                'External Connector Type' => 'DB-9 male',
+                'Internal Reference Designator' => 'SERIAL1',
+                'Internal Connector Type' => 'None'
+            },
+            {
+                'Port Type' => 'USB',
+                'External Connector Type' => 'Access Bus (USB)',
+                'Internal Reference Designator' => 'USB',
+                'Internal Connector Type' => 'None'
+            },
+            {
+                'Port Type' => 'Video Port',
+                'External Connector Type' => 'DB-15 female',
+                'Internal Reference Designator' => 'MONITOR',
+                'Internal Connector Type' => 'None'
+            },
+            {
+                'Port Type' => 'Firewire (IEEE P1394)',
+                'External Connector Type' => 'IEEE 1394',
+                'Internal Reference Designator' => 'FireWire',
+                'Internal Connector Type' => 'None'
+            },
+            {
+                'Port Type' => 'Modem Port',
+                'External Connector Type' => 'RJ-11',
+                'Internal Reference Designator' => 'Modem',
+                'Internal Connector Type' => 'None'
+            },
+            {
+                'Port Type' => 'Network Port',
+                'External Connector Type' => 'RJ-45',
+                'Internal Reference Designator' => 'Ethernet',
+                'Internal Connector Type' => 'None'
+            }
+        ],
+        '4' => [
+            {
+                'ID' => '76 06 01 00 FF FB EB BF',
+                'Socket Designation' => 'Microprocessor',
+                'Status' => 'Populated, Enabled',
+                'Max Speed' => '2534 MHz',
+                'Family' => 'Core 2 Duo',
+                'Thread Count' => '2',
+                'Current Speed' => '2534 MHz',
+                'L2 Cache Handle' => '0x0701',
+                'Type' => 'Central Processor',
+                'Signature' => 'Type 0, Family 6, Model 23, Stepping 6',
+                'L1 Cache Handle' => '0x0700',
+                'Manufacturer' => 'Intel',
+                'Core Enabled' => '2',
+                'External Clock' => '266 MHz',
+                'Upgrade' => 'None',
+                'Core Count' => '2',
+                'Voltage' => '3.3 V',
+                'L3 Cache Handle' => 'Not Provided'
+            }
+        ],
+        '10' => [
+            {
+                'Type' => 'Video',
+                'Status' => 'Enabled',
+                'Description' => 'NVIDIA Quadro FX 1700M'
+            },
+            {
+                'Type' => 'Sound',
+                'Status' => 'Enabled',
+                'Description' => 'IDT 92HD71'
+            }
+        ],
+        '19' => [
+            {
+                'Range Size' => '4 GB',
+                'Partition Width' => '1',
+                'Starting Address' => '0x00000000000',
+                'Physical Array Handle' => '0x1000',
+                'Ending Address' => '0x000FFFFFFFF'
+            }
+        ]
+    },
+    'windows-7' => {
+        '35' => [
+            {
+                'Threshold Handle' => '0x0035',
+                'Management Device Handle' => '0x0034',
+                'Description' => 'To Be Filled By O.E.M.',
+                'Component Handle' => '0x0034'
+            },
+            {
+                'Threshold Handle' => '0x0038',
+                'Management Device Handle' => '0x0034',
+                'Description' => 'To Be Filled By O.E.M.',
+                'Component Handle' => '0x0037'
+            },
+            {
+                'Threshold Handle' => '0x003B',
+                'Management Device Handle' => '0x0034',
+                'Description' => 'To Be Filled By O.E.M.',
+                'Component Handle' => '0x003A'
+            },
+            {
+                'Threshold Handle' => '0x003E',
+                'Management Device Handle' => '0x0034',
+                'Description' => 'To Be Filled By O.E.M.',
+                'Component Handle' => '0x003D'
+            },
+            {
+                'Threshold Handle' => '0x003E',
+                'Management Device Handle' => '0x0034',
+                'Description' => 'To Be Filled By O.E.M.',
+                'Component Handle' => '0x0040'
+            },
+            {
+                'Threshold Handle' => '0x0046',
+                'Management Device Handle' => '0x0045',
+                'Description' => 'To Be Filled By O.E.M.',
+                'Component Handle' => '0x0045'
+            },
+            {
+                'Threshold Handle' => '0x0049',
+                'Management Device Handle' => '0x0045',
+                'Description' => 'To Be Filled By O.E.M.',
+                'Component Handle' => '0x0048'
+            },
+            {
+                'Threshold Handle' => '0x004C',
+                'Management Device Handle' => '0x0045',
+                'Description' => 'To Be Filled By O.E.M.',
+                'Component Handle' => '0x004B'
+            },
+            {
+                'Threshold Handle' => '0x004F',
+                'Management Device Handle' => '0x0045',
+                'Description' => 'To Be Filled By O.E.M.',
+                'Component Handle' => '0x004E'
+            },
+            {
+                'Threshold Handle' => '0x0052',
+                'Management Device Handle' => '0x0045',
+                'Description' => 'To Be Filled By O.E.M.',
+                'Component Handle' => '0x0051'
+            },
+            {
+                'Threshold Handle' => '0x0055',
+                'Management Device Handle' => '0x0045',
+                'Description' => 'To Be Filled By O.E.M.',
+                'Component Handle' => '0x0054'
+            },
+            {
+                'Threshold Handle' => '0x0055',
+                'Management Device Handle' => '0x0045',
+                'Description' => 'To Be Filled By O.E.M.',
+                'Component Handle' => '0x0057'
+            },
+            {
+                'Threshold Handle' => '0x0055',
+                'Management Device Handle' => '0x0045',
+                'Description' => 'To Be Filled By O.E.M.',
+                'Component Handle' => '0x005A'
+            }
+        ],
+        '32' => [
+            {
+            'Status' => 'No errors detected'
+            }
+        ],
+        '11' => [
+            {
+            'String 1' => 'To Be Filled By O.E.M.'
+            }
+        ],
+        '7' => [
+            {
+                'Error Correction Type' => 'None',
+                'Installed Size' => '256 kB',
+                'Operational Mode' => 'Write Back',
+                'Socket Designation' => 'L1-Cache',
+                'Configuration' => 'Enabled, Not Socketed, Level 1',
+                'Installed SRAM Type' => 'Other',
+                'System Type' => 'Unified',
+                'Speed' => 'Unknown',
+                'Associativity' => '8-way Set-associative',
+                'Location' => 'Internal',
+                'Maximum Size' => '256 kB'
+            },
+            {
+                'Error Correction Type' => 'None',
+                'Installed Size' => '1024 kB',
+                'Operational Mode' => 'Varies With Memory Address',
+                'Socket Designation' => 'L2-Cache',
+                'Configuration' => 'Enabled, Not Socketed, Level 2',
+                'Installed SRAM Type' => 'Other',
+                'System Type' => 'Unified',
+                'Speed' => 'Unknown',
+                'Associativity' => '8-way Set-associative',
+                'Location' => 'Internal',
+                'Maximum Size' => '1024 kB'
+            },
+            {
+                'Error Correction Type' => 'None',
+                'Installed Size' => '6144 kB',
+                'Operational Mode' => 'Unknown',
+                'Socket Designation' => 'L3-Cache',
+                'Configuration' => 'Disabled, Not Socketed, Level 3',
+                'Installed SRAM Type' => 'Other',
+                'System Type' => 'Unified',
+                'Speed' => 'Unknown',
+                'Associativity' => 'Other',
+                'Location' => 'Internal',
+                'Maximum Size' => '6144 kB'
+            }
+        ],
+        '26' => [
+            {
+                'Nominal Value' => 'Unknown',
+                'Status' => '<OUT OF SPEC>',
+                'Minimum Value' => 'Unknown',
+                'OEM-specific Information' => '0x00000000',
+                'Accuracy' => 'Unknown',
+                'Maximum Value' => 'Unknown',
+                'Resolution' => 'Unknown',
+                'Location' => '<OUT OF SPEC>',
+                'Tolerance' => 'Unknown',
+                'Description' => 'LM78A'
+            },
+            {
+                'Nominal Value' => 'Unknown',
+                'Status' => '<OUT OF SPEC>',
+                'Minimum Value' => 'Unknown',
+                'OEM-specific Information' => '0x00000000',
+                'Accuracy' => 'Unknown',
+                'Maximum Value' => 'Unknown',
+                'Resolution' => 'Unknown',
+                'Location' => '<OUT OF SPEC>',
+                'Tolerance' => 'Unknown',
+                'Description' => 'LM78B'
+            },
+            {
+                'Nominal Value' => 'Unknown',
+                'Status' => '<OUT OF SPEC>',
+                'Minimum Value' => 'Unknown',
+                'OEM-specific Information' => '0x00000000',
+                'Accuracy' => 'Unknown',
+                'Maximum Value' => 'Unknown',
+                'Resolution' => 'Unknown',
+                'Location' => '<OUT OF SPEC>',
+                'Tolerance' => 'Unknown',
+                'Description' => 'LM78B'
+            }
+        ],
+        '17' => [
+            {
+                'Part Number' => 'Array1_PartNumber0',
+                'Serial Number' => 'SerNum0',
+                'Type Detail' => 'Synchronous',
+                'Set' => 'None',
+                'Type' => 'Unknown',
+                'Speed' => 'Unknown',
+                'Size' => 'No Module Installed',
+                'Manufacturer' => 'Manufacturer0',
+                'Bank Locator' => 'BANK0',
+                'Array Handle' => '0x0024',
+                'Data Width' => '64 bits',
+                'Total Width' => '64 bits',
+                'Asset Tag' => 'AssetTagNum0',
+                'Rank' => 'Unknown',
+                'Locator' => 'DIMM0',
+                'Error Information Handle' => 'No Error',
+                'Form Factor' => 'DIMM'
+            },
+            {
+                'Part Number' => 'F3-12800CL9-2GBXL',
+                'Serial Number' => '0000000',
+                'Type Detail' => 'Synchronous',
+                'Set' => 'None',
+                'Type' => '<OUT OF SPEC>',
+                'Speed' => '1600 MHz',
+                'Size' => '2048 MB',
+                'Manufacturer' => 'Undefined',
+                'Bank Locator' => 'BANK1',
+                'Array Handle' => '0x0024',
+                'Data Width' => '64 bits',
+                'Total Width' => '64 bits',
+                'Asset Tag' => 'AssetTagNum1',
+                'Rank' => '2',
+                'Locator' => 'DIMM1',
+                'Error Information Handle' => 'No Error',
+                'Form Factor' => 'DIMM'
+            },
+            {
+                'Part Number' => 'Array1_PartNumber2',
+                'Serial Number' => 'SerNum2',
+                'Type Detail' => 'Synchronous',
+                'Set' => 'None',
+                'Type' => 'Unknown',
+                'Speed' => 'Unknown',
+                'Size' => 'No Module Installed',
+                'Manufacturer' => 'Manufacturer2',
+                'Bank Locator' => 'BANK2',
+                'Array Handle' => '0x0024',
+                'Data Width' => '64 bits',
+                'Total Width' => '64 bits',
+                'Asset Tag' => 'AssetTagNum2',
+                'Rank' => 'Unknown',
+                'Locator' => 'DIMM2',
+                'Error Information Handle' => 'No Error',
+                'Form Factor' => 'DIMM'
+            },
+            {
+                'Part Number' => 'F3-12800CL9-2GBXL',
+                'Serial Number' => '0000000',
+                'Type Detail' => 'Synchronous',
+                'Set' => 'None',
+                'Type' => '<OUT OF SPEC>',
+                'Speed' => '1600 MHz',
+                'Size' => '2048 MB',
+                'Manufacturer' => 'Undefined',
+                'Bank Locator' => 'BANK3',
+                'Array Handle' => '0x0024',
+                'Data Width' => '64 bits',
+                'Total Width' => '64 bits',
+                'Asset Tag' => 'AssetTagNum3',
+                'Rank' => '2',
+                'Locator' => 'DIMM3',
+                'Error Information Handle' => 'No Error',
+                'Form Factor' => 'DIMM'
+            }
+        ],
+        '2' => [
+            {
+                'Product Name' => 'P8P67',
+                'Chassis Handle' => '0x0003',
+                'Serial Number' => 'MT7013K30709271',
+                'Asset Tag' => 'To be filled by O.E.M.',
+                'Version' => 'Rev 1.xx',
+                'Type' => 'Motherboard',
+                'Manufacturer' => 'ASUSTeK Computer INC.',
+                'Location In Chassis' => 'To be filled by O.E.M.',
+                'Contained Object Handles' => '0'
+            }
+        ],
+        '1' => [
+            {
+                'Product Name' => 'System Product Name',
+                'Family' => 'To be filled by O.E.M.',
+                'Serial Number' => 'System Serial Number',
+                'Version' => 'System Version',
+                'Wake-up Type' => 'Power Switch',
+                'SKU Number' => 'To be filled by O.E.M.',
+                'Manufacturer' => 'System manufacturer',
+                'UUID' => '1E00E6E0-008C-4400-9AAD-F46D04972D3E'
+            }
+        ],
+        '18' => [
+            {
+                'Memory Array Address' => 'Unknown',
+                'Vendor Syndrome' => 'Unknown',
+                'Granularity' => 'Unknown',
+                'Type' => 'OK',
+                'Resolution' => 'Unknown',
+                'Device Address' => 'Unknown',
+                'Operation' => 'Unknown'
+            },
+            {
+                'Memory Array Address' => 'Unknown',
+                'Vendor Syndrome' => 'Unknown',
+                'Granularity' => 'Unknown',
+                'Type' => 'OK',
+                'Resolution' => 'Unknown',
+                'Device Address' => 'Unknown',
+                'Operation' => 'Unknown'
+            },
+            {
+                'Memory Array Address' => 'Unknown',
+                'Vendor Syndrome' => 'Unknown',
+                'Granularity' => 'Unknown',
+                'Type' => 'OK',
+                'Resolution' => 'Unknown',
+                'Device Address' => 'Unknown',
+                'Operation' => 'Unknown'
+            },
+            {
+                'Memory Array Address' => 'Unknown',
+                'Vendor Syndrome' => 'Unknown',
+                'Granularity' => 'Unknown',
+                'Type' => 'OK',
+                'Resolution' => 'Unknown',
+                'Device Address' => 'Unknown',
+                'Operation' => 'Unknown'
+            },
+            {
+                'Memory Array Address' => 'Unknown',
+                'Vendor Syndrome' => 'Unknown',
+                'Granularity' => 'Unknown',
+                'Type' => 'OK',
+                'Resolution' => 'Unknown',
+                'Device Address' => 'Unknown',
+                'Operation' => 'Unknown'
+            }
+        ],
+        '0' => [
+            {
+                'Runtime Size' => '64 kB',
+                'Version' => '1503',
+                'BIOS Revision' => '4.6',
+                'Address' => '0xF0000',
+                'ROM Size' => '4096 kB',
+                'Release Date' => '03/10/2011',
+                'Vendor' => 'American Megatrends Inc.'
+            }
+        ],
+        '13' => [
+            {
+                'Installable Languages' => '6',
+                'Currently Installed Language' => 'eng'
+            }
+        ],
+        '16' => [
+            {
+                'Number Of Devices' => '4',
+                'Error Correction Type' => 'None',
+                'Error Information Handle' => 'No Error',
+                'Location' => 'System Board Or Motherboard',
+                'Maximum Capacity' => '32 GB',
+                'Use' => 'System Memory'
+            }
+        ],
+        '29' => [
+            {
+                'Nominal Value' => 'Unknown',
+                'Status' => '<OUT OF SPEC>',
+                'Minimum Value' => 'Unknown',
+                'OEM-specific Information' => '0x00000000',
+                'Accuracy' => 'Unknown',
+                'Maximum Value' => 'Unknown',
+                'Resolution' => 'Unknown',
+                'Location' => '<OUT OF SPEC>',
+                'Tolerance' => 'Unknown',
+                'Description' => 'ABC'
+            },
+            {
+                'Nominal Value' => 'Unknown',
+                'Status' => '<OUT OF SPEC>',
+                'Minimum Value' => 'Unknown',
+                'OEM-specific Information' => '0x00000000',
+                'Accuracy' => 'Unknown',
+                'Maximum Value' => 'Unknown',
+                'Resolution' => 'Unknown',
+                'Location' => '<OUT OF SPEC>',
+                'Tolerance' => 'Unknown',
+                'Description' => 'DEF'
+            },
+            {
+                'Nominal Value' => 'Unknown',
+                'Status' => '<OUT OF SPEC>',
+                'Minimum Value' => 'Unknown',
+                'OEM-specific Information' => '0x00000000',
+                'Accuracy' => 'Unknown',
+                'Maximum Value' => 'Unknown',
+                'Resolution' => 'Unknown',
+                'Location' => '<OUT OF SPEC>',
+                'Tolerance' => 'Unknown',
+                'Description' => 'GHI'
+            }
+        ],
+        '27' => [
+            {
+                'Temperature Probe Handle' => '0x0038',
+                'Type' => '<OUT OF SPEC>',
+                'Status' => '<OUT OF SPEC>',
+                'OEM-specific Information' => '0x00000000',
+                'Cooling Unit Group' => '1',
+                'Nominal Speed' => 'Unknown Or Non-rotating'
+            },
+            {
+                'Temperature Probe Handle' => '0x0038',
+                'Type' => '<OUT OF SPEC>',
+                'Status' => '<OUT OF SPEC>',
+                'OEM-specific Information' => '0x00000000',
+                'Cooling Unit Group' => '1',
+                'Nominal Speed' => 'Unknown Or Non-rotating'
+            },
+            {
+                'Temperature Probe Handle' => '0x004C',
+                'Type' => '<OUT OF SPEC>',
+                'Status' => '<OUT OF SPEC>',
+                'OEM-specific Information' => '0x00000000',
+                'Cooling Unit Group' => '1',
+                'Nominal Speed' => 'Unknown Or Non-rotating'
+            },
+            {
+                'Temperature Probe Handle' => '0x0052',
+                'Type' => '<OUT OF SPEC>',
+                'Status' => '<OUT OF SPEC>',
+                'OEM-specific Information' => '0x00000000',
+                'Cooling Unit Group' => '1',
+                'Nominal Speed' => 'Unknown Or Non-rotating'
+            }
+        ],
+        '39' => [
+            {
+                'Input Voltage Probe Handle' => '0x0035',
+                'Revision' => 'To Be Filled By O.E.M.',
+                'Input Voltage Range Switching' => '<OUT OF SPEC>',
+                'Serial Number' => 'To Be Filled By O.E.M.',
+                'Hot Replaceable' => 'No',
+                'Asset Tag' => 'To Be Filled By O.E.M.',
+                'Input Current Probe Handle' => '0x0041',
+                'Type' => '<OUT OF SPEC>',
+                'Model Part Number' => 'To Be Filled By O.E.M.',
+                'Cooling Device Handle' => '0x003B',
+                'Plugged' => 'Yes',
+                'Power Unit Group' => '1',
+                'Location' => 'To Be Filled By O.E.M.',
+                'Manufacturer' => 'To Be Filled By O.E.M.',
+                'Name' => 'To Be Filled By O.E.M.',
+                'Max Power Capacity' => 'Unknown'
+            },
+            {
+                'Input Voltage Probe Handle' => '0x0035',
+                'Revision' => 'To Be Filled By O.E.M.',
+                'Input Voltage Range Switching' => '<OUT OF SPEC>',
+                'Serial Number' => 'To Be Filled By O.E.M.',
+                'Hot Replaceable' => 'No',
+                'Asset Tag' => 'To Be Filled By O.E.M.',
+                'Input Current Probe Handle' => '0x0041',
+                'Type' => '<OUT OF SPEC>',
+                'Model Part Number' => 'To Be Filled By O.E.M.',
+                'Cooling Device Handle' => '0x003B',
+                'Plugged' => 'Yes',
+                'Power Unit Group' => '1',
+                'Location' => 'To Be Filled By O.E.M.',
+                'Manufacturer' => 'To Be Filled By O.E.M.',
+                'Name' => 'To Be Filled By O.E.M.',
+                'Max Power Capacity' => 'Unknown'
+            }
+        ],
+        '28' => [
+            {
+                'Nominal Value' => 'Unknown',
+                'Status' => '<OUT OF SPEC>',
+                'Minimum Value' => 'Unknown',
+                'OEM-specific Information' => '0x00000000',
+                'Accuracy' => 'Unknown',
+                'Maximum Value' => 'Unknown',
+                'Resolution' => 'Unknown',
+                'Location' => '<OUT OF SPEC>',
+                'Tolerance' => 'Unknown',
+                'Description' => 'LM78A'
+            },
+            {
+                'Nominal Value' => 'Unknown',
+                'Status' => '<OUT OF SPEC>',
+                'Minimum Value' => 'Unknown',
+                'OEM-specific Information' => '0x00000000',
+                'Accuracy' => 'Unknown',
+                'Maximum Value' => 'Unknown',
+                'Resolution' => 'Unknown',
+                'Location' => '<OUT OF SPEC>',
+                'Tolerance' => 'Unknown',
+                'Description' => 'LM78B'
+            },
+            {
+                'Nominal Value' => 'Unknown',
+                'Status' => '<OUT OF SPEC>',
+                'Minimum Value' => 'Unknown',
+                'OEM-specific Information' => '0x00000000',
+                'Accuracy' => 'Unknown',
+                'Maximum Value' => 'Unknown',
+                'Resolution' => 'Unknown',
+                'Location' => '<OUT OF SPEC>',
+                'Tolerance' => 'Unknown',
+                'Description' => 'LM78B'
+            }
+        ],
+        '36' => [
+            {
+                'Lower Non-critical Threshold' => '1',
+                'Upper Critical Threshold' => '4',
+                'Lower Critical Threshold' => '3',
+                'Lower Non-recoverable Threshold' => '5',
+                'Upper Non-recoverable Threshold' => '6',
+                'Upper Non-critical Threshold' => '2'
+            },
+            {
+                'Lower Non-critical Threshold' => '1',
+                'Upper Critical Threshold' => '4',
+                'Lower Critical Threshold' => '3',
+                'Lower Non-recoverable Threshold' => '5',
+                'Upper Non-recoverable Threshold' => '6',
+                'Upper Non-critical Threshold' => '2'
+            },
+            {
+                'Lower Non-critical Threshold' => '1',
+                'Upper Critical Threshold' => '4',
+                'Lower Critical Threshold' => '3',
+                'Lower Non-recoverable Threshold' => '5',
+                'Upper Non-recoverable Threshold' => '6',
+                'Upper Non-critical Threshold' => '2'
+            },
+            {
+                'Lower Non-critical Threshold' => '1',
+                'Upper Critical Threshold' => '4',
+                'Lower Critical Threshold' => '3',
+                'Lower Non-recoverable Threshold' => '5',
+                'Upper Non-recoverable Threshold' => '6',
+                'Upper Non-critical Threshold' => '2'
+            },
+            {
+                'Lower Non-critical Threshold' => '7',
+                'Upper Critical Threshold' => '10',
+                'Lower Critical Threshold' => '8',
+                'Lower Non-recoverable Threshold' => '11',
+                'Upper Non-recoverable Threshold' => '12',
+                'Upper Non-critical Threshold' => '8'
+            },
+            {
+                'Lower Non-critical Threshold' => '13',
+                'Upper Critical Threshold' => '16',
+                'Lower Critical Threshold' => '15',
+                'Lower Non-recoverable Threshold' => '17',
+                'Upper Non-recoverable Threshold' => '18',
+                'Upper Non-critical Threshold' => '14'
+            },
+            {
+                'Lower Non-critical Threshold' => '1',
+                'Upper Critical Threshold' => '4',
+                'Lower Critical Threshold' => '3',
+                'Lower Non-recoverable Threshold' => '5',
+                'Upper Non-recoverable Threshold' => '6',
+                'Upper Non-critical Threshold' => '2'
+            },
+            {
+                'Lower Non-critical Threshold' => '1',
+                'Upper Critical Threshold' => '4',
+                'Lower Critical Threshold' => '3',
+                'Lower Non-recoverable Threshold' => '5',
+                'Upper Non-recoverable Threshold' => '6',
+                'Upper Non-critical Threshold' => '2'
+            },
+            {
+                'Lower Non-critical Threshold' => '1',
+                'Upper Critical Threshold' => '4',
+                'Lower Critical Threshold' => '3',
+                'Lower Non-recoverable Threshold' => '5',
+                'Upper Non-recoverable Threshold' => '6',
+                'Upper Non-critical Threshold' => '2'
+            },
+            {
+                'Lower Non-critical Threshold' => '1',
+                'Upper Critical Threshold' => '4',
+                'Lower Critical Threshold' => '3',
+                'Lower Non-recoverable Threshold' => '5',
+                'Upper Non-recoverable Threshold' => '6',
+                'Upper Non-critical Threshold' => '2'
+            }
+        ],
+        '3' => [
+            {
+                'Height' => 'Unspecified',
+                'Power Supply State' => 'Safe',
+                'Serial Number' => 'Chassis Serial Number',
+                'Thermal State' => 'Safe',
+                'Contained Elements' => '0',
+                'Asset Tag' => 'Asset-1234567890',
+                'Type' => 'Desktop',
+                'Version' => 'Chassis Version',
+                'Number Of Power Cords' => '1',
+                'Security Status' => 'None',
+                'OEM Information' => '0x00000000',
+                'Manufacturer' => 'Chassis Manufacture',
+                'Boot-up State' => 'Safe'
+            }
+        ],
+        '9' => [
+            {
+                'Bus Address' => '0000:00:01.0',
+                'ID' => '1',
+                'Length' => 'Short',
+                'Designation' => 'PCIEX16_1',
+                'Type' => '32-bit PCI Express',
+                'Current Usage' => 'In Use'
+            },
+            {
+                'Bus Address' => '0000:00:1c.3',
+                'ID' => '2',
+                'Length' => 'Short',
+                'Designation' => 'PCIEX1_1',
+                'Type' => '32-bit PCI Express',
+                'Current Usage' => 'In Use'
+            },
+            {
+                'Bus Address' => '0000:00:1c.4',
+                'ID' => '3',
+                'Length' => 'Short',
+                'Designation' => 'PCIEX1_2',
+                'Type' => '32-bit PCI Express',
+                'Current Usage' => 'In Use'
+            },
+            {
+                'Bus Address' => '0000:00:1c.6',
+                'ID' => '4',
+                'Length' => 'Short',
+                'Designation' => 'PCI1',
+                'Type' => '32-bit PCI',
+                'Current Usage' => 'In Use'
+            }
+        ],
+        '41' => [
+            {
+                'Bus Address' => '0000:00:02.0',
+                'Type' => 'Video',
+                'Reference Designation' => ' Onboard IGD',
+                'Type Instance' => '1',
+                'Status' => 'Enabled'
+            },
+            {
+                'Bus Address' => '0000:00:19.0',
+                'Type' => 'Ethernet',
+                'Reference Designation' => ' Onboard LAN',
+                'Type Instance' => '1',
+                'Status' => 'Enabled'
+            },
+            {
+                'Bus Address' => '0000:03:1c.2',
+                'Type' => 'Other',
+                'Reference Designation' => ' Onboard 1394',
+                'Type Instance' => '1',
+                'Status' => 'Enabled'
+            }
+        ],
+        '12' => [
+            {
+                'Option 1' => 'To Be Filled By O.E.M.'
+            }
+        ],
+        '20' => [
+            {
+                'Memory Array Mapped Address Handle' => '0x0026',
+                'Range Size' => '2 GB',
+                'Physical Device Handle' => '0x002A',
+                'Partition Row Position' => '1',
+                'Starting Address' => '0x00000000000',
+                'Ending Address' => '0x0007FFFFFFF'
+            },
+            {
+                'Memory Array Mapped Address Handle' => '0x0026',
+                'Range Size' => '2 GB',
+                'Physical Device Handle' => '0x0030',
+                'Partition Row Position' => '1',
+                'Starting Address' => '0x00080000000',
+                'Ending Address' => '0x000FFFFFFFF'
+            }
+        ],
+        '8' => [
+            {
+                'External Reference Designator' => 'PS/2 Keyboard',
+                'Port Type' => 'Keyboard Port',
+                'External Connector Type' => 'PS/2',
+                'Internal Reference Designator' => 'PS/2 Keyboard',
+                'Internal Connector Type' => 'None'
+            },
+            {
+                'External Reference Designator' => 'USB9_10',
+                'Port Type' => 'USB',
+                'External Connector Type' => 'Access Bus (USB)',
+                'Internal Reference Designator' => 'USB9_10',
+                'Internal Connector Type' => 'None'
+            },
+            {
+                'External Reference Designator' => 'USB11_12',
+                'Port Type' => 'USB',
+                'External Connector Type' => 'Access Bus (USB)',
+                'Internal Reference Designator' => 'USB11_12',
+                'Internal Connector Type' => 'None'
+            },
+            {
+                'External Reference Designator' => 'GbE LAN',
+                'Port Type' => 'Network Port',
+                'External Connector Type' => 'RJ-45',
+                'Internal Reference Designator' => 'GbE LAN',
+                'Internal Connector Type' => 'None'
+            },
+            {
+                'External Reference Designator' => 'AUDIO',
+                'Port Type' => 'Audio Port',
+                'External Connector Type' => 'Other',
+                'Internal Reference Designator' => 'AUDIO',
+                'Internal Connector Type' => 'None'
+            },
+            {
+                'Port Type' => 'SATA',
+                'External Connector Type' => 'None',
+                'Internal Reference Designator' => 'SATA1',
+                'Internal Connector Type' => 'SAS/SATA Plug Receptacle'
+            },
+            {
+                'Port Type' => 'SATA',
+                'External Connector Type' => 'None',
+                'Internal Reference Designator' => 'SATA2',
+                'Internal Connector Type' => 'SAS/SATA Plug Receptacle'
+            },
+            {
+                'Port Type' => 'SATA',
+                'External Connector Type' => 'None',
+                'Internal Reference Designator' => 'SATA3',
+                'Internal Connector Type' => 'SAS/SATA Plug Receptacle'
+            },
+            {
+                'Port Type' => 'SATA',
+                'External Connector Type' => 'None',
+                'Internal Reference Designator' => 'SATA4',
+                'Internal Connector Type' => 'SAS/SATA Plug Receptacle'
+            },
+            {
+                'Port Type' => 'SATA',
+                'External Connector Type' => 'None',
+                'Internal Reference Designator' => 'SATA5',
+                'Internal Connector Type' => 'SAS/SATA Plug Receptacle'
+            },
+            {
+                'Port Type' => 'SATA',
+                'External Connector Type' => 'None',
+                'Internal Reference Designator' => 'SATA6',
+                'Internal Connector Type' => 'SAS/SATA Plug Receptacle'
+            },
+            {
+                'Port Type' => 'USB',
+                'External Connector Type' => 'None',
+                'Internal Reference Designator' => 'USB1_2',
+                'Internal Connector Type' => 'Access Bus (USB)'
+            },
+            {
+                'Port Type' => 'USB',
+                'External Connector Type' => 'None',
+                'Internal Reference Designator' => 'USB3_4',
+                'Internal Connector Type' => 'Access Bus (USB)'
+            },
+            {
+                'Port Type' => 'USB',
+                'External Connector Type' => 'None',
+                'Internal Reference Designator' => 'USB5_6',
+                'Internal Connector Type' => 'Access Bus (USB)'
+            },
+            {
+                'Port Type' => 'USB',
+                'External Connector Type' => 'None',
+                'Internal Reference Designator' => 'USB7_8',
+                'Internal Connector Type' => 'Access Bus (USB)'
+            },
+            {
+                'Port Type' => 'Audio Port',
+                'External Connector Type' => 'None',
+                'Internal Reference Designator' => 'AAFP',
+                'Internal Connector Type' => 'Mini Jack (headphones)'
+            },
+            {
+                'Port Type' => 'Other',
+                'External Connector Type' => 'None',
+                'Internal Reference Designator' => 'CPU_FAN',
+                'Internal Connector Type' => 'Other'
+            },
+            {
+                'Port Type' => 'Other',
+                'External Connector Type' => 'None',
+                'Internal Reference Designator' => 'CHA_FAN1',
+                'Internal Connector Type' => 'Other'
+            },
+            {
+                'Port Type' => 'Other',
+                'External Connector Type' => 'None',
+                'Internal Reference Designator' => 'PWR_FAN',
+                'Internal Connector Type' => 'Other'
+            },
+            {
+                'Port Type' => 'Other',
+                'External Connector Type' => 'None',
+                'Internal Reference Designator' => 'PATA_IDE',
+                'Internal Connector Type' => 'On Board IDE'
+            },
+            {
+                'Port Type' => 'SATA',
+                'External Connector Type' => 'None',
+                'Internal Reference Designator' => 'F_ESATA',
+                'Internal Connector Type' => 'SAS/SATA Plug Receptacle'
+            }
+        ],
+        '4' => [
+            {
+                'ID' => 'A7 06 02 00 FF FB EB BF',
+                'Socket Designation' => 'LGA1155',
+                'Part Number' => 'To Be Filled By O.E.M.',
+                'Status' => 'Populated, Enabled',
+                'Max Speed' => '3800 MHz',
+                'Serial Number' => 'To Be Filled By O.E.M.',
+                'Family' => 'Core 2 Duo',
+                'Current Speed' => '2800 MHz',
+                'L2 Cache Handle' => '0x0006',
+                'Type' => 'Central Processor',
+                'Signature' => 'Type 0, Family 6, Model 42, Stepping 7',
+                'L1 Cache Handle' => '0x0005',
+                'Manufacturer' => 'Intel',
+                'Core Enabled' => '1',
+                'External Clock' => '100 MHz',
+                'Asset Tag' => 'To Be Filled By O.E.M.',
+                'Version' => 'Intel(R) Core(TM) i5-2300 CPU @ 2.80GHz',
+                'Core Count' => '4',
+                'Upgrade' => 'Other',
+                'Voltage' => '1.0 V',
+                'L3 Cache Handle' => '0x0007'
+            }
+        ],
+        '34' => [
+            {
+                'Type' => 'LM78',
+                'Address Type' => 'I/O Port',
+                'Address' => '0x00000000',
+                'Description' => 'LM78-1'
+            },
+            {
+                'Type' => 'LM78',
+                'Address Type' => 'I/O Port',
+                'Address' => '0x00000000',
+                'Description' => '2'
+            }
+        ],
+        '10' => [
+            {
+                'Type' => 'Ethernet',
+                'Status' => 'Enabled',
+                'Description' => 'Onboard Ethernet'
+            }
+        ],
+        '19' => [
+            {
+                'Range Size' => '4 GB',
+                'Partition Width' => '0',
+                'Starting Address' => '0x00000000000',
+                'Physical Array Handle' => '0x0024',
+                'Ending Address' => '0x000FFFFFFFF'
+            }
+        ]
     }
 );
 
@@ -4779,6 +5934,30 @@ my %cpu_tests = (
             MANUFACTURER   => 'GenuineIntel',
             CORE           => undef
         }
+    ],
+    'windows-xppro' => [
+        {
+            ID             => '76 06 01 00 FF FB EB BF',
+            NAME           => 'Core 2 Duo',
+            EXTERNAL_CLOCK => '266',
+            SPEED          => '2534',
+            THREAD         => '2',
+            SERIAL         => undef,
+            MANUFACTURER   => 'Intel',
+            CORE           => '2'
+        }
+    ],
+    'windows-7' => [
+        {
+            ID             => 'A7 06 02 00 FF FB EB BF',
+            NAME           => 'Core 2 Duo',
+            EXTERNAL_CLOCK => '100',
+            SPEED          => '2800',
+            THREAD         => undef,
+            SERIAL         => 'To Be Filled By O.E.M.',
+            MANUFACTURER   => 'Intel',
+            CORE           => '4'
+        }
     ]
 );
 
@@ -5009,12 +6188,13 @@ foreach my $test (keys %dmidecode_tests) {
     my $file = "resources/generic/dmidecode/$test";
     my $infos = getDmidecodeInfos(file => $file);
     is_deeply($infos, $dmidecode_tests{$test}, "$test dmidecode parsing");
+    use Data::Dumper;
 }
 
 foreach my $test (keys %cpu_tests) {
     my $file = "resources/generic/dmidecode/$test";
     my @cpus = getCpusFromDmidecode(file => $file);
-    is_deeply(\@cpus, $cpu_tests{$test}, "$test dmidecode cpu extraction");
+    is_deeply(\@cpus, $cpu_tests{$test}, "$test dmidecode cpu extraction") or print Dumper(\@cpus);
 }
 
 foreach my $test (keys %lspci_tests) {
diff --git a/t/tools/network.t b/t/tools/network.t
index 915d24e..6bb1121 100755
--- a/t/tools/network.t
+++ b/t/tools/network.t
@@ -67,7 +67,7 @@ foreach my $test (@alt2canonical_tests) {
 
 foreach my $test (@mask_tests) {
     is(
-        getNetworkMask($test->[0], $test->[1]),
+        getNetworkMask($test->[1]),
         $test->[2],
         "$test->[0]/$test->[1] mask extraction"
     );


================================================================
  Commit: 3f4cb9525edef111355302aa0b1ded8b4be1c783
      https://github.com/fusinv/fusioninventory-agent/commit/3f4cb9525edef111355302aa0b1ded8b4be1c783
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-05 (Mon, 05 Mar 2012)

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

  Log Message:
  -----------
  only set a signal handler if needed


diff --git a/lib/FusionInventory/Agent/Tools.pm b/lib/FusionInventory/Agent/Tools.pm
index 0e8e17d..fb2acf2 100644
--- a/lib/FusionInventory/Agent/Tools.pm
+++ b/lib/FusionInventory/Agent/Tools.pm
@@ -442,9 +442,12 @@ sub runFunction {
 
     my $result;
     eval {
-        # set 
-        local $SIG{ALRM} = sub { die "alarm\n" };
-        alarm $params{timeout} if $params{timeout};
+        # set a timeout if needed
+        if ($params{timeout}) {
+            local $SIG{ALRM} = sub { die "alarm\n" };
+            alarm $params{timeout};
+        }
+
         no strict 'refs'; ## no critic
         $result = &{$params{module} . '::' . $params{function}}(
             ref $params{params} eq 'HASH'  ? %{$params{params}} :


================================================================
  Commit: 1f5f0fb7775837489773161d1ff042059f603183
      https://github.com/fusinv/fusioninventory-agent/commit/1f5f0fb7775837489773161d1ff042059f603183
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-05 (Mon, 05 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm

  Log Message:
  -----------
  don't access registry directly


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
index f69806b..6483daa 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
@@ -114,29 +114,12 @@ sub _getScreensFromWindows {
         };
     }
 
-    my $Registry;
-    Win32::TieRegistry->require();
-    Win32::TieRegistry->import(
-        Delimiter   => '/',
-        ArrayValues => 0,
-        TiedRef     => \$Registry
-    );
-
-    my $access = FusionInventory::Agent::Tools::Win32::is64bit() ?
-	Win32::TieRegistry::KEY_READ() |
-	    FusionInventory::Agent::Tools::Win32::KEY_WOW64_64() :
-	Win32::TieRegistry::KEY_READ();
-
     foreach my $screen (@screens) {
-
-        my $machKey = $Registry->Open('LMachine', {
-            Access => $access
-        } ) or $logger->fault(
-            "Can't open HKEY_LOCAL_MACHINE key: $EXTENDED_OS_ERROR"
-        );
-
         $screen->{edid} =
-            $machKey->{"SYSTEM/CurrentControlSet/Enum/$screen->{id}/Device Parameters/EDID"} || '';
+            FusionInventory::Agent::Tools::Win32::getRegistryValue(
+                path => "HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Enum/$screen->{id}/Device Parameters/EDID",
+                logger => $logger
+        ) || '';
         $screen->{edid} =~ s/^\s+$//;
 
     }


================================================================
  Commit: e472cabb9e451f30450610329b11481f36bb3152
      https://github.com/fusinv/fusioninventory-agent/commit/e472cabb9e451f30450610329b11481f36bb3152
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-05 (Mon, 05 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm

  Log Message:
  -----------
  use use() method to import symbols at runtime


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
index 6483daa..9be6880 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
@@ -71,7 +71,7 @@ sub doInventory {
 sub _getScreensFromWindows {
     my ($logger) = @_;
 
-    FusionInventory::Agent::Tools::Win32->require();
+    FusionInventory::Agent::Tools::Win32->use();
     if ($EVAL_ERROR) {
         print
             "Failed to load FusionInventory::Agent::Tools::Win32: $EVAL_ERROR";
@@ -81,7 +81,7 @@ sub _getScreensFromWindows {
     my @screens;
 
     # Vista and upper, able to get the second screen
-    foreach my $object (FusionInventory::Agent::Tools::Win32::getWmiObjects(
+    foreach my $object (getWmiObjects(
         moniker    => 'winmgmts:{impersonationLevel=impersonate,authenticationLevel=Pkt}!//./root/wmi',
         class      => 'WMIMonitorID',
         properties => [ qw/InstanceName/ ]
@@ -95,7 +95,7 @@ sub _getScreensFromWindows {
     }
 
     # The generic Win32_DesktopMonitor class, the second screen will be missing
-    foreach my $object (FusionInventory::Agent::Tools::Win32::getWmiObjects(
+    foreach my $object (getWmiObjects(
         class => 'Win32_DesktopMonitor',
         properties => [ qw/
             Caption MonitorManufacturer MonitorType PNPDeviceID
@@ -115,13 +115,11 @@ sub _getScreensFromWindows {
     }
 
     foreach my $screen (@screens) {
-        $screen->{edid} =
-            FusionInventory::Agent::Tools::Win32::getRegistryValue(
-                path => "HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Enum/$screen->{id}/Device Parameters/EDID",
-                logger => $logger
+        $screen->{edid} = getRegistryValue(
+            path => "HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Enum/$screen->{id}/Device Parameters/EDID",
+            logger => $logger
         ) || '';
         $screen->{edid} =~ s/^\s+$//;
-
     }
 
     return @screens;


================================================================
  Commit: 8028a335e4527d392ed1fa2f17f2da3c9ac189f9
      https://github.com/fusinv/fusioninventory-agent/commit/8028a335e4527d392ed1fa2f17f2da3c9ac189f9
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-05 (Mon, 05 Mar 2012)

  Changed paths:
    M Changes

  Log Message:
  -----------
  add AIX LVM support, rephrase IP usage on Linux


diff --git a/Changes b/Changes
index a6da7ba..34b6676 100644
--- a/Changes
+++ b/Changes
@@ -56,8 +56,9 @@ Major changes:
 
 Minor changes:
 * Add the HARDWARE/CHASSIS_TYPE information
-* Linux: Use /sbin/ip to get the interface IP addresses (#854)
+* Linux: report all IP addresses used by each interfaces (#854)
 * HPUX: don't report unoccupied memory slots
+* AIX: add LVM support
 
 2.1.14  Wed, 22 Feb 2012 14:56:51 -0000
 


================================================================
  Commit: 78b59781573380bc4d4f9af7e0facdd7366ceb8e
      https://github.com/fusinv/fusioninventory-agent/commit/78b59781573380bc4d4f9af7e0facdd7366ceb8e
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-05 (Mon, 05 Mar 2012)

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

  Log Message:
  -----------
  make signal handler conditional only

Using a conditional block actually makes the handler local to
conditional scope


diff --git a/lib/FusionInventory/Agent/Tools.pm b/lib/FusionInventory/Agent/Tools.pm
index fb2acf2..bc61bbf 100644
--- a/lib/FusionInventory/Agent/Tools.pm
+++ b/lib/FusionInventory/Agent/Tools.pm
@@ -443,10 +443,8 @@ sub runFunction {
     my $result;
     eval {
         # set a timeout if needed
-        if ($params{timeout}) {
-            local $SIG{ALRM} = sub { die "alarm\n" };
-            alarm $params{timeout};
-        }
+        local $SIG{ALRM} = sub { die "alarm\n" } if $params{timeout};
+        alarm $params{timeout};
 
         no strict 'refs'; ## no critic
         $result = &{$params{module} . '::' . $params{function}}(


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

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

  Log Message:
  -----------
  too much work to fix the warnings


diff --git a/lib/FusionInventory/Agent/Tools/Screen.pm b/lib/FusionInventory/Agent/Tools/Screen.pm
index 6c4c320..f2cd98c 100644
--- a/lib/FusionInventory/Agent/Tools/Screen.pm
+++ b/lib/FusionInventory/Agent/Tools/Screen.pm
@@ -207,6 +207,8 @@ sub checkParsedEdid {
 sub parseEdid {
     my ($raw_edid) = @_;
 
+    no warnings 'uninitialized';
+
     my %edid;
     my @vals = unpack(join('', map { $_->[0] } @edid_info), $raw_edid);
     my $i;


================================================================
  Commit: 7ff6fb8a23e74251cef36d9e7bd366f5b72c6270
      https://github.com/fusinv/fusioninventory-agent/commit/7ff6fb8a23e74251cef36d9e7bd366f5b72c6270
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-05 (Mon, 05 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm

  Log Message:
  -----------
  drop limitation

as long as it can be parsed, there is no use to restrict input


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
index 9be6880..e9771cb 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
@@ -134,10 +134,9 @@ sub _getScreensFromUnix {
     if (!$raw_edid) {
         foreach (1..5) { # Sometime get-edid return an empty string...
             $raw_edid = getFirstLine(command => 'get-edid');
-            last if $raw_edid && (length($raw_edid) == 128 || length($raw_edid) == 256);
+            last if $raw_edid;
         }
     }
-    return unless length($raw_edid) == 128 || length($raw_edid) == 256;
 
     return ( { edid => $raw_edid } );
 }


================================================================
  Commit: 25b8360c6d15f5666aa192b3f01079ac7a63fc8d
      https://github.com/fusinv/fusioninventory-agent/commit/25b8360c6d15f5666aa192b3f01079ac7a63fc8d
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-05 (Mon, 05 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm

  Log Message:
  -----------
  simpler variable name


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
index e9771cb..301031b 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
@@ -127,18 +127,18 @@ sub _getScreensFromWindows {
 
 sub _getScreensFromUnix {
 
-    my $raw_edid =
+    my $edid =
         getFirstLine(command => 'monitor-get-edid-using-vbe') ||
         getFirstLine(command => 'monitor-get-edid');
 
-    if (!$raw_edid) {
+    if (!$edid) {
         foreach (1..5) { # Sometime get-edid return an empty string...
-            $raw_edid = getFirstLine(command => 'get-edid');
-            last if $raw_edid;
+            $edid = getFirstLine(command => 'get-edid');
+            last if $edid;
         }
     }
 
-    return ( { edid => $raw_edid } );
+    return ( { edid => $edid } );
 }
 
 sub _getScreens {


================================================================
  Commit: 5a7179a71be87a07b15e2caf88d5b15e639328c2
      https://github.com/fusinv/fusioninventory-agent/commit/5a7179a71be87a07b15e2caf88d5b15e639328c2
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-05 (Mon, 05 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm

  Log Message:
  -----------
  drop raw edid after usage


There was an error trying to read the diff from github.com (execution expired)

================================================================
  Commit: 76cf105aacd2f5dfa7cb712951ad6a4ccae19267
      https://github.com/fusinv/fusioninventory-agent/commit/76cf105aacd2f5dfa7cb712951ad6a4ccae19267
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-05 (Mon, 05 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm

  Log Message:
  -----------
  use uppercase for final attributes


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
index 3a71179..04c839c 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
@@ -110,10 +110,10 @@ sub _getScreensFromWindows {
 
         push @screens, {
             id           => $object->{PNPDeviceID},
-            name         => $object->{Caption},
-            type         => $object->{MonitorType},
-            manufacturer => $object->{MonitorManufacturer},
-            caption      => $object->{Caption}
+            NAME         => $object->{Caption},
+            TYPE         => $object->{MonitorType},
+            MANUFACTURER => $object->{MonitorManufacturer},
+            CAPTION      => $object->{Caption}
         };
     }
 


================================================================
  Commit: 1adcc3b02c194292568acfcb88d3258ba9b6adaf
      https://github.com/fusinv/fusioninventory-agent/commit/1adcc3b02c194292568acfcb88d3258ba9b6adaf
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-05 (Mon, 05 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm

  Log Message:
  -----------
  drop temporary attributes after usage


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
index 04c839c..903297d 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
@@ -60,7 +60,6 @@ sub doInventory {
             }
             $screen->{BASE64} = encode_base64($screen->{edid});
 
-            # drop temporary variable
             delete $screen->{edid};
         }
 
@@ -118,11 +117,13 @@ sub _getScreensFromWindows {
     }
 
     foreach my $screen (@screens) {
+        next unless $screen->{id};
         $screen->{edid} = getRegistryValue(
             path => "HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Enum/$screen->{id}/Device Parameters/EDID",
             logger => $logger
         ) || '';
         $screen->{edid} =~ s/^\s+$//;
+        delete $screen->{id};
     }
 
     return @screens;


================================================================
  Commit: 39327a69d99495e0c6f98e6b9080dd78b4d469f7
      https://github.com/fusinv/fusioninventory-agent/commit/39327a69d99495e0c6f98e6b9080dd78b4d469f7
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-05 (Mon, 05 Mar 2012)

  Changed paths:
    M README

  Log Message:
  -----------
  Merge remote-tracking branch 'forge/2.2.x' into 2.2.x


diff --git a/README b/README
index de519d3..893398d 100644
--- a/README
+++ b/README
@@ -61,6 +61,12 @@ System-specific informations
 On Solaris/SPARC, you must install sneep and record the Serial Number with it.
 Download it from http://www.sun.com/download/products.xml?id=4304155a.
 
+The Windows installer will run the agent with the SYSTEM account. If you use
+an user GPO to configure the printer, the information will hidden and so not
+collected.
+To avoid this situation, you can turn off the server, and run the agent with
+user privilege, for example during the login.
+
 On Windows, if you don't want to use the installer for Windows you can follow
 the installation process avalailable from
 http://forge.fusioninventory.org/projects/fusioninventory-agent/wiki/RunAgentWin32.


================================================================
  Commit: dc6ecfea608b9f44b5c4d9d11230b3d270d36e93
      https://github.com/fusinv/fusioninventory-agent/commit/dc6ecfea608b9f44b5c4d9d11230b3d270d36e93
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-06 (Tue, 06 Mar 2012)

  Changed paths:
    A resources/virtualization/vboxmanage/sample2
    M t/inventory/virtualization/virtualbox.t

  Log Message:
  -----------
  add a second sample


diff --git a/resources/virtualization/vboxmanage/sample2 b/resources/virtualization/vboxmanage/sample2
new file mode 100644
index 0000000..c17bc54
--- /dev/null
+++ b/resources/virtualization/vboxmanage/sample2
@@ -0,0 +1,877 @@
+Name:            FreeBSD8 i386
+Guest OS:        FreeBSD
+UUID:            d1857d13-a67f-4ba9-a3e6-101e42f59268
+Config file:     /home/ddurieux/.VirtualBox/Machines/FreeBSD8 i386/FreeBSD8 i386.xml
+Hardware UUID:   d1857d13-a67f-4ba9-a3e6-101e42f59268
+Memory size:     512MB
+Page Fusion:     off
+VRAM size:       7MB
+HPET:            off
+Number of CPUs:  1
+Synthetic Cpu:   off
+CPUID overrides: None
+Boot menu mode:  message and menu
+Boot Device (1): DVD
+Boot Device (2): HardDisk
+Boot Device (3): Not Assigned
+Boot Device (4): Not Assigned
+ACPI:            on
+IOAPIC:          off
+PAE:             on
+Time offset:     0 ms
+RTC:             local time
+Hardw. virt.ext: on
+Hardw. virt.ext exclusive: on
+Nested Paging:   on
+Large Pages:     off
+VT-x VPID:       on
+State:           running (since 2011-03-13T14:01:14.757000000)
+Monitor count:   1
+3D Acceleration: on
+2D Video Acceleration: off
+Teleporter Enabled: off
+Teleporter Port: 0
+Teleporter Address: 
+Teleporter Password: 
+Storage Controller Name (0):            IDE Controller
+Storage Controller Type (0):            PIIX4
+Storage Controller Instance Number (0): 0
+Storage Controller Max Port Count (0):  2
+Storage Controller Port Count (0):      2
+Storage Controller Name (1):            Floppy Controller
+Storage Controller Type (1):            I82078
+Storage Controller Instance Number (1): 0
+Storage Controller Max Port Count (1):  1
+Storage Controller Port Count (1):      1
+IDE Controller (0, 0): /Donnees/VirtualBox/freebsd8_amd64.vdi (UUID: 4fa8cc39-3258-43bb-ad83-53fd2a369cca)
+IDE Controller (1, 0): Empty
+Floppy Controller (0, 0): Empty
+NIC 1:           MAC: 080027D2B03A, Attachment: Bridged Interface 'em0', Cable connected: on, Trace: off (file: none), Type: 82540EM, Reported speed: 0 Mbps, Boot priority: 0
+NIC 2:           disabled
+NIC 3:           disabled
+NIC 4:           disabled
+NIC 5:           disabled
+NIC 6:           disabled
+NIC 7:           disabled
+NIC 8:           disabled
+Pointing Device: PS/2 Mouse
+Keyboard Device: PS/2 Keyboard
+UART 1:          disabled
+UART 2:          disabled
+Audio:           enabled (Driver: OSS, Controller: AC97)
+Clipboard Mode:  Bidirectional
+USB:             disabled
+Shared folders:  <none>
+
+Guest:
+
+Configured memory balloon size:      0 MB
+
+
+Name:            Windows2000 (fusion agent)
+Guest OS:        Windows 2000
+UUID:            f8d4f838-aaa4-4f9b-b756-f95bc8d9cceb
+Config file:     /home/ddurieux/.VirtualBox/Machines/Windows2000 (fusion agent)/Windows2000 (fusion agent).xml
+Hardware UUID:   f8d4f838-aaa4-4f9b-b756-f95bc8d9cceb
+Memory size:     512MB
+Page Fusion:     off
+VRAM size:       16MB
+HPET:            off
+Number of CPUs:  1
+Synthetic Cpu:   off
+CPUID overrides: None
+Boot menu mode:  message and menu
+Boot Device (1): Floppy
+Boot Device (2): DVD
+Boot Device (3): HardDisk
+Boot Device (4): Not Assigned
+ACPI:            on
+IOAPIC:          off
+PAE:             on
+Time offset:     0 ms
+RTC:             local time
+Hardw. virt.ext: on
+Hardw. virt.ext exclusive: on
+Nested Paging:   on
+Large Pages:     off
+VT-x VPID:       on
+State:           powered off (since 2011-03-04T15:45:00.000000000)
+Monitor count:   1
+3D Acceleration: off
+2D Video Acceleration: off
+Teleporter Enabled: off
+Teleporter Port: 0
+Teleporter Address: 
+Teleporter Password: 
+Storage Controller Name (0):            IDE Controller
+Storage Controller Type (0):            PIIX4
+Storage Controller Instance Number (0): 0
+Storage Controller Max Port Count (0):  2
+Storage Controller Port Count (0):      2
+Storage Controller Name (1):            Floppy Controller
+Storage Controller Type (1):            I82078
+Storage Controller Instance Number (1): 0
+Storage Controller Max Port Count (1):  1
+Storage Controller Port Count (1):      1
+IDE Controller (0, 0): /Donnees/VirtualBox/Windows2000.vdi (UUID: caab3ce1-18ff-4de3-a69d-e5436fbcf208)
+IDE Controller (1, 0): Empty
+Floppy Controller (0, 0): Empty
+NIC 1:           MAC: 0800274249D6, Attachment: Bridged Interface 'em0', Cable connected: on, Trace: off (file: none), Type: Am79C973, Reported speed: 0 Mbps, Boot priority: 0
+NIC 2:           disabled
+NIC 3:           disabled
+NIC 4:           disabled
+NIC 5:           disabled
+NIC 6:           disabled
+NIC 7:           disabled
+NIC 8:           disabled
+Pointing Device: PS/2 Mouse
+Keyboard Device: PS/2 Keyboard
+UART 1:          disabled
+UART 2:          disabled
+Audio:           enabled (Driver: OSS, Controller: AC97)
+Clipboard Mode:  Bidirectional
+USB:             disabled
+Shared folders:  <none>
+
+Guest:
+
+Configured memory balloon size:      0 MB
+
+
+Name:            Centos
+Guest OS:        Other Linux
+UUID:            2cbb51b4-503c-4b5e-a6a5-878851a04658
+Config file:     /home/ddurieux/.VirtualBox/Machines/Centos/Centos.xml
+Hardware UUID:   2cbb51b4-503c-4b5e-a6a5-878851a04658
+Memory size:     776MB
+Page Fusion:     off
+VRAM size:       12MB
+HPET:            off
+Number of CPUs:  1
+Synthetic Cpu:   off
+CPUID overrides: None
+Boot menu mode:  message and menu
+Boot Device (1): Floppy
+Boot Device (2): DVD
+Boot Device (3): HardDisk
+Boot Device (4): Not Assigned
+ACPI:            on
+IOAPIC:          off
+PAE:             on
+Time offset:     0 ms
+RTC:             local time
+Hardw. virt.ext: on
+Hardw. virt.ext exclusive: on
+Nested Paging:   on
+Large Pages:     off
+VT-x VPID:       on
+State:           powered off (since 2010-10-27T18:35:57.000000000)
+Monitor count:   1
+3D Acceleration: off
+2D Video Acceleration: off
+Teleporter Enabled: off
+Teleporter Port: 0
+Teleporter Address: 
+Teleporter Password: 
+Storage Controller Name (0):            IDE Controller
+Storage Controller Type (0):            PIIX4
+Storage Controller Instance Number (0): 0
+Storage Controller Max Port Count (0):  2
+Storage Controller Port Count (0):      2
+Storage Controller Name (1):            Floppy Controller
+Storage Controller Type (1):            I82078
+Storage Controller Instance Number (1): 0
+Storage Controller Max Port Count (1):  1
+Storage Controller Port Count (1):      1
+IDE Controller (1, 0): Empty
+Floppy Controller (0, 0): Empty
+NIC 1:           MAC: 080027433DD8, Attachment: Bridged Interface 're0', Cable connected: on, Trace: off (file: none), Type: Am79C973, Reported speed: 0 Mbps, Boot priority: 0
+NIC 2:           disabled
+NIC 3:           disabled
+NIC 4:           disabled
+NIC 5:           disabled
+NIC 6:           disabled
+NIC 7:           disabled
+NIC 8:           disabled
+Pointing Device: PS/2 Mouse
+Keyboard Device: PS/2 Keyboard
+UART 1:          disabled
+UART 2:          disabled
+Audio:           enabled (Driver: OSS, Controller: AC97)
+Clipboard Mode:  Bidirectional
+USB:             disabled
+Shared folders:  <none>
+
+Guest:
+
+Configured memory balloon size:      0 MB
+
+
+Name:            windows 7 RU
+Guest OS:        Windows 7
+UUID:            c404fff7-67bf-4b9c-95cc-19c6b27bcd5f
+Config file:     /home/ddurieux/.VirtualBox/Machines/windows 7 RU/windows 7 RU.xml
+Hardware UUID:   c404fff7-67bf-4b9c-95cc-19c6b27bcd5f
+Memory size:     512MB
+Page Fusion:     off
+VRAM size:       16MB
+HPET:            off
+Number of CPUs:  1
+Synthetic Cpu:   off
+CPUID overrides: None
+Boot menu mode:  message and menu
+Boot Device (1): DVD
+Boot Device (2): HardDisk
+Boot Device (3): Not Assigned
+Boot Device (4): Not Assigned
+ACPI:            on
+IOAPIC:          off
+PAE:             on
+Time offset:     0 ms
+RTC:             UTC
+Hardw. virt.ext: on
+Hardw. virt.ext exclusive: on
+Nested Paging:   on
+Large Pages:     off
+VT-x VPID:       on
+State:           powered off (since 2011-03-10T23:59:30.000000000)
+Monitor count:   1
+3D Acceleration: off
+2D Video Acceleration: off
+Teleporter Enabled: off
+Teleporter Port: 0
+Teleporter Address: 
+Teleporter Password: 
+Storage Controller Name (0):            IDE Controller
+Storage Controller Type (0):            PIIX4
+Storage Controller Instance Number (0): 0
+Storage Controller Max Port Count (0):  2
+Storage Controller Port Count (0):      2
+Storage Controller Name (1):            SATA Controller
+Storage Controller Type (1):            IntelAhci
+Storage Controller Instance Number (1): 0
+Storage Controller Max Port Count (1):  30
+Storage Controller Port Count (1):      1
+IDE Controller (1, 0): /usr/local/lib/virtualbox/additions/VBoxGuestAdditions.iso (UUID: 4a07bd49-5a93-451e-a1ee-79e733e415b8)
+SATA Controller (0, 0): /Donnees/VirtualBox/windows7.vdi (UUID: 7c53566d-688d-45bf-ad8e-9ca30e9780b1)
+NIC 1:           MAC: 080027FDBC2F, Attachment: NAT, Cable connected: on, Trace: off (file: none), Type: 82540EM, Reported speed: 0 Mbps, Boot priority: 0
+NIC 1 Settings:  MTU: 0, Socket( send: 64, receive: 64), TCP Window( send:64, receive: 64)
+NIC 2:           disabled
+NIC 3:           disabled
+NIC 4:           disabled
+NIC 5:           disabled
+NIC 6:           disabled
+NIC 7:           disabled
+NIC 8:           disabled
+Pointing Device: PS/2 Mouse
+Keyboard Device: PS/2 Keyboard
+UART 1:          disabled
+UART 2:          disabled
+Audio:           enabled (Driver: OSS, Controller: AC97)
+Clipboard Mode:  Bidirectional
+USB:             disabled
+Shared folders:  <none>
+
+Guest:
+
+Configured memory balloon size:      0 MB
+
+
+Name:            Windows XP
+Guest OS:        Windows XP
+UUID:            3fd80a8f-ed78-4421-9192-c0af6f5f66d5
+Config file:     /home/ddurieux/.VirtualBox/Machines/Windows XP/Windows XP.xml
+Hardware UUID:   3fd80a8f-ed78-4421-9192-c0af6f5f66d5
+Memory size:     512MB
+Page Fusion:     off
+VRAM size:       16MB
+HPET:            off
+Number of CPUs:  1
+Synthetic Cpu:   off
+CPUID overrides: None
+Boot menu mode:  message and menu
+Boot Device (1): DVD
+Boot Device (2): HardDisk
+Boot Device (3): Not Assigned
+Boot Device (4): Not Assigned
+ACPI:            on
+IOAPIC:          off
+PAE:             on
+Time offset:     0 ms
+RTC:             local time
+Hardw. virt.ext: on
+Hardw. virt.ext exclusive: on
+Nested Paging:   on
+Large Pages:     off
+VT-x VPID:       on
+State:           running (since 2011-03-13T14:00:58.778000000)
+Monitor count:   1
+3D Acceleration: off
+2D Video Acceleration: off
+Teleporter Enabled: off
+Teleporter Port: 0
+Teleporter Address: 
+Teleporter Password: 
+Storage Controller Name (0):            IDE Controller
+Storage Controller Type (0):            PIIX4
+Storage Controller Instance Number (0): 0
+Storage Controller Max Port Count (0):  2
+Storage Controller Port Count (0):      2
+IDE Controller (0, 0): /home/ddurieux/.VirtualBox/Machines/Windows XP/Snapshots/{b04c6003-0921-4fac-a3c0-e4082146b17a}.vdi (UUID: b04c6003-0921-4fac-a3c0-e4082146b17a)
+IDE Controller (1, 0): /usr/local/lib/virtualbox/additions/VBoxGuestAdditions.iso (UUID: 4a07bd49-5a93-451e-a1ee-79e733e415b8)
+NIC 1:           MAC: 080027B70ED3, Attachment: NAT, Cable connected: on, Trace: off (file: none), Type: Am79C973, Reported speed: 0 Mbps, Boot priority: 0
+NIC 1 Settings:  MTU: 0, Socket( send: 64, receive: 64), TCP Window( send:64, receive: 64)
+NIC 2:           disabled
+NIC 3:           disabled
+NIC 4:           disabled
+NIC 5:           disabled
+NIC 6:           disabled
+NIC 7:           disabled
+NIC 8:           disabled
+Pointing Device: PS/2 Mouse
+Keyboard Device: PS/2 Keyboard
+UART 1:          disabled
+UART 2:          disabled
+Audio:           enabled (Driver: OSS, Controller: AC97)
+Clipboard Mode:  Bidirectional
+USB:             disabled
+Shared folders:  <none>
+
+Guest:
+
+Configured memory balloon size:      0 MB
+
+Snapshots:
+
+   Name: Finished install (UUID: a434889c-08c8-4ff6-8730-e3751224c03e) *
+
+Name:            windowsxp01
+Guest OS:        Windows XP
+UUID:            c7608d9d-c76c-4dab-8411-2784deb4eb1f
+Config file:     /home/ddurieux/.VirtualBox/Machines/windowsxp01/windowsxp01.xml
+Hardware UUID:   c7608d9d-c76c-4dab-8411-2784deb4eb1f
+Memory size:     256MB
+Page Fusion:     off
+VRAM size:       16MB
+HPET:            off
+Number of CPUs:  1
+Synthetic Cpu:   off
+CPUID overrides: None
+Boot menu mode:  message and menu
+Boot Device (1): Floppy
+Boot Device (2): DVD
+Boot Device (3): HardDisk
+Boot Device (4): Not Assigned
+ACPI:            on
+IOAPIC:          off
+PAE:             off
+Time offset:     0 ms
+RTC:             local time
+Hardw. virt.ext: on
+Hardw. virt.ext exclusive: on
+Nested Paging:   on
+Large Pages:     off
+VT-x VPID:       on
+State:           powered off (since 2010-07-20T17:53:58.000000000)
+Monitor count:   1
+3D Acceleration: off
+2D Video Acceleration: off
+Teleporter Enabled: off
+Teleporter Port: 0
+Teleporter Address: 
+Teleporter Password: 
+Storage Controller Name (0):            IDE Controller
+Storage Controller Type (0):            PIIX4
+Storage Controller Instance Number (0): 0
+Storage Controller Max Port Count (0):  2
+Storage Controller Port Count (0):      2
+IDE Controller (0, 0): /Donnees/VirtualBox/windowsxp01.vdi (UUID: c5c76d6c-c76f-427e-98ef-3ead16eba7dd)
+IDE Controller (1, 0): Empty
+NIC 1:           MAC: 0800277C5FA2, Attachment: NAT, Cable connected: on, Trace: off (file: none), Type: Am79C973, Reported speed: 0 Mbps, Boot priority: 0
+NIC 1 Settings:  MTU: 0, Socket( send: 64, receive: 64), TCP Window( send:64, receive: 64)
+NIC 2:           disabled
+NIC 3:           disabled
+NIC 4:           disabled
+NIC 5:           disabled
+NIC 6:           disabled
+NIC 7:           disabled
+NIC 8:           disabled
+Pointing Device: PS/2 Mouse
+Keyboard Device: PS/2 Keyboard
+UART 1:          disabled
+UART 2:          disabled
+Audio:           enabled (Driver: OSS, Controller: AC97)
+Clipboard Mode:  Bidirectional
+USB:             disabled
+Shared folders:  <none>
+
+Guest:
+
+Configured memory balloon size:      0 MB
+
+
+Name:            windowsxp02
+Guest OS:        Windows XP
+UUID:            cd033191-26c3-49c9-afee-1e3affc933ee
+Config file:     /home/ddurieux/.VirtualBox/Machines/windowsxp02/windowsxp02.xml
+Hardware UUID:   cd033191-26c3-49c9-afee-1e3affc933ee
+Memory size:     256MB
+Page Fusion:     off
+VRAM size:       16MB
+HPET:            off
+Number of CPUs:  1
+Synthetic Cpu:   off
+CPUID overrides: None
+Boot menu mode:  message and menu
+Boot Device (1): Floppy
+Boot Device (2): DVD
+Boot Device (3): HardDisk
+Boot Device (4): Not Assigned
+ACPI:            on
+IOAPIC:          off
+PAE:             off
+Time offset:     0 ms
+RTC:             local time
+Hardw. virt.ext: on
+Hardw. virt.ext exclusive: on
+Nested Paging:   on
+Large Pages:     off
+VT-x VPID:       on
+State:           powered off (since 2010-07-22T19:20:25.000000000)
+Monitor count:   1
+3D Acceleration: off
+2D Video Acceleration: off
+Teleporter Enabled: off
+Teleporter Port: 0
+Teleporter Address: 
+Teleporter Password: 
+Storage Controller Name (0):            IDE Controller
+Storage Controller Type (0):            PIIX4
+Storage Controller Instance Number (0): 0
+Storage Controller Max Port Count (0):  2
+Storage Controller Port Count (0):      2
+IDE Controller (0, 0): /Donnees/VirtualBox/windowsxp01.vmdk (UUID: 7a77f89e-90fb-4986-abfc-535358c0622c)
+IDE Controller (1, 0): Empty
+NIC 1:           MAC: 0800277C5FA2, Attachment: NAT, Cable connected: on, Trace: off (file: none), Type: Am79C973, Reported speed: 0 Mbps, Boot priority: 0
+NIC 1 Settings:  MTU: 0, Socket( send: 64, receive: 64), TCP Window( send:64, receive: 64)
+NIC 2:           disabled
+NIC 3:           disabled
+NIC 4:           disabled
+NIC 5:           disabled
+NIC 6:           disabled
+NIC 7:           disabled
+NIC 8:           disabled
+Pointing Device: PS/2 Mouse
+Keyboard Device: PS/2 Keyboard
+UART 1:          disabled
+UART 2:          disabled
+Audio:           enabled (Driver: OSS, Controller: AC97)
+Clipboard Mode:  Bidirectional
+USB:             disabled
+Shared folders:  <none>
+
+Guest:
+
+Configured memory balloon size:      0 MB
+
+
+Name:            debian10023
+Guest OS:        Debian
+UUID:            ec43b1fc-0efc-487f-8188-a104473db0d5
+Config file:     /home/ddurieux/.VirtualBox/Machines/debian10023/debian10023.xml
+Hardware UUID:   ec43b1fc-0efc-487f-8188-a104473db0d5
+Memory size:     200MB
+Page Fusion:     off
+VRAM size:       12MB
+HPET:            off
+Number of CPUs:  1
+Synthetic Cpu:   off
+CPUID overrides: None
+Boot menu mode:  message and menu
+Boot Device (1): DVD
+Boot Device (2): HardDisk
+Boot Device (3): Not Assigned
+Boot Device (4): Not Assigned
+ACPI:            on
+IOAPIC:          off
+PAE:             on
+Time offset:     0 ms
+RTC:             UTC
+Hardw. virt.ext: on
+Hardw. virt.ext exclusive: on
+Nested Paging:   on
+Large Pages:     off
+VT-x VPID:       on
+State:           powered off (since 2010-10-27T18:35:07.000000000)
+Monitor count:   1
+3D Acceleration: off
+2D Video Acceleration: off
+Teleporter Enabled: off
+Teleporter Port: 0
+Teleporter Address: 
+Teleporter Password: 
+Storage Controller Name (0):            IDE Controller
+Storage Controller Type (0):            PIIX4
+Storage Controller Instance Number (0): 0
+Storage Controller Max Port Count (0):  2
+Storage Controller Port Count (0):      2
+Storage Controller Name (1):            SATA Controller
+Storage Controller Type (1):            IntelAhci
+Storage Controller Instance Number (1): 0
+Storage Controller Max Port Count (1):  30
+Storage Controller Port Count (1):      1
+IDE Controller (1, 0): Empty
+SATA Controller (0, 0): /Donnees/VirtualBox/debian10023.vdi (UUID: 37a9d597-745f-4bc9-b597-8ad1465e8f39)
+NIC 1:           MAC: 080027E9D6D5, Attachment: Bridged Interface 're0', Cable connected: on, Trace: off (file: none), Type: 82540EM, Reported speed: 0 Mbps, Boot priority: 0
+NIC 2:           disabled
+NIC 3:           disabled
+NIC 4:           disabled
+NIC 5:           disabled
+NIC 6:           disabled
+NIC 7:           disabled
+NIC 8:           disabled
+Pointing Device: USB Tablet
+Keyboard Device: PS/2 Keyboard
+UART 1:          disabled
+UART 2:          disabled
+Audio:           enabled (Driver: OSS, Controller: AC97)
+Clipboard Mode:  Bidirectional
+USB:             enabled
+Shared folders:  <none>
+
+Guest:
+
+Configured memory balloon size:      0 MB
+
+
+Name:            debian10024
+Guest OS:        Debian
+UUID:            d410a9a0-0b31-4bad-9a51-80ab37701d1d
+Config file:     /home/ddurieux/.VirtualBox/Machines/debian10024/debian10024.xml
+Hardware UUID:   d410a9a0-0b31-4bad-9a51-80ab37701d1d
+Memory size:     200MB
+Page Fusion:     off
+VRAM size:       12MB
+HPET:            off
+Number of CPUs:  2
+Synthetic Cpu:   off
+CPUID overrides: None
+Boot menu mode:  message and menu
+Boot Device (1): DVD
+Boot Device (2): HardDisk
+Boot Device (3): Not Assigned
+Boot Device (4): Not Assigned
+ACPI:            on
+IOAPIC:          on
+PAE:             on
+Time offset:     0 ms
+RTC:             UTC
+Hardw. virt.ext: on
+Hardw. virt.ext exclusive: on
+Nested Paging:   on
+Large Pages:     off
+VT-x VPID:       on
+State:           powered off (since 2010-10-11T07:01:24.000000000)
+Monitor count:   1
+3D Acceleration: off
+2D Video Acceleration: off
+Teleporter Enabled: off
+Teleporter Port: 0
+Teleporter Address: 
+Teleporter Password: 
+Storage Controller Name (0):            IDE Controller
+Storage Controller Type (0):            PIIX4
+Storage Controller Instance Number (0): 0
+Storage Controller Max Port Count (0):  2
+Storage Controller Port Count (0):      2
+Storage Controller Name (1):            SATA Controller
+Storage Controller Type (1):            IntelAhci
+Storage Controller Instance Number (1): 0
+Storage Controller Max Port Count (1):  30
+Storage Controller Port Count (1):      1
+IDE Controller (1, 0): Empty
+SATA Controller (0, 0): /Donnees/VirtualBox/debian10024.vdi (UUID: 253a1a78-4fe9-4f48-a0b2-fa19cc112863)
+NIC 1:           MAC: 080027CE41F7, Attachment: Bridged Interface 're0', Cable connected: on, Trace: off (file: none), Type: 82540EM, Reported speed: 0 Mbps, Boot priority: 0
+NIC 2:           disabled
+NIC 3:           disabled
+NIC 4:           disabled
+NIC 5:           disabled
+NIC 6:           disabled
+NIC 7:           disabled
+NIC 8:           disabled
+Pointing Device: USB Tablet
+Keyboard Device: PS/2 Keyboard
+UART 1:          disabled
+UART 2:          disabled
+Audio:           enabled (Driver: OSS, Controller: AC97)
+Clipboard Mode:  Bidirectional
+USB:             enabled
+Shared folders:  <none>
+
+Guest:
+
+Configured memory balloon size:      0 MB
+
+
+Name:            MacOSX 10.6
+Guest OS:        Mac OS X Server
+UUID:            85b780f6-b3fd-44d3-bb94-d8583cd78770
+Config file:     /home/ddurieux/.VirtualBox/Machines/MacOSX 10.6/MacOSX 10.6.xml
+Hardware UUID:   85b780f6-b3fd-44d3-bb94-d8583cd78770
+Memory size:     1024MB
+Page Fusion:     off
+VRAM size:       7MB
+HPET:            on
+Number of CPUs:  1
+Synthetic Cpu:   off
+CPUID overrides: None
+Boot menu mode:  message and menu
+Boot Device (1): DVD
+Boot Device (2): HardDisk
+Boot Device (3): Not Assigned
+Boot Device (4): Not Assigned
+ACPI:            on
+IOAPIC:          on
+PAE:             on
+Time offset:     0 ms
+RTC:             local time
+Hardw. virt.ext: on
+Hardw. virt.ext exclusive: on
+Nested Paging:   on
+Large Pages:     off
+VT-x VPID:       on
+State:           powered off (since 2010-10-26T14:49:21.000000000)
+Monitor count:   1
+3D Acceleration: on
+2D Video Acceleration: off
+Teleporter Enabled: off
+Teleporter Port: 0
+Teleporter Address: 
+Teleporter Password: 
+Storage Controller Name (0):            IDE Controller
+Storage Controller Type (0):            ICH6
+Storage Controller Instance Number (0): 0
+Storage Controller Max Port Count (0):  2
+Storage Controller Port Count (0):      2
+IDE Controller (1, 0): Empty
+NIC 1:           MAC: 080027D314A0, Attachment: Bridged Interface 'alc0', Cable connected: on, Trace: off (file: none), Type: 82543GC, Reported speed: 0 Mbps, Boot priority: 0
+NIC 2:           disabled
+NIC 3:           disabled
+NIC 4:           disabled
+NIC 5:           disabled
+NIC 6:           disabled
+NIC 7:           disabled
+NIC 8:           disabled
+Pointing Device: USB Tablet
+Keyboard Device: USB Keyboard
+UART 1:          disabled
+UART 2:          disabled
+Audio:           enabled (Driver: OSS, Controller: AC97)
+Clipboard Mode:  Bidirectional
+USB:             enabled
+Shared folders:  <none>
+
+Guest:
+
+Configured memory balloon size:      0 MB
+
+
+Name:            windows xp RU
+Guest OS:        Windows XP
+UUID:            fbc00535-0e8d-4955-8026-2bd50bf606e9
+Config file:     /home/ddurieux/.VirtualBox/Machines/windows xp RU/windows xp RU.xml
+Hardware UUID:   fbc00535-0e8d-4955-8026-2bd50bf606e9
+Memory size:     306MB
+Page Fusion:     off
+VRAM size:       16MB
+HPET:            off
+Number of CPUs:  1
+Synthetic Cpu:   off
+CPUID overrides: None
+Boot menu mode:  message and menu
+Boot Device (1): DVD
+Boot Device (2): HardDisk
+Boot Device (3): Not Assigned
+Boot Device (4): Not Assigned
+ACPI:            on
+IOAPIC:          off
+PAE:             on
+Time offset:     0 ms
+RTC:             local time
+Hardw. virt.ext: on
+Hardw. virt.ext exclusive: on
+Nested Paging:   on
+Large Pages:     off
+VT-x VPID:       on
+State:           powered off (since 2010-10-27T18:41:39.000000000)
+Monitor count:   1
+3D Acceleration: on
+2D Video Acceleration: off
+Teleporter Enabled: off
+Teleporter Port: 0
+Teleporter Address: 
+Teleporter Password: 
+Storage Controller Name (0):            IDE Controller
+Storage Controller Type (0):            PIIX4
+Storage Controller Instance Number (0): 0
+Storage Controller Max Port Count (0):  2
+Storage Controller Port Count (0):      2
+IDE Controller (0, 0): /Donnees/VirtualBox/windows xp RU.vdi (UUID: cd51263a-8ce3-4f3d-95f1-e0664463b50c)
+IDE Controller (1, 0): /Donnees/Temp/torrent/winxphomeoemrus.iso (UUID: 41e46fe2-5a37-41a0-9c27-1f99344455e4)
+NIC 1:           MAC: 080027D338FD, Attachment: NAT, Cable connected: on, Trace: off (file: none), Type: Am79C973, Reported speed: 0 Mbps, Boot priority: 0
+NIC 1 Settings:  MTU: 0, Socket( send: 64, receive: 64), TCP Window( send:64, receive: 64)
+NIC 2:           disabled
+NIC 3:           disabled
+NIC 4:           disabled
+NIC 5:           disabled
+NIC 6:           disabled
+NIC 7:           disabled
+NIC 8:           disabled
+Pointing Device: PS/2 Mouse
+Keyboard Device: PS/2 Keyboard
+UART 1:          disabled
+UART 2:          disabled
+Audio:           enabled (Driver: OSS, Controller: AC97)
+Clipboard Mode:  Bidirectional
+USB:             disabled
+Shared folders:  <none>
+
+Guest:
+
+Configured memory balloon size:      0 MB
+
+
+Name:            Mandriva
+Guest OS:        Mandriva
+UUID:            c43f39f2-a970-40a0-9435-7b09b218efdf
+Config file:     /home/ddurieux/.VirtualBox/Machines/Mandriva/Mandriva.xml
+Hardware UUID:   c43f39f2-a970-40a0-9435-7b09b218efdf
+Memory size:     512MB
+Page Fusion:     off
+VRAM size:       12MB
+HPET:            off
+Number of CPUs:  1
+Synthetic Cpu:   off
+CPUID overrides: None
+Boot menu mode:  message and menu
+Boot Device (1): Floppy
+Boot Device (2): DVD
+Boot Device (3): HardDisk
+Boot Device (4): Not Assigned
+ACPI:            on
+IOAPIC:          off
+PAE:             off
+Time offset:     0 ms
+RTC:             UTC
+Hardw. virt.ext: on
+Hardw. virt.ext exclusive: on
+Nested Paging:   on
+Large Pages:     off
+VT-x VPID:       on
+State:           powered off (since 2010-10-27T18:37:31.000000000)
+Monitor count:   1
+3D Acceleration: off
+2D Video Acceleration: off
+Teleporter Enabled: off
+Teleporter Port: 0
+Teleporter Address: 
+Teleporter Password: 
+Storage Controller Name (0):            IDE Controller
+Storage Controller Type (0):            PIIX4
+Storage Controller Instance Number (0): 0
+Storage Controller Max Port Count (0):  2
+Storage Controller Port Count (0):      2
+Storage Controller Name (1):            SATA Controller
+Storage Controller Type (1):            IntelAhci
+Storage Controller Instance Number (1): 0
+Storage Controller Max Port Count (1):  30
+Storage Controller Port Count (1):      1
+IDE Controller (1, 0): Empty
+SATA Controller (0, 0): /Donnees/VirtualBox/Mandriva.vdi (UUID: 101029c3-3e6a-4f16-86e6-47fbf82ba37c)
+NIC 1:           MAC: 0800278A0380, Attachment: Bridged Interface 're0', Cable connected: on, Trace: off (file: none), Type: 82540EM, Reported speed: 0 Mbps, Boot priority: 0
+NIC 2:           disabled
+NIC 3:           disabled
+NIC 4:           disabled
+NIC 5:           disabled
+NIC 6:           disabled
+NIC 7:           disabled
+NIC 8:           disabled
+Pointing Device: USB Tablet
+Keyboard Device: PS/2 Keyboard
+UART 1:          disabled
+UART 2:          disabled
+Audio:           enabled (Driver: OSS, Controller: AC97)
+Clipboard Mode:  Bidirectional
+USB:             enabled
+Shared folders:  <none>
+
+Guest:
+
+Configured memory balloon size:      0 MB
+
+
+Name:            Macos
+Guest OS:        Mac OS X Server
+UUID:            d1fe6cfa-80c6-41ae-9f4b-2a15dbafcf2c
+Config file:     /home/ddurieux/.VirtualBox/Machines/Macos/Macos.xml
+Hardware UUID:   d1fe6cfa-80c6-41ae-9f4b-2a15dbafcf2c
+Memory size:     1365MB
+Page Fusion:     off
+VRAM size:       18MB
+HPET:            on
+Number of CPUs:  1
+Synthetic Cpu:   off
+CPUID overrides: None
+Boot menu mode:  message and menu
+Boot Device (1): DVD
+Boot Device (2): HardDisk
+Boot Device (3): Not Assigned
+Boot Device (4): Not Assigned
+ACPI:            on
+IOAPIC:          on
+PAE:             on
+Time offset:     0 ms
+RTC:             local time
+Hardw. virt.ext: on
+Hardw. virt.ext exclusive: on
+Nested Paging:   on
+Large Pages:     off
+VT-x VPID:       on
+State:           powered off (since 2010-10-26T15:37:41.000000000)
+Monitor count:   1
+3D Acceleration: on
+2D Video Acceleration: off
+Teleporter Enabled: off
+Teleporter Port: 0
+Teleporter Address: 
+Teleporter Password: 
+Storage Controller Name (0):            IDE Controller
+Storage Controller Type (0):            ICH6
+Storage Controller Instance Number (0): 0
+Storage Controller Max Port Count (0):  2
+Storage Controller Port Count (0):      2
+IDE Controller (0, 0): /home/ddurieux/.VirtualBox/HardDisks/macosx.vdi (UUID: a9f2b31c-c4e6-4899-ad42-b03245c54f88)
+IDE Controller (1, 0): /Donnees/Temp/macos/MacOSX_Server_1047_InstallDVD.iso (UUID: c4d1f35c-585d-413c-9b59-f93efe1008e3)
+NIC 1:           MAC: 0800270039B8, Attachment: NAT, Cable connected: on, Trace: off (file: none), Type: 82543GC, Reported speed: 0 Mbps, Boot priority: 0
+NIC 1 Settings:  MTU: 0, Socket( send: 64, receive: 64), TCP Window( send:64, receive: 64)
+NIC 2:           disabled
+NIC 3:           disabled
+NIC 4:           disabled
+NIC 5:           disabled
+NIC 6:           disabled
+NIC 7:           disabled
+NIC 8:           disabled
+Pointing Device: USB Tablet
+Keyboard Device: USB Keyboard
+UART 1:          disabled
+UART 2:          disabled
+Audio:           enabled (Driver: OSS, Controller: SB16)
+Clipboard Mode:  Bidirectional
+USB:             enabled
+Shared folders:  <none>
+
+Guest:
+
+Configured memory balloon size:      0 MB
+
+
diff --git a/t/inventory/virtualization/virtualbox.t b/t/inventory/virtualization/virtualbox.t
index 94be3ca..8a77466 100755
--- a/t/inventory/virtualization/virtualbox.t
+++ b/t/inventory/virtualization/virtualbox.t
@@ -90,6 +90,125 @@ my %tests = (
             UUID      => '4ddac902-a4f6-4ccb-a1a4-73dd6c90c1b2',
             VCPU      => 1
         }
+    ],
+    sample2 => [
+        {
+            VMTYPE    => 'VirtualBox',
+            NAME      => 'FreeBSD8 i386',
+            SUBSYSTEM => 'Oracle VM VirtualBox',
+            STATUS    => 'running',
+            MEMORY    => '512MB',
+            UUID      => 'd1857d13-a67f-4ba9-a3e6-101e42f59268',
+            VCPU      => 1
+        },
+        {
+            VMTYPE    => 'VirtualBox',
+            NAME      => 'Windows2000 (fusion agent)',
+            SUBSYSTEM => 'Oracle VM VirtualBox',
+            STATUS    => 'off',
+            MEMORY    => '512MB',
+            UUID      => 'f8d4f838-aaa4-4f9b-b756-f95bc8d9cceb',
+            VCPU      => 1
+        },
+        {
+            VMTYPE    => 'VirtualBox',
+            NAME      => 'Centos',
+            SUBSYSTEM => 'Oracle VM VirtualBox',
+            STATUS    => 'off',
+            MEMORY    => '776MB',
+            UUID      => '2cbb51b4-503c-4b5e-a6a5-878851a04658',
+            VCPU      => 1
+        },
+        {
+            VMTYPE    => 'VirtualBox',
+            NAME      => 'windows 7 RU',
+            SUBSYSTEM => 'Oracle VM VirtualBox',
+            STATUS    => 'off',
+            MEMORY    => '512MB',
+            UUID      => 'c404fff7-67bf-4b9c-95cc-19c6b27bcd5f',
+            VCPU      => 1
+        },
+        {
+            VMTYPE    => 'VirtualBox',
+            NAME      => 'Windows XP',
+            SUBSYSTEM => 'Oracle VM VirtualBox',
+            STATUS    => 'running',
+            MEMORY    => '512MB',
+            UUID      => '3fd80a8f-ed78-4421-9192-c0af6f5f66d5',
+            VCPU      => 1
+        },
+        {
+            VMTYPE    => 'VirtualBox',
+            NAME      => 'windowsxp01',
+            SUBSYSTEM => 'Oracle VM VirtualBox',
+            STATUS    => 'off',
+            MEMORY    => '256MB',
+            UUID      => 'c7608d9d-c76c-4dab-8411-2784deb4eb1f',
+            VCPU      => 1
+        },
+        {
+            VMTYPE    => 'VirtualBox',
+            NAME      => 'windowsxp02',
+            SUBSYSTEM => 'Oracle VM VirtualBox',
+            STATUS    => 'off',
+            MEMORY    => '256MB',
+            UUID      => 'cd033191-26c3-49c9-afee-1e3affc933ee',
+            VCPU      => 1
+        },
+        {
+            VMTYPE    => 'VirtualBox',
+            NAME      => 'debian10023',
+            SUBSYSTEM => 'Oracle VM VirtualBox',
+            STATUS    => 'off',
+            MEMORY    => '200MB',
+            UUID      => 'ec43b1fc-0efc-487f-8188-a104473db0d5',
+            VCPU      => 1
+        },
+        {
+            VMTYPE    => 'VirtualBox',
+            NAME      => 'debian10024',
+            SUBSYSTEM => 'Oracle VM VirtualBox',
+            STATUS    => 'off',
+            MEMORY    => '200MB',
+            UUID      => 'd410a9a0-0b31-4bad-9a51-80ab37701d1d',
+            VCPU      => 1
+        },
+        {
+            VMTYPE    => 'VirtualBox',
+            NAME      => 'MacOSX 10.6',
+            SUBSYSTEM => 'Oracle VM VirtualBox',
+            STATUS    => 'off',
+            MEMORY    => '1024MB',
+            UUID      => '85b780f6-b3fd-44d3-bb94-d8583cd78770',
+            VCPU      => 1
+        },
+        {
+            VMTYPE    => 'VirtualBox',
+            NAME      => 'windows xp RU',
+            SUBSYSTEM => 'Oracle VM VirtualBox',
+            STATUS    => 'off',
+            MEMORY    => '306MB',
+            UUID      => 'fbc00535-0e8d-4955-8026-2bd50bf606e9',
+            VCPU      => 1
+        },
+        {
+            VMTYPE    => 'VirtualBox',
+            NAME      => 'Mandriva',
+            SUBSYSTEM => 'Oracle VM VirtualBox',
+            STATUS    => 'off',
+            MEMORY    => '512MB',
+            UUID      => 'c43f39f2-a970-40a0-9435-7b09b218efdf',
+            VCPU      => 1
+        },
+        {
+            VMTYPE    => 'VirtualBox',
+            NAME      => 'Macos',
+            SUBSYSTEM => 'Oracle VM VirtualBox',
+            STATUS    => 'off',
+            MEMORY    => '1365MB',
+            UUID      => 'd1fe6cfa-80c6-41ae-9f4b-2a15dbafcf2c',
+            VCPU      => 1
+        }
     ]
 );
 


================================================================
  Commit: b482af72ead2c38690b4ee67af8a1cd52e6231c1
      https://github.com/fusinv/fusioninventory-agent/commit/b482af72ead2c38690b4ee67af8a1cd52e6231c1
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-06 (Tue, 06 Mar 2012)

  Changed paths:
    A resources/virtualization/README

  Log Message:
  -----------
  initial import


diff --git a/resources/virtualization/README b/resources/virtualization/README
new file mode 100644
index 0000000..857bdef
--- /dev/null
+++ b/resources/virtualization/README
@@ -0,0 +1,4 @@
+virtualization-related commands output
+
+vboxmanage: VBoxManage command output
+- sample?: VBoxManage -nologo list--long  vms 


================================================================
  Commit: 87791f2779448dfa995c611431e46ba9c8953826
      https://github.com/fusinv/fusioninventory-agent/commit/87791f2779448dfa995c611431e46ba9c8953826
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-06 (Tue, 06 Mar 2012)

  Changed paths:
    M Changes
    M lib/FusionInventory/Agent/Task/Inventory.pm

  Log Message:
  -----------
  use .xml extension for local inventory file name (close #211)


diff --git a/Changes b/Changes
index 34b6676..77137bc 100644
--- a/Changes
+++ b/Changes
@@ -56,6 +56,7 @@ Major changes:
 
 Minor changes:
 * Add the HARDWARE/CHASSIS_TYPE information
+* local inventory file name now has .xml extension (#211)
 * Linux: report all IP addresses used by each interfaces (#854)
 * HPUX: don't report unoccupied memory slots
 * AIX: add LVM support
diff --git a/lib/FusionInventory/Agent/Task/Inventory.pm b/lib/FusionInventory/Agent/Task/Inventory.pm
index 9c9aac7..a0b3e1a 100644
--- a/lib/FusionInventory/Agent/Task/Inventory.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory.pm
@@ -82,7 +82,7 @@ sub run {
     } elsif ($self->{target}->isa('FusionInventory::Agent::Target::Local')) {
         my $format = $self->{target}->{format};
 
-        my $extension = $format eq 'xml' ? '.ocs' : '.html';
+        my $extension = $format eq 'xml' ? '.xml' : '.html';
         my $file =
             $self->{config}->{local} .
             "/" .


================================================================
  Commit: 188300110d50ac5fbda5e1b72473909119fbfff4
      https://github.com/fusinv/fusioninventory-agent/commit/188300110d50ac5fbda5e1b72473909119fbfff4
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-03-07 (Wed, 07 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Sound.pm

  Log Message:
  -----------
  MacOSX: Error in sound inventory

closes: #1506

Reported-by: Walid Nouh <walid.nouh at gmail.com>


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Sound.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Sound.pm
index faa4285..dd9ae96 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Sound.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Sound.pm
@@ -22,7 +22,7 @@ sub doInventory {
 
     # add sound cards
     foreach my $x (keys %$info){
-        $inventory->addSound({
+        $inventory->addEntry({
             section => 'SOUNDS',
             entry   => {
                 NAME         => $x,


================================================================
  Commit: e1d13de827df9433aec562c88d26ca11db62dbd1
      https://github.com/fusinv/fusioninventory-agent/commit/e1d13de827df9433aec562c88d26ca11db62dbd1
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-03-07 (Wed, 07 Mar 2012)

  Changed paths:
    M Changes
    M lib/FusionInventory/Agent/Task/Inventory.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
    M lib/FusionInventory/Agent/Tools.pm
    M lib/FusionInventory/Agent/Tools/Screen.pm
    A resources/virtualization/README
    A resources/virtualization/vboxmanage/sample2
    M t/inventory/virtualization/virtualbox.t

  Log Message:
  -----------
  Merge remote-tracking branch 'origin/2.2.x' into 2.2.x


diff --git a/Changes b/Changes
index a6da7ba..77137bc 100644
--- a/Changes
+++ b/Changes
@@ -56,8 +56,10 @@ Major changes:
 
 Minor changes:
 * Add the HARDWARE/CHASSIS_TYPE information
-* Linux: Use /sbin/ip to get the interface IP addresses (#854)
+* local inventory file name now has .xml extension (#211)
+* Linux: report all IP addresses used by each interfaces (#854)
 * HPUX: don't report unoccupied memory slots
+* AIX: add LVM support
 
 2.1.14  Wed, 22 Feb 2012 14:56:51 -0000
 
diff --git a/lib/FusionInventory/Agent/Task/Inventory.pm b/lib/FusionInventory/Agent/Task/Inventory.pm
index 9c9aac7..a0b3e1a 100644
--- a/lib/FusionInventory/Agent/Task/Inventory.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory.pm
@@ -82,7 +82,7 @@ sub run {
     } elsif ($self->{target}->isa('FusionInventory::Agent::Target::Local')) {
         my $format = $self->{target}->{format};
 
-        my $extension = $format eq 'xml' ? '.ocs' : '.html';
+        my $extension = $format eq 'xml' ? '.xml' : '.html';
         my $file =
             $self->{config}->{local} .
             "/" .
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
index f69806b..903297d 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
@@ -59,6 +59,8 @@ sub doInventory {
                 $screen->{SERIAL} = $edid->{serial_number2}->[0];
             }
             $screen->{BASE64} = encode_base64($screen->{edid});
+
+            delete $screen->{edid};
         }
 
         $inventory->addEntry(
@@ -71,7 +73,7 @@ sub doInventory {
 sub _getScreensFromWindows {
     my ($logger) = @_;
 
-    FusionInventory::Agent::Tools::Win32->require();
+    FusionInventory::Agent::Tools::Win32->use();
     if ($EVAL_ERROR) {
         print
             "Failed to load FusionInventory::Agent::Tools::Win32: $EVAL_ERROR";
@@ -81,7 +83,7 @@ sub _getScreensFromWindows {
     my @screens;
 
     # Vista and upper, able to get the second screen
-    foreach my $object (FusionInventory::Agent::Tools::Win32::getWmiObjects(
+    foreach my $object (getWmiObjects(
         moniker    => 'winmgmts:{impersonationLevel=impersonate,authenticationLevel=Pkt}!//./root/wmi',
         class      => 'WMIMonitorID',
         properties => [ qw/InstanceName/ ]
@@ -95,7 +97,7 @@ sub _getScreensFromWindows {
     }
 
     # The generic Win32_DesktopMonitor class, the second screen will be missing
-    foreach my $object (FusionInventory::Agent::Tools::Win32::getWmiObjects(
+    foreach my $object (getWmiObjects(
         class => 'Win32_DesktopMonitor',
         properties => [ qw/
             Caption MonitorManufacturer MonitorType PNPDeviceID
@@ -107,38 +109,21 @@ sub _getScreensFromWindows {
 
         push @screens, {
             id           => $object->{PNPDeviceID},
-            name         => $object->{Caption},
-            type         => $object->{MonitorType},
-            manufacturer => $object->{MonitorManufacturer},
-            caption      => $object->{Caption}
+            NAME         => $object->{Caption},
+            TYPE         => $object->{MonitorType},
+            MANUFACTURER => $object->{MonitorManufacturer},
+            CAPTION      => $object->{Caption}
         };
     }
 
-    my $Registry;
-    Win32::TieRegistry->require();
-    Win32::TieRegistry->import(
-        Delimiter   => '/',
-        ArrayValues => 0,
-        TiedRef     => \$Registry
-    );
-
-    my $access = FusionInventory::Agent::Tools::Win32::is64bit() ?
-	Win32::TieRegistry::KEY_READ() |
-	    FusionInventory::Agent::Tools::Win32::KEY_WOW64_64() :
-	Win32::TieRegistry::KEY_READ();
-
     foreach my $screen (@screens) {
-
-        my $machKey = $Registry->Open('LMachine', {
-            Access => $access
-        } ) or $logger->fault(
-            "Can't open HKEY_LOCAL_MACHINE key: $EXTENDED_OS_ERROR"
-        );
-
-        $screen->{edid} =
-            $machKey->{"SYSTEM/CurrentControlSet/Enum/$screen->{id}/Device Parameters/EDID"} || '';
+        next unless $screen->{id};
+        $screen->{edid} = getRegistryValue(
+            path => "HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Enum/$screen->{id}/Device Parameters/EDID",
+            logger => $logger
+        ) || '';
         $screen->{edid} =~ s/^\s+$//;
-
+        delete $screen->{id};
     }
 
     return @screens;
@@ -146,19 +131,18 @@ sub _getScreensFromWindows {
 
 sub _getScreensFromUnix {
 
-    my $raw_edid =
+    my $edid =
         getFirstLine(command => 'monitor-get-edid-using-vbe') ||
         getFirstLine(command => 'monitor-get-edid');
 
-    if (!$raw_edid) {
+    if (!$edid) {
         foreach (1..5) { # Sometime get-edid return an empty string...
-            $raw_edid = getFirstLine(command => 'get-edid');
-            last if $raw_edid && (length($raw_edid) == 128 || length($raw_edid) == 256);
+            $edid = getFirstLine(command => 'get-edid');
+            last if $edid;
         }
     }
-    return unless length($raw_edid) == 128 || length($raw_edid) == 256;
 
-    return ( { edid => $raw_edid } );
+    return ( { edid => $edid } );
 }
 
 sub _getScreens {
diff --git a/lib/FusionInventory/Agent/Tools.pm b/lib/FusionInventory/Agent/Tools.pm
index 0e8e17d..bc61bbf 100644
--- a/lib/FusionInventory/Agent/Tools.pm
+++ b/lib/FusionInventory/Agent/Tools.pm
@@ -442,9 +442,10 @@ sub runFunction {
 
     my $result;
     eval {
-        # set 
-        local $SIG{ALRM} = sub { die "alarm\n" };
-        alarm $params{timeout} if $params{timeout};
+        # set a timeout if needed
+        local $SIG{ALRM} = sub { die "alarm\n" } if $params{timeout};
+        alarm $params{timeout};
+
         no strict 'refs'; ## no critic
         $result = &{$params{module} . '::' . $params{function}}(
             ref $params{params} eq 'HASH'  ? %{$params{params}} :
diff --git a/lib/FusionInventory/Agent/Tools/Screen.pm b/lib/FusionInventory/Agent/Tools/Screen.pm
index 6c4c320..f2cd98c 100644
--- a/lib/FusionInventory/Agent/Tools/Screen.pm
+++ b/lib/FusionInventory/Agent/Tools/Screen.pm
@@ -207,6 +207,8 @@ sub checkParsedEdid {
 sub parseEdid {
     my ($raw_edid) = @_;
 
+    no warnings 'uninitialized';
+
     my %edid;
     my @vals = unpack(join('', map { $_->[0] } @edid_info), $raw_edid);
     my $i;
diff --git a/resources/virtualization/README b/resources/virtualization/README
new file mode 100644
index 0000000..857bdef
--- /dev/null
+++ b/resources/virtualization/README
@@ -0,0 +1,4 @@
+virtualization-related commands output
+
+vboxmanage: VBoxManage command output
+- sample?: VBoxManage -nologo list--long  vms 
diff --git a/resources/virtualization/vboxmanage/sample2 b/resources/virtualization/vboxmanage/sample2
new file mode 100644
index 0000000..c17bc54
--- /dev/null
+++ b/resources/virtualization/vboxmanage/sample2
@@ -0,0 +1,877 @@
+Name:            FreeBSD8 i386
+Guest OS:        FreeBSD
+UUID:            d1857d13-a67f-4ba9-a3e6-101e42f59268
+Config file:     /home/ddurieux/.VirtualBox/Machines/FreeBSD8 i386/FreeBSD8 i386.xml
+Hardware UUID:   d1857d13-a67f-4ba9-a3e6-101e42f59268
+Memory size:     512MB
+Page Fusion:     off
+VRAM size:       7MB
+HPET:            off
+Number of CPUs:  1
+Synthetic Cpu:   off
+CPUID overrides: None
+Boot menu mode:  message and menu
+Boot Device (1): DVD
+Boot Device (2): HardDisk
+Boot Device (3): Not Assigned
+Boot Device (4): Not Assigned
+ACPI:            on
+IOAPIC:          off
+PAE:             on
+Time offset:     0 ms
+RTC:             local time
+Hardw. virt.ext: on
+Hardw. virt.ext exclusive: on
+Nested Paging:   on
+Large Pages:     off
+VT-x VPID:       on
+State:           running (since 2011-03-13T14:01:14.757000000)
+Monitor count:   1
+3D Acceleration: on
+2D Video Acceleration: off
+Teleporter Enabled: off
+Teleporter Port: 0
+Teleporter Address: 
+Teleporter Password: 
+Storage Controller Name (0):            IDE Controller
+Storage Controller Type (0):            PIIX4
+Storage Controller Instance Number (0): 0
+Storage Controller Max Port Count (0):  2
+Storage Controller Port Count (0):      2
+Storage Controller Name (1):            Floppy Controller
+Storage Controller Type (1):            I82078
+Storage Controller Instance Number (1): 0
+Storage Controller Max Port Count (1):  1
+Storage Controller Port Count (1):      1
+IDE Controller (0, 0): /Donnees/VirtualBox/freebsd8_amd64.vdi (UUID: 4fa8cc39-3258-43bb-ad83-53fd2a369cca)
+IDE Controller (1, 0): Empty
+Floppy Controller (0, 0): Empty
+NIC 1:           MAC: 080027D2B03A, Attachment: Bridged Interface 'em0', Cable connected: on, Trace: off (file: none), Type: 82540EM, Reported speed: 0 Mbps, Boot priority: 0
+NIC 2:           disabled
+NIC 3:           disabled
+NIC 4:           disabled
+NIC 5:           disabled
+NIC 6:           disabled
+NIC 7:           disabled
+NIC 8:           disabled
+Pointing Device: PS/2 Mouse
+Keyboard Device: PS/2 Keyboard
+UART 1:          disabled
+UART 2:          disabled
+Audio:           enabled (Driver: OSS, Controller: AC97)
+Clipboard Mode:  Bidirectional
+USB:             disabled
+Shared folders:  <none>
+
+Guest:
+
+Configured memory balloon size:      0 MB
+
+
+Name:            Windows2000 (fusion agent)
+Guest OS:        Windows 2000
+UUID:            f8d4f838-aaa4-4f9b-b756-f95bc8d9cceb
+Config file:     /home/ddurieux/.VirtualBox/Machines/Windows2000 (fusion agent)/Windows2000 (fusion agent).xml
+Hardware UUID:   f8d4f838-aaa4-4f9b-b756-f95bc8d9cceb
+Memory size:     512MB
+Page Fusion:     off
+VRAM size:       16MB
+HPET:            off
+Number of CPUs:  1
+Synthetic Cpu:   off
+CPUID overrides: None
+Boot menu mode:  message and menu
+Boot Device (1): Floppy
+Boot Device (2): DVD
+Boot Device (3): HardDisk
+Boot Device (4): Not Assigned
+ACPI:            on
+IOAPIC:          off
+PAE:             on
+Time offset:     0 ms
+RTC:             local time
+Hardw. virt.ext: on
+Hardw. virt.ext exclusive: on
+Nested Paging:   on
+Large Pages:     off
+VT-x VPID:       on
+State:           powered off (since 2011-03-04T15:45:00.000000000)
+Monitor count:   1
+3D Acceleration: off
+2D Video Acceleration: off
+Teleporter Enabled: off
+Teleporter Port: 0
+Teleporter Address: 
+Teleporter Password: 
+Storage Controller Name (0):            IDE Controller
+Storage Controller Type (0):            PIIX4
+Storage Controller Instance Number (0): 0
+Storage Controller Max Port Count (0):  2
+Storage Controller Port Count (0):      2
+Storage Controller Name (1):            Floppy Controller
+Storage Controller Type (1):            I82078
+Storage Controller Instance Number (1): 0
+Storage Controller Max Port Count (1):  1
+Storage Controller Port Count (1):      1
+IDE Controller (0, 0): /Donnees/VirtualBox/Windows2000.vdi (UUID: caab3ce1-18ff-4de3-a69d-e5436fbcf208)
+IDE Controller (1, 0): Empty
+Floppy Controller (0, 0): Empty
+NIC 1:           MAC: 0800274249D6, Attachment: Bridged Interface 'em0', Cable connected: on, Trace: off (file: none), Type: Am79C973, Reported speed: 0 Mbps, Boot priority: 0
+NIC 2:           disabled
+NIC 3:           disabled
+NIC 4:           disabled
+NIC 5:           disabled
+NIC 6:           disabled
+NIC 7:           disabled
+NIC 8:           disabled
+Pointing Device: PS/2 Mouse
+Keyboard Device: PS/2 Keyboard
+UART 1:          disabled
+UART 2:          disabled
+Audio:           enabled (Driver: OSS, Controller: AC97)
+Clipboard Mode:  Bidirectional
+USB:             disabled
+Shared folders:  <none>
+
+Guest:
+
+Configured memory balloon size:      0 MB
+
+
+Name:            Centos
+Guest OS:        Other Linux
+UUID:            2cbb51b4-503c-4b5e-a6a5-878851a04658
+Config file:     /home/ddurieux/.VirtualBox/Machines/Centos/Centos.xml
+Hardware UUID:   2cbb51b4-503c-4b5e-a6a5-878851a04658
+Memory size:     776MB
+Page Fusion:     off
+VRAM size:       12MB
+HPET:            off
+Number of CPUs:  1
+Synthetic Cpu:   off
+CPUID overrides: None
+Boot menu mode:  message and menu
+Boot Device (1): Floppy
+Boot Device (2): DVD
+Boot Device (3): HardDisk
+Boot Device (4): Not Assigned
+ACPI:            on
+IOAPIC:          off
+PAE:             on
+Time offset:     0 ms
+RTC:             local time
+Hardw. virt.ext: on
+Hardw. virt.ext exclusive: on
+Nested Paging:   on
+Large Pages:     off
+VT-x VPID:       on
+State:           powered off (since 2010-10-27T18:35:57.000000000)
+Monitor count:   1
+3D Acceleration: off
+2D Video Acceleration: off
+Teleporter Enabled: off
+Teleporter Port: 0
+Teleporter Address: 
+Teleporter Password: 
+Storage Controller Name (0):            IDE Controller
+Storage Controller Type (0):            PIIX4
+Storage Controller Instance Number (0): 0
+Storage Controller Max Port Count (0):  2
+Storage Controller Port Count (0):      2
+Storage Controller Name (1):            Floppy Controller
+Storage Controller Type (1):            I82078
+Storage Controller Instance Number (1): 0
+Storage Controller Max Port Count (1):  1
+Storage Controller Port Count (1):      1
+IDE Controller (1, 0): Empty
+Floppy Controller (0, 0): Empty
+NIC 1:           MAC: 080027433DD8, Attachment: Bridged Interface 're0', Cable connected: on, Trace: off (file: none), Type: Am79C973, Reported speed: 0 Mbps, Boot priority: 0
+NIC 2:           disabled
+NIC 3:           disabled
+NIC 4:           disabled
+NIC 5:           disabled
+NIC 6:           disabled
+NIC 7:           disabled
+NIC 8:           disabled
+Pointing Device: PS/2 Mouse
+Keyboard Device: PS/2 Keyboard
+UART 1:          disabled
+UART 2:          disabled
+Audio:           enabled (Driver: OSS, Controller: AC97)
+Clipboard Mode:  Bidirectional
+USB:             disabled
+Shared folders:  <none>
+
+Guest:
+
+Configured memory balloon size:      0 MB
+
+
+Name:            windows 7 RU
+Guest OS:        Windows 7
+UUID:            c404fff7-67bf-4b9c-95cc-19c6b27bcd5f
+Config file:     /home/ddurieux/.VirtualBox/Machines/windows 7 RU/windows 7 RU.xml
+Hardware UUID:   c404fff7-67bf-4b9c-95cc-19c6b27bcd5f
+Memory size:     512MB
+Page Fusion:     off
+VRAM size:       16MB
+HPET:            off
+Number of CPUs:  1
+Synthetic Cpu:   off
+CPUID overrides: None
+Boot menu mode:  message and menu
+Boot Device (1): DVD
+Boot Device (2): HardDisk
+Boot Device (3): Not Assigned
+Boot Device (4): Not Assigned
+ACPI:            on
+IOAPIC:          off
+PAE:             on
+Time offset:     0 ms
+RTC:             UTC
+Hardw. virt.ext: on
+Hardw. virt.ext exclusive: on
+Nested Paging:   on
+Large Pages:     off
+VT-x VPID:       on
+State:           powered off (since 2011-03-10T23:59:30.000000000)
+Monitor count:   1
+3D Acceleration: off
+2D Video Acceleration: off
+Teleporter Enabled: off
+Teleporter Port: 0
+Teleporter Address: 
+Teleporter Password: 
+Storage Controller Name (0):            IDE Controller
+Storage Controller Type (0):            PIIX4
+Storage Controller Instance Number (0): 0
+Storage Controller Max Port Count (0):  2
+Storage Controller Port Count (0):      2
+Storage Controller Name (1):            SATA Controller
+Storage Controller Type (1):            IntelAhci
+Storage Controller Instance Number (1): 0
+Storage Controller Max Port Count (1):  30
+Storage Controller Port Count (1):      1
+IDE Controller (1, 0): /usr/local/lib/virtualbox/additions/VBoxGuestAdditions.iso (UUID: 4a07bd49-5a93-451e-a1ee-79e733e415b8)
+SATA Controller (0, 0): /Donnees/VirtualBox/windows7.vdi (UUID: 7c53566d-688d-45bf-ad8e-9ca30e9780b1)
+NIC 1:           MAC: 080027FDBC2F, Attachment: NAT, Cable connected: on, Trace: off (file: none), Type: 82540EM, Reported speed: 0 Mbps, Boot priority: 0
+NIC 1 Settings:  MTU: 0, Socket( send: 64, receive: 64), TCP Window( send:64, receive: 64)
+NIC 2:           disabled
+NIC 3:           disabled
+NIC 4:           disabled
+NIC 5:           disabled
+NIC 6:           disabled
+NIC 7:           disabled
+NIC 8:           disabled
+Pointing Device: PS/2 Mouse
+Keyboard Device: PS/2 Keyboard
+UART 1:          disabled
+UART 2:          disabled
+Audio:           enabled (Driver: OSS, Controller: AC97)
+Clipboard Mode:  Bidirectional
+USB:             disabled
+Shared folders:  <none>
+
+Guest:
+
+Configured memory balloon size:      0 MB
+
+
+Name:            Windows XP
+Guest OS:        Windows XP
+UUID:            3fd80a8f-ed78-4421-9192-c0af6f5f66d5
+Config file:     /home/ddurieux/.VirtualBox/Machines/Windows XP/Windows XP.xml
+Hardware UUID:   3fd80a8f-ed78-4421-9192-c0af6f5f66d5
+Memory size:     512MB
+Page Fusion:     off
+VRAM size:       16MB
+HPET:            off
+Number of CPUs:  1
+Synthetic Cpu:   off
+CPUID overrides: None
+Boot menu mode:  message and menu
+Boot Device (1): DVD
+Boot Device (2): HardDisk
+Boot Device (3): Not Assigned
+Boot Device (4): Not Assigned
+ACPI:            on
+IOAPIC:          off
+PAE:             on
+Time offset:     0 ms
+RTC:             local time
+Hardw. virt.ext: on
+Hardw. virt.ext exclusive: on
+Nested Paging:   on
+Large Pages:     off
+VT-x VPID:       on
+State:           running (since 2011-03-13T14:00:58.778000000)
+Monitor count:   1
+3D Acceleration: off
+2D Video Acceleration: off
+Teleporter Enabled: off
+Teleporter Port: 0
+Teleporter Address: 
+Teleporter Password: 
+Storage Controller Name (0):            IDE Controller
+Storage Controller Type (0):            PIIX4
+Storage Controller Instance Number (0): 0
+Storage Controller Max Port Count (0):  2
+Storage Controller Port Count (0):      2
+IDE Controller (0, 0): /home/ddurieux/.VirtualBox/Machines/Windows XP/Snapshots/{b04c6003-0921-4fac-a3c0-e4082146b17a}.vdi (UUID: b04c6003-0921-4fac-a3c0-e4082146b17a)
+IDE Controller (1, 0): /usr/local/lib/virtualbox/additions/VBoxGuestAdditions.iso (UUID: 4a07bd49-5a93-451e-a1ee-79e733e415b8)
+NIC 1:           MAC: 080027B70ED3, Attachment: NAT, Cable connected: on, Trace: off (file: none), Type: Am79C973, Reported speed: 0 Mbps, Boot priority: 0
+NIC 1 Settings:  MTU: 0, Socket( send: 64, receive: 64), TCP Window( send:64, receive: 64)
+NIC 2:           disabled
+NIC 3:           disabled
+NIC 4:           disabled
+NIC 5:           disabled
+NIC 6:           disabled
+NIC 7:           disabled
+NIC 8:           disabled
+Pointing Device: PS/2 Mouse
+Keyboard Device: PS/2 Keyboard
+UART 1:          disabled
+UART 2:          disabled
+Audio:           enabled (Driver: OSS, Controller: AC97)
+Clipboard Mode:  Bidirectional
+USB:             disabled
+Shared folders:  <none>
+
+Guest:
+
+Configured memory balloon size:      0 MB
+
+Snapshots:
+
+   Name: Finished install (UUID: a434889c-08c8-4ff6-8730-e3751224c03e) *
+
+Name:            windowsxp01
+Guest OS:        Windows XP
+UUID:            c7608d9d-c76c-4dab-8411-2784deb4eb1f
+Config file:     /home/ddurieux/.VirtualBox/Machines/windowsxp01/windowsxp01.xml
+Hardware UUID:   c7608d9d-c76c-4dab-8411-2784deb4eb1f
+Memory size:     256MB
+Page Fusion:     off
+VRAM size:       16MB
+HPET:            off
+Number of CPUs:  1
+Synthetic Cpu:   off
+CPUID overrides: None
+Boot menu mode:  message and menu
+Boot Device (1): Floppy
+Boot Device (2): DVD
+Boot Device (3): HardDisk
+Boot Device (4): Not Assigned
+ACPI:            on
+IOAPIC:          off
+PAE:             off
+Time offset:     0 ms
+RTC:             local time
+Hardw. virt.ext: on
+Hardw. virt.ext exclusive: on
+Nested Paging:   on
+Large Pages:     off
+VT-x VPID:       on
+State:           powered off (since 2010-07-20T17:53:58.000000000)
+Monitor count:   1
+3D Acceleration: off
+2D Video Acceleration: off
+Teleporter Enabled: off
+Teleporter Port: 0
+Teleporter Address: 
+Teleporter Password: 
+Storage Controller Name (0):            IDE Controller
+Storage Controller Type (0):            PIIX4
+Storage Controller Instance Number (0): 0
+Storage Controller Max Port Count (0):  2
+Storage Controller Port Count (0):      2
+IDE Controller (0, 0): /Donnees/VirtualBox/windowsxp01.vdi (UUID: c5c76d6c-c76f-427e-98ef-3ead16eba7dd)
+IDE Controller (1, 0): Empty
+NIC 1:           MAC: 0800277C5FA2, Attachment: NAT, Cable connected: on, Trace: off (file: none), Type: Am79C973, Reported speed: 0 Mbps, Boot priority: 0
+NIC 1 Settings:  MTU: 0, Socket( send: 64, receive: 64), TCP Window( send:64, receive: 64)
+NIC 2:           disabled
+NIC 3:           disabled
+NIC 4:           disabled
+NIC 5:           disabled
+NIC 6:           disabled
+NIC 7:           disabled
+NIC 8:           disabled
+Pointing Device: PS/2 Mouse
+Keyboard Device: PS/2 Keyboard
+UART 1:          disabled
+UART 2:          disabled
+Audio:           enabled (Driver: OSS, Controller: AC97)
+Clipboard Mode:  Bidirectional
+USB:             disabled
+Shared folders:  <none>
+
+Guest:
+
+Configured memory balloon size:      0 MB
+
+
+Name:            windowsxp02
+Guest OS:        Windows XP
+UUID:            cd033191-26c3-49c9-afee-1e3affc933ee
+Config file:     /home/ddurieux/.VirtualBox/Machines/windowsxp02/windowsxp02.xml
+Hardware UUID:   cd033191-26c3-49c9-afee-1e3affc933ee
+Memory size:     256MB
+Page Fusion:     off
+VRAM size:       16MB
+HPET:            off
+Number of CPUs:  1
+Synthetic Cpu:   off
+CPUID overrides: None
+Boot menu mode:  message and menu
+Boot Device (1): Floppy
+Boot Device (2): DVD
+Boot Device (3): HardDisk
+Boot Device (4): Not Assigned
+ACPI:            on
+IOAPIC:          off
+PAE:             off
+Time offset:     0 ms
+RTC:             local time
+Hardw. virt.ext: on
+Hardw. virt.ext exclusive: on
+Nested Paging:   on
+Large Pages:     off
+VT-x VPID:       on
+State:           powered off (since 2010-07-22T19:20:25.000000000)
+Monitor count:   1
+3D Acceleration: off
+2D Video Acceleration: off
+Teleporter Enabled: off
+Teleporter Port: 0
+Teleporter Address: 
+Teleporter Password: 
+Storage Controller Name (0):            IDE Controller
+Storage Controller Type (0):            PIIX4
+Storage Controller Instance Number (0): 0
+Storage Controller Max Port Count (0):  2
+Storage Controller Port Count (0):      2
+IDE Controller (0, 0): /Donnees/VirtualBox/windowsxp01.vmdk (UUID: 7a77f89e-90fb-4986-abfc-535358c0622c)
+IDE Controller (1, 0): Empty
+NIC 1:           MAC: 0800277C5FA2, Attachment: NAT, Cable connected: on, Trace: off (file: none), Type: Am79C973, Reported speed: 0 Mbps, Boot priority: 0
+NIC 1 Settings:  MTU: 0, Socket( send: 64, receive: 64), TCP Window( send:64, receive: 64)
+NIC 2:           disabled
+NIC 3:           disabled
+NIC 4:           disabled
+NIC 5:           disabled
+NIC 6:           disabled
+NIC 7:           disabled
+NIC 8:           disabled
+Pointing Device: PS/2 Mouse
+Keyboard Device: PS/2 Keyboard
+UART 1:          disabled
+UART 2:          disabled
+Audio:           enabled (Driver: OSS, Controller: AC97)
+Clipboard Mode:  Bidirectional
+USB:             disabled
+Shared folders:  <none>
+
+Guest:
+
+Configured memory balloon size:      0 MB
+
+
+Name:            debian10023
+Guest OS:        Debian
+UUID:            ec43b1fc-0efc-487f-8188-a104473db0d5
+Config file:     /home/ddurieux/.VirtualBox/Machines/debian10023/debian10023.xml
+Hardware UUID:   ec43b1fc-0efc-487f-8188-a104473db0d5
+Memory size:     200MB
+Page Fusion:     off
+VRAM size:       12MB
+HPET:            off
+Number of CPUs:  1
+Synthetic Cpu:   off
+CPUID overrides: None
+Boot menu mode:  message and menu
+Boot Device (1): DVD
+Boot Device (2): HardDisk
+Boot Device (3): Not Assigned
+Boot Device (4): Not Assigned
+ACPI:            on
+IOAPIC:          off
+PAE:             on
+Time offset:     0 ms
+RTC:             UTC
+Hardw. virt.ext: on
+Hardw. virt.ext exclusive: on
+Nested Paging:   on
+Large Pages:     off
+VT-x VPID:       on
+State:           powered off (since 2010-10-27T18:35:07.000000000)
+Monitor count:   1
+3D Acceleration: off
+2D Video Acceleration: off
+Teleporter Enabled: off
+Teleporter Port: 0
+Teleporter Address: 
+Teleporter Password: 
+Storage Controller Name (0):            IDE Controller
+Storage Controller Type (0):            PIIX4
+Storage Controller Instance Number (0): 0
+Storage Controller Max Port Count (0):  2
+Storage Controller Port Count (0):      2
+Storage Controller Name (1):            SATA Controller
+Storage Controller Type (1):            IntelAhci
+Storage Controller Instance Number (1): 0
+Storage Controller Max Port Count (1):  30
+Storage Controller Port Count (1):      1
+IDE Controller (1, 0): Empty
+SATA Controller (0, 0): /Donnees/VirtualBox/debian10023.vdi (UUID: 37a9d597-745f-4bc9-b597-8ad1465e8f39)
+NIC 1:           MAC: 080027E9D6D5, Attachment: Bridged Interface 're0', Cable connected: on, Trace: off (file: none), Type: 82540EM, Reported speed: 0 Mbps, Boot priority: 0
+NIC 2:           disabled
+NIC 3:           disabled
+NIC 4:           disabled
+NIC 5:           disabled
+NIC 6:           disabled
+NIC 7:           disabled
+NIC 8:           disabled
+Pointing Device: USB Tablet
+Keyboard Device: PS/2 Keyboard
+UART 1:          disabled
+UART 2:          disabled
+Audio:           enabled (Driver: OSS, Controller: AC97)
+Clipboard Mode:  Bidirectional
+USB:             enabled
+Shared folders:  <none>
+
+Guest:
+
+Configured memory balloon size:      0 MB
+
+
+Name:            debian10024
+Guest OS:        Debian
+UUID:            d410a9a0-0b31-4bad-9a51-80ab37701d1d
+Config file:     /home/ddurieux/.VirtualBox/Machines/debian10024/debian10024.xml
+Hardware UUID:   d410a9a0-0b31-4bad-9a51-80ab37701d1d
+Memory size:     200MB
+Page Fusion:     off
+VRAM size:       12MB
+HPET:            off
+Number of CPUs:  2
+Synthetic Cpu:   off
+CPUID overrides: None
+Boot menu mode:  message and menu
+Boot Device (1): DVD
+Boot Device (2): HardDisk
+Boot Device (3): Not Assigned
+Boot Device (4): Not Assigned
+ACPI:            on
+IOAPIC:          on
+PAE:             on
+Time offset:     0 ms
+RTC:             UTC
+Hardw. virt.ext: on
+Hardw. virt.ext exclusive: on
+Nested Paging:   on
+Large Pages:     off
+VT-x VPID:       on
+State:           powered off (since 2010-10-11T07:01:24.000000000)
+Monitor count:   1
+3D Acceleration: off
+2D Video Acceleration: off
+Teleporter Enabled: off
+Teleporter Port: 0
+Teleporter Address: 
+Teleporter Password: 
+Storage Controller Name (0):            IDE Controller
+Storage Controller Type (0):            PIIX4
+Storage Controller Instance Number (0): 0
+Storage Controller Max Port Count (0):  2
+Storage Controller Port Count (0):      2
+Storage Controller Name (1):            SATA Controller
+Storage Controller Type (1):            IntelAhci
+Storage Controller Instance Number (1): 0
+Storage Controller Max Port Count (1):  30
+Storage Controller Port Count (1):      1
+IDE Controller (1, 0): Empty
+SATA Controller (0, 0): /Donnees/VirtualBox/debian10024.vdi (UUID: 253a1a78-4fe9-4f48-a0b2-fa19cc112863)
+NIC 1:           MAC: 080027CE41F7, Attachment: Bridged Interface 're0', Cable connected: on, Trace: off (file: none), Type: 82540EM, Reported speed: 0 Mbps, Boot priority: 0
+NIC 2:           disabled
+NIC 3:           disabled
+NIC 4:           disabled
+NIC 5:           disabled
+NIC 6:           disabled
+NIC 7:           disabled
+NIC 8:           disabled
+Pointing Device: USB Tablet
+Keyboard Device: PS/2 Keyboard
+UART 1:          disabled
+UART 2:          disabled
+Audio:           enabled (Driver: OSS, Controller: AC97)
+Clipboard Mode:  Bidirectional
+USB:             enabled
+Shared folders:  <none>
+
+Guest:
+
+Configured memory balloon size:      0 MB
+
+
+Name:            MacOSX 10.6
+Guest OS:        Mac OS X Server
+UUID:            85b780f6-b3fd-44d3-bb94-d8583cd78770
+Config file:     /home/ddurieux/.VirtualBox/Machines/MacOSX 10.6/MacOSX 10.6.xml
+Hardware UUID:   85b780f6-b3fd-44d3-bb94-d8583cd78770
+Memory size:     1024MB
+Page Fusion:     off
+VRAM size:       7MB
+HPET:            on
+Number of CPUs:  1
+Synthetic Cpu:   off
+CPUID overrides: None
+Boot menu mode:  message and menu
+Boot Device (1): DVD
+Boot Device (2): HardDisk
+Boot Device (3): Not Assigned
+Boot Device (4): Not Assigned
+ACPI:            on
+IOAPIC:          on
+PAE:             on
+Time offset:     0 ms
+RTC:             local time
+Hardw. virt.ext: on
+Hardw. virt.ext exclusive: on
+Nested Paging:   on
+Large Pages:     off
+VT-x VPID:       on
+State:           powered off (since 2010-10-26T14:49:21.000000000)
+Monitor count:   1
+3D Acceleration: on
+2D Video Acceleration: off
+Teleporter Enabled: off
+Teleporter Port: 0
+Teleporter Address: 
+Teleporter Password: 
+Storage Controller Name (0):            IDE Controller
+Storage Controller Type (0):            ICH6
+Storage Controller Instance Number (0): 0
+Storage Controller Max Port Count (0):  2
+Storage Controller Port Count (0):      2
+IDE Controller (1, 0): Empty
+NIC 1:           MAC: 080027D314A0, Attachment: Bridged Interface 'alc0', Cable connected: on, Trace: off (file: none), Type: 82543GC, Reported speed: 0 Mbps, Boot priority: 0
+NIC 2:           disabled
+NIC 3:           disabled
+NIC 4:           disabled
+NIC 5:           disabled
+NIC 6:           disabled
+NIC 7:           disabled
+NIC 8:           disabled
+Pointing Device: USB Tablet
+Keyboard Device: USB Keyboard
+UART 1:          disabled
+UART 2:          disabled
+Audio:           enabled (Driver: OSS, Controller: AC97)
+Clipboard Mode:  Bidirectional
+USB:             enabled
+Shared folders:  <none>
+
+Guest:
+
+Configured memory balloon size:      0 MB
+
+
+Name:            windows xp RU
+Guest OS:        Windows XP
+UUID:            fbc00535-0e8d-4955-8026-2bd50bf606e9
+Config file:     /home/ddurieux/.VirtualBox/Machines/windows xp RU/windows xp RU.xml
+Hardware UUID:   fbc00535-0e8d-4955-8026-2bd50bf606e9
+Memory size:     306MB
+Page Fusion:     off
+VRAM size:       16MB
+HPET:            off
+Number of CPUs:  1
+Synthetic Cpu:   off
+CPUID overrides: None
+Boot menu mode:  message and menu
+Boot Device (1): DVD
+Boot Device (2): HardDisk
+Boot Device (3): Not Assigned
+Boot Device (4): Not Assigned
+ACPI:            on
+IOAPIC:          off
+PAE:             on
+Time offset:     0 ms
+RTC:             local time
+Hardw. virt.ext: on
+Hardw. virt.ext exclusive: on
+Nested Paging:   on
+Large Pages:     off
+VT-x VPID:       on
+State:           powered off (since 2010-10-27T18:41:39.000000000)
+Monitor count:   1
+3D Acceleration: on
+2D Video Acceleration: off
+Teleporter Enabled: off
+Teleporter Port: 0
+Teleporter Address: 
+Teleporter Password: 
+Storage Controller Name (0):            IDE Controller
+Storage Controller Type (0):            PIIX4
+Storage Controller Instance Number (0): 0
+Storage Controller Max Port Count (0):  2
+Storage Controller Port Count (0):      2
+IDE Controller (0, 0): /Donnees/VirtualBox/windows xp RU.vdi (UUID: cd51263a-8ce3-4f3d-95f1-e0664463b50c)
+IDE Controller (1, 0): /Donnees/Temp/torrent/winxphomeoemrus.iso (UUID: 41e46fe2-5a37-41a0-9c27-1f99344455e4)
+NIC 1:           MAC: 080027D338FD, Attachment: NAT, Cable connected: on, Trace: off (file: none), Type: Am79C973, Reported speed: 0 Mbps, Boot priority: 0
+NIC 1 Settings:  MTU: 0, Socket( send: 64, receive: 64), TCP Window( send:64, receive: 64)
+NIC 2:           disabled
+NIC 3:           disabled
+NIC 4:           disabled
+NIC 5:           disabled
+NIC 6:           disabled
+NIC 7:           disabled
+NIC 8:           disabled
+Pointing Device: PS/2 Mouse
+Keyboard Device: PS/2 Keyboard
+UART 1:          disabled
+UART 2:          disabled
+Audio:           enabled (Driver: OSS, Controller: AC97)
+Clipboard Mode:  Bidirectional
+USB:             disabled
+Shared folders:  <none>
+
+Guest:
+
+Configured memory balloon size:      0 MB
+
+
+Name:            Mandriva
+Guest OS:        Mandriva
+UUID:            c43f39f2-a970-40a0-9435-7b09b218efdf
+Config file:     /home/ddurieux/.VirtualBox/Machines/Mandriva/Mandriva.xml
+Hardware UUID:   c43f39f2-a970-40a0-9435-7b09b218efdf
+Memory size:     512MB
+Page Fusion:     off
+VRAM size:       12MB
+HPET:            off
+Number of CPUs:  1
+Synthetic Cpu:   off
+CPUID overrides: None
+Boot menu mode:  message and menu
+Boot Device (1): Floppy
+Boot Device (2): DVD
+Boot Device (3): HardDisk
+Boot Device (4): Not Assigned
+ACPI:            on
+IOAPIC:          off
+PAE:             off
+Time offset:     0 ms
+RTC:             UTC
+Hardw. virt.ext: on
+Hardw. virt.ext exclusive: on
+Nested Paging:   on
+Large Pages:     off
+VT-x VPID:       on
+State:           powered off (since 2010-10-27T18:37:31.000000000)
+Monitor count:   1
+3D Acceleration: off
+2D Video Acceleration: off
+Teleporter Enabled: off
+Teleporter Port: 0
+Teleporter Address: 
+Teleporter Password: 
+Storage Controller Name (0):            IDE Controller
+Storage Controller Type (0):            PIIX4
+Storage Controller Instance Number (0): 0
+Storage Controller Max Port Count (0):  2
+Storage Controller Port Count (0):      2
+Storage Controller Name (1):            SATA Controller
+Storage Controller Type (1):            IntelAhci
+Storage Controller Instance Number (1): 0
+Storage Controller Max Port Count (1):  30
+Storage Controller Port Count (1):      1
+IDE Controller (1, 0): Empty
+SATA Controller (0, 0): /Donnees/VirtualBox/Mandriva.vdi (UUID: 101029c3-3e6a-4f16-86e6-47fbf82ba37c)
+NIC 1:           MAC: 0800278A0380, Attachment: Bridged Interface 're0', Cable connected: on, Trace: off (file: none), Type: 82540EM, Reported speed: 0 Mbps, Boot priority: 0
+NIC 2:           disabled
+NIC 3:           disabled
+NIC 4:           disabled
+NIC 5:           disabled
+NIC 6:           disabled
+NIC 7:           disabled
+NIC 8:           disabled
+Pointing Device: USB Tablet
+Keyboard Device: PS/2 Keyboard
+UART 1:          disabled
+UART 2:          disabled
+Audio:           enabled (Driver: OSS, Controller: AC97)
+Clipboard Mode:  Bidirectional
+USB:             enabled
+Shared folders:  <none>
+
+Guest:
+
+Configured memory balloon size:      0 MB
+
+
+Name:            Macos
+Guest OS:        Mac OS X Server
+UUID:            d1fe6cfa-80c6-41ae-9f4b-2a15dbafcf2c
+Config file:     /home/ddurieux/.VirtualBox/Machines/Macos/Macos.xml
+Hardware UUID:   d1fe6cfa-80c6-41ae-9f4b-2a15dbafcf2c
+Memory size:     1365MB
+Page Fusion:     off
+VRAM size:       18MB
+HPET:            on
+Number of CPUs:  1
+Synthetic Cpu:   off
+CPUID overrides: None
+Boot menu mode:  message and menu
+Boot Device (1): DVD
+Boot Device (2): HardDisk
+Boot Device (3): Not Assigned
+Boot Device (4): Not Assigned
+ACPI:            on
+IOAPIC:          on
+PAE:             on
+Time offset:     0 ms
+RTC:             local time
+Hardw. virt.ext: on
+Hardw. virt.ext exclusive: on
+Nested Paging:   on
+Large Pages:     off
+VT-x VPID:       on
+State:           powered off (since 2010-10-26T15:37:41.000000000)
+Monitor count:   1
+3D Acceleration: on
+2D Video Acceleration: off
+Teleporter Enabled: off
+Teleporter Port: 0
+Teleporter Address: 
+Teleporter Password: 
+Storage Controller Name (0):            IDE Controller
+Storage Controller Type (0):            ICH6
+Storage Controller Instance Number (0): 0
+Storage Controller Max Port Count (0):  2
+Storage Controller Port Count (0):      2
+IDE Controller (0, 0): /home/ddurieux/.VirtualBox/HardDisks/macosx.vdi (UUID: a9f2b31c-c4e6-4899-ad42-b03245c54f88)
+IDE Controller (1, 0): /Donnees/Temp/macos/MacOSX_Server_1047_InstallDVD.iso (UUID: c4d1f35c-585d-413c-9b59-f93efe1008e3)
+NIC 1:           MAC: 0800270039B8, Attachment: NAT, Cable connected: on, Trace: off (file: none), Type: 82543GC, Reported speed: 0 Mbps, Boot priority: 0
+NIC 1 Settings:  MTU: 0, Socket( send: 64, receive: 64), TCP Window( send:64, receive: 64)
+NIC 2:           disabled
+NIC 3:           disabled
+NIC 4:           disabled
+NIC 5:           disabled
+NIC 6:           disabled
+NIC 7:           disabled
+NIC 8:           disabled
+Pointing Device: USB Tablet
+Keyboard Device: USB Keyboard
+UART 1:          disabled
+UART 2:          disabled
+Audio:           enabled (Driver: OSS, Controller: SB16)
+Clipboard Mode:  Bidirectional
+USB:             enabled
+Shared folders:  <none>
+
+Guest:
+
+Configured memory balloon size:      0 MB
+
+
diff --git a/t/inventory/virtualization/virtualbox.t b/t/inventory/virtualization/virtualbox.t
index 94be3ca..8a77466 100755
--- a/t/inventory/virtualization/virtualbox.t
+++ b/t/inventory/virtualization/virtualbox.t
@@ -90,6 +90,125 @@ my %tests = (
             UUID      => '4ddac902-a4f6-4ccb-a1a4-73dd6c90c1b2',
             VCPU      => 1
         }
+    ],
+    sample2 => [
+        {
+            VMTYPE    => 'VirtualBox',
+            NAME      => 'FreeBSD8 i386',
+            SUBSYSTEM => 'Oracle VM VirtualBox',
+            STATUS    => 'running',
+            MEMORY    => '512MB',
+            UUID      => 'd1857d13-a67f-4ba9-a3e6-101e42f59268',
+            VCPU      => 1
+        },
+        {
+            VMTYPE    => 'VirtualBox',
+            NAME      => 'Windows2000 (fusion agent)',
+            SUBSYSTEM => 'Oracle VM VirtualBox',
+            STATUS    => 'off',
+            MEMORY    => '512MB',
+            UUID      => 'f8d4f838-aaa4-4f9b-b756-f95bc8d9cceb',
+            VCPU      => 1
+        },
+        {
+            VMTYPE    => 'VirtualBox',
+            NAME      => 'Centos',
+            SUBSYSTEM => 'Oracle VM VirtualBox',
+            STATUS    => 'off',
+            MEMORY    => '776MB',
+            UUID      => '2cbb51b4-503c-4b5e-a6a5-878851a04658',
+            VCPU      => 1
+        },
+        {
+            VMTYPE    => 'VirtualBox',
+            NAME      => 'windows 7 RU',
+            SUBSYSTEM => 'Oracle VM VirtualBox',
+            STATUS    => 'off',
+            MEMORY    => '512MB',
+            UUID      => 'c404fff7-67bf-4b9c-95cc-19c6b27bcd5f',
+            VCPU      => 1
+        },
+        {
+            VMTYPE    => 'VirtualBox',
+            NAME      => 'Windows XP',
+            SUBSYSTEM => 'Oracle VM VirtualBox',
+            STATUS    => 'running',
+            MEMORY    => '512MB',
+            UUID      => '3fd80a8f-ed78-4421-9192-c0af6f5f66d5',
+            VCPU      => 1
+        },
+        {
+            VMTYPE    => 'VirtualBox',
+            NAME      => 'windowsxp01',
+            SUBSYSTEM => 'Oracle VM VirtualBox',
+            STATUS    => 'off',
+            MEMORY    => '256MB',
+            UUID      => 'c7608d9d-c76c-4dab-8411-2784deb4eb1f',
+            VCPU      => 1
+        },
+        {
+            VMTYPE    => 'VirtualBox',
+            NAME      => 'windowsxp02',
+            SUBSYSTEM => 'Oracle VM VirtualBox',
+            STATUS    => 'off',
+            MEMORY    => '256MB',
+            UUID      => 'cd033191-26c3-49c9-afee-1e3affc933ee',
+            VCPU      => 1
+        },
+        {
+            VMTYPE    => 'VirtualBox',
+            NAME      => 'debian10023',
+            SUBSYSTEM => 'Oracle VM VirtualBox',
+            STATUS    => 'off',
+            MEMORY    => '200MB',
+            UUID      => 'ec43b1fc-0efc-487f-8188-a104473db0d5',
+            VCPU      => 1
+        },
+        {
+            VMTYPE    => 'VirtualBox',
+            NAME      => 'debian10024',
+            SUBSYSTEM => 'Oracle VM VirtualBox',
+            STATUS    => 'off',
+            MEMORY    => '200MB',
+            UUID      => 'd410a9a0-0b31-4bad-9a51-80ab37701d1d',
+            VCPU      => 1
+        },
+        {
+            VMTYPE    => 'VirtualBox',
+            NAME      => 'MacOSX 10.6',
+            SUBSYSTEM => 'Oracle VM VirtualBox',
+            STATUS    => 'off',
+            MEMORY    => '1024MB',
+            UUID      => '85b780f6-b3fd-44d3-bb94-d8583cd78770',
+            VCPU      => 1
+        },
+        {
+            VMTYPE    => 'VirtualBox',
+            NAME      => 'windows xp RU',
+            SUBSYSTEM => 'Oracle VM VirtualBox',
+            STATUS    => 'off',
+            MEMORY    => '306MB',
+            UUID      => 'fbc00535-0e8d-4955-8026-2bd50bf606e9',
+            VCPU      => 1
+        },
+        {
+            VMTYPE    => 'VirtualBox',
+            NAME      => 'Mandriva',
+            SUBSYSTEM => 'Oracle VM VirtualBox',
+            STATUS    => 'off',
+            MEMORY    => '512MB',
+            UUID      => 'c43f39f2-a970-40a0-9435-7b09b218efdf',
+            VCPU      => 1
+        },
+        {
+            VMTYPE    => 'VirtualBox',
+            NAME      => 'Macos',
+            SUBSYSTEM => 'Oracle VM VirtualBox',
+            STATUS    => 'off',
+            MEMORY    => '1365MB',
+            UUID      => 'd1fe6cfa-80c6-41ae-9f4b-2a15dbafcf2c',
+            VCPU      => 1
+        }
     ]
 );
 


================================================================
  Commit: 2683a30eb77bda205ad4344b4f15f8539acfd3d2
      https://github.com/fusinv/fusioninventory-agent/commit/2683a30eb77bda205ad4344b4f15f8539acfd3d2
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-07 (Wed, 07 Mar 2012)

  Changed paths:
    A resources/win32/wmi/2003-Win32_PhysicalMemoryArray.wmi
    A resources/win32/wmi/2003SP2-Win32_PhysicalMemoryArray.wmi
    A resources/win32/wmi/xp-Win32_PhysicalMemoryArray.wmi
    M t/inventory/windows/memory.t

  Log Message:
  -----------
  add three new samples


diff --git a/resources/win32/wmi/2003-Win32_PhysicalMemoryArray.wmi b/resources/win32/wmi/2003-Win32_PhysicalMemoryArray.wmi
new file mode 100644
index 0000000..7d3559a
Binary files /dev/null and b/resources/win32/wmi/2003-Win32_PhysicalMemoryArray.wmi differ
diff --git a/resources/win32/wmi/2003SP2-Win32_PhysicalMemoryArray.wmi b/resources/win32/wmi/2003SP2-Win32_PhysicalMemoryArray.wmi
new file mode 100644
index 0000000..acfaaeb
Binary files /dev/null and b/resources/win32/wmi/2003SP2-Win32_PhysicalMemoryArray.wmi differ
diff --git a/resources/win32/wmi/xp-Win32_PhysicalMemoryArray.wmi b/resources/win32/wmi/xp-Win32_PhysicalMemoryArray.wmi
new file mode 100644
index 0000000..6992ffe
Binary files /dev/null and b/resources/win32/wmi/xp-Win32_PhysicalMemoryArray.wmi differ
diff --git a/t/inventory/windows/memory.t b/t/inventory/windows/memory.t
index 3ff1983..c538344 100755
--- a/t/inventory/windows/memory.t
+++ b/t/inventory/windows/memory.t
@@ -42,6 +42,67 @@ my %tests = (
             DESCRIPTION  => "Mémoire physique",
             CAPACITY     => '2048'
         }
+    ],
+    'xp' => [
+        {
+            NUMSLOTS     => 0,
+            FORMFACTOR   => 'DIMM',
+            SERIALNUMBER => undef,
+            TYPE         => 'Unknown',
+            SPEED        => '800',
+            CAPTION      => 'Physical Memory',
+            REMOVABLE    => 0,
+            DESCRIPTION  => 'Physical Memory',
+            CAPACITY     => '2048'
+        },
+        {
+            NUMSLOTS     => 1,
+            FORMFACTOR   => 'DIMM',
+            SERIALNUMBER => undef,
+            TYPE         => 'Unknown',
+            SPEED        => '800',
+            CAPTION      => 'Physical Memory',
+            REMOVABLE    => 0,
+            DESCRIPTION  => 'Physical Memory',
+            CAPACITY     => '2048'
+        }
+      ],
+    '2003' => [
+        {
+            NUMSLOTS     => 0,
+            FORMFACTOR   => 'DIMM',
+            SERIALNUMBER => undef,
+            TYPE         => 'Unknown',
+            SPEED        => '266',
+            CAPTION      => 'Physical Memory',
+            REMOVABLE    => 0,
+            DESCRIPTION  => 'Physical Memory',
+            CAPACITY     => '1024'
+        },
+        {
+            NUMSLOTS     => 1,
+            FORMFACTOR   => 'DIMM',
+            SERIALNUMBER => undef,
+            TYPE         => 'Unknown',
+            SPEED        => '266',
+            CAPTION      => 'Physical Memory',
+            REMOVABLE    => 0,
+            DESCRIPTION  => 'Physical Memory',
+            CAPACITY     => '1024'
+        }
+      ],
+    '2003SP2' => [
+        {
+            NUMSLOTS     => 0,
+            FORMFACTOR   => 'DIMM',
+            SERIALNUMBER => undef,
+            TYPE         => 'DRAM',
+            SPEED        => undef,
+            CAPTION      => 'Physical Memory',
+            REMOVABLE    => 0,
+            DESCRIPTION  => 'Physical Memory',
+            CAPACITY     => '1024'
+        }
     ]
 );
 


================================================================
  Commit: 64dccad34551992ad6af6c331a0f2735545030ce
      https://github.com/fusinv/fusioninventory-agent/commit/64dccad34551992ad6af6c331a0f2735545030ce
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-07 (Wed, 07 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Bios.pm

  Log Message:
  -----------
  add missing import statement (close #1505)


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Bios.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Bios.pm
index b0b6c07..d3ece23 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Bios.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Bios.pm
@@ -4,6 +4,7 @@ use strict;
 use warnings;
 
 use FusionInventory::Agent::Tools;
+use FusionInventory::Agent::Tools::MacOS;
 
 sub isEnabled {
     return 


================================================================
  Commit: db3254890e165db99d8ae971e1013c4aacb91f2d
      https://github.com/fusinv/fusioninventory-agent/commit/db3254890e165db99d8ae971e1013c4aacb91f2d
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-07 (Wed, 07 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Sound.pm

  Log Message:
  -----------
  Merge remote-tracking branch 'forge/2.2.x' into 2.2.x


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Sound.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Sound.pm
index faa4285..dd9ae96 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Sound.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Sound.pm
@@ -22,7 +22,7 @@ sub doInventory {
 
     # add sound cards
     foreach my $x (keys %$info){
-        $inventory->addSound({
+        $inventory->addEntry({
             section => 'SOUNDS',
             entry   => {
                 NAME         => $x,


================================================================
  Commit: 1d1f3cbc63d3be1f2f06c735adf89fedab80560b
      https://github.com/fusinv/fusioninventory-agent/commit/1d1f3cbc63d3be1f2f06c735adf89fedab80560b
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-07 (Wed, 07 Mar 2012)

  Changed paths:
    M Makefile.PL

  Log Message:
  -----------
  add auto-install support


diff --git a/Makefile.PL b/Makefile.PL
index baf80b9..b27ed31 100644
--- a/Makefile.PL
+++ b/Makefile.PL
@@ -59,6 +59,10 @@ makemaker_args(
     },
 );
 
+auto_install(
+    do_once => 1 # skip previously failed modules
+);
+
 WriteAll;
 
 # substitute prefix everywhere


================================================================
  Commit: 33e4f14c0fd30be0e2d93a22ad99fcbf3915c12a
      https://github.com/fusinv/fusioninventory-agent/commit/33e4f14c0fd30be0e2d93a22ad99fcbf3915c12a
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-08 (Thu, 08 Mar 2012)

  Changed paths:
    M Changes
    M fusioninventory-agent
    M lib/FusionInventory/Agent/Config.pm

  Log Message:
  -----------
  add --config option, to manage configuration backend


diff --git a/Changes b/Changes
index 77137bc..5f460b1 100644
--- a/Changes
+++ b/Changes
@@ -45,6 +45,9 @@ Major changes:
     have been deprecated in favor of a generic --no-task option
   - --no-software, --no-printer options have been deprecated in favor of a
     generic --no-category option, and 'environment' value support has been added
+* new --config option allows to select configuration backend, allowing to use
+  file configuration if needed under windows, or to ignore any external
+  configuration
 * fusioninventory-agent-config executable has been dropped, in favor of better
   documentation
 * documentation has been reviewed for consistency in various places where it
diff --git a/fusioninventory-agent b/fusioninventory-agent
index 52e6c53..f844aa1 100755
--- a/fusioninventory-agent
+++ b/fusioninventory-agent
@@ -21,6 +21,7 @@ GetOptions(
     'ca-cert-dir=s',
     'ca-cert-file=s',
     'conf-file=s',
+    'config=s',
     'color',
     'daemon|d',
     'no-fork',
@@ -166,14 +167,15 @@ B<fusioninventory-agent> [options] [--server server|--local directory|--sdout]
     --httpd-trust=RANGE        trust requests from range without authentication token (false)
 
   Logging options
-    --logger                    Logger backend, either Stderr, File or Syslog (Stderr)
+    --logger=BACKEND            logger backend [Stderr|File|Syslog] (Stderr)
     --logfile=FILE              log file
     --logfile-maxsize=X         maximum size of the log file in MB (0)
     --logfacility=FACILITY      syslog facility (LOG_USER)
     --color                     use color in the console (false)
 
-  Agent setup options
-    --conf-file=FILE            path to an alternative config file
+  Configuration options
+    --config=BACKEND            configuration backend [file|registry|none]
+    --conf-file=FILE            configuration file
 
   Execution mode options
     -d --daemon                 run the agent as a daemon (false)
@@ -457,7 +459,7 @@ Trust requests from given range without authentication token (false).
 
 =over
 
-=item B<--logger>=I<LOGGER>
+=item B<--logger>=I<BACKEND>
 
 Logger backend to use. It can be:
 
@@ -501,15 +503,33 @@ This options is ignored on Windows.
 
 =back
 
-=head2 Agent setup options
+=head2 Configuration options
 
 =over
 
 =item B<--conf-file>=I<FILE>
 
-Path to an alternative configuration file.
+Use I<FILE> as configuration file (implies file configuration backend)
 
-This options is ignored on Windows.
+=item B<--config>=I<BACKEND>
+
+Configuration backend to use. It can be:
+
+=over 4
+
+=item
+
+file: read configuration from a file (default anywhere else as Windows)
+
+=item
+
+registry: read configuration from the registry (default on Windows)
+
+=item
+
+none: don't read any configuration
+
+=back
 
 =back
 
diff --git a/lib/FusionInventory/Agent/Config.pm b/lib/FusionInventory/Agent/Config.pm
index 74afddc..ab10af9 100644
--- a/lib/FusionInventory/Agent/Config.pm
+++ b/lib/FusionInventory/Agent/Config.pm
@@ -84,14 +84,34 @@ sub new {
     bless $self, $class;
     $self->_loadDefaults();
 
-    if ($OSNAME eq 'MSWin32') {
-        $self->_loadFromWinRegistry();
-    } else {
-        $self->_loadFromCfgFile({
-            file      => $params{options}->{'conf-file'},
-            directory => $params{confdir},
-        });
+    my $backend =
+        $params{options}->{config} ? $params{options}->{config} :
+        $OSNAME eq 'MSWin32'       ? 'registry'                 :
+                                     'file';
+
+    SWITCH: {
+        if ($backend eq 'registry') {
+            die "Unavailable configuration backend\n"
+                unless $OSNAME eq 'MSWin32';
+            $self->_loadFromWinRegistry();
+            last SWITCH;
+        }
+
+        if ($backend eq 'file') {
+            $self->_loadFromCfgFile({
+                file      => $params{options}->{'conf-file'},
+                directory => $params{confdir},
+            });
+            last SWITCH;
+        }
+
+        if ($backend eq 'none') {
+            last SWITCH;
+        }
+
+        die "Unknown configuration backend '$backend'\n";
     }
+
     $self->_loadUserParams($params{options});
 
     $self->_checkContent();


================================================================
  Commit: 26e59c58d2b6e2ce560044573bdbf3e0b6b385c7
      https://github.com/fusinv/fusioninventory-agent/commit/26e59c58d2b6e2ce560044573bdbf3e0b6b385c7
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-08 (Thu, 08 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Config.pm

  Log Message:
  -----------
  shorter non-ambiguous method names


diff --git a/lib/FusionInventory/Agent/Config.pm b/lib/FusionInventory/Agent/Config.pm
index ab10af9..c21424e 100644
--- a/lib/FusionInventory/Agent/Config.pm
+++ b/lib/FusionInventory/Agent/Config.pm
@@ -93,12 +93,12 @@ sub new {
         if ($backend eq 'registry') {
             die "Unavailable configuration backend\n"
                 unless $OSNAME eq 'MSWin32';
-            $self->_loadFromWinRegistry();
+            $self->_loadFromRegistry();
             last SWITCH;
         }
 
         if ($backend eq 'file') {
-            $self->_loadFromCfgFile({
+            $self->_loadFromFile({
                 file      => $params{options}->{'conf-file'},
                 directory => $params{confdir},
             });
@@ -127,7 +127,7 @@ sub _loadDefaults {
     }
 }
 
-sub _loadFromWinRegistry {
+sub _loadFromRegistry {
     my ($self) = @_;
 
     my $Registry;
@@ -156,7 +156,7 @@ sub _loadFromWinRegistry {
     }
 }
 
-sub _loadFromCfgFile {
+sub _loadFromFile {
     my ($self, $params) = @_;
 
     my $file = $params->{file} ?


================================================================
  Commit: ebe3be416cd1d574f85978cf1170ef5617ad5dac
      https://github.com/fusinv/fusioninventory-agent/commit/ebe3be416cd1d574f85978cf1170ef5617ad5dac
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-08 (Thu, 08 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Config.pm

  Log Message:
  -----------
  don't access registry directly


diff --git a/lib/FusionInventory/Agent/Config.pm b/lib/FusionInventory/Agent/Config.pm
index c21424e..9267f4c 100644
--- a/lib/FusionInventory/Agent/Config.pm
+++ b/lib/FusionInventory/Agent/Config.pm
@@ -130,19 +130,13 @@ sub _loadDefaults {
 sub _loadFromRegistry {
     my ($self) = @_;
 
-    my $Registry;
-    Win32::TieRegistry->require();
-    Win32::TieRegistry->import(
-        Delimiter   => '/',
-        ArrayValues => 0,
-        TiedRef     => \$Registry
-    );
-
-    my $machKey = $Registry->Open('LMachine', {
-        Access => Win32::TieRegistry::KEY_READ()
-    }) or die "Can't open HKEY_LOCAL_MACHINE key: $EXTENDED_OS_ERROR";
+    FusionInventory::Agent::Tools::Win32->use();
+    die "Failed to load FusionInventory::Agent::Tools::Win32: $EVAL_ERROR"
+        if $EVAL_ERROR;
 
-    my $settings = $machKey->{"SOFTWARE/FusionInventory-Agent"};
+    my $settings = getRegistryKey(
+        path => "HKEY_LOCAL_MACHINE/SOFTWARE/FusionInventory-Agent",
+    );
 
     foreach my $rawKey (keys %$settings) {
         next unless $rawKey =~ /^\/(\S+)/;


================================================================
  Commit: ec14f2c0a9251c52aee5b52ee762da95a3360e56
      https://github.com/fusinv/fusioninventory-agent/commit/ec14f2c0a9251c52aee5b52ee762da95a3360e56
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-08 (Thu, 08 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Config.pm

  Log Message:
  -----------
  a config-file option implies a file configuration backend


diff --git a/lib/FusionInventory/Agent/Config.pm b/lib/FusionInventory/Agent/Config.pm
index 9267f4c..763e8f4 100644
--- a/lib/FusionInventory/Agent/Config.pm
+++ b/lib/FusionInventory/Agent/Config.pm
@@ -85,9 +85,10 @@ sub new {
     $self->_loadDefaults();
 
     my $backend =
-        $params{options}->{config} ? $params{options}->{config} :
-        $OSNAME eq 'MSWin32'       ? 'registry'                 :
-                                     'file';
+        $params{options}->{'conf-file'} ? 'file'                     :
+        $params{options}->{config}      ? $params{options}->{config} :
+        $OSNAME eq 'MSWin32'            ? 'registry'                 :
+                                          'file';
 
     SWITCH: {
         if ($backend eq 'registry') {


================================================================
  Commit: 113eb966fa655cf0bc1d38716f061d9e54ab38b9
      https://github.com/fusinv/fusioninventory-agent/commit/113eb966fa655cf0bc1d38716f061d9e54ab38b9
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-03-09 (Fri, 09 Mar 2012)

  Changed paths:
    M Changes
    M lib/FusionInventory/Agent/Task/Inventory.pm

  Log Message:
  -----------
  Revert "use .xml extension for local inventory file name (close #211)"

There will be another format extension changes in the 3.0 (.json). We prefer
to keep the extension unchanged for the moment.

This reverts commit 87791f2779448dfa995c611431e46ba9c8953826.


diff --git a/Changes b/Changes
index 5f460b1..a152f51 100644
--- a/Changes
+++ b/Changes
@@ -59,7 +59,6 @@ Major changes:
 
 Minor changes:
 * Add the HARDWARE/CHASSIS_TYPE information
-* local inventory file name now has .xml extension (#211)
 * Linux: report all IP addresses used by each interfaces (#854)
 * HPUX: don't report unoccupied memory slots
 * AIX: add LVM support
diff --git a/lib/FusionInventory/Agent/Task/Inventory.pm b/lib/FusionInventory/Agent/Task/Inventory.pm
index a0b3e1a..9c9aac7 100644
--- a/lib/FusionInventory/Agent/Task/Inventory.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory.pm
@@ -82,7 +82,7 @@ sub run {
     } elsif ($self->{target}->isa('FusionInventory::Agent::Target::Local')) {
         my $format = $self->{target}->{format};
 
-        my $extension = $format eq 'xml' ? '.xml' : '.html';
+        my $extension = $format eq 'xml' ? '.ocs' : '.html';
         my $file =
             $self->{config}->{local} .
             "/" .


================================================================
  Commit: 089d3d415f8fba9db6ad9259c00bf30855dc5415
      https://github.com/fusinv/fusioninventory-agent/commit/089d3d415f8fba9db6ad9259c00bf30855dc5415
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-09 (Fri, 09 Mar 2012)

  Changed paths:
    M t/inventory/windows/cpu.t

  Log Message:
  -----------
  add three new cases, without dmidecode sample


diff --git a/t/inventory/windows/cpu.t b/t/inventory/windows/cpu.t
index ef03d46..87ee45e 100755
--- a/t/inventory/windows/cpu.t
+++ b/t/inventory/windows/cpu.t
@@ -30,6 +30,62 @@ my %tests = (
             THREAD       => undef,
             CORE         => '4'
         }
+    ],
+    '2003' => [
+        {
+            ID           => 'BFEBFBFF00000F29',
+            NAME         => 'Intel(R) Xeon(TM) CPU 3.06GHz',
+            SERIAL       => undef,
+            MANUFACTURER => 'Intel',
+            DESCRIPTION  => 'x86 Family 15 Model 2 Stepping 9',
+            SPEED        => '3060',
+            THREAD       => undef,
+            CORE         => undef
+        },
+        {
+            ID           => '0000000000000000',
+            NAME         => 'Intel(R) Xeon(TM) CPU 3.06GHz',
+            SERIAL       => undef,
+            MANUFACTURER => 'Intel',
+            DESCRIPTION  => 'x86 Family 15 Model 2 Stepping 9',
+            SPEED        => '3060',
+            THREAD       => undef,
+            CORE         => undef
+        }
+    ],
+    '2003SP2' => [
+        {
+            ID           => '0FEBBBFF00010676',
+            NAME         => 'Intel(R) Xeon(R) CPU           E5440  @ 2.83GHz',
+            SERIAL       => undef,
+            MANUFACTURER => 'Intel',
+            DESCRIPTION  => 'x86 Family 6 Model 23 Stepping 6',
+            SPEED        => '2830',
+            THREAD       => undef,
+            CORE         => undef
+        },
+        {
+            ID           => '0FEBBBFF00000676',
+            NAME         => 'Intel(R) Xeon(R) CPU           E5440  @ 2.83GHz',
+            SERIAL       => undef,
+            MANUFACTURER => 'Intel',
+            DESCRIPTION  => 'x86 Family 6 Model 23 Stepping 6',
+            SPEED        => '2830',
+            THREAD       => undef,
+            CORE         => undef
+        }
+    ],
+    'xp' => [
+        {
+            ID           => 'BFEBFBFF00010676',
+            NAME         => 'Intel(R) Core(TM)2 Duo CPU     T9400  @ 2.53GHz',
+            SERIAL       => undef,
+            MANUFACTURER => 'Intel',
+            DESCRIPTION  => 'x86 Family 6 Model 23 Stepping 6',
+            SPEED        => '2530',
+            THREAD       => undef,
+            CORE         => '2'
+        }
     ]
 );
 
@@ -48,10 +104,12 @@ foreach my $test (keys %tests) {
     $module->mock(
         'getCpusFromDmidecode',
         sub {
+            my $file = "resources/generic/dmidecode/windows-$test";
             return
+                -f $file ?
                 FusionInventory::Agent::Tools::Generic::getCpusFromDmidecode(
-                    file => "resources/generic/dmidecode/windows-$test"
-                );
+                    file => $file
+                ) : ();
         }
     );
 


================================================================
  Commit: d9771f1c9453b5a3f4037a7af095ab7fc48ae368
      https://github.com/fusinv/fusioninventory-agent/commit/d9771f1c9453b5a3f4037a7af095ab7fc48ae368
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-09 (Fri, 09 Mar 2012)

  Changed paths:
    R resources/generic/dmidecode/windows-xppro
    M t/inventory/generic/dmidecode/memory.t
    M t/tools/generic.t

  Log Message:
  -----------
  renaming, for consistency with registry and wmi samples


There was an error trying to read the diff from github.com (execution expired)

================================================================
  Commit: e34881da2a67e940f92e8ca136110caa6bf33486
      https://github.com/fusinv/fusioninventory-agent/commit/e34881da2a67e940f92e8ca136110caa6bf33486
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-09 (Fri, 09 Mar 2012)

  Changed paths:
    M t/inventory/windows/cpu.t

  Log Message:
  -----------
  fix expected results, we have dmidecode sample for xp


diff --git a/t/inventory/windows/cpu.t b/t/inventory/windows/cpu.t
index 87ee45e..5a24c8e 100755
--- a/t/inventory/windows/cpu.t
+++ b/t/inventory/windows/cpu.t
@@ -19,7 +19,7 @@ BEGIN {
 use FusionInventory::Agent::Task::Inventory::Input::Win32::CPU;
 
 my %tests = (
-    7 => [
+    '7' => [
         {
             ID           => 'A7 06 02 00 FF FB EB BF',
             NAME         => 'Intel(R) Core(TM) i5-2300 CPU @ 2.80GHz',
@@ -77,13 +77,13 @@ my %tests = (
     ],
     'xp' => [
         {
-            ID           => 'BFEBFBFF00010676',
+            ID           => '76 06 01 00 FF FB EB BF',
             NAME         => 'Intel(R) Core(TM)2 Duo CPU     T9400  @ 2.53GHz',
             SERIAL       => undef,
             MANUFACTURER => 'Intel',
             DESCRIPTION  => 'x86 Family 6 Model 23 Stepping 6',
             SPEED        => '2530',
-            THREAD       => undef,
+            THREAD       => '2',
             CORE         => '2'
         }
     ]


================================================================
  Commit: d8a7952c3cb64914d359602e68f51a82360a8802
      https://github.com/fusinv/fusioninventory-agent/commit/d8a7952c3cb64914d359602e68f51a82360a8802
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-09 (Fri, 09 Mar 2012)

  Changed paths:
    M t/inventory/windows/memory.t

  Log Message:
  -----------
  consistent syntax for hash keys


diff --git a/t/inventory/windows/memory.t b/t/inventory/windows/memory.t
index c538344..88683fa 100755
--- a/t/inventory/windows/memory.t
+++ b/t/inventory/windows/memory.t
@@ -19,7 +19,7 @@ BEGIN {
 use FusionInventory::Agent::Task::Inventory::Input::Win32::Memory;
 
 my %tests = (
-    7 => [
+    '7' => [
         {
             NUMSLOTS     => 0,
             FORMFACTOR   => 'DIMM',


================================================================
  Commit: 056cee3fe6e4c9e08f5b8727952266a49f376bd0
      https://github.com/fusinv/fusioninventory-agent/commit/056cee3fe6e4c9e08f5b8727952266a49f376bd0
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-09 (Fri, 09 Mar 2012)

  Changed paths:
    M Changes
    M lib/FusionInventory/Agent/Task/Inventory.pm

  Log Message:
  -----------
  Merge remote-tracking branch 'forge/2.2.x' into 2.2.x


diff --git a/Changes b/Changes
index 5f460b1..a152f51 100644
--- a/Changes
+++ b/Changes
@@ -59,7 +59,6 @@ Major changes:
 
 Minor changes:
 * Add the HARDWARE/CHASSIS_TYPE information
-* local inventory file name now has .xml extension (#211)
 * Linux: report all IP addresses used by each interfaces (#854)
 * HPUX: don't report unoccupied memory slots
 * AIX: add LVM support
diff --git a/lib/FusionInventory/Agent/Task/Inventory.pm b/lib/FusionInventory/Agent/Task/Inventory.pm
index a0b3e1a..9c9aac7 100644
--- a/lib/FusionInventory/Agent/Task/Inventory.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory.pm
@@ -82,7 +82,7 @@ sub run {
     } elsif ($self->{target}->isa('FusionInventory::Agent::Target::Local')) {
         my $format = $self->{target}->{format};
 
-        my $extension = $format eq 'xml' ? '.xml' : '.html';
+        my $extension = $format eq 'xml' ? '.ocs' : '.html';
         my $file =
             $self->{config}->{local} .
             "/" .


================================================================
  Commit: 23b0f421498d57f911cef911c6d5767163c7ec91
      https://github.com/fusinv/fusioninventory-agent/commit/23b0f421498d57f911cef911c6d5767163c7ec91
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-03-09 (Fri, 09 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/HTTP/Client.pm

  Log Message:
  -----------
  HTTP client: connection timeout ignored

If timeout parameter was not defined during the object creation,
the HTTP LWP::USerAgent timeout was set to undef.

closes: #1481

Reported-by: Kevin Roy <kiniou at gmail.com


diff --git a/lib/FusionInventory/Agent/HTTP/Client.pm b/lib/FusionInventory/Agent/HTTP/Client.pm
index 8c1940f..95cea96 100644
--- a/lib/FusionInventory/Agent/HTTP/Client.pm
+++ b/lib/FusionInventory/Agent/HTTP/Client.pm
@@ -48,7 +48,7 @@ sub new {
     }
 
     $self->{ua}->agent($FusionInventory::Agent::AGENT_STRING);
-    $self->{ua}->timeout($params{timeout});
+    $self->{ua}->timeout($self->{timeout});
 
     return $self;
 }


================================================================
  Commit: e8291ea4b67415eed560340cac4d178c6aaeb30d
      https://github.com/fusinv/fusioninventory-agent/commit/e8291ea4b67415eed560340cac4d178c6aaeb30d
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-03-09 (Fri, 09 Mar 2012)

  Changed paths:
    R resources/generic/dmidecode/windows-xppro
    M t/inventory/generic/dmidecode/memory.t
    M t/inventory/windows/cpu.t
    M t/inventory/windows/memory.t
    M t/tools/generic.t

  Log Message:
  -----------
  Merge remote-tracking branch 'origin/2.2.x' into 2.2.x


diff --git a/resources/generic/dmidecode/windows-xppro b/resources/generic/dmidecode/windows-xppro
deleted file mode 100644
index 6b999c7..0000000
--- a/resources/generic/dmidecode/windows-xppro
+++ /dev/null
@@ -1,586 +0,0 @@
-# dmidecode 2.11
-SMBIOS 2.4 present.
-57 structures occupying 2822 bytes.
-Table at 0x000F6570.
-
-Handle 0xDA00, DMI type 218, 251 bytes
-OEM-specific Type
-	Header and Data:
-		DA FB 00 DA B2 00 0D 5F 1F 37 40 7D 00 00 00 00
-		00 40 00 02 00 01 00 41 00 02 00 00 00 65 00 03
-		00 00 00 66 00 03 00 01 00 F1 00 04 00 00 00 F2
-		00 04 00 01 00 F3 00 04 00 02 00 0F 00 05 00 00
-		00 11 00 05 00 01 00 05 00 05 00 02 00 12 00 05
-		00 03 00 06 00 05 00 04 00 07 00 06 00 00 00 0B
-		00 06 00 01 00 0C 00 06 00 02 00 0D 00 06 00 03
-		00 89 01 07 00 00 00 8A 01 07 00 01 00 42 00 08
-		00 01 00 43 00 08 00 00 00 55 00 09 00 00 00 6D
-		00 09 00 01 00 16 02 09 00 02 00 98 01 09 00 03
-		00 0A 01 0A 00 01 00 0B 01 0A 00 00 00 2D 00 0B
-		00 02 00 6E 00 0B 00 01 00 2E 00 0B 00 00 00 11
-		01 0C 00 00 00 10 01 0C 00 01 00 F0 00 0D 00 01
-		00 ED 00 0D 00 00 00 41 01 0E 00 01 00 40 01 0E
-		00 00 00 47 01 0F 00 01 00 46 01 0F 00 00 00 4A
-		01 10 00 00 00 FF FF 00 00 00 00
-
-Handle 0xDA01, DMI type 218, 251 bytes
-OEM-specific Type
-	Header and Data:
-		DA FB 01 DA B2 00 0D 5F 1F 37 40 4B 01 10 00 01
-		00 04 02 11 00 00 00 05 02 11 00 01 00 02 02 12
-		00 00 00 03 02 12 00 01 00 52 01 13 00 01 00 53
-		01 13 00 00 00 80 01 14 00 01 00 7F 01 14 00 00
-		00 7C 01 15 00 01 00 7B 01 15 00 00 00 E8 02 16
-		00 00 00 E9 02 16 00 01 00 7E 01 17 00 01 00 7D
-		01 17 00 00 00 92 01 18 00 00 00 91 01 18 00 01
-		00 94 01 19 00 00 00 93 01 19 00 01 00 86 01 1A
-		00 01 00 85 01 1A 00 00 00 82 01 1B 00 01 00 81
-		01 1B 00 00 00 84 01 1C 00 01 00 83 01 1C 00 00
-		00 9B 01 1D 00 00 00 9C 01 1D 00 01 00 9D 01 1D
-		00 02 00 9E 01 1D 00 03 00 8D 01 1E 00 00 00 8E
-		01 1E 00 01 00 85 02 1F 00 00 00 86 02 1F 00 01
-		00 EA 00 20 00 00 00 EB 00 20 00 01 00 EC 00 20
-		00 02 00 A1 00 21 00 00 00 A3 00 21 00 01 00 28
-		00 22 00 00 00 FF FF 00 00 00 00
-
-Handle 0xDA02, DMI type 218, 251 bytes
-OEM-specific Type
-	Header and Data:
-		DA FB 02 DA B2 00 0D 5F 1F 37 40 29 00 22 00 01
-		00 2A 00 22 00 02 00 2B 00 23 00 00 00 2C 00 24
-		00 00 00 0E 01 25 00 01 00 0F 01 25 00 00 00 9B
-		00 26 00 01 00 9C 00 26 00 00 00 4D 01 27 00 01
-		00 4C 01 27 00 00 00 87 01 28 00 00 00 88 01 28
-		00 01 00 35 01 29 00 03 00 37 01 29 00 00 00 38
-		01 29 00 01 00 39 01 29 00 02 00 D9 01 2A 00 01
-		00 D8 01 2A 00 00 00 DF 01 2B 00 01 00 DE 01 2B
-		00 00 00 45 02 2C 00 00 00 44 02 2C 00 01 00 49
-		02 2D 00 00 00 48 02 2D 00 01 00 45 01 45 01 01
-		00 44 01 44 01 00 00 76 01 76 01 01 00 75 01 75
-		01 01 00 9F 00 9F 00 00 00 A0 00 A0 00 01 00 E1
-		01 E1 01 00 00 E3 01 E3 01 01 00 E2 01 E2 01 02
-		00 29 02 29 02 01 00 28 02 28 02 02 00 2A 02 2A
-		02 03 00 30 02 30 02 01 00 2F 02 2F 02 00 00 35
-		02 35 02 01 00 FF FF 00 00 00 00
-
-Handle 0xDA03, DMI type 218, 77 bytes
-OEM-specific Type
-	Header and Data:
-		DA 4D 03 DA B2 00 0D 5F 1F 37 40 36 02 36 02 00
-		00 37 02 37 02 02 00 4A 02 4A 02 01 00 0C 80 0C
-		80 01 00 6C 02 6C 02 01 00 6D 02 6D 02 00 00 01
-		F0 01 F0 00 00 02 F0 02 F0 00 00 03 F0 03 F0 00
-		00 04 F0 04 F0 00 00 FF FF 00 00 00 00
-
-Handle 0x0000, DMI type 0, 24 bytes
-BIOS Information
-	Vendor: Dell Inc.
-	Version: A24
-	Release Date: 08/19/2010
-	Address: 0xF0000
-	Runtime Size: 64 kB
-	ROM Size: 1728 kB
-	Characteristics:
-		ISA is supported
-		PCI is supported
-		PC Card (PCMCIA) is supported
-		PNP is supported
-		BIOS is upgradeable
-		BIOS shadowing is allowed
-		Boot from CD is supported
-		Selectable boot is supported
-		3.5"/720 kB floppy services are supported (int 13h)
-		Print screen service is supported (int 5h)
-		8042 keyboard services are supported (int 9h)
-		Serial services are supported (int 14h)
-		Printer services are supported (int 17h)
-		CGA/mono video services are supported (int 10h)
-		ACPI is supported
-		USB legacy is supported
-		AGP is supported
-		Smart battery is supported
-		BIOS boot specification is supported
-		Function key-initiated network boot is supported
-		Targeted content distribution is supported
-	BIOS Revision: 2.4
-	Firmware Revision: 2.4
-
-Handle 0x0100, DMI type 1, 27 bytes
-System Information
-	Manufacturer: Dell Inc.
-	Product Name: Precision M4400                 
-	Version: Not Specified
-	Serial Number: HLG964J
-	UUID: 44454C4C-4C00-1047-8039-C8C04F36344A
-	Wake-up Type: Power Switch
-	SKU Number: Not Specified
-	Family:  
-
-Handle 0x0200, DMI type 2, 9 bytes
-Base Board Information
-	Manufacturer: Dell Inc.
-	Product Name: 0P019G
-	Version:    
-	Serial Number: .HLG964J.CN129618C52450.
-	Asset Tag:           
-
-Handle 0x0300, DMI type 3, 13 bytes
-Chassis Information
-	Manufacturer: Dell Inc.
-	Type: Portable
-	Lock: Not Present
-	Version: Not Specified
-	Serial Number: HLG964J
-	Asset Tag: Not Specified
-	Boot-up State: Safe
-	Power Supply State: Safe
-	Thermal State: Safe
-	Security Status: None
-
-Handle 0x0400, DMI type 4, 40 bytes
-Processor Information
-	Socket Designation: Microprocessor
-	Type: Central Processor
-	Family: Core 2 Duo
-	Manufacturer: Intel
-	ID: 76 06 01 00 FF FB EB BF
-	Signature: Type 0, Family 6, Model 23, Stepping 6
-	Flags:
-		FPU (Floating-point unit on-chip)
-		VME (Virtual mode extension)
-		DE (Debugging extension)
-		PSE (Page size extension)
-		TSC (Time stamp counter)
-		MSR (Model specific registers)
-		PAE (Physical address extension)
-		MCE (Machine check exception)
-		CX8 (CMPXCHG8 instruction supported)
-		APIC (On-chip APIC hardware supported)
-		SEP (Fast system call)
-		MTRR (Memory type range registers)
-		PGE (Page global enable)
-		MCA (Machine check architecture)
-		CMOV (Conditional move instruction supported)
-		PAT (Page attribute table)
-		PSE-36 (36-bit page size extension)
-		CLFSH (CLFLUSH instruction supported)
-		DS (Debug store)
-		ACPI (ACPI supported)
-		MMX (MMX technology supported)
-		FXSR (FXSAVE and FXSTOR instructions supported)
-		SSE (Streaming SIMD extensions)
-		SSE2 (Streaming SIMD extensions 2)
-		SS (Self-snoop)
-		HTT (Multi-threading)
-		TM (Thermal monitor supported)
-		PBE (Pending break enabled)
-	Version: Not Specified
-	Voltage: 3.3 V
-	External Clock: 266 MHz
-	Max Speed: 2534 MHz
-	Current Speed: 2534 MHz
-	Status: Populated, Enabled
-	Upgrade: None
-	L1 Cache Handle: 0x0700
-	L2 Cache Handle: 0x0701
-	L3 Cache Handle: Not Provided
-	Serial Number: Not Specified
-	Asset Tag: Not Specified
-	Part Number: Not Specified
-	Core Count: 2
-	Core Enabled: 2
-	Thread Count: 2
-	Characteristics:
-		64-bit capable
-
-Handle 0x0700, DMI type 7, 19 bytes
-Cache Information
-	Socket Designation: Not Specified
-	Configuration: Enabled, Not Socketed, Level 1
-	Operational Mode: Write Back
-	Location: Internal
-	Installed Size: 128 kB
-	Maximum Size: 128 kB
-	Supported SRAM Types:
-		Unknown
-	Installed SRAM Type: Unknown
-	Speed: Unknown
-	Error Correction Type: None
-	System Type: Data
-	Associativity: 4-way Set-associative
-
-Handle 0x0701, DMI type 7, 19 bytes
-Cache Information
-	Socket Designation: Not Specified
-	Configuration: Enabled, Not Socketed, Level 2
-	Operational Mode: Varies With Memory Address
-	Location: Internal
-	Installed Size: 6144 kB
-	Maximum Size: 6144 kB
-	Supported SRAM Types:
-		Pipeline Burst
-	Installed SRAM Type: Pipeline Burst
-	Speed: 15 ns
-	Error Correction Type: None
-	System Type: Unified
-	Associativity: Other
-
-Handle 0x0800, DMI type 8, 9 bytes
-Port Connector Information
-	Internal Reference Designator: PARALLEL
-	Internal Connector Type: None
-	External Reference Designator: Not Specified
-	External Connector Type: DB-25 female
-	Port Type: Parallel Port PS/2
-
-Handle 0x0801, DMI type 8, 9 bytes
-Port Connector Information
-	Internal Reference Designator: SERIAL1
-	Internal Connector Type: None
-	External Reference Designator: Not Specified
-	External Connector Type: DB-9 male
-	Port Type: Serial Port 16550A Compatible
-
-Handle 0x0804, DMI type 8, 9 bytes
-Port Connector Information
-	Internal Reference Designator: USB
-	Internal Connector Type: None
-	External Reference Designator: Not Specified
-	External Connector Type: Access Bus (USB)
-	Port Type: USB
-
-Handle 0x0806, DMI type 8, 9 bytes
-Port Connector Information
-	Internal Reference Designator: MONITOR
-	Internal Connector Type: None
-	External Reference Designator: Not Specified
-	External Connector Type: DB-15 female
-	Port Type: Video Port
-
-Handle 0x080B, DMI type 8, 9 bytes
-Port Connector Information
-	Internal Reference Designator: FireWire
-	Internal Connector Type: None
-	External Reference Designator: Not Specified
-	External Connector Type: IEEE 1394
-	Port Type: Firewire (IEEE P1394)
-
-Handle 0x080C, DMI type 8, 9 bytes
-Port Connector Information
-	Internal Reference Designator: Modem
-	Internal Connector Type: None
-	External Reference Designator: Not Specified
-	External Connector Type: RJ-11
-	Port Type: Modem Port
-
-Handle 0x080D, DMI type 8, 9 bytes
-Port Connector Information
-	Internal Reference Designator: Ethernet
-	Internal Connector Type: None
-	External Reference Designator: Not Specified
-	External Connector Type: RJ-45
-	Port Type: Network Port
-
-Handle 0x0900, DMI type 9, 13 bytes
-System Slot Information
-	Designation: PCMCIA 0
-	Type: 32-bit PC Card (PCMCIA)
-	Current Usage: Available
-	Length: Other
-	ID: Adapter 0, Socket 0
-	Characteristics:
-		5.0 V is provided
-		3.3 V is provided
-		PC Card-16 is supported
-		Cardbus is supported
-		Zoom Video is supported
-		Modem ring resume is supported
-
-Handle 0x0A00, DMI type 10, 6 bytes
-On Board Device Information
-	Type: Video
-	Status: Enabled
-	Description: NVIDIA Quadro FX 1700M        
-
-Handle 0x0A01, DMI type 10, 6 bytes
-On Board Device Information
-	Type: Sound
-	Status: Enabled
-	Description: IDT 92HD71
-
-Handle 0x0B00, DMI type 11, 5 bytes
-OEM Strings
-	String 1: Dell System
-	String 2: 5[0003]
-	String 3: 13[PP04X]
-
-Handle 0x0D00, DMI type 13, 22 bytes
-BIOS Language Information
-	Language Description Format: Long
-	Installable Languages: 1
-		en|US|iso8859-1
-	Currently Installed Language: en|US|iso8859-1
-
-Handle 0x1000, DMI type 16, 15 bytes
-Physical Memory Array
-	Location: System Board Or Motherboard
-	Use: System Memory
-	Error Correction Type: None
-	Maximum Capacity: 8 GB
-	Error Information Handle: Not Provided
-	Number Of Devices: 2
-
-Handle 0x1100, DMI type 17, 27 bytes
-Memory Device
-	Array Handle: 0x1000
-	Error Information Handle: Not Provided
-	Total Width: 64 bits
-	Data Width: 64 bits
-	Size: 2048 MB
-	Form Factor: DIMM
-	Set: None
-	Locator: DIMM_A
-	Bank Locator: Not Specified
-	Type: DDR2
-	Type Detail: Synchronous
-	Speed: 800 MHz
-	Manufacturer: 7F7FFE0000000000
-	Serial Number: 14FA6621
-	Asset Tag: 200840
-	Part Number: EBE21UE8ACUA-8G-E 
-
-Handle 0x1101, DMI type 17, 27 bytes
-Memory Device
-	Array Handle: 0x1000
-	Error Information Handle: Not Provided
-	Total Width: 64 bits
-	Data Width: 64 bits
-	Size: 2048 MB
-	Form Factor: DIMM
-	Set: None
-	Locator: DIMM_B
-	Bank Locator: Not Specified
-	Type: DDR2
-	Type Detail: Synchronous
-	Speed: 800 MHz
-	Manufacturer: 7F7FFE0000000000
-	Serial Number: AEF96621
-	Asset Tag: 200840
-	Part Number: EBE21UE8ACUA-8G-E 
-
-Handle 0x1301, DMI type 19, 15 bytes
-Memory Array Mapped Address
-	Starting Address: 0x00000000000
-	Ending Address: 0x000FFFFFFFF
-	Range Size: 4 GB
-	Physical Array Handle: 0x1000
-	Partition Width: 1
-
-Handle 0x1401, DMI type 20, 19 bytes
-Memory Device Mapped Address
-	Starting Address: 0x00000000000
-	Ending Address: 0x000FFFFFFFF
-	Range Size: 4 GB
-	Physical Device Handle: 0x1100
-	Memory Array Mapped Address Handle: 0x1301
-	Partition Row Position: 1
-	Interleave Position: 1
-	Interleaved Data Depth: 8
-
-Handle 0x1411, DMI type 126, 19 bytes
-Inactive
-
-Handle 0x1402, DMI type 20, 19 bytes
-Memory Device Mapped Address
-	Starting Address: 0x00000000000
-	Ending Address: 0x000FFFFFFFF
-	Range Size: 4 GB
-	Physical Device Handle: 0x1101
-	Memory Array Mapped Address Handle: 0x1301
-	Partition Row Position: 1
-	Interleave Position: 2
-	Interleaved Data Depth: 8
-
-Handle 0x1412, DMI type 126, 19 bytes
-Inactive
-
-Handle 0x1500, DMI type 21, 7 bytes
-Built-in Pointing Device
-	Type: Touch Pad
-	Interface: Bus Mouse
-	Buttons: 2
-
-Handle 0x1600, DMI type 22, 26 bytes
-Portable Battery
-	Location: Sys. Battery Bay
-	Manufacturer: SMP             
-	Name: DELL HJ59008    
-	Design Capacity: 84000 mWh
-	Design Voltage: 11100 mV
-	SBDS Version: 1.0
-	Maximum Error: 3%
-	SBDS Serial Number: 02C7
-	SBDS Manufacture Date: 2010-08-31
-	SBDS Chemistry: LION            
-	OEM-specific Information: 0x00000001
-
-Handle 0x1601, DMI type 126, 26 bytes
-Inactive
-
-Handle 0x1B00, DMI type 27, 12 bytes
-Cooling Device
-	Type: Fan
-	Status: OK
-	OEM-specific Information: 0x0000DD00
-
-Handle 0x1C00, DMI type 28, 20 bytes
-Temperature Probe
-	Description: CPU Internal Temperature
-	Location: Processor
-	Status: OK
-	Maximum Value: 127.0 deg C
-	Minimum Value: 0.0 deg C
-	Resolution: 1.000 deg C
-	Tolerance: 0.5 deg C
-	Accuracy: Unknown
-	OEM-specific Information: 0x0000DC00
-
-Handle 0x2000, DMI type 32, 11 bytes
-System Boot Information
-	Status: No errors detected
-
-Handle 0xB000, DMI type 176, 5 bytes
-OEM-specific Type
-	Header and Data:
-		B0 05 00 B0 3A
-
-Handle 0xB100, DMI type 177, 12 bytes
-OEM-specific Type
-	Header and Data:
-		B1 0C 00 B1 82 00 00 00 00 00 00 00
-
-Handle 0xB200, DMI type 178, 96 bytes
-OEM-specific Type
-	Header and Data:
-		B2 60 00 B2 07 01 0C 00 08 01 0A 00 09 01 0B 00
-		0A 01 12 00 3B 00 20 00 3C 00 1F 00 3D 00 0E 00
-		41 00 12 00 42 00 18 00 00 02 FF FF 4B 00 15 00
-		48 00 14 00 50 00 13 00 10 00 FF 00 11 00 FF 00
-		12 00 FF 00 13 00 FF 00 14 00 FF 00 1E 00 FF 00
-		1F 00 FF 00 20 00 FF 00 21 00 FF 00 22 00 FF 00
-
-Handle 0xD000, DMI type 208, 10 bytes
-OEM-specific Type
-	Header and Data:
-		D0 0A 00 D0 01 04 FE 00 50 02
-
-Handle 0xD100, DMI type 209, 12 bytes
-OEM-specific Type
-	Header and Data:
-		D1 0C 00 D1 00 00 00 03 04 07 80 05
-
-Handle 0xD200, DMI type 210, 12 bytes
-OEM-specific Type
-	Header and Data:
-		D2 0C 00 D2 00 00 06 03 06 80 04 05
-
-Handle 0xD800, DMI type 216, 9 bytes
-OEM-specific Type
-	Header and Data:
-		D8 09 00 D8 01 03 01 F0 03
-	Strings:
-		NVidia Corp.         
-		 
-		62.94.8F.00.04        
-		  
-
-Handle 0xD900, DMI type 217, 8 bytes
-OEM-specific Type
-	Header and Data:
-		D9 08 00 D9 01 02 01 03
-	Strings:
-		US-101
-		Proprietary
-
-Handle 0xDB00, DMI type 219, 9 bytes
-OEM-specific Type
-	Header and Data:
-		DB 09 00 DB 03 01 02 03 FF
-	Strings:
-		System Device Bay
-		Battery, CD-ROM, CD-RW, DVD, DVD+RW, DVD+/-RW, Hard Disk
-		DVD+/-RW  
-
-Handle 0xDB01, DMI type 219, 9 bytes
-OEM-specific Type
-	Header and Data:
-		DB 09 01 DB 03 01 02 03 FF
-	Strings:
-		System eSATA Bay
-		CD-ROM, CD-RW, DVD, DVD+RW, DVD+/-RW, Hard Disk
-		EMPTY     
-
-Handle 0xDB02, DMI type 219, 9 bytes
-OEM-specific Type
-	Header and Data:
-		DB 09 02 DB 03 01 02 03 FF
-	Strings:
-		System eSATA Dock Bay
-		CD-ROM, CD-RW, DVD, DVD+RW, DVD+/-RW, Hard Disk
-		EMPTY     
-
-Handle 0x8100, DMI type 129, 8 bytes
-OEM-specific Type
-	Header and Data:
-		81 08 00 81 01 01 02 01
-	Strings:
-		Intel_ASF
-		Intel_ASF_001
-
-Handle 0x8200, DMI type 130, 20 bytes
-OEM-specific Type
-	Header and Data:
-		82 14 00 82 24 41 4D 54 01 00 00 00 01 A5 0B 02
-		00 00 00 00
-
-Handle 0x8300, DMI type 131, 64 bytes
-OEM-specific Type
-	Header and Data:
-		83 40 00 83 35 00 00 00 00 00 40 2A 0F 00 00 00
-		F8 00 17 29 00 00 00 00 00 00 00 00 00 00 00 00
-		00 00 00 00 03 00 01 02 C8 00 F5 10 00 00 00 0C
-		00 00 00 00 28 00 00 00 76 50 72 6F 00 00 00 00
-
-Handle 0xDC00, DMI type 220, 22 bytes
-OEM-specific Type
-	Header and Data:
-		DC 16 00 DC 01 F0 00 00 02 F0 00 00 00 00 03 F0
-		04 F0 00 00 00 00
-
-Handle 0xDD00, DMI type 221, 19 bytes
-OEM-specific Type
-	Header and Data:
-		DD 13 00 DD 00 00 00 00 00 00 00 00 00 00 00 00
-		00 00 00
-
-Handle 0xD400, DMI type 212, 47 bytes
-OEM-specific Type
-	Header and Data:
-		D4 2F 00 D4 74 00 75 00 00 10 2D 2E 5C 00 78 BF
-		40 5D 00 78 BF 00 2D 01 1D EF 10 2E 01 1D EF 00
-		08 00 1D DF 00 03 00 1D DF 00 FF FF 00 00 00
-
-Handle 0xD401, DMI type 212, 17 bytes
-OEM-specific Type
-	Header and Data:
-		D4 11 01 D4 74 00 75 00 03 40 49 4A FF FF 00 00
-		00
-
-Handle 0xDE00, DMI type 222, 16 bytes
-OEM-specific Type
-	Header and Data:
-		DE 10 00 DE 01 02 FF FF 00 00 00 00 00 00 00 01
-
-Handle 0x7F00, DMI type 127, 4 bytes
-End Of Table
-
diff --git a/t/inventory/generic/dmidecode/memory.t b/t/inventory/generic/dmidecode/memory.t
index b2c713b..16c7c31 100755
--- a/t/inventory/generic/dmidecode/memory.t
+++ b/t/inventory/generic/dmidecode/memory.t
@@ -908,7 +908,7 @@ my %tests = (
             MEMORYCORRECTION => 'None'
         }
     ],
-    'windows-xppro' => [
+    'windows-xp' => [
         {
             NUMSLOTS         => 1,
             SERIALNUMBER     => '14FA6621',
diff --git a/t/inventory/windows/cpu.t b/t/inventory/windows/cpu.t
index ef03d46..5a24c8e 100755
--- a/t/inventory/windows/cpu.t
+++ b/t/inventory/windows/cpu.t
@@ -19,7 +19,7 @@ BEGIN {
 use FusionInventory::Agent::Task::Inventory::Input::Win32::CPU;
 
 my %tests = (
-    7 => [
+    '7' => [
         {
             ID           => 'A7 06 02 00 FF FB EB BF',
             NAME         => 'Intel(R) Core(TM) i5-2300 CPU @ 2.80GHz',
@@ -30,6 +30,62 @@ my %tests = (
             THREAD       => undef,
             CORE         => '4'
         }
+    ],
+    '2003' => [
+        {
+            ID           => 'BFEBFBFF00000F29',
+            NAME         => 'Intel(R) Xeon(TM) CPU 3.06GHz',
+            SERIAL       => undef,
+            MANUFACTURER => 'Intel',
+            DESCRIPTION  => 'x86 Family 15 Model 2 Stepping 9',
+            SPEED        => '3060',
+            THREAD       => undef,
+            CORE         => undef
+        },
+        {
+            ID           => '0000000000000000',
+            NAME         => 'Intel(R) Xeon(TM) CPU 3.06GHz',
+            SERIAL       => undef,
+            MANUFACTURER => 'Intel',
+            DESCRIPTION  => 'x86 Family 15 Model 2 Stepping 9',
+            SPEED        => '3060',
+            THREAD       => undef,
+            CORE         => undef
+        }
+    ],
+    '2003SP2' => [
+        {
+            ID           => '0FEBBBFF00010676',
+            NAME         => 'Intel(R) Xeon(R) CPU           E5440  @ 2.83GHz',
+            SERIAL       => undef,
+            MANUFACTURER => 'Intel',
+            DESCRIPTION  => 'x86 Family 6 Model 23 Stepping 6',
+            SPEED        => '2830',
+            THREAD       => undef,
+            CORE         => undef
+        },
+        {
+            ID           => '0FEBBBFF00000676',
+            NAME         => 'Intel(R) Xeon(R) CPU           E5440  @ 2.83GHz',
+            SERIAL       => undef,
+            MANUFACTURER => 'Intel',
+            DESCRIPTION  => 'x86 Family 6 Model 23 Stepping 6',
+            SPEED        => '2830',
+            THREAD       => undef,
+            CORE         => undef
+        }
+    ],
+    'xp' => [
+        {
+            ID           => '76 06 01 00 FF FB EB BF',
+            NAME         => 'Intel(R) Core(TM)2 Duo CPU     T9400  @ 2.53GHz',
+            SERIAL       => undef,
+            MANUFACTURER => 'Intel',
+            DESCRIPTION  => 'x86 Family 6 Model 23 Stepping 6',
+            SPEED        => '2530',
+            THREAD       => '2',
+            CORE         => '2'
+        }
     ]
 );
 
@@ -48,10 +104,12 @@ foreach my $test (keys %tests) {
     $module->mock(
         'getCpusFromDmidecode',
         sub {
+            my $file = "resources/generic/dmidecode/windows-$test";
             return
+                -f $file ?
                 FusionInventory::Agent::Tools::Generic::getCpusFromDmidecode(
-                    file => "resources/generic/dmidecode/windows-$test"
-                );
+                    file => $file
+                ) : ();
         }
     );
 
diff --git a/t/inventory/windows/memory.t b/t/inventory/windows/memory.t
index c538344..88683fa 100755
--- a/t/inventory/windows/memory.t
+++ b/t/inventory/windows/memory.t
@@ -19,7 +19,7 @@ BEGIN {
 use FusionInventory::Agent::Task::Inventory::Input::Win32::Memory;
 
 my %tests = (
-    7 => [
+    '7' => [
         {
             NUMSLOTS     => 0,
             FORMFACTOR   => 'DIMM',
diff --git a/t/tools/generic.t b/t/tools/generic.t
index 7ae2863..12090c8 100755
--- a/t/tools/generic.t
+++ b/t/tools/generic.t
@@ -4514,7 +4514,7 @@ my %dmidecode_tests = (
             }
         ]
     },
-    'windows-xppro' => {
+    'windows-xp' => {
         '32' => [
             {
                 'Status' => 'No errors detected'
@@ -5935,7 +5935,7 @@ my %cpu_tests = (
             CORE           => undef
         }
     ],
-    'windows-xppro' => [
+    'windows-xp' => [
         {
             ID             => '76 06 01 00 FF FB EB BF',
             NAME           => 'Core 2 Duo',


================================================================
  Commit: 25361c9c01e1989df07b0b4780ce8194f44795d1
      https://github.com/fusinv/fusioninventory-agent/commit/25361c9c01e1989df07b0b4780ce8194f44795d1
  Author: Guillaume Rousse <guillomovitch at gmail.com>
  Date:   2012-03-10 (Sat, 10 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm

  Log Message:
  -----------
  isolate interfaces extraction


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
index c9e9acd..7fdf63e 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
@@ -22,16 +22,53 @@ sub doInventory {
     my (%params) = @_;
 
     my $inventory = $params{inventory};
+    my (@gateways, @dns, @ips);
+
+    foreach my $interface (_getInterfaces()) {
+        next if
+            !$interface->{IPADDRESS} &&
+            !$interface->{IPADDRESS6} &&
+            !$interface->{MACADDR};
+
+        push @gateways, $interface->{IPGATEWAY}
+            if $interface->{IPGATEWAY};
+
+        push @dns, $interface->{dns}
+            if $interface->{dns};
+
+        push @ips, @{$interface->{IPADDRESS}}
+            if $interface->{IPADDRESS};
+
+        delete $interface->{dns};
+
+        # flatten multivalued keys
+        foreach my $key (qw/IPADDRESS IPMASK IPSUBNET IPADDRESS6/) {
+            next unless $interface->{$key};
+            $interface->{$key} = join('/', @{$interface->{$key}});
+        }
+
+        $inventory->addEntry(
+            section => 'NETWORKS',
+            entry   => $interface
+        );
+    }
+
+    $inventory->setHardware({
+        DEFAULTGATEWAY => join('/', uniq @gateways),
+        DNS            => join('/', uniq @dns),
+        IPADDR         => join('/', uniq @ips),
+    });
+
+}
+
+sub _getInterfaces {
 
     my $WMIService = Win32::OLE->GetObject(
         'winmgmts:{impersonationLevel=impersonate}!\\\\.\\root\\cimv2'
     ) or die "WMI connection failed: " . Win32::OLE->LastError();
 
-    my %ips;
     my @ip6s;
     my @interfaces;
-    my %defaultgateways;
-    my %dns;
 
     my $nics = $WMIService->ExecQuery(
         'SELECT * FROM Win32_NetworkAdapterConfiguration'
@@ -45,16 +82,12 @@ sub doInventory {
             MTU         => $nic->MTU
         };
 
-        foreach (@{$nic->DefaultIPGateway || []}) {
-            $defaultgateways{$_} = 1;
-        }
-
-        if ($nic->DefaultIPGateway) {
+        if ($nic->DefaultIPGateway()) {
             $interface->{IPGATEWAY} = $nic->DefaultIPGateway()->[0];
         }
 
-        foreach (@{$nic->DNSServerSearchOrder || []}) {
-            $dns{$_} = 1;
+        if ($nic->DNSServerSearchOrder()) {
+            $interface->{dns} = $nic->DNSServerSearchOrder()->[0];
         }
 
         if ($nic->IPAddress) {
@@ -62,13 +95,11 @@ sub doInventory {
                 my $address = $nic->IPAddress->[$addrId];
                 my $mask = $nic->IPSubnet->[$addrId];
                 if ($address =~ /$ip_address_pattern/) {
-                    $ips{$address}=1;
                     push @{$interface->{IPADDRESS}}, $address;
                     push @{$interface->{IPMASK}}, $mask;
                     push @{$interface->{IPSUBNET}},
                         getSubnetAddress($address, $mask);
                 } elsif ($address =~ /\S+/) {
-                    push @ip6s, $address;
                     push @{$interface->{IPADDRESS6}}, $address;
                     push @{$interface->{IPMASK6}}, $mask;
                     push @{$interface->{IPSUBNET6}},
@@ -110,31 +141,7 @@ sub doInventory {
 
     }
 
-    foreach my $interface (@interfaces) {
-
-        next if
-            !$interface->{IPADDRESS} &&
-            !$interface->{IPADDRESS6} &&
-            !$interface->{MACADDR};
-
-        # flatten multivalued keys
-        foreach my $key (qw/IPADDRESS IPMASK IPSUBNET IPADDRESS6/) {
-            next unless $interface->{$key};
-            $interface->{$key} = join('/', @{$interface->{$key}});
-        }
-
-        $inventory->addEntry(
-            section => 'NETWORKS',
-            entry   => $interface
-        );
-    }
-
-    $inventory->setHardware({
-        DEFAULTGATEWAY => join ('/',keys %defaultgateways),
-        DNS            => join('/', keys %dns),
-        IPADDR         => join('/', keys %ips),
-    });
-
+    return @interfaces;
 }
 
 1;


================================================================
  Commit: a850719e0e058209dadf926b0c230515973ddedf
      https://github.com/fusinv/fusioninventory-agent/commit/a850719e0e058209dadf926b0c230515973ddedf
  Author: Guillaume Rousse <guillomovitch at gmail.com>
  Date:   2012-03-10 (Sat, 10 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm

  Log Message:
  -----------
  use consistant WMI access interface


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
index 7fdf63e..b7eb577 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
@@ -3,16 +3,10 @@ package FusionInventory::Agent::Task::Inventory::Input::Win32::Networks;
 use strict;
 use warnings;
 
-use Win32::OLE qw(in CP_UTF8);
-use Win32::OLE::Const;
-use Win32::OLE::Enum;
-
 use FusionInventory::Agent::Tools;
 use FusionInventory::Agent::Tools::Network;
 use FusionInventory::Agent::Tools::Win32;
  
-Win32::OLE-> Option(CP=>CP_UTF8);
-
 # http://techtasks.com/code/viewbookcode/1417
 sub isEnabled {
     return 1;
@@ -63,37 +57,35 @@ sub doInventory {
 
 sub _getInterfaces {
 
-    my $WMIService = Win32::OLE->GetObject(
-        'winmgmts:{impersonationLevel=impersonate}!\\\\.\\root\\cimv2'
-    ) or die "WMI connection failed: " . Win32::OLE->LastError();
-
     my @ip6s;
     my @interfaces;
 
-    my $nics = $WMIService->ExecQuery(
-        'SELECT * FROM Win32_NetworkAdapterConfiguration'
-    );
-    foreach my $nic (in $nics) {
+    foreach my $object (getWmiObjects(
+        class      => 'Win32_NetworkAdapterConfiguration',
+        properties => [ qw/Index Description IPEnabled DHCPServer MACAddress 
+                           MTU DefaultIPGateway DNSServerSearchOrder IPAddress
+                           IPSubnet/  ]
+    )) {
+
         my $interface = {
-            DESCRIPTION => $nic->Description,
-            STATUS      => $nic->IPEnabled ? "Up" : "Down",
-            IPDHCP      => $nic->DHCPServer,
-            MACADDR     => $nic->MACAddress,
-            MTU         => $nic->MTU
+            DESCRIPTION => $object->{Description},
+            STATUS      => $object->{IPEnabled} ? "Up" : "Down",
+            IPDHCP      => $object->{DHCPServer},
+            MACADDR     => $object->{MACAddress},
+            MTU         => $object->{MTU}
         };
 
-        if ($nic->DefaultIPGateway()) {
-            $interface->{IPGATEWAY} = $nic->DefaultIPGateway()->[0];
+        if ($object->{DefaultIPGateway}) {
+            $interface->{IPGATEWAY} = $object->{DefaultIPGateway}->[0];
         }
 
-        if ($nic->DNSServerSearchOrder()) {
-            $interface->{dns} = $nic->DNSServerSearchOrder()->[0];
+        if ($object->{DNSServerSearchOrder}) {
+            $interface->{dns} = $object->{DNSServerSearchOrder}->[0];
         }
 
-        if ($nic->IPAddress) {
-            foreach my $addrId (0..(@{$nic->IPAddress}-1)) {
-                my $address = $nic->IPAddress->[$addrId];
-                my $mask = $nic->IPSubnet->[$addrId];
+        if ($object->{IPAddress}) {
+            foreach my $address (@{$object->{IPAddress}}) {
+                my $mask = shift @{$object->{IPSubnet}};
                 if ($address =~ /$ip_address_pattern/) {
                     push @{$interface->{IPADDRESS}}, $address;
                     push @{$interface->{IPMASK}}, $mask;
@@ -108,37 +100,39 @@ sub _getInterfaces {
             }
         }
 
-        $interfaces[$nic->Index] = $interface;
+        $interfaces[$object->{Index}] = $interface;
     }
 
-    $nics = $WMIService->ExecQuery('SELECT * FROM Win32_NetworkAdapter');
-    foreach my $nic (in $nics) {
-	my $interface = $interfaces[$nic->Index];
-
+    foreach my $object (getWmiObjects(
+        class      => 'Win32_NetworkAdapter',
+        properties => [ qw/Index PNPDeviceId Speed MACAddress PhysicalAdapter 
+                           AdapterType/  ]
+    )) {
         # http://comments.gmane.org/gmane.comp.monitoring.fusion-inventory.devel/34
-        next unless $nic->PNPDeviceID;
+        next unless $object->{PNPDeviceId};
+
+        my $interface = $interfaces[$object->{Index}];
 
-	$interface->{SPEED}       = $nic->Speed;
-	$interface->{MACADDR}     = $nic->MACAddress;
-	$interface->{PNPDEVICEID} = $nic->PNPDeviceID;
+        $interface->{SPEED}       = $object->{Speed};
+        $interface->{MACADDR}     = $object->{MACAddress};
+        $interface->{PNPDEVICEID} = $object->{PNPDeviceId};
 
         # PhysicalAdapter only work on OS > XP
-        if (defined $nic->PhysicalAdapter) {
-            $interface->{VIRTUALDEV} = $nic->PhysicalAdapter ? 0 : 1;
+        if (defined $object->{PhysicalAdapter}) {
+            $interface->{VIRTUALDEV} = $object->{PhysicalAdapter} ? 0 : 1;
         # http://forge.fusioninventory.org/issues/1166 
         } elsif ($interface->{description}
               && $interface->{description} =~ /RAS/
               && $interface->{description} =~ /Adapter/i) {
             $interface->{VIRTUALDEV} = 1;
         } else {
-	    $interface->{VIRTUALDEV} = $nic->PNPDeviceID =~ /^ROOT/ ? 1 : 0;
+            $interface->{VIRTUALDEV} = $object->{PNPDeviceId} =~ /^ROOT/ ? 1 : 0;
         }
 
-        if (defined $nic->AdapterType) {
-            $interface->{TYPE} = $nic->AdapterType;
+        if (defined $object->{AdapterType}) {
+            $interface->{TYPE} = $object->{AdapterType};
             $interface->{TYPE} =~ s/Ethernet.*/Ethernet/;
         }
-
     }
 
     return @interfaces;


================================================================
  Commit: 98f0ece8f48510caccd0424c4adcb7124c7c6fb8
      https://github.com/fusinv/fusioninventory-agent/commit/98f0ece8f48510caccd0424c4adcb7124c7c6fb8
  Author: Guillaume Rousse <guillomovitch at gmail.com>
  Date:   2012-03-10 (Sat, 10 Mar 2012)

  Changed paths:
    A resources/win32/wmi/7-Win32_NetworkAdapter.wmi
    A resources/win32/wmi/7-Win32_NetworkAdapterConfiguration.wmi

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


diff --git a/resources/win32/wmi/7-Win32_NetworkAdapter.wmi b/resources/win32/wmi/7-Win32_NetworkAdapter.wmi
new file mode 100644
index 0000000..6d75607
Binary files /dev/null and b/resources/win32/wmi/7-Win32_NetworkAdapter.wmi differ
diff --git a/resources/win32/wmi/7-Win32_NetworkAdapterConfiguration.wmi b/resources/win32/wmi/7-Win32_NetworkAdapterConfiguration.wmi
new file mode 100644
index 0000000..0c42f79
Binary files /dev/null and b/resources/win32/wmi/7-Win32_NetworkAdapterConfiguration.wmi differ


================================================================
  Commit: 498e98eeacc0f442bd790d23f998baaed08d4ad7
      https://github.com/fusinv/fusioninventory-agent/commit/498e98eeacc0f442bd790d23f998baaed08d4ad7
  Author: Guillaume Rousse <guillomovitch at gmail.com>
  Date:   2012-03-10 (Sat, 10 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm

  Log Message:
  -----------
  unused variable


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
index b7eb577..afe26e8 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
@@ -57,7 +57,6 @@ sub doInventory {
 
 sub _getInterfaces {
 
-    my @ip6s;
     my @interfaces;
 
     foreach my $object (getWmiObjects(


================================================================
  Commit: 022845f0d8b5a9f410d1364504bf4cd77439054a
      https://github.com/fusinv/fusioninventory-agent/commit/022845f0d8b5a9f410d1364504bf4cd77439054a
  Author: Guillaume Rousse <guillomovitch at gmail.com>
  Date:   2012-03-10 (Sat, 10 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm

  Log Message:
  -----------
  useless comment, wrong URL


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
index afe26e8..7e1f9f6 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
@@ -7,7 +7,6 @@ use FusionInventory::Agent::Tools;
 use FusionInventory::Agent::Tools::Network;
 use FusionInventory::Agent::Tools::Win32;
  
-# http://techtasks.com/code/viewbookcode/1417
 sub isEnabled {
     return 1;
 }


================================================================
  Commit: fb889f28c421c76a1d9afdcb3ba8235f6607ab89
      https://github.com/fusinv/fusioninventory-agent/commit/fb889f28c421c76a1d9afdcb3ba8235f6607ab89
  Author: Guillaume Rousse <guillomovitch at gmail.com>
  Date:   2012-03-10 (Sat, 10 Mar 2012)

  Changed paths:
    M Changes
    M lib/FusionInventory/Agent/Task/Inventory.pm
    R resources/generic/dmidecode/windows-xppro
    M t/inventory/generic/dmidecode/memory.t
    M t/inventory/windows/cpu.t
    M t/inventory/windows/memory.t
    M t/tools/generic.t

  Log Message:
  -----------
  Merge remote-tracking branch 'origin/2.2.x' into 2.2.x


diff --git a/Changes b/Changes
index 5f460b1..a152f51 100644
--- a/Changes
+++ b/Changes
@@ -59,7 +59,6 @@ Major changes:
 
 Minor changes:
 * Add the HARDWARE/CHASSIS_TYPE information
-* local inventory file name now has .xml extension (#211)
 * Linux: report all IP addresses used by each interfaces (#854)
 * HPUX: don't report unoccupied memory slots
 * AIX: add LVM support
diff --git a/lib/FusionInventory/Agent/Task/Inventory.pm b/lib/FusionInventory/Agent/Task/Inventory.pm
index a0b3e1a..9c9aac7 100644
--- a/lib/FusionInventory/Agent/Task/Inventory.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory.pm
@@ -82,7 +82,7 @@ sub run {
     } elsif ($self->{target}->isa('FusionInventory::Agent::Target::Local')) {
         my $format = $self->{target}->{format};
 
-        my $extension = $format eq 'xml' ? '.xml' : '.html';
+        my $extension = $format eq 'xml' ? '.ocs' : '.html';
         my $file =
             $self->{config}->{local} .
             "/" .
diff --git a/resources/generic/dmidecode/windows-xppro b/resources/generic/dmidecode/windows-xppro
deleted file mode 100644
index 6b999c7..0000000
--- a/resources/generic/dmidecode/windows-xppro
+++ /dev/null
@@ -1,586 +0,0 @@
-# dmidecode 2.11
-SMBIOS 2.4 present.
-57 structures occupying 2822 bytes.
-Table at 0x000F6570.
-
-Handle 0xDA00, DMI type 218, 251 bytes
-OEM-specific Type
-	Header and Data:
-		DA FB 00 DA B2 00 0D 5F 1F 37 40 7D 00 00 00 00
-		00 40 00 02 00 01 00 41 00 02 00 00 00 65 00 03
-		00 00 00 66 00 03 00 01 00 F1 00 04 00 00 00 F2
-		00 04 00 01 00 F3 00 04 00 02 00 0F 00 05 00 00
-		00 11 00 05 00 01 00 05 00 05 00 02 00 12 00 05
-		00 03 00 06 00 05 00 04 00 07 00 06 00 00 00 0B
-		00 06 00 01 00 0C 00 06 00 02 00 0D 00 06 00 03
-		00 89 01 07 00 00 00 8A 01 07 00 01 00 42 00 08
-		00 01 00 43 00 08 00 00 00 55 00 09 00 00 00 6D
-		00 09 00 01 00 16 02 09 00 02 00 98 01 09 00 03
-		00 0A 01 0A 00 01 00 0B 01 0A 00 00 00 2D 00 0B
-		00 02 00 6E 00 0B 00 01 00 2E 00 0B 00 00 00 11
-		01 0C 00 00 00 10 01 0C 00 01 00 F0 00 0D 00 01
-		00 ED 00 0D 00 00 00 41 01 0E 00 01 00 40 01 0E
-		00 00 00 47 01 0F 00 01 00 46 01 0F 00 00 00 4A
-		01 10 00 00 00 FF FF 00 00 00 00
-
-Handle 0xDA01, DMI type 218, 251 bytes
-OEM-specific Type
-	Header and Data:
-		DA FB 01 DA B2 00 0D 5F 1F 37 40 4B 01 10 00 01
-		00 04 02 11 00 00 00 05 02 11 00 01 00 02 02 12
-		00 00 00 03 02 12 00 01 00 52 01 13 00 01 00 53
-		01 13 00 00 00 80 01 14 00 01 00 7F 01 14 00 00
-		00 7C 01 15 00 01 00 7B 01 15 00 00 00 E8 02 16
-		00 00 00 E9 02 16 00 01 00 7E 01 17 00 01 00 7D
-		01 17 00 00 00 92 01 18 00 00 00 91 01 18 00 01
-		00 94 01 19 00 00 00 93 01 19 00 01 00 86 01 1A
-		00 01 00 85 01 1A 00 00 00 82 01 1B 00 01 00 81
-		01 1B 00 00 00 84 01 1C 00 01 00 83 01 1C 00 00
-		00 9B 01 1D 00 00 00 9C 01 1D 00 01 00 9D 01 1D
-		00 02 00 9E 01 1D 00 03 00 8D 01 1E 00 00 00 8E
-		01 1E 00 01 00 85 02 1F 00 00 00 86 02 1F 00 01
-		00 EA 00 20 00 00 00 EB 00 20 00 01 00 EC 00 20
-		00 02 00 A1 00 21 00 00 00 A3 00 21 00 01 00 28
-		00 22 00 00 00 FF FF 00 00 00 00
-
-Handle 0xDA02, DMI type 218, 251 bytes
-OEM-specific Type
-	Header and Data:
-		DA FB 02 DA B2 00 0D 5F 1F 37 40 29 00 22 00 01
-		00 2A 00 22 00 02 00 2B 00 23 00 00 00 2C 00 24
-		00 00 00 0E 01 25 00 01 00 0F 01 25 00 00 00 9B
-		00 26 00 01 00 9C 00 26 00 00 00 4D 01 27 00 01
-		00 4C 01 27 00 00 00 87 01 28 00 00 00 88 01 28
-		00 01 00 35 01 29 00 03 00 37 01 29 00 00 00 38
-		01 29 00 01 00 39 01 29 00 02 00 D9 01 2A 00 01
-		00 D8 01 2A 00 00 00 DF 01 2B 00 01 00 DE 01 2B
-		00 00 00 45 02 2C 00 00 00 44 02 2C 00 01 00 49
-		02 2D 00 00 00 48 02 2D 00 01 00 45 01 45 01 01
-		00 44 01 44 01 00 00 76 01 76 01 01 00 75 01 75
-		01 01 00 9F 00 9F 00 00 00 A0 00 A0 00 01 00 E1
-		01 E1 01 00 00 E3 01 E3 01 01 00 E2 01 E2 01 02
-		00 29 02 29 02 01 00 28 02 28 02 02 00 2A 02 2A
-		02 03 00 30 02 30 02 01 00 2F 02 2F 02 00 00 35
-		02 35 02 01 00 FF FF 00 00 00 00
-
-Handle 0xDA03, DMI type 218, 77 bytes
-OEM-specific Type
-	Header and Data:
-		DA 4D 03 DA B2 00 0D 5F 1F 37 40 36 02 36 02 00
-		00 37 02 37 02 02 00 4A 02 4A 02 01 00 0C 80 0C
-		80 01 00 6C 02 6C 02 01 00 6D 02 6D 02 00 00 01
-		F0 01 F0 00 00 02 F0 02 F0 00 00 03 F0 03 F0 00
-		00 04 F0 04 F0 00 00 FF FF 00 00 00 00
-
-Handle 0x0000, DMI type 0, 24 bytes
-BIOS Information
-	Vendor: Dell Inc.
-	Version: A24
-	Release Date: 08/19/2010
-	Address: 0xF0000
-	Runtime Size: 64 kB
-	ROM Size: 1728 kB
-	Characteristics:
-		ISA is supported
-		PCI is supported
-		PC Card (PCMCIA) is supported
-		PNP is supported
-		BIOS is upgradeable
-		BIOS shadowing is allowed
-		Boot from CD is supported
-		Selectable boot is supported
-		3.5"/720 kB floppy services are supported (int 13h)
-		Print screen service is supported (int 5h)
-		8042 keyboard services are supported (int 9h)
-		Serial services are supported (int 14h)
-		Printer services are supported (int 17h)
-		CGA/mono video services are supported (int 10h)
-		ACPI is supported
-		USB legacy is supported
-		AGP is supported
-		Smart battery is supported
-		BIOS boot specification is supported
-		Function key-initiated network boot is supported
-		Targeted content distribution is supported
-	BIOS Revision: 2.4
-	Firmware Revision: 2.4
-
-Handle 0x0100, DMI type 1, 27 bytes
-System Information
-	Manufacturer: Dell Inc.
-	Product Name: Precision M4400                 
-	Version: Not Specified
-	Serial Number: HLG964J
-	UUID: 44454C4C-4C00-1047-8039-C8C04F36344A
-	Wake-up Type: Power Switch
-	SKU Number: Not Specified
-	Family:  
-
-Handle 0x0200, DMI type 2, 9 bytes
-Base Board Information
-	Manufacturer: Dell Inc.
-	Product Name: 0P019G
-	Version:    
-	Serial Number: .HLG964J.CN129618C52450.
-	Asset Tag:           
-
-Handle 0x0300, DMI type 3, 13 bytes
-Chassis Information
-	Manufacturer: Dell Inc.
-	Type: Portable
-	Lock: Not Present
-	Version: Not Specified
-	Serial Number: HLG964J
-	Asset Tag: Not Specified
-	Boot-up State: Safe
-	Power Supply State: Safe
-	Thermal State: Safe
-	Security Status: None
-
-Handle 0x0400, DMI type 4, 40 bytes
-Processor Information
-	Socket Designation: Microprocessor
-	Type: Central Processor
-	Family: Core 2 Duo
-	Manufacturer: Intel
-	ID: 76 06 01 00 FF FB EB BF
-	Signature: Type 0, Family 6, Model 23, Stepping 6
-	Flags:
-		FPU (Floating-point unit on-chip)
-		VME (Virtual mode extension)
-		DE (Debugging extension)
-		PSE (Page size extension)
-		TSC (Time stamp counter)
-		MSR (Model specific registers)
-		PAE (Physical address extension)
-		MCE (Machine check exception)
-		CX8 (CMPXCHG8 instruction supported)
-		APIC (On-chip APIC hardware supported)
-		SEP (Fast system call)
-		MTRR (Memory type range registers)
-		PGE (Page global enable)
-		MCA (Machine check architecture)
-		CMOV (Conditional move instruction supported)
-		PAT (Page attribute table)
-		PSE-36 (36-bit page size extension)
-		CLFSH (CLFLUSH instruction supported)
-		DS (Debug store)
-		ACPI (ACPI supported)
-		MMX (MMX technology supported)
-		FXSR (FXSAVE and FXSTOR instructions supported)
-		SSE (Streaming SIMD extensions)
-		SSE2 (Streaming SIMD extensions 2)
-		SS (Self-snoop)
-		HTT (Multi-threading)
-		TM (Thermal monitor supported)
-		PBE (Pending break enabled)
-	Version: Not Specified
-	Voltage: 3.3 V
-	External Clock: 266 MHz
-	Max Speed: 2534 MHz
-	Current Speed: 2534 MHz
-	Status: Populated, Enabled
-	Upgrade: None
-	L1 Cache Handle: 0x0700
-	L2 Cache Handle: 0x0701
-	L3 Cache Handle: Not Provided
-	Serial Number: Not Specified
-	Asset Tag: Not Specified
-	Part Number: Not Specified
-	Core Count: 2
-	Core Enabled: 2
-	Thread Count: 2
-	Characteristics:
-		64-bit capable
-
-Handle 0x0700, DMI type 7, 19 bytes
-Cache Information
-	Socket Designation: Not Specified
-	Configuration: Enabled, Not Socketed, Level 1
-	Operational Mode: Write Back
-	Location: Internal
-	Installed Size: 128 kB
-	Maximum Size: 128 kB
-	Supported SRAM Types:
-		Unknown
-	Installed SRAM Type: Unknown
-	Speed: Unknown
-	Error Correction Type: None
-	System Type: Data
-	Associativity: 4-way Set-associative
-
-Handle 0x0701, DMI type 7, 19 bytes
-Cache Information
-	Socket Designation: Not Specified
-	Configuration: Enabled, Not Socketed, Level 2
-	Operational Mode: Varies With Memory Address
-	Location: Internal
-	Installed Size: 6144 kB
-	Maximum Size: 6144 kB
-	Supported SRAM Types:
-		Pipeline Burst
-	Installed SRAM Type: Pipeline Burst
-	Speed: 15 ns
-	Error Correction Type: None
-	System Type: Unified
-	Associativity: Other
-
-Handle 0x0800, DMI type 8, 9 bytes
-Port Connector Information
-	Internal Reference Designator: PARALLEL
-	Internal Connector Type: None
-	External Reference Designator: Not Specified
-	External Connector Type: DB-25 female
-	Port Type: Parallel Port PS/2
-
-Handle 0x0801, DMI type 8, 9 bytes
-Port Connector Information
-	Internal Reference Designator: SERIAL1
-	Internal Connector Type: None
-	External Reference Designator: Not Specified
-	External Connector Type: DB-9 male
-	Port Type: Serial Port 16550A Compatible
-
-Handle 0x0804, DMI type 8, 9 bytes
-Port Connector Information
-	Internal Reference Designator: USB
-	Internal Connector Type: None
-	External Reference Designator: Not Specified
-	External Connector Type: Access Bus (USB)
-	Port Type: USB
-
-Handle 0x0806, DMI type 8, 9 bytes
-Port Connector Information
-	Internal Reference Designator: MONITOR
-	Internal Connector Type: None
-	External Reference Designator: Not Specified
-	External Connector Type: DB-15 female
-	Port Type: Video Port
-
-Handle 0x080B, DMI type 8, 9 bytes
-Port Connector Information
-	Internal Reference Designator: FireWire
-	Internal Connector Type: None
-	External Reference Designator: Not Specified
-	External Connector Type: IEEE 1394
-	Port Type: Firewire (IEEE P1394)
-
-Handle 0x080C, DMI type 8, 9 bytes
-Port Connector Information
-	Internal Reference Designator: Modem
-	Internal Connector Type: None
-	External Reference Designator: Not Specified
-	External Connector Type: RJ-11
-	Port Type: Modem Port
-
-Handle 0x080D, DMI type 8, 9 bytes
-Port Connector Information
-	Internal Reference Designator: Ethernet
-	Internal Connector Type: None
-	External Reference Designator: Not Specified
-	External Connector Type: RJ-45
-	Port Type: Network Port
-
-Handle 0x0900, DMI type 9, 13 bytes
-System Slot Information
-	Designation: PCMCIA 0
-	Type: 32-bit PC Card (PCMCIA)
-	Current Usage: Available
-	Length: Other
-	ID: Adapter 0, Socket 0
-	Characteristics:
-		5.0 V is provided
-		3.3 V is provided
-		PC Card-16 is supported
-		Cardbus is supported
-		Zoom Video is supported
-		Modem ring resume is supported
-
-Handle 0x0A00, DMI type 10, 6 bytes
-On Board Device Information
-	Type: Video
-	Status: Enabled
-	Description: NVIDIA Quadro FX 1700M        
-
-Handle 0x0A01, DMI type 10, 6 bytes
-On Board Device Information
-	Type: Sound
-	Status: Enabled
-	Description: IDT 92HD71
-
-Handle 0x0B00, DMI type 11, 5 bytes
-OEM Strings
-	String 1: Dell System
-	String 2: 5[0003]
-	String 3: 13[PP04X]
-
-Handle 0x0D00, DMI type 13, 22 bytes
-BIOS Language Information
-	Language Description Format: Long
-	Installable Languages: 1
-		en|US|iso8859-1
-	Currently Installed Language: en|US|iso8859-1
-
-Handle 0x1000, DMI type 16, 15 bytes
-Physical Memory Array
-	Location: System Board Or Motherboard
-	Use: System Memory
-	Error Correction Type: None
-	Maximum Capacity: 8 GB
-	Error Information Handle: Not Provided
-	Number Of Devices: 2
-
-Handle 0x1100, DMI type 17, 27 bytes
-Memory Device
-	Array Handle: 0x1000
-	Error Information Handle: Not Provided
-	Total Width: 64 bits
-	Data Width: 64 bits
-	Size: 2048 MB
-	Form Factor: DIMM
-	Set: None
-	Locator: DIMM_A
-	Bank Locator: Not Specified
-	Type: DDR2
-	Type Detail: Synchronous
-	Speed: 800 MHz
-	Manufacturer: 7F7FFE0000000000
-	Serial Number: 14FA6621
-	Asset Tag: 200840
-	Part Number: EBE21UE8ACUA-8G-E 
-
-Handle 0x1101, DMI type 17, 27 bytes
-Memory Device
-	Array Handle: 0x1000
-	Error Information Handle: Not Provided
-	Total Width: 64 bits
-	Data Width: 64 bits
-	Size: 2048 MB
-	Form Factor: DIMM
-	Set: None
-	Locator: DIMM_B
-	Bank Locator: Not Specified
-	Type: DDR2
-	Type Detail: Synchronous
-	Speed: 800 MHz
-	Manufacturer: 7F7FFE0000000000
-	Serial Number: AEF96621
-	Asset Tag: 200840
-	Part Number: EBE21UE8ACUA-8G-E 
-
-Handle 0x1301, DMI type 19, 15 bytes
-Memory Array Mapped Address
-	Starting Address: 0x00000000000
-	Ending Address: 0x000FFFFFFFF
-	Range Size: 4 GB
-	Physical Array Handle: 0x1000
-	Partition Width: 1
-
-Handle 0x1401, DMI type 20, 19 bytes
-Memory Device Mapped Address
-	Starting Address: 0x00000000000
-	Ending Address: 0x000FFFFFFFF
-	Range Size: 4 GB
-	Physical Device Handle: 0x1100
-	Memory Array Mapped Address Handle: 0x1301
-	Partition Row Position: 1
-	Interleave Position: 1
-	Interleaved Data Depth: 8
-
-Handle 0x1411, DMI type 126, 19 bytes
-Inactive
-
-Handle 0x1402, DMI type 20, 19 bytes
-Memory Device Mapped Address
-	Starting Address: 0x00000000000
-	Ending Address: 0x000FFFFFFFF
-	Range Size: 4 GB
-	Physical Device Handle: 0x1101
-	Memory Array Mapped Address Handle: 0x1301
-	Partition Row Position: 1
-	Interleave Position: 2
-	Interleaved Data Depth: 8
-
-Handle 0x1412, DMI type 126, 19 bytes
-Inactive
-
-Handle 0x1500, DMI type 21, 7 bytes
-Built-in Pointing Device
-	Type: Touch Pad
-	Interface: Bus Mouse
-	Buttons: 2
-
-Handle 0x1600, DMI type 22, 26 bytes
-Portable Battery
-	Location: Sys. Battery Bay
-	Manufacturer: SMP             
-	Name: DELL HJ59008    
-	Design Capacity: 84000 mWh
-	Design Voltage: 11100 mV
-	SBDS Version: 1.0
-	Maximum Error: 3%
-	SBDS Serial Number: 02C7
-	SBDS Manufacture Date: 2010-08-31
-	SBDS Chemistry: LION            
-	OEM-specific Information: 0x00000001
-
-Handle 0x1601, DMI type 126, 26 bytes
-Inactive
-
-Handle 0x1B00, DMI type 27, 12 bytes
-Cooling Device
-	Type: Fan
-	Status: OK
-	OEM-specific Information: 0x0000DD00
-
-Handle 0x1C00, DMI type 28, 20 bytes
-Temperature Probe
-	Description: CPU Internal Temperature
-	Location: Processor
-	Status: OK
-	Maximum Value: 127.0 deg C
-	Minimum Value: 0.0 deg C
-	Resolution: 1.000 deg C
-	Tolerance: 0.5 deg C
-	Accuracy: Unknown
-	OEM-specific Information: 0x0000DC00
-
-Handle 0x2000, DMI type 32, 11 bytes
-System Boot Information
-	Status: No errors detected
-
-Handle 0xB000, DMI type 176, 5 bytes
-OEM-specific Type
-	Header and Data:
-		B0 05 00 B0 3A
-
-Handle 0xB100, DMI type 177, 12 bytes
-OEM-specific Type
-	Header and Data:
-		B1 0C 00 B1 82 00 00 00 00 00 00 00
-
-Handle 0xB200, DMI type 178, 96 bytes
-OEM-specific Type
-	Header and Data:
-		B2 60 00 B2 07 01 0C 00 08 01 0A 00 09 01 0B 00
-		0A 01 12 00 3B 00 20 00 3C 00 1F 00 3D 00 0E 00
-		41 00 12 00 42 00 18 00 00 02 FF FF 4B 00 15 00
-		48 00 14 00 50 00 13 00 10 00 FF 00 11 00 FF 00
-		12 00 FF 00 13 00 FF 00 14 00 FF 00 1E 00 FF 00
-		1F 00 FF 00 20 00 FF 00 21 00 FF 00 22 00 FF 00
-
-Handle 0xD000, DMI type 208, 10 bytes
-OEM-specific Type
-	Header and Data:
-		D0 0A 00 D0 01 04 FE 00 50 02
-
-Handle 0xD100, DMI type 209, 12 bytes
-OEM-specific Type
-	Header and Data:
-		D1 0C 00 D1 00 00 00 03 04 07 80 05
-
-Handle 0xD200, DMI type 210, 12 bytes
-OEM-specific Type
-	Header and Data:
-		D2 0C 00 D2 00 00 06 03 06 80 04 05
-
-Handle 0xD800, DMI type 216, 9 bytes
-OEM-specific Type
-	Header and Data:
-		D8 09 00 D8 01 03 01 F0 03
-	Strings:
-		NVidia Corp.         
-		 
-		62.94.8F.00.04        
-		  
-
-Handle 0xD900, DMI type 217, 8 bytes
-OEM-specific Type
-	Header and Data:
-		D9 08 00 D9 01 02 01 03
-	Strings:
-		US-101
-		Proprietary
-
-Handle 0xDB00, DMI type 219, 9 bytes
-OEM-specific Type
-	Header and Data:
-		DB 09 00 DB 03 01 02 03 FF
-	Strings:
-		System Device Bay
-		Battery, CD-ROM, CD-RW, DVD, DVD+RW, DVD+/-RW, Hard Disk
-		DVD+/-RW  
-
-Handle 0xDB01, DMI type 219, 9 bytes
-OEM-specific Type
-	Header and Data:
-		DB 09 01 DB 03 01 02 03 FF
-	Strings:
-		System eSATA Bay
-		CD-ROM, CD-RW, DVD, DVD+RW, DVD+/-RW, Hard Disk
-		EMPTY     
-
-Handle 0xDB02, DMI type 219, 9 bytes
-OEM-specific Type
-	Header and Data:
-		DB 09 02 DB 03 01 02 03 FF
-	Strings:
-		System eSATA Dock Bay
-		CD-ROM, CD-RW, DVD, DVD+RW, DVD+/-RW, Hard Disk
-		EMPTY     
-
-Handle 0x8100, DMI type 129, 8 bytes
-OEM-specific Type
-	Header and Data:
-		81 08 00 81 01 01 02 01
-	Strings:
-		Intel_ASF
-		Intel_ASF_001
-
-Handle 0x8200, DMI type 130, 20 bytes
-OEM-specific Type
-	Header and Data:
-		82 14 00 82 24 41 4D 54 01 00 00 00 01 A5 0B 02
-		00 00 00 00
-
-Handle 0x8300, DMI type 131, 64 bytes
-OEM-specific Type
-	Header and Data:
-		83 40 00 83 35 00 00 00 00 00 40 2A 0F 00 00 00
-		F8 00 17 29 00 00 00 00 00 00 00 00 00 00 00 00
-		00 00 00 00 03 00 01 02 C8 00 F5 10 00 00 00 0C
-		00 00 00 00 28 00 00 00 76 50 72 6F 00 00 00 00
-
-Handle 0xDC00, DMI type 220, 22 bytes
-OEM-specific Type
-	Header and Data:
-		DC 16 00 DC 01 F0 00 00 02 F0 00 00 00 00 03 F0
-		04 F0 00 00 00 00
-
-Handle 0xDD00, DMI type 221, 19 bytes
-OEM-specific Type
-	Header and Data:
-		DD 13 00 DD 00 00 00 00 00 00 00 00 00 00 00 00
-		00 00 00
-
-Handle 0xD400, DMI type 212, 47 bytes
-OEM-specific Type
-	Header and Data:
-		D4 2F 00 D4 74 00 75 00 00 10 2D 2E 5C 00 78 BF
-		40 5D 00 78 BF 00 2D 01 1D EF 10 2E 01 1D EF 00
-		08 00 1D DF 00 03 00 1D DF 00 FF FF 00 00 00
-
-Handle 0xD401, DMI type 212, 17 bytes
-OEM-specific Type
-	Header and Data:
-		D4 11 01 D4 74 00 75 00 03 40 49 4A FF FF 00 00
-		00
-
-Handle 0xDE00, DMI type 222, 16 bytes
-OEM-specific Type
-	Header and Data:
-		DE 10 00 DE 01 02 FF FF 00 00 00 00 00 00 00 01
-
-Handle 0x7F00, DMI type 127, 4 bytes
-End Of Table
-
diff --git a/t/inventory/generic/dmidecode/memory.t b/t/inventory/generic/dmidecode/memory.t
index b2c713b..16c7c31 100755
--- a/t/inventory/generic/dmidecode/memory.t
+++ b/t/inventory/generic/dmidecode/memory.t
@@ -908,7 +908,7 @@ my %tests = (
             MEMORYCORRECTION => 'None'
         }
     ],
-    'windows-xppro' => [
+    'windows-xp' => [
         {
             NUMSLOTS         => 1,
             SERIALNUMBER     => '14FA6621',
diff --git a/t/inventory/windows/cpu.t b/t/inventory/windows/cpu.t
index ef03d46..5a24c8e 100755
--- a/t/inventory/windows/cpu.t
+++ b/t/inventory/windows/cpu.t
@@ -19,7 +19,7 @@ BEGIN {
 use FusionInventory::Agent::Task::Inventory::Input::Win32::CPU;
 
 my %tests = (
-    7 => [
+    '7' => [
         {
             ID           => 'A7 06 02 00 FF FB EB BF',
             NAME         => 'Intel(R) Core(TM) i5-2300 CPU @ 2.80GHz',
@@ -30,6 +30,62 @@ my %tests = (
             THREAD       => undef,
             CORE         => '4'
         }
+    ],
+    '2003' => [
+        {
+            ID           => 'BFEBFBFF00000F29',
+            NAME         => 'Intel(R) Xeon(TM) CPU 3.06GHz',
+            SERIAL       => undef,
+            MANUFACTURER => 'Intel',
+            DESCRIPTION  => 'x86 Family 15 Model 2 Stepping 9',
+            SPEED        => '3060',
+            THREAD       => undef,
+            CORE         => undef
+        },
+        {
+            ID           => '0000000000000000',
+            NAME         => 'Intel(R) Xeon(TM) CPU 3.06GHz',
+            SERIAL       => undef,
+            MANUFACTURER => 'Intel',
+            DESCRIPTION  => 'x86 Family 15 Model 2 Stepping 9',
+            SPEED        => '3060',
+            THREAD       => undef,
+            CORE         => undef
+        }
+    ],
+    '2003SP2' => [
+        {
+            ID           => '0FEBBBFF00010676',
+            NAME         => 'Intel(R) Xeon(R) CPU           E5440  @ 2.83GHz',
+            SERIAL       => undef,
+            MANUFACTURER => 'Intel',
+            DESCRIPTION  => 'x86 Family 6 Model 23 Stepping 6',
+            SPEED        => '2830',
+            THREAD       => undef,
+            CORE         => undef
+        },
+        {
+            ID           => '0FEBBBFF00000676',
+            NAME         => 'Intel(R) Xeon(R) CPU           E5440  @ 2.83GHz',
+            SERIAL       => undef,
+            MANUFACTURER => 'Intel',
+            DESCRIPTION  => 'x86 Family 6 Model 23 Stepping 6',
+            SPEED        => '2830',
+            THREAD       => undef,
+            CORE         => undef
+        }
+    ],
+    'xp' => [
+        {
+            ID           => '76 06 01 00 FF FB EB BF',
+            NAME         => 'Intel(R) Core(TM)2 Duo CPU     T9400  @ 2.53GHz',
+            SERIAL       => undef,
+            MANUFACTURER => 'Intel',
+            DESCRIPTION  => 'x86 Family 6 Model 23 Stepping 6',
+            SPEED        => '2530',
+            THREAD       => '2',
+            CORE         => '2'
+        }
     ]
 );
 
@@ -48,10 +104,12 @@ foreach my $test (keys %tests) {
     $module->mock(
         'getCpusFromDmidecode',
         sub {
+            my $file = "resources/generic/dmidecode/windows-$test";
             return
+                -f $file ?
                 FusionInventory::Agent::Tools::Generic::getCpusFromDmidecode(
-                    file => "resources/generic/dmidecode/windows-$test"
-                );
+                    file => $file
+                ) : ();
         }
     );
 
diff --git a/t/inventory/windows/memory.t b/t/inventory/windows/memory.t
index c538344..88683fa 100755
--- a/t/inventory/windows/memory.t
+++ b/t/inventory/windows/memory.t
@@ -19,7 +19,7 @@ BEGIN {
 use FusionInventory::Agent::Task::Inventory::Input::Win32::Memory;
 
 my %tests = (
-    7 => [
+    '7' => [
         {
             NUMSLOTS     => 0,
             FORMFACTOR   => 'DIMM',
diff --git a/t/tools/generic.t b/t/tools/generic.t
index 7ae2863..12090c8 100755
--- a/t/tools/generic.t
+++ b/t/tools/generic.t
@@ -4514,7 +4514,7 @@ my %dmidecode_tests = (
             }
         ]
     },
-    'windows-xppro' => {
+    'windows-xp' => {
         '32' => [
             {
                 'Status' => 'No errors detected'
@@ -5935,7 +5935,7 @@ my %cpu_tests = (
             CORE           => undef
         }
     ],
-    'windows-xppro' => [
+    'windows-xp' => [
         {
             ID             => '76 06 01 00 FF FB EB BF',
             NAME           => 'Core 2 Duo',


================================================================
  Commit: 7236d723d48aee1d93f613113aaf7071848e5fd3
      https://github.com/fusinv/fusioninventory-agent/commit/7236d723d48aee1d93f613113aaf7071848e5fd3
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-10 (Sat, 10 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/HTTP/Client.pm

  Log Message:
  -----------
  Merge remote-tracking branch 'forge/2.2.x' into 2.2.x


diff --git a/lib/FusionInventory/Agent/HTTP/Client.pm b/lib/FusionInventory/Agent/HTTP/Client.pm
index 8c1940f..95cea96 100644
--- a/lib/FusionInventory/Agent/HTTP/Client.pm
+++ b/lib/FusionInventory/Agent/HTTP/Client.pm
@@ -48,7 +48,7 @@ sub new {
     }
 
     $self->{ua}->agent($FusionInventory::Agent::AGENT_STRING);
-    $self->{ua}->timeout($params{timeout});
+    $self->{ua}->timeout($self->{timeout});
 
     return $self;
 }


================================================================
  Commit: b63e3b9044987a9289b5cab9746a22524a3b42bf
      https://github.com/fusinv/fusioninventory-agent/commit/b63e3b9044987a9289b5cab9746a22524a3b42bf
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-10 (Sat, 10 Mar 2012)

  Changed paths:
    M t/FusionInventory/Test/Utils.pm

  Log Message:
  -----------
  support for list values


diff --git a/t/FusionInventory/Test/Utils.pm b/t/FusionInventory/Test/Utils.pm
index 9de910c..e2e5e17 100644
--- a/t/FusionInventory/Test/Utils.pm
+++ b/t/FusionInventory/Test/Utils.pm
@@ -61,8 +61,16 @@ sub loadWMIDump {
             my $key = $1;
             my $value = $2;
             next unless $properties{$key};
-            $value =~ s/&/&/g;
-            $object->{$key} = $value;
+            if ($value =~ /{(".*")}/) {
+                # values list
+                my @values =
+                    map { /"([^"]+)"/ }
+                    split(/,/, $1);
+                $object->{$key} = \@values;
+            } else {
+                $value =~ s/&/&/g;
+                $object->{$key} = $value;
+            }
             next;
         }
 


================================================================
  Commit: ab34b963fa0d64e0137b2aa0a1912e181f3d5d0f
      https://github.com/fusinv/fusioninventory-agent/commit/ab34b963fa0d64e0137b2aa0a1912e181f3d5d0f
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-10 (Sat, 10 Mar 2012)

  Changed paths:
    A t/inventory/windows/networks.t

  Log Message:
  -----------
  initial import


diff --git a/t/inventory/windows/networks.t b/t/inventory/windows/networks.t
new file mode 100755
index 0000000..0517ace
--- /dev/null
+++ b/t/inventory/windows/networks.t
@@ -0,0 +1,160 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+use utf8;
+use lib 't';
+
+use English qw(-no_match_vars);
+use Test::More;
+use Test::MockModule;
+
+use FusionInventory::Test::Utils;
+
+BEGIN {
+    # use mock modules for non-available ones
+    push @INC, 't/fake/windows' if $OSNAME ne 'MSWin32';
+}
+
+use FusionInventory::Agent::Task::Inventory::Input::Win32::Networks;
+
+my %tests = (
+    7 => [
+        {
+            MTU         => undef,
+            MACADDR     => undef,
+            STATUS      => 'Up',
+            DESCRIPTION => 'WAN Miniport (SSTP)',
+            IPDHCP      => undef
+        },
+        {
+            MTU         => undef,
+            MACADDR     => undef,
+            STATUS      => 'Up',
+            DESCRIPTION => 'WAN Miniport (IKEv2)',
+            IPDHCP      => undef
+        },
+        {
+            MTU         => undef,
+            MACADDR     => undef,
+            STATUS      => 'Up',
+            DESCRIPTION => 'WAN Miniport (L2TP)',
+            IPDHCP      => undef
+        },
+        {
+            MTU         => undef,
+            MACADDR     => undef,
+            STATUS      => 'Up',
+            DESCRIPTION => 'WAN Miniport (PPTP)',
+            IPDHCP      => undef
+        },
+        {
+            MTU         => undef,
+            MACADDR     => undef,
+            STATUS      => 'Up',
+            DESCRIPTION => 'WAN Miniport (PPPOE)',
+            IPDHCP      => undef
+        },
+        {
+            MTU         => undef,
+            MACADDR     => undef,
+            STATUS      => 'Up',
+            DESCRIPTION => 'WAN Miniport (IPv6)',
+            IPDHCP      => undef
+        },
+        {
+            MTU         => undef,
+            MACADDR     => undef,
+            STATUS      => 'Up',
+            DESCRIPTION => 'WAN Miniport (Network Monitor)',
+            IPDHCP      => undef
+        },
+        {
+            'dns' => '192.168.0.254',
+            'IPMASK6' => [
+                       '64'
+                     ],
+            'IPMASK' => [
+                      '255.255.255.0'
+                    ],
+            'IPGATEWAY' => '192.168.0.254',
+            MACADDR     => 'F4:6D:04:97:2D:3E',
+            STATUS      => 'Up',
+            'IPADDRESS6' => [
+                          'fe80::311a:2127:dded:6618'
+                        ],
+            IPDHCP      => '192.168.0.254',
+            'IPSUBNET' => [
+                        '192.168.0.0'
+                      ],
+            MTU         => undef,
+            'IPSUBNET6' => [],
+            DESCRIPTION => 'Realtek PCIe GBE Family Controller',
+            'IPADDRESS' => [
+                         '192.168.0.1'
+                       ]
+        },
+        {
+            MTU         => undef,
+            MACADDR     => undef,
+            STATUS      => 'Up',
+            DESCRIPTION => 'WAN Miniport (IP)',
+            IPDHCP      => undef
+        },
+        {
+            MTU         => undef,
+            MACADDR     => undef,
+            STATUS      => 'Up',
+            DESCRIPTION => 'Carte Microsoft ISATAP',
+            IPDHCP      => undef
+        },
+        {
+            MTU         => undef,
+            MACADDR     => undef,
+            STATUS      => 'Up',
+            DESCRIPTION => 'RAS Async Adapter',
+            IPDHCP      => undef
+        },
+        {
+            MTU         => undef,
+            MACADDR     => undef,
+            STATUS      => 'Up',
+            DESCRIPTION => 'Microsoft Teredo Tunneling Adapter',
+            IPDHCP      => undef
+        },
+        {
+            MTU         => undef,
+            MACADDR     => '00:26:83:12:FB:0B',
+            STATUS      => 'Up',
+            DESCRIPTION => "P\x{e9}riph\x{e9}rique Bluetooth (r\x{e9}seau personnel)",
+            IPDHCP      => undef
+        },
+        {
+            MTU         => undef,
+            MACADDR     => undef,
+            STATUS      => 'Up',
+            DESCRIPTION => 'Carte Microsoft ISATAP',
+            IPDHCP      => undef
+        }
+    ],
+);
+
+plan tests => scalar keys %tests;
+
+my $module = Test::MockModule->new(
+    'FusionInventory::Agent::Task::Inventory::Input::Win32::Networks'
+);
+
+foreach my $test (keys %tests) {
+    $module->mock(
+        'getWmiObjects',
+        mockGetWmiObjects($test)
+    );
+
+    my @interfaces = FusionInventory::Agent::Task::Inventory::Input::Win32::Networks::_getInterfaces();
+    is_deeply(
+        \@interfaces,
+        $tests{$test},
+        "$test sample"
+    );
+}


================================================================
  Commit: 1042eca6ce9af2e6f8be41f4ed1dabb945155573
      https://github.com/fusinv/fusioninventory-agent/commit/1042eca6ce9af2e6f8be41f4ed1dabb945155573
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-10 (Sat, 10 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
    M t/inventory/windows/networks.t

  Log Message:
  -----------
  perform filtering directly in extraction function


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
index 7e1f9f6..e8640ab 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
@@ -18,11 +18,6 @@ sub doInventory {
     my (@gateways, @dns, @ips);
 
     foreach my $interface (_getInterfaces()) {
-        next if
-            !$interface->{IPADDRESS} &&
-            !$interface->{IPADDRESS6} &&
-            !$interface->{MACADDR};
-
         push @gateways, $interface->{IPGATEWAY}
             if $interface->{IPGATEWAY};
 
@@ -133,7 +128,11 @@ sub _getInterfaces {
         }
     }
 
-    return @interfaces;
+    # exclude pure virtual interfaces
+    return
+        grep { $_->{IPADDRESS} || $_->{IPADDRESS6} || $_->{MACADDR} }
+        @interfaces;
+
 }
 
 1;
diff --git a/t/inventory/windows/networks.t b/t/inventory/windows/networks.t
index 0517ace..a5aabf5 100755
--- a/t/inventory/windows/networks.t
+++ b/t/inventory/windows/networks.t
@@ -21,55 +21,6 @@ use FusionInventory::Agent::Task::Inventory::Input::Win32::Networks;
 my %tests = (
     7 => [
         {
-            MTU         => undef,
-            MACADDR     => undef,
-            STATUS      => 'Up',
-            DESCRIPTION => 'WAN Miniport (SSTP)',
-            IPDHCP      => undef
-        },
-        {
-            MTU         => undef,
-            MACADDR     => undef,
-            STATUS      => 'Up',
-            DESCRIPTION => 'WAN Miniport (IKEv2)',
-            IPDHCP      => undef
-        },
-        {
-            MTU         => undef,
-            MACADDR     => undef,
-            STATUS      => 'Up',
-            DESCRIPTION => 'WAN Miniport (L2TP)',
-            IPDHCP      => undef
-        },
-        {
-            MTU         => undef,
-            MACADDR     => undef,
-            STATUS      => 'Up',
-            DESCRIPTION => 'WAN Miniport (PPTP)',
-            IPDHCP      => undef
-        },
-        {
-            MTU         => undef,
-            MACADDR     => undef,
-            STATUS      => 'Up',
-            DESCRIPTION => 'WAN Miniport (PPPOE)',
-            IPDHCP      => undef
-        },
-        {
-            MTU         => undef,
-            MACADDR     => undef,
-            STATUS      => 'Up',
-            DESCRIPTION => 'WAN Miniport (IPv6)',
-            IPDHCP      => undef
-        },
-        {
-            MTU         => undef,
-            MACADDR     => undef,
-            STATUS      => 'Up',
-            DESCRIPTION => 'WAN Miniport (Network Monitor)',
-            IPDHCP      => undef
-        },
-        {
             'dns' => '192.168.0.254',
             'IPMASK6' => [
                        '64'
@@ -96,46 +47,11 @@ my %tests = (
         },
         {
             MTU         => undef,
-            MACADDR     => undef,
-            STATUS      => 'Up',
-            DESCRIPTION => 'WAN Miniport (IP)',
-            IPDHCP      => undef
-        },
-        {
-            MTU         => undef,
-            MACADDR     => undef,
-            STATUS      => 'Up',
-            DESCRIPTION => 'Carte Microsoft ISATAP',
-            IPDHCP      => undef
-        },
-        {
-            MTU         => undef,
-            MACADDR     => undef,
-            STATUS      => 'Up',
-            DESCRIPTION => 'RAS Async Adapter',
-            IPDHCP      => undef
-        },
-        {
-            MTU         => undef,
-            MACADDR     => undef,
-            STATUS      => 'Up',
-            DESCRIPTION => 'Microsoft Teredo Tunneling Adapter',
-            IPDHCP      => undef
-        },
-        {
-            MTU         => undef,
             MACADDR     => '00:26:83:12:FB:0B',
             STATUS      => 'Up',
-            DESCRIPTION => "P\x{e9}riph\x{e9}rique Bluetooth (r\x{e9}seau personnel)",
+            DESCRIPTION => "Périphérique Bluetooth (réseau personnel)",
             IPDHCP      => undef
         },
-        {
-            MTU         => undef,
-            MACADDR     => undef,
-            STATUS      => 'Up',
-            DESCRIPTION => 'Carte Microsoft ISATAP',
-            IPDHCP      => undef
-        }
     ],
 );
 


================================================================
  Commit: 1d06b0f29e0d71001bbc9be8729ec2e4b43320ff
      https://github.com/fusinv/fusioninventory-agent/commit/1d06b0f29e0d71001bbc9be8729ec2e4b43320ff
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-03-11 (Sun, 11 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm

  Log Message:
  -----------
  use upper case for description key


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
index e8640ab..be02dee 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
@@ -114,9 +114,9 @@ sub _getInterfaces {
         if (defined $object->{PhysicalAdapter}) {
             $interface->{VIRTUALDEV} = $object->{PhysicalAdapter} ? 0 : 1;
         # http://forge.fusioninventory.org/issues/1166 
-        } elsif ($interface->{description}
-              && $interface->{description} =~ /RAS/
-              && $interface->{description} =~ /Adapter/i) {
+        } elsif ($interface->{DESCRIPTION}
+              && $interface->{DESCRIPTION} =~ /RAS/
+              && $interface->{DESCRIPTION} =~ /Adapter/i) {
             $interface->{VIRTUALDEV} = 1;
         } else {
             $interface->{VIRTUALDEV} = $object->{PNPDeviceId} =~ /^ROOT/ ? 1 : 0;


================================================================
  Commit: e3b65f5c7fef6750bc4edda2029cd81769a43072
      https://github.com/fusinv/fusioninventory-agent/commit/e3b65f5c7fef6750bc4edda2029cd81769a43072
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-03-11 (Sun, 11 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm

  Log Message:
  -----------
  grep call: Avoid warning regarding modified value

The message was:
[debug] unexpected error in FusionInventory::Agent::Task::Inventory::Input::Win3
2::Networks: Modification of a read-only value attempted at lib/FusionInventory/
Agent/Task/Inventory/Input/Win32/Networks.pm line 133.


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
index be02dee..d360f78 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
@@ -130,7 +130,16 @@ sub _getInterfaces {
 
     # exclude pure virtual interfaces
     return
-        grep { $_->{IPADDRESS} || $_->{IPADDRESS6} || $_->{MACADDR} }
+        grep {
+            ref($_) eq 'HASH' &&
+            (
+                (defined($_->{IPADDRESS}) && $_->{IPADDRESS})
+                    ||
+                (defined($_->{IPADDRESS6}) && $_->{IPADDRESS6})
+                    ||
+                (defined($_->{MACADDR}) && $_->{MACADDR})
+            ) 
+            }
         @interfaces;
 
 }


================================================================
  Commit: fc5dce828c7f5fa52278da1326f217b1439a52bf
      https://github.com/fusinv/fusioninventory-agent/commit/fc5dce828c7f5fa52278da1326f217b1439a52bf
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-03-11 (Sun, 11 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Videos.pm

  Log Message:
  -----------
  drop $seen since we can't get duplicated entry here


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Videos.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Videos.pm
index be4aef8..cff31ad 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Videos.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Videos.pm
@@ -6,8 +6,6 @@ use warnings;
 use FusionInventory::Agent::Tools;
 use FusionInventory::Agent::Tools::Unix;
 
-my $seen;
-
 sub isEnabled {
     return 1;
 }
@@ -66,9 +64,6 @@ sub doInventory {
         $video->{RESOLUTION} =~ s/@.*//;
     }
 
-    # avoid duplicates
-    next if $seen->{$video->{NAME}}++;
-
     $inventory->addEntry(
         section => 'VIDEOS',
         entry   => $video


================================================================
  Commit: 727ae97d0c16a0e33c88ad63d2ec7020c3b580ff
      https://github.com/fusinv/fusioninventory-agent/commit/727ae97d0c16a0e33c88ad63d2ec7020c3b580ff
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-03-11 (Sun, 11 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Networks.pm

  Log Message:
  -----------
  $num used once

_check_eri seems to be used nowhere


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Networks.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Networks.pm
index 90aaa59..772ee74 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Networks.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Networks.pm
@@ -135,7 +135,7 @@ sub _check_nic {
 
 # Function to test eri Fast-Ethernet (eri_).
 sub _check_eri {
-    my ($nic, $num) = @_;
+    my ($nic) = @_;
 
     my $speed = getFirstMatch(
         command => "/usr/sbin/ndd -get /dev/$nic link_speed",


================================================================
  Commit: 8df47afb449dea96f50b80bf0cddcb2fc2392a66
      https://github.com/fusinv/fusioninventory-agent/commit/8df47afb449dea96f50b80bf0cddcb2fc2392a66
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-03-11 (Sun, 11 Mar 2012)

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

  Log Message:
  -----------
  avoid: Use of uninitialized value in alarm

Was appening when timeout was undef


diff --git a/lib/FusionInventory/Agent/Tools.pm b/lib/FusionInventory/Agent/Tools.pm
index bc61bbf..1a2bee1 100644
--- a/lib/FusionInventory/Agent/Tools.pm
+++ b/lib/FusionInventory/Agent/Tools.pm
@@ -443,8 +443,10 @@ sub runFunction {
     my $result;
     eval {
         # set a timeout if needed
-        local $SIG{ALRM} = sub { die "alarm\n" } if $params{timeout};
-        alarm $params{timeout};
+       if ($params{timeout}) {
+           local $SIG{ALRM} = sub { die "alarm\n" };
+           alarm $params{timeout};
+       }
 
         no strict 'refs'; ## no critic
         $result = &{$params{module} . '::' . $params{function}}(


================================================================
  Commit: 8b9adcda6fb16dd9e41f5b9cadaff79452cffedc
      https://github.com/fusinv/fusioninventory-agent/commit/8b9adcda6fb16dd9e41f5b9cadaff79452cffedc
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-03-12 (Mon, 12 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Config.pm

  Log Message:
  -----------
  Revert "don't access registry directly"

This reverts commit ebe3be416cd1d574f85978cf1170ef5617ad5dac.

Tools::Win32 pulls OLE.pm. We can't do that in the main process
or we will do a double free() at the end of the Inventory process.

commit: 6a3e41e648e47843ccf52aa49a1de5c6a6527d35


diff --git a/lib/FusionInventory/Agent/Config.pm b/lib/FusionInventory/Agent/Config.pm
index 763e8f4..df463b8 100644
--- a/lib/FusionInventory/Agent/Config.pm
+++ b/lib/FusionInventory/Agent/Config.pm
@@ -131,14 +131,20 @@ sub _loadDefaults {
 sub _loadFromRegistry {
     my ($self) = @_;
 
-    FusionInventory::Agent::Tools::Win32->use();
-    die "Failed to load FusionInventory::Agent::Tools::Win32: $EVAL_ERROR"
-        if $EVAL_ERROR;
-
-    my $settings = getRegistryKey(
-        path => "HKEY_LOCAL_MACHINE/SOFTWARE/FusionInventory-Agent",
+    my $Registry;
+    Win32::TieRegistry->require();
+    Win32::TieRegistry->import(
+        Delimiter   => '/',
+        ArrayValues => 0,
+        TiedRef     => \$Registry
     );
 
+    my $machKey = $Registry->Open('LMachine', {
+        Access => Win32::TieRegistry::KEY_READ()
+    }) or die "Can't open HKEY_LOCAL_MACHINE key: $EXTENDED_OS_ERROR";
+
+    my $settings = $machKey->{"SOFTWARE/FusionInventory-Agent"};
+
     foreach my $rawKey (keys %$settings) {
         next unless $rawKey =~ /^\/(\S+)/;
         my $key = $1;


================================================================
  Commit: bd8f5e37dd23f3ec993078722e6167b0c9726f31
      https://github.com/fusinv/fusioninventory-agent/commit/bd8f5e37dd23f3ec993078722e6167b0c9726f31
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-03-12 (Mon, 12 Mar 2012)

  Changed paths:
    M tools/createExtLinks.sh

  Log Message:
  -----------
  fixes for Windows


diff --git a/tools/createExtLinks.sh b/tools/createExtLinks.sh
index 41d5242..f7625a3 100755
--- a/tools/createExtLinks.sh
+++ b/tools/createExtLinks.sh
@@ -6,16 +6,16 @@ for task in Deploy SNMPQuery NetDiscovery ESX; do
     taskLcName=`perl -e" print lc \"$task\""`
     taskFile=$PWD/../agent-task-$taskLcName/lib/FusionInventory/Agent/Task/$task.pm
     taskDir=$PWD/../agent-task-$taskLcName/lib/FusionInventory/Agent/Task/$task
-    if [ -f $taskFile ] && [ ! -e lib/FusionInventory/Agent/Task/$task.pm ]; then
+    if [ -f "$taskFile" ] && [ ! -e lib/FusionInventory/Agent/Task/$task.pm ]; then
         echo "create link for $task"
-        ln -s $PWD/../agent-task-$taskLcName/lib/FusionInventory/Agent/Task/$task.pm lib/FusionInventory/Agent/Task/
-        if [ -d $taskDir ] && [ ! -e lib/FusionInventory/Agent/Task/$task ]; then
-            ln -s $PWD/../agent-task-$taskLcName/lib/FusionInventory/Agent/Task/$task lib/FusionInventory/Agent/Task/
+        ln -s "$PWD/../agent-task-$taskLcName/lib/FusionInventory/Agent/Task/$task.pm" lib/FusionInventory/Agent/Task/
+        if [ -d "$taskDir" ] && [ ! -e lib/FusionInventory/Agent/Task/$task ]; then
+            ln -s "$PWD/../agent-task-$taskLcName/lib/FusionInventory/Agent/Task/$task" lib/FusionInventory/Agent/Task/$task
         fi
     fi
 done
 if [ ! -e lib/FusionInventory/VMware ]; then
-    ln -s $PWD/../agent-task-esx/lib/FusionInventory/VMware lib/FusionInventory/
+    ln -s "$PWD/../agent-task-esx/lib/FusionInventory/VMware" lib/FusionInventory/VMware
 fi
 if [ ! -e lib/FusionInventory/Agent/SNMP.pm ]; then
     ln -s $PWD/../agent-task-netdiscovery/lib/FusionInventory/Agent/SNMP.pm lib/FusionInventory/Agent/SNMP.pm


================================================================
  Commit: da47b464bdc6466414d57d4ff459a55871b5b0ef
      https://github.com/fusinv/fusioninventory-agent/commit/da47b464bdc6466414d57d4ff459a55871b5b0ef
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-03-12 (Mon, 12 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Processes.pm

  Log Message:
  -----------
  win32: do not run ps.exe from msysgit

Use the Win32 API instead to get the process list.


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Processes.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Processes.pm
index bc4288a..778a179 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Processes.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Processes.pm
@@ -9,6 +9,7 @@ use FusionInventory::Agent::Tools;
 use FusionInventory::Agent::Tools::Unix;
 
 sub isEnabled {
+    return if $OSNAME eq 'MSWin32';
     return canRun('ps');
 }
 


================================================================
  Commit: c391f5b0f6275aa6ad4b2fcfbd3e8ea40413f477
      https://github.com/fusinv/fusioninventory-agent/commit/c391f5b0f6275aa6ad4b2fcfbd3e8ea40413f477
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-03-12 (Mon, 12 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Config.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
    A resources/win32/wmi/7-Win32_NetworkAdapter.wmi
    A resources/win32/wmi/7-Win32_NetworkAdapterConfiguration.wmi
    M t/FusionInventory/Test/Utils.pm
    A t/inventory/windows/networks.t

  Log Message:
  -----------
  Merge remote-tracking branch 'origin/2.2.x' into 2.2.x


diff --git a/lib/FusionInventory/Agent/Config.pm b/lib/FusionInventory/Agent/Config.pm
index 763e8f4..df463b8 100644
--- a/lib/FusionInventory/Agent/Config.pm
+++ b/lib/FusionInventory/Agent/Config.pm
@@ -131,14 +131,20 @@ sub _loadDefaults {
 sub _loadFromRegistry {
     my ($self) = @_;
 
-    FusionInventory::Agent::Tools::Win32->use();
-    die "Failed to load FusionInventory::Agent::Tools::Win32: $EVAL_ERROR"
-        if $EVAL_ERROR;
-
-    my $settings = getRegistryKey(
-        path => "HKEY_LOCAL_MACHINE/SOFTWARE/FusionInventory-Agent",
+    my $Registry;
+    Win32::TieRegistry->require();
+    Win32::TieRegistry->import(
+        Delimiter   => '/',
+        ArrayValues => 0,
+        TiedRef     => \$Registry
     );
 
+    my $machKey = $Registry->Open('LMachine', {
+        Access => Win32::TieRegistry::KEY_READ()
+    }) or die "Can't open HKEY_LOCAL_MACHINE key: $EXTENDED_OS_ERROR";
+
+    my $settings = $machKey->{"SOFTWARE/FusionInventory-Agent"};
+
     foreach my $rawKey (keys %$settings) {
         next unless $rawKey =~ /^\/(\S+)/;
         my $key = $1;
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
index c9e9acd..d360f78 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
@@ -3,17 +3,10 @@ package FusionInventory::Agent::Task::Inventory::Input::Win32::Networks;
 use strict;
 use warnings;
 
-use Win32::OLE qw(in CP_UTF8);
-use Win32::OLE::Const;
-use Win32::OLE::Enum;
-
 use FusionInventory::Agent::Tools;
 use FusionInventory::Agent::Tools::Network;
 use FusionInventory::Agent::Tools::Win32;
  
-Win32::OLE-> Option(CP=>CP_UTF8);
-
-# http://techtasks.com/code/viewbookcode/1417
 sub isEnabled {
     return 1;
 }
@@ -22,53 +15,76 @@ sub doInventory {
     my (%params) = @_;
 
     my $inventory = $params{inventory};
+    my (@gateways, @dns, @ips);
+
+    foreach my $interface (_getInterfaces()) {
+        push @gateways, $interface->{IPGATEWAY}
+            if $interface->{IPGATEWAY};
+
+        push @dns, $interface->{dns}
+            if $interface->{dns};
+
+        push @ips, @{$interface->{IPADDRESS}}
+            if $interface->{IPADDRESS};
+
+        delete $interface->{dns};
+
+        # flatten multivalued keys
+        foreach my $key (qw/IPADDRESS IPMASK IPSUBNET IPADDRESS6/) {
+            next unless $interface->{$key};
+            $interface->{$key} = join('/', @{$interface->{$key}});
+        }
+
+        $inventory->addEntry(
+            section => 'NETWORKS',
+            entry   => $interface
+        );
+    }
+
+    $inventory->setHardware({
+        DEFAULTGATEWAY => join('/', uniq @gateways),
+        DNS            => join('/', uniq @dns),
+        IPADDR         => join('/', uniq @ips),
+    });
+
+}
 
-    my $WMIService = Win32::OLE->GetObject(
-        'winmgmts:{impersonationLevel=impersonate}!\\\\.\\root\\cimv2'
-    ) or die "WMI connection failed: " . Win32::OLE->LastError();
+sub _getInterfaces {
 
-    my %ips;
-    my @ip6s;
     my @interfaces;
-    my %defaultgateways;
-    my %dns;
 
-    my $nics = $WMIService->ExecQuery(
-        'SELECT * FROM Win32_NetworkAdapterConfiguration'
-    );
-    foreach my $nic (in $nics) {
+    foreach my $object (getWmiObjects(
+        class      => 'Win32_NetworkAdapterConfiguration',
+        properties => [ qw/Index Description IPEnabled DHCPServer MACAddress 
+                           MTU DefaultIPGateway DNSServerSearchOrder IPAddress
+                           IPSubnet/  ]
+    )) {
+
         my $interface = {
-            DESCRIPTION => $nic->Description,
-            STATUS      => $nic->IPEnabled ? "Up" : "Down",
-            IPDHCP      => $nic->DHCPServer,
-            MACADDR     => $nic->MACAddress,
-            MTU         => $nic->MTU
+            DESCRIPTION => $object->{Description},
+            STATUS      => $object->{IPEnabled} ? "Up" : "Down",
+            IPDHCP      => $object->{DHCPServer},
+            MACADDR     => $object->{MACAddress},
+            MTU         => $object->{MTU}
         };
 
-        foreach (@{$nic->DefaultIPGateway || []}) {
-            $defaultgateways{$_} = 1;
-        }
-
-        if ($nic->DefaultIPGateway) {
-            $interface->{IPGATEWAY} = $nic->DefaultIPGateway()->[0];
+        if ($object->{DefaultIPGateway}) {
+            $interface->{IPGATEWAY} = $object->{DefaultIPGateway}->[0];
         }
 
-        foreach (@{$nic->DNSServerSearchOrder || []}) {
-            $dns{$_} = 1;
+        if ($object->{DNSServerSearchOrder}) {
+            $interface->{dns} = $object->{DNSServerSearchOrder}->[0];
         }
 
-        if ($nic->IPAddress) {
-            foreach my $addrId (0..(@{$nic->IPAddress}-1)) {
-                my $address = $nic->IPAddress->[$addrId];
-                my $mask = $nic->IPSubnet->[$addrId];
+        if ($object->{IPAddress}) {
+            foreach my $address (@{$object->{IPAddress}}) {
+                my $mask = shift @{$object->{IPSubnet}};
                 if ($address =~ /$ip_address_pattern/) {
-                    $ips{$address}=1;
                     push @{$interface->{IPADDRESS}}, $address;
                     push @{$interface->{IPMASK}}, $mask;
                     push @{$interface->{IPSUBNET}},
                         getSubnetAddress($address, $mask);
                 } elsif ($address =~ /\S+/) {
-                    push @ip6s, $address;
                     push @{$interface->{IPADDRESS6}}, $address;
                     push @{$interface->{IPMASK6}}, $mask;
                     push @{$interface->{IPSUBNET6}},
@@ -77,63 +93,54 @@ sub doInventory {
             }
         }
 
-        $interfaces[$nic->Index] = $interface;
+        $interfaces[$object->{Index}] = $interface;
     }
 
-    $nics = $WMIService->ExecQuery('SELECT * FROM Win32_NetworkAdapter');
-    foreach my $nic (in $nics) {
-	my $interface = $interfaces[$nic->Index];
-
+    foreach my $object (getWmiObjects(
+        class      => 'Win32_NetworkAdapter',
+        properties => [ qw/Index PNPDeviceId Speed MACAddress PhysicalAdapter 
+                           AdapterType/  ]
+    )) {
         # http://comments.gmane.org/gmane.comp.monitoring.fusion-inventory.devel/34
-        next unless $nic->PNPDeviceID;
+        next unless $object->{PNPDeviceId};
+
+        my $interface = $interfaces[$object->{Index}];
 
-	$interface->{SPEED}       = $nic->Speed;
-	$interface->{MACADDR}     = $nic->MACAddress;
-	$interface->{PNPDEVICEID} = $nic->PNPDeviceID;
+        $interface->{SPEED}       = $object->{Speed};
+        $interface->{MACADDR}     = $object->{MACAddress};
+        $interface->{PNPDEVICEID} = $object->{PNPDeviceId};
 
         # PhysicalAdapter only work on OS > XP
-        if (defined $nic->PhysicalAdapter) {
-            $interface->{VIRTUALDEV} = $nic->PhysicalAdapter ? 0 : 1;
+        if (defined $object->{PhysicalAdapter}) {
+            $interface->{VIRTUALDEV} = $object->{PhysicalAdapter} ? 0 : 1;
         # http://forge.fusioninventory.org/issues/1166 
-        } elsif ($interface->{description}
-              && $interface->{description} =~ /RAS/
-              && $interface->{description} =~ /Adapter/i) {
+        } elsif ($interface->{DESCRIPTION}
+              && $interface->{DESCRIPTION} =~ /RAS/
+              && $interface->{DESCRIPTION} =~ /Adapter/i) {
             $interface->{VIRTUALDEV} = 1;
         } else {
-	    $interface->{VIRTUALDEV} = $nic->PNPDeviceID =~ /^ROOT/ ? 1 : 0;
+            $interface->{VIRTUALDEV} = $object->{PNPDeviceId} =~ /^ROOT/ ? 1 : 0;
         }
 
-        if (defined $nic->AdapterType) {
-            $interface->{TYPE} = $nic->AdapterType;
+        if (defined $object->{AdapterType}) {
+            $interface->{TYPE} = $object->{AdapterType};
             $interface->{TYPE} =~ s/Ethernet.*/Ethernet/;
         }
-
     }
 
-    foreach my $interface (@interfaces) {
-
-        next if
-            !$interface->{IPADDRESS} &&
-            !$interface->{IPADDRESS6} &&
-            !$interface->{MACADDR};
-
-        # flatten multivalued keys
-        foreach my $key (qw/IPADDRESS IPMASK IPSUBNET IPADDRESS6/) {
-            next unless $interface->{$key};
-            $interface->{$key} = join('/', @{$interface->{$key}});
-        }
-
-        $inventory->addEntry(
-            section => 'NETWORKS',
-            entry   => $interface
-        );
-    }
-
-    $inventory->setHardware({
-        DEFAULTGATEWAY => join ('/',keys %defaultgateways),
-        DNS            => join('/', keys %dns),
-        IPADDR         => join('/', keys %ips),
-    });
+    # exclude pure virtual interfaces
+    return
+        grep {
+            ref($_) eq 'HASH' &&
+            (
+                (defined($_->{IPADDRESS}) && $_->{IPADDRESS})
+                    ||
+                (defined($_->{IPADDRESS6}) && $_->{IPADDRESS6})
+                    ||
+                (defined($_->{MACADDR}) && $_->{MACADDR})
+            ) 
+            }
+        @interfaces;
 
 }
 
diff --git a/resources/win32/wmi/7-Win32_NetworkAdapter.wmi b/resources/win32/wmi/7-Win32_NetworkAdapter.wmi
new file mode 100644
index 0000000..6d75607
Binary files /dev/null and b/resources/win32/wmi/7-Win32_NetworkAdapter.wmi differ
diff --git a/resources/win32/wmi/7-Win32_NetworkAdapterConfiguration.wmi b/resources/win32/wmi/7-Win32_NetworkAdapterConfiguration.wmi
new file mode 100644
index 0000000..0c42f79
Binary files /dev/null and b/resources/win32/wmi/7-Win32_NetworkAdapterConfiguration.wmi differ
diff --git a/t/FusionInventory/Test/Utils.pm b/t/FusionInventory/Test/Utils.pm
index 9de910c..e2e5e17 100644
--- a/t/FusionInventory/Test/Utils.pm
+++ b/t/FusionInventory/Test/Utils.pm
@@ -61,8 +61,16 @@ sub loadWMIDump {
             my $key = $1;
             my $value = $2;
             next unless $properties{$key};
-            $value =~ s/&/&/g;
-            $object->{$key} = $value;
+            if ($value =~ /{(".*")}/) {
+                # values list
+                my @values =
+                    map { /"([^"]+)"/ }
+                    split(/,/, $1);
+                $object->{$key} = \@values;
+            } else {
+                $value =~ s/&/&/g;
+                $object->{$key} = $value;
+            }
             next;
         }
 
diff --git a/t/inventory/windows/networks.t b/t/inventory/windows/networks.t
new file mode 100755
index 0000000..a5aabf5
--- /dev/null
+++ b/t/inventory/windows/networks.t
@@ -0,0 +1,76 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+use utf8;
+use lib 't';
+
+use English qw(-no_match_vars);
+use Test::More;
+use Test::MockModule;
+
+use FusionInventory::Test::Utils;
+
+BEGIN {
+    # use mock modules for non-available ones
+    push @INC, 't/fake/windows' if $OSNAME ne 'MSWin32';
+}
+
+use FusionInventory::Agent::Task::Inventory::Input::Win32::Networks;
+
+my %tests = (
+    7 => [
+        {
+            'dns' => '192.168.0.254',
+            'IPMASK6' => [
+                       '64'
+                     ],
+            'IPMASK' => [
+                      '255.255.255.0'
+                    ],
+            'IPGATEWAY' => '192.168.0.254',
+            MACADDR     => 'F4:6D:04:97:2D:3E',
+            STATUS      => 'Up',
+            'IPADDRESS6' => [
+                          'fe80::311a:2127:dded:6618'
+                        ],
+            IPDHCP      => '192.168.0.254',
+            'IPSUBNET' => [
+                        '192.168.0.0'
+                      ],
+            MTU         => undef,
+            'IPSUBNET6' => [],
+            DESCRIPTION => 'Realtek PCIe GBE Family Controller',
+            'IPADDRESS' => [
+                         '192.168.0.1'
+                       ]
+        },
+        {
+            MTU         => undef,
+            MACADDR     => '00:26:83:12:FB:0B',
+            STATUS      => 'Up',
+            DESCRIPTION => "Périphérique Bluetooth (réseau personnel)",
+            IPDHCP      => undef
+        },
+    ],
+);
+
+plan tests => scalar keys %tests;
+
+my $module = Test::MockModule->new(
+    'FusionInventory::Agent::Task::Inventory::Input::Win32::Networks'
+);
+
+foreach my $test (keys %tests) {
+    $module->mock(
+        'getWmiObjects',
+        mockGetWmiObjects($test)
+    );
+
+    my @interfaces = FusionInventory::Agent::Task::Inventory::Input::Win32::Networks::_getInterfaces();
+    is_deeply(
+        \@interfaces,
+        $tests{$test},
+        "$test sample"
+    );
+}


================================================================
  Commit: 0f7768e3c6c17f9b288935e57c65d9e863f373ef
      https://github.com/fusinv/fusioninventory-agent/commit/0f7768e3c6c17f9b288935e57c65d9e863f373ef
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-03-12 (Mon, 12 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm

  Log Message:
  -----------
  ignore net interfaces without PNPDEVICEID

Reported-by: Tomás Abad <tabad at sescam.jccm.es>


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
index d360f78..c26e84b 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
@@ -131,7 +131,10 @@ sub _getInterfaces {
     # exclude pure virtual interfaces
     return
         grep {
-            ref($_) eq 'HASH' &&
+            ref($_) eq 'HASH'
+            &&
+            (defined($_->{PNPDEVICEID}) && $_->{PNPDEVICEID})
+            &&
             (
                 (defined($_->{IPADDRESS}) && $_->{IPADDRESS})
                     ||


================================================================
  Commit: cfe4520208d9565d889e5a95786dc1be986fc3e8
      https://github.com/fusinv/fusioninventory-agent/commit/cfe4520208d9565d889e5a95786dc1be986fc3e8
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-12 (Mon, 12 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm

  Log Message:
  -----------
  fix property name capitalization


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
index c26e84b..28837e8 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
@@ -98,17 +98,17 @@ sub _getInterfaces {
 
     foreach my $object (getWmiObjects(
         class      => 'Win32_NetworkAdapter',
-        properties => [ qw/Index PNPDeviceId Speed MACAddress PhysicalAdapter 
+        properties => [ qw/Index PNPDeviceID Speed MACAddress PhysicalAdapter 
                            AdapterType/  ]
     )) {
         # http://comments.gmane.org/gmane.comp.monitoring.fusion-inventory.devel/34
-        next unless $object->{PNPDeviceId};
+        next unless $object->{PNPDeviceID};
 
         my $interface = $interfaces[$object->{Index}];
 
         $interface->{SPEED}       = $object->{Speed};
         $interface->{MACADDR}     = $object->{MACAddress};
-        $interface->{PNPDEVICEID} = $object->{PNPDeviceId};
+        $interface->{PNPDEVICEID} = $object->{PNPDeviceID};
 
         # PhysicalAdapter only work on OS > XP
         if (defined $object->{PhysicalAdapter}) {
@@ -119,7 +119,7 @@ sub _getInterfaces {
               && $interface->{DESCRIPTION} =~ /Adapter/i) {
             $interface->{VIRTUALDEV} = 1;
         } else {
-            $interface->{VIRTUALDEV} = $object->{PNPDeviceId} =~ /^ROOT/ ? 1 : 0;
+            $interface->{VIRTUALDEV} = $object->{PNPDeviceID} =~ /^ROOT/ ? 1 : 0;
         }
 
         if (defined $object->{AdapterType}) {


================================================================
  Commit: fbfecbe2b296ff1bfe2e56f9cc709b630dfc8458
      https://github.com/fusinv/fusioninventory-agent/commit/fbfecbe2b296ff1bfe2e56f9cc709b630dfc8458
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-12 (Mon, 12 Mar 2012)

  Changed paths:
    M t/inventory/windows/networks.t

  Log Message:
  -----------
  fix expected results


diff --git a/t/inventory/windows/networks.t b/t/inventory/windows/networks.t
index a5aabf5..8415248 100755
--- a/t/inventory/windows/networks.t
+++ b/t/inventory/windows/networks.t
@@ -21,36 +21,34 @@ use FusionInventory::Agent::Task::Inventory::Input::Win32::Networks;
 my %tests = (
     7 => [
         {
-            'dns' => '192.168.0.254',
-            'IPMASK6' => [
-                       '64'
-                     ],
-            'IPMASK' => [
-                      '255.255.255.0'
-                    ],
-            'IPGATEWAY' => '192.168.0.254',
+            'dns'       => '192.168.0.254',
+            IPMASK6     => [ '64' ],
+            IPMASK      => [ '255.255.255.0' ],
+            IPGATEWAY   => '192.168.0.254',
             MACADDR     => 'F4:6D:04:97:2D:3E',
             STATUS      => 'Up',
-            'IPADDRESS6' => [
-                          'fe80::311a:2127:dded:6618'
-                        ],
+            IPADDRESS6  => [ 'fe80::311a:2127:dded:6618' ],
             IPDHCP      => '192.168.0.254',
-            'IPSUBNET' => [
-                        '192.168.0.0'
-                      ],
+            IPSUBNET    => [ '192.168.0.0' ],
             MTU         => undef,
-            'IPSUBNET6' => [],
+            IPSUBNET6   => [],
             DESCRIPTION => 'Realtek PCIe GBE Family Controller',
-            'IPADDRESS' => [
-                         '192.168.0.1'
-                       ]
+            IPADDRESS   => [ '192.168.0.1' ],
+            VIRTUALDEV  => 0,
+            SPEED       => 100000000,
+            PNPDEVICEID => 'PCI\VEN_10EC&DEV_8168&SUBSYS_84321043&REV_06\4&87D54EE&0&00E5',
+            TYPE        => 'Ethernet'
         },
         {
             MTU         => undef,
             MACADDR     => '00:26:83:12:FB:0B',
             STATUS      => 'Up',
             DESCRIPTION => "Périphérique Bluetooth (réseau personnel)",
-            IPDHCP      => undef
+            IPDHCP      => undef,
+            VIRTUALDEV  => 0,
+            PNPDEVICEID => 'BTH\MS_BTHPAN\7&42D85A8&0&2',
+            TYPE        => 'Ethernet',
+            SPEED       => 0
         },
     ],
 );


================================================================
  Commit: f03f53d7c9c997b47ecf62a66aade0cd5b7033cc
      https://github.com/fusinv/fusioninventory-agent/commit/f03f53d7c9c997b47ecf62a66aade0cd5b7033cc
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-12 (Mon, 12 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm

  Log Message:
  -----------
  Revert "ignore net interfaces without PNPDEVICEID"

Hasty change, likely to be useless, as root cause was probably
fixed by commit cfe4520

This reverts commit 0f7768e3c6c17f9b288935e57c65d9e863f373ef.


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
index 28837e8..9b70aa0 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
@@ -131,10 +131,7 @@ sub _getInterfaces {
     # exclude pure virtual interfaces
     return
         grep {
-            ref($_) eq 'HASH'
-            &&
-            (defined($_->{PNPDEVICEID}) && $_->{PNPDEVICEID})
-            &&
+            ref($_) eq 'HASH' &&
             (
                 (defined($_->{IPADDRESS}) && $_->{IPADDRESS})
                     ||


================================================================
  Commit: 43a35df9a99448abf8ea5ce733fffaa160184c96
      https://github.com/fusinv/fusioninventory-agent/commit/43a35df9a99448abf8ea5ce733fffaa160184c96
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-12 (Mon, 12 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm

  Log Message:
  -----------
  Revert "grep call: Avoid warning regarding modified value"

hast change, likely to be useless, as root cause was probably
fixed by commit cfe4520

This reverts commit e3b65f5c7fef6750bc4edda2029cd81769a43072.


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
index 9b70aa0..70eb701 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
@@ -130,16 +130,7 @@ sub _getInterfaces {
 
     # exclude pure virtual interfaces
     return
-        grep {
-            ref($_) eq 'HASH' &&
-            (
-                (defined($_->{IPADDRESS}) && $_->{IPADDRESS})
-                    ||
-                (defined($_->{IPADDRESS6}) && $_->{IPADDRESS6})
-                    ||
-                (defined($_->{MACADDR}) && $_->{MACADDR})
-            ) 
-            }
+        grep { $_->{IPADDRESS} || $_->{IPADDRESS6} || $_->{MACADDR} }
         @interfaces;
 
 }


================================================================
  Commit: 1f983f092f4c7825283146f8e82147e6f9659fd4
      https://github.com/fusinv/fusioninventory-agent/commit/1f983f092f4c7825283146f8e82147e6f9659fd4
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-12 (Mon, 12 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Processes.pm

  Log Message:
  -----------
  use a single return statement, for consistency


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Processes.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Processes.pm
index 778a179..e22c36c 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Processes.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Processes.pm
@@ -9,8 +9,9 @@ use FusionInventory::Agent::Tools;
 use FusionInventory::Agent::Tools::Unix;
 
 sub isEnabled {
-    return if $OSNAME eq 'MSWin32';
-    return canRun('ps');
+    return 
+        $OSNAME ne 'MSWin32' &&
+        canRun('ps');
 }
 
 sub doInventory {


================================================================
  Commit: 7aae4a541c3877861f25f8a978bf50643de15b86
      https://github.com/fusinv/fusioninventory-agent/commit/7aae4a541c3877861f25f8a978bf50643de15b86
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-12 (Mon, 12 Mar 2012)

  Changed paths:
    M README

  Log Message:
  -----------
  move ssl support paragraph at the end


diff --git a/README b/README
index 893398d..2883378 100644
--- a/README
+++ b/README
@@ -26,36 +26,6 @@ Additional optional programs:
 - dmidecode, for hardware inventory
 - lspci, for hardware inventory
 
-SSL support
------------
-LWP (also known as libwww-perl) is able to use either Crypt::SSLeay or
-IO::Socket::SSL transparently as underlying socket implementation for HTTPS
-support. However, only the second one is able to perform server certificate
-validation. As a consequence, the agent will refuse to use HTTPS, and exit
-immediatly if IO::Socket::SSL is not available, unless certificate checking has
-been explicitely disabled (--no-ssl-check command line parameter, or
-no-ssl-check configuration parameter).
-
-The SSL protocol version supported by the agent is dependant of openssl
-version. In particular, usage of specific certificate signature algorithms such
-as SHA requires at least openssl 0.9.8o, as it is supposed to be allowed
-starting from TLS 1.1 only. Failure to comply will result in error message such
-as:
-warning: TLS library problem: 14710:error:0D0C50A1:asn1 encoding
-routines:ASN1_item_verify:unknown message digest algorithm:a_verify.c:146:
-
-This can be controlled in the certificate itself:
-[guillaume at beria ~]$ openssl x509 -noout -text -in cert.pem | grep Signature
-Signature Algorithm: sha256WithRSAEncryption
-Signature Algorithm: sha256WithRSAEncryption
-
-The available workaround:
-- ensure server certificate complies with clients capacities, using controlled
-  certificate generation parameters
-- ensure clients capacities matches server certificate properties, upgrading
-  openssl and its perl bindings (Net::SSLeay)
-- disable server certificate checking on client
-
 System-specific informations
 ----------------------------
 On Solaris/SPARC, you must install sneep and record the Serial Number with it.
@@ -94,3 +64,34 @@ recipient for the result and a controller for this work (an OCS server, a GLPI
 server, a local directory, etc...). Only the local inventory task is compatible
 with all kind of targets, tough, all others require a GLPI server target, and
 will get discarded for other kind of target.
+
+SSL support
+-----------
+LWP (also known as libwww-perl) is able to use either Crypt::SSLeay or
+IO::Socket::SSL transparently as underlying socket implementation for HTTPS
+support. However, only the second one is able to perform server certificate
+validation. As a consequence, the agent will refuse to use HTTPS, and exit
+immediatly if IO::Socket::SSL is not available, unless certificate checking has
+been explicitely disabled (--no-ssl-check command line parameter, or
+no-ssl-check configuration parameter).
+
+The SSL protocol version supported by the agent is dependant of openssl
+version. In particular, usage of specific certificate signature algorithms such
+as SHA requires at least openssl 0.9.8o, as it is supposed to be allowed
+starting from TLS 1.1 only. Failure to comply will result in error message such
+as:
+warning: TLS library problem: 14710:error:0D0C50A1:asn1 encoding
+routines:ASN1_item_verify:unknown message digest algorithm:a_verify.c:146:
+
+This can be controlled in the certificate itself:
+[guillaume at beria ~]$ openssl x509 -noout -text -in cert.pem | grep Signature
+Signature Algorithm: sha256WithRSAEncryption
+Signature Algorithm: sha256WithRSAEncryption
+
+The available workaround:
+- ensure server certificate complies with clients capacities, using controlled
+  certificate generation parameters
+- ensure clients capacities matches server certificate properties, upgrading
+  openssl and its perl bindings (Net::SSLeay)
+- disable server certificate checking on client
+


================================================================
  Commit: 79442335d8229e9603096fd81cc13654ca341a9d
      https://github.com/fusinv/fusioninventory-agent/commit/79442335d8229e9603096fd81cc13654ca341a9d
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-12 (Mon, 12 Mar 2012)

  Changed paths:
    M README

  Log Message:
  -----------
  drop instructions related to development version installation


diff --git a/README b/README
index 2883378..98c3381 100644
--- a/README
+++ b/README
@@ -37,10 +37,6 @@ collected.
 To avoid this situation, you can turn off the server, and run the agent with
 user privilege, for example during the login.
 
-On Windows, if you don't want to use the installer for Windows you can follow
-the installation process avalailable from
-http://forge.fusioninventory.org/projects/fusioninventory-agent/wiki/RunAgentWin32.
-
 Usage
 -----
 They are two different ways to run the agent:


================================================================
  Commit: 9cb4274726551afbfbcc6256ca98904b80fab076
      https://github.com/fusinv/fusioninventory-agent/commit/9cb4274726551afbfbcc6256ca98904b80fab076
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-12 (Mon, 12 Mar 2012)

  Changed paths:
    M README

  Log Message:
  -----------
  better usage documentation

more emphaze about the cost vs benefit interest of running the
agent as a server.


diff --git a/README b/README
index 98c3381..27161a1 100644
--- a/README
+++ b/README
@@ -26,17 +26,6 @@ Additional optional programs:
 - dmidecode, for hardware inventory
 - lspci, for hardware inventory
 
-System-specific informations
-----------------------------
-On Solaris/SPARC, you must install sneep and record the Serial Number with it.
-Download it from http://www.sun.com/download/products.xml?id=4304155a.
-
-The Windows installer will run the agent with the SYSTEM account. If you use
-an user GPO to configure the printer, the information will hidden and so not
-collected.
-To avoid this situation, you can turn off the server, and run the agent with
-user privilege, for example during the login.
-
 Usage
 -----
 They are two different ways to run the agent:
@@ -45,13 +34,23 @@ They are two different ways to run the agent:
   service under Windows)
 
 In the first case, the agent execution scheduling is controlled from local
-system, through cron under Unix, or scheduled tasks under Windows. In second
-case, the agent execution scheduling is controlled from GLPI server, as the
-agent runs regulary according to a parameter initially set in its
+system, and the memory footprint between agent executions is zero.
+
+In second case, the agent execution scheduling is controlled from GLPI server,
+as the agent runs regulary according to a parameter initially set in its
 configuration (delaytime), overrided by the server at the first connection
 (PROLOG_FREQ). Additionaly, the server may also initiate additional
 out-of-schedule executions by sending HTTP requests if the web interface is
-used.
+used. However, it also mean you have a full perl interpreter loaded in memory
+constantly, and a network port open on your system with a process running with
+full system privileges attached to it.
+
+If you don't need to control agent execution from the server, and if you're
+able to periodically launch the agent without resorting to its internal
+scheduler, through cron on Unix systems, or scheduled tasks on Windows, you'd
+better use first execution mode. The various installation procedure may offer
+limited choice about initial configuration, but you should always be able to
+change it thereafter.
 
 When executing, the agent tries to runs every available task for every
 configured target. A task is a specific kind of work to perform (local
@@ -61,6 +60,23 @@ server, a local directory, etc...). Only the local inventory task is compatible
 with all kind of targets, tough, all others require a GLPI server target, and
 will get discarded for other kind of target.
 
+System-specific informations
+----------------------------
+On Solaris/SPARC, you must install sneep and record the Serial Number with it.
+Download it from http://www.sun.com/download/products.xml?id=4304155a.
+
+On Windows, we use an additional dmidecode binary shipped in the windows
+distribution to retrieve many informations not available otherwise, including
+fine-grained multi-cores CPUs identification. Unfortunatly, this binary is not
+reliable enough to be used on Windows 2003, leading to less precise
+inventories.
+
+On any system, the privilege level used to run the agent will change inventory
+results. Generally speaking, this means less results when run with lesser
+privileges. On Windows, tough, running agent with SYSTEM privileges, which is
+implicit if running as a service, does sometimes gives less results, especially
+for shared printers only visible from a user account.
+
 SSL support
 -----------
 LWP (also known as libwww-perl) is able to use either Crypt::SSLeay or


================================================================
  Commit: 132c67ad0344a35c057d3704b8f68da8e6bccee9
      https://github.com/fusinv/fusioninventory-agent/commit/132c67ad0344a35c057d3704b8f68da8e6bccee9
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-12 (Mon, 12 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Storage.pm

  Log Message:
  -----------
  more robust handling of serialized files (#1513)

- don't crash if an exception is thrown when reading it
- remove corrupted files


diff --git a/lib/FusionInventory/Agent/Storage.pm b/lib/FusionInventory/Agent/Storage.pm
index f5f4623..b38df9f 100644
--- a/lib/FusionInventory/Agent/Storage.pm
+++ b/lib/FusionInventory/Agent/Storage.pm
@@ -75,7 +75,17 @@ sub restore {
     my $file = $self->_getFilePath(%params);
 
     return unless -f $file;
-    return retrieve($file);
+
+    my $result;
+    eval {
+        $result = retrieve($file);
+    };
+    if ($EVAL_ERROR) {
+        $self->{logger}->error("Can't read corrupted $file, removing it");
+        unlink $file;
+    }
+
+    return $result;
 }
 
 sub remove {


================================================================
  Commit: 0144c49404e267d4949a5221288b3e0395ecd9a8
      https://github.com/fusinv/fusioninventory-agent/commit/0144c49404e267d4949a5221288b3e0395ecd9a8
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-03-13 (Tue, 13 Mar 2012)

  Changed paths:
    M README
    M lib/FusionInventory/Agent/Storage.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Processes.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
    M t/inventory/windows/networks.t
    M tools/createExtLinks.sh

  Log Message:
  -----------
  Merge remote-tracking branch 'origin/2.2.x' into 2.2.x


diff --git a/README b/README
index 893398d..27161a1 100644
--- a/README
+++ b/README
@@ -26,6 +26,57 @@ Additional optional programs:
 - dmidecode, for hardware inventory
 - lspci, for hardware inventory
 
+Usage
+-----
+They are two different ways to run the agent:
+- as a temporary process, exiting after completing its run
+- as a permanent process, staying in memory permanently (daemon under Unix,
+  service under Windows)
+
+In the first case, the agent execution scheduling is controlled from local
+system, and the memory footprint between agent executions is zero.
+
+In second case, the agent execution scheduling is controlled from GLPI server,
+as the agent runs regulary according to a parameter initially set in its
+configuration (delaytime), overrided by the server at the first connection
+(PROLOG_FREQ). Additionaly, the server may also initiate additional
+out-of-schedule executions by sending HTTP requests if the web interface is
+used. However, it also mean you have a full perl interpreter loaded in memory
+constantly, and a network port open on your system with a process running with
+full system privileges attached to it.
+
+If you don't need to control agent execution from the server, and if you're
+able to periodically launch the agent without resorting to its internal
+scheduler, through cron on Unix systems, or scheduled tasks on Windows, you'd
+better use first execution mode. The various installation procedure may offer
+limited choice about initial configuration, but you should always be able to
+change it thereafter.
+
+When executing, the agent tries to runs every available task for every
+configured target. A task is a specific kind of work to perform (local
+inventory, network discovery, wake on lan, etc...), while a target is both a
+recipient for the result and a controller for this work (an OCS server, a GLPI
+server, a local directory, etc...). Only the local inventory task is compatible
+with all kind of targets, tough, all others require a GLPI server target, and
+will get discarded for other kind of target.
+
+System-specific informations
+----------------------------
+On Solaris/SPARC, you must install sneep and record the Serial Number with it.
+Download it from http://www.sun.com/download/products.xml?id=4304155a.
+
+On Windows, we use an additional dmidecode binary shipped in the windows
+distribution to retrieve many informations not available otherwise, including
+fine-grained multi-cores CPUs identification. Unfortunatly, this binary is not
+reliable enough to be used on Windows 2003, leading to less precise
+inventories.
+
+On any system, the privilege level used to run the agent will change inventory
+results. Generally speaking, this means less results when run with lesser
+privileges. On Windows, tough, running agent with SYSTEM privileges, which is
+implicit if running as a service, does sometimes gives less results, especially
+for shared printers only visible from a user account.
+
 SSL support
 -----------
 LWP (also known as libwww-perl) is able to use either Crypt::SSLeay or
@@ -56,41 +107,3 @@ The available workaround:
   openssl and its perl bindings (Net::SSLeay)
 - disable server certificate checking on client
 
-System-specific informations
-----------------------------
-On Solaris/SPARC, you must install sneep and record the Serial Number with it.
-Download it from http://www.sun.com/download/products.xml?id=4304155a.
-
-The Windows installer will run the agent with the SYSTEM account. If you use
-an user GPO to configure the printer, the information will hidden and so not
-collected.
-To avoid this situation, you can turn off the server, and run the agent with
-user privilege, for example during the login.
-
-On Windows, if you don't want to use the installer for Windows you can follow
-the installation process avalailable from
-http://forge.fusioninventory.org/projects/fusioninventory-agent/wiki/RunAgentWin32.
-
-Usage
------
-They are two different ways to run the agent:
-- as a temporary process, exiting after completing its run
-- as a permanent process, staying in memory permanently (daemon under Unix,
-  service under Windows)
-
-In the first case, the agent execution scheduling is controlled from local
-system, through cron under Unix, or scheduled tasks under Windows. In second
-case, the agent execution scheduling is controlled from GLPI server, as the
-agent runs regulary according to a parameter initially set in its
-configuration (delaytime), overrided by the server at the first connection
-(PROLOG_FREQ). Additionaly, the server may also initiate additional
-out-of-schedule executions by sending HTTP requests if the web interface is
-used.
-
-When executing, the agent tries to runs every available task for every
-configured target. A task is a specific kind of work to perform (local
-inventory, network discovery, wake on lan, etc...), while a target is both a
-recipient for the result and a controller for this work (an OCS server, a GLPI
-server, a local directory, etc...). Only the local inventory task is compatible
-with all kind of targets, tough, all others require a GLPI server target, and
-will get discarded for other kind of target.
diff --git a/lib/FusionInventory/Agent/Storage.pm b/lib/FusionInventory/Agent/Storage.pm
index f5f4623..b38df9f 100644
--- a/lib/FusionInventory/Agent/Storage.pm
+++ b/lib/FusionInventory/Agent/Storage.pm
@@ -75,7 +75,17 @@ sub restore {
     my $file = $self->_getFilePath(%params);
 
     return unless -f $file;
-    return retrieve($file);
+
+    my $result;
+    eval {
+        $result = retrieve($file);
+    };
+    if ($EVAL_ERROR) {
+        $self->{logger}->error("Can't read corrupted $file, removing it");
+        unlink $file;
+    }
+
+    return $result;
 }
 
 sub remove {
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Processes.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Processes.pm
index bc4288a..e22c36c 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Processes.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Processes.pm
@@ -9,7 +9,9 @@ use FusionInventory::Agent::Tools;
 use FusionInventory::Agent::Tools::Unix;
 
 sub isEnabled {
-    return canRun('ps');
+    return 
+        $OSNAME ne 'MSWin32' &&
+        canRun('ps');
 }
 
 sub doInventory {
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
index d360f78..70eb701 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
@@ -98,17 +98,17 @@ sub _getInterfaces {
 
     foreach my $object (getWmiObjects(
         class      => 'Win32_NetworkAdapter',
-        properties => [ qw/Index PNPDeviceId Speed MACAddress PhysicalAdapter 
+        properties => [ qw/Index PNPDeviceID Speed MACAddress PhysicalAdapter 
                            AdapterType/  ]
     )) {
         # http://comments.gmane.org/gmane.comp.monitoring.fusion-inventory.devel/34
-        next unless $object->{PNPDeviceId};
+        next unless $object->{PNPDeviceID};
 
         my $interface = $interfaces[$object->{Index}];
 
         $interface->{SPEED}       = $object->{Speed};
         $interface->{MACADDR}     = $object->{MACAddress};
-        $interface->{PNPDEVICEID} = $object->{PNPDeviceId};
+        $interface->{PNPDEVICEID} = $object->{PNPDeviceID};
 
         # PhysicalAdapter only work on OS > XP
         if (defined $object->{PhysicalAdapter}) {
@@ -119,7 +119,7 @@ sub _getInterfaces {
               && $interface->{DESCRIPTION} =~ /Adapter/i) {
             $interface->{VIRTUALDEV} = 1;
         } else {
-            $interface->{VIRTUALDEV} = $object->{PNPDeviceId} =~ /^ROOT/ ? 1 : 0;
+            $interface->{VIRTUALDEV} = $object->{PNPDeviceID} =~ /^ROOT/ ? 1 : 0;
         }
 
         if (defined $object->{AdapterType}) {
@@ -130,16 +130,7 @@ sub _getInterfaces {
 
     # exclude pure virtual interfaces
     return
-        grep {
-            ref($_) eq 'HASH' &&
-            (
-                (defined($_->{IPADDRESS}) && $_->{IPADDRESS})
-                    ||
-                (defined($_->{IPADDRESS6}) && $_->{IPADDRESS6})
-                    ||
-                (defined($_->{MACADDR}) && $_->{MACADDR})
-            ) 
-            }
+        grep { $_->{IPADDRESS} || $_->{IPADDRESS6} || $_->{MACADDR} }
         @interfaces;
 
 }
diff --git a/t/inventory/windows/networks.t b/t/inventory/windows/networks.t
index a5aabf5..8415248 100755
--- a/t/inventory/windows/networks.t
+++ b/t/inventory/windows/networks.t
@@ -21,36 +21,34 @@ use FusionInventory::Agent::Task::Inventory::Input::Win32::Networks;
 my %tests = (
     7 => [
         {
-            'dns' => '192.168.0.254',
-            'IPMASK6' => [
-                       '64'
-                     ],
-            'IPMASK' => [
-                      '255.255.255.0'
-                    ],
-            'IPGATEWAY' => '192.168.0.254',
+            'dns'       => '192.168.0.254',
+            IPMASK6     => [ '64' ],
+            IPMASK      => [ '255.255.255.0' ],
+            IPGATEWAY   => '192.168.0.254',
             MACADDR     => 'F4:6D:04:97:2D:3E',
             STATUS      => 'Up',
-            'IPADDRESS6' => [
-                          'fe80::311a:2127:dded:6618'
-                        ],
+            IPADDRESS6  => [ 'fe80::311a:2127:dded:6618' ],
             IPDHCP      => '192.168.0.254',
-            'IPSUBNET' => [
-                        '192.168.0.0'
-                      ],
+            IPSUBNET    => [ '192.168.0.0' ],
             MTU         => undef,
-            'IPSUBNET6' => [],
+            IPSUBNET6   => [],
             DESCRIPTION => 'Realtek PCIe GBE Family Controller',
-            'IPADDRESS' => [
-                         '192.168.0.1'
-                       ]
+            IPADDRESS   => [ '192.168.0.1' ],
+            VIRTUALDEV  => 0,
+            SPEED       => 100000000,
+            PNPDEVICEID => 'PCI\VEN_10EC&DEV_8168&SUBSYS_84321043&REV_06\4&87D54EE&0&00E5',
+            TYPE        => 'Ethernet'
         },
         {
             MTU         => undef,
             MACADDR     => '00:26:83:12:FB:0B',
             STATUS      => 'Up',
             DESCRIPTION => "Périphérique Bluetooth (réseau personnel)",
-            IPDHCP      => undef
+            IPDHCP      => undef,
+            VIRTUALDEV  => 0,
+            PNPDEVICEID => 'BTH\MS_BTHPAN\7&42D85A8&0&2',
+            TYPE        => 'Ethernet',
+            SPEED       => 0
         },
     ],
 );
diff --git a/tools/createExtLinks.sh b/tools/createExtLinks.sh
index 41d5242..f7625a3 100755
--- a/tools/createExtLinks.sh
+++ b/tools/createExtLinks.sh
@@ -6,16 +6,16 @@ for task in Deploy SNMPQuery NetDiscovery ESX; do
     taskLcName=`perl -e" print lc \"$task\""`
     taskFile=$PWD/../agent-task-$taskLcName/lib/FusionInventory/Agent/Task/$task.pm
     taskDir=$PWD/../agent-task-$taskLcName/lib/FusionInventory/Agent/Task/$task
-    if [ -f $taskFile ] && [ ! -e lib/FusionInventory/Agent/Task/$task.pm ]; then
+    if [ -f "$taskFile" ] && [ ! -e lib/FusionInventory/Agent/Task/$task.pm ]; then
         echo "create link for $task"
-        ln -s $PWD/../agent-task-$taskLcName/lib/FusionInventory/Agent/Task/$task.pm lib/FusionInventory/Agent/Task/
-        if [ -d $taskDir ] && [ ! -e lib/FusionInventory/Agent/Task/$task ]; then
-            ln -s $PWD/../agent-task-$taskLcName/lib/FusionInventory/Agent/Task/$task lib/FusionInventory/Agent/Task/
+        ln -s "$PWD/../agent-task-$taskLcName/lib/FusionInventory/Agent/Task/$task.pm" lib/FusionInventory/Agent/Task/
+        if [ -d "$taskDir" ] && [ ! -e lib/FusionInventory/Agent/Task/$task ]; then
+            ln -s "$PWD/../agent-task-$taskLcName/lib/FusionInventory/Agent/Task/$task" lib/FusionInventory/Agent/Task/$task
         fi
     fi
 done
 if [ ! -e lib/FusionInventory/VMware ]; then
-    ln -s $PWD/../agent-task-esx/lib/FusionInventory/VMware lib/FusionInventory/
+    ln -s "$PWD/../agent-task-esx/lib/FusionInventory/VMware" lib/FusionInventory/VMware
 fi
 if [ ! -e lib/FusionInventory/Agent/SNMP.pm ]; then
     ln -s $PWD/../agent-task-netdiscovery/lib/FusionInventory/Agent/SNMP.pm lib/FusionInventory/Agent/SNMP.pm


================================================================
  Commit: 94a987381a348e92c5a08a3ed854ffb87d61476f
      https://github.com/fusinv/fusioninventory-agent/commit/94a987381a348e92c5a08a3ed854ffb87d61476f
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-13 (Tue, 13 Mar 2012)

  Changed paths:
    M README

  Log Message:
  -----------
  add description


diff --git a/README b/README
index 27161a1..39eb856 100644
--- a/README
+++ b/README
@@ -1,6 +1,17 @@
 			FusionInventory Agent
 			---------------------
 
+Description
+-----------
+The fusioinventory agent is a generic agent, running on each managed node. It
+can perform a certain number of actions, called tasks, according to its own
+execution plan, or on behalf of a GLPI server with fusioninventory plugin,
+acting as a control point.
+
+Two of these tasks are included in agent source distribution, local inventory
+and wake on lan. Other tasks are distributed separatly, excepted for binary
+distributions where they are bundled together.
+
 Dependencies
 ------------
 


================================================================
  Commit: d94cdcd542e803fb6044130b0f2f530985e7f5f9
      https://github.com/fusinv/fusioninventory-agent/commit/d94cdcd542e803fb6044130b0f2f530985e7f5f9
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-13 (Tue, 13 Mar 2012)

  Changed paths:
    R AUTHORS
    M README

  Log Message:
  -----------
  include authors directly in README file


diff --git a/AUTHORS b/AUTHORS
deleted file mode 100644
index 200d1d5..0000000
--- a/AUTHORS
+++ /dev/null
@@ -1,9 +0,0 @@
-maintainer:
-  Gonéri LE BOUDER <goneri at rulezlan.org>
-
-Copyright 2006-2010 OCS Inventory contributors
-Copyright 2010-2012 FusionInventory Team
-
-Website: http://www.fusioninventory.org
-
-Please read THANKS to get the list of the contributors
diff --git a/README b/README
index 39eb856..c802387 100644
--- a/README
+++ b/README
@@ -118,3 +118,15 @@ The available workaround:
   openssl and its perl bindings (Net::SSLeay)
 - disable server certificate checking on client
 
+Authors 
+-------
+* Gonéri Le Bouder <goneri at rulezlan.org>>
+* Guillaume Rousse <guillomovitch at gmail.com>
+
+Copyright 2006-2010 OCS Inventory contributors
+Copyright 2010-2012 FusionInventory Team
+
+License
+-------
+This software is licensed under the terms of GPLv2+, see LICENSE file for
+details.


================================================================
  Commit: 6bbb8569b8a81eb786d1f08fd4e892bd8c5af346
      https://github.com/fusinv/fusioninventory-agent/commit/6bbb8569b8a81eb786d1f08fd4e892bd8c5af346
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-14 (Wed, 14 Mar 2012)

  Changed paths:
    A resources/win32/wmi/xp-Win32_NetworkAdapter.wmi
    A resources/win32/wmi/xp-Win32_NetworkAdapterConfiguration.wmi
    M t/inventory/windows/networks.t

  Log Message:
  -----------
  add xp sample


diff --git a/resources/win32/wmi/xp-Win32_NetworkAdapter.wmi b/resources/win32/wmi/xp-Win32_NetworkAdapter.wmi
new file mode 100644
index 0000000..5452fbe
Binary files /dev/null and b/resources/win32/wmi/xp-Win32_NetworkAdapter.wmi differ
diff --git a/resources/win32/wmi/xp-Win32_NetworkAdapterConfiguration.wmi b/resources/win32/wmi/xp-Win32_NetworkAdapterConfiguration.wmi
new file mode 100644
index 0000000..354fb68
Binary files /dev/null and b/resources/win32/wmi/xp-Win32_NetworkAdapterConfiguration.wmi differ
diff --git a/t/inventory/windows/networks.t b/t/inventory/windows/networks.t
index 8415248..7294850 100755
--- a/t/inventory/windows/networks.t
+++ b/t/inventory/windows/networks.t
@@ -51,6 +51,102 @@ my %tests = (
             SPEED       => 0
         },
     ],
+    xp => [
+        {
+            VIRTUALDEV  => 1,
+            PNPDEVICEID => 'ROOT\\MS_PPTPMINIPORT\\0000',
+            MACADDR     => '50:50:54:50:30:30',
+            STATUS      => 'Up',
+            TYPE        => "Red de \x{e1}rea extensa (WAN)",
+            SPEED       => undef,
+            IPDHCP      => undef,
+            MTU         => undef,
+            DESCRIPTION => 'Minipuerto WAN (PPTP)'
+        },
+        {
+            VIRTUALDEV  => 1,
+            PNPDEVICEID => 'ROOT\\MS_PPPOEMINIPORT\\0000',
+            MACADDR     => '33:50:6F:45:30:30',
+            STATUS      => 'Up',
+            TYPE        => "Red de \x{e1}rea extensa (WAN)",
+            SPEED       => undef,
+            IPDHCP      => undef,
+            MTU         => undef,
+            DESCRIPTION => 'Minipuerto WAN (PPPOE)'
+        },
+        {
+            VIRTUALDEV  => 1,
+            PNPDEVICEID => 'ROOT\\MS_PSCHEDMP\\0000',
+            MACADDR     => '26:0F:20:52:41:53',
+            STATUS      => 'Up',
+            TYPE        => 'Ethernet',
+            SPEED       => undef,
+            IPDHCP      => undef,
+            MTU         => undef,
+            DESCRIPTION => 'Minipuerto del administrador de paquetes'
+        },
+        {
+            dns         => '10.36.6.200',
+            IPMASK      => [ '255.255.254.0' ],
+            IPGATEWAY   => '10.36.6.1',
+            MACADDR     => '00:14:C2:0D:B0:FB',
+            STATUS      => 'Up',
+            IPDHCP      => '10.36.6.200',
+            IPSUBNET    => [ '10.36.6.0' ],
+            MTU         => undef,
+            DESCRIPTION => 'Broadcom NetXtreme Gigabit Ethernet - Teefer2 Miniport',
+            'IPADDRESS' => [ '10.36.6.30' ]
+        },
+        {
+            dns         => '10.36.6.100',
+            IPMASK      => [ '255.255.254.0' ],
+            IPGATEWAY   => '10.36.6.1',
+            VIRTUALDEV  => 0,
+            PNPDEVICEID => 'PCI\\VEN_14E4&DEV_1677&SUBSYS_3006103C&REV_01\\4&1886B119&0&00E1',
+            MACADDR     => '00:14:C2:0D:B0:FB',
+            STATUS      => 'Up',
+            TYPE        => 'Ethernet',
+            SPEED       => undef,
+            IPDHCP      => '10.36.6.100',
+            IPSUBNET    => [ '10.36.6.0' ],
+            MTU         => undef,
+            DESCRIPTION => 'Broadcom NetXtreme Gigabit Ethernet - Teefer2 Miniport',
+            'IPADDRESS' => [ '10.36.6.30' ]
+        },
+        {
+            VIRTUALDEV  => 1,
+            PNPDEVICEID => 'ROOT\\MS_PSCHEDMP\\0002',
+            MACADDR     => '00:14:C2:0D:B0:FB',
+            STATUS      => 'Up',
+            TYPE        => 'Ethernet',
+            SPEED       => undef,
+            IPDHCP      => undef,
+            MTU         => undef,
+            DESCRIPTION => 'Minipuerto del administrador de paquetes'
+        },
+        {
+            VIRTUALDEV  => 1,
+            PNPDEVICEID => 'ROOT\\SYMC_TEEFER2MP\\0000',
+            MACADDR     => '00:14:C2:0D:B0:FB',
+            STATUS      => 'Up',
+            TYPE        => 'Ethernet',
+            SPEED       => undef,
+            IPDHCP      => undef,
+            MTU         => undef,
+            DESCRIPTION => 'Teefer2 Miniport'
+        },
+        {
+            VIRTUALDEV  => 1,
+            PNPDEVICEID => 'ROOT\\SYMC_TEEFER2MP\\0002',
+            MACADDR     => '26:0F:20:52:41:53',
+            STATUS      => 'Up',
+            TYPE        => 'Ethernet',
+            SPEED       => undef,
+            IPDHCP      => undef,
+            MTU         => undef,
+            DESCRIPTION => 'Teefer2 Miniport'
+        }
+    ]
 );
 
 plan tests => scalar keys %tests;


================================================================
  Commit: 75cf44f420850cdc49f7a58df48a005803a9ff2f
      https://github.com/fusinv/fusioninventory-agent/commit/75cf44f420850cdc49f7a58df48a005803a9ff2f
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-14 (Wed, 14 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm

  Log Message:
  -----------
  exclude empty slots

windows interfaces indexes don't mandatorily start from 0, and may leave
empty slots also


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
index 70eb701..580e391 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
@@ -128,9 +128,9 @@ sub _getInterfaces {
         }
     }
 
-    # exclude pure virtual interfaces
     return
         grep { $_->{IPADDRESS} || $_->{IPADDRESS6} || $_->{MACADDR} }
+        grep { $_ } # exclude slots left empty by indexed access
         @interfaces;
 
 }


================================================================
  Commit: f9c2c5cbc7ac92b39a078f6f40e86356708cca23
      https://github.com/fusinv/fusioninventory-agent/commit/f9c2c5cbc7ac92b39a078f6f40e86356708cca23
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-14 (Wed, 14 Mar 2012)

  Changed paths:
    A t/06spelling.t

  Log Message:
  -----------
  initial import


diff --git a/t/06spelling.t b/t/06spelling.t
new file mode 100755
index 0000000..38d8723
--- /dev/null
+++ b/t/06spelling.t
@@ -0,0 +1,22 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+use Test::More;
+use English qw(-no_match_vars);
+
+if (!$ENV{TEST_AUTHOR}) {
+    my $msg = 'Author test. Set $ENV{TEST_AUTHOR} to a true value to run.';
+    plan(skip_all => $msg);
+}
+
+eval { require Test::Pod::Spelling::CommonMistakes; };
+
+if ($EVAL_ERROR) {
+    plan(
+        skip_all =>
+        'Test::Pod::Spelling::CommonMistakes required to check speeling'
+    );
+}
+
+Test::Pod::Spelling::CommonMistakes::all_pod_files_ok();


================================================================
  Commit: 5af33e69e9b9a6ce20fcea02c50cbeddc9defcf2
      https://github.com/fusinv/fusioninventory-agent/commit/5af33e69e9b9a6ce20fcea02c50cbeddc9defcf2
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-14 (Wed, 14 Mar 2012)

  Changed paths:
    M fusioninventory-agent
    M lib/FusionInventory/Agent/HTTP/Server.pm
    M lib/FusionInventory/Agent/Task/Inventory.pm

  Log Message:
  -----------
  fix some spelling issues


diff --git a/fusioninventory-agent b/fusioninventory-agent
index f844aa1..a1ec3bb 100755
--- a/fusioninventory-agent
+++ b/fusioninventory-agent
@@ -269,9 +269,9 @@ The agent will launch each modules and pass the list of options found in the
 PROLOG RESP as parameter. The module can send information directly to the
 server (inventory, SNMP scan result, etc)
 
-=head2 Windows service or Deamon mode
+=head2 Server mode (Windows service or Unix daemon)
 
-In deamon mode, the agent wait during a period between the last PROLOG and
+In server mode, the agent wait during a period between the last PROLOG and
 PROLOG_FREQ. If PROLOG_FREQ is not set, it will use --delaytime value.
 The default value is 3600.
 
diff --git a/lib/FusionInventory/Agent/HTTP/Server.pm b/lib/FusionInventory/Agent/HTTP/Server.pm
index 001033e..4ef83c9 100644
--- a/lib/FusionInventory/Agent/HTTP/Server.pm
+++ b/lib/FusionInventory/Agent/HTTP/Server.pm
@@ -362,7 +362,7 @@ the directory where HTML templates and static files are stored
 
 =item I<ip>
 
-the network adress to listen to (default: all)
+the network address to listen to (default: all)
 
 =item I<port>
 
@@ -370,7 +370,7 @@ the network port to listen to
 
 =item I<trust>
 
-an IP adress or an IP adress range from which to trust incoming requests
+an IP address or an IP address range from which to trust incoming requests
 without authentication token (default: none)
 
 =back
diff --git a/lib/FusionInventory/Agent/Task/Inventory.pm b/lib/FusionInventory/Agent/Task/Inventory.pm
index 9c9aac7..98984f0 100644
--- a/lib/FusionInventory/Agent/Task/Inventory.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory.pm
@@ -364,4 +364,4 @@ FusionInventory::Agent::Task::Inventory - Inventory task for FusionInventory
 
 =head1 DESCRIPTION
 
-This task extract various hardware and software informations on the agent host.
+This task extract various hardware and software information on the agent host.


================================================================
  Commit: 85709eafee2be6048b12fe8fc5d705f26360c30b
      https://github.com/fusinv/fusioninventory-agent/commit/85709eafee2be6048b12fe8fc5d705f26360c30b
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-14 (Wed, 14 Mar 2012)

  Changed paths:
    M t/05var.t

  Log Message:
  -----------
  not needed anymore


diff --git a/t/05var.t b/t/05var.t
index 2f1896b..9fb4a19 100644
--- a/t/05var.t
+++ b/t/05var.t
@@ -24,6 +24,6 @@ if ($EVAL_ERROR) {
 }
 
 Test::Vars::all_vars_ok(
-    ignore_vars => { '$i' => 1, '%params' => 1, '$class' => 1 }
+    ignore_vars => { '%params' => 1, '$class' => 1 }
 );
 


================================================================
  Commit: 4b791ab708b947c425a1e0253544dc2cf18e670d
      https://github.com/fusinv/fusioninventory-agent/commit/4b791ab708b947c425a1e0253544dc2cf18e670d
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-15 (Thu, 15 Mar 2012)

  Changed paths:
    M t/02critic.t
    M t/03pod.t
    M t/04pod-coverage.t
    M t/05var.t
    M t/06spelling.t

  Log Message:
  -----------
  various small syntax harmonisation


diff --git a/t/02critic.t b/t/02critic.t
index 3f753f5..bd3a677 100755
--- a/t/02critic.t
+++ b/t/02critic.t
@@ -2,22 +2,18 @@
 
 use strict;
 use warnings;
+
 use Test::More;
 use English qw(-no_match_vars);
 
-if (!$ENV{TEST_AUTHOR}) {
-    my $msg = 'Author test. Set $ENV{TEST_AUTHOR} to a true value to run.';
-    plan(skip_all => $msg);
-}
+plan(skip_all => 'Author test, set $ENV{TEST_AUTHOR} to a true value to run')
+    if !$ENV{TEST_AUTHOR};
 
 eval { require Test::Perl::Critic; };
-
-if ($EVAL_ERROR) {
-    my $msg = 'Test::Perl::Critic required to criticise code';
-    plan(skip_all => $msg);
-}
+plan(skip_all => 'Test::Perl::Critic required') if $EVAL_ERROR;
 
 my $config = File::Spec->catfile('t', 'perlcriticrc');
 Test::Perl::Critic->import(-profile => $config);
+
 all_critic_ok();
 
diff --git a/t/03pod.t b/t/03pod.t
index 98871db..af82d01 100755
--- a/t/03pod.t
+++ b/t/03pod.t
@@ -2,20 +2,16 @@
 
 use strict;
 use warnings;
+
 use Test::More;
 use English qw(-no_match_vars);
 
-if (!$ENV{TEST_AUTHOR}) {
-    my $msg = 'Author test. Set $ENV{TEST_AUTHOR} to a true value to run.';
-    plan(skip_all => $msg);
-}
+plan(skip_all => 'Author test, set $ENV{TEST_AUTHOR} to a true value to run')
+    if !$ENV{TEST_AUTHOR};
 
 eval { require Test::Pod; };
-
-if ($EVAL_ERROR) {
-    my $msg = 'Test::Pod required to check pod';
-    plan(skip_all => $msg);
-}
+plan(skip_all => 'Test::Pod required') if $EVAL_ERROR;
 
 Test::Pod->import();
+
 all_pod_files_ok();
diff --git a/t/04pod-coverage.t b/t/04pod-coverage.t
index bc59126..d1c35c1 100755
--- a/t/04pod-coverage.t
+++ b/t/04pod-coverage.t
@@ -1,29 +1,19 @@
 #!/usr/bin/perl
-# $Id: pod-coverage.t 1580 2007-03-22 13:38:55Z guillomovitch $
 
 use strict;
 use warnings;
+use lib 't';
 
 use Test::More;
 use English qw(-no_match_vars);
 
-use lib 't';
-
-if (!$ENV{TEST_AUTHOR}) {
-    my $msg = 'Author test. Set $ENV{TEST_AUTHOR} to a true value to run.';
-    plan(skip_all => $msg);
-}
+plan(skip_all => 'Author test, set $ENV{TEST_AUTHOR} to a true value to run')
+    if !$ENV{TEST_AUTHOR};
 
 eval { require Test::Pod::Coverage; };
-
-if ($EVAL_ERROR) {
-    my $msg = 'Test::Pod::Coverage required to check pod coverage';
-    plan(skip_all => $msg);
-}
+plan(skip_all => 'Test::Pod::Coverage required') if $EVAL_ERROR;
 
 Test::Pod::Coverage->import();
-
-# use mock modules for non-available ones
 if ($OSNAME eq 'MSWin32') {
     push @INC, 't/fake/unix';
 } else {
@@ -31,9 +21,7 @@ if ($OSNAME eq 'MSWin32') {
 }
 
 my @modules = grep { filter($_) } all_modules('lib');
-
 plan tests => scalar @modules;
-
 foreach my $module (@modules) {
     pod_coverage_ok(
         $module,
diff --git a/t/05var.t b/t/05var.t
index 9fb4a19..3ede00e 100644
--- a/t/05var.t
+++ b/t/05var.t
@@ -2,28 +2,23 @@
 
 use strict;
 use warnings;
+
 use Test::More;
 use English qw(-no_match_vars);
 
-if (!$ENV{TEST_AUTHOR}) {
-    my $msg = 'Author test. Set $ENV{TEST_AUTHOR} to a true value to run.';
-    plan(skip_all => $msg);
-}
+plan(skip_all => 'Author test, set $ENV{TEST_AUTHOR} to a true value to run')
+    if !$ENV{TEST_AUTHOR};
 
-# use mock modules for non-available ones
+eval { require Test::Vars; };
+plan(skip_all => 'Test::Vars required') if $EVAL_ERROR;
+
+Test::Vars->import();
 if ($OSNAME eq 'MSWin32') {
     push @INC, 't/fake/unix';
 } else {
     push @INC, 't/fake/windows';
 }
 
-eval { require Test::Vars; };
-
-if ($EVAL_ERROR) {
-    plan(skip_all => 'Test::Vars required to validate the code');
-}
-
-Test::Vars::all_vars_ok(
+all_vars_ok(
     ignore_vars => { '%params' => 1, '$class' => 1 }
 );
-
diff --git a/t/06spelling.t b/t/06spelling.t
index 38d8723..b035de9 100755
--- a/t/06spelling.t
+++ b/t/06spelling.t
@@ -2,21 +2,16 @@
 
 use strict;
 use warnings;
+
 use Test::More;
 use English qw(-no_match_vars);
 
-if (!$ENV{TEST_AUTHOR}) {
-    my $msg = 'Author test. Set $ENV{TEST_AUTHOR} to a true value to run.';
-    plan(skip_all => $msg);
-}
+plan(skip_all => 'Author test, set $ENV{TEST_AUTHOR} to a true value to run')
+    if !$ENV{TEST_AUTHOR};
 
 eval { require Test::Pod::Spelling::CommonMistakes; };
+plan(skip_all => 'Test::Pod::Spelling::CommonMistakes required') if $EVAL_ERROR;
 
-if ($EVAL_ERROR) {
-    plan(
-        skip_all =>
-        'Test::Pod::Spelling::CommonMistakes required to check speeling'
-    );
-}
+Test::Pod::Spelling::CommonMistakes->import();
 
-Test::Pod::Spelling::CommonMistakes::all_pod_files_ok();
+all_pod_files_ok();


================================================================
  Commit: b3e57a284ac4e16c9d679fc444ea70f05e3dbe90
      https://github.com/fusinv/fusioninventory-agent/commit/b3e57a284ac4e16c9d679fc444ea70f05e3dbe90
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-15 (Thu, 15 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm

  Log Message:
  -----------
  don't set mac address twice


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
index 580e391..8670f6d 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
@@ -107,7 +107,6 @@ sub _getInterfaces {
         my $interface = $interfaces[$object->{Index}];
 
         $interface->{SPEED}       = $object->{Speed};
-        $interface->{MACADDR}     = $object->{MACAddress};
         $interface->{PNPDEVICEID} = $object->{PNPDeviceID};
 
         # PhysicalAdapter only work on OS > XP


================================================================
  Commit: ffcdce484ca969e74e9d0322862efbe0703a85f1
      https://github.com/fusinv/fusioninventory-agent/commit/ffcdce484ca969e74e9d0322862efbe0703a85f1
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-15 (Thu, 15 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
    M t/inventory/windows/networks.t

  Log Message:
  -----------
  don't use configuration as interface (close #1517)

Network configuration WMI objects seems to live forever in Windows
state, and they should only be used as additional information source,
not to create interface entries.


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
index 8670f6d..58314a7 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
@@ -51,16 +51,16 @@ sub doInventory {
 
 sub _getInterfaces {
 
-    my @interfaces;
+    my @configurations;
 
     foreach my $object (getWmiObjects(
         class      => 'Win32_NetworkAdapterConfiguration',
-        properties => [ qw/Index Description IPEnabled DHCPServer MACAddress 
+        properties => [ qw/Index Description IPEnabled DHCPServer MACAddress
                            MTU DefaultIPGateway DNSServerSearchOrder IPAddress
                            IPSubnet/  ]
     )) {
 
-        my $interface = {
+        my $configuration = {
             DESCRIPTION => $object->{Description},
             STATUS      => $object->{IPEnabled} ? "Up" : "Down",
             IPDHCP      => $object->{DHCPServer},
@@ -69,45 +69,66 @@ sub _getInterfaces {
         };
 
         if ($object->{DefaultIPGateway}) {
-            $interface->{IPGATEWAY} = $object->{DefaultIPGateway}->[0];
+            $configuration->{IPGATEWAY} = $object->{DefaultIPGateway}->[0];
         }
 
         if ($object->{DNSServerSearchOrder}) {
-            $interface->{dns} = $object->{DNSServerSearchOrder}->[0];
+            $configuration->{dns} = $object->{DNSServerSearchOrder}->[0];
         }
 
         if ($object->{IPAddress}) {
             foreach my $address (@{$object->{IPAddress}}) {
                 my $mask = shift @{$object->{IPSubnet}};
                 if ($address =~ /$ip_address_pattern/) {
-                    push @{$interface->{IPADDRESS}}, $address;
-                    push @{$interface->{IPMASK}}, $mask;
-                    push @{$interface->{IPSUBNET}},
+                    push @{$configuration->{IPADDRESS}}, $address;
+                    push @{$configuration->{IPMASK}}, $mask;
+                    push @{$configuration->{IPSUBNET}},
                         getSubnetAddress($address, $mask);
                 } elsif ($address =~ /\S+/) {
-                    push @{$interface->{IPADDRESS6}}, $address;
-                    push @{$interface->{IPMASK6}}, $mask;
-                    push @{$interface->{IPSUBNET6}},
+                    push @{$configuration->{IPADDRESS6}}, $address;
+                    push @{$configuration->{IPMASK6}}, $mask;
+                    push @{$configuration->{IPSUBNET6}},
                         getSubnetAddressIPv6($address, $mask);
                 }
             }
         }
 
-        $interfaces[$object->{Index}] = $interface;
+        $configurations[$object->{Index}] = $configuration;
     }
 
+    my @interfaces;
+
     foreach my $object (getWmiObjects(
         class      => 'Win32_NetworkAdapter',
-        properties => [ qw/Index PNPDeviceID Speed MACAddress PhysicalAdapter 
-                           AdapterType/  ]
+        properties => [ qw/Index PNPDeviceID Speed PhysicalAdapter AdapterType/  ]
     )) {
         # http://comments.gmane.org/gmane.comp.monitoring.fusion-inventory.devel/34
         next unless $object->{PNPDeviceID};
 
-        my $interface = $interfaces[$object->{Index}];
+        my $configuration = $configurations[$object->{Index}];
 
-        $interface->{SPEED}       = $object->{Speed};
-        $interface->{PNPDEVICEID} = $object->{PNPDeviceID};
+        next unless 
+            $configuration->{IPADDRESS} ||
+            $configuration->{IPADDRESS6} ||
+            $configuration->{MACADDR};
+
+        my $interface = {
+            SPEED       => $object->{Speed},
+            PNPDEVICEID => $object->{PNPDeviceID},
+            MACADDR     => $configuration->{MACADDR},
+            DESCRIPTION => $configuration->{DESCRIPTION},
+            STATUS      => $configuration->{STATUS},
+            IPDHCP      => $configuration->{IPDHCP},
+            MTU         => $configuration->{MTU},
+            IPGATEWAY   => $configuration->{IPGATEWAY},
+            IPADDRESS   => $configuration->{IPADDRESS},
+            IPMASK      => $configuration->{IPMASK},
+            IPSUBNET    => $configuration->{IPSUBNET},
+            IPADDRESS6  => $configuration->{IPADDRESS6},
+            IPMASK6     => $configuration->{IPMASK6},
+            IPSUBNET6   => $configuration->{IPSUBNET6},
+            dns         => $configuration->{dns},
+        };
 
         # PhysicalAdapter only work on OS > XP
         if (defined $object->{PhysicalAdapter}) {
@@ -125,11 +146,11 @@ sub _getInterfaces {
             $interface->{TYPE} = $object->{AdapterType};
             $interface->{TYPE} =~ s/Ethernet.*/Ethernet/;
         }
+
+        push @interfaces, $interface;
     }
 
     return
-        grep { $_->{IPADDRESS} || $_->{IPADDRESS6} || $_->{MACADDR} }
-        grep { $_ } # exclude slots left empty by indexed access
         @interfaces;
 
 }
diff --git a/t/inventory/windows/networks.t b/t/inventory/windows/networks.t
index 7294850..b854a24 100755
--- a/t/inventory/windows/networks.t
+++ b/t/inventory/windows/networks.t
@@ -21,7 +21,7 @@ use FusionInventory::Agent::Task::Inventory::Input::Win32::Networks;
 my %tests = (
     7 => [
         {
-            'dns'       => '192.168.0.254',
+            dns         => '192.168.0.254',
             IPMASK6     => [ '64' ],
             IPMASK      => [ '255.255.255.0' ],
             IPGATEWAY   => '192.168.0.254',
@@ -40,6 +40,14 @@ my %tests = (
             TYPE        => 'Ethernet'
         },
         {
+            dns         => undef,
+            IPGATEWAY   => undef,
+            IPADDRESS6  => undef,
+            IPMASK6     => undef,
+            IPSUBNET6   => undef,
+            IPADDRESS   => undef,
+            IPMASK      => undef,
+            IPSUBNET    => undef,
             MTU         => undef,
             MACADDR     => '00:26:83:12:FB:0B',
             STATUS      => 'Up',
@@ -53,6 +61,14 @@ my %tests = (
     ],
     xp => [
         {
+            dns         => undef,
+            IPADDRESS6  => undef,
+            IPMASK6     => undef,
+            IPSUBNET6   => undef,
+            IPADDRESS   => undef,
+            IPMASK      => undef,
+            IPSUBNET    => undef,
+            IPGATEWAY   => undef,
             VIRTUALDEV  => 1,
             PNPDEVICEID => 'ROOT\\MS_PPTPMINIPORT\\0000',
             MACADDR     => '50:50:54:50:30:30',
@@ -64,6 +80,14 @@ my %tests = (
             DESCRIPTION => 'Minipuerto WAN (PPTP)'
         },
         {
+            dns         => undef,
+            IPADDRESS6  => undef,
+            IPMASK6     => undef,
+            IPSUBNET6   => undef,
+            IPADDRESS   => undef,
+            IPMASK      => undef,
+            IPSUBNET    => undef,
+            IPGATEWAY   => undef,
             VIRTUALDEV  => 1,
             PNPDEVICEID => 'ROOT\\MS_PPPOEMINIPORT\\0000',
             MACADDR     => '33:50:6F:45:30:30',
@@ -75,6 +99,14 @@ my %tests = (
             DESCRIPTION => 'Minipuerto WAN (PPPOE)'
         },
         {
+            dns         => undef,
+            IPADDRESS6  => undef,
+            IPMASK6     => undef,
+            IPSUBNET6   => undef,
+            IPADDRESS   => undef,
+            IPMASK      => undef,
+            IPSUBNET    => undef,
+            IPGATEWAY   => undef,
             VIRTUALDEV  => 1,
             PNPDEVICEID => 'ROOT\\MS_PSCHEDMP\\0000',
             MACADDR     => '26:0F:20:52:41:53',
@@ -86,18 +118,6 @@ my %tests = (
             DESCRIPTION => 'Minipuerto del administrador de paquetes'
         },
         {
-            dns         => '10.36.6.200',
-            IPMASK      => [ '255.255.254.0' ],
-            IPGATEWAY   => '10.36.6.1',
-            MACADDR     => '00:14:C2:0D:B0:FB',
-            STATUS      => 'Up',
-            IPDHCP      => '10.36.6.200',
-            IPSUBNET    => [ '10.36.6.0' ],
-            MTU         => undef,
-            DESCRIPTION => 'Broadcom NetXtreme Gigabit Ethernet - Teefer2 Miniport',
-            'IPADDRESS' => [ '10.36.6.30' ]
-        },
-        {
             dns         => '10.36.6.100',
             IPMASK      => [ '255.255.254.0' ],
             IPGATEWAY   => '10.36.6.1',
@@ -111,9 +131,20 @@ my %tests = (
             IPSUBNET    => [ '10.36.6.0' ],
             MTU         => undef,
             DESCRIPTION => 'Broadcom NetXtreme Gigabit Ethernet - Teefer2 Miniport',
-            'IPADDRESS' => [ '10.36.6.30' ]
+            IPADDRESS => [ '10.36.6.30' ],
+            IPADDRESS6  => undef,
+            IPMASK6     => undef,
+            IPSUBNET6   => undef,
         },
         {
+            dns         => undef,
+            IPADDRESS6  => undef,
+            IPMASK6     => undef,
+            IPSUBNET6   => undef,
+            IPADDRESS   => undef,
+            IPMASK      => undef,
+            IPSUBNET    => undef,
+            IPGATEWAY   => undef,
             VIRTUALDEV  => 1,
             PNPDEVICEID => 'ROOT\\MS_PSCHEDMP\\0002',
             MACADDR     => '00:14:C2:0D:B0:FB',
@@ -125,6 +156,14 @@ my %tests = (
             DESCRIPTION => 'Minipuerto del administrador de paquetes'
         },
         {
+            dns         => undef,
+            IPADDRESS6  => undef,
+            IPMASK6     => undef,
+            IPSUBNET6   => undef,
+            IPADDRESS   => undef,
+            IPMASK      => undef,
+            IPSUBNET    => undef,
+            IPGATEWAY   => undef,
             VIRTUALDEV  => 1,
             PNPDEVICEID => 'ROOT\\SYMC_TEEFER2MP\\0000',
             MACADDR     => '00:14:C2:0D:B0:FB',
@@ -136,6 +175,14 @@ my %tests = (
             DESCRIPTION => 'Teefer2 Miniport'
         },
         {
+            dns         => undef,
+            IPADDRESS6  => undef,
+            IPMASK6     => undef,
+            IPSUBNET6   => undef,
+            IPADDRESS   => undef,
+            IPMASK      => undef,
+            IPSUBNET    => undef,
+            IPGATEWAY   => undef,
             VIRTUALDEV  => 1,
             PNPDEVICEID => 'ROOT\\SYMC_TEEFER2MP\\0002',
             MACADDR     => '26:0F:20:52:41:53',


================================================================
  Commit: 910a6076fefeb88f30af4640493dab24fc648015
      https://github.com/fusinv/fusioninventory-agent/commit/910a6076fefeb88f30af4640493dab24fc648015
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-15 (Thu, 15 Mar 2012)

  Changed paths:
    R resources/macos/ioreg/IOUSBDevice
    A resources/macos/ioreg/IOUSBDevice1
    A resources/macos/ioreg/IOUSBDevice2
    M t/tools/macos.t

  Log Message:
  -----------
  new ioreg USB devices sample


diff --git a/resources/macos/ioreg/IOUSBDevice b/resources/macos/ioreg/IOUSBDevice
deleted file mode 100644
index 3d58b39..0000000
--- a/resources/macos/ioreg/IOUSBDevice
+++ /dev/null
@@ -1,748 +0,0 @@
-+-o Root  <class IORegistryEntry, id 0x100000100, retain 13>
-  +-o MacBook2,1  <class IOPlatformExpertDevice, id 0x100000110, registered, matched, active, busy 0 (16937 ms), retain 25>
-    +-o AppleACPIPlatformExpert  <class AppleACPIPlatformExpert, id 0x100000111, registered, matched, active, busy 0 (15867 ms), retain 38>
-    | +-o IOPMrootDomain  <class IOPMrootDomain, id 0x100000114, registered, matched, active, busy 0 (12 ms), retain 48>
-    | | +-o IORootParent  <class IORootParent, id 0x100000115, !registered, !matched, active, busy 0, retain 7>
-    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000267, !registered, !matched, active, busy 0, retain 5>
-    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000268, !registered, !matched, active, busy 0, retain 5>
-    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x10000026d, !registered, !matched, active, busy 0, retain 5>
-    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x10000026e, !registered, !matched, active, busy 0, retain 5>
-    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000271, !registered, !matched, active, busy 0, retain 5>
-    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000272, !registered, !matched, active, busy 0, retain 5>
-    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x1000002ed, !registered, !matched, active, busy 0, retain 5>
-    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000319, !registered, !matched, active, busy 0, retain 5>
-    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000329, !registered, !matched, active, busy 0, retain 5>
-    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x10000032f, !registered, !matched, active, busy 0, retain 5>
-    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000332, !registered, !matched, active, busy 0, retain 5>
-    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000363, !registered, !matched, active, busy 0, retain 5>
-    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000364, !registered, !matched, active, busy 0, retain 5>
-    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x10000036d, !registered, !matched, active, busy 0, retain 5>
-    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x10000036e, !registered, !matched, active, busy 0, retain 5>
-    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x10000036f, !registered, !matched, active, busy 0, retain 5>
-    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000371, !registered, !matched, active, busy 0, retain 5>
-    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000392, !registered, !matched, active, busy 0, retain 5>
-    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000393, !registered, !matched, active, busy 0, retain 5>
-    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x1000003a1, !registered, !matched, active, busy 0, retain 5>
-    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x1000003a2, !registered, !matched, active, busy 0, retain 5>
-    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x1000003a3, !registered, !matched, active, busy 0, retain 5>
-    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x1000003b9, !registered, !matched, active, busy 0, retain 5>
-    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x1000003bc, !registered, !matched, active, busy 0, retain 5>
-    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x10000041e, !registered, !matched, active, busy 0, retain 5>
-    | +-o cpus  <class IOPlatformDevice, id 0x100000117, registered, matched, active, busy 0 (4 ms), retain 7>
-    | +-o CPU0 at 0  <class IOACPIPlatformDevice, id 0x100000118, registered, matched, active, busy 0 (418 ms), retain 7>
-    | | +-o AppleACPICPU  <class AppleACPICPU, id 0x10000011d, registered, matched, active, busy 0 (406 ms), retain 9>
-    | |   +-o AppleACPICPUInterruptController  <class AppleACPICPUInterruptController, id 0x10000011f, registered, matched, active, busy 0 (1 ms), retain 5>
-    | |   +-o ACPI_SMC_PlatformPlugin  <class ACPI_SMC_PlatformPlugin, id 0x10000027b, registered, matched, active, busy 0 (8 ms), retain 9>
-    | |   +-o AppleIntelMeromPerformanceMonitor  <class AppleIntelMeromPerformanceMonitor, id 0x10000027c, !registered, !matched, active, busy 0 (145 ms), retain 9>
-    | |   | +-o AppleIntelMeromGeneralPurposeCounter  <class AppleIntelMeromGeneralPurposeCounter, id 0x1000002ce, registered, matched, active, busy 0 (125 ms), retain 7>
-    | |   | | +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x100000292, registered, matched, active, busy 0 (175 ms), retain 17>
-    | |   | |   +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x1000002d4, !registered, !matched, active, busy 0, retain 5>
-    | |   | +-o AppleIntelMeromGeneralPurposeCounter  <class AppleIntelMeromGeneralPurposeCounter, id 0x1000002cf, registered, matched, active, busy 0 (126 ms), retain 7>
-    | |   | | +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x100000292, registered, matched, active, busy 0 (175 ms), retain 17>
-    | |   | |   +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x1000002d4, !registered, !matched, active, busy 0, retain 5>
-    | |   | +-o AppleIntelMeromFixedCounter  <class AppleIntelMeromFixedCounter, id 0x1000002d0, registered, matched, active, busy 0 (133 ms), retain 7>
-    | |   | | +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x100000292, registered, matched, active, busy 0 (175 ms), retain 17>
-    | |   | |   +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x1000002d4, !registered, !matched, active, busy 0, retain 5>
-    | |   | +-o AppleIntelMeromFixedCounter  <class AppleIntelMeromFixedCounter, id 0x1000002d1, registered, matched, active, busy 0 (145 ms), retain 7>
-    | |   | | +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x100000292, registered, matched, active, busy 0 (175 ms), retain 17>
-    | |   | |   +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x1000002d4, !registered, !matched, active, busy 0, retain 5>
-    | |   | +-o AppleIntelMeromFixedCounter  <class AppleIntelMeromFixedCounter, id 0x1000002d2, registered, matched, active, busy 0 (133 ms), retain 7>
-    | |   |   +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x100000292, registered, matched, active, busy 0 (175 ms), retain 17>
-    | |   |     +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x1000002d4, !registered, !matched, active, busy 0, retain 5>
-    | |   +-o AppleIntelMeromSPR  <class AppleIntelMeromSPR, id 0x1000002b4, registered, matched, active, busy 0 (135 ms), retain 4>
-    | +-o CPU1 at 1  <class IOACPIPlatformDevice, id 0x100000119, registered, matched, active, busy 0 (392 ms), retain 7>
-    | | +-o AppleACPICPU  <class AppleACPICPU, id 0x10000011e, registered, matched, active, busy 0 (374 ms), retain 7>
-    | |   +-o AppleIntelMeromPerformanceMonitor  <class AppleIntelMeromPerformanceMonitor, id 0x1000002ba, !registered, !matched, active, busy 0 (124 ms), retain 9>
-    | |   | +-o AppleIntelMeromGeneralPurposeCounter  <class AppleIntelMeromGeneralPurposeCounter, id 0x1000002c2, registered, matched, active, busy 0 (3 ms), retain 7>
-    | |   | | +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x100000292, registered, matched, active, busy 0 (175 ms), retain 17>
-    | |   | |   +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x1000002d4, !registered, !matched, active, busy 0, retain 5>
-    | |   | +-o AppleIntelMeromGeneralPurposeCounter  <class AppleIntelMeromGeneralPurposeCounter, id 0x1000002c4, registered, matched, active, busy 0 (6 ms), retain 7>
-    | |   | | +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x100000292, registered, matched, active, busy 0 (175 ms), retain 17>
-    | |   | |   +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x1000002d4, !registered, !matched, active, busy 0, retain 5>
-    | |   | +-o AppleIntelMeromFixedCounter  <class AppleIntelMeromFixedCounter, id 0x1000002c5, registered, matched, active, busy 0 (120 ms), retain 7>
-    | |   | | +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x100000292, registered, matched, active, busy 0 (175 ms), retain 17>
-    | |   | |   +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x1000002d4, !registered, !matched, active, busy 0, retain 5>
-    | |   | +-o AppleIntelMeromFixedCounter  <class AppleIntelMeromFixedCounter, id 0x1000002c6, registered, matched, active, busy 0 (122 ms), retain 7>
-    | |   | | +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x100000292, registered, matched, active, busy 0 (175 ms), retain 17>
-    | |   | |   +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x1000002d4, !registered, !matched, active, busy 0, retain 5>
-    | |   | +-o AppleIntelMeromFixedCounter  <class AppleIntelMeromFixedCounter, id 0x1000002c7, registered, matched, active, busy 0 (124 ms), retain 7>
-    | |   |   +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x100000292, registered, matched, active, busy 0 (175 ms), retain 17>
-    | |   |     +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x1000002d4, !registered, !matched, active, busy 0, retain 5>
-    | |   +-o AppleIntelMeromSPR  <class AppleIntelMeromSPR, id 0x1000002bb, registered, matched, active, busy 0 (125 ms), retain 4>
-    | +-o io-apic at fec00000  <class IOACPIPlatformDevice, id 0x10000011a, registered, matched, active, busy 0 (4 ms), retain 6>
-    | | +-o AppleAPICInterruptController  <class AppleAPICInterruptController, id 0x100000121, registered, matched, active, busy 0 (1 ms), retain 11>
-    | +-o AppleACPIEventController  <class AppleACPIEventController, id 0x100000122, !registered, !matched, active, busy 0, retain 6>
-    | +-o boot-ec  <class IOACPIPlatformDevice, id 0x100000123, registered, matched, active, busy 0 (3 ms), retain 6>
-    | | +-o AppleACPIEC  <class AppleACPIEC, id 0x100000124, !registered, !matched, active, busy 0, retain 6>
-    | +-o bios  <class IOPlatformDevice, id 0x100000125, registered, matched, active, busy 0 (4 ms), retain 5>
-    | | +-o AppleSMBIOS  <class AppleSMBIOS, id 0x100000126, registered, matched, active, busy 0 (1 ms), retain 4>
-    | +-o ADP1  <class IOACPIPlatformDevice, id 0x10000012a, registered, matched, active, busy 0 (2 ms), retain 7>
-    | | +-o AppleACPIACAdapter  <class AppleACPIACAdapter, id 0x1000001a2, !registered, !matched, active, busy 0, retain 4>
-    | +-o LID0  <class IOACPIPlatformDevice, id 0x10000012b, registered, matched, active, busy 0 (3 ms), retain 9>
-    | | +-o AppleACPILid  <class AppleACPILid, id 0x1000001a3, !registered, !matched, active, busy 0, retain 5>
-    | +-o PNLF  <class IOACPIPlatformDevice, id 0x10000012c, registered, matched, active, busy 0 (13 ms), retain 7>
-    | | +-o AppleIntelPanelA  <class AppleIntelPanelA, id 0x100000273, !registered, !matched, active, busy 0, retain 5>
-    | +-o PWRB  <class IOACPIPlatformDevice, id 0x10000012d, registered, matched, active, busy 0 (5 ms), retain 8>
-    | | +-o AppleACPIButton  <class AppleACPIButton, id 0x1000001a4, !registered, !matched, active, busy 0, retain 4>
-    | +-o SLPB  <class IOACPIPlatformDevice, id 0x10000012e, registered, matched, active, busy 0 (6 ms), retain 7>
-    | | +-o AppleACPIButton  <class AppleACPIButton, id 0x1000001a5, !registered, !matched, active, busy 0, retain 4>
-    | +-o PCI0 at 0  <class IOACPIPlatformDevice, id 0x10000012f, registered, matched, active, busy 0 (15786 ms), retain 43>
-    | | +-o AppleACPIPCI  <class AppleACPIPCI, id 0x1000001a6, registered, matched, active, busy 0 (15772 ms), retain 40>
-    | |   +-o pci8086,27a0 at 0  <class IOPCIDevice, id 0x1000001a8, registered, matched, active, busy 0 (5445 ms), retain 8>
-    | |   | +-o AppleSMCPDRC  <class AppleSMCPDRC, id 0x1000002a9, registered, matched, active, busy 0 (1 ms), retain 4>
-    | |   +-o GFX0 at 2  <class IOPCIDevice, id 0x100000174, registered, matched, active, busy 0 (551 ms), retain 17>
-    | |   | +-o AppleIntelIntegratedFramebuffer  <class AppleIntelIntegratedFramebuffer, id 0x1000002b5, !registered, !matched, active, busy 0, retain 6>
-    | |   | +-o AppleIntelFramebuffer  <class AppleIntelFramebuffer, id 0x1000002d8, registered, matched, active, busy 0 (239 ms), retain 14>
-    | |   | | +-o AppleMCCSControlModule  <class AppleMCCSControlModule, id 0x1000002e2, registered, matched, active, busy 0 (79 ms), retain 5>
-    | |   | | | +-o AppleMCCSParameterHandler  <class AppleMCCSParameterHandler, id 0x1000002eb, registered, matched, active, busy 0 (6 ms), retain 4>
-    | |   | | +-o AppleUpstreamUserClientDriver  <class AppleUpstreamUserClientDriver, id 0x1000002e3, registered, matched, active, busy 0 (3 ms), retain 4>
-    | |   | | +-o IOFramebufferI2CInterface  <class IOFramebufferI2CInterface, id 0x10000031c, registered, matched, active, busy 0 (3 ms), retain 5>
-    | |   | | +-o display0  <class IODisplayConnect, id 0x10000031d, registered, matched, active, busy 0 (28 ms), retain 5>
-    | |   | | | +-o AppleBacklightDisplay  <class AppleBacklightDisplay, id 0x10000031e, registered, matched, active, busy 0 (2 ms), retain 8>
-    | |   | | +-o IOFramebufferUserClient  <class IOFramebufferUserClient, id 0x100000325, !registered, !matched, active, busy 0, retain 5>
-    | |   | +-o AppleIntelFramebuffer  <class AppleIntelFramebuffer, id 0x1000002da, registered, matched, active, busy 0 (212 ms), retain 12>
-    | |   | | +-o AppleMCCSControlModule  <class AppleMCCSControlModule, id 0x1000002e5, registered, matched, active, busy 0 (8 ms), retain 5>
-    | |   | | | +-o AppleMCCSParameterHandler  <class AppleMCCSParameterHandler, id 0x1000002e9, registered, matched, active, busy 0 (6 ms), retain 4>
-    | |   | | +-o AppleUpstreamUserClientDriver  <class AppleUpstreamUserClientDriver, id 0x1000002e6, registered, matched, active, busy 0 (5 ms), retain 4>
-    | |   | | +-o IOFramebufferI2CInterface  <class IOFramebufferI2CInterface, id 0x100000324, registered, matched, active, busy 0 (3 ms), retain 5>
-    | |   | | +-o IOFramebufferUserClient  <class IOFramebufferUserClient, id 0x100000327, !registered, !matched, active, busy 0, retain 5>
-    | |   | +-o Intel915  <class Intel915, id 0x1000002b7, registered, matched, active, busy 0 (2 ms), retain 18>
-    | |   |   +-o Intel9152DContext  <class Intel9152DContext, id 0x100000326, !registered, !matched, active, busy 0, retain 5>
-    | |   |   +-o Intel9152DContext  <class Intel9152DContext, id 0x100000328, !registered, !matched, active, busy 0, retain 5>
-    | |   |   +-o Intel915Device  <class Intel915Device, id 0x10000032d, !registered, !matched, active, busy 0, retain 5>
-    | |   |   +-o Intel915GLContext  <class Intel915GLContext, id 0x10000032e, !registered, !matched, active, busy 0, retain 5>
-    | |   |   +-o Intel915Surface  <class Intel915Surface, id 0x10000035e, !registered, !matched, active, busy 0, retain 5>
-    | |   |   +-o Intel915Surface  <class Intel915Surface, id 0x100000372, !registered, !matched, active, busy 0, retain 5>
-    | |   |   +-o Intel915GLContext  <class Intel915GLContext, id 0x100000373, !registered, !matched, active, busy 0, retain 5>
-    | |   |   +-o Intel915Surface  <class Intel915Surface, id 0x100000384, !registered, !matched, active, busy 0, retain 5>
-    | |   |   +-o Intel915Surface  <class Intel915Surface, id 0x100000385, !registered, !matched, active, busy 0, retain 5>
-    | |   |   +-o Intel915Surface  <class Intel915Surface, id 0x100000391, !registered, !matched, active, busy 0, retain 5>
-    | |   |   +-o Intel915Device  <class Intel915Device, id 0x1000003be, !registered, !matched, active, busy 0, retain 5>
-    | |   |   +-o Intel915GLContext  <class Intel915GLContext, id 0x1000003bf, !registered, !matched, active, busy 0, retain 5>
-    | |   |   +-o Intel915GLContext  <class Intel915GLContext, id 0x1000003c0, !registered, !matched, active, busy 0, retain 5>
-    | |   |   +-o Intel915Surface  <class Intel915Surface, id 0x1000003c1, !registered, !matched, active, busy 0, retain 5>
-    | |   +-o display at 2,1  <class IOPCIDevice, id 0x1000001a9, registered, matched, active, busy 0 (637 ms), retain 9>
-    | |   | +-o IONDRVFramebuffer  <class IONDRVFramebuffer, id 0x100000277, registered, matched, active, busy 0 (458 ms), retain 7>
-    | |   |   +-o AppleMCCSControlModule  <class AppleMCCSControlModule, id 0x1000002ac, registered, matched, active, busy 0 (125 ms), retain 5>
-    | |   |   | +-o AppleMCCSParameterHandler  <class AppleMCCSParameterHandler, id 0x1000002dd, registered, matched, active, busy 0 (4 ms), retain 4>
-    | |   |   +-o AppleUpstreamUserClientDriver  <class AppleUpstreamUserClientDriver, id 0x1000002ad, registered, matched, active, busy 0 (107 ms), retain 4>
-    | |   +-o pci8086,27a3 at 7  <class IOPCIDevice, id 0x1000001aa, registered, matched, active, busy 0 (32 ms), retain 7>
-    | |   +-o HDEF at 1B  <class IOPCIDevice, id 0x100000178, registered, matched, active, busy 0 (739 ms), retain 10>
-    | |   | +-o AppleHDAController at 1B  <class AppleHDAController, id 0x100000280, registered, matched, active, busy 0 (348 ms), retain 7>
-    | |   |   +-o IOHDACodecDevice at 1B,0  <class IOHDACodecDevice, id 0x1000002a8, registered, matched, active, busy 0 (348 ms), retain 6>
-    | |   |     +-o IOHDACodecDriver  <class IOHDACodecDriver, id 0x1000002d6, !registered, !matched, active, busy 0 (261 ms), retain 5>
-    | |   |       +-o IOHDACodecFunction at 1B,0,1  <class IOHDACodecFunction, id 0x1000002d7, registered, matched, active, busy 0 (261 ms), retain 6>
-    | |   |         +-o AppleHDACodecGeneric  <class AppleHDACodecGeneric, id 0x1000002e1, registered, matched, active, busy 0 (101 ms), retain 5>
-    | |   |           +-o AppleHDADriver  <class AppleHDADriver, id 0x1000002ec, registered, matched, active, busy 0 (21 ms), retain 8>
-    | |   |             +-o AppleHDAEngineOutput at 1B,0,1,2  <class AppleHDAEngineOutput, id 0x100000302, registered, matched, active, busy 0 (9 ms), retain 28>
-    | |   |             | +-o AppleHDAStream  <class AppleHDAStream, id 0x100000303, registered, matched, active, busy 0 (5 ms), retain 8>
-    | |   |             | +-o IOAudioSelectorControl  <class IOAudioSelectorControl, id 0x100000304, !registered, !matched, active, busy 0 (0 ms), retain 12>
-    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000033f, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000039c, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003b4, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | +-o IOAudioLevelControl  <class IOAudioLevelControl, id 0x100000305, !registered, !matched, active, busy 0 (0 ms), retain 12>
-    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000340, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000039d, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003b5, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | +-o IOAudioLevelControl  <class IOAudioLevelControl, id 0x100000306, !registered, !matched, active, busy 0 (0 ms), retain 12>
-    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000341, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000039e, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003b6, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | +-o IOAudioToggleControl  <class IOAudioToggleControl, id 0x100000307, !registered, !matched, active, busy 0 (0 ms), retain 12>
-    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000342, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000039f, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003b7, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | +-o IOAudioToggleControl  <class IOAudioToggleControl, id 0x100000308, !registered, !matched, active, busy 0 (0 ms), retain 12>
-    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000343, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003a0, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003b8, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | +-o AudioAUUCDriver  <class AudioAUUCDriver, id 0x10000030a, registered, matched, active, busy 0 (4 ms), retain 4>
-    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000336, !registered, !matched, active, busy 0, retain 7>
-    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000347, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000368, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x10000036c, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000397, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x10000039b, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x1000003a7, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x1000003ab, !registered, !matched, active, busy 0, retain 6>
-    | |   |             +-o AppleHDAEngineInput at 1B,0,1,0  <class AppleHDAEngineInput, id 0x100000309, registered, matched, active, busy 0 (6 ms), retain 24>
-    | |   |             | +-o AppleHDAStream  <class AppleHDAStream, id 0x10000030b, registered, matched, active, busy 0 (5 ms), retain 7>
-    | |   |             | +-o IOAudioSelectorControl  <class IOAudioSelectorControl, id 0x10000030c, !registered, !matched, active, busy 0 (0 ms), retain 10>
-    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000033b, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003ac, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | +-o IOAudioLevelControl  <class IOAudioLevelControl, id 0x10000030d, !registered, !matched, active, busy 0 (0 ms), retain 10>
-    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000033c, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003ad, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | +-o IOAudioLevelControl  <class IOAudioLevelControl, id 0x10000030e, !registered, !matched, active, busy 0 (0 ms), retain 10>
-    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000033d, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003ae, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | +-o IOAudioToggleControl  <class IOAudioToggleControl, id 0x10000030f, !registered, !matched, active, busy 0 (0 ms), retain 18>
-    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000033e, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000345, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000036a, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000399, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003a9, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003af, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000335, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000346, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000367, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x10000036b, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000396, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x10000039a, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x1000003a6, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x1000003aa, !registered, !matched, active, busy 0, retain 6>
-    | |   |             +-o AppleHDAEngineInput at 1B,0,1,1  <class AppleHDAEngineInput, id 0x100000310, registered, matched, active, busy 0 (6 ms), retain 24>
-    | |   |               +-o AppleHDAStream  <class AppleHDAStream, id 0x100000311, registered, matched, active, busy 0 (5 ms), retain 7>
-    | |   |               +-o IOAudioSelectorControl  <class IOAudioSelectorControl, id 0x100000313, !registered, !matched, active, busy 0 (0 ms), retain 10>
-    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000337, !registered, !matched, active, busy 0, retain 6>
-    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003b0, !registered, !matched, active, busy 0, retain 6>
-    | |   |               +-o IOAudioLevelControl  <class IOAudioLevelControl, id 0x100000314, !registered, !matched, active, busy 0 (0 ms), retain 10>
-    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000338, !registered, !matched, active, busy 0, retain 6>
-    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003b1, !registered, !matched, active, busy 0, retain 6>
-    | |   |               +-o IOAudioLevelControl  <class IOAudioLevelControl, id 0x100000315, !registered, !matched, active, busy 0 (0 ms), retain 10>
-    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000339, !registered, !matched, active, busy 0, retain 6>
-    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003b2, !registered, !matched, active, busy 0, retain 6>
-    | |   |               +-o IOAudioToggleControl  <class IOAudioToggleControl, id 0x100000316, !registered, !matched, active, busy 0 (0 ms), retain 10>
-    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000033a, !registered, !matched, active, busy 0, retain 6>
-    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003b3, !registered, !matched, active, busy 0, retain 6>
-    | |   |               +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000334, !registered, !matched, active, busy 0, retain 6>
-    | |   |               +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000344, !registered, !matched, active, busy 0, retain 6>
-    | |   |               +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000366, !registered, !matched, active, busy 0, retain 6>
-    | |   |               +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000369, !registered, !matched, active, busy 0, retain 6>
-    | |   |               +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000395, !registered, !matched, active, busy 0, retain 6>
-    | |   |               +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000398, !registered, !matched, active, busy 0, retain 6>
-    | |   |               +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x1000003a5, !registered, !matched, active, busy 0, retain 6>
-    | |   |               +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x1000003a8, !registered, !matched, active, busy 0, retain 6>
-    | |   +-o RP01 at 1C  <class IOPCIDevice, id 0x100000179, registered, matched, active, busy 0 (6297 ms), retain 11>
-    | |   | +-o IOPCI2PCIBridge  <class IOPCI2PCIBridge, id 0x1000001c2, registered, matched, active, busy 0 (6262 ms), retain 7>
-    | |   |   +-o PXS1 at 0  <class IOPCIDevice, id 0x10000017a, registered, matched, active, busy 0 (6262 ms), retain 10>
-    | |   |     +-o yukon2osx  <class yukon2osx, id 0x1000001c6, !registered, !matched, active, busy 0 (2 ms), retain 7>
-    | |   |       +-o yukon  <class yukon, id 0x100000260, !registered, !matched, active, busy 0 (2 ms), retain 8>
-    | |   |         +-o IOEthernetInterface  <class IOEthernetInterface, id 0x100000261, registered, matched, active, busy 0 (2 ms), retain 11>
-    | |   |           +-o IONetworkStack  <class IONetworkStack, id 0x1000001de, registered, matched, active, busy 0 (2 ms), retain 11>
-    | |   |             +-o IONetworkStackUserClient  <class IONetworkStackUserClient, id 0x100000266, !registered, !matched, active, busy 0, retain 5>
-    | |   +-o RP02 at 1C,1  <class IOPCIDevice, id 0x10000017b, registered, matched, active, busy 0 (509 ms), retain 11>
-    | |   | +-o IOPCI2PCIBridge  <class IOPCI2PCIBridge, id 0x1000001e3, registered, matched, active, busy 0 (299 ms), retain 7>
-    | |   |   +-o PXS2 at 0  <class IOPCIDevice, id 0x10000017c, registered, matched, active, busy 0 (288 ms), retain 12>
-    | |   |     +-o AirPort_AthrFusion21  <class AirPort_AthrFusion21, id 0x10000027d, registered, matched, active, busy 0 (100 ms), retain 8>
-    | |   |       +-o AtherosFusion21Interface  <class AtherosFusion21Interface, id 0x1000002ab, registered, matched, active, busy 0 (99 ms), retain 10>
-    | |   |         +-o IONetworkStack  <class IONetworkStack, id 0x1000001de, registered, matched, active, busy 0 (2 ms), retain 11>
-    | |   |           +-o IONetworkStackUserClient  <class IONetworkStackUserClient, id 0x100000266, !registered, !matched, active, busy 0, retain 5>
-    | |   +-o USB1 at 1D  <class IOPCIDevice, id 0x10000017d, registered, matched, active, busy 0 (967 ms), retain 11>
-    | |   | +-o AppleUSBUHCI  <class AppleUSBUHCI, id 0x1000001e1, registered, matched, active, busy 0 (634 ms), retain 9>
-    | |   |   +-o UHCI Root Hub Simulation at 1D  <class IOUSBRootHubDevice, id 0x1000001fe, registered, matched, active, busy 0 (8 ms), retain 10>
-    | |   |   | | {
-    | |   |   | |   "sessionID" = 555462596
-    | |   |   | |   "iManufacturer" = 2
-    | |   |   | |   "bNumConfigurations" = 1
-    | |   |   | |   "idProduct" = 32773
-    | |   |   | |   "bcdDevice" = 272
-    | |   |   | |   "Bus Power Available" = 250
-    | |   |   | |   "bMaxPacketSize0" = 8
-    | |   |   | |   "USB Product Name" = "UHCI Root Hub Simulation"
-    | |   |   | |   "iProduct" = 1
-    | |   |   | |   "iSerialNumber" = 0
-    | |   |   | |   "USB Address" = 1
-    | |   |   | |   "bDeviceClass" = 9
-    | |   |   | |   "locationID" = 486539264
-    | |   |   | |   "bDeviceSubClass" = 0
-    | |   |   | |   "IOUserClientClass" = "IOUSBDeviceUserClientV2"
-    | |   |   | |   "Ports" = 2
-    | |   |   | |   "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
-    | |   |   | |   "bDeviceProtocol" = 0
-    | |   |   | |   "USB Vendor Name" = "Apple Inc."
-    | |   |   | |   "Device Speed" = 1
-    | |   |   | |   "idVendor" = 1452
-    | |   |   | |   "AAPL,current-in-sleep" = 1000
-    | |   |   | |   "Requested Power" = 0
-    | |   |   | |   "AAPL,port-current-in-sleep" = 500
-    | |   |   | |   "Low Power Displayed" = No
-    | |   |   | | }
-    | |   |   | | 
-    | |   |   | +-o AppleUSBHub  <class AppleUSBHub, id 0x100000200, !registered, !matched, active, busy 0, retain 8>
-    | |   |   | +-o IOUSBInterface at 0  <class IOUSBInterface, id 0x100000202, !registered, !matched, active, busy 0, retain 7>
-    | |   |   +-o Apple Internal Keyboard / Trackpad at 1d200000  <class IOUSBDevice, id 0x100000227, registered, matched, active, busy 0 (625 ms), retain 12>
-    | |   |     | {
-    | |   |     |   "sessionID" = 922879256
-    | |   |     |   "iManufacturer" = 1
-    | |   |     |   "bNumConfigurations" = 1
-    | |   |     |   "idProduct" = 539
-    | |   |     |   "bcdDevice" = 24
-    | |   |     |   "Bus Power Available" = 250
-    | |   |     |   "bMaxPacketSize0" = 8
-    | |   |     |   "USB Product Name" = "Apple Internal Keyboard / Trackpad"
-    | |   |     |   "iProduct" = 2
-    | |   |     |   "iSerialNumber" = 0
-    | |   |     |   "USB Address" = 2
-    | |   |     |   "bDeviceClass" = 0
-    | |   |     |   "locationID" = 488636416
-    | |   |     |   "bDeviceSubClass" = 0
-    | |   |     |   "IOUserClientClass" = "IOUSBDeviceUserClientV2"
-    | |   |     |   "PortNum" = 2
-    | |   |     |   "non-removable" = "yes"
-    | |   |     |   "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
-    | |   |     |   "bDeviceProtocol" = 0
-    | |   |     |   "Need contiguous memory for isoch" = Yes
-    | |   |     |   "USB Vendor Name" = "Apple Computer"
-    | |   |     |   "Device Speed" = 1
-    | |   |     |   "idVendor" = 1452
-    | |   |     |   "Requested Power" = 20
-    | |   |     |   "IOGeneralInterest" = "IOCommand is not serializable"
-    | |   |     |   "Low Power Displayed" = No
-    | |   |     | }
-    | |   |     | 
-    | |   |     +-o IOUSBCompositeDriver  <class IOUSBCompositeDriver, id 0x100000229, !registered, !matched, active, busy 0, retain 4>
-    | |   |     +-o Apple Internal Keyboard at 0  <class IOUSBInterface, id 0x10000022b, registered, matched, active, busy 0 (520 ms), retain 8>
-    | |   |     | +-o AppleUSBTCKeyboard  <class AppleUSBTCKeyboard, id 0x100000232, registered, matched, active, busy 0 (101 ms), retain 8>
-    | |   |     |   +-o IOHIDInterface  <class IOHIDInterface, id 0x100000238, registered, matched, active, busy 0 (6 ms), retain 6>
-    | |   |     |     +-o AppleUSBTCKeyEventDriver  <class AppleUSBTCKeyEventDriver, id 0x100000239, registered, matched, active, busy 0 (1 ms), retain 8>
-    | |   |     |       +-o IOHIDKeyboard  <class IOHIDKeyboard, id 0x10000023b, registered, matched, active, busy 0 (0 ms), retain 8>
-    | |   |     |       | +-o IOHIDSystem  <class IOHIDSystem, id 0x1000001df, registered, matched, active, busy 0 (3 ms), retain 16>
-    | |   |     |       |   +-o IOHIDUserClient  <class IOHIDUserClient, id 0x10000031a, !registered, !matched, active, busy 0, retain 5>
-    | |   |     |       |   +-o IOHIDParamUserClient  <class IOHIDParamUserClient, id 0x10000031b, !registered, !matched, active, busy 0, retain 5>
-    | |   |     |       |   +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000032a, !registered, !matched, active, busy 0, retain 5>
-    | |   |     |       |   +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000032b, !registered, !matched, active, busy 0, retain 5>
-    | |   |     |       +-o IOHIDSystem  <class IOHIDSystem, id 0x1000001df, registered, matched, active, busy 0 (3 ms), retain 15>
-    | |   |     |         +-o IOHIDUserClient  <class IOHIDUserClient, id 0x10000031a, !registered, !matched, active, busy 0, retain 5>
-    | |   |     |         +-o IOHIDParamUserClient  <class IOHIDParamUserClient, id 0x10000031b, !registered, !matched, active, busy 0, retain 5>
-    | |   |     |         +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000032a, !registered, !matched, active, busy 0, retain 5>
-    | |   |     |         +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000032b, !registered, !matched, active, busy 0, retain 5>
-    | |   |     +-o Touchpad at 1  <class IOUSBInterface, id 0x10000022c, registered, matched, active, busy 0 (382 ms), retain 7>
-    | |   |     | +-o AppleUSBGrIIITrackpad  <class AppleUSBGrIIITrackpad, id 0x10000023d, registered, matched, active, busy 0 (117 ms), retain 16>
-    | |   |     |   +-o RawDataReporter  <class RawDataReporter, id 0x10000023e, registered, matched, active, busy 0 (105 ms), retain 6>
-    | |   |     |   | +-o IOHIDInterface  <class IOHIDInterface, id 0x10000023f, registered, matched, active, busy 0 (3 ms), retain 5>
-    | |   |     |   +-o IOHIDPointingDevice  <class IOHIDPointingDevice, id 0x100000241, registered, matched, active, busy 0 (107 ms), retain 6>
-    | |   |     |   | +-o IOHIDInterface  <class IOHIDInterface, id 0x100000242, registered, matched, active, busy 0 (3 ms), retain 5>
-    | |   |     |   +-o IOHIDSystem  <class IOHIDSystem, id 0x1000001df, registered, matched, active, busy 0 (3 ms), retain 15>
-    | |   |     |   | +-o IOHIDUserClient  <class IOHIDUserClient, id 0x10000031a, !registered, !matched, active, busy 0, retain 5>
-    | |   |     |   | +-o IOHIDParamUserClient  <class IOHIDParamUserClient, id 0x10000031b, !registered, !matched, active, busy 0, retain 5>
-    | |   |     |   | +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000032a, !registered, !matched, active, busy 0, retain 5>
-    | |   |     |   | +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000032b, !registered, !matched, active, busy 0, retain 5>
-    | |   |     |   +-o BaselineReporter  <class BaselineReporter, id 0x100000244, registered, matched, active, busy 0 (108 ms), retain 6>
-    | |   |     |     +-o IOHIDInterface  <class IOHIDInterface, id 0x100000245, registered, matched, active, busy 0 (3 ms), retain 5>
-    | |   |     +-o Apple Internal Keyboard at 2  <class IOUSBInterface, id 0x10000022d, registered, matched, active, busy 0 (202 ms), retain 8>
-    | |   |       +-o AppleUSBTCKeyboard  <class AppleUSBTCKeyboard, id 0x100000247, registered, matched, active, busy 0 (110 ms), retain 8>
-    | |   |         +-o IOHIDInterface  <class IOHIDInterface, id 0x100000248, registered, matched, active, busy 0 (103 ms), retain 6>
-    | |   |           +-o IOHIDEventDriver  <class IOHIDEventDriver, id 0x1000002a1, registered, matched, active, busy 0 (3 ms), retain 8>
-    | |   |             +-o IOHIDConsumer  <class IOHIDConsumer, id 0x1000002a2, registered, matched, active, busy 0 (1 ms), retain 8>
-    | |   |             | +-o IOHIDSystem  <class IOHIDSystem, id 0x1000001df, registered, matched, active, busy 0 (3 ms), retain 16>
-    | |   |             |   +-o IOHIDUserClient  <class IOHIDUserClient, id 0x10000031a, !registered, !matched, active, busy 0, retain 5>
-    | |   |             |   +-o IOHIDParamUserClient  <class IOHIDParamUserClient, id 0x10000031b, !registered, !matched, active, busy 0, retain 5>
-    | |   |             |   +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000032a, !registered, !matched, active, busy 0, retain 5>
-    | |   |             |   +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000032b, !registered, !matched, active, busy 0, retain 5>
-    | |   |             +-o IOHIDSystem  <class IOHIDSystem, id 0x1000001df, registered, matched, active, busy 0 (3 ms), retain 15>
-    | |   |               +-o IOHIDUserClient  <class IOHIDUserClient, id 0x10000031a, !registered, !matched, active, busy 0, retain 5>
-    | |   |               +-o IOHIDParamUserClient  <class IOHIDParamUserClient, id 0x10000031b, !registered, !matched, active, busy 0, retain 5>
-    | |   |               +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000032a, !registered, !matched, active, busy 0, retain 5>
-    | |   |               +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000032b, !registered, !matched, active, busy 0, retain 5>
-    | |   +-o USB2 at 1D,1  <class IOPCIDevice, id 0x100000181, registered, matched, active, busy 0 (352 ms), retain 11>
-    | |   | +-o AppleUSBUHCI  <class AppleUSBUHCI, id 0x1000001f3, registered, matched, active, busy 0 (13 ms), retain 8>
-    | |   |   +-o UHCI Root Hub Simulation at 1D,1  <class IOUSBRootHubDevice, id 0x100000206, registered, matched, active, busy 0 (10 ms), retain 8>
-    | |   |     | {
-    | |   |     |   "sessionID" = 564210044
-    | |   |     |   "iManufacturer" = 2
-    | |   |     |   "bNumConfigurations" = 1
-    | |   |     |   "idProduct" = 32773
-    | |   |     |   "bcdDevice" = 272
-    | |   |     |   "Bus Power Available" = 250
-    | |   |     |   "bMaxPacketSize0" = 8
-    | |   |     |   "USB Product Name" = "UHCI Root Hub Simulation"
-    | |   |     |   "iProduct" = 1
-    | |   |     |   "iSerialNumber" = 0
-    | |   |     |   "USB Address" = 1
-    | |   |     |   "bDeviceClass" = 9
-    | |   |     |   "locationID" = 1023410176
-    | |   |     |   "bDeviceSubClass" = 0
-    | |   |     |   "IOUserClientClass" = "IOUSBDeviceUserClientV2"
-    | |   |     |   "Ports" = 2
-    | |   |     |   "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
-    | |   |     |   "bDeviceProtocol" = 0
-    | |   |     |   "USB Vendor Name" = "Apple Inc."
-    | |   |     |   "Device Speed" = 1
-    | |   |     |   "idVendor" = 1452
-    | |   |     |   "AAPL,current-in-sleep" = 1000
-    | |   |     |   "Requested Power" = 0
-    | |   |     |   "AAPL,port-current-in-sleep" = 500
-    | |   |     |   "Low Power Displayed" = No
-    | |   |     | }
-    | |   |     | 
-    | |   |     +-o AppleUSBHub  <class AppleUSBHub, id 0x10000020b, !registered, !matched, active, busy 0, retain 6>
-    | |   |     +-o IOUSBInterface at 0  <class IOUSBInterface, id 0x10000020d, !registered, !matched, active, busy 0, retain 7>
-    | |   +-o USB3 at 1D,2  <class IOPCIDevice, id 0x100000185, registered, matched, active, busy 0 (647 ms), retain 11>
-    | |   | +-o AppleUSBUHCI  <class AppleUSBUHCI, id 0x1000001c8, registered, matched, active, busy 0 (297 ms), retain 9>
-    | |   |   +-o UHCI Root Hub Simulation at 1D,2  <class IOUSBRootHubDevice, id 0x100000209, registered, matched, active, busy 0 (20 ms), retain 10>
-    | |   |   | | {
-    | |   |   | |   "sessionID" = 572462640
-    | |   |   | |   "iManufacturer" = 2
-    | |   |   | |   "bNumConfigurations" = 1
-    | |   |   | |   "idProduct" = 32773
-    | |   |   | |   "bcdDevice" = 272
-    | |   |   | |   "Bus Power Available" = 250
-    | |   |   | |   "bMaxPacketSize0" = 8
-    | |   |   | |   "USB Product Name" = "UHCI Root Hub Simulation"
-    | |   |   | |   "iProduct" = 1
-    | |   |   | |   "iSerialNumber" = 0
-    | |   |   | |   "USB Address" = 1
-    | |   |   | |   "bDeviceClass" = 9
-    | |   |   | |   "locationID" = 1560281088
-    | |   |   | |   "bDeviceSubClass" = 0
-    | |   |   | |   "IOUserClientClass" = "IOUSBDeviceUserClientV2"
-    | |   |   | |   "Ports" = 2
-    | |   |   | |   "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
-    | |   |   | |   "bDeviceProtocol" = 0
-    | |   |   | |   "USB Vendor Name" = "Apple Inc."
-    | |   |   | |   "Device Speed" = 1
-    | |   |   | |   "idVendor" = 1452
-    | |   |   | |   "AAPL,current-in-sleep" = 1000
-    | |   |   | |   "Requested Power" = 0
-    | |   |   | |   "AAPL,port-current-in-sleep" = 500
-    | |   |   | |   "Low Power Displayed" = No
-    | |   |   | | }
-    | |   |   | | 
-    | |   |   | +-o AppleUSBHub  <class AppleUSBHub, id 0x100000218, !registered, !matched, active, busy 0, retain 8>
-    | |   |   | +-o IOUSBInterface at 0  <class IOUSBInterface, id 0x10000021a, !registered, !matched, active, busy 0, retain 7>
-    | |   |   +-o IR Receiver at 5d200000  <class IOUSBDevice, id 0x10000022a, registered, matched, active, busy 0 (276 ms), retain 9>
-    | |   |     | {
-    | |   |     |   "sessionID" = 944991920
-    | |   |     |   "iManufacturer" = 1
-    | |   |     |   "bNumConfigurations" = 1
-    | |   |     |   "idProduct" = 33344
-    | |   |     |   "bcdDevice" = 272
-    | |   |     |   "Bus Power Available" = 250
-    | |   |     |   "bMaxPacketSize0" = 8
-    | |   |     |   "USB Product Name" = "IR Receiver"
-    | |   |     |   "iProduct" = 2
-    | |   |     |   "iSerialNumber" = 0
-    | |   |     |   "USB Address" = 2
-    | |   |     |   "bDeviceClass" = 0
-    | |   |     |   "locationID" = 1562378240
-    | |   |     |   "bDeviceSubClass" = 0
-    | |   |     |   "IOUserClientClass" = "IOUSBDeviceUserClientV2"
-    | |   |     |   "PortNum" = 2
-    | |   |     |   "non-removable" = "yes"
-    | |   |     |   "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
-    | |   |     |   "bDeviceProtocol" = 0
-    | |   |     |   "Need contiguous memory for isoch" = Yes
-    | |   |     |   "USB Vendor Name" = "Apple Computer, Inc."
-    | |   |     |   "Device Speed" = 1
-    | |   |     |   "idVendor" = 1452
-    | |   |     |   "Requested Power" = 50
-    | |   |     |   "IOGeneralInterest" = "IOCommand is not serializable"
-    | |   |     |   "Low Power Displayed" = No
-    | |   |     | }
-    | |   |     | 
-    | |   |     +-o IOUSBCompositeDriver  <class IOUSBCompositeDriver, id 0x10000022f, !registered, !matched, active, busy 0, retain 4>
-    | |   |     +-o IOUSBInterface at 0  <class IOUSBInterface, id 0x100000230, registered, matched, active, busy 0 (261 ms), retain 8>
-    | |   |       +-o AppleIRController  <class AppleIRController, id 0x100000235, registered, matched, active, busy 0 (112 ms), retain 8>
-    | |   |         +-o IOHIDInterface  <class IOHIDInterface, id 0x100000236, registered, matched, active, busy 0 (3 ms), retain 5>
-    | |   |         +-o IOHIDLibUserClient  <class IOHIDLibUserClient, id 0x10000035d, !registered, !matched, active, busy 0, retain 6>
-    | |   +-o USB4 at 1D,3  <class IOPCIDevice, id 0x100000189, registered, matched, active, busy 0 (2390 ms), retain 11>
-    | |   | +-o AppleUSBUHCI  <class AppleUSBUHCI, id 0x1000001c9, registered, matched, active, busy 0 (2038 ms), retain 9>
-    | |   |   +-o UHCI Root Hub Simulation at 1D,3  <class IOUSBRootHubDevice, id 0x10000020e, registered, matched, active, busy 0 (8 ms), retain 10>
-    | |   |   | | {
-    | |   |   | |   "sessionID" = 575818003
-    | |   |   | |   "iManufacturer" = 2
-    | |   |   | |   "bNumConfigurations" = 1
-    | |   |   | |   "idProduct" = 32773
-    | |   |   | |   "bcdDevice" = 272
-    | |   |   | |   "Bus Power Available" = 250
-    | |   |   | |   "bMaxPacketSize0" = 8
-    | |   |   | |   "USB Product Name" = "UHCI Root Hub Simulation"
-    | |   |   | |   "iProduct" = 1
-    | |   |   | |   "iSerialNumber" = 0
-    | |   |   | |   "USB Address" = 1
-    | |   |   | |   "bDeviceClass" = 9
-    | |   |   | |   "locationID" = 2097152000
-    | |   |   | |   "bDeviceSubClass" = 0
-    | |   |   | |   "IOUserClientClass" = "IOUSBDeviceUserClientV2"
-    | |   |   | |   "Ports" = 2
-    | |   |   | |   "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
-    | |   |   | |   "bDeviceProtocol" = 0
-    | |   |   | |   "USB Vendor Name" = "Apple Inc."
-    | |   |   | |   "Device Speed" = 1
-    | |   |   | |   "idVendor" = 1452
-    | |   |   | |   "AAPL,current-in-sleep" = 1000
-    | |   |   | |   "Requested Power" = 0
-    | |   |   | |   "AAPL,port-current-in-sleep" = 500
-    | |   |   | |   "Low Power Displayed" = No
-    | |   |   | | }
-    | |   |   | | 
-    | |   |   | +-o AppleUSBHub  <class AppleUSBHub, id 0x100000212, !registered, !matched, active, busy 0, retain 8>
-    | |   |   | +-o IOUSBInterface at 0  <class IOUSBInterface, id 0x100000215, !registered, !matched, active, busy 0, retain 7>
-    | |   |   +-o WirelessControllerDevice at 7d100000  <class IOUSBDevice, id 0x100000256, registered, matched, active, busy 0 (250 ms), retain 10>
-    | |   |     | {
-    | |   |     |   "sessionID" = 3290864968
-    | |   |     |   "iManufacturer" = 0
-    | |   |     |   "idProduct" = 33285
-    | |   |     |   "bDeviceClass" = 224
-    | |   |     |   "bcdDevice" = 6501
-    | |   |     |   "Bus Power Available" = 250
-    | |   |     |   "bMaxPacketSize0" = 64
-    | |   |     |   "iProduct" = 0
-    | |   |     |   "iSerialNumber" = 0
-    | |   |     |   "USB Address" = 2
-    | |   |     |   "bNumConfigurations" = 1
-    | |   |     |   "IOUserClientClass" = "IOUSBDeviceUserClientV2"
-    | |   |     |   "locationID" = 2098200576
-    | |   |     |   "bDeviceSubClass" = 1
-    | |   |     |   "USB Product Name" = "Bluetooth USB Host Controller"
-    | |   |     |   "non-removable" = "yes"
-    | |   |     |   "PortNum" = 1
-    | |   |     |   "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
-    | |   |     |   "bDeviceProtocol" = 1
-    | |   |     |   "Need contiguous memory for isoch" = Yes
-    | |   |     |   "Device Speed" = 1
-    | |   |     |   "USB Vendor Name" = "Apple Inc."
-    | |   |     |   "idVendor" = 1452
-    | |   |     |   "Requested Power" = 0
-    | |   |     |   "IOGeneralInterest" = "IOCommand is not serializable"
-    | |   |     |   "Low Power Displayed" = No
-    | |   |     | }
-    | |   |     | 
-    | |   |     +-o CSRUSBBluetoothHCIController  <class CSRUSBBluetoothHCIController, id 0x100000258, registered, matched, active, busy 0 (0 ms), retain 10>
-    | |   |     | +-o IOBluetoothHCIUserClient  <class IOBluetoothHCIUserClient, id 0x100000270, !registered, !matched, active, busy 0, retain 5>
-    | |   |     | +-o IOBluetoothHCIUserClient  <class IOBluetoothHCIUserClient, id 0x1000003ba, !registered, !matched, active, busy 0, retain 5>
-    | |   |     +-o IOUSBInterface at 0  <class IOUSBInterface, id 0x10000025a, !registered, !matched, active, busy 0, retain 6>
-    | |   |     +-o IOUSBInterface at 1  <class IOUSBInterface, id 0x10000025b, !registered, !matched, active, busy 0, retain 6>
-    | |   |     +-o IOUSBInterface at 2  <class IOUSBInterface, id 0x10000025c, !registered, !matched, active, busy 0, retain 6>
-    | |   +-o USB7 at 1D,7  <class IOPCIDevice, id 0x10000018d, registered, matched, active, busy 0 (2564 ms), retain 13>
-    | |   | +-o IOService  <class IOService, id 0x1000001ca, !registered, !matched, active, busy 0, retain 4>
-    | |   | +-o AppleUSBEHCI  <class AppleUSBEHCI, id 0x1000001cb, registered, matched, active, busy 0 (2383 ms), retain 14>
-    | |   |   +-o EHCI Root Hub Simulation at 1D,7  <class IOUSBRootHubDevice, id 0x1000001d7, registered, matched, active, busy 0 (32 ms), retain 12>
-    | |   |   | | {
-    | |   |   | |   "sessionID" = 410970048
-    | |   |   | |   "iManufacturer" = 2
-    | |   |   | |   "bNumConfigurations" = 1
-    | |   |   | |   "idProduct" = 32774
-    | |   |   | |   "bcdDevice" = 512
-    | |   |   | |   "Bus Power Available" = 250
-    | |   |   | |   "bMaxPacketSize0" = 64
-    | |   |   | |   "USB Product Name" = "EHCI Root Hub Simulation"
-    | |   |   | |   "iProduct" = 1
-    | |   |   | |   "iSerialNumber" = 0
-    | |   |   | |   "USB Address" = 1
-    | |   |   | |   "bDeviceClass" = 9
-    | |   |   | |   "locationID" = 18446744073659219968
-    | |   |   | |   "bDeviceSubClass" = 0
-    | |   |   | |   "IOUserClientClass" = "IOUSBDeviceUserClientV2"
-    | |   |   | |   "Ports" = 8
-    | |   |   | |   "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
-    | |   |   | |   "bDeviceProtocol" = 1
-    | |   |   | |   "USB Vendor Name" = "Apple Inc."
-    | |   |   | |   "Device Speed" = 2
-    | |   |   | |   "idVendor" = 1452
-    | |   |   | |   "AAPL,current-in-sleep" = 4000
-    | |   |   | |   "Requested Power" = 0
-    | |   |   | |   "AAPL,port-current-in-sleep" = 500
-    | |   |   | |   "Low Power Displayed" = No
-    | |   |   | | }
-    | |   |   | | 
-    | |   |   | +-o AppleUSBHub  <class AppleUSBHub, id 0x1000001e8, registered, matched, active, busy 0 (0 ms), retain 9>
-    | |   |   | +-o IOUSBInterface at 0  <class IOUSBInterface, id 0x1000001ea, !registered, !matched, active, busy 0, retain 7>
-    | |   |   +-o Built-in iSight at fd400000  <class IOUSBDevice, id 0x10000024e, registered, matched, active, busy 0 (50 ms), retain 9>
-    | |   |   | | {
-    | |   |   | |   "sessionID" = 2717373407
-    | |   |   | |   "iManufacturer" = 1
-    | |   |   | |   "bNumConfigurations" = 1
-    | |   |   | |   "idProduct" = 34049
-    | |   |   | |   "bcdDevice" = 393
-    | |   |   | |   "Bus Power Available" = 250
-    | |   |   | |   "bMaxPacketSize0" = 64
-    | |   |   | |   "USB Product Name" = "Built-in iSight"
-    | |   |   | |   "iProduct" = 2
-    | |   |   | |   "iSerialNumber" = 0
-    | |   |   | |   "USB Address" = 2
-    | |   |   | |   "bDeviceClass" = 255
-    | |   |   | |   "locationID" = 18446744073663414272
-    | |   |   | |   "bDeviceSubClass" = 255
-    | |   |   | |   "IOUserClientClass" = "IOUSBDeviceUserClientV2"
-    | |   |   | |   "PortNum" = 4
-    | |   |   | |   "non-removable" = "yes"
-    | |   |   | |   "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
-    | |   |   | |   "bDeviceProtocol" = 255
-    | |   |   | |   "USB Vendor Name" = "Micron"
-    | |   |   | |   "Device Speed" = 2
-    | |   |   | |   "idVendor" = 1452
-    | |   |   | |   "Requested Power" = 50
-    | |   |   | |   "IOGeneralInterest" = "IOCommand is not serializable"
-    | |   |   | |   "kSuspendPort" = Yes
-    | |   |   | |   "Low Power Displayed" = No
-    | |   |   | | }
-    | |   |   | | 
-    | |   |   | +-o IOUSBCompositeDriver  <class IOUSBCompositeDriver, id 0x100000250, !registered, !matched, active, busy 0, retain 4>
-    | |   |   | +-o IOUSBInterface at 0  <class IOUSBInterface, id 0x100000252, registered, matched, active, busy 0 (15 ms), retain 6>
-    | |   |   | +-o IOUSBInterface at 1  <class IOUSBInterface, id 0x100000253, registered, matched, active, busy 0 (15 ms), retain 6>
-    | |   |   +-o Flash Disk at fd300000  <class IOUSBDevice, id 0x100000408, registered, matched, active, busy 0 (499 ms), retain 8>
-    | |   |     | {
-    | |   |     |   "sessionID" = 3995793432240
-    | |   |     |   "iManufacturer" = 1
-    | |   |     |   "bNumConfigurations" = 1
-    | |   |     |   "idProduct" = 24613
-    | |   |     |   "bcdDevice" = 256
-    | |   |     |   "Bus Power Available" = 250
-    | |   |     |   "bMaxPacketSize0" = 64
-    | |   |     |   "USB Product Name" = "Flash Disk"
-    | |   |     |   "iProduct" = 2
-    | |   |     |   "iSerialNumber" = 3
-    | |   |     |   "USB Address" = 3
-    | |   |     |   "bDeviceClass" = 0
-    | |   |     |   "bDeviceSubClass" = 0
-    | |   |     |   "locationID" = 18446744073662365696
-    | |   |     |   "IOUserClientClass" = "IOUSBDeviceUserClientV2"
-    | |   |     |   "kHasMSCInterface" = Yes
-    | |   |     |   "PortNum" = 3
-    | |   |     |   "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
-    | |   |     |   "bDeviceProtocol" = 0
-    | |   |     |   "uid" = "USB:197660250078C5C90000"
-    | |   |     |   "USB Vendor Name" = "CBM"
-    | |   |     |   "Device Speed" = 2
-    | |   |     |   "idVendor" = 6518
-    | |   |     |   "USB Serial Number" = "16270078C5C90000"
-    | |   |     |   "Requested Power" = 50
-    | |   |     |   "IOGeneralInterest" = "IOCommand is not serializable"
-    | |   |     |   "Low Power Displayed" = No
-    | |   |     | }
-    | |   |     | 
-    | |   |     +-o IOUSBCompositeDriver  <class IOUSBCompositeDriver, id 0x10000040a, !registered, !matched, active, busy 0, retain 4>
-    | |   |     +-o IOUSBInterface at 0  <class IOUSBInterface, id 0x10000040b, registered, matched, active, busy 0 (482 ms), retain 7>
-    | |   |       +-o IOUSBMassStorageClass  <class IOUSBMassStorageClass, id 0x10000040d, registered, matched, active, busy 0 (177 ms), retain 8>
-    | |   |         +-o IOSCSIPeripheralDeviceNub  <class IOSCSIPeripheralDeviceNub, id 0x10000040f, registered, matched, active, busy 0 (74 ms), retain 6>
-    | |   |           +-o IOSCSIPeripheralDeviceType00  <class IOSCSIPeripheralDeviceType00, id 0x100000410, !registered, !matched, active, busy 0 (20 ms), retain 7>
-    | |   |             +-o IOBlockStorageServices  <class IOBlockStorageServices, id 0x100000413, registered, matched, active, busy 0 (20 ms), retain 5>
-    | |   |               +-o IOBlockStorageDriver  <class IOBlockStorageDriver, id 0x100000414, registered, matched, active, busy 0 (18 ms), retain 7>
-    | |   |                 +-o CBM Flash Disk Media  <class IOMedia, id 0x100000415, registered, matched, active, busy 0 (16 ms), retain 10>
-    | |   |                   +-o IOMediaBSDClient  <class IOMediaBSDClient, id 0x100000416, registered, matched, active, busy 0 (2 ms), retain 5>
-    | |   |                   +-o IOFDiskPartitionScheme  <class IOFDiskPartitionScheme, id 0x100000419, !registered, !matched, active, busy 0 (10 ms), retain 6>
-    | |   |                     +-o Untitled 1 at 1  <class IOMedia, id 0x10000041b, registered, matched, active, busy 0 (10 ms), retain 9>
-    | |   |                       +-o IOMediaBSDClient  <class IOMediaBSDClient, id 0x10000041c, registered, matched, active, busy 0 (2 ms), retain 6>
-    | |   +-o PCIB at 1E  <class IOPCIDevice, id 0x100000197, registered, matched, active, busy 0 (712 ms), retain 11>
-    | |   | +-o IOPCI2PCIBridge  <class IOPCI2PCIBridge, id 0x1000001cd, registered, matched, active, busy 0 (542 ms), retain 7>
-    | |   |   +-o FRWR at 3  <class IOPCIDevice, id 0x100000198, registered, matched, active, busy 0 (494 ms), retain 10>
-    | |   |     +-o AppleFWOHCI  <class AppleFWOHCI, id 0x1000001d8, !registered, !matched, active, busy 0 (476 ms), retain 6>
-    | |   |       +-o IOFireWireController  <class IOFireWireController, id 0x1000001da, registered, matched, active, busy 0 (476 ms), retain 9>
-    | |   |         +-o IOFireWireLocalNode  <class IOFireWireLocalNode, id 0x100000214, registered, matched, active, busy 0 (476 ms), retain 12>
-    | |   |           +-o IOFireWireUserClientIniter  <class IOFireWireUserClientIniter, id 0x100000216, !registered, !matched, active, busy 0, retain 4>
-    | |   |           +-o IOFireWireUserClientIniter  <class IOFireWireUserClientIniter, id 0x1000002b0, !registered, !matched, active, busy 0, retain 4>
-    | |   |           +-o IOFireWireIP  <class IOFireWireIP, id 0x1000002b1, registered, matched, active, busy 0 (224 ms), retain 5>
-    | |   |             +-o IOFWInterface  <class IOFWInterface, id 0x1000002b9, registered, matched, active, busy 0 (224 ms), retain 10>
-    | |   |               +-o IONetworkStack  <class IONetworkStack, id 0x1000001de, registered, matched, active, busy 0 (2 ms), retain 11>
-    | |   |                 +-o IONetworkStackUserClient  <class IONetworkStackUserClient, id 0x100000266, !registered, !matched, active, busy 0, retain 5>
-    | |   +-o LPCB at 1F  <class IOPCIDevice, id 0x100000199, registered, matched, active, busy 0 (5615 ms), retain 28>
-    | |   | +-o AppleLPC  <class AppleLPC, id 0x100000275, registered, matched, active, busy 0 (3 ms), retain 5>
-    | |   +-o PATA at 1F,1  <class IOPCIDevice, id 0x10000019a, registered, matched, active, busy 0 (10462 ms), retain 13>
-    | |   | +-o AppleIntelPIIXATARoot  <class AppleIntelPIIXATARoot, id 0x1000001d1, !registered, !matched, active, busy 0 (10287 ms), retain 6>
-    | |   |   +-o PRID at 0  <class AppleIntelPIIXATAChannel, id 0x10000019b, registered, matched, active, busy 0 (10287 ms), retain 14>
-    | |   |   | +-o AppleIntelPIIXPATA  <class AppleIntelPIIXPATA, id 0x1000001e2, registered, matched, active, busy 0 (10231 ms), retain 7>
-    | |   |   |   +-o ATADeviceNub at 0  <class ATADeviceNub, id 0x1000001f5, registered, matched, active, busy 0 (10230 ms), retain 6>
-    | |   |   |     +-o IOATAPIProtocolTransport  <class IOATAPIProtocolTransport, id 0x1000001f8, registered, matched, active, busy 0 (10221 ms), retain 8>
-    | |   |   |       +-o IOSCSIPeripheralDeviceNub  <class IOSCSIPeripheralDeviceNub, id 0x1000001fb, registered, matched, active, busy 0 (10013 ms), retain 6>
-    | |   |   |         +-o IOSCSIPeripheralDeviceType05  <class IOSCSIPeripheralDeviceType05, id 0x100000222, !registered, !matched, active, busy 0 (3701 ms), retain 7>
-    | |   |   |           +-o IODVDServices  <class IODVDServices, id 0x100000263, registered, matched, active, busy 0 (3701 ms), retain 6>
-    | |   |   |             +-o IODVDBlockStorageDriver  <class IODVDBlockStorageDriver, id 0x100000264, registered, matched, active, busy 0 (3699 ms), retain 7>
-    | |   |   |             | +-o HL-DT-ST DVDRW GSA-S10N Media  <class IODVDMedia, id 0x100000269, registered, matched, active, busy 0 (3698 ms), retain 10>
-    | |   |   |             |   +-o IODVDMediaBSDClient  <class IODVDMediaBSDClient, id 0x10000026a, registered, matched, active, busy 0 (2 ms), retain 5>
-    | |   |   |             |   +-o IOApplePartitionScheme  <class IOApplePartitionScheme, id 0x1000002f4, !registered, !matched, active, busy 0 (14 ms), retain 8>
-    | |   |   |             |     +-o Apple at 1  <class IOMedia, id 0x1000002f5, registered, matched, active, busy 0 (11 ms), retain 8>
-    | |   |   |             |     | +-o IOMediaBSDClient  <class IOMediaBSDClient, id 0x1000002f8, registered, matched, active, busy 0 (5 ms), retain 5>
-    | |   |   |             |     +-o Macintosh at 2  <class IOMedia, id 0x1000002f6, registered, matched, active, busy 0 (12 ms), retain 8>
-    | |   |   |             |     | +-o IOMediaBSDClient  <class IOMediaBSDClient, id 0x1000002f9, registered, matched, active, busy 0 (5 ms), retain 5>
-    | |   |   |             |     +-o Mac_OS_X at 3  <class IOMedia, id 0x1000002f7, registered, matched, active, busy 0 (14 ms), retain 9>
-    | |   |   |             |       +-o IOMediaBSDClient  <class IOMediaBSDClient, id 0x1000002fa, registered, matched, active, busy 0 (5 ms), retain 6>
-    | |   |   |             +-o SCSITaskUserClientIniter  <class SCSITaskUserClientIniter, id 0x100000265, !registered, !matched, active, busy 0, retain 4>
-    | |   |   +-o CHN1 at 1  <class AppleIntelPIIXATAChannel, id 0x1000001d2, registered, matched, active, busy 0 (75 ms), retain 6>
-    | |   +-o SATA at 1F,2  <class IOPCIDevice, id 0x10000019e, registered, matched, active, busy 0 (387 ms), retain 13>
-    | |   | +-o AppleAHCI  <class AppleAHCI, id 0x1000001d3, registered, matched, active, busy 0 (208 ms), retain 7>
-    | |   |   +-o PRT2 at 2  <class AppleAHCIPort, id 0x1000001a0, registered, matched, active, busy 0 (170 ms), retain 10>
-    | |   |     +-o IOAHCIDevice at 0  <class IOAHCIDevice, id 0x1000001eb, registered, matched, active, busy 0 (170 ms), retain 11>
-    | |   |       +-o AppleAHCIDiskDriver  <class AppleAHCIDiskDriver, id 0x1000001ec, registered, matched, active, busy 0 (51 ms), retain 6>
-    | |   |         +-o IOAHCIBlockStorageDevice  <class IOAHCIBlockStorageDevice, id 0x100000203, registered, matched, active, busy 0 (51 ms), retain 6>
-    | |   |           +-o IOBlockStorageDriver  <class IOBlockStorageDriver, id 0x100000207, registered, matched, active, busy 0 (49 ms), retain 7>
-    | |   |             +-o FUJITSU MHY2120BH Media  <class IOMedia, id 0x100000208, registered, matched, active, busy 0 (49 ms), retain 10>
-    | |   |               +-o IOMediaBSDClient  <class IOMediaBSDClient, id 0x10000020f, registered, matched, active, busy 0 (0 ms), retain 5>
-    | |   |               +-o IOGUIDPartitionScheme  <class IOGUIDPartitionScheme, id 0x10000021b, !registered, !matched, active, busy 0 (13 ms), retain 7>
-    | |   |                 +-o EFI System Partition at 1  <class IOMedia, id 0x10000021e, registered, matched, active, busy 0 (3 ms), retain 8>
-    | |   |                 | +-o IOMediaBSDClient  <class IOMediaBSDClient, id 0x100000220, registered, matched, active, busy 0 (1 ms), retain 5>
-    | |   |                 +-o Untitled at 2  <class IOMedia, id 0x10000021f, registered, matched, active, busy 0 (13 ms), retain 10>
-    | |   |                   +-o IOMediaBSDClient  <class IOMediaBSDClient, id 0x100000221, registered, matched, active, busy 0 (1 ms), retain 6>
-    | |   +-o SBUS at 1F,3  <class IOPCIDevice, id 0x1000001a1, registered, matched, active, busy 0 (203 ms), retain 8>
-    | +-o PDRC  <class IOACPIPlatformDevice, id 0x100000130, registered, matched, active, busy 0 (9 ms), retain 6>
-    | +-o SMC  <class IOACPIPlatformDevice, id 0x10000015f, registered, matched, active, busy 0 (451 ms), retain 9>
-    | | +-o AppleSMC  <class AppleSMC, id 0x1000002ae, registered, matched, active, busy 0 (191 ms), retain 6>
-    | |   +-o SMCWatchDogTimer  <class SMCWatchDogTimer, id 0x1000002b3, registered, matched, active, busy 0 (129 ms), retain 5>
-    | +-o SMS0  <class IOACPIPlatformDevice, id 0x100000160, registered, matched, active, busy 0 (377 ms), retain 7>
-    | | +-o SMCMotionSensor  <class SMCMotionSensor, id 0x1000002dc, registered, matched, active, busy 0 (2 ms), retain 5>
-    | +-o EC  <class IOACPIPlatformDevice, id 0x100000161, registered, matched, active, busy 0 (245 ms), retain 10>
-    | | +-o AppleACPIEC  <class AppleACPIEC, id 0x100000124, !registered, !matched, active, busy 0, retain 6>
-    | +-o SMB0  <class IOACPIPlatformDevice, id 0x100000162, registered, matched, active, busy 0 (34 ms), retain 9>
-    | | +-o AppleECSMBusController  <class AppleECSMBusController, id 0x1000001ed, registered, matched, active, busy 0 (16 ms), retain 5>
-    | |   +-o AppleSmartBatteryManager  <class AppleSmartBatteryManager, id 0x1000001ee, registered, matched, active, busy 0 (3 ms), retain 6>
-    | |     +-o AppleSmartBattery  <class AppleSmartBattery, id 0x1000001f0, registered, matched, active, busy 0 (0 ms), retain 5>
-    | +-o SBS0  <class IOACPIPlatformDevice, id 0x100000163, registered, matched, active, busy 0 (19 ms), retain 6>
-    | +-o DMAC  <class IOACPIPlatformDevice, id 0x100000164, registered, matched, active, busy 0 (21 ms), retain 6>
-    | +-o FWHD  <class IOACPIPlatformDevice, id 0x100000165, registered, matched, active, busy 0 (22 ms), retain 6>
-    | +-o HPET  <class IOACPIPlatformDevice, id 0x100000166, registered, matched, active, busy 0 (24 ms), retain 7>
-    | | +-o AppleHPET  <class AppleHPET, id 0x1000001bc, !registered, !matched, active, busy 0, retain 4>
-    | +-o IPIC  <class IOACPIPlatformDevice, id 0x100000167, registered, matched, active, busy 0 (25 ms), retain 6>
-    | +-o MATH  <class IOACPIPlatformDevice, id 0x100000168, registered, matched, active, busy 0 (26 ms), retain 6>
-    | +-o LDRC  <class IOACPIPlatformDevice, id 0x100000169, registered, matched, active, busy 0 (27 ms), retain 6>
-    | +-o RTC  <class IOACPIPlatformDevice, id 0x10000016a, registered, matched, active, busy 0 (38 ms), retain 8>
-    | | +-o AppleRTC  <class AppleRTC, id 0x1000001bd, registered, matched, active, busy 0 (1 ms), retain 6>
-    | +-o TIMR  <class IOACPIPlatformDevice, id 0x10000016b, registered, matched, active, busy 0 (29 ms), retain 6>
-    | +-o AppleEFIRuntime  <class AppleEFIRuntime, id 0x1000001be, registered, matched, active, busy 0 (297 ms), retain 7>
-    | | +-o AppleEFINVRAM  <class AppleEFINVRAM, id 0x1000001bf, registered, matched, active, busy 0 (1 ms), retain 7>
-    | +-o IOPCIMessagedInterruptController  <class IOPCIMessagedInterruptController, id 0x1000001c1, registered, matched, active, busy 0 (2 ms), retain 6>
-    | +-o AppleRawIOAddressSpace  <class AppleRawIOAddressSpace, id 0x10000028a, registered, matched, active, busy 0 (2 ms), retain 4>
-    | +-o AppleRawPhysicalMemoryAddressSpace  <class AppleRawPhysicalMemoryAddressSpace, id 0x10000028b, registered, matched, active, busy 0 (4 ms), retain 4>
-    +-o IOResources  <class IOResources, id 0x100000113, registered, matched, active, busy 0 (824 ms), retain 24>
-      +-o AppleIntelCPUPowerManagement  <class AppleIntelCPUPowerManagement, id 0x10000011b, registered, matched, active, busy 0 (252 ms), retain 5>
-      | +-o AppleIntelCPUPowerManagementClient  <class AppleIntelCPUPowerManagementClient, id 0x100000120, !registered, !matched, active, busy 0, retain 4>
-      +-o IOHDIXController  <class IOHDIXController, id 0x10000011c, registered, matched, active, busy 0 (2 ms), retain 4>
-      +-o com_apple_AppleFSCompression_AppleFSCompressionTypeZlib  <class com_apple_AppleFSCompression_AppleFSCompressionTypeZlib, id 0x1000001dc, !registered, !matched, active, busy 0, retain 4>
-      +-o com_apple_BootCache  <class com_apple_BootCache, id 0x1000001dd, !registered, !matched, active, busy 0, retain 4>
-      +-o IONetworkStack  <class IONetworkStack, id 0x1000001de, registered, matched, active, busy 0 (2 ms), retain 11>
-      | +-o IONetworkStackUserClient  <class IONetworkStackUserClient, id 0x100000266, !registered, !matched, active, busy 0, retain 5>
-      +-o IOHIDSystem  <class IOHIDSystem, id 0x1000001df, registered, matched, active, busy 0 (3 ms), retain 15>
-      | +-o IOHIDUserClient  <class IOHIDUserClient, id 0x10000031a, !registered, !matched, active, busy 0, retain 5>
-      | +-o IOHIDParamUserClient  <class IOHIDParamUserClient, id 0x10000031b, !registered, !matched, active, busy 0, retain 5>
-      | +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000032a, !registered, !matched, active, busy 0, retain 5>
-      | +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000032b, !registered, !matched, active, busy 0, retain 5>
-      +-o AppleProfileOSHooks  <class AppleProfileOSHooks, id 0x100000281, registered, matched, active, busy 0 (187 ms), retain 15>
-      | +-o AppleProfileTimeTrigger  <class AppleProfileTimeTrigger, id 0x10000028f, registered, matched, active, busy 0 (168 ms), retain 6>
-      | +-o AppleProfilePMITrigger  <class AppleProfilePMITrigger, id 0x100000290, registered, matched, active, busy 0 (168 ms), retain 6>
-      | +-o AppleOSXPerformanceMonitor  <class AppleOSXPerformanceMonitor, id 0x100000291, !registered, !matched, active, busy 0 (173 ms), retain 6>
-      | | +-o AppleOSXPerformanceCounter  <class AppleOSXPerformanceCounter, id 0x10000029c, registered, matched, active, busy 0 (170 ms), retain 6>
-      | | | +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x100000292, registered, matched, active, busy 0 (175 ms), retain 18>
-      | | |   +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x1000002d4, !registered, !matched, active, busy 0, retain 5>
-      | | +-o AppleOSXPerformanceCounter  <class AppleOSXPerformanceCounter, id 0x10000029d, registered, matched, active, busy 0 (173 ms), retain 6>
-      | |   +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x100000292, registered, matched, active, busy 0 (175 ms), retain 18>
-      | |     +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x1000002d4, !registered, !matched, active, busy 0, retain 5>
-      | +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x100000292, registered, matched, active, busy 0 (175 ms), retain 17>
-      | | +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x1000002d4, !registered, !matched, active, busy 0, retain 5>
-      | +-o AppleProfileKEventTrigger  <class AppleProfileKEventTrigger, id 0x100000293, registered, matched, active, busy 0 (175 ms), retain 6>
-      | +-o AppleProfileManualTrigger  <class AppleProfileManualTrigger, id 0x100000294, registered, matched, active, busy 0 (2 ms), retain 6>
-      | +-o AppleProfileCallstackAction  <class AppleProfileCallstackAction, id 0x100000295, !registered, !matched, active, busy 0, retain 5>
-      | +-o AppleProfileKEventAction  <class AppleProfileKEventAction, id 0x100000296, !registered, !matched, active, busy 0, retain 5>
-      | +-o AppleProfileRegisterStateAction  <class AppleProfileRegisterStateAction, id 0x100000297, !registered, !matched, active, busy 0, retain 5>
-      | +-o AppleProfileThreadInfoAction  <class AppleProfileThreadInfoAction, id 0x100000298, !registered, !matched, active, busy 0, retain 5>
-      | +-o AppleProfileTimestampAction  <class AppleProfileTimestampAction, id 0x100000299, !registered, !matched, active, busy 0, retain 5>
-      +-o com_apple_driver_AudioIPCDevice  <class com_apple_driver_AudioIPCDevice, id 0x100000282, registered, matched, active, busy 0 (165 ms), retain 6>
-      | +-o com_apple_driver_AudioIPCEngine  <class com_apple_driver_AudioIPCEngine, id 0x10000028c, registered, matched, active, busy 0 (164 ms), retain 9>
-      |   +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000333, !registered, !matched, active, busy 0, retain 6>
-      |   +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000365, !registered, !matched, active, busy 0, retain 6>
-      |   +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000394, !registered, !matched, active, busy 0, retain 6>
-      |   +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x1000003a4, !registered, !matched, active, busy 0, retain 6>
-      +-o CHUDKernLib  <class CHUDKernLib, id 0x100000283, registered, matched, active, busy 0 (170 ms), retain 4>
-      +-o CHUDProf  <class CHUDProf, id 0x100000284, registered, matched, active, busy 0 (307 ms), retain 4>
-      +-o CHUDUtils  <class CHUDUtils, id 0x100000285, registered, matched, active, busy 0 (310 ms), retain 4>
-      +-o Dont_Steal_Mac_OS_X  <class Dont_Steal_Mac_OS_X, id 0x100000286, !registered, !matched, active, busy 0, retain 5>
-      +-o IOBluetoothSerialManager  <class IOBluetoothSerialManager, id 0x100000287, registered, matched, active, busy 0 (376 ms), retain 7>
-      | +-o IOBluetoothSerialClient  <class IOBluetoothSerialClient, id 0x1000002d3, !registered, !matched, active, busy 0 (133 ms), retain 5>
-      | | +-o IOBluetoothSerialClientSerialStreamSync  <class IOBluetoothSerialClientSerialStreamSync, id 0x1000002d5, registered, matched, active, busy 0 (133 ms), retain 5>
-      | |   +-o IOSerialBSDClient  <class IOSerialBSDClient, id 0x1000002df, registered, matched, active, busy 0 (6 ms), retain 4>
-      | +-o IOBluetoothSerialClient  <class IOBluetoothSerialClient, id 0x1000002de, !registered, !matched, active, busy 0 (76 ms), retain 5>
-      |   +-o IOBluetoothSerialClientModemStreamSync  <class IOBluetoothSerialClientModemStreamSync, id 0x1000002e0, registered, matched, active, busy 0 (76 ms), retain 5>
-      |     +-o IOSerialBSDClient  <class IOSerialBSDClient, id 0x1000002e8, registered, matched, active, busy 0 (6 ms), retain 4>
-      +-o IODisplayWrangler  <class IODisplayWrangler, id 0x100000288, registered, matched, active, busy 0 (169 ms), retain 7>
-      | +-o IOAccelerationUserClient  <class IOAccelerationUserClient, id 0x100000370, !registered, !matched, active, busy 0, retain 5>
-      +-o IOSurfaceRoot  <class IOSurfaceRoot, id 0x100000289, registered, matched, active, busy 0 (171 ms), retain 5>
-      +-o AppleSCSISubsystemGlobals  <class AppleSCSISubsystemGlobals, id 0x1000002fd, registered, matched, active, busy 0 (1 ms), retain 5>
diff --git a/resources/macos/ioreg/IOUSBDevice1 b/resources/macos/ioreg/IOUSBDevice1
new file mode 100644
index 0000000..3d58b39
--- /dev/null
+++ b/resources/macos/ioreg/IOUSBDevice1
@@ -0,0 +1,748 @@
++-o Root  <class IORegistryEntry, id 0x100000100, retain 13>
+  +-o MacBook2,1  <class IOPlatformExpertDevice, id 0x100000110, registered, matched, active, busy 0 (16937 ms), retain 25>
+    +-o AppleACPIPlatformExpert  <class AppleACPIPlatformExpert, id 0x100000111, registered, matched, active, busy 0 (15867 ms), retain 38>
+    | +-o IOPMrootDomain  <class IOPMrootDomain, id 0x100000114, registered, matched, active, busy 0 (12 ms), retain 48>
+    | | +-o IORootParent  <class IORootParent, id 0x100000115, !registered, !matched, active, busy 0, retain 7>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000267, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000268, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x10000026d, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x10000026e, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000271, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000272, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x1000002ed, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000319, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000329, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x10000032f, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000332, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000363, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000364, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x10000036d, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x10000036e, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x10000036f, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000371, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000392, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000393, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x1000003a1, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x1000003a2, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x1000003a3, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x1000003b9, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x1000003bc, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x10000041e, !registered, !matched, active, busy 0, retain 5>
+    | +-o cpus  <class IOPlatformDevice, id 0x100000117, registered, matched, active, busy 0 (4 ms), retain 7>
+    | +-o CPU0 at 0  <class IOACPIPlatformDevice, id 0x100000118, registered, matched, active, busy 0 (418 ms), retain 7>
+    | | +-o AppleACPICPU  <class AppleACPICPU, id 0x10000011d, registered, matched, active, busy 0 (406 ms), retain 9>
+    | |   +-o AppleACPICPUInterruptController  <class AppleACPICPUInterruptController, id 0x10000011f, registered, matched, active, busy 0 (1 ms), retain 5>
+    | |   +-o ACPI_SMC_PlatformPlugin  <class ACPI_SMC_PlatformPlugin, id 0x10000027b, registered, matched, active, busy 0 (8 ms), retain 9>
+    | |   +-o AppleIntelMeromPerformanceMonitor  <class AppleIntelMeromPerformanceMonitor, id 0x10000027c, !registered, !matched, active, busy 0 (145 ms), retain 9>
+    | |   | +-o AppleIntelMeromGeneralPurposeCounter  <class AppleIntelMeromGeneralPurposeCounter, id 0x1000002ce, registered, matched, active, busy 0 (125 ms), retain 7>
+    | |   | | +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x100000292, registered, matched, active, busy 0 (175 ms), retain 17>
+    | |   | |   +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x1000002d4, !registered, !matched, active, busy 0, retain 5>
+    | |   | +-o AppleIntelMeromGeneralPurposeCounter  <class AppleIntelMeromGeneralPurposeCounter, id 0x1000002cf, registered, matched, active, busy 0 (126 ms), retain 7>
+    | |   | | +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x100000292, registered, matched, active, busy 0 (175 ms), retain 17>
+    | |   | |   +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x1000002d4, !registered, !matched, active, busy 0, retain 5>
+    | |   | +-o AppleIntelMeromFixedCounter  <class AppleIntelMeromFixedCounter, id 0x1000002d0, registered, matched, active, busy 0 (133 ms), retain 7>
+    | |   | | +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x100000292, registered, matched, active, busy 0 (175 ms), retain 17>
+    | |   | |   +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x1000002d4, !registered, !matched, active, busy 0, retain 5>
+    | |   | +-o AppleIntelMeromFixedCounter  <class AppleIntelMeromFixedCounter, id 0x1000002d1, registered, matched, active, busy 0 (145 ms), retain 7>
+    | |   | | +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x100000292, registered, matched, active, busy 0 (175 ms), retain 17>
+    | |   | |   +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x1000002d4, !registered, !matched, active, busy 0, retain 5>
+    | |   | +-o AppleIntelMeromFixedCounter  <class AppleIntelMeromFixedCounter, id 0x1000002d2, registered, matched, active, busy 0 (133 ms), retain 7>
+    | |   |   +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x100000292, registered, matched, active, busy 0 (175 ms), retain 17>
+    | |   |     +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x1000002d4, !registered, !matched, active, busy 0, retain 5>
+    | |   +-o AppleIntelMeromSPR  <class AppleIntelMeromSPR, id 0x1000002b4, registered, matched, active, busy 0 (135 ms), retain 4>
+    | +-o CPU1 at 1  <class IOACPIPlatformDevice, id 0x100000119, registered, matched, active, busy 0 (392 ms), retain 7>
+    | | +-o AppleACPICPU  <class AppleACPICPU, id 0x10000011e, registered, matched, active, busy 0 (374 ms), retain 7>
+    | |   +-o AppleIntelMeromPerformanceMonitor  <class AppleIntelMeromPerformanceMonitor, id 0x1000002ba, !registered, !matched, active, busy 0 (124 ms), retain 9>
+    | |   | +-o AppleIntelMeromGeneralPurposeCounter  <class AppleIntelMeromGeneralPurposeCounter, id 0x1000002c2, registered, matched, active, busy 0 (3 ms), retain 7>
+    | |   | | +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x100000292, registered, matched, active, busy 0 (175 ms), retain 17>
+    | |   | |   +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x1000002d4, !registered, !matched, active, busy 0, retain 5>
+    | |   | +-o AppleIntelMeromGeneralPurposeCounter  <class AppleIntelMeromGeneralPurposeCounter, id 0x1000002c4, registered, matched, active, busy 0 (6 ms), retain 7>
+    | |   | | +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x100000292, registered, matched, active, busy 0 (175 ms), retain 17>
+    | |   | |   +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x1000002d4, !registered, !matched, active, busy 0, retain 5>
+    | |   | +-o AppleIntelMeromFixedCounter  <class AppleIntelMeromFixedCounter, id 0x1000002c5, registered, matched, active, busy 0 (120 ms), retain 7>
+    | |   | | +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x100000292, registered, matched, active, busy 0 (175 ms), retain 17>
+    | |   | |   +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x1000002d4, !registered, !matched, active, busy 0, retain 5>
+    | |   | +-o AppleIntelMeromFixedCounter  <class AppleIntelMeromFixedCounter, id 0x1000002c6, registered, matched, active, busy 0 (122 ms), retain 7>
+    | |   | | +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x100000292, registered, matched, active, busy 0 (175 ms), retain 17>
+    | |   | |   +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x1000002d4, !registered, !matched, active, busy 0, retain 5>
+    | |   | +-o AppleIntelMeromFixedCounter  <class AppleIntelMeromFixedCounter, id 0x1000002c7, registered, matched, active, busy 0 (124 ms), retain 7>
+    | |   |   +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x100000292, registered, matched, active, busy 0 (175 ms), retain 17>
+    | |   |     +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x1000002d4, !registered, !matched, active, busy 0, retain 5>
+    | |   +-o AppleIntelMeromSPR  <class AppleIntelMeromSPR, id 0x1000002bb, registered, matched, active, busy 0 (125 ms), retain 4>
+    | +-o io-apic at fec00000  <class IOACPIPlatformDevice, id 0x10000011a, registered, matched, active, busy 0 (4 ms), retain 6>
+    | | +-o AppleAPICInterruptController  <class AppleAPICInterruptController, id 0x100000121, registered, matched, active, busy 0 (1 ms), retain 11>
+    | +-o AppleACPIEventController  <class AppleACPIEventController, id 0x100000122, !registered, !matched, active, busy 0, retain 6>
+    | +-o boot-ec  <class IOACPIPlatformDevice, id 0x100000123, registered, matched, active, busy 0 (3 ms), retain 6>
+    | | +-o AppleACPIEC  <class AppleACPIEC, id 0x100000124, !registered, !matched, active, busy 0, retain 6>
+    | +-o bios  <class IOPlatformDevice, id 0x100000125, registered, matched, active, busy 0 (4 ms), retain 5>
+    | | +-o AppleSMBIOS  <class AppleSMBIOS, id 0x100000126, registered, matched, active, busy 0 (1 ms), retain 4>
+    | +-o ADP1  <class IOACPIPlatformDevice, id 0x10000012a, registered, matched, active, busy 0 (2 ms), retain 7>
+    | | +-o AppleACPIACAdapter  <class AppleACPIACAdapter, id 0x1000001a2, !registered, !matched, active, busy 0, retain 4>
+    | +-o LID0  <class IOACPIPlatformDevice, id 0x10000012b, registered, matched, active, busy 0 (3 ms), retain 9>
+    | | +-o AppleACPILid  <class AppleACPILid, id 0x1000001a3, !registered, !matched, active, busy 0, retain 5>
+    | +-o PNLF  <class IOACPIPlatformDevice, id 0x10000012c, registered, matched, active, busy 0 (13 ms), retain 7>
+    | | +-o AppleIntelPanelA  <class AppleIntelPanelA, id 0x100000273, !registered, !matched, active, busy 0, retain 5>
+    | +-o PWRB  <class IOACPIPlatformDevice, id 0x10000012d, registered, matched, active, busy 0 (5 ms), retain 8>
+    | | +-o AppleACPIButton  <class AppleACPIButton, id 0x1000001a4, !registered, !matched, active, busy 0, retain 4>
+    | +-o SLPB  <class IOACPIPlatformDevice, id 0x10000012e, registered, matched, active, busy 0 (6 ms), retain 7>
+    | | +-o AppleACPIButton  <class AppleACPIButton, id 0x1000001a5, !registered, !matched, active, busy 0, retain 4>
+    | +-o PCI0 at 0  <class IOACPIPlatformDevice, id 0x10000012f, registered, matched, active, busy 0 (15786 ms), retain 43>
+    | | +-o AppleACPIPCI  <class AppleACPIPCI, id 0x1000001a6, registered, matched, active, busy 0 (15772 ms), retain 40>
+    | |   +-o pci8086,27a0 at 0  <class IOPCIDevice, id 0x1000001a8, registered, matched, active, busy 0 (5445 ms), retain 8>
+    | |   | +-o AppleSMCPDRC  <class AppleSMCPDRC, id 0x1000002a9, registered, matched, active, busy 0 (1 ms), retain 4>
+    | |   +-o GFX0 at 2  <class IOPCIDevice, id 0x100000174, registered, matched, active, busy 0 (551 ms), retain 17>
+    | |   | +-o AppleIntelIntegratedFramebuffer  <class AppleIntelIntegratedFramebuffer, id 0x1000002b5, !registered, !matched, active, busy 0, retain 6>
+    | |   | +-o AppleIntelFramebuffer  <class AppleIntelFramebuffer, id 0x1000002d8, registered, matched, active, busy 0 (239 ms), retain 14>
+    | |   | | +-o AppleMCCSControlModule  <class AppleMCCSControlModule, id 0x1000002e2, registered, matched, active, busy 0 (79 ms), retain 5>
+    | |   | | | +-o AppleMCCSParameterHandler  <class AppleMCCSParameterHandler, id 0x1000002eb, registered, matched, active, busy 0 (6 ms), retain 4>
+    | |   | | +-o AppleUpstreamUserClientDriver  <class AppleUpstreamUserClientDriver, id 0x1000002e3, registered, matched, active, busy 0 (3 ms), retain 4>
+    | |   | | +-o IOFramebufferI2CInterface  <class IOFramebufferI2CInterface, id 0x10000031c, registered, matched, active, busy 0 (3 ms), retain 5>
+    | |   | | +-o display0  <class IODisplayConnect, id 0x10000031d, registered, matched, active, busy 0 (28 ms), retain 5>
+    | |   | | | +-o AppleBacklightDisplay  <class AppleBacklightDisplay, id 0x10000031e, registered, matched, active, busy 0 (2 ms), retain 8>
+    | |   | | +-o IOFramebufferUserClient  <class IOFramebufferUserClient, id 0x100000325, !registered, !matched, active, busy 0, retain 5>
+    | |   | +-o AppleIntelFramebuffer  <class AppleIntelFramebuffer, id 0x1000002da, registered, matched, active, busy 0 (212 ms), retain 12>
+    | |   | | +-o AppleMCCSControlModule  <class AppleMCCSControlModule, id 0x1000002e5, registered, matched, active, busy 0 (8 ms), retain 5>
+    | |   | | | +-o AppleMCCSParameterHandler  <class AppleMCCSParameterHandler, id 0x1000002e9, registered, matched, active, busy 0 (6 ms), retain 4>
+    | |   | | +-o AppleUpstreamUserClientDriver  <class AppleUpstreamUserClientDriver, id 0x1000002e6, registered, matched, active, busy 0 (5 ms), retain 4>
+    | |   | | +-o IOFramebufferI2CInterface  <class IOFramebufferI2CInterface, id 0x100000324, registered, matched, active, busy 0 (3 ms), retain 5>
+    | |   | | +-o IOFramebufferUserClient  <class IOFramebufferUserClient, id 0x100000327, !registered, !matched, active, busy 0, retain 5>
+    | |   | +-o Intel915  <class Intel915, id 0x1000002b7, registered, matched, active, busy 0 (2 ms), retain 18>
+    | |   |   +-o Intel9152DContext  <class Intel9152DContext, id 0x100000326, !registered, !matched, active, busy 0, retain 5>
+    | |   |   +-o Intel9152DContext  <class Intel9152DContext, id 0x100000328, !registered, !matched, active, busy 0, retain 5>
+    | |   |   +-o Intel915Device  <class Intel915Device, id 0x10000032d, !registered, !matched, active, busy 0, retain 5>
+    | |   |   +-o Intel915GLContext  <class Intel915GLContext, id 0x10000032e, !registered, !matched, active, busy 0, retain 5>
+    | |   |   +-o Intel915Surface  <class Intel915Surface, id 0x10000035e, !registered, !matched, active, busy 0, retain 5>
+    | |   |   +-o Intel915Surface  <class Intel915Surface, id 0x100000372, !registered, !matched, active, busy 0, retain 5>
+    | |   |   +-o Intel915GLContext  <class Intel915GLContext, id 0x100000373, !registered, !matched, active, busy 0, retain 5>
+    | |   |   +-o Intel915Surface  <class Intel915Surface, id 0x100000384, !registered, !matched, active, busy 0, retain 5>
+    | |   |   +-o Intel915Surface  <class Intel915Surface, id 0x100000385, !registered, !matched, active, busy 0, retain 5>
+    | |   |   +-o Intel915Surface  <class Intel915Surface, id 0x100000391, !registered, !matched, active, busy 0, retain 5>
+    | |   |   +-o Intel915Device  <class Intel915Device, id 0x1000003be, !registered, !matched, active, busy 0, retain 5>
+    | |   |   +-o Intel915GLContext  <class Intel915GLContext, id 0x1000003bf, !registered, !matched, active, busy 0, retain 5>
+    | |   |   +-o Intel915GLContext  <class Intel915GLContext, id 0x1000003c0, !registered, !matched, active, busy 0, retain 5>
+    | |   |   +-o Intel915Surface  <class Intel915Surface, id 0x1000003c1, !registered, !matched, active, busy 0, retain 5>
+    | |   +-o display at 2,1  <class IOPCIDevice, id 0x1000001a9, registered, matched, active, busy 0 (637 ms), retain 9>
+    | |   | +-o IONDRVFramebuffer  <class IONDRVFramebuffer, id 0x100000277, registered, matched, active, busy 0 (458 ms), retain 7>
+    | |   |   +-o AppleMCCSControlModule  <class AppleMCCSControlModule, id 0x1000002ac, registered, matched, active, busy 0 (125 ms), retain 5>
+    | |   |   | +-o AppleMCCSParameterHandler  <class AppleMCCSParameterHandler, id 0x1000002dd, registered, matched, active, busy 0 (4 ms), retain 4>
+    | |   |   +-o AppleUpstreamUserClientDriver  <class AppleUpstreamUserClientDriver, id 0x1000002ad, registered, matched, active, busy 0 (107 ms), retain 4>
+    | |   +-o pci8086,27a3 at 7  <class IOPCIDevice, id 0x1000001aa, registered, matched, active, busy 0 (32 ms), retain 7>
+    | |   +-o HDEF at 1B  <class IOPCIDevice, id 0x100000178, registered, matched, active, busy 0 (739 ms), retain 10>
+    | |   | +-o AppleHDAController at 1B  <class AppleHDAController, id 0x100000280, registered, matched, active, busy 0 (348 ms), retain 7>
+    | |   |   +-o IOHDACodecDevice at 1B,0  <class IOHDACodecDevice, id 0x1000002a8, registered, matched, active, busy 0 (348 ms), retain 6>
+    | |   |     +-o IOHDACodecDriver  <class IOHDACodecDriver, id 0x1000002d6, !registered, !matched, active, busy 0 (261 ms), retain 5>
+    | |   |       +-o IOHDACodecFunction at 1B,0,1  <class IOHDACodecFunction, id 0x1000002d7, registered, matched, active, busy 0 (261 ms), retain 6>
+    | |   |         +-o AppleHDACodecGeneric  <class AppleHDACodecGeneric, id 0x1000002e1, registered, matched, active, busy 0 (101 ms), retain 5>
+    | |   |           +-o AppleHDADriver  <class AppleHDADriver, id 0x1000002ec, registered, matched, active, busy 0 (21 ms), retain 8>
+    | |   |             +-o AppleHDAEngineOutput at 1B,0,1,2  <class AppleHDAEngineOutput, id 0x100000302, registered, matched, active, busy 0 (9 ms), retain 28>
+    | |   |             | +-o AppleHDAStream  <class AppleHDAStream, id 0x100000303, registered, matched, active, busy 0 (5 ms), retain 8>
+    | |   |             | +-o IOAudioSelectorControl  <class IOAudioSelectorControl, id 0x100000304, !registered, !matched, active, busy 0 (0 ms), retain 12>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000033f, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000039c, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003b4, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioLevelControl  <class IOAudioLevelControl, id 0x100000305, !registered, !matched, active, busy 0 (0 ms), retain 12>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000340, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000039d, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003b5, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioLevelControl  <class IOAudioLevelControl, id 0x100000306, !registered, !matched, active, busy 0 (0 ms), retain 12>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000341, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000039e, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003b6, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioToggleControl  <class IOAudioToggleControl, id 0x100000307, !registered, !matched, active, busy 0 (0 ms), retain 12>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000342, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000039f, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003b7, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioToggleControl  <class IOAudioToggleControl, id 0x100000308, !registered, !matched, active, busy 0 (0 ms), retain 12>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000343, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003a0, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003b8, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o AudioAUUCDriver  <class AudioAUUCDriver, id 0x10000030a, registered, matched, active, busy 0 (4 ms), retain 4>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000336, !registered, !matched, active, busy 0, retain 7>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000347, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000368, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x10000036c, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000397, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x10000039b, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x1000003a7, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x1000003ab, !registered, !matched, active, busy 0, retain 6>
+    | |   |             +-o AppleHDAEngineInput at 1B,0,1,0  <class AppleHDAEngineInput, id 0x100000309, registered, matched, active, busy 0 (6 ms), retain 24>
+    | |   |             | +-o AppleHDAStream  <class AppleHDAStream, id 0x10000030b, registered, matched, active, busy 0 (5 ms), retain 7>
+    | |   |             | +-o IOAudioSelectorControl  <class IOAudioSelectorControl, id 0x10000030c, !registered, !matched, active, busy 0 (0 ms), retain 10>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000033b, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003ac, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioLevelControl  <class IOAudioLevelControl, id 0x10000030d, !registered, !matched, active, busy 0 (0 ms), retain 10>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000033c, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003ad, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioLevelControl  <class IOAudioLevelControl, id 0x10000030e, !registered, !matched, active, busy 0 (0 ms), retain 10>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000033d, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003ae, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioToggleControl  <class IOAudioToggleControl, id 0x10000030f, !registered, !matched, active, busy 0 (0 ms), retain 18>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000033e, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000345, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000036a, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000399, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003a9, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003af, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000335, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000346, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000367, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x10000036b, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000396, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x10000039a, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x1000003a6, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x1000003aa, !registered, !matched, active, busy 0, retain 6>
+    | |   |             +-o AppleHDAEngineInput at 1B,0,1,1  <class AppleHDAEngineInput, id 0x100000310, registered, matched, active, busy 0 (6 ms), retain 24>
+    | |   |               +-o AppleHDAStream  <class AppleHDAStream, id 0x100000311, registered, matched, active, busy 0 (5 ms), retain 7>
+    | |   |               +-o IOAudioSelectorControl  <class IOAudioSelectorControl, id 0x100000313, !registered, !matched, active, busy 0 (0 ms), retain 10>
+    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000337, !registered, !matched, active, busy 0, retain 6>
+    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003b0, !registered, !matched, active, busy 0, retain 6>
+    | |   |               +-o IOAudioLevelControl  <class IOAudioLevelControl, id 0x100000314, !registered, !matched, active, busy 0 (0 ms), retain 10>
+    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000338, !registered, !matched, active, busy 0, retain 6>
+    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003b1, !registered, !matched, active, busy 0, retain 6>
+    | |   |               +-o IOAudioLevelControl  <class IOAudioLevelControl, id 0x100000315, !registered, !matched, active, busy 0 (0 ms), retain 10>
+    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000339, !registered, !matched, active, busy 0, retain 6>
+    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003b2, !registered, !matched, active, busy 0, retain 6>
+    | |   |               +-o IOAudioToggleControl  <class IOAudioToggleControl, id 0x100000316, !registered, !matched, active, busy 0 (0 ms), retain 10>
+    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000033a, !registered, !matched, active, busy 0, retain 6>
+    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003b3, !registered, !matched, active, busy 0, retain 6>
+    | |   |               +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000334, !registered, !matched, active, busy 0, retain 6>
+    | |   |               +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000344, !registered, !matched, active, busy 0, retain 6>
+    | |   |               +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000366, !registered, !matched, active, busy 0, retain 6>
+    | |   |               +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000369, !registered, !matched, active, busy 0, retain 6>
+    | |   |               +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000395, !registered, !matched, active, busy 0, retain 6>
+    | |   |               +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000398, !registered, !matched, active, busy 0, retain 6>
+    | |   |               +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x1000003a5, !registered, !matched, active, busy 0, retain 6>
+    | |   |               +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x1000003a8, !registered, !matched, active, busy 0, retain 6>
+    | |   +-o RP01 at 1C  <class IOPCIDevice, id 0x100000179, registered, matched, active, busy 0 (6297 ms), retain 11>
+    | |   | +-o IOPCI2PCIBridge  <class IOPCI2PCIBridge, id 0x1000001c2, registered, matched, active, busy 0 (6262 ms), retain 7>
+    | |   |   +-o PXS1 at 0  <class IOPCIDevice, id 0x10000017a, registered, matched, active, busy 0 (6262 ms), retain 10>
+    | |   |     +-o yukon2osx  <class yukon2osx, id 0x1000001c6, !registered, !matched, active, busy 0 (2 ms), retain 7>
+    | |   |       +-o yukon  <class yukon, id 0x100000260, !registered, !matched, active, busy 0 (2 ms), retain 8>
+    | |   |         +-o IOEthernetInterface  <class IOEthernetInterface, id 0x100000261, registered, matched, active, busy 0 (2 ms), retain 11>
+    | |   |           +-o IONetworkStack  <class IONetworkStack, id 0x1000001de, registered, matched, active, busy 0 (2 ms), retain 11>
+    | |   |             +-o IONetworkStackUserClient  <class IONetworkStackUserClient, id 0x100000266, !registered, !matched, active, busy 0, retain 5>
+    | |   +-o RP02 at 1C,1  <class IOPCIDevice, id 0x10000017b, registered, matched, active, busy 0 (509 ms), retain 11>
+    | |   | +-o IOPCI2PCIBridge  <class IOPCI2PCIBridge, id 0x1000001e3, registered, matched, active, busy 0 (299 ms), retain 7>
+    | |   |   +-o PXS2 at 0  <class IOPCIDevice, id 0x10000017c, registered, matched, active, busy 0 (288 ms), retain 12>
+    | |   |     +-o AirPort_AthrFusion21  <class AirPort_AthrFusion21, id 0x10000027d, registered, matched, active, busy 0 (100 ms), retain 8>
+    | |   |       +-o AtherosFusion21Interface  <class AtherosFusion21Interface, id 0x1000002ab, registered, matched, active, busy 0 (99 ms), retain 10>
+    | |   |         +-o IONetworkStack  <class IONetworkStack, id 0x1000001de, registered, matched, active, busy 0 (2 ms), retain 11>
+    | |   |           +-o IONetworkStackUserClient  <class IONetworkStackUserClient, id 0x100000266, !registered, !matched, active, busy 0, retain 5>
+    | |   +-o USB1 at 1D  <class IOPCIDevice, id 0x10000017d, registered, matched, active, busy 0 (967 ms), retain 11>
+    | |   | +-o AppleUSBUHCI  <class AppleUSBUHCI, id 0x1000001e1, registered, matched, active, busy 0 (634 ms), retain 9>
+    | |   |   +-o UHCI Root Hub Simulation at 1D  <class IOUSBRootHubDevice, id 0x1000001fe, registered, matched, active, busy 0 (8 ms), retain 10>
+    | |   |   | | {
+    | |   |   | |   "sessionID" = 555462596
+    | |   |   | |   "iManufacturer" = 2
+    | |   |   | |   "bNumConfigurations" = 1
+    | |   |   | |   "idProduct" = 32773
+    | |   |   | |   "bcdDevice" = 272
+    | |   |   | |   "Bus Power Available" = 250
+    | |   |   | |   "bMaxPacketSize0" = 8
+    | |   |   | |   "USB Product Name" = "UHCI Root Hub Simulation"
+    | |   |   | |   "iProduct" = 1
+    | |   |   | |   "iSerialNumber" = 0
+    | |   |   | |   "USB Address" = 1
+    | |   |   | |   "bDeviceClass" = 9
+    | |   |   | |   "locationID" = 486539264
+    | |   |   | |   "bDeviceSubClass" = 0
+    | |   |   | |   "IOUserClientClass" = "IOUSBDeviceUserClientV2"
+    | |   |   | |   "Ports" = 2
+    | |   |   | |   "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
+    | |   |   | |   "bDeviceProtocol" = 0
+    | |   |   | |   "USB Vendor Name" = "Apple Inc."
+    | |   |   | |   "Device Speed" = 1
+    | |   |   | |   "idVendor" = 1452
+    | |   |   | |   "AAPL,current-in-sleep" = 1000
+    | |   |   | |   "Requested Power" = 0
+    | |   |   | |   "AAPL,port-current-in-sleep" = 500
+    | |   |   | |   "Low Power Displayed" = No
+    | |   |   | | }
+    | |   |   | | 
+    | |   |   | +-o AppleUSBHub  <class AppleUSBHub, id 0x100000200, !registered, !matched, active, busy 0, retain 8>
+    | |   |   | +-o IOUSBInterface at 0  <class IOUSBInterface, id 0x100000202, !registered, !matched, active, busy 0, retain 7>
+    | |   |   +-o Apple Internal Keyboard / Trackpad at 1d200000  <class IOUSBDevice, id 0x100000227, registered, matched, active, busy 0 (625 ms), retain 12>
+    | |   |     | {
+    | |   |     |   "sessionID" = 922879256
+    | |   |     |   "iManufacturer" = 1
+    | |   |     |   "bNumConfigurations" = 1
+    | |   |     |   "idProduct" = 539
+    | |   |     |   "bcdDevice" = 24
+    | |   |     |   "Bus Power Available" = 250
+    | |   |     |   "bMaxPacketSize0" = 8
+    | |   |     |   "USB Product Name" = "Apple Internal Keyboard / Trackpad"
+    | |   |     |   "iProduct" = 2
+    | |   |     |   "iSerialNumber" = 0
+    | |   |     |   "USB Address" = 2
+    | |   |     |   "bDeviceClass" = 0
+    | |   |     |   "locationID" = 488636416
+    | |   |     |   "bDeviceSubClass" = 0
+    | |   |     |   "IOUserClientClass" = "IOUSBDeviceUserClientV2"
+    | |   |     |   "PortNum" = 2
+    | |   |     |   "non-removable" = "yes"
+    | |   |     |   "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
+    | |   |     |   "bDeviceProtocol" = 0
+    | |   |     |   "Need contiguous memory for isoch" = Yes
+    | |   |     |   "USB Vendor Name" = "Apple Computer"
+    | |   |     |   "Device Speed" = 1
+    | |   |     |   "idVendor" = 1452
+    | |   |     |   "Requested Power" = 20
+    | |   |     |   "IOGeneralInterest" = "IOCommand is not serializable"
+    | |   |     |   "Low Power Displayed" = No
+    | |   |     | }
+    | |   |     | 
+    | |   |     +-o IOUSBCompositeDriver  <class IOUSBCompositeDriver, id 0x100000229, !registered, !matched, active, busy 0, retain 4>
+    | |   |     +-o Apple Internal Keyboard at 0  <class IOUSBInterface, id 0x10000022b, registered, matched, active, busy 0 (520 ms), retain 8>
+    | |   |     | +-o AppleUSBTCKeyboard  <class AppleUSBTCKeyboard, id 0x100000232, registered, matched, active, busy 0 (101 ms), retain 8>
+    | |   |     |   +-o IOHIDInterface  <class IOHIDInterface, id 0x100000238, registered, matched, active, busy 0 (6 ms), retain 6>
+    | |   |     |     +-o AppleUSBTCKeyEventDriver  <class AppleUSBTCKeyEventDriver, id 0x100000239, registered, matched, active, busy 0 (1 ms), retain 8>
+    | |   |     |       +-o IOHIDKeyboard  <class IOHIDKeyboard, id 0x10000023b, registered, matched, active, busy 0 (0 ms), retain 8>
+    | |   |     |       | +-o IOHIDSystem  <class IOHIDSystem, id 0x1000001df, registered, matched, active, busy 0 (3 ms), retain 16>
+    | |   |     |       |   +-o IOHIDUserClient  <class IOHIDUserClient, id 0x10000031a, !registered, !matched, active, busy 0, retain 5>
+    | |   |     |       |   +-o IOHIDParamUserClient  <class IOHIDParamUserClient, id 0x10000031b, !registered, !matched, active, busy 0, retain 5>
+    | |   |     |       |   +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000032a, !registered, !matched, active, busy 0, retain 5>
+    | |   |     |       |   +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000032b, !registered, !matched, active, busy 0, retain 5>
+    | |   |     |       +-o IOHIDSystem  <class IOHIDSystem, id 0x1000001df, registered, matched, active, busy 0 (3 ms), retain 15>
+    | |   |     |         +-o IOHIDUserClient  <class IOHIDUserClient, id 0x10000031a, !registered, !matched, active, busy 0, retain 5>
+    | |   |     |         +-o IOHIDParamUserClient  <class IOHIDParamUserClient, id 0x10000031b, !registered, !matched, active, busy 0, retain 5>
+    | |   |     |         +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000032a, !registered, !matched, active, busy 0, retain 5>
+    | |   |     |         +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000032b, !registered, !matched, active, busy 0, retain 5>
+    | |   |     +-o Touchpad at 1  <class IOUSBInterface, id 0x10000022c, registered, matched, active, busy 0 (382 ms), retain 7>
+    | |   |     | +-o AppleUSBGrIIITrackpad  <class AppleUSBGrIIITrackpad, id 0x10000023d, registered, matched, active, busy 0 (117 ms), retain 16>
+    | |   |     |   +-o RawDataReporter  <class RawDataReporter, id 0x10000023e, registered, matched, active, busy 0 (105 ms), retain 6>
+    | |   |     |   | +-o IOHIDInterface  <class IOHIDInterface, id 0x10000023f, registered, matched, active, busy 0 (3 ms), retain 5>
+    | |   |     |   +-o IOHIDPointingDevice  <class IOHIDPointingDevice, id 0x100000241, registered, matched, active, busy 0 (107 ms), retain 6>
+    | |   |     |   | +-o IOHIDInterface  <class IOHIDInterface, id 0x100000242, registered, matched, active, busy 0 (3 ms), retain 5>
+    | |   |     |   +-o IOHIDSystem  <class IOHIDSystem, id 0x1000001df, registered, matched, active, busy 0 (3 ms), retain 15>
+    | |   |     |   | +-o IOHIDUserClient  <class IOHIDUserClient, id 0x10000031a, !registered, !matched, active, busy 0, retain 5>
+    | |   |     |   | +-o IOHIDParamUserClient  <class IOHIDParamUserClient, id 0x10000031b, !registered, !matched, active, busy 0, retain 5>
+    | |   |     |   | +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000032a, !registered, !matched, active, busy 0, retain 5>
+    | |   |     |   | +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000032b, !registered, !matched, active, busy 0, retain 5>
+    | |   |     |   +-o BaselineReporter  <class BaselineReporter, id 0x100000244, registered, matched, active, busy 0 (108 ms), retain 6>
+    | |   |     |     +-o IOHIDInterface  <class IOHIDInterface, id 0x100000245, registered, matched, active, busy 0 (3 ms), retain 5>
+    | |   |     +-o Apple Internal Keyboard at 2  <class IOUSBInterface, id 0x10000022d, registered, matched, active, busy 0 (202 ms), retain 8>
+    | |   |       +-o AppleUSBTCKeyboard  <class AppleUSBTCKeyboard, id 0x100000247, registered, matched, active, busy 0 (110 ms), retain 8>
+    | |   |         +-o IOHIDInterface  <class IOHIDInterface, id 0x100000248, registered, matched, active, busy 0 (103 ms), retain 6>
+    | |   |           +-o IOHIDEventDriver  <class IOHIDEventDriver, id 0x1000002a1, registered, matched, active, busy 0 (3 ms), retain 8>
+    | |   |             +-o IOHIDConsumer  <class IOHIDConsumer, id 0x1000002a2, registered, matched, active, busy 0 (1 ms), retain 8>
+    | |   |             | +-o IOHIDSystem  <class IOHIDSystem, id 0x1000001df, registered, matched, active, busy 0 (3 ms), retain 16>
+    | |   |             |   +-o IOHIDUserClient  <class IOHIDUserClient, id 0x10000031a, !registered, !matched, active, busy 0, retain 5>
+    | |   |             |   +-o IOHIDParamUserClient  <class IOHIDParamUserClient, id 0x10000031b, !registered, !matched, active, busy 0, retain 5>
+    | |   |             |   +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000032a, !registered, !matched, active, busy 0, retain 5>
+    | |   |             |   +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000032b, !registered, !matched, active, busy 0, retain 5>
+    | |   |             +-o IOHIDSystem  <class IOHIDSystem, id 0x1000001df, registered, matched, active, busy 0 (3 ms), retain 15>
+    | |   |               +-o IOHIDUserClient  <class IOHIDUserClient, id 0x10000031a, !registered, !matched, active, busy 0, retain 5>
+    | |   |               +-o IOHIDParamUserClient  <class IOHIDParamUserClient, id 0x10000031b, !registered, !matched, active, busy 0, retain 5>
+    | |   |               +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000032a, !registered, !matched, active, busy 0, retain 5>
+    | |   |               +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000032b, !registered, !matched, active, busy 0, retain 5>
+    | |   +-o USB2 at 1D,1  <class IOPCIDevice, id 0x100000181, registered, matched, active, busy 0 (352 ms), retain 11>
+    | |   | +-o AppleUSBUHCI  <class AppleUSBUHCI, id 0x1000001f3, registered, matched, active, busy 0 (13 ms), retain 8>
+    | |   |   +-o UHCI Root Hub Simulation at 1D,1  <class IOUSBRootHubDevice, id 0x100000206, registered, matched, active, busy 0 (10 ms), retain 8>
+    | |   |     | {
+    | |   |     |   "sessionID" = 564210044
+    | |   |     |   "iManufacturer" = 2
+    | |   |     |   "bNumConfigurations" = 1
+    | |   |     |   "idProduct" = 32773
+    | |   |     |   "bcdDevice" = 272
+    | |   |     |   "Bus Power Available" = 250
+    | |   |     |   "bMaxPacketSize0" = 8
+    | |   |     |   "USB Product Name" = "UHCI Root Hub Simulation"
+    | |   |     |   "iProduct" = 1
+    | |   |     |   "iSerialNumber" = 0
+    | |   |     |   "USB Address" = 1
+    | |   |     |   "bDeviceClass" = 9
+    | |   |     |   "locationID" = 1023410176
+    | |   |     |   "bDeviceSubClass" = 0
+    | |   |     |   "IOUserClientClass" = "IOUSBDeviceUserClientV2"
+    | |   |     |   "Ports" = 2
+    | |   |     |   "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
+    | |   |     |   "bDeviceProtocol" = 0
+    | |   |     |   "USB Vendor Name" = "Apple Inc."
+    | |   |     |   "Device Speed" = 1
+    | |   |     |   "idVendor" = 1452
+    | |   |     |   "AAPL,current-in-sleep" = 1000
+    | |   |     |   "Requested Power" = 0
+    | |   |     |   "AAPL,port-current-in-sleep" = 500
+    | |   |     |   "Low Power Displayed" = No
+    | |   |     | }
+    | |   |     | 
+    | |   |     +-o AppleUSBHub  <class AppleUSBHub, id 0x10000020b, !registered, !matched, active, busy 0, retain 6>
+    | |   |     +-o IOUSBInterface at 0  <class IOUSBInterface, id 0x10000020d, !registered, !matched, active, busy 0, retain 7>
+    | |   +-o USB3 at 1D,2  <class IOPCIDevice, id 0x100000185, registered, matched, active, busy 0 (647 ms), retain 11>
+    | |   | +-o AppleUSBUHCI  <class AppleUSBUHCI, id 0x1000001c8, registered, matched, active, busy 0 (297 ms), retain 9>
+    | |   |   +-o UHCI Root Hub Simulation at 1D,2  <class IOUSBRootHubDevice, id 0x100000209, registered, matched, active, busy 0 (20 ms), retain 10>
+    | |   |   | | {
+    | |   |   | |   "sessionID" = 572462640
+    | |   |   | |   "iManufacturer" = 2
+    | |   |   | |   "bNumConfigurations" = 1
+    | |   |   | |   "idProduct" = 32773
+    | |   |   | |   "bcdDevice" = 272
+    | |   |   | |   "Bus Power Available" = 250
+    | |   |   | |   "bMaxPacketSize0" = 8
+    | |   |   | |   "USB Product Name" = "UHCI Root Hub Simulation"
+    | |   |   | |   "iProduct" = 1
+    | |   |   | |   "iSerialNumber" = 0
+    | |   |   | |   "USB Address" = 1
+    | |   |   | |   "bDeviceClass" = 9
+    | |   |   | |   "locationID" = 1560281088
+    | |   |   | |   "bDeviceSubClass" = 0
+    | |   |   | |   "IOUserClientClass" = "IOUSBDeviceUserClientV2"
+    | |   |   | |   "Ports" = 2
+    | |   |   | |   "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
+    | |   |   | |   "bDeviceProtocol" = 0
+    | |   |   | |   "USB Vendor Name" = "Apple Inc."
+    | |   |   | |   "Device Speed" = 1
+    | |   |   | |   "idVendor" = 1452
+    | |   |   | |   "AAPL,current-in-sleep" = 1000
+    | |   |   | |   "Requested Power" = 0
+    | |   |   | |   "AAPL,port-current-in-sleep" = 500
+    | |   |   | |   "Low Power Displayed" = No
+    | |   |   | | }
+    | |   |   | | 
+    | |   |   | +-o AppleUSBHub  <class AppleUSBHub, id 0x100000218, !registered, !matched, active, busy 0, retain 8>
+    | |   |   | +-o IOUSBInterface at 0  <class IOUSBInterface, id 0x10000021a, !registered, !matched, active, busy 0, retain 7>
+    | |   |   +-o IR Receiver at 5d200000  <class IOUSBDevice, id 0x10000022a, registered, matched, active, busy 0 (276 ms), retain 9>
+    | |   |     | {
+    | |   |     |   "sessionID" = 944991920
+    | |   |     |   "iManufacturer" = 1
+    | |   |     |   "bNumConfigurations" = 1
+    | |   |     |   "idProduct" = 33344
+    | |   |     |   "bcdDevice" = 272
+    | |   |     |   "Bus Power Available" = 250
+    | |   |     |   "bMaxPacketSize0" = 8
+    | |   |     |   "USB Product Name" = "IR Receiver"
+    | |   |     |   "iProduct" = 2
+    | |   |     |   "iSerialNumber" = 0
+    | |   |     |   "USB Address" = 2
+    | |   |     |   "bDeviceClass" = 0
+    | |   |     |   "locationID" = 1562378240
+    | |   |     |   "bDeviceSubClass" = 0
+    | |   |     |   "IOUserClientClass" = "IOUSBDeviceUserClientV2"
+    | |   |     |   "PortNum" = 2
+    | |   |     |   "non-removable" = "yes"
+    | |   |     |   "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
+    | |   |     |   "bDeviceProtocol" = 0
+    | |   |     |   "Need contiguous memory for isoch" = Yes
+    | |   |     |   "USB Vendor Name" = "Apple Computer, Inc."
+    | |   |     |   "Device Speed" = 1
+    | |   |     |   "idVendor" = 1452
+    | |   |     |   "Requested Power" = 50
+    | |   |     |   "IOGeneralInterest" = "IOCommand is not serializable"
+    | |   |     |   "Low Power Displayed" = No
+    | |   |     | }
+    | |   |     | 
+    | |   |     +-o IOUSBCompositeDriver  <class IOUSBCompositeDriver, id 0x10000022f, !registered, !matched, active, busy 0, retain 4>
+    | |   |     +-o IOUSBInterface at 0  <class IOUSBInterface, id 0x100000230, registered, matched, active, busy 0 (261 ms), retain 8>
+    | |   |       +-o AppleIRController  <class AppleIRController, id 0x100000235, registered, matched, active, busy 0 (112 ms), retain 8>
+    | |   |         +-o IOHIDInterface  <class IOHIDInterface, id 0x100000236, registered, matched, active, busy 0 (3 ms), retain 5>
+    | |   |         +-o IOHIDLibUserClient  <class IOHIDLibUserClient, id 0x10000035d, !registered, !matched, active, busy 0, retain 6>
+    | |   +-o USB4 at 1D,3  <class IOPCIDevice, id 0x100000189, registered, matched, active, busy 0 (2390 ms), retain 11>
+    | |   | +-o AppleUSBUHCI  <class AppleUSBUHCI, id 0x1000001c9, registered, matched, active, busy 0 (2038 ms), retain 9>
+    | |   |   +-o UHCI Root Hub Simulation at 1D,3  <class IOUSBRootHubDevice, id 0x10000020e, registered, matched, active, busy 0 (8 ms), retain 10>
+    | |   |   | | {
+    | |   |   | |   "sessionID" = 575818003
+    | |   |   | |   "iManufacturer" = 2
+    | |   |   | |   "bNumConfigurations" = 1
+    | |   |   | |   "idProduct" = 32773
+    | |   |   | |   "bcdDevice" = 272
+    | |   |   | |   "Bus Power Available" = 250
+    | |   |   | |   "bMaxPacketSize0" = 8
+    | |   |   | |   "USB Product Name" = "UHCI Root Hub Simulation"
+    | |   |   | |   "iProduct" = 1
+    | |   |   | |   "iSerialNumber" = 0
+    | |   |   | |   "USB Address" = 1
+    | |   |   | |   "bDeviceClass" = 9
+    | |   |   | |   "locationID" = 2097152000
+    | |   |   | |   "bDeviceSubClass" = 0
+    | |   |   | |   "IOUserClientClass" = "IOUSBDeviceUserClientV2"
+    | |   |   | |   "Ports" = 2
+    | |   |   | |   "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
+    | |   |   | |   "bDeviceProtocol" = 0
+    | |   |   | |   "USB Vendor Name" = "Apple Inc."
+    | |   |   | |   "Device Speed" = 1
+    | |   |   | |   "idVendor" = 1452
+    | |   |   | |   "AAPL,current-in-sleep" = 1000
+    | |   |   | |   "Requested Power" = 0
+    | |   |   | |   "AAPL,port-current-in-sleep" = 500
+    | |   |   | |   "Low Power Displayed" = No
+    | |   |   | | }
+    | |   |   | | 
+    | |   |   | +-o AppleUSBHub  <class AppleUSBHub, id 0x100000212, !registered, !matched, active, busy 0, retain 8>
+    | |   |   | +-o IOUSBInterface at 0  <class IOUSBInterface, id 0x100000215, !registered, !matched, active, busy 0, retain 7>
+    | |   |   +-o WirelessControllerDevice at 7d100000  <class IOUSBDevice, id 0x100000256, registered, matched, active, busy 0 (250 ms), retain 10>
+    | |   |     | {
+    | |   |     |   "sessionID" = 3290864968
+    | |   |     |   "iManufacturer" = 0
+    | |   |     |   "idProduct" = 33285
+    | |   |     |   "bDeviceClass" = 224
+    | |   |     |   "bcdDevice" = 6501
+    | |   |     |   "Bus Power Available" = 250
+    | |   |     |   "bMaxPacketSize0" = 64
+    | |   |     |   "iProduct" = 0
+    | |   |     |   "iSerialNumber" = 0
+    | |   |     |   "USB Address" = 2
+    | |   |     |   "bNumConfigurations" = 1
+    | |   |     |   "IOUserClientClass" = "IOUSBDeviceUserClientV2"
+    | |   |     |   "locationID" = 2098200576
+    | |   |     |   "bDeviceSubClass" = 1
+    | |   |     |   "USB Product Name" = "Bluetooth USB Host Controller"
+    | |   |     |   "non-removable" = "yes"
+    | |   |     |   "PortNum" = 1
+    | |   |     |   "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
+    | |   |     |   "bDeviceProtocol" = 1
+    | |   |     |   "Need contiguous memory for isoch" = Yes
+    | |   |     |   "Device Speed" = 1
+    | |   |     |   "USB Vendor Name" = "Apple Inc."
+    | |   |     |   "idVendor" = 1452
+    | |   |     |   "Requested Power" = 0
+    | |   |     |   "IOGeneralInterest" = "IOCommand is not serializable"
+    | |   |     |   "Low Power Displayed" = No
+    | |   |     | }
+    | |   |     | 
+    | |   |     +-o CSRUSBBluetoothHCIController  <class CSRUSBBluetoothHCIController, id 0x100000258, registered, matched, active, busy 0 (0 ms), retain 10>
+    | |   |     | +-o IOBluetoothHCIUserClient  <class IOBluetoothHCIUserClient, id 0x100000270, !registered, !matched, active, busy 0, retain 5>
+    | |   |     | +-o IOBluetoothHCIUserClient  <class IOBluetoothHCIUserClient, id 0x1000003ba, !registered, !matched, active, busy 0, retain 5>
+    | |   |     +-o IOUSBInterface at 0  <class IOUSBInterface, id 0x10000025a, !registered, !matched, active, busy 0, retain 6>
+    | |   |     +-o IOUSBInterface at 1  <class IOUSBInterface, id 0x10000025b, !registered, !matched, active, busy 0, retain 6>
+    | |   |     +-o IOUSBInterface at 2  <class IOUSBInterface, id 0x10000025c, !registered, !matched, active, busy 0, retain 6>
+    | |   +-o USB7 at 1D,7  <class IOPCIDevice, id 0x10000018d, registered, matched, active, busy 0 (2564 ms), retain 13>
+    | |   | +-o IOService  <class IOService, id 0x1000001ca, !registered, !matched, active, busy 0, retain 4>
+    | |   | +-o AppleUSBEHCI  <class AppleUSBEHCI, id 0x1000001cb, registered, matched, active, busy 0 (2383 ms), retain 14>
+    | |   |   +-o EHCI Root Hub Simulation at 1D,7  <class IOUSBRootHubDevice, id 0x1000001d7, registered, matched, active, busy 0 (32 ms), retain 12>
+    | |   |   | | {
+    | |   |   | |   "sessionID" = 410970048
+    | |   |   | |   "iManufacturer" = 2
+    | |   |   | |   "bNumConfigurations" = 1
+    | |   |   | |   "idProduct" = 32774
+    | |   |   | |   "bcdDevice" = 512
+    | |   |   | |   "Bus Power Available" = 250
+    | |   |   | |   "bMaxPacketSize0" = 64
+    | |   |   | |   "USB Product Name" = "EHCI Root Hub Simulation"
+    | |   |   | |   "iProduct" = 1
+    | |   |   | |   "iSerialNumber" = 0
+    | |   |   | |   "USB Address" = 1
+    | |   |   | |   "bDeviceClass" = 9
+    | |   |   | |   "locationID" = 18446744073659219968
+    | |   |   | |   "bDeviceSubClass" = 0
+    | |   |   | |   "IOUserClientClass" = "IOUSBDeviceUserClientV2"
+    | |   |   | |   "Ports" = 8
+    | |   |   | |   "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
+    | |   |   | |   "bDeviceProtocol" = 1
+    | |   |   | |   "USB Vendor Name" = "Apple Inc."
+    | |   |   | |   "Device Speed" = 2
+    | |   |   | |   "idVendor" = 1452
+    | |   |   | |   "AAPL,current-in-sleep" = 4000
+    | |   |   | |   "Requested Power" = 0
+    | |   |   | |   "AAPL,port-current-in-sleep" = 500
+    | |   |   | |   "Low Power Displayed" = No
+    | |   |   | | }
+    | |   |   | | 
+    | |   |   | +-o AppleUSBHub  <class AppleUSBHub, id 0x1000001e8, registered, matched, active, busy 0 (0 ms), retain 9>
+    | |   |   | +-o IOUSBInterface at 0  <class IOUSBInterface, id 0x1000001ea, !registered, !matched, active, busy 0, retain 7>
+    | |   |   +-o Built-in iSight at fd400000  <class IOUSBDevice, id 0x10000024e, registered, matched, active, busy 0 (50 ms), retain 9>
+    | |   |   | | {
+    | |   |   | |   "sessionID" = 2717373407
+    | |   |   | |   "iManufacturer" = 1
+    | |   |   | |   "bNumConfigurations" = 1
+    | |   |   | |   "idProduct" = 34049
+    | |   |   | |   "bcdDevice" = 393
+    | |   |   | |   "Bus Power Available" = 250
+    | |   |   | |   "bMaxPacketSize0" = 64
+    | |   |   | |   "USB Product Name" = "Built-in iSight"
+    | |   |   | |   "iProduct" = 2
+    | |   |   | |   "iSerialNumber" = 0
+    | |   |   | |   "USB Address" = 2
+    | |   |   | |   "bDeviceClass" = 255
+    | |   |   | |   "locationID" = 18446744073663414272
+    | |   |   | |   "bDeviceSubClass" = 255
+    | |   |   | |   "IOUserClientClass" = "IOUSBDeviceUserClientV2"
+    | |   |   | |   "PortNum" = 4
+    | |   |   | |   "non-removable" = "yes"
+    | |   |   | |   "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
+    | |   |   | |   "bDeviceProtocol" = 255
+    | |   |   | |   "USB Vendor Name" = "Micron"
+    | |   |   | |   "Device Speed" = 2
+    | |   |   | |   "idVendor" = 1452
+    | |   |   | |   "Requested Power" = 50
+    | |   |   | |   "IOGeneralInterest" = "IOCommand is not serializable"
+    | |   |   | |   "kSuspendPort" = Yes
+    | |   |   | |   "Low Power Displayed" = No
+    | |   |   | | }
+    | |   |   | | 
+    | |   |   | +-o IOUSBCompositeDriver  <class IOUSBCompositeDriver, id 0x100000250, !registered, !matched, active, busy 0, retain 4>
+    | |   |   | +-o IOUSBInterface at 0  <class IOUSBInterface, id 0x100000252, registered, matched, active, busy 0 (15 ms), retain 6>
+    | |   |   | +-o IOUSBInterface at 1  <class IOUSBInterface, id 0x100000253, registered, matched, active, busy 0 (15 ms), retain 6>
+    | |   |   +-o Flash Disk at fd300000  <class IOUSBDevice, id 0x100000408, registered, matched, active, busy 0 (499 ms), retain 8>
+    | |   |     | {
+    | |   |     |   "sessionID" = 3995793432240
+    | |   |     |   "iManufacturer" = 1
+    | |   |     |   "bNumConfigurations" = 1
+    | |   |     |   "idProduct" = 24613
+    | |   |     |   "bcdDevice" = 256
+    | |   |     |   "Bus Power Available" = 250
+    | |   |     |   "bMaxPacketSize0" = 64
+    | |   |     |   "USB Product Name" = "Flash Disk"
+    | |   |     |   "iProduct" = 2
+    | |   |     |   "iSerialNumber" = 3
+    | |   |     |   "USB Address" = 3
+    | |   |     |   "bDeviceClass" = 0
+    | |   |     |   "bDeviceSubClass" = 0
+    | |   |     |   "locationID" = 18446744073662365696
+    | |   |     |   "IOUserClientClass" = "IOUSBDeviceUserClientV2"
+    | |   |     |   "kHasMSCInterface" = Yes
+    | |   |     |   "PortNum" = 3
+    | |   |     |   "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
+    | |   |     |   "bDeviceProtocol" = 0
+    | |   |     |   "uid" = "USB:197660250078C5C90000"
+    | |   |     |   "USB Vendor Name" = "CBM"
+    | |   |     |   "Device Speed" = 2
+    | |   |     |   "idVendor" = 6518
+    | |   |     |   "USB Serial Number" = "16270078C5C90000"
+    | |   |     |   "Requested Power" = 50
+    | |   |     |   "IOGeneralInterest" = "IOCommand is not serializable"
+    | |   |     |   "Low Power Displayed" = No
+    | |   |     | }
+    | |   |     | 
+    | |   |     +-o IOUSBCompositeDriver  <class IOUSBCompositeDriver, id 0x10000040a, !registered, !matched, active, busy 0, retain 4>
+    | |   |     +-o IOUSBInterface at 0  <class IOUSBInterface, id 0x10000040b, registered, matched, active, busy 0 (482 ms), retain 7>
+    | |   |       +-o IOUSBMassStorageClass  <class IOUSBMassStorageClass, id 0x10000040d, registered, matched, active, busy 0 (177 ms), retain 8>
+    | |   |         +-o IOSCSIPeripheralDeviceNub  <class IOSCSIPeripheralDeviceNub, id 0x10000040f, registered, matched, active, busy 0 (74 ms), retain 6>
+    | |   |           +-o IOSCSIPeripheralDeviceType00  <class IOSCSIPeripheralDeviceType00, id 0x100000410, !registered, !matched, active, busy 0 (20 ms), retain 7>
+    | |   |             +-o IOBlockStorageServices  <class IOBlockStorageServices, id 0x100000413, registered, matched, active, busy 0 (20 ms), retain 5>
+    | |   |               +-o IOBlockStorageDriver  <class IOBlockStorageDriver, id 0x100000414, registered, matched, active, busy 0 (18 ms), retain 7>
+    | |   |                 +-o CBM Flash Disk Media  <class IOMedia, id 0x100000415, registered, matched, active, busy 0 (16 ms), retain 10>
+    | |   |                   +-o IOMediaBSDClient  <class IOMediaBSDClient, id 0x100000416, registered, matched, active, busy 0 (2 ms), retain 5>
+    | |   |                   +-o IOFDiskPartitionScheme  <class IOFDiskPartitionScheme, id 0x100000419, !registered, !matched, active, busy 0 (10 ms), retain 6>
+    | |   |                     +-o Untitled 1 at 1  <class IOMedia, id 0x10000041b, registered, matched, active, busy 0 (10 ms), retain 9>
+    | |   |                       +-o IOMediaBSDClient  <class IOMediaBSDClient, id 0x10000041c, registered, matched, active, busy 0 (2 ms), retain 6>
+    | |   +-o PCIB at 1E  <class IOPCIDevice, id 0x100000197, registered, matched, active, busy 0 (712 ms), retain 11>
+    | |   | +-o IOPCI2PCIBridge  <class IOPCI2PCIBridge, id 0x1000001cd, registered, matched, active, busy 0 (542 ms), retain 7>
+    | |   |   +-o FRWR at 3  <class IOPCIDevice, id 0x100000198, registered, matched, active, busy 0 (494 ms), retain 10>
+    | |   |     +-o AppleFWOHCI  <class AppleFWOHCI, id 0x1000001d8, !registered, !matched, active, busy 0 (476 ms), retain 6>
+    | |   |       +-o IOFireWireController  <class IOFireWireController, id 0x1000001da, registered, matched, active, busy 0 (476 ms), retain 9>
+    | |   |         +-o IOFireWireLocalNode  <class IOFireWireLocalNode, id 0x100000214, registered, matched, active, busy 0 (476 ms), retain 12>
+    | |   |           +-o IOFireWireUserClientIniter  <class IOFireWireUserClientIniter, id 0x100000216, !registered, !matched, active, busy 0, retain 4>
+    | |   |           +-o IOFireWireUserClientIniter  <class IOFireWireUserClientIniter, id 0x1000002b0, !registered, !matched, active, busy 0, retain 4>
+    | |   |           +-o IOFireWireIP  <class IOFireWireIP, id 0x1000002b1, registered, matched, active, busy 0 (224 ms), retain 5>
+    | |   |             +-o IOFWInterface  <class IOFWInterface, id 0x1000002b9, registered, matched, active, busy 0 (224 ms), retain 10>
+    | |   |               +-o IONetworkStack  <class IONetworkStack, id 0x1000001de, registered, matched, active, busy 0 (2 ms), retain 11>
+    | |   |                 +-o IONetworkStackUserClient  <class IONetworkStackUserClient, id 0x100000266, !registered, !matched, active, busy 0, retain 5>
+    | |   +-o LPCB at 1F  <class IOPCIDevice, id 0x100000199, registered, matched, active, busy 0 (5615 ms), retain 28>
+    | |   | +-o AppleLPC  <class AppleLPC, id 0x100000275, registered, matched, active, busy 0 (3 ms), retain 5>
+    | |   +-o PATA at 1F,1  <class IOPCIDevice, id 0x10000019a, registered, matched, active, busy 0 (10462 ms), retain 13>
+    | |   | +-o AppleIntelPIIXATARoot  <class AppleIntelPIIXATARoot, id 0x1000001d1, !registered, !matched, active, busy 0 (10287 ms), retain 6>
+    | |   |   +-o PRID at 0  <class AppleIntelPIIXATAChannel, id 0x10000019b, registered, matched, active, busy 0 (10287 ms), retain 14>
+    | |   |   | +-o AppleIntelPIIXPATA  <class AppleIntelPIIXPATA, id 0x1000001e2, registered, matched, active, busy 0 (10231 ms), retain 7>
+    | |   |   |   +-o ATADeviceNub at 0  <class ATADeviceNub, id 0x1000001f5, registered, matched, active, busy 0 (10230 ms), retain 6>
+    | |   |   |     +-o IOATAPIProtocolTransport  <class IOATAPIProtocolTransport, id 0x1000001f8, registered, matched, active, busy 0 (10221 ms), retain 8>
+    | |   |   |       +-o IOSCSIPeripheralDeviceNub  <class IOSCSIPeripheralDeviceNub, id 0x1000001fb, registered, matched, active, busy 0 (10013 ms), retain 6>
+    | |   |   |         +-o IOSCSIPeripheralDeviceType05  <class IOSCSIPeripheralDeviceType05, id 0x100000222, !registered, !matched, active, busy 0 (3701 ms), retain 7>
+    | |   |   |           +-o IODVDServices  <class IODVDServices, id 0x100000263, registered, matched, active, busy 0 (3701 ms), retain 6>
+    | |   |   |             +-o IODVDBlockStorageDriver  <class IODVDBlockStorageDriver, id 0x100000264, registered, matched, active, busy 0 (3699 ms), retain 7>
+    | |   |   |             | +-o HL-DT-ST DVDRW GSA-S10N Media  <class IODVDMedia, id 0x100000269, registered, matched, active, busy 0 (3698 ms), retain 10>
+    | |   |   |             |   +-o IODVDMediaBSDClient  <class IODVDMediaBSDClient, id 0x10000026a, registered, matched, active, busy 0 (2 ms), retain 5>
+    | |   |   |             |   +-o IOApplePartitionScheme  <class IOApplePartitionScheme, id 0x1000002f4, !registered, !matched, active, busy 0 (14 ms), retain 8>
+    | |   |   |             |     +-o Apple at 1  <class IOMedia, id 0x1000002f5, registered, matched, active, busy 0 (11 ms), retain 8>
+    | |   |   |             |     | +-o IOMediaBSDClient  <class IOMediaBSDClient, id 0x1000002f8, registered, matched, active, busy 0 (5 ms), retain 5>
+    | |   |   |             |     +-o Macintosh at 2  <class IOMedia, id 0x1000002f6, registered, matched, active, busy 0 (12 ms), retain 8>
+    | |   |   |             |     | +-o IOMediaBSDClient  <class IOMediaBSDClient, id 0x1000002f9, registered, matched, active, busy 0 (5 ms), retain 5>
+    | |   |   |             |     +-o Mac_OS_X at 3  <class IOMedia, id 0x1000002f7, registered, matched, active, busy 0 (14 ms), retain 9>
+    | |   |   |             |       +-o IOMediaBSDClient  <class IOMediaBSDClient, id 0x1000002fa, registered, matched, active, busy 0 (5 ms), retain 6>
+    | |   |   |             +-o SCSITaskUserClientIniter  <class SCSITaskUserClientIniter, id 0x100000265, !registered, !matched, active, busy 0, retain 4>
+    | |   |   +-o CHN1 at 1  <class AppleIntelPIIXATAChannel, id 0x1000001d2, registered, matched, active, busy 0 (75 ms), retain 6>
+    | |   +-o SATA at 1F,2  <class IOPCIDevice, id 0x10000019e, registered, matched, active, busy 0 (387 ms), retain 13>
+    | |   | +-o AppleAHCI  <class AppleAHCI, id 0x1000001d3, registered, matched, active, busy 0 (208 ms), retain 7>
+    | |   |   +-o PRT2 at 2  <class AppleAHCIPort, id 0x1000001a0, registered, matched, active, busy 0 (170 ms), retain 10>
+    | |   |     +-o IOAHCIDevice at 0  <class IOAHCIDevice, id 0x1000001eb, registered, matched, active, busy 0 (170 ms), retain 11>
+    | |   |       +-o AppleAHCIDiskDriver  <class AppleAHCIDiskDriver, id 0x1000001ec, registered, matched, active, busy 0 (51 ms), retain 6>
+    | |   |         +-o IOAHCIBlockStorageDevice  <class IOAHCIBlockStorageDevice, id 0x100000203, registered, matched, active, busy 0 (51 ms), retain 6>
+    | |   |           +-o IOBlockStorageDriver  <class IOBlockStorageDriver, id 0x100000207, registered, matched, active, busy 0 (49 ms), retain 7>
+    | |   |             +-o FUJITSU MHY2120BH Media  <class IOMedia, id 0x100000208, registered, matched, active, busy 0 (49 ms), retain 10>
+    | |   |               +-o IOMediaBSDClient  <class IOMediaBSDClient, id 0x10000020f, registered, matched, active, busy 0 (0 ms), retain 5>
+    | |   |               +-o IOGUIDPartitionScheme  <class IOGUIDPartitionScheme, id 0x10000021b, !registered, !matched, active, busy 0 (13 ms), retain 7>
+    | |   |                 +-o EFI System Partition at 1  <class IOMedia, id 0x10000021e, registered, matched, active, busy 0 (3 ms), retain 8>
+    | |   |                 | +-o IOMediaBSDClient  <class IOMediaBSDClient, id 0x100000220, registered, matched, active, busy 0 (1 ms), retain 5>
+    | |   |                 +-o Untitled at 2  <class IOMedia, id 0x10000021f, registered, matched, active, busy 0 (13 ms), retain 10>
+    | |   |                   +-o IOMediaBSDClient  <class IOMediaBSDClient, id 0x100000221, registered, matched, active, busy 0 (1 ms), retain 6>
+    | |   +-o SBUS at 1F,3  <class IOPCIDevice, id 0x1000001a1, registered, matched, active, busy 0 (203 ms), retain 8>
+    | +-o PDRC  <class IOACPIPlatformDevice, id 0x100000130, registered, matched, active, busy 0 (9 ms), retain 6>
+    | +-o SMC  <class IOACPIPlatformDevice, id 0x10000015f, registered, matched, active, busy 0 (451 ms), retain 9>
+    | | +-o AppleSMC  <class AppleSMC, id 0x1000002ae, registered, matched, active, busy 0 (191 ms), retain 6>
+    | |   +-o SMCWatchDogTimer  <class SMCWatchDogTimer, id 0x1000002b3, registered, matched, active, busy 0 (129 ms), retain 5>
+    | +-o SMS0  <class IOACPIPlatformDevice, id 0x100000160, registered, matched, active, busy 0 (377 ms), retain 7>
+    | | +-o SMCMotionSensor  <class SMCMotionSensor, id 0x1000002dc, registered, matched, active, busy 0 (2 ms), retain 5>
+    | +-o EC  <class IOACPIPlatformDevice, id 0x100000161, registered, matched, active, busy 0 (245 ms), retain 10>
+    | | +-o AppleACPIEC  <class AppleACPIEC, id 0x100000124, !registered, !matched, active, busy 0, retain 6>
+    | +-o SMB0  <class IOACPIPlatformDevice, id 0x100000162, registered, matched, active, busy 0 (34 ms), retain 9>
+    | | +-o AppleECSMBusController  <class AppleECSMBusController, id 0x1000001ed, registered, matched, active, busy 0 (16 ms), retain 5>
+    | |   +-o AppleSmartBatteryManager  <class AppleSmartBatteryManager, id 0x1000001ee, registered, matched, active, busy 0 (3 ms), retain 6>
+    | |     +-o AppleSmartBattery  <class AppleSmartBattery, id 0x1000001f0, registered, matched, active, busy 0 (0 ms), retain 5>
+    | +-o SBS0  <class IOACPIPlatformDevice, id 0x100000163, registered, matched, active, busy 0 (19 ms), retain 6>
+    | +-o DMAC  <class IOACPIPlatformDevice, id 0x100000164, registered, matched, active, busy 0 (21 ms), retain 6>
+    | +-o FWHD  <class IOACPIPlatformDevice, id 0x100000165, registered, matched, active, busy 0 (22 ms), retain 6>
+    | +-o HPET  <class IOACPIPlatformDevice, id 0x100000166, registered, matched, active, busy 0 (24 ms), retain 7>
+    | | +-o AppleHPET  <class AppleHPET, id 0x1000001bc, !registered, !matched, active, busy 0, retain 4>
+    | +-o IPIC  <class IOACPIPlatformDevice, id 0x100000167, registered, matched, active, busy 0 (25 ms), retain 6>
+    | +-o MATH  <class IOACPIPlatformDevice, id 0x100000168, registered, matched, active, busy 0 (26 ms), retain 6>
+    | +-o LDRC  <class IOACPIPlatformDevice, id 0x100000169, registered, matched, active, busy 0 (27 ms), retain 6>
+    | +-o RTC  <class IOACPIPlatformDevice, id 0x10000016a, registered, matched, active, busy 0 (38 ms), retain 8>
+    | | +-o AppleRTC  <class AppleRTC, id 0x1000001bd, registered, matched, active, busy 0 (1 ms), retain 6>
+    | +-o TIMR  <class IOACPIPlatformDevice, id 0x10000016b, registered, matched, active, busy 0 (29 ms), retain 6>
+    | +-o AppleEFIRuntime  <class AppleEFIRuntime, id 0x1000001be, registered, matched, active, busy 0 (297 ms), retain 7>
+    | | +-o AppleEFINVRAM  <class AppleEFINVRAM, id 0x1000001bf, registered, matched, active, busy 0 (1 ms), retain 7>
+    | +-o IOPCIMessagedInterruptController  <class IOPCIMessagedInterruptController, id 0x1000001c1, registered, matched, active, busy 0 (2 ms), retain 6>
+    | +-o AppleRawIOAddressSpace  <class AppleRawIOAddressSpace, id 0x10000028a, registered, matched, active, busy 0 (2 ms), retain 4>
+    | +-o AppleRawPhysicalMemoryAddressSpace  <class AppleRawPhysicalMemoryAddressSpace, id 0x10000028b, registered, matched, active, busy 0 (4 ms), retain 4>
+    +-o IOResources  <class IOResources, id 0x100000113, registered, matched, active, busy 0 (824 ms), retain 24>
+      +-o AppleIntelCPUPowerManagement  <class AppleIntelCPUPowerManagement, id 0x10000011b, registered, matched, active, busy 0 (252 ms), retain 5>
+      | +-o AppleIntelCPUPowerManagementClient  <class AppleIntelCPUPowerManagementClient, id 0x100000120, !registered, !matched, active, busy 0, retain 4>
+      +-o IOHDIXController  <class IOHDIXController, id 0x10000011c, registered, matched, active, busy 0 (2 ms), retain 4>
+      +-o com_apple_AppleFSCompression_AppleFSCompressionTypeZlib  <class com_apple_AppleFSCompression_AppleFSCompressionTypeZlib, id 0x1000001dc, !registered, !matched, active, busy 0, retain 4>
+      +-o com_apple_BootCache  <class com_apple_BootCache, id 0x1000001dd, !registered, !matched, active, busy 0, retain 4>
+      +-o IONetworkStack  <class IONetworkStack, id 0x1000001de, registered, matched, active, busy 0 (2 ms), retain 11>
+      | +-o IONetworkStackUserClient  <class IONetworkStackUserClient, id 0x100000266, !registered, !matched, active, busy 0, retain 5>
+      +-o IOHIDSystem  <class IOHIDSystem, id 0x1000001df, registered, matched, active, busy 0 (3 ms), retain 15>
+      | +-o IOHIDUserClient  <class IOHIDUserClient, id 0x10000031a, !registered, !matched, active, busy 0, retain 5>
+      | +-o IOHIDParamUserClient  <class IOHIDParamUserClient, id 0x10000031b, !registered, !matched, active, busy 0, retain 5>
+      | +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000032a, !registered, !matched, active, busy 0, retain 5>
+      | +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000032b, !registered, !matched, active, busy 0, retain 5>
+      +-o AppleProfileOSHooks  <class AppleProfileOSHooks, id 0x100000281, registered, matched, active, busy 0 (187 ms), retain 15>
+      | +-o AppleProfileTimeTrigger  <class AppleProfileTimeTrigger, id 0x10000028f, registered, matched, active, busy 0 (168 ms), retain 6>
+      | +-o AppleProfilePMITrigger  <class AppleProfilePMITrigger, id 0x100000290, registered, matched, active, busy 0 (168 ms), retain 6>
+      | +-o AppleOSXPerformanceMonitor  <class AppleOSXPerformanceMonitor, id 0x100000291, !registered, !matched, active, busy 0 (173 ms), retain 6>
+      | | +-o AppleOSXPerformanceCounter  <class AppleOSXPerformanceCounter, id 0x10000029c, registered, matched, active, busy 0 (170 ms), retain 6>
+      | | | +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x100000292, registered, matched, active, busy 0 (175 ms), retain 18>
+      | | |   +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x1000002d4, !registered, !matched, active, busy 0, retain 5>
+      | | +-o AppleOSXPerformanceCounter  <class AppleOSXPerformanceCounter, id 0x10000029d, registered, matched, active, busy 0 (173 ms), retain 6>
+      | |   +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x100000292, registered, matched, active, busy 0 (175 ms), retain 18>
+      | |     +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x1000002d4, !registered, !matched, active, busy 0, retain 5>
+      | +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x100000292, registered, matched, active, busy 0 (175 ms), retain 17>
+      | | +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x1000002d4, !registered, !matched, active, busy 0, retain 5>
+      | +-o AppleProfileKEventTrigger  <class AppleProfileKEventTrigger, id 0x100000293, registered, matched, active, busy 0 (175 ms), retain 6>
+      | +-o AppleProfileManualTrigger  <class AppleProfileManualTrigger, id 0x100000294, registered, matched, active, busy 0 (2 ms), retain 6>
+      | +-o AppleProfileCallstackAction  <class AppleProfileCallstackAction, id 0x100000295, !registered, !matched, active, busy 0, retain 5>
+      | +-o AppleProfileKEventAction  <class AppleProfileKEventAction, id 0x100000296, !registered, !matched, active, busy 0, retain 5>
+      | +-o AppleProfileRegisterStateAction  <class AppleProfileRegisterStateAction, id 0x100000297, !registered, !matched, active, busy 0, retain 5>
+      | +-o AppleProfileThreadInfoAction  <class AppleProfileThreadInfoAction, id 0x100000298, !registered, !matched, active, busy 0, retain 5>
+      | +-o AppleProfileTimestampAction  <class AppleProfileTimestampAction, id 0x100000299, !registered, !matched, active, busy 0, retain 5>
+      +-o com_apple_driver_AudioIPCDevice  <class com_apple_driver_AudioIPCDevice, id 0x100000282, registered, matched, active, busy 0 (165 ms), retain 6>
+      | +-o com_apple_driver_AudioIPCEngine  <class com_apple_driver_AudioIPCEngine, id 0x10000028c, registered, matched, active, busy 0 (164 ms), retain 9>
+      |   +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000333, !registered, !matched, active, busy 0, retain 6>
+      |   +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000365, !registered, !matched, active, busy 0, retain 6>
+      |   +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000394, !registered, !matched, active, busy 0, retain 6>
+      |   +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x1000003a4, !registered, !matched, active, busy 0, retain 6>
+      +-o CHUDKernLib  <class CHUDKernLib, id 0x100000283, registered, matched, active, busy 0 (170 ms), retain 4>
+      +-o CHUDProf  <class CHUDProf, id 0x100000284, registered, matched, active, busy 0 (307 ms), retain 4>
+      +-o CHUDUtils  <class CHUDUtils, id 0x100000285, registered, matched, active, busy 0 (310 ms), retain 4>
+      +-o Dont_Steal_Mac_OS_X  <class Dont_Steal_Mac_OS_X, id 0x100000286, !registered, !matched, active, busy 0, retain 5>
+      +-o IOBluetoothSerialManager  <class IOBluetoothSerialManager, id 0x100000287, registered, matched, active, busy 0 (376 ms), retain 7>
+      | +-o IOBluetoothSerialClient  <class IOBluetoothSerialClient, id 0x1000002d3, !registered, !matched, active, busy 0 (133 ms), retain 5>
+      | | +-o IOBluetoothSerialClientSerialStreamSync  <class IOBluetoothSerialClientSerialStreamSync, id 0x1000002d5, registered, matched, active, busy 0 (133 ms), retain 5>
+      | |   +-o IOSerialBSDClient  <class IOSerialBSDClient, id 0x1000002df, registered, matched, active, busy 0 (6 ms), retain 4>
+      | +-o IOBluetoothSerialClient  <class IOBluetoothSerialClient, id 0x1000002de, !registered, !matched, active, busy 0 (76 ms), retain 5>
+      |   +-o IOBluetoothSerialClientModemStreamSync  <class IOBluetoothSerialClientModemStreamSync, id 0x1000002e0, registered, matched, active, busy 0 (76 ms), retain 5>
+      |     +-o IOSerialBSDClient  <class IOSerialBSDClient, id 0x1000002e8, registered, matched, active, busy 0 (6 ms), retain 4>
+      +-o IODisplayWrangler  <class IODisplayWrangler, id 0x100000288, registered, matched, active, busy 0 (169 ms), retain 7>
+      | +-o IOAccelerationUserClient  <class IOAccelerationUserClient, id 0x100000370, !registered, !matched, active, busy 0, retain 5>
+      +-o IOSurfaceRoot  <class IOSurfaceRoot, id 0x100000289, registered, matched, active, busy 0 (171 ms), retain 5>
+      +-o AppleSCSISubsystemGlobals  <class AppleSCSISubsystemGlobals, id 0x1000002fd, registered, matched, active, busy 0 (1 ms), retain 5>
diff --git a/resources/macos/ioreg/IOUSBDevice2 b/resources/macos/ioreg/IOUSBDevice2
new file mode 100644
index 0000000..7381f42
--- /dev/null
+++ b/resources/macos/ioreg/IOUSBDevice2
@@ -0,0 +1,976 @@
++-o Root  <class IORegistryEntry, id 0x100000100, retain 15>
+  +-o iMac7,1  <class IOPlatformExpertDevice, id 0x100000110, registered, matched, active, busy 0 (12850 ms), retain 23>
+    +-o AppleACPIPlatformExpert  <class AppleACPIPlatformExpert, id 0x100000111, registered, matched, active, busy 0 (10089 ms), retain 33>
+    | +-o IOPMrootDomain  <class IOPMrootDomain, id 0x100000114, registered, matched, active, busy 0 (10 ms), retain 54>
+    | | +-o IORootParent  <class IORootParent, id 0x100000115, !registered, !matched, active, busy 0, retain 7>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x1000002ab, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x1000002ac, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x1000002ad, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x1000002ae, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x1000002b0, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x10000030c, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x10000037a, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000384, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000398, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x1000003d5, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x1000003d8, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x1000003e9, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x1000003ea, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x1000003f3, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x1000003f4, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x1000003f5, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x1000003f9, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000410, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000412, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000413, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000414, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000432, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000434, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000438, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000459, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x10000046e, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000470, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000476, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000478, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000479, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x10000047a, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x10000047b, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x10000047d, !registered, !matched, active, busy 0, retain 5>
+    | +-o cpus  <class IOPlatformDevice, id 0x100000117, registered, matched, active, busy 0 (3 ms), retain 7>
+    | +-o CPU0 at 0  <class IOACPIPlatformDevice, id 0x100000118, registered, matched, active, busy 0 (173 ms), retain 7>
+    | | +-o AppleACPICPU  <class AppleACPICPU, id 0x10000011d, registered, matched, active, busy 0 (165 ms), retain 9>
+    | |   +-o AppleACPICPUInterruptController  <class AppleACPICPUInterruptController, id 0x10000011f, registered, matched, active, busy 0 (0 ms), retain 5>
+    | |   +-o ACPI_SMC_PlatformPlugin  <class ACPI_SMC_PlatformPlugin, id 0x1000002ba, registered, matched, active, busy 0 (13 ms), retain 9>
+    | |   +-o AppleIntelMeromPerformanceMonitor  <class AppleIntelMeromPerformanceMonitor, id 0x1000002bb, !registered, !matched, active, busy 0 (83 ms), retain 9>
+    | |   | +-o AppleIntelMeromGeneralPurposeCounter  <class AppleIntelMeromGeneralPurposeCounter, id 0x1000002f5, registered, matched, active, busy 0 (62 ms), retain 7>
+    | |   | | +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x1000002de, registered, matched, active, busy 0 (57 ms), retain 17>
+    | |   | |   +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x10000030d, !registered, !matched, active, busy 0, retain 5>
+    | |   | +-o AppleIntelMeromGeneralPurposeCounter  <class AppleIntelMeromGeneralPurposeCounter, id 0x1000002f6, registered, matched, active, busy 0 (64 ms), retain 7>
+    | |   | | +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x1000002de, registered, matched, active, busy 0 (57 ms), retain 17>
+    | |   | |   +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x10000030d, !registered, !matched, active, busy 0, retain 5>
+    | |   | +-o AppleIntelMeromFixedCounter  <class AppleIntelMeromFixedCounter, id 0x1000002f7, registered, matched, active, busy 0 (66 ms), retain 7>
+    | |   | | +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x1000002de, registered, matched, active, busy 0 (57 ms), retain 17>
+    | |   | |   +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x10000030d, !registered, !matched, active, busy 0, retain 5>
+    | |   | +-o AppleIntelMeromFixedCounter  <class AppleIntelMeromFixedCounter, id 0x1000002f8, registered, matched, active, busy 0 (65 ms), retain 7>
+    | |   | | +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x1000002de, registered, matched, active, busy 0 (57 ms), retain 17>
+    | |   | |   +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x10000030d, !registered, !matched, active, busy 0, retain 5>
+    | |   | +-o AppleIntelMeromFixedCounter  <class AppleIntelMeromFixedCounter, id 0x1000002f9, registered, matched, active, busy 0 (83 ms), retain 7>
+    | |   |   +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x1000002de, registered, matched, active, busy 0 (57 ms), retain 17>
+    | |   |     +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x10000030d, !registered, !matched, active, busy 0, retain 5>
+    | |   +-o AppleIntelMeromSPR  <class AppleIntelMeromSPR, id 0x1000002ee, registered, matched, active, busy 0 (67 ms), retain 4>
+    | +-o CPU1 at 1  <class IOACPIPlatformDevice, id 0x100000119, registered, matched, active, busy 0 (169 ms), retain 7>
+    | | +-o AppleACPICPU  <class AppleACPICPU, id 0x10000011e, registered, matched, active, busy 0 (155 ms), retain 7>
+    | |   +-o AppleIntelMeromPerformanceMonitor  <class AppleIntelMeromPerformanceMonitor, id 0x1000002ce, !registered, !matched, active, busy 0 (75 ms), retain 9>
+    | |   | +-o AppleIntelMeromGeneralPurposeCounter  <class AppleIntelMeromGeneralPurposeCounter, id 0x100000301, registered, matched, active, busy 0 (68 ms), retain 7>
+    | |   | | +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x1000002de, registered, matched, active, busy 0 (57 ms), retain 17>
+    | |   | |   +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x10000030d, !registered, !matched, active, busy 0, retain 5>
+    | |   | +-o AppleIntelMeromGeneralPurposeCounter  <class AppleIntelMeromGeneralPurposeCounter, id 0x100000302, registered, matched, active, busy 0 (69 ms), retain 7>
+    | |   | | +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x1000002de, registered, matched, active, busy 0 (57 ms), retain 17>
+    | |   | |   +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x10000030d, !registered, !matched, active, busy 0, retain 5>
+    | |   | +-o AppleIntelMeromFixedCounter  <class AppleIntelMeromFixedCounter, id 0x100000303, registered, matched, active, busy 0 (72 ms), retain 7>
+    | |   | | +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x1000002de, registered, matched, active, busy 0 (57 ms), retain 17>
+    | |   | |   +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x10000030d, !registered, !matched, active, busy 0, retain 5>
+    | |   | +-o AppleIntelMeromFixedCounter  <class AppleIntelMeromFixedCounter, id 0x100000304, registered, matched, active, busy 0 (73 ms), retain 7>
+    | |   | | +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x1000002de, registered, matched, active, busy 0 (57 ms), retain 17>
+    | |   | |   +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x10000030d, !registered, !matched, active, busy 0, retain 5>
+    | |   | +-o AppleIntelMeromFixedCounter  <class AppleIntelMeromFixedCounter, id 0x100000305, registered, matched, active, busy 0 (75 ms), retain 7>
+    | |   |   +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x1000002de, registered, matched, active, busy 0 (57 ms), retain 17>
+    | |   |     +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x10000030d, !registered, !matched, active, busy 0, retain 5>
+    | |   +-o AppleIntelMeromSPR  <class AppleIntelMeromSPR, id 0x1000002fa, registered, matched, active, busy 0 (75 ms), retain 4>
+    | +-o io-apic at fec00000  <class IOACPIPlatformDevice, id 0x10000011a, registered, matched, active, busy 0 (3 ms), retain 6>
+    | | +-o AppleAPICInterruptController  <class AppleAPICInterruptController, id 0x100000121, registered, matched, active, busy 0 (0 ms), retain 11>
+    | +-o AppleACPIEventController  <class AppleACPIEventController, id 0x100000122, !registered, !matched, active, busy 0, retain 6>
+    | +-o boot-ec  <class IOACPIPlatformDevice, id 0x100000123, registered, matched, active, busy 0 (1 ms), retain 6>
+    | | +-o AppleACPIEC  <class AppleACPIEC, id 0x100000124, !registered, !matched, active, busy 0, retain 6>
+    | +-o bios  <class IOPlatformDevice, id 0x100000125, registered, matched, active, busy 0 (4 ms), retain 5>
+    | | +-o AppleSMBIOS  <class AppleSMBIOS, id 0x100000126, registered, matched, active, busy 0 (1 ms), retain 4>
+    | +-o PNLF  <class IOACPIPlatformDevice, id 0x10000012a, registered, matched, active, busy 0 (34 ms), retain 7>
+    | | +-o AppleIntelPanelA  <class AppleIntelPanelA, id 0x1000002c5, !registered, !matched, active, busy 0, retain 5>
+    | +-o PWRB  <class IOACPIPlatformDevice, id 0x10000012b, registered, matched, active, busy 0 (2 ms), retain 8>
+    | | +-o AppleACPIButton  <class AppleACPIButton, id 0x1000001af, !registered, !matched, active, busy 0, retain 4>
+    | +-o SLPB  <class IOACPIPlatformDevice, id 0x10000012c, registered, matched, active, busy 0 (3 ms), retain 7>
+    | | +-o AppleACPIButton  <class AppleACPIButton, id 0x1000001b0, !registered, !matched, active, busy 0, retain 4>
+    | +-o PCI0  <class IOACPIPlatformDevice, id 0x10000012d, registered, matched, active, busy 0 (10058 ms), retain 45>
+    | | +-o AppleACPIPCI  <class AppleACPIPCI, id 0x1000001b1, registered, matched, active, busy 0 (10050 ms), retain 44>
+    | |   +-o MCHC at 0  <class IOPCIDevice, id 0x100000178, registered, matched, active, busy 0 (164 ms), retain 8>
+    | |   +-o PEGP at 1  <class IOPCIDevice, id 0x100000179, registered, matched, active, busy 0 (292 ms), retain 11>
+    | |   | +-o IOPCI2PCIBridge  <class IOPCI2PCIBridge, id 0x1000001ce, registered, matched, active, busy 0 (272 ms), retain 7>
+    | |   |   +-o GFX0 at 0  <class IOPCIDevice, id 0x10000017a, registered, matched, active, busy 0 (271 ms), retain 21>
+    | |   |     +-o ATI2600Controller  <class ATI2600Controller, id 0x1000002b1, registered, matched, active, busy 0 (61 ms), retain 4>
+    | |   |     +-o ATY,Hypoprion at 0  <class AtiFbStub, id 0x1000002b5, registered, matched, active, busy 0 (159 ms), retain 7>
+    | |   |     | +-o ATY_Hypoprion  <class ATIFramebuffer, id 0x100000306, registered, matched, active, busy 0 (87 ms), retain 15>
+    | |   |     |   +-o AppleMCCSControlModule  <class AppleMCCSControlModule, id 0x100000312, registered, matched, active, busy 0 (5 ms), retain 5>
+    | |   |     |   | +-o AppleMCCSParameterHandler  <class AppleMCCSParameterHandler, id 0x100000314, registered, matched, active, busy 0 (4 ms), retain 4>
+    | |   |     |   +-o AppleUpstreamUserClientDriver  <class AppleUpstreamUserClientDriver, id 0x100000313, registered, matched, active, busy 0 (1 ms), retain 4>
+    | |   |     |   +-o AMDNDRVService  <class AtiAppServices, id 0x10000036e, registered, matched, active, busy 0 (1 ms), retain 5>
+    | |   |     |   +-o IOFramebufferI2CInterface  <class IOFramebufferI2CInterface, id 0x10000036f, registered, matched, active, busy 0 (1 ms), retain 5>
+    | |   |     |   +-o display0  <class IODisplayConnect, id 0x100000370, registered, matched, active, busy 0 (2 ms), retain 5>
+    | |   |     |   | +-o AppleBacklightDisplay  <class AppleBacklightDisplay, id 0x100000371, registered, matched, active, busy 0 (1 ms), retain 8>
+    | |   |     |   +-o IOFramebufferUserClient  <class IOFramebufferUserClient, id 0x100000376, !registered, !matched, active, busy 0, retain 5>
+    | |   |     |   +-o IOFramebufferSharedUserClient  <class IOFramebufferSharedUserClient, id 0x100000483, !registered, !matched, active, busy 0, retain 5>
+    | |   |     +-o ATY,Hypoprion at 1  <class AtiFbStub, id 0x1000002b6, registered, matched, active, busy 0 (13 ms), retain 7>
+    | |   |     | +-o ATY_Hypoprion  <class ATIFramebuffer, id 0x100000318, registered, matched, active, busy 0 (11 ms), retain 12>
+    | |   |     |   +-o AppleMCCSControlModule  <class AppleMCCSControlModule, id 0x10000031b, registered, matched, active, busy 0 (4 ms), retain 5>
+    | |   |     |   | +-o AppleMCCSParameterHandler  <class AppleMCCSParameterHandler, id 0x10000031d, registered, matched, active, busy 0 (1 ms), retain 4>
+    | |   |     |   +-o AppleUpstreamUserClientDriver  <class AppleUpstreamUserClientDriver, id 0x10000031c, registered, matched, active, busy 0 (3 ms), retain 4>
+    | |   |     |   +-o AMDNDRVService  <class AtiAppServices, id 0x100000374, registered, matched, active, busy 0 (0 ms), retain 5>
+    | |   |     |   +-o IOFramebufferI2CInterface  <class IOFramebufferI2CInterface, id 0x100000375, registered, matched, active, busy 0 (1 ms), retain 5>
+    | |   |     |   +-o IOFramebufferUserClient  <class IOFramebufferUserClient, id 0x100000378, !registered, !matched, active, busy 0, retain 5>
+    | |   |     +-o ATISupport  <class ATISupport, id 0x1000002b2, registered, matched, active, busy 0 (1 ms), retain 4>
+    | |   |     +-o ATIRadeonX2000  <class ATIRadeonX2000, id 0x1000002b3, registered, matched, active, busy 0 (4 ms), retain 16>
+    | |   |       +-o IOService  <class IOService, id 0x100000322, registered, matched, active, busy 0 (4 ms), retain 6>
+    | |   |       | +-o IOHWSensor  <class IOHWSensor, id 0x100000323, registered, matched, active, busy 0 (1 ms), retain 7>
+    | |   |       +-o ATIR6002DContext  <class ATIR6002DContext, id 0x100000377, !registered, !matched, active, busy 0, retain 5>
+    | |   |       +-o ATIR6002DContext  <class ATIR6002DContext, id 0x100000379, !registered, !matched, active, busy 0, retain 5>
+    | |   |       +-o ATIR600Device  <class ATIR600Device, id 0x10000037f, !registered, !matched, active, busy 0, retain 5>
+    | |   |       +-o ATIR600GLContext  <class ATIR600GLContext, id 0x100000380, !registered, !matched, active, busy 0, retain 5>
+    | |   |       +-o ATIR600Surface  <class ATIR600Surface, id 0x1000003f6, !registered, !matched, active, busy 0, retain 5>
+    | |   |       +-o ATIR600Surface  <class ATIR600Surface, id 0x1000003fa, !registered, !matched, active, busy 0, retain 5>
+    | |   |       +-o ATIR600GLContext  <class ATIR600GLContext, id 0x1000003fb, !registered, !matched, active, busy 0, retain 5>
+    | |   |       +-o ATIR600Surface  <class ATIR600Surface, id 0x100000408, !registered, !matched, active, busy 0, retain 5>
+    | |   |       +-o ATIR600Surface  <class ATIR600Surface, id 0x100000409, !registered, !matched, active, busy 0, retain 5>
+    | |   |       +-o ATIR600Surface  <class ATIR600Surface, id 0x100000411, !registered, !matched, active, busy 0, retain 5>
+    | |   +-o UHC4 at 1A  <class IOPCIDevice, id 0x100000191, registered, matched, active, busy 0 (2874 ms), retain 11>
+    | |   | +-o AppleUSBUHCI  <class AppleUSBUHCI, id 0x1000001d2, registered, matched, active, busy 0 (2688 ms), retain 10>
+    | |   |   +-o UHCI Root Hub Simulation at 1A  <class IOUSBRootHubDevice, id 0x100000216, registered, matched, active, busy 0 (338 ms), retain 12>
+    | |   |   | | {
+    | |   |   | |   "sessionID" = 372634795
+    | |   |   | |   "AAPL,current-extra-in-sleep" = 500
+    | |   |   | |   "iManufacturer" = 2
+    | |   |   | |   "bNumConfigurations" = 1
+    | |   |   | |   "idProduct" = 32773
+    | |   |   | |   "bcdDevice" = 272
+    | |   |   | |   "Bus Power Available" = 250
+    | |   |   | |   "bMaxPacketSize0" = 8
+    | |   |   | |   "USB Product Name" = "UHCI Root Hub Simulation"
+    | |   |   | |   "iProduct" = 1
+    | |   |   | |   "iSerialNumber" = 0
+    | |   |   | |   "USB Address" = 1
+    | |   |   | |   "bDeviceClass" = 9
+    | |   |   | |   "locationID" = 436207616
+    | |   |   | |   "bDeviceSubClass" = 0
+    | |   |   | |   "IOUserClientClass" = "IOUSBDeviceUserClientV2"
+    | |   |   | |   "Ports" = 2
+    | |   |   | |   "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
+    | |   |   | |   "AAPL,max-port-current-in-sleep" = 1000
+    | |   |   | |   "bDeviceProtocol" = 0
+    | |   |   | |   "USB Vendor Name" = "Apple Inc."
+    | |   |   | |   "Device Speed" = 1
+    | |   |   | |   "idVendor" = 1452
+    | |   |   | |   "AAPL,current-in-sleep" = 1000
+    | |   |   | |   "Requested Power" = 0
+    | |   |   | |   "AAPL,port-current-in-sleep" = 500
+    | |   |   | |   "Low Power Displayed" = No
+    | |   |   | | }
+    | |   |   | | 
+    | |   |   | +-o AppleUSBHub  <class AppleUSBHub, id 0x100000218, !registered, !matched, active, busy 0, retain 10>
+    | |   |   | +-o IOUSBInterface at 0  <class IOUSBInterface, id 0x10000021a, !registered, !matched, active, busy 0, retain 7>
+    | |   |   +-o NetScroll + Mini Traveler at 1a200000  <class IOUSBDevice, id 0x100000270, registered, matched, active, busy 0 (730 ms), retain 9>
+    | |   |   | | {
+    | |   |   | |   "sessionID" = 1035836159
+    | |   |   | |   "iManufacturer" = 2
+    | |   |   | |   "bNumConfigurations" = 1
+    | |   |   | |   "idProduct" = 54
+    | |   |   | |   "bcdDevice" = 272
+    | |   |   | |   "Bus Power Available" = 250
+    | |   |   | |   "bMaxPacketSize0" = 8
+    | |   |   | |   "USB Product Name" = "NetScroll + Mini Traveler"
+    | |   |   | |   "iProduct" = 1
+    | |   |   | |   "iSerialNumber" = 0
+    | |   |   | |   "USB Address" = 3
+    | |   |   | |   "bDeviceClass" = 0
+    | |   |   | |   "locationID" = 438304768
+    | |   |   | |   "bDeviceSubClass" = 0
+    | |   |   | |   "IOUserClientClass" = "IOUSBDeviceUserClientV2"
+    | |   |   | |   "PortNum" = 2
+    | |   |   | |   "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
+    | |   |   | |   "bDeviceProtocol" = 0
+    | |   |   | |   "Need contiguous memory for isoch" = Yes
+    | |   |   | |   "USB Vendor Name" = "Genius"
+    | |   |   | |   "Device Speed" = 0
+    | |   |   | |   "idVendor" = 1112
+    | |   |   | |   "Requested Power" = 50
+    | |   |   | |   "IOGeneralInterest" = "IOCommand is not serializable"
+    | |   |   | |   "Low Power Displayed" = No
+    | |   |   | | }
+    | |   |   | | 
+    | |   |   | +-o IOUSBCompositeDriver  <class IOUSBCompositeDriver, id 0x10000027a, !registered, !matched, active, busy 0, retain 4>
+    | |   |   | +-o IOUSBInterface at 0  <class IOUSBInterface, id 0x100000280, registered, matched, active, busy 0 (706 ms), retain 8>
+    | |   |   |   +-o IOUSBHIDDriver  <class IOUSBHIDDriver, id 0x10000030a, registered, matched, active, busy 0 (20 ms), retain 7>
+    | |   |   |     +-o IOHIDInterface  <class IOHIDInterface, id 0x100000316, registered, matched, active, busy 0 (13 ms), retain 6>
+    | |   |   |       +-o IOHIDEventDriver  <class IOHIDEventDriver, id 0x10000031e, registered, matched, active, busy 0 (3 ms), retain 8>
+    | |   |   |         +-o IOHIDPointing  <class IOHIDPointing, id 0x10000031f, registered, matched, active, busy 0 (1 ms), retain 7>
+    | |   |   |         | +-o IOHIDSystem  <class IOHIDSystem, id 0x100000220, registered, matched, active, busy 0 (2 ms), retain 17>
+    | |   |   |         |   +-o IOHIDUserClient  <class IOHIDUserClient, id 0x10000036a, !registered, !matched, active, busy 0, retain 5>
+    | |   |   |         |   +-o IOHIDParamUserClient  <class IOHIDParamUserClient, id 0x10000036b, !registered, !matched, active, busy 0, retain 5>
+    | |   |   |         |   +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000037c, !registered, !matched, active, busy 0, retain 5>
+    | |   |   |         |   +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000037d, !registered, !matched, active, busy 0, retain 5>
+    | |   |   |         +-o IOHIDSystem  <class IOHIDSystem, id 0x100000220, registered, matched, active, busy 0 (2 ms), retain 16>
+    | |   |   |           +-o IOHIDUserClient  <class IOHIDUserClient, id 0x10000036a, !registered, !matched, active, busy 0, retain 5>
+    | |   |   |           +-o IOHIDParamUserClient  <class IOHIDParamUserClient, id 0x10000036b, !registered, !matched, active, busy 0, retain 5>
+    | |   |   |           +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000037c, !registered, !matched, active, busy 0, retain 5>
+    | |   |   |           +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000037d, !registered, !matched, active, busy 0, retain 5>
+    | |   |   +-o WirelessControllerDevice at 1a100000  <class IOUSBDevice, id 0x10000029e, registered, matched, active, busy 0 (564 ms), retain 10>
+    | |   |     | {
+    | |   |     |   "sessionID" = 3009829809
+    | |   |     |   "iManufacturer" = 0
+    | |   |     |   "idProduct" = 33286
+    | |   |     |   "bDeviceClass" = 224
+    | |   |     |   "bcdDevice" = 6501
+    | |   |     |   "Bus Power Available" = 250
+    | |   |     |   "bMaxPacketSize0" = 64
+    | |   |     |   "iProduct" = 0
+    | |   |     |   "iSerialNumber" = 0
+    | |   |     |   "USB Address" = 2
+    | |   |     |   "bNumConfigurations" = 1
+    | |   |     |   "IOUserClientClass" = "IOUSBDeviceUserClientV2"
+    | |   |     |   "locationID" = 437256192
+    | |   |     |   "bDeviceSubClass" = 1
+    | |   |     |   "USB Product Name" = "Bluetooth USB Host Controller"
+    | |   |     |   "non-removable" = "yes"
+    | |   |     |   "PortNum" = 1
+    | |   |     |   "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
+    | |   |     |   "bDeviceProtocol" = 1
+    | |   |     |   "Need contiguous memory for isoch" = Yes
+    | |   |     |   "Device Speed" = 1
+    | |   |     |   "USB Vendor Name" = "Apple Inc."
+    | |   |     |   "idVendor" = 1452
+    | |   |     |   "Requested Power" = 0
+    | |   |     |   "IOGeneralInterest" = "IOCommand is not serializable"
+    | |   |     |   "Low Power Displayed" = No
+    | |   |     | }
+    | |   |     | 
+    | |   |     +-o CSRUSBBluetoothHCIController  <class CSRUSBBluetoothHCIController, id 0x1000002a0, registered, matched, active, busy 0 (0 ms), retain 10>
+    | |   |     | +-o IOBluetoothHCIUserClient  <class IOBluetoothHCIUserClient, id 0x10000032a, !registered, !matched, active, busy 0, retain 5>
+    | |   |     | +-o IOBluetoothHCIUserClient  <class IOBluetoothHCIUserClient, id 0x100000433, !registered, !matched, active, busy 0, retain 5>
+    | |   |     +-o IOUSBInterface at 0  <class IOUSBInterface, id 0x1000002a2, !registered, !matched, active, busy 0, retain 6>
+    | |   |     +-o IOUSBInterface at 1  <class IOUSBInterface, id 0x1000002a3, !registered, !matched, active, busy 0, retain 6>
+    | |   |     +-o IOUSBInterface at 2  <class IOUSBInterface, id 0x1000002a4, !registered, !matched, active, busy 0, retain 6>
+    | |   +-o UHC5 at 1A,1  <class IOPCIDevice, id 0x100000195, registered, matched, active, busy 0 (570 ms), retain 11>
+    | |   | +-o AppleUSBUHCI  <class AppleUSBUHCI, id 0x1000001d3, registered, matched, active, busy 0 (377 ms), retain 8>
+    | |   |   +-o UHCI Root Hub Simulation at 1A,1  <class IOUSBRootHubDevice, id 0x10000021c, registered, matched, active, busy 0 (377 ms), retain 8>
+    | |   |     | {
+    | |   |     |   "sessionID" = 380960109
+    | |   |     |   "AAPL,current-extra-in-sleep" = 500
+    | |   |     |   "iManufacturer" = 2
+    | |   |     |   "bNumConfigurations" = 1
+    | |   |     |   "idProduct" = 32773
+    | |   |     |   "bcdDevice" = 272
+    | |   |     |   "Bus Power Available" = 250
+    | |   |     |   "bMaxPacketSize0" = 8
+    | |   |     |   "USB Product Name" = "UHCI Root Hub Simulation"
+    | |   |     |   "iProduct" = 1
+    | |   |     |   "iSerialNumber" = 0
+    | |   |     |   "USB Address" = 1
+    | |   |     |   "bDeviceClass" = 9
+    | |   |     |   "locationID" = 973078528
+    | |   |     |   "bDeviceSubClass" = 0
+    | |   |     |   "IOUserClientClass" = "IOUSBDeviceUserClientV2"
+    | |   |     |   "Ports" = 2
+    | |   |     |   "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
+    | |   |     |   "AAPL,max-port-current-in-sleep" = 1000
+    | |   |     |   "bDeviceProtocol" = 0
+    | |   |     |   "USB Vendor Name" = "Apple Inc."
+    | |   |     |   "Device Speed" = 1
+    | |   |     |   "idVendor" = 1452
+    | |   |     |   "AAPL,current-in-sleep" = 1000
+    | |   |     |   "Requested Power" = 0
+    | |   |     |   "AAPL,port-current-in-sleep" = 500
+    | |   |     |   "Low Power Displayed" = No
+    | |   |     | }
+    | |   |     | 
+    | |   |     +-o AppleUSBHub  <class AppleUSBHub, id 0x100000224, !registered, !matched, active, busy 0, retain 6>
+    | |   |     +-o IOUSBInterface at 0  <class IOUSBInterface, id 0x100000226, !registered, !matched, active, busy 0, retain 7>
+    | |   +-o EHC2 at 1A,7  <class IOPCIDevice, id 0x1000001a1, registered, matched, active, busy 0 (671 ms), retain 12>
+    | |   | +-o IOService  <class IOService, id 0x1000001d4, !registered, !matched, active, busy 0, retain 4>
+    | |   | +-o AppleUSBEHCI  <class AppleUSBEHCI, id 0x1000001d5, registered, matched, active, busy 0 (629 ms), retain 12>
+    | |   |   +-o EHCI Root Hub Simulation at 1A,7  <class IOUSBRootHubDevice, id 0x1000001e9, registered, matched, active, busy 0 (382 ms), retain 10>
+    | |   |   | | {
+    | |   |   | |   "sessionID" = 228913729
+    | |   |   | |   "AAPL,current-extra-in-sleep" = 500
+    | |   |   | |   "iManufacturer" = 2
+    | |   |   | |   "bNumConfigurations" = 1
+    | |   |   | |   "idProduct" = 32774
+    | |   |   | |   "bcdDevice" = 512
+    | |   |   | |   "Bus Power Available" = 250
+    | |   |   | |   "bMaxPacketSize0" = 64
+    | |   |   | |   "USB Product Name" = "EHCI Root Hub Simulation"
+    | |   |   | |   "iProduct" = 1
+    | |   |   | |   "iSerialNumber" = 0
+    | |   |   | |   "USB Address" = 1
+    | |   |   | |   "bDeviceClass" = 9
+    | |   |   | |   "locationID" = 18446744073608888320
+    | |   |   | |   "bDeviceSubClass" = 0
+    | |   |   | |   "AAPL,current-extra" = 1000
+    | |   |   | |   "IOUserClientClass" = "IOUSBDeviceUserClientV2"
+    | |   |   | |   "Ports" = 4
+    | |   |   | |   "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
+    | |   |   | |   "AAPL,current-available" = 1500
+    | |   |   | |   "bDeviceProtocol" = 1
+    | |   |   | |   "AAPL,max-port-current-in-sleep" = 1000
+    | |   |   | |   "USB Vendor Name" = "Apple Inc."
+    | |   |   | |   "Device Speed" = 2
+    | |   |   | |   "idVendor" = 1452
+    | |   |   | |   "AAPL,current-in-sleep" = 2000
+    | |   |   | |   "Requested Power" = 0
+    | |   |   | |   "AAPL,port-current-in-sleep" = 500
+    | |   |   | |   "Low Power Displayed" = No
+    | |   |   | | }
+    | |   |   | | 
+    | |   |   | +-o AppleUSBHub  <class AppleUSBHub, id 0x1000001eb, registered, matched, active, busy 0 (0 ms), retain 8>
+    | |   |   | +-o IOUSBInterface at 0  <class IOUSBInterface, id 0x1000001ed, !registered, !matched, active, busy 0, retain 7>
+    | |   |   +-o Keyboard Hub at fa400000  <class IOUSBHubDevice, id 0x100000243, registered, matched, active, busy 0 (273 ms), retain 10>
+    | |   |   | | {
+    | |   |   | |   "sessionID" = 565166469
+    | |   |   | |   "iManufacturer" = 1
+    | |   |   | |   "bNumConfigurations" = 1
+    | |   |   | |   "idProduct" = 4102
+    | |   |   | |   "bcdDevice" = 37909
+    | |   |   | |   "Bus Power Available" = 250
+    | |   |   | |   "bMaxPacketSize0" = 64
+    | |   |   | |   "USB Product Name" = "Keyboard Hub"
+    | |   |   | |   "iProduct" = 2
+    | |   |   | |   "iSerialNumber" = 3
+    | |   |   | |   "USB Address" = 2
+    | |   |   | |   "bDeviceClass" = 9
+    | |   |   | |   "bDeviceSubClass" = 0
+    | |   |   | |   "locationID" = 18446744073613082624
+    | |   |   | |   "IOUserClientClass" = "IOUSBDeviceUserClientV2"
+    | |   |   | |   "Ports" = 3
+    | |   |   | |   "PortNum" = 4
+    | |   |   | |   "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
+    | |   |   | |   "ExtraPowerRequest" = 600
+    | |   |   | |   "bDeviceProtocol" = 1
+    | |   |   | |   "USB Vendor Name" = "Apple, Inc."
+    | |   |   | |   "Device Speed" = 2
+    | |   |   | |   "idVendor" = 1452
+    | |   |   | |   "ExtraPowerForPorts" = 400
+    | |   |   | |   "USB Serial Number" = "000000000000"
+    | |   |   | |   "kHubPowerSequencingDelay" = Yes
+    | |   |   | |   "Requested Power" = 150
+    | |   |   | |   "Low Power Displayed" = No
+    | |   |   | | }
+    | |   |   | | 
+    | |   |   | +-o AppleUSBHub  <class AppleUSBHub, id 0x10000024a, registered, matched, active, busy 0 (0 ms), retain 9>
+    | |   |   | +-o IOUSBInterface at 0  <class IOUSBInterface, id 0x10000024c, !registered, !matched, active, busy 0, retain 7>
+    | |   |   +-o Apple Keyboard at fa420000  <class IOUSBDevice, id 0x100000271, registered, matched, active, busy 0 (578 ms), retain 11>
+    | |   |     | {
+    | |   |     |   "sessionID" = 1018522533
+    | |   |     |   "iManufacturer" = 1
+    | |   |     |   "bNumConfigurations" = 1
+    | |   |     |   "idProduct" = 545
+    | |   |     |   "bcdDevice" = 105
+    | |   |     |   "Bus Power Available" = 50
+    | |   |     |   "bMaxPacketSize0" = 8
+    | |   |     |   "USB Product Name" = "Apple Keyboard"
+    | |   |     |   "iProduct" = 2
+    | |   |     |   "iSerialNumber" = 0
+    | |   |     |   "USB Address" = 3
+    | |   |     |   "bDeviceClass" = 0
+    | |   |     |   "locationID" = 18446744073613213696
+    | |   |     |   "bDeviceSubClass" = 0
+    | |   |     |   "IOUserClientClass" = "IOUSBDeviceUserClientV2"
+    | |   |     |   "PortNum" = 2
+    | |   |     |   "non-removable" = "yes"
+    | |   |     |   "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
+    | |   |     |   "bDeviceProtocol" = 0
+    | |   |     |   "USB Vendor Name" = "Apple, Inc"
+    | |   |     |   "Device Speed" = 0
+    | |   |     |   "idVendor" = 1452
+    | |   |     |   "Requested Power" = 10
+    | |   |     |   "IOGeneralInterest" = "IOCommand is not serializable"
+    | |   |     |   "Low Power Displayed" = No
+    | |   |     | }
+    | |   |     | 
+    | |   |     +-o IOUSBCompositeDriver  <class IOUSBCompositeDriver, id 0x100000273, !registered, !matched, active, busy 0, retain 4>
+    | |   |     +-o IOUSBInterface at 0  <class IOUSBInterface, id 0x100000274, registered, matched, active, busy 0 (215 ms), retain 8>
+    | |   |     | +-o AppleUSBHIDKeyboard  <class AppleUSBHIDKeyboard, id 0x100000277, registered, matched, active, busy 0 (39 ms), retain 7>
+    | |   |     |   +-o IOHIDInterface  <class IOHIDInterface, id 0x10000027b, registered, matched, active, busy 0 (4 ms), retain 6>
+    | |   |     |     +-o AppleHIDKeyboardEventDriver  <class AppleHIDKeyboardEventDriver, id 0x10000027c, registered, matched, active, busy 0 (1 ms), retain 8>
+    | |   |     |       +-o IOHIDKeyboard  <class IOHIDKeyboard, id 0x10000027e, registered, matched, active, busy 0 (0 ms), retain 8>
+    | |   |     |       | +-o IOHIDSystem  <class IOHIDSystem, id 0x100000220, registered, matched, active, busy 0 (2 ms), retain 17>
+    | |   |     |       |   +-o IOHIDUserClient  <class IOHIDUserClient, id 0x10000036a, !registered, !matched, active, busy 0, retain 5>
+    | |   |     |       |   +-o IOHIDParamUserClient  <class IOHIDParamUserClient, id 0x10000036b, !registered, !matched, active, busy 0, retain 5>
+    | |   |     |       |   +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000037c, !registered, !matched, active, busy 0, retain 5>
+    | |   |     |       |   +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000037d, !registered, !matched, active, busy 0, retain 5>
+    | |   |     |       +-o IOHIDSystem  <class IOHIDSystem, id 0x100000220, registered, matched, active, busy 0 (2 ms), retain 16>
+    | |   |     |         +-o IOHIDUserClient  <class IOHIDUserClient, id 0x10000036a, !registered, !matched, active, busy 0, retain 5>
+    | |   |     |         +-o IOHIDParamUserClient  <class IOHIDParamUserClient, id 0x10000036b, !registered, !matched, active, busy 0, retain 5>
+    | |   |     |         +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000037c, !registered, !matched, active, busy 0, retain 5>
+    | |   |     |         +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000037d, !registered, !matched, active, busy 0, retain 5>
+    | |   |     +-o IOUSBInterface at 1  <class IOUSBInterface, id 0x100000275, registered, matched, active, busy 0 (196 ms), retain 8>
+    | |   |       +-o AppleUSBHIDKeyboard  <class AppleUSBHIDKeyboard, id 0x100000282, registered, matched, active, busy 0 (50 ms), retain 7>
+    | |   |         +-o IOHIDInterface  <class IOHIDInterface, id 0x100000283, registered, matched, active, busy 0 (41 ms), retain 6>
+    | |   |           +-o IOHIDEventDriver  <class IOHIDEventDriver, id 0x1000002c8, registered, matched, active, busy 0 (3 ms), retain 8>
+    | |   |             +-o IOHIDConsumer  <class IOHIDConsumer, id 0x1000002c9, registered, matched, active, busy 0 (1 ms), retain 8>
+    | |   |             | +-o IOHIDSystem  <class IOHIDSystem, id 0x100000220, registered, matched, active, busy 0 (2 ms), retain 17>
+    | |   |             |   +-o IOHIDUserClient  <class IOHIDUserClient, id 0x10000036a, !registered, !matched, active, busy 0, retain 5>
+    | |   |             |   +-o IOHIDParamUserClient  <class IOHIDParamUserClient, id 0x10000036b, !registered, !matched, active, busy 0, retain 5>
+    | |   |             |   +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000037c, !registered, !matched, active, busy 0, retain 5>
+    | |   |             |   +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000037d, !registered, !matched, active, busy 0, retain 5>
+    | |   |             +-o IOHIDSystem  <class IOHIDSystem, id 0x100000220, registered, matched, active, busy 0 (2 ms), retain 16>
+    | |   |               +-o IOHIDUserClient  <class IOHIDUserClient, id 0x10000036a, !registered, !matched, active, busy 0, retain 5>
+    | |   |               +-o IOHIDParamUserClient  <class IOHIDParamUserClient, id 0x10000036b, !registered, !matched, active, busy 0, retain 5>
+    | |   |               +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000037c, !registered, !matched, active, busy 0, retain 5>
+    | |   |               +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000037d, !registered, !matched, active, busy 0, retain 5>
+    | |   +-o HDEF at 1B  <class IOPCIDevice, id 0x10000017e, registered, matched, active, busy 0 (2793 ms), retain 10>
+    | |   | +-o AppleHDAController at 1B  <class AppleHDAController, id 0x1000002bc, registered, matched, active, busy 0 (2689 ms), retain 7>
+    | |   |   +-o IOHDACodecDevice at 1B,0  <class IOHDACodecDevice, id 0x1000002d8, registered, matched, active, busy 0 (2689 ms), retain 6>
+    | |   |     +-o IOHDACodecDriver  <class IOHDACodecDriver, id 0x1000002ec, !registered, !matched, active, busy 0 (2688 ms), retain 5>
+    | |   |       +-o IOHDACodecFunction at 1B,0,1  <class IOHDACodecFunction, id 0x1000002ed, registered, matched, active, busy 0 (2688 ms), retain 6>
+    | |   |         +-o AppleHDACodecGeneric  <class AppleHDACodecGeneric, id 0x10000030e, registered, matched, active, busy 0 (26 ms), retain 5>
+    | |   |           +-o AppleHDADriver  <class AppleHDADriver, id 0x100000328, registered, matched, active, busy 0 (9 ms), retain 8>
+    | |   |             +-o AppleHDAEngineOutput at 1B,0,1,2  <class AppleHDAEngineOutput, id 0x100000333, registered, matched, active, busy 0 (4 ms), retain 35>
+    | |   |             | +-o AppleHDAStream  <class AppleHDAStream, id 0x100000334, registered, matched, active, busy 0 (2 ms), retain 7>
+    | |   |             | +-o IOAudioSelectorControl  <class IOAudioSelectorControl, id 0x100000335, !registered, !matched, active, busy 0 (0 ms), retain 14>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003ab, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000042b, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000452, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000462, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioLevelControl  <class IOAudioLevelControl, id 0x100000336, !registered, !matched, active, busy 0 (0 ms), retain 14>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003ac, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000042c, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000453, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000463, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioLevelControl  <class IOAudioLevelControl, id 0x100000337, !registered, !matched, active, busy 0 (0 ms), retain 14>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003ad, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000042d, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000454, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000464, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioToggleControl  <class IOAudioToggleControl, id 0x100000338, !registered, !matched, active, busy 0 (0 ms), retain 14>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003ae, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000042e, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000455, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000465, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioToggleControl  <class IOAudioToggleControl, id 0x100000339, !registered, !matched, active, busy 0 (0 ms), retain 14>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003af, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000042f, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000456, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000466, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioToggleControl  <class IOAudioToggleControl, id 0x10000033a, !registered, !matched, active, busy 0 (0 ms), retain 14>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003b0, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000430, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000457, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000467, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioToggleControl  <class IOAudioToggleControl, id 0x10000033b, !registered, !matched, active, busy 0 (0 ms), retain 14>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003b1, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000431, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000458, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000468, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o AudioAUUCDriver  <class AudioAUUCDriver, id 0x10000033d, registered, matched, active, busy 0 (1 ms), retain 4>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x10000039c, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x1000003b5, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x1000003dc, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x1000003e0, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x1000003ee, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x1000003f2, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000418, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x10000041c, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x10000043c, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000441, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x10000045d, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000461, !registered, !matched, active, busy 0, retain 6>
+    | |   |             +-o AppleHDAEngineInput at 1B,0,1,0  <class AppleHDAEngineInput, id 0x10000033c, registered, matched, active, busy 0 (3 ms), retain 34>
+    | |   |             | +-o AppleHDAStream  <class AppleHDAStream, id 0x10000033e, registered, matched, active, busy 0 (2 ms), retain 7>
+    | |   |             | +-o IOAudioSelectorControl  <class IOAudioSelectorControl, id 0x10000033f, !registered, !matched, active, busy 0 (0 ms), retain 12>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003a4, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000041d, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000444, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioLevelControl  <class IOAudioLevelControl, id 0x100000340, !registered, !matched, active, busy 0 (0 ms), retain 12>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003a5, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000041e, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000445, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioLevelControl  <class IOAudioLevelControl, id 0x100000341, !registered, !matched, active, busy 0 (0 ms), retain 12>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003a6, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000041f, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000446, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioToggleControl  <class IOAudioToggleControl, id 0x100000342, !registered, !matched, active, busy 0 (0 ms), retain 12>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003a7, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000420, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000447, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioToggleControl  <class IOAudioToggleControl, id 0x100000343, !registered, !matched, active, busy 0 (0 ms), retain 12>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003a8, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000421, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000448, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioToggleControl  <class IOAudioToggleControl, id 0x100000344, !registered, !matched, active, busy 0 (0 ms), retain 12>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003a9, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000422, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000449, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioToggleControl  <class IOAudioToggleControl, id 0x100000345, !registered, !matched, active, busy 0 (0 ms), retain 24>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003aa, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003b3, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003de, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003f0, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000041a, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000423, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000043e, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000044a, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000045f, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x10000039b, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x1000003b4, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x1000003db, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x1000003df, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x1000003ed, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x1000003f1, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000417, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x10000041b, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x10000043b, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000440, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x10000045c, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000460, !registered, !matched, active, busy 0, retain 6>
+    | |   |             +-o AppleHDAEngineInput at 1B,0,1,1  <class AppleHDAEngineInput, id 0x100000346, registered, matched, active, busy 0 (2 ms), retain 34>
+    | |   |               +-o AppleHDAStream  <class AppleHDAStream, id 0x100000348, registered, matched, active, busy 0 (1 ms), retain 7>
+    | |   |               +-o IOAudioSelectorControl  <class IOAudioSelectorControl, id 0x100000349, !registered, !matched, active, busy 0 (0 ms), retain 12>
+    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000039d, !registered, !matched, active, busy 0, retain 6>
+    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000424, !registered, !matched, active, busy 0, retain 6>
+    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000044b, !registered, !matched, active, busy 0, retain 6>
+    | |   |               +-o IOAudioLevelControl  <class IOAudioLevelControl, id 0x10000034a, !registered, !matched, active, busy 0 (0 ms), retain 12>
+    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000039e, !registered, !matched, active, busy 0, retain 6>
+    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000425, !registered, !matched, active, busy 0, retain 6>
+    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000044c, !registered, !matched, active, busy 0, retain 6>
+    | |   |               +-o IOAudioLevelControl  <class IOAudioLevelControl, id 0x10000034b, !registered, !matched, active, busy 0 (0 ms), retain 12>
+    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000039f, !registered, !matched, active, busy 0, retain 6>
+    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000426, !registered, !matched, active, busy 0, retain 6>
+    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000044d, !registered, !matched, active, busy 0, retain 6>
+    | |   |               +-o IOAudioToggleControl  <class IOAudioToggleControl, id 0x10000034c, !registered, !matched, active, busy 0 (0 ms), retain 12>
+    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003a0, !registered, !matched, active, busy 0, retain 6>
+    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000427, !registered, !matched, active, busy 0, retain 6>
+    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000044e, !registered, !matched, active, busy 0, retain 6>
+    | |   |               +-o IOAudioToggleControl  <class IOAudioToggleControl, id 0x10000034d, !registered, !matched, active, busy 0 (0 ms), retain 12>
+    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003a1, !registered, !matched, active, busy 0, retain 6>
+    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000428, !registered, !matched, active, busy 0, retain 6>
+    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000044f, !registered, !matched, active, busy 0, retain 6>
+    | |   |               +-o IOAudioToggleControl  <class IOAudioToggleControl, id 0x10000034e, !registered, !matched, active, busy 0 (0 ms), retain 12>
+    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003a2, !registered, !matched, active, busy 0, retain 6>
+    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000429, !registered, !matched, active, busy 0, retain 6>
+    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000450, !registered, !matched, active, busy 0, retain 6>
+    | |   |               +-o IOAudioToggleControl  <class IOAudioToggleControl, id 0x10000034f, !registered, !matched, active, busy 0 (0 ms), retain 12>
+    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003a3, !registered, !matched, active, busy 0, retain 6>
+    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000042a, !registered, !matched, active, busy 0, retain 6>
+    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000451, !registered, !matched, active, busy 0, retain 6>
+    | |   |               +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x10000039a, !registered, !matched, active, busy 0, retain 6>
+    | |   |               +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x1000003b2, !registered, !matched, active, busy 0, retain 6>
+    | |   |               +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x1000003da, !registered, !matched, active, busy 0, retain 6>
+    | |   |               +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x1000003dd, !registered, !matched, active, busy 0, retain 6>
+    | |   |               +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x1000003ec, !registered, !matched, active, busy 0, retain 6>
+    | |   |               +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x1000003ef, !registered, !matched, active, busy 0, retain 6>
+    | |   |               +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000416, !registered, !matched, active, busy 0, retain 6>
+    | |   |               +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000419, !registered, !matched, active, busy 0, retain 6>
+    | |   |               +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x10000043a, !registered, !matched, active, busy 0, retain 6>
+    | |   |               +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x10000043d, !registered, !matched, active, busy 0, retain 6>
+    | |   |               +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x10000045b, !registered, !matched, active, busy 0, retain 6>
+    | |   |               +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x10000045e, !registered, !matched, active, busy 0, retain 6>
+    | |   +-o pci-bridge at 1C  <class IOPCIDevice, id 0x1000001b3, registered, matched, active, busy 0 (60 ms), retain 9>
+    | |   | +-o IOPCI2PCIBridge  <class IOPCI2PCIBridge, id 0x1000001d7, registered, matched, active, busy 0 (30 ms), retain 5>
+    | |   +-o RP04 at 1C,3  <class IOPCIDevice, id 0x10000017f, registered, matched, active, busy 0 (114 ms), retain 11>
+    | |   | +-o IOPCI2PCIBridge  <class IOPCI2PCIBridge, id 0x1000001da, registered, matched, active, busy 0 (82 ms), retain 7>
+    | |   |   +-o FRWR at 0  <class IOPCIDevice, id 0x100000180, registered, matched, active, busy 0 (80 ms), retain 10>
+    | |   |     +-o AppleFWOHCI  <class AppleFWOHCI, id 0x1000001f5, !registered, !matched, active, busy 0 (48 ms), retain 6>
+    | |   |       +-o IOFireWireController  <class IOFireWireController, id 0x1000001f7, registered, matched, active, busy 0 (48 ms), retain 9>
+    | |   |         +-o IOFireWireLocalNode  <class IOFireWireLocalNode, id 0x10000026e, registered, matched, active, busy 0 (47 ms), retain 12>
+    | |   |           +-o IOFireWireUserClientIniter  <class IOFireWireUserClientIniter, id 0x10000026f, !registered, !matched, active, busy 0, retain 4>
+    | |   |           +-o IOFireWireUserClientIniter  <class IOFireWireUserClientIniter, id 0x1000002ca, !registered, !matched, active, busy 0, retain 4>
+    | |   |           +-o IOFireWireIP  <class IOFireWireIP, id 0x1000002cb, registered, matched, active, busy 0 (4 ms), retain 5>
+    | |   |             +-o IOFWInterface  <class IOFWInterface, id 0x1000002cd, registered, matched, active, busy 0 (3 ms), retain 10>
+    | |   |               +-o IONetworkStack  <class IONetworkStack, id 0x10000021f, registered, matched, active, busy 0 (2 ms), retain 11>
+    | |   |                 +-o IONetworkStackUserClient  <class IONetworkStackUserClient, id 0x1000002aa, !registered, !matched, active, busy 0, retain 5>
+    | |   +-o RP05 at 1C,4  <class IOPCIDevice, id 0x100000181, registered, matched, active, busy 0 (237 ms), retain 11>
+    | |   | +-o IOPCI2PCIBridge  <class IOPCI2PCIBridge, id 0x1000001de, registered, matched, active, busy 0 (203 ms), retain 7>
+    | |   |   +-o ARPT at 0  <class IOPCIDevice, id 0x100000182, registered, matched, active, busy 0 (203 ms), retain 12>
+    | |   |     +-o AirPort_Brcm43224  <class AirPort_Brcm43224, id 0x1000001fb, registered, matched, active, busy 0 (9 ms), retain 8>
+    | |   |       +-o AirPort_Brcm43224Interface  <class AirPort_Brcm43224Interface, id 0x100000237, registered, matched, active, busy 0 (7 ms), retain 10>
+    | |   |         +-o IONetworkStack  <class IONetworkStack, id 0x10000021f, registered, matched, active, busy 0 (2 ms), retain 11>
+    | |   |           +-o IONetworkStackUserClient  <class IONetworkStackUserClient, id 0x1000002aa, !registered, !matched, active, busy 0, retain 5>
+    | |   +-o RP06 at 1C,5  <class IOPCIDevice, id 0x100000183, registered, matched, active, busy 0 (6723 ms), retain 11>
+    | |   | +-o IOPCI2PCIBridge  <class IOPCI2PCIBridge, id 0x1000001e2, registered, matched, active, busy 0 (6686 ms), retain 7>
+    | |   |   +-o GIGE at 0  <class IOPCIDevice, id 0x100000184, registered, matched, active, busy 0 (6686 ms), retain 10>
+    | |   |     +-o yukon2osx  <class yukon2osx, id 0x1000001fd, !registered, !matched, active, busy 0 (1 ms), retain 7>
+    | |   |       +-o yukon  <class yukon, id 0x1000002a8, !registered, !matched, active, busy 0 (1 ms), retain 8>
+    | |   |         +-o IOEthernetInterface  <class IOEthernetInterface, id 0x1000002a9, registered, matched, active, busy 0 (1 ms), retain 11>
+    | |   |           +-o IONetworkStack  <class IONetworkStack, id 0x10000021f, registered, matched, active, busy 0 (2 ms), retain 11>
+    | |   |             +-o IONetworkStackUserClient  <class IONetworkStackUserClient, id 0x1000002aa, !registered, !matched, active, busy 0, retain 5>
+    | |   +-o UHC1 at 1D  <class IOPCIDevice, id 0x100000185, registered, matched, active, busy 0 (634 ms), retain 11>
+    | |   | +-o AppleUSBUHCI  <class AppleUSBUHCI, id 0x1000001e6, registered, matched, active, busy 0 (292 ms), retain 9>
+    | |   |   +-o UHCI Root Hub Simulation at 1D  <class IOUSBRootHubDevice, id 0x100000242, registered, matched, active, busy 0 (281 ms), retain 8>
+    | |   |     | {
+    | |   |     |   "sessionID" = 542392661
+    | |   |     |   "AAPL,current-extra-in-sleep" = 500
+    | |   |     |   "iManufacturer" = 2
+    | |   |     |   "bNumConfigurations" = 1
+    | |   |     |   "idProduct" = 32773
+    | |   |     |   "bcdDevice" = 272
+    | |   |     |   "Bus Power Available" = 250
+    | |   |     |   "bMaxPacketSize0" = 8
+    | |   |     |   "USB Product Name" = "UHCI Root Hub Simulation"
+    | |   |     |   "iProduct" = 1
+    | |   |     |   "iSerialNumber" = 0
+    | |   |     |   "USB Address" = 1
+    | |   |     |   "bDeviceClass" = 9
+    | |   |     |   "locationID" = 486539264
+    | |   |     |   "bDeviceSubClass" = 0
+    | |   |     |   "IOUserClientClass" = "IOUSBDeviceUserClientV2"
+    | |   |     |   "Ports" = 2
+    | |   |     |   "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
+    | |   |     |   "AAPL,max-port-current-in-sleep" = 1000
+    | |   |     |   "bDeviceProtocol" = 0
+    | |   |     |   "USB Vendor Name" = "Apple Inc."
+    | |   |     |   "Device Speed" = 1
+    | |   |     |   "idVendor" = 1452
+    | |   |     |   "AAPL,current-in-sleep" = 1000
+    | |   |     |   "Requested Power" = 0
+    | |   |     |   "AAPL,port-current-in-sleep" = 500
+    | |   |     |   "Low Power Displayed" = No
+    | |   |     | }
+    | |   |     | 
+    | |   |     +-o AppleUSBHub  <class AppleUSBHub, id 0x100000245, !registered, !matched, active, busy 0, retain 6>
+    | |   |     +-o IOUSBInterface at 0  <class IOUSBInterface, id 0x100000247, !registered, !matched, active, busy 0, retain 7>
+    | |   +-o UHC2 at 1D,1  <class IOPCIDevice, id 0x100000189, registered, matched, active, busy 0 (756 ms), retain 11>
+    | |   | +-o AppleUSBUHCI  <class AppleUSBUHCI, id 0x1000001e7, registered, matched, active, busy 0 (416 ms), retain 8>
+    | |   |   +-o UHCI Root Hub Simulation at 1D,1  <class IOUSBRootHubDevice, id 0x100000238, registered, matched, active, busy 0 (416 ms), retain 8>
+    | |   |     | {
+    | |   |     |   "sessionID" = 528553166
+    | |   |     |   "AAPL,current-extra-in-sleep" = 500
+    | |   |     |   "iManufacturer" = 2
+    | |   |     |   "bNumConfigurations" = 1
+    | |   |     |   "idProduct" = 32773
+    | |   |     |   "bcdDevice" = 272
+    | |   |     |   "Bus Power Available" = 250
+    | |   |     |   "bMaxPacketSize0" = 8
+    | |   |     |   "USB Product Name" = "UHCI Root Hub Simulation"
+    | |   |     |   "iProduct" = 1
+    | |   |     |   "iSerialNumber" = 0
+    | |   |     |   "USB Address" = 1
+    | |   |     |   "bDeviceClass" = 9
+    | |   |     |   "locationID" = 1023410176
+    | |   |     |   "bDeviceSubClass" = 0
+    | |   |     |   "IOUserClientClass" = "IOUSBDeviceUserClientV2"
+    | |   |     |   "Ports" = 2
+    | |   |     |   "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
+    | |   |     |   "AAPL,max-port-current-in-sleep" = 1000
+    | |   |     |   "bDeviceProtocol" = 0
+    | |   |     |   "USB Vendor Name" = "Apple Inc."
+    | |   |     |   "Device Speed" = 1
+    | |   |     |   "idVendor" = 1452
+    | |   |     |   "AAPL,current-in-sleep" = 1000
+    | |   |     |   "Requested Power" = 0
+    | |   |     |   "AAPL,port-current-in-sleep" = 500
+    | |   |     |   "Low Power Displayed" = No
+    | |   |     | }
+    | |   |     | 
+    | |   |     +-o AppleUSBHub  <class AppleUSBHub, id 0x10000023a, !registered, !matched, active, busy 0, retain 6>
+    | |   |     +-o IOUSBInterface at 0  <class IOUSBInterface, id 0x10000023c, !registered, !matched, active, busy 0, retain 7>
+    | |   +-o UHC3 at 1D,2  <class IOPCIDevice, id 0x10000018d, registered, matched, active, busy 0 (924 ms), retain 11>
+    | |   | +-o AppleUSBUHCI  <class AppleUSBUHCI, id 0x1000001e8, registered, matched, active, busy 0 (583 ms), retain 9>
+    | |   |   +-o UHCI Root Hub Simulation at 1D,2  <class IOUSBRootHubDevice, id 0x10000023d, registered, matched, active, busy 0 (425 ms), retain 10>
+    | |   |   | | {
+    | |   |   | |   "sessionID" = 533559502
+    | |   |   | |   "AAPL,current-extra-in-sleep" = 500
+    | |   |   | |   "iManufacturer" = 2
+    | |   |   | |   "bNumConfigurations" = 1
+    | |   |   | |   "idProduct" = 32773
+    | |   |   | |   "bcdDevice" = 272
+    | |   |   | |   "Bus Power Available" = 250
+    | |   |   | |   "bMaxPacketSize0" = 8
+    | |   |   | |   "USB Product Name" = "UHCI Root Hub Simulation"
+    | |   |   | |   "iProduct" = 1
+    | |   |   | |   "iSerialNumber" = 0
+    | |   |   | |   "USB Address" = 1
+    | |   |   | |   "bDeviceClass" = 9
+    | |   |   | |   "locationID" = 1560281088
+    | |   |   | |   "bDeviceSubClass" = 0
+    | |   |   | |   "IOUserClientClass" = "IOUSBDeviceUserClientV2"
+    | |   |   | |   "Ports" = 2
+    | |   |   | |   "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
+    | |   |   | |   "AAPL,max-port-current-in-sleep" = 1000
+    | |   |   | |   "bDeviceProtocol" = 0
+    | |   |   | |   "USB Vendor Name" = "Apple Inc."
+    | |   |   | |   "Device Speed" = 1
+    | |   |   | |   "idVendor" = 1452
+    | |   |   | |   "AAPL,current-in-sleep" = 1000
+    | |   |   | |   "Requested Power" = 0
+    | |   |   | |   "AAPL,port-current-in-sleep" = 500
+    | |   |   | |   "Low Power Displayed" = No
+    | |   |   | | }
+    | |   |   | | 
+    | |   |   | +-o AppleUSBHub  <class AppleUSBHub, id 0x10000023f, !registered, !matched, active, busy 0, retain 8>
+    | |   |   | +-o IOUSBInterface at 0  <class IOUSBInterface, id 0x100000241, !registered, !matched, active, busy 0, retain 7>
+    | |   |   +-o IR Receiver at 5d100000  <class IOUSBDevice, id 0x100000286, registered, matched, active, busy 0 (577 ms), retain 9>
+    | |   |     | {
+    | |   |     |   "sessionID" = 1116620200
+    | |   |     |   "iManufacturer" = 1
+    | |   |     |   "bNumConfigurations" = 1
+    | |   |     |   "idProduct" = 33346
+    | |   |     |   "bcdDevice" = 22
+    | |   |     |   "Bus Power Available" = 250
+    | |   |     |   "bMaxPacketSize0" = 8
+    | |   |     |   "USB Product Name" = "IR Receiver"
+    | |   |     |   "iProduct" = 2
+    | |   |     |   "iSerialNumber" = 0
+    | |   |     |   "USB Address" = 2
+    | |   |     |   "bDeviceClass" = 0
+    | |   |     |   "locationID" = 1561329664
+    | |   |     |   "bDeviceSubClass" = 0
+    | |   |     |   "IOUserClientClass" = "IOUSBDeviceUserClientV2"
+    | |   |     |   "PortNum" = 1
+    | |   |     |   "non-removable" = "yes"
+    | |   |     |   "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
+    | |   |     |   "bDeviceProtocol" = 0
+    | |   |     |   "Need contiguous memory for isoch" = Yes
+    | |   |     |   "USB Vendor Name" = "Apple Computer, Inc."
+    | |   |     |   "Device Speed" = 0
+    | |   |     |   "idVendor" = 1452
+    | |   |     |   "Requested Power" = 50
+    | |   |     |   "IOGeneralInterest" = "IOCommand is not serializable"
+    | |   |     |   "Low Power Displayed" = No
+    | |   |     | }
+    | |   |     | 
+    | |   |     +-o IOUSBCompositeDriver  <class IOUSBCompositeDriver, id 0x100000288, !registered, !matched, active, busy 0, retain 4>
+    | |   |     +-o IOUSBInterface at 0  <class IOUSBInterface, id 0x100000289, registered, matched, active, busy 0 (272 ms), retain 8>
+    | |   |       +-o AppleIRController  <class AppleIRController, id 0x10000028b, registered, matched, active, busy 0 (51 ms), retain 8>
+    | |   |         +-o IOHIDInterface  <class IOHIDInterface, id 0x10000028c, registered, matched, active, busy 0 (2 ms), retain 5>
+    | |   |         +-o IOHIDLibUserClient  <class IOHIDLibUserClient, id 0x1000003d6, !registered, !matched, active, busy 0, retain 6>
+    | |   +-o EHC1 at 1D,7  <class IOPCIDevice, id 0x100000199, registered, matched, active, busy 0 (1067 ms), retain 17>
+    | |   | +-o IOService  <class IOService, id 0x1000001ff, !registered, !matched, active, busy 0, retain 4>
+    | |   | +-o AppleUSBEHCI  <class AppleUSBEHCI, id 0x100000200, registered, matched, active, busy 0 (978 ms), retain 13>
+    | |   |   +-o EHCI Root Hub Simulation at 1D,7  <class IOUSBRootHubDevice, id 0x100000209, registered, matched, active, busy 0 (446 ms), retain 12>
+    | |   |   | | {
+    | |   |   | |   "sessionID" = 278360131
+    | |   |   | |   "AAPL,current-extra-in-sleep" = 500
+    | |   |   | |   "iManufacturer" = 2
+    | |   |   | |   "bNumConfigurations" = 1
+    | |   |   | |   "idProduct" = 32774
+    | |   |   | |   "bcdDevice" = 512
+    | |   |   | |   "Bus Power Available" = 250
+    | |   |   | |   "bMaxPacketSize0" = 64
+    | |   |   | |   "USB Product Name" = "EHCI Root Hub Simulation"
+    | |   |   | |   "iProduct" = 1
+    | |   |   | |   "iSerialNumber" = 0
+    | |   |   | |   "USB Address" = 1
+    | |   |   | |   "bDeviceClass" = 9
+    | |   |   | |   "locationID" = 18446744073659219968
+    | |   |   | |   "bDeviceSubClass" = 0
+    | |   |   | |   "AAPL,current-extra" = 1000
+    | |   |   | |   "IOUserClientClass" = "IOUSBDeviceUserClientV2"
+    | |   |   | |   "Ports" = 6
+    | |   |   | |   "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
+    | |   |   | |   "AAPL,current-available" = 1500
+    | |   |   | |   "bDeviceProtocol" = 1
+    | |   |   | |   "AAPL,max-port-current-in-sleep" = 1000
+    | |   |   | |   "USB Vendor Name" = "Apple Inc."
+    | |   |   | |   "Device Speed" = 2
+    | |   |   | |   "idVendor" = 1452
+    | |   |   | |   "AAPL,current-in-sleep" = 3000
+    | |   |   | |   "Requested Power" = 0
+    | |   |   | |   "AAPL,port-current-in-sleep" = 500
+    | |   |   | |   "Low Power Displayed" = No
+    | |   |   | | }
+    | |   |   | | 
+    | |   |   | +-o AppleUSBHub  <class AppleUSBHub, id 0x10000020c, registered, matched, active, busy 0 (0 ms), retain 9>
+    | |   |   | +-o IOUSBInterface at 0  <class IOUSBInterface, id 0x10000020e, !registered, !matched, active, busy 0, retain 7>
+    | |   |   +-o LaCie Device at fd100000  <class IOUSBDevice, id 0x10000024d, registered, matched, active, busy 0 (725 ms), retain 8>
+    | |   |   | | {
+    | |   |   | |   "sessionID" = 637721320
+    | |   |   | |   "iManufacturer" = 10
+    | |   |   | |   "bNumConfigurations" = 1
+    | |   |   | |   "idProduct" = 4138
+    | |   |   | |   "bcdDevice" = 256
+    | |   |   | |   "Bus Power Available" = 250
+    | |   |   | |   "bMaxPacketSize0" = 64
+    | |   |   | |   "USB Product Name" = "LaCie Device"
+    | |   |   | |   "iProduct" = 11
+    | |   |   | |   "iSerialNumber" = 5
+    | |   |   | |   "USB Address" = 2
+    | |   |   | |   "bDeviceClass" = 0
+    | |   |   | |   "bDeviceSubClass" = 0
+    | |   |   | |   "locationID" = 18446744073660268544
+    | |   |   | |   "IOUserClientClass" = "IOUSBDeviceUserClientV2"
+    | |   |   | |   "kHasMSCInterface" = Yes
+    | |   |   | |   "PortNum" = 1
+    | |   |   | |   "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
+    | |   |   | |   "bDeviceProtocol" = 0
+    | |   |   | |   "uid" = "USB:059F102A6E7A5FFFFFFF"
+    | |   |   | |   "USB Vendor Name" = "LaCie"
+    | |   |   | |   "Device Speed" = 2
+    | |   |   | |   "idVendor" = 1439
+    | |   |   | |   "USB Serial Number" = "6E7A5FFFFFFF"
+    | |   |   | |   "Requested Power" = 1
+    | |   |   | |   "IOGeneralInterest" = "IOCommand is not serializable"
+    | |   |   | |   "Low Power Displayed" = No
+    | |   |   | | }
+    | |   |   | | 
+    | |   |   | +-o IOUSBCompositeDriver  <class IOUSBCompositeDriver, id 0x10000024f, !registered, !matched, active, busy 0, retain 4>
+    | |   |   | +-o MSC Bulk-Only Transfer at 0  <class IOUSBInterface, id 0x100000250, registered, matched, active, busy 0 (453 ms), retain 7>
+    | |   |   |   +-o IOUSBMassStorageClass  <class IOUSBMassStorageClass, id 0x100000254, registered, matched, active, busy 0 (248 ms), retain 8>
+    | |   |   |     +-o IOSCSIPeripheralDeviceNub  <class IOSCSIPeripheralDeviceNub, id 0x100000256, registered, matched, active, busy 0 (105 ms), retain 6>
+    | |   |   |       +-o IOSCSIPeripheralDeviceType00  <class IOSCSIPeripheralDeviceType00, id 0x100000260, !registered, !matched, active, busy 0 (101 ms), retain 7>
+    | |   |   |         +-o IOBlockStorageServices  <class IOBlockStorageServices, id 0x100000263, registered, matched, active, busy 0 (101 ms), retain 5>
+    | |   |   |           +-o IOBlockStorageDriver  <class IOBlockStorageDriver, id 0x100000264, registered, matched, active, busy 0 (100 ms), retain 7>
+    | |   |   |             +-o ST950032 5AS Media  <class IOMedia, id 0x10000028e, registered, matched, active, busy 0 (99 ms), retain 10>
+    | |   |   |               +-o IOMediaBSDClient  <class IOMediaBSDClient, id 0x10000028f, registered, matched, active, busy 0 (0 ms), retain 5>
+    | |   |   |               +-o IOApplePartitionScheme  <class IOApplePartitionScheme, id 0x100000293, !registered, !matched, active, busy 0 (25 ms), retain 10>
+    | |   |   |                 +-o Apple at 1  <class IOMedia, id 0x100000294, registered, matched, active, busy 0 (4 ms), retain 8>
+    | |   |   |                 | +-o IOMediaBSDClient  <class IOMediaBSDClient, id 0x100000299, registered, matched, active, busy 0 (2 ms), retain 5>
+    | |   |   |                 +-o osx104 at 3  <class IOMedia, id 0x100000295, registered, matched, active, busy 0 (9 ms), retain 9>
+    | |   |   |                 | +-o IOMediaBSDClient  <class IOMediaBSDClient, id 0x10000029a, registered, matched, active, busy 0 (2 ms), retain 6>
+    | |   |   |                 +-o osx105 at 5  <class IOMedia, id 0x100000296, registered, matched, active, busy 0 (10 ms), retain 9>
+    | |   |   |                 | +-o IOMediaBSDClient  <class IOMediaBSDClient, id 0x10000029b, registered, matched, active, busy 0 (2 ms), retain 6>
+    | |   |   |                 +-o osx106 at 7  <class IOMedia, id 0x100000297, registered, matched, active, busy 0 (10 ms), retain 9>
+    | |   |   |                 | +-o IOMediaBSDClient  <class IOMediaBSDClient, id 0x10000029c, registered, matched, active, busy 0 (2 ms), retain 6>
+    | |   |   |                 +-o vms at 9  <class IOMedia, id 0x100000298, registered, matched, active, busy 0 (11 ms), retain 9>
+    | |   |   |                   +-o IOMediaBSDClient  <class IOMediaBSDClient, id 0x10000029d, registered, matched, active, busy 0 (2 ms), retain 6>
+    | |   |   +-o Built-in iSight at fd400000  <class IOUSBDevice, id 0x10000025b, registered, matched, active, busy 0 (607 ms), retain 10>
+    | |   |     | {
+    | |   |     |   "sessionID" = 791376929
+    | |   |     |   "iManufacturer" = 1
+    | |   |     |   "bNumConfigurations" = 1
+    | |   |     |   "idProduct" = 34050
+    | |   |     |   "bcdDevice" = 341
+    | |   |     |   "Bus Power Available" = 250
+    | |   |     |   "bMaxPacketSize0" = 64
+    | |   |     |   "USB Product Name" = "Built-in iSight"
+    | |   |     |   "iProduct" = 2
+    | |   |     |   "iSerialNumber" = 3
+    | |   |     |   "USB Address" = 3
+    | |   |     |   "bDeviceClass" = 239
+    | |   |     |   "bDeviceSubClass" = 2
+    | |   |     |   "locationID" = 18446744073663414272
+    | |   |     |   "IOUserClientClass" = "IOUSBDeviceUserClientV2"
+    | |   |     |   "PortNum" = 4
+    | |   |     |   "non-removable" = "yes"
+    | |   |     |   "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
+    | |   |     |   "bDeviceProtocol" = 1
+    | |   |     |   "USB Vendor Name" = "Apple Inc."
+    | |   |     |   "Device Speed" = 2
+    | |   |     |   "idVendor" = 1452
+    | |   |     |   "USB Serial Number" = "6067E773DA9722F4 (03.01)"
+    | |   |     |   "Requested Power" = 250
+    | |   |     |   "IOGeneralInterest" = "IOCommand is not serializable"
+    | |   |     |   "kSuspendPort" = Yes
+    | |   |     |   "Low Power Displayed" = No
+    | |   |     | }
+    | |   |     | 
+    | |   |     +-o IOUSBCompositeDriver  <class IOUSBCompositeDriver, id 0x10000025f, !registered, !matched, active, busy 0, retain 4>
+    | |   |     +-o IOUSBInterface at 0  <class IOUSBInterface, id 0x100000265, registered, matched, active, busy 0 (373 ms), retain 6>
+    | |   |     +-o IOUSBInterface at 1  <class IOUSBInterface, id 0x100000266, registered, matched, active, busy 0 (399 ms), retain 6>
+    | |   |     +-o IOUSBInterface at 2  <class IOUSBInterface, id 0x100000267, registered, matched, active, busy 0 (433 ms), retain 6>
+    | |   +-o pci-bridge at 1E  <class IOPCIDevice, id 0x1000001b4, registered, matched, active, busy 0 (199 ms), retain 9>
+    | |   | +-o IOPCI2PCIBridge  <class IOPCI2PCIBridge, id 0x100000204, registered, matched, active, busy 0 (113 ms), retain 5>
+    | |   +-o LPCB at 1F  <class IOPCIDevice, id 0x1000001a7, registered, matched, active, busy 0 (253 ms), retain 28>
+    | |   | +-o AppleLPC  <class AppleLPC, id 0x1000002b7, registered, matched, active, busy 0 (2 ms), retain 5>
+    | |   +-o PATA at 1F,1  <class IOPCIDevice, id 0x1000001a8, registered, matched, active, busy 0 (500 ms), retain 13>
+    | |   | +-o AppleIntelPIIXATARoot  <class AppleIntelPIIXATARoot, id 0x1000001ee, !registered, !matched, active, busy 0 (450 ms), retain 6>
+    | |   |   +-o PRID at 0  <class AppleIntelPIIXATAChannel, id 0x1000001a9, registered, matched, active, busy 0 (450 ms), retain 11>
+    | |   |   | +-o AppleIntelPIIXPATA  <class AppleIntelPIIXPATA, id 0x1000001f4, registered, matched, active, busy 0 (412 ms), retain 7>
+    | |   |   |   +-o ATADeviceNub at 0  <class ATADeviceNub, id 0x10000021b, registered, matched, active, busy 0 (306 ms), retain 6>
+    | |   |   |     +-o IOATAPIProtocolTransport  <class IOATAPIProtocolTransport, id 0x10000022e, registered, matched, active, busy 0 (276 ms), retain 9>
+    | |   |   |       +-o IOSCSIPeripheralDeviceNub  <class IOSCSIPeripheralDeviceNub, id 0x100000234, registered, matched, active, busy 0 (43 ms), retain 6>
+    | |   |   |         +-o IOSCSIPeripheralDeviceType05  <class IOSCSIPeripheralDeviceType05, id 0x100000251, !registered, !matched, active, busy 0 (2 ms), retain 7>
+    | |   |   |           +-o IODVDServices  <class IODVDServices, id 0x100000258, registered, matched, active, busy 0 (2 ms), retain 6>
+    | |   |   |             +-o IODVDBlockStorageDriver  <class IODVDBlockStorageDriver, id 0x100000259, registered, matched, active, busy 0 (0 ms), retain 5>
+    | |   |   |             +-o SCSITaskUserClientIniter  <class SCSITaskUserClientIniter, id 0x10000025a, !registered, !matched, active, busy 0, retain 4>
+    | |   |   +-o CHN1 at 1  <class AppleIntelPIIXATAChannel, id 0x1000001ef, registered, matched, active, busy 0 (51 ms), retain 6>
+    | |   +-o SATA at 1F,2  <class IOPCIDevice, id 0x1000001ac, registered, matched, active, busy 0 (309 ms), retain 12>
+    | |   | +-o AppleICH8AHCI  <class AppleICH8AHCI, id 0x1000001f0, registered, matched, active, busy 0 (254 ms), retain 7>
+    | |   |   +-o PRT0 at 0  <class AppleAHCIPort, id 0x1000001ad, registered, matched, active, busy 0 (246 ms), retain 10>
+    | |   |     +-o IOAHCIDevice at 0  <class IOAHCIDevice, id 0x1000001f9, registered, matched, active, busy 0 (246 ms), retain 12>
+    | |   |       +-o AppleAHCIDiskDriver  <class AppleAHCIDiskDriver, id 0x1000001fa, registered, matched, active, busy 0 (219 ms), retain 6>
+    | |   |         +-o IOAHCIBlockStorageDevice  <class IOAHCIBlockStorageDevice, id 0x10000020a, registered, matched, active, busy 0 (212 ms), retain 6>
+    | |   |           +-o IOBlockStorageDriver  <class IOBlockStorageDriver, id 0x100000211, registered, matched, active, busy 0 (211 ms), retain 7>
+    | |   |             +-o WDC WD3200AAJS-40VWA0 Media  <class IOMedia, id 0x100000212, registered, matched, active, busy 0 (211 ms), retain 10>
+    | |   |               +-o IOMediaBSDClient  <class IOMediaBSDClient, id 0x100000213, registered, matched, active, busy 0 (0 ms), retain 5>
+    | |   |               +-o IOGUIDPartitionScheme  <class IOGUIDPartitionScheme, id 0x100000215, !registered, !matched, active, busy 0 (96 ms), retain 8>
+    | |   |                 +-o EFI System Partition at 1  <class IOMedia, id 0x100000229, registered, matched, active, busy 0 (3 ms), retain 8>
+    | |   |                 | +-o IOMediaBSDClient  <class IOMediaBSDClient, id 0x10000022f, registered, matched, active, busy 0 (0 ms), retain 5>
+    | |   |                 +-o osx at 2  <class IOMedia, id 0x10000022a, registered, matched, active, busy 0 (95 ms), retain 10>
+    | |   |                 | +-o IOMediaBSDClient  <class IOMediaBSDClient, id 0x100000230, registered, matched, active, busy 0 (2 ms), retain 6>
+    | |   |                 +-o Sauvegardes at 3  <class IOMedia, id 0x10000022b, registered, matched, active, busy 0 (95 ms), retain 9>
+    | |   |                   +-o IOMediaBSDClient  <class IOMediaBSDClient, id 0x100000231, registered, matched, active, busy 0 (0 ms), retain 6>
+    | |   +-o SBUS at 1F,3  <class IOPCIDevice, id 0x1000001ae, registered, matched, active, busy 0 (68 ms), retain 8>
+    | +-o PDRC  <class IOACPIPlatformDevice, id 0x10000012f, registered, matched, active, busy 0 (4 ms), retain 6>
+    | +-o SMC  <class IOACPIPlatformDevice, id 0x100000167, registered, matched, active, busy 0 (155 ms), retain 7>
+    | | +-o AppleSMC  <class AppleSMC, id 0x1000002c1, registered, matched, active, busy 0 (83 ms), retain 6>
+    | |   +-o SMCWatchDogTimer  <class SMCWatchDogTimer, id 0x1000002d7, registered, matched, active, busy 0 (60 ms), retain 5>
+    | +-o EC  <class IOACPIPlatformDevice, id 0x100000168, registered, matched, active, busy 0 (7 ms), retain 8>
+    | | +-o AppleACPIEC  <class AppleACPIEC, id 0x100000124, !registered, !matched, active, busy 0, retain 6>
+    | +-o DMAC  <class IOACPIPlatformDevice, id 0x100000169, registered, matched, active, busy 0 (8 ms), retain 6>
+    | +-o FWHD  <class IOACPIPlatformDevice, id 0x10000016a, registered, matched, active, busy 0 (12 ms), retain 6>
+    | +-o HPET  <class IOACPIPlatformDevice, id 0x10000016b, registered, matched, active, busy 0 (26 ms), retain 7>
+    | | +-o AppleHPET  <class AppleHPET, id 0x1000001cc, !registered, !matched, active, busy 0, retain 4>
+    | +-o IPIC  <class IOACPIPlatformDevice, id 0x10000016c, registered, matched, active, busy 0 (13 ms), retain 6>
+    | +-o MATH  <class IOACPIPlatformDevice, id 0x10000016d, registered, matched, active, busy 0 (13 ms), retain 6>
+    | +-o LDRC  <class IOACPIPlatformDevice, id 0x10000016e, registered, matched, active, busy 0 (14 ms), retain 6>
+    | +-o RTC  <class IOACPIPlatformDevice, id 0x10000016f, registered, matched, active, busy 0 (99 ms), retain 8>
+    | | +-o AppleRTC  <class AppleRTC, id 0x1000001c8, registered, matched, active, busy 0 (75 ms), retain 6>
+    | +-o TIMR  <class IOACPIPlatformDevice, id 0x100000170, registered, matched, active, busy 0 (16 ms), retain 6>
+    | +-o AppleEFIRuntime  <class AppleEFIRuntime, id 0x1000001c9, registered, matched, active, busy 0 (693 ms), retain 7>
+    | | +-o AppleEFINVRAM  <class AppleEFINVRAM, id 0x1000001ca, registered, matched, active, busy 0 (1 ms), retain 6>
+    | +-o IOPCIMessagedInterruptController  <class IOPCIMessagedInterruptController, id 0x1000001cd, registered, matched, active, busy 0 (40 ms), retain 6>
+    | +-o AppleRawIOAddressSpace  <class AppleRawIOAddressSpace, id 0x1000002d5, registered, matched, active, busy 0 (23 ms), retain 4>
+    | +-o AppleRawPhysicalMemoryAddressSpace  <class AppleRawPhysicalMemoryAddressSpace, id 0x1000002d6, registered, matched, active, busy 0 (24 ms), retain 4>
+    +-o IOResources  <class IOResources, id 0x100000113, registered, matched, active, busy 0 (991 ms), retain 31>
+      +-o AppleIntelCPUPowerManagement  <class AppleIntelCPUPowerManagement, id 0x10000011b, registered, matched, active, busy 0 (234 ms), retain 5>
+      | +-o AppleIntelCPUPowerManagementClient  <class AppleIntelCPUPowerManagementClient, id 0x100000120, !registered, !matched, active, busy 0, retain 4>
+      +-o IOHDIXController  <class IOHDIXController, id 0x10000011c, registered, matched, active, busy 0 (1 ms), retain 4>
+      +-o com_apple_AppleFSCompression_AppleFSCompressionTypeZlib  <class com_apple_AppleFSCompression_AppleFSCompressionTypeZlib, id 0x10000021d, !registered, !matched, active, busy 0, retain 4>
+      +-o com_apple_BootCache  <class com_apple_BootCache, id 0x10000021e, !registered, !matched, active, busy 0, retain 4>
+      +-o IONetworkStack  <class IONetworkStack, id 0x10000021f, registered, matched, active, busy 0 (2 ms), retain 11>
+      | +-o IONetworkStackUserClient  <class IONetworkStackUserClient, id 0x1000002aa, !registered, !matched, active, busy 0, retain 5>
+      +-o IOHIDSystem  <class IOHIDSystem, id 0x100000220, registered, matched, active, busy 0 (2 ms), retain 16>
+      | +-o IOHIDUserClient  <class IOHIDUserClient, id 0x10000036a, !registered, !matched, active, busy 0, retain 5>
+      | +-o IOHIDParamUserClient  <class IOHIDParamUserClient, id 0x10000036b, !registered, !matched, active, busy 0, retain 5>
+      | +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000037c, !registered, !matched, active, busy 0, retain 5>
+      | +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000037d, !registered, !matched, active, busy 0, retain 5>
+      +-o AppleProfileOSHooks  <class AppleProfileOSHooks, id 0x1000002bd, registered, matched, active, busy 0 (86 ms), retain 15>
+      | +-o AppleProfileTimeTrigger  <class AppleProfileTimeTrigger, id 0x1000002db, registered, matched, active, busy 0 (53 ms), retain 6>
+      | +-o AppleProfilePMITrigger  <class AppleProfilePMITrigger, id 0x1000002dc, registered, matched, active, busy 0 (54 ms), retain 6>
+      | +-o AppleOSXPerformanceMonitor  <class AppleOSXPerformanceMonitor, id 0x1000002dd, !registered, !matched, active, busy 0 (55 ms), retain 6>
+      | | +-o AppleOSXPerformanceCounter  <class AppleOSXPerformanceCounter, id 0x1000002e8, registered, matched, active, busy 0 (55 ms), retain 6>
+      | | | +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x1000002de, registered, matched, active, busy 0 (57 ms), retain 18>
+      | | |   +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x10000030d, !registered, !matched, active, busy 0, retain 5>
+      | | +-o AppleOSXPerformanceCounter  <class AppleOSXPerformanceCounter, id 0x1000002e9, registered, matched, active, busy 0 (55 ms), retain 6>
+      | |   +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x1000002de, registered, matched, active, busy 0 (57 ms), retain 18>
+      | |     +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x10000030d, !registered, !matched, active, busy 0, retain 5>
+      | +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x1000002de, registered, matched, active, busy 0 (57 ms), retain 17>
+      | | +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x10000030d, !registered, !matched, active, busy 0, retain 5>
+      | +-o AppleProfileKEventTrigger  <class AppleProfileKEventTrigger, id 0x1000002df, registered, matched, active, busy 0 (57 ms), retain 6>
+      | +-o AppleProfileManualTrigger  <class AppleProfileManualTrigger, id 0x1000002e0, registered, matched, active, busy 0 (62 ms), retain 6>
+      | +-o AppleProfileCallstackAction  <class AppleProfileCallstackAction, id 0x1000002e1, !registered, !matched, active, busy 0, retain 5>
+      | +-o AppleProfileKEventAction  <class AppleProfileKEventAction, id 0x1000002e2, !registered, !matched, active, busy 0, retain 5>
+      | +-o AppleProfileRegisterStateAction  <class AppleProfileRegisterStateAction, id 0x1000002e3, !registered, !matched, active, busy 0, retain 5>
+      | +-o AppleProfileThreadInfoAction  <class AppleProfileThreadInfoAction, id 0x1000002e4, !registered, !matched, active, busy 0, retain 5>
+      | +-o AppleProfileTimestampAction  <class AppleProfileTimestampAction, id 0x1000002e5, !registered, !matched, active, busy 0, retain 5>
+      +-o com_apple_driver_AudioIPCDevice  <class com_apple_driver_AudioIPCDevice, id 0x1000002be, registered, matched, active, busy 0 (21 ms), retain 6>
+      | +-o com_apple_driver_AudioIPCEngine  <class com_apple_driver_AudioIPCEngine, id 0x1000002d2, registered, matched, active, busy 0 (19 ms), retain 11>
+      |   +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000399, !registered, !matched, active, busy 0, retain 6>
+      |   +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x1000003d9, !registered, !matched, active, busy 0, retain 6>
+      |   +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x1000003eb, !registered, !matched, active, busy 0, retain 6>
+      |   +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000415, !registered, !matched, active, busy 0, retain 6>
+      |   +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000439, !registered, !matched, active, busy 0, retain 6>
+      |   +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x10000045a, !registered, !matched, active, busy 0, retain 6>
+      +-o Dont_Steal_Mac_OS_X  <class Dont_Steal_Mac_OS_X, id 0x1000002bf, !registered, !matched, active, busy 0, retain 5>
+      +-o IOBluetoothSerialManager  <class IOBluetoothSerialManager, id 0x1000002c0, registered, matched, active, busy 0 (29 ms), retain 7>
+      | +-o IOBluetoothSerialClient  <class IOBluetoothSerialClient, id 0x10000032b, !registered, !matched, active, busy 0 (4 ms), retain 5>
+      | | +-o IOBluetoothSerialClientSerialStreamSync  <class IOBluetoothSerialClientSerialStreamSync, id 0x10000032c, registered, matched, active, busy 0 (4 ms), retain 5>
+      | |   +-o IOSerialBSDClient  <class IOSerialBSDClient, id 0x10000032d, registered, matched, active, busy 0 (2 ms), retain 4>
+      | +-o IOBluetoothSerialClient  <class IOBluetoothSerialClient, id 0x10000032e, !registered, !matched, active, busy 0 (4 ms), retain 5>
+      |   +-o IOBluetoothSerialClientModemStreamSync  <class IOBluetoothSerialClientModemStreamSync, id 0x10000032f, registered, matched, active, busy 0 (4 ms), retain 5>
+      |     +-o IOSerialBSDClient  <class IOSerialBSDClient, id 0x100000331, registered, matched, active, busy 0 (1 ms), retain 4>
+      +-o IODisplayWrangler  <class IODisplayWrangler, id 0x1000002c2, registered, matched, active, busy 0 (22 ms), retain 7>
+      | +-o IOAccelerationUserClient  <class IOAccelerationUserClient, id 0x1000003f8, !registered, !matched, active, busy 0, retain 5>
+      +-o IOSurfaceRoot  <class IOSurfaceRoot, id 0x1000002c3, registered, matched, active, busy 0 (82 ms), retain 5>
+      +-o AppleSCSISubsystemGlobals  <class AppleSCSISubsystemGlobals, id 0x100000329, registered, matched, active, busy 0 (1 ms), retain 5>
+      +-o com_parallels_hypervisor  <class com_parallels_hypervisor, id 0x100000353, registered, matched, active, busy 0 (2 ms), retain 6>
+      | +-o com_parallels_hypervisor_api  <class com_parallels_hypervisor_api, id 0x100000354, registered, matched, active, busy 0 (1 ms), retain 5>
+      +-o com_parallels_hid_hook  <class com_parallels_hid_hook, id 0x100000355, registered, matched, active, busy 0 (1 ms), retain 4>
+      +-o com_parallels_usb_control  <class com_parallels_usb_control, id 0x10000035c, registered, matched, active, busy 0 (14 ms), retain 4>
+      +-o com_parallels_kext_Prlnet  <class com_parallels_kext_Prlnet, id 0x10000035d, registered, matched, active, busy 0 (1 ms), retain 7>
+      | +-o com_parallels_kext_PrlnetUserClient  <class com_parallels_kext_PrlnetUserClient, id 0x100000385, !registered, !matched, active, busy 0, retain 5>
+      | +-o com_parallels_kext_PrlnetUserClient  <class com_parallels_kext_PrlnetUserClient, id 0x100000386, !registered, !matched, active, busy 0, retain 5>
+      | +-o com_parallels_kext_PrlnetUserClient  <class com_parallels_kext_PrlnetUserClient, id 0x100000387, !registered, !matched, active, busy 0, retain 5>
+      +-o com_parallels_kext_prl_vnic_bus  <class com_parallels_kext_prl_vnic_bus, id 0x10000035e, registered, matched, active, busy 0 (1 ms), retain 4>
+      +-o org_virtualbox_SupDrv  <class org_virtualbox_SupDrv, id 0x10000035f, registered, matched, active, busy 0 (1 ms), retain 4>
+      +-o org_virtualbox_VBoxUSB  <class org_virtualbox_VBoxUSB, id 0x100000363, registered, matched, active, busy 0 (5 ms), retain 5>
+      | +-o org_virtualbox_VBoxUSBClient  <class org_virtualbox_VBoxUSBClient, id 0x10000046f, !registered, !matched, active, busy 0, retain 5>
+      +-o com_vmware_kext_VmmonService  <class com_vmware_kext_VmmonService, id 0x100000388, !registered, !matched, active, busy 0, retain 5>
+      +-o com_vmware_kext_UsbPortArbiter  <class com_vmware_kext_UsbPortArbiter, id 0x100000395, registered, matched, active, busy 0 (15 ms), retain 4>
+      +-o com_vmware_kext_KeyboardState  <class com_vmware_kext_KeyboardState, id 0x100000396, registered, matched, active, busy 0 (16 ms), retain 4>
diff --git a/t/tools/macos.t b/t/tools/macos.t
index 34aefd5..164f94f 100755
--- a/t/tools/macos.t
+++ b/t/tools/macos.t
@@ -2844,170 +2844,333 @@ my %system_profiler_tests = (
     }
 );
 
-my %ioreg_tests = (
-    IOUSBDevice => [
-        {
-            'IOGeneralInterest' => 'IOCommand is not serializable',
-            'USB Address' => '2',
-            'Requested Power' => '20',
-            'idProduct' => '539',
-            'bMaxPacketSize0' => '8',
-            'USB Vendor Name' => 'Apple Computer',
-            'sessionID' => '922879256',
-            'bNumConfigurations' => '1',
-            'bDeviceProtocol' => '0',
-            'Bus Power Available' => '250',
-            'Device Speed' => '1',
-            'USB Product Name' => 'Apple Internal Keyboard / Trackpad',
-            'iProduct' => '2',
-            'IOUserClientClass' => 'IOUSBDeviceUserClientV2',
-            'non-removable' => 'yes',
-            'bDeviceClass' => '0',
-            'bDeviceSubClass' => '0',
-            'PortNum' => '2',
-            'bcdDevice' => '24',
-            'locationID' => '488636416',
-            'iManufacturer' => '1',
-            'iSerialNumber' => '0',
-            'idVendor' => '1452'
-        },
-        {
-            'IOGeneralInterest' => 'IOCommand is not serializable',
-            'USB Address' => '2',
-            'Requested Power' => '50',
-            'idProduct' => '33344',
-            'bMaxPacketSize0' => '8',
-            'USB Vendor Name' => 'Apple Computer, Inc.',
-            'sessionID' => '944991920',
-            'bNumConfigurations' => '1',
-            'bDeviceProtocol' => '0',
-            'Bus Power Available' => '250',
-            'Device Speed' => '1',
-            'USB Product Name' => 'IR Receiver',
-            'iProduct' => '2',
-            'IOUserClientClass' => 'IOUSBDeviceUserClientV2',
-            'non-removable' => 'yes',
-            'bDeviceClass' => '0',
-            'bDeviceSubClass' => '0',
-            'PortNum' => '2',
-            'bcdDevice' => '272',
-            'locationID' => '1562378240',
-            'iManufacturer' => '1',
-            'iSerialNumber' => '0',
-            'idVendor' => '1452'
-        },
-        {
-            'IOGeneralInterest' => 'IOCommand is not serializable',
-            'USB Address' => '2',
-            'Requested Power' => '0',
-            'idProduct' => '33285',
-            'bMaxPacketSize0' => '64',
-            'USB Vendor Name' => 'Apple Inc.',
-            'sessionID' => '3290864968',
-            'bNumConfigurations' => '1',
-            'bDeviceProtocol' => '1',
-            'Bus Power Available' => '250',
-            'Device Speed' => '1',
-            'iProduct' => '0',
-            'IOUserClientClass' => 'IOUSBDeviceUserClientV2',
-            'USB Product Name' => 'Bluetooth USB Host Controller',
-            'PortNum' => '1',
-            'bDeviceClass' => '224',
-            'bDeviceSubClass' => '1',
-            'non-removable' => 'yes',
-            'bcdDevice' => '6501',
-            'locationID' => '2098200576',
-            'iManufacturer' => '0',
-            'iSerialNumber' => '0',
-            'idVendor' => '1452'
-        },
-        {
-            'IOGeneralInterest' => 'IOCommand is not serializable',
-            'USB Address' => '2',
-            'Requested Power' => '50',
-            'idProduct' => '34049',
-            'bMaxPacketSize0' => '64',
-            'USB Vendor Name' => 'Micron',
-            'sessionID' => '2717373407',
-            'bNumConfigurations' => '1',
-            'bDeviceProtocol' => '255',
-            'Bus Power Available' => '250',
-            'Device Speed' => '2',
-            'USB Product Name' => 'Built-in iSight',
-            'iProduct' => '2',
-            'IOUserClientClass' => 'IOUSBDeviceUserClientV2',
-            'non-removable' => 'yes',
-            'bDeviceClass' => '255',
-            'bDeviceSubClass' => '255',
-            'PortNum' => '4',
-            'bcdDevice' => '393',
-            'locationID' => '18446744073663414272',
-            'iManufacturer' => '1',
-            'iSerialNumber' => '0',
-            'idVendor' => '1452'
-        },
-        {
-            'IOGeneralInterest' => 'IOCommand is not serializable',
-            'USB Address' => '3',
-            'Requested Power' => '50',
-            'idProduct' => '24613',
-            'bMaxPacketSize0' => '64',
-            'USB Vendor Name' => 'CBM',
-            'sessionID' => '3995793432240',
-            'bNumConfigurations' => '1',
-            'bDeviceProtocol' => '0',
-            'Bus Power Available' => '250',
-            'uid' => 'USB:197660250078C5C90000',
-            'Device Speed' => '2',
-            'USB Product Name' => 'Flash Disk',
-            'iProduct' => '2',
-            'IOUserClientClass' => 'IOUSBDeviceUserClientV2',
-            'bDeviceClass' => '0',
-            'bDeviceSubClass' => '0',
-            'PortNum' => '3',
-            'bcdDevice' => '256',
-            'locationID' => '18446744073662365696',
-            'iManufacturer' => '1',
-            'iSerialNumber' => '3',
-            'idVendor' => '6518',
-            'USB Serial Number' => '16270078C5C90000'
-        }
-    ],
-    IOPlatformExpertDevice => [
-        {
-            'IOPlatformUUID' => '00000000-0000-1000-8000-001B633026B1',
-            'IOBusyInterest' => 'IOCommand is not serializable',
-            'IOPlatformSerialNumber' => 'W87305UMYA8',
-            'IOPolledInterface' => 'SMCPolledInterface is not serializable',
-            'compatible' => 'MacBook2,1',
-            'model' => 'MacBook2,1',
-            'serial-number' => '59413800000000000000000000573837333035554',
-            'version' => '1.0',
-            'name' => '/',
-            'board-id' => 'Mac-F4208CAA',
-            'clock-frequency' => '00',
-            'system-type' => '02',
-            'manufacturer' => 'Apple Inc.',
-            'product-name' => 'MacBook2,1',
-            'IOPlatformArgs' => '0030'
-        }
-    ]
+my @ioreg_tests = (
+    {
+        file    => 'IOUSBDevice1',
+        class   => 'IOUSBDevice',
+        results => [
+            {
+                'IOGeneralInterest' => 'IOCommand is not serializable',
+                'USB Address' => '2',
+                'Requested Power' => '20',
+                'idProduct' => '539',
+                'bMaxPacketSize0' => '8',
+                'USB Vendor Name' => 'Apple Computer',
+                'sessionID' => '922879256',
+                'bNumConfigurations' => '1',
+                'bDeviceProtocol' => '0',
+                'Bus Power Available' => '250',
+                'Device Speed' => '1',
+                'USB Product Name' => 'Apple Internal Keyboard / Trackpad',
+                'iProduct' => '2',
+                'IOUserClientClass' => 'IOUSBDeviceUserClientV2',
+                'non-removable' => 'yes',
+                'bDeviceClass' => '0',
+                'bDeviceSubClass' => '0',
+                'PortNum' => '2',
+                'bcdDevice' => '24',
+                'locationID' => '488636416',
+                'iManufacturer' => '1',
+                'iSerialNumber' => '0',
+                'idVendor' => '1452'
+            },
+            {
+                'IOGeneralInterest' => 'IOCommand is not serializable',
+                'USB Address' => '2',
+                'Requested Power' => '50',
+                'idProduct' => '33344',
+                'bMaxPacketSize0' => '8',
+                'USB Vendor Name' => 'Apple Computer, Inc.',
+                'sessionID' => '944991920',
+                'bNumConfigurations' => '1',
+                'bDeviceProtocol' => '0',
+                'Bus Power Available' => '250',
+                'Device Speed' => '1',
+                'USB Product Name' => 'IR Receiver',
+                'iProduct' => '2',
+                'IOUserClientClass' => 'IOUSBDeviceUserClientV2',
+                'non-removable' => 'yes',
+                'bDeviceClass' => '0',
+                'bDeviceSubClass' => '0',
+                'PortNum' => '2',
+                'bcdDevice' => '272',
+                'locationID' => '1562378240',
+                'iManufacturer' => '1',
+                'iSerialNumber' => '0',
+                'idVendor' => '1452'
+            },
+            {
+                'IOGeneralInterest' => 'IOCommand is not serializable',
+                'USB Address' => '2',
+                'Requested Power' => '0',
+                'idProduct' => '33285',
+                'bMaxPacketSize0' => '64',
+                'USB Vendor Name' => 'Apple Inc.',
+                'sessionID' => '3290864968',
+                'bNumConfigurations' => '1',
+                'bDeviceProtocol' => '1',
+                'Bus Power Available' => '250',
+                'Device Speed' => '1',
+                'iProduct' => '0',
+                'IOUserClientClass' => 'IOUSBDeviceUserClientV2',
+                'USB Product Name' => 'Bluetooth USB Host Controller',
+                'PortNum' => '1',
+                'bDeviceClass' => '224',
+                'bDeviceSubClass' => '1',
+                'non-removable' => 'yes',
+                'bcdDevice' => '6501',
+                'locationID' => '2098200576',
+                'iManufacturer' => '0',
+                'iSerialNumber' => '0',
+                'idVendor' => '1452'
+            },
+            {
+                'IOGeneralInterest' => 'IOCommand is not serializable',
+                'USB Address' => '2',
+                'Requested Power' => '50',
+                'idProduct' => '34049',
+                'bMaxPacketSize0' => '64',
+                'USB Vendor Name' => 'Micron',
+                'sessionID' => '2717373407',
+                'bNumConfigurations' => '1',
+                'bDeviceProtocol' => '255',
+                'Bus Power Available' => '250',
+                'Device Speed' => '2',
+                'USB Product Name' => 'Built-in iSight',
+                'iProduct' => '2',
+                'IOUserClientClass' => 'IOUSBDeviceUserClientV2',
+                'non-removable' => 'yes',
+                'bDeviceClass' => '255',
+                'bDeviceSubClass' => '255',
+                'PortNum' => '4',
+                'bcdDevice' => '393',
+                'locationID' => '18446744073663414272',
+                'iManufacturer' => '1',
+                'iSerialNumber' => '0',
+                'idVendor' => '1452'
+            },
+            {
+                'IOGeneralInterest' => 'IOCommand is not serializable',
+                'USB Address' => '3',
+                'Requested Power' => '50',
+                'idProduct' => '24613',
+                'bMaxPacketSize0' => '64',
+                'USB Vendor Name' => 'CBM',
+                'sessionID' => '3995793432240',
+                'bNumConfigurations' => '1',
+                'bDeviceProtocol' => '0',
+                'Bus Power Available' => '250',
+                'uid' => 'USB:197660250078C5C90000',
+                'Device Speed' => '2',
+                'USB Product Name' => 'Flash Disk',
+                'iProduct' => '2',
+                'IOUserClientClass' => 'IOUSBDeviceUserClientV2',
+                'bDeviceClass' => '0',
+                'bDeviceSubClass' => '0',
+                'PortNum' => '3',
+                'bcdDevice' => '256',
+                'locationID' => '18446744073662365696',
+                'iManufacturer' => '1',
+                'iSerialNumber' => '3',
+                'idVendor' => '6518',
+                'USB Serial Number' => '16270078C5C90000'
+            }
+        ],
+    },
+    {
+        file    => 'IOUSBDevice2',
+        class   => 'IOUSBDevice',
+        results => [
+            {
+                'IOGeneralInterest' => 'IOCommand is not serializable',
+                'USB Address' => '3',
+                'Requested Power' => '50',
+                'idProduct' => '54',
+                'bMaxPacketSize0' => '8',
+                'USB Vendor Name' => 'Genius',
+                'sessionID' => '1035836159',
+                'bNumConfigurations' => '1',
+                'bDeviceProtocol' => '0',
+                'Bus Power Available' => '250',
+                'Device Speed' => '0',
+                'USB Product Name' => 'NetScroll + Mini Traveler',
+                'iProduct' => '1',
+                'IOUserClientClass' => 'IOUSBDeviceUserClientV2',
+                'bDeviceClass' => '0',
+                'bDeviceSubClass' => '0',
+                'PortNum' => '2',
+                'bcdDevice' => '272',
+                'locationID' => '438304768',
+                'iManufacturer' => '2',
+                'iSerialNumber' => '0',
+                'idVendor' => '1112'
+            },
+            {
+                'IOGeneralInterest' => 'IOCommand is not serializable',
+                'USB Address' => '2',
+                'Requested Power' => '0',
+                'idProduct' => '33286',
+                'bMaxPacketSize0' => '64',
+                'USB Vendor Name' => 'Apple Inc.',
+                'sessionID' => '3009829809',
+                'bNumConfigurations' => '1',
+                'bDeviceProtocol' => '1',
+                'Bus Power Available' => '250',
+                'Device Speed' => '1',
+                'iProduct' => '0',
+                'IOUserClientClass' => 'IOUSBDeviceUserClientV2',
+                'USB Product Name' => 'Bluetooth USB Host Controller',
+                'PortNum' => '1',
+                'bDeviceClass' => '224',
+                'bDeviceSubClass' => '1',
+                'non-removable' => 'yes',
+                'bcdDevice' => '6501',
+                'locationID' => '437256192',
+                'iManufacturer' => '0',
+                'iSerialNumber' => '0',
+                'idVendor' => '1452'
+            },
+            {
+                'IOGeneralInterest' => 'IOCommand is not serializable',
+                'USB Address' => '3',
+                'Requested Power' => '10',
+                'idProduct' => '545',
+                'bMaxPacketSize0' => '8',
+                'USB Vendor Name' => 'Apple, Inc',
+                'sessionID' => '1018522533',
+                'bNumConfigurations' => '1',
+                'bDeviceProtocol' => '0',
+                'Bus Power Available' => '50',
+                'Device Speed' => '0',
+                'USB Product Name' => 'Apple Keyboard',
+                'iProduct' => '2',
+                'IOUserClientClass' => 'IOUSBDeviceUserClientV2',
+                'non-removable' => 'yes',
+                'bDeviceClass' => '0',
+                'bDeviceSubClass' => '0',
+                'PortNum' => '2',
+                'bcdDevice' => '105',
+                'locationID' => '18446744073613213696',
+                'iManufacturer' => '1',
+                'iSerialNumber' => '0',
+                'idVendor' => '1452'
+            },
+            {
+                'IOGeneralInterest' => 'IOCommand is not serializable',
+                'USB Address' => '2',
+                'Requested Power' => '50',
+                'idProduct' => '33346',
+                'bMaxPacketSize0' => '8',
+                'USB Vendor Name' => 'Apple Computer, Inc.',
+                'sessionID' => '1116620200',
+                'bNumConfigurations' => '1',
+                'bDeviceProtocol' => '0',
+                'Bus Power Available' => '250',
+                'Device Speed' => '0',
+                'USB Product Name' => 'IR Receiver',
+                'iProduct' => '2',
+                'IOUserClientClass' => 'IOUSBDeviceUserClientV2',
+                'non-removable' => 'yes',
+                'bDeviceClass' => '0',
+                'bDeviceSubClass' => '0',
+                'PortNum' => '1',
+                'bcdDevice' => '22',
+                'locationID' => '1561329664',
+                'iManufacturer' => '1',
+                'iSerialNumber' => '0',
+                'idVendor' => '1452'
+            },
+            {
+                'IOGeneralInterest' => 'IOCommand is not serializable',
+                'USB Address' => '2',
+                'Requested Power' => '1',
+                'idProduct' => '4138',
+                'bMaxPacketSize0' => '64',
+                'USB Vendor Name' => 'LaCie',
+                'sessionID' => '637721320',
+                'bNumConfigurations' => '1',
+                'bDeviceProtocol' => '0',
+                'Bus Power Available' => '250',
+                'uid' => 'USB:059F102A6E7A5FFFFFFF',
+                'Device Speed' => '2',
+                'USB Product Name' => 'LaCie Device',
+                'iProduct' => '11',
+                'IOUserClientClass' => 'IOUSBDeviceUserClientV2',
+                'bDeviceClass' => '0',
+                'bDeviceSubClass' => '0',
+                'PortNum' => '1',
+                'bcdDevice' => '256',
+                'locationID' => '18446744073660268544',
+                'iManufacturer' => '10',
+                'iSerialNumber' => '5',
+                'idVendor' => '1439',
+                'USB Serial Number' => '6E7A5FFFFFFF'
+            },
+            {
+                'IOGeneralInterest' => 'IOCommand is not serializable',
+                'USB Address' => '3',
+                'Requested Power' => '250',
+                'idProduct' => '34050',
+                'bMaxPacketSize0' => '64',
+                'USB Vendor Name' => 'Apple Inc.',
+                'sessionID' => '791376929',
+                'bNumConfigurations' => '1',
+                'bDeviceProtocol' => '1',
+                'Bus Power Available' => '250',
+                'Device Speed' => '2',
+                'USB Product Name' => 'Built-in iSight',
+                'iProduct' => '2',
+                'IOUserClientClass' => 'IOUSBDeviceUserClientV2',
+                'non-removable' => 'yes',
+                'bDeviceClass' => '239',
+                'bDeviceSubClass' => '2',
+                'PortNum' => '4',
+                'bcdDevice' => '341',
+                'locationID' => '18446744073663414272',
+                'iManufacturer' => '1',
+                'iSerialNumber' => '3',
+                'idVendor' => '1452',
+                'USB Serial Number' => '6067E773DA9722F4 (03.01)'
+            }
+        ]
+    },
+    {
+        file   => 'IOPlatformExpertDevice',
+        class  => 'IOPlatformExpertDevice',
+        results => [
+            {
+                'IOPlatformUUID' => '00000000-0000-1000-8000-001B633026B1',
+                'IOBusyInterest' => 'IOCommand is not serializable',
+                'IOPlatformSerialNumber' => 'W87305UMYA8',
+                'IOPolledInterface' => 'SMCPolledInterface is not serializable',
+                'compatible' => 'MacBook2,1',
+                'model' => 'MacBook2,1',
+                'serial-number' => '59413800000000000000000000573837333035554',
+                'version' => '1.0',
+                'name' => '/',
+                'board-id' => 'Mac-F4208CAA',
+                'clock-frequency' => '00',
+                'system-type' => '02',
+                'manufacturer' => 'Apple Inc.',
+                'product-name' => 'MacBook2,1',
+                'IOPlatformArgs' => '0030'
+            }
+        ],
+    }
 );
 
 plan tests => 
     scalar (keys %system_profiler_tests) + 
-    scalar (keys %ioreg_tests);
-
+    scalar @ioreg_tests;
 
 foreach my $test (keys %system_profiler_tests) {
     my $file = "resources/macos/system_profiler/$test";
     my $infos = getSystemProfilerInfos(file => $file);
     is_deeply($infos, $system_profiler_tests{$test}, "$test system profiler parsing");
-    use Data::Dumper;
 }
 
-foreach my $test (keys %ioreg_tests) {
-    my $file = "resources/macos/ioreg/$test";
-    my @devices = getIODevices(file => $file, class => $test);
-    is_deeply(\@devices, $ioreg_tests{$test}, "$test ioreg parsing");
+foreach my $test (@ioreg_tests) {
+    my $file = "resources/macos/ioreg/$test->{file}";
+    my @devices = getIODevices(file => $file, class => $test->{class});
+    is_deeply(\@devices, $test->{results}, "$test->{file} ioreg parsing");
 }


================================================================
  Commit: d584d225d8d1ab7fc16fd6c8158644728197c35e
      https://github.com/fusinv/fusioninventory-agent/commit/d584d225d8d1ab7fc16fd6c8158644728197c35e
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-15 (Thu, 15 Mar 2012)

  Changed paths:
    A t/inventory/macos/usb.t

  Log Message:
  -----------
  initial import


diff --git a/t/inventory/macos/usb.t b/t/inventory/macos/usb.t
new file mode 100755
index 0000000..ff2c9d2
--- /dev/null
+++ b/t/inventory/macos/usb.t
@@ -0,0 +1,111 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+use Test::More;
+
+use FusionInventory::Agent::Task::Inventory::Input::MacOS::USB;
+
+my %tests = (
+    IOUSBDevice1 => [
+        {
+            CLASS     => '0',
+            NAME      => 'Apple Internal Keyboard / Trackpad',
+            SERIAL    => undef,
+            SUBCLASS  => '0',
+            VENDORID  => '0x5ac',
+            PRODUCTID => '0x21b'
+        },
+        {
+            CLASS     => '0',
+            NAME      => 'IR Receiver',
+            SERIAL    => undef,
+            SUBCLASS  => '0',
+            VENDORID  => '0x5ac',
+            PRODUCTID => '0x8240'
+        },
+        {
+            CLASS     => '224',
+            NAME      => 'Bluetooth USB Host Controller',
+            SERIAL    => undef,
+            SUBCLASS  => '1',
+            VENDORID  => '0x5ac',
+            PRODUCTID => '0x8205'
+        },
+        {
+            CLASS     => '255',
+            NAME      => 'Built-in iSight',
+            SERIAL    => undef,
+            SUBCLASS  => '255',
+            VENDORID  => '0x5ac',
+            PRODUCTID => '0x8501'
+        },
+        {
+            CLASS     => '0',
+            NAME      => 'Flash Disk',
+            SERIAL    => '16270078C5C90000',
+            SUBCLASS  => '0',
+            VENDORID  => '0x1976',
+            PRODUCTID => '0x6025'
+        }
+    ],
+    IOUSBDevice2 => [
+        {
+            CLASS     => '0',
+            NAME      => 'NetScroll + Mini Traveler',
+            SERIAL    => undef,
+            SUBCLASS  => '0',
+            VENDORID  => '0x458',
+            PRODUCTID => '0x36'
+        },
+        {
+            CLASS     => '224',
+            NAME      => 'Bluetooth USB Host Controller',
+            SERIAL    => undef,
+            SUBCLASS  => '1',
+            VENDORID  => '0x5ac',
+            PRODUCTID => '0x8206'
+        },
+        {
+            CLASS     => '0',
+            NAME      => 'Apple Keyboard',
+            SERIAL    => undef,
+            SUBCLASS  => '0',
+            VENDORID  => '0x5ac',
+            PRODUCTID => '0x221'
+        },
+        {
+            CLASS     => '0',
+            NAME      => 'IR Receiver',
+            SERIAL    => undef,
+            SUBCLASS  => '0',
+            VENDORID  => '0x5ac',
+            PRODUCTID => '0x8242'
+        },
+        {
+            CLASS     => '0',
+            NAME      => 'LaCie Device',
+            SERIAL    => '6E7A5FFFFFFF',
+            SUBCLASS  => '0',
+            VENDORID  => '0x59f',
+            PRODUCTID => '0x102a'
+        },
+        {
+            CLASS     => '239',
+            NAME      => 'Built-in iSight',
+            SERIAL    => '6067E773DA9722F4 (03.01)',
+            SUBCLASS  => '2',
+            VENDORID  => '0x5ac',
+            PRODUCTID => '0x8502'
+        }
+    ]
+);
+
+plan tests => scalar keys %tests;
+
+foreach my $test (keys %tests) {
+    my $file = "resources/macos/ioreg/$test";
+    my @devices = FusionInventory::Agent::Task::Inventory::Input::MacOS::USB::_getDevices(file => $file);
+    is_deeply(\@devices, $tests{$test}, $test);
+}


================================================================
  Commit: 71be1d14640de14da80b5277f594f4ae3df31ff9
      https://github.com/fusinv/fusioninventory-agent/commit/71be1d14640de14da80b5277f594f4ae3df31ff9
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-15 (Thu, 15 Mar 2012)

  Changed paths:
    M t/inventory/macos/storages.t
    M t/inventory/solaris/networks.t
    M t/tools/generic.t

  Log Message:
  -----------
  no need for D::D in released code


diff --git a/t/inventory/macos/storages.t b/t/inventory/macos/storages.t
index 62a3759..63de394 100755
--- a/t/inventory/macos/storages.t
+++ b/t/inventory/macos/storages.t
@@ -93,6 +93,5 @@ plan tests => scalar keys %tests;
 foreach my $test (keys %tests) {
     my $file = "resources/macos/system_profiler/$test";
     my @storages = FusionInventory::Agent::Task::Inventory::Input::MacOS::Storages::_getStorages(file => $file);
-    is_deeply(\@storages, $tests{$test}, $test) or print Dumper(\@storages);
-    use Data::Dumper;
+    is_deeply(\@storages, $tests{$test}, $test);
 }
diff --git a/t/inventory/solaris/networks.t b/t/inventory/solaris/networks.t
index 7a231d6..8c0e1b0 100755
--- a/t/inventory/solaris/networks.t
+++ b/t/inventory/solaris/networks.t
@@ -116,14 +116,12 @@ my %ifconfig_tests = (
 plan tests =>
     int (1 + keys %ifconfig_tests);
 
-use Data::Dumper;
 foreach my $test (keys %ifconfig_tests) {
     my $file = "resources/generic/ifconfig/$test";
     my @results = FusionInventory::Agent::Task::Inventory::Input::Solaris::Networks::_getInterfaces(file => $file);
-    is_deeply(\@results, $ifconfig_tests{$test}, $test) or print Dumper(\@results);
+    is_deeply(\@results, $ifconfig_tests{$test}, $test);
 }
 
-
 my @parsefcinfo = (
       {
         'FIRMWARE' => '05.03.02',
@@ -150,4 +148,4 @@ my @parsefcinfo = (
 );
 my $file = "resources/solaris/fcinfo_hba-port/sample-1";
 my @result = FusionInventory::Agent::Task::Inventory::Input::Solaris::Networks::_parsefcinfo(file => $file);
-is_deeply(\@result, \@parsefcinfo, "_parsefcinfo") or print Dumper(\@result);
+is_deeply(\@result, \@parsefcinfo, "_parsefcinfo");
diff --git a/t/tools/generic.t b/t/tools/generic.t
index 12090c8..671d570 100755
--- a/t/tools/generic.t
+++ b/t/tools/generic.t
@@ -6188,13 +6188,12 @@ foreach my $test (keys %dmidecode_tests) {
     my $file = "resources/generic/dmidecode/$test";
     my $infos = getDmidecodeInfos(file => $file);
     is_deeply($infos, $dmidecode_tests{$test}, "$test dmidecode parsing");
-    use Data::Dumper;
 }
 
 foreach my $test (keys %cpu_tests) {
     my $file = "resources/generic/dmidecode/$test";
     my @cpus = getCpusFromDmidecode(file => $file);
-    is_deeply(\@cpus, $cpu_tests{$test}, "$test dmidecode cpu extraction") or print Dumper(\@cpus);
+    is_deeply(\@cpus, $cpu_tests{$test}, "$test dmidecode cpu extraction");
 }
 
 foreach my $test (keys %lspci_tests) {


================================================================
  Commit: 93e65b2ad522119faa741762c627a08d4d062f48
      https://github.com/fusinv/fusioninventory-agent/commit/93e65b2ad522119faa741762c627a08d4d062f48
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-15 (Thu, 15 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/USB.pm

  Log Message:
  -----------
  avoid warnings for undefined serial (close #1507)


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/USB.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/USB.pm
index 4f526d9..fd5e44a 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/USB.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/USB.pm
@@ -20,7 +20,7 @@ sub doInventory {
 
     foreach my $device (_getDevices(logger => $logger)) {
         # avoid duplicates
-        next if $seen->{$device->{SERIAL}}++;
+        next if $device->{SERIAL} && $seen->{$device->{SERIAL}}++;
         $inventory->addEntry(
             section => 'USBDEVICES',
             entry   => $device,


================================================================
  Commit: 83cef33422469c5198aa074a4501f71507ea4ff1
      https://github.com/fusinv/fusioninventory-agent/commit/83cef33422469c5198aa074a4501f71507ea4ff1
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-16 (Fri, 16 Mar 2012)

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

  Log Message:
  -----------
  typo


diff --git a/lib/FusionInventory/Agent/Tools/Unix.pm b/lib/FusionInventory/Agent/Tools/Unix.pm
index decc968..a4571ca 100644
--- a/lib/FusionInventory/Agent/Tools/Unix.pm
+++ b/lib/FusionInventory/Agent/Tools/Unix.pm
@@ -171,7 +171,7 @@ sub getFilesystemsFromDf {
             $free       = $infos[4];
             $type       = $infos[6];
         } else {
-            $filesystem = $params{type},
+            $filesystem = $params{type};
             $total = $infos[1];
             $free  = $infos[3];
             $type  = $infos[5];


================================================================
  Commit: 03b38f2f1a1b829417a613fbfb0476b420a4649f
      https://github.com/fusinv/fusioninventory-agent/commit/03b38f2f1a1b829417a613fbfb0476b420a4649f
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-16 (Fri, 16 Mar 2012)

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

  Log Message:
  -----------
  cosmetics


diff --git a/lib/FusionInventory/Agent/Tools/Unix.pm b/lib/FusionInventory/Agent/Tools/Unix.pm
index a4571ca..3e5a7c4 100644
--- a/lib/FusionInventory/Agent/Tools/Unix.pm
+++ b/lib/FusionInventory/Agent/Tools/Unix.pm
@@ -172,9 +172,9 @@ sub getFilesystemsFromDf {
             $type       = $infos[6];
         } else {
             $filesystem = $params{type};
-            $total = $infos[1];
-            $free  = $infos[3];
-            $type  = $infos[5];
+            $total      = $infos[1];
+            $free       = $infos[3];
+            $type       = $infos[5];
         }
 
         # skip some virtual filesystems


================================================================
  Commit: a57a70cc7cf83d58a9782808b5eca575d92f0203
      https://github.com/fusinv/fusioninventory-agent/commit/a57a70cc7cf83d58a9782808b5eca575d92f0203
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-16 (Fri, 16 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/HTTP/Protocol/https.pm
    M lib/FusionInventory/Agent/Task/Inventory.pm
    M lib/FusionInventory/Agent/Tools.pm
    M lib/FusionInventory/Agent/Tools/Hostname.pm

  Log Message:
  -----------
  various perlcritic issues aknowledgements


diff --git a/lib/FusionInventory/Agent/HTTP/Protocol/https.pm b/lib/FusionInventory/Agent/HTTP/Protocol/https.pm
index d74a8b1..aa0bf7c 100644
--- a/lib/FusionInventory/Agent/HTTP/Protocol/https.pm
+++ b/lib/FusionInventory/Agent/HTTP/Protocol/https.pm
@@ -27,6 +27,7 @@ sub _extra_sock_opts {
     );
 }
 
+## no critic (ProhibitMultiplePackages)
 package FusionInventory::Agent::HTTP::Protocol::https::Socket;
 
 use base qw(Net::HTTPS LWP::Protocol::http::SocketMethods);
diff --git a/lib/FusionInventory/Agent/Task/Inventory.pm b/lib/FusionInventory/Agent/Task/Inventory.pm
index 98984f0..ce3eb4c 100644
--- a/lib/FusionInventory/Agent/Task/Inventory.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory.pm
@@ -181,7 +181,7 @@ sub _initModulesList {
         $self->{modules}->{$module}->{done}    = 0;
         $self->{modules}->{$module}->{used}    = 0;
 
-        no strict 'refs'; ## no critic
+        no strict 'refs'; ## no critic (ProhibitNoStrict)
         $self->{modules}->{$module}->{runAfter} = [ 
             $parent ? $parent : (),
             ${$module . '::runAfter'} ? @${$module . '::runAfter'} : ()
@@ -190,7 +190,8 @@ sub _initModulesList {
 
     # second pass: disable fallback modules
     foreach my $module (@modules) {
-        no strict 'refs'; ## no critic
+        ## no critic (ProhibitNoStrict ProhibitProlongedStrictureOverride)
+        no strict 'refs';
 
         # skip modules already disabled
         next unless $self->{modules}->{$module}->{enabled};
diff --git a/lib/FusionInventory/Agent/Tools.pm b/lib/FusionInventory/Agent/Tools.pm
index bc61bbf..b5c24ba 100644
--- a/lib/FusionInventory/Agent/Tools.pm
+++ b/lib/FusionInventory/Agent/Tools.pm
@@ -446,7 +446,7 @@ sub runFunction {
         local $SIG{ALRM} = sub { die "alarm\n" } if $params{timeout};
         alarm $params{timeout};
 
-        no strict 'refs'; ## no critic
+        no strict 'refs'; ## no critic (ProhibitNoStrict)
         $result = &{$params{module} . '::' . $params{function}}(
             ref $params{params} eq 'HASH'  ? %{$params{params}} :
             ref $params{params} eq 'ARRAY' ? @{$params{params}} :
diff --git a/lib/FusionInventory/Agent/Tools/Hostname.pm b/lib/FusionInventory/Agent/Tools/Hostname.pm
index 16fcfed..7bd4dd7 100644
--- a/lib/FusionInventory/Agent/Tools/Hostname.pm
+++ b/lib/FusionInventory/Agent/Tools/Hostname.pm
@@ -9,7 +9,7 @@ use English qw(-no_match_vars);
 
 BEGIN {
     if ($OSNAME eq 'MSWin32') {
-        no warnings 'redefine';
+        no warnings 'redefine'; ## no critic (ProhibitNoWarnings)
         Win32::API->require();
         # Kernel32.dll is used more or less everywhere.
         # Without this, Win32::API will release the DLL even


================================================================
  Commit: 21e5456bc4b28dbf71481333bcfd59a97bcca376
      https://github.com/fusinv/fusioninventory-agent/commit/21e5456bc4b28dbf71481333bcfd59a97bcca376
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-17 (Sat, 17 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm

  Log Message:
  -----------
  drop copyright notice

the related code is actually in FusionInventory::Agent::Tools::Screen
package


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
index 903297d..604bec6 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
@@ -1,23 +1,5 @@
 package FusionInventory::Agent::Task::Inventory::Input::Generic::Screen;
-#     Copyright (C) 2005 Mandriva
-#     Copyright (C) 2007 Gonéri Le Bouder <goneri at rulezlan.org> 
-#     This program is free software; you can redistribute it and/or modify
-#     it under the terms of the GNU General Public License as published by
-#     the Free Software Foundation; either version 2 of the License, or
-#     (at your option) any later version.
-
-#     This program is distributed in the hope that it will be useful,
-#     but WITHOUT ANY WARRANTY; without even the implied warranty of
-#     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-#     GNU General Public License for more details.
-
-#     You should have received a copy of the GNU General Public License
-#     along with this program; if not, write to the Free Software
-#     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-# Some part come from Mandriva's (great) monitor-edid
-# http://svn.mandriva.com/cgi-bin/viewvc.cgi/soft/monitor-edid/trunk/
-#
+
 use strict;
 use warnings;
 


================================================================
  Commit: 9fb009650564f0d4e68f40c3f58be5a1cf4ae2f6
      https://github.com/fusinv/fusioninventory-agent/commit/9fb009650564f0d4e68f40c3f58be5a1cf4ae2f6
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-17 (Sat, 17 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/Vmsystem.pm
    M lib/FusionInventory/Agent/Tools/Screen.pm

  Log Message:
  -----------
  make external code notices consistent


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/Vmsystem.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/Vmsystem.pm
index fdf2227..3866f38 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/Vmsystem.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/Vmsystem.pm
@@ -1,31 +1,10 @@
 package FusionInventory::Agent::Task::Inventory::Input::Virtualization::Vmsystem;
 
-# Initial FusionInventory::Agent::Task::Inventory::Input::Virtualization::Vmsystem version: Nicolas EISEN
-#
-# Code include from imvirt - I'm virtualized?
-#   http://micky.ibh.net/~liske/imvirt.html
-#
-# Authors:
-#   Thomas Liske <liske at ibh.de>
-#
-# Copyright Holder:
-#   2008 (C) IBH IT-Service GmbH [http://www.ibh.de/]
-#
-# License:
-#   This program is free software; you can redistribute it and/or modify
-#   it under the terms of the GNU General Public License as published by
-#   the Free Software Foundation; either version 2 of the License, or
-#   (at your option) any later version.
-#
-#   This program is distributed in the hope that it will be useful,
-#   but WITHOUT ANY WARRANTY; without even the implied warranty of
-#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-#   GNU General Public License for more details.
-#
-#   You should have received a copy of the GNU General Public License
-#   along with this package; if not, write to the Free Software
-#   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
-#
+# Contains code from imvirt:
+# URL: http://micky.ibh.net/~liske/imvirt.html
+# Authors:  Thomas Liske <liske at ibh.de>
+# Copyright: 2008 IBH IT-Service GmbH [http://www.ibh.de/]
+# License: GPLv2+
 
 
 ##
diff --git a/lib/FusionInventory/Agent/Tools/Screen.pm b/lib/FusionInventory/Agent/Tools/Screen.pm
index f2cd98c..d3dddcb 100644
--- a/lib/FusionInventory/Agent/Tools/Screen.pm
+++ b/lib/FusionInventory/Agent/Tools/Screen.pm
@@ -1,24 +1,9 @@
 package FusionInventory::Agent::Tools::Screen;
 
-#     Copyright (C) 2005 Mandriva
-#     This program is free software; you can redistribute it and/or modify
-#     it under the terms of the GNU General Public License as published by
-#     the Free Software Foundation; either version 2 of the License, or
-#     (at your option) any later version.
-
-#     This program is distributed in the hope that it will be useful,
-#     but WITHOUT ANY WARRANTY; without even the implied warranty of
-#     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-#     GNU General Public License for more details.
-
-#     You should have received a copy of the GNU General Public License
-#     along with this program; if not, write to the Free Software
-#     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-#
-# Some part come from Mandriva's (great) monitor-edid
-# http://svn.mandriva.com/cgi-bin/viewvc.cgi/soft/monitor-edid/trunk/
-#
-
+# Contains code from monitor-edid:
+# URL: http://svn.mandriva.com/cgi-bin/viewvc.cgi/soft/monitor-edid
+# Copyright: 2005 Mandriva
+# License: GPLv2+
 
 use strict;
 use warnings;


================================================================
  Commit: ad97794df59855e354466030f5827fd8feb5e376
      https://github.com/fusinv/fusioninventory-agent/commit/ad97794df59855e354466030f5827fd8feb5e376
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-17 (Sat, 17 Mar 2012)

  Changed paths:
    M README
    M fusioninventory-agent

  Log Message:
  -----------
  keep man page focused on agent usage

The README file is more suited for generic project informations, such
as contact and licensing informations, or security concerns overview.


diff --git a/README b/README
index c802387..eb1c835 100644
--- a/README
+++ b/README
@@ -88,6 +88,27 @@ privileges. On Windows, tough, running agent with SYSTEM privileges, which is
 implicit if running as a service, does sometimes gives less results, especially
 for shared printers only visible from a user account.
 
+Security
+--------
+They are several potential security issues in fusioninventory.
+
+First, the server automatically trust any received message, using the
+identifier found in the message (unfortunatly called DEVICEID) to identify the
+sending agent. If you want to protect your machine inventory from rogue
+reports, you have to restrict access to the plugin location on your GLPI
+server, typically using HTTP authentication. And preferentially over HTTPS,
+to prevent password sniffing.
+
+Second, some messages between the server and the agent may contain sensible
+informations. For instance, NetInventory tasks involves sending SNMP
+credentials from the server to the agent. In this case, HTTPS usage ensures
+proper communication encryption.
+
+Third, some tasks are explicitely designed to make the agent execute arbitrary
+commands on its host. For instance, the Deploy task is used to install
+software on agent side. In this case, HTTPS usage ensures proper server
+authentication.
+
 SSL support
 -----------
 LWP (also known as libwww-perl) is able to use either Crypt::SSLeay or
@@ -118,6 +139,22 @@ The available workaround:
   openssl and its perl bindings (Net::SSLeay)
 - disable server certificate checking on client
 
+Contacts
+--------
+
+Project websites:
+* main site: http://www.fusioninventory.org
+* forge: http://forge.fusioninventory.org
+
+Project mailing lists:
+* http://lists.alioth.debian.org/mailman/listinfo/fusioninventory-user
+* http://lists.alioth.debian.org/mailman/listinfo/fusioninventory-devel
+
+Project IRC channel:
+* #FusionInventory on FreeNode IRC Network
+
+Please report any issues on project forge bugtracker.
+
 Authors 
 -------
 * Gonéri Le Bouder <goneri at rulezlan.org>>
@@ -130,3 +167,23 @@ License
 -------
 This software is licensed under the terms of GPLv2+, see LICENSE file for
 details.
+
+Additional pieces of software
+-----------------------------
+
+The memconf script:
+url: http://myweb.cableone.net/4schmidts/memconf.html
+author: Tom Schmidt
+copyright: 1996-2009 Tom Schmidt
+
+FusionInventory::Agent::Task::Inventory::Input::Virtualization::Vmsystem
+contains code from imvirt:
+url: http://micky.ibh.net/~liske/imvirt.html
+author: Thomas Liske <liske at ibh.de>
+copyright: 2008 IBH IT-Service GmbH [http://www.ibh.de/]
+License: GPLv2+
+
+FusionInventory::Agent::Tools::Screen contains code from monitor-edid:
+url: http://svn.mandriva.com/cgi-bin/viewvc.cgi/soft/monitor-edid
+copyright: 2005 Mandriva
+license: GPLv2+
diff --git a/fusioninventory-agent b/fusioninventory-agent
index a1ec3bb..172ab60 100755
--- a/fusioninventory-agent
+++ b/fusioninventory-agent
@@ -589,131 +589,3 @@ On Windows, the configuration is loaded from the registry, from an arch-dependan
 =item * F<HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\FusionInventory-Agent> for 64 bits machines
 
 =back
-
-=head1 SECURITY
-
-Some modules like SNMPQuery needs to sent credential from the agent to the
-agent. We recommend to enable HTTPS support on the OCS or FusionInventory
-For GLPI server. We also recommend to use only trusted machine as agent in
-this case.
-
-=head1 AUTHORS
-
-The FusionInventory project L<fusioninventory-devel at lists.alioth.debian.org>
-
-The maintainer is Goneri LE BOUDER <goneri at rulezlan.org>
-
-Please read the AUTHORS, Changes and THANKS files to see who is behind
-FusionInventory.
-
-=head1 SEE ALSO
-
-=over 4
-
-=item
-
-FusionInventory website: L<http://www.FusionInventory.org/>
-
-=item
-
-project Forge: L<http://Forge.FusionInventory.org>
-
-=item
-
-The source code of the agent is available on:
-
-=over
-
-=item
-
-Gitorious: L<http://gitorious.org/fusioninventory>
-
-=item
-
-Github: L<http://github.com/fusinv/fusioninventory-agent>
-
-=back
-
-=item
-
-The mailing lists:
-
-=over
-
-=item
-
-L<http://lists.alioth.debian.org/mailman/listinfo/fusioninventory-devel>
-
-=item
-
-L<http://lists.alioth.debian.org/mailman/listinfo/fusioninventory-user>
-
-=back
-
-=item
-
-IRC: #FusionInventory on FreeNode IRC Network
-
-=back
-
-=head1 BUGS
-
-Please, use the mailing lists as much as possible. You can also use the bugtracker on
-http://forge.fusionInventory.org
-
-
-=head1 COPYRIGHT
-
-Copyright (C) 2006-2010 OCS Inventory contributors
-Copyright (C) 2010-2012 FusionInventory Team
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-The memconf script is maintained by Tom Schmidt
-http://myweb.cableone.net/4schmidts/memconf.html
-Copyright © 1996-2009 Tom Schmidt
-
-memconf is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 2 of the License, or (at your option) any later
-version.
-
-FusionInventory::Agent::Backend::Virtualization::Vmsystem uses code from
-imvirt:
-
-   Authors:
-     Thomas Liske <liske at ibh.de>
-
-   Copyright Holder:
-     2008 (C) IBH IT-Service GmbH [http://www.ibh.de/]
-
-   License:
-     This program is free software; you can redistribute it and/or modify
-     it under the terms of the GNU General Public License as published by
-     the Free Software Foundation; either version 2 of the License, or
-     (at your option) any later version.
-
-     This program is distributed in the hope that it will be useful,
-     but WITHOUT ANY WARRANTY; without even the implied warranty of
-     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-     GNU General Public License for more details.
-
-     You should have received a copy of the GNU General Public License
-     along with this package; if not, write to the Free Software
-     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301
-     USA
-
-
-=cut


================================================================
  Commit: b42cfd8141de1ebf810decda444e4161c705ca2f
      https://github.com/fusinv/fusioninventory-agent/commit/b42cfd8141de1ebf810decda444e4161c705ca2f
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-17 (Sat, 17 Mar 2012)

  Changed paths:
    M fusioninventory-agent

  Log Message:
  -----------
  update configuration section


diff --git a/fusioninventory-agent b/fusioninventory-agent
index 172ab60..6660684 100755
--- a/fusioninventory-agent
+++ b/fusioninventory-agent
@@ -561,26 +561,19 @@ Print the version and exit.
 
 =back
 
+=head1 CONFIGURATION
 
-=head1 CONFIG FILE
+The agent is able to use multiple configuration backends. The registry backend
+is the default on Windows platform, and the file backend is the default
+everywhere else. Another backend can be specified using the B<--config> option.
 
-The agent initialize its settings from the configuration first.
+The I<file> backend reads configuration directives from a configuration file,
+whose default location is determined at installation time as
+PREFIX/etc/agent.cfg. An alternative location can also be given with
+B<--conf-file> option.
 
-On Unix, this configuration is loaded from a configuration file, the first
-found among the following locations:
-
-=over
-
-=item * F</etc/fusioninventory/agent.cfg>
-
-=item * F</usr/local/etc/fusioninventory/agent.cfg>
-
-=back
-
-An alternative configuration file can be specified with the B<--conf-file>
-parameter, and will be used instead.
-
-On Windows, the configuration is loaded from the registry, from an arch-dependant location:
+The I<registry> backend reads configuration directives from the Windows
+registry, with an arch-dependant location:
 
 =over
 
@@ -589,3 +582,6 @@ On Windows, the configuration is loaded from the registry, from an arch-dependan
 =item * F<HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\FusionInventory-Agent> for 64 bits machines
 
 =back
+
+The I<none> backend doesn't read any configuration directive at all, allowing
+to isolate the agent execution from any installed configuration.


================================================================
  Commit: 1753ec1132e6bfd6698fb511cfb26fc6eb389ea9
      https://github.com/fusinv/fusioninventory-agent/commit/1753ec1132e6bfd6698fb511cfb26fc6eb389ea9
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-18 (Sun, 18 Mar 2012)

  Changed paths:
    M Makefile.PL

  Log Message:
  -----------
  Revert "add auto-install support"

This reverts commit 1d1f3cbc63d3be1f2f06c735adf89fedab80560b, as
it breaks test suite files list.


diff --git a/Makefile.PL b/Makefile.PL
index b27ed31..baf80b9 100644
--- a/Makefile.PL
+++ b/Makefile.PL
@@ -59,10 +59,6 @@ makemaker_args(
     },
 );
 
-auto_install(
-    do_once => 1 # skip previously failed modules
-);
-
 WriteAll;
 
 # substitute prefix everywhere


================================================================
  Commit: 92fc5e5fb0fb1109636d1213cd40ddd240c6c583
      https://github.com/fusinv/fusioninventory-agent/commit/92fc5e5fb0fb1109636d1213cd40ddd240c6c583
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-18 (Sun, 18 Mar 2012)

  Changed paths:
    M fusioninventory-injector

  Log Message:
  -----------
  make perlcritic happy


diff --git a/fusioninventory-injector b/fusioninventory-injector
index c45f688..db01136 100755
--- a/fusioninventory-injector
+++ b/fusioninventory-injector
@@ -32,6 +32,7 @@ sub loadfile {
     print "Loading $file..." if $options{verbose};
 
     open (my $fh, '<', $file) or die "can't open file $file: $ERRNO";
+    ## no critic (ProhibitBitwise)
     flock ($fh, LOCK_EX | LOCK_NB) or die "can't lock file $file: $ERRNO";
     local $RS;
     my $content = <$fh>;


================================================================
  Commit: 2ee454dd960fa89d91e5b02d1573dd1907e0d6b3
      https://github.com/fusinv/fusioninventory-agent/commit/2ee454dd960fa89d91e5b02d1573dd1907e0d6b3
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-18 (Sun, 18 Mar 2012)

  Changed paths:
    M t/05var.t

  Log Message:
  -----------
  more exceptions


diff --git a/t/05var.t b/t/05var.t
index 3ede00e..d57ab9a 100644
--- a/t/05var.t
+++ b/t/05var.t
@@ -20,5 +20,11 @@ if ($OSNAME eq 'MSWin32') {
 }
 
 all_vars_ok(
-    ignore_vars => { '%params' => 1, '$class' => 1 }
+    ignore_vars => {
+        '%params'   => 1,
+        '$class'    => 1,
+        '$request'  => 1, # FusionInventory::Agent::HTTP::Server
+        '$clientIp' => 1, # FusionInventory::Agent::HTTP::Server
+        '$num'      => 1  # Task::Inventory::Input::Solaris::Networks
+    }
 );


================================================================
  Commit: ec16d4e9a0d4f7a28b584aae545084dccb29c908
      https://github.com/fusinv/fusioninventory-agent/commit/ec16d4e9a0d4f7a28b584aae545084dccb29c908
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-03-18 (Sun, 18 Mar 2012)

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

  Log Message:
  -----------
  accpet \ or / in win32 registry path


diff --git a/lib/FusionInventory/Agent/Tools/Win32.pm b/lib/FusionInventory/Agent/Tools/Win32.pm
index f062ac7..42c854a 100644
--- a/lib/FusionInventory/Agent/Tools/Win32.pm
+++ b/lib/FusionInventory/Agent/Tools/Win32.pm
@@ -97,7 +97,7 @@ sub getRegistryValue {
     my (%params) = @_;
 
     my ($root, $keyName, $valueName);
-    if ($params{path} =~ /^(HKEY_\S+)\/(.+)\/([^\/]+)/ ) {
+    if ($params{path} =~ /^(HKEY_[^\/\\]+)[\/\\](.+)[\/\\]([^\/]+)/ ) {
         $root      = $1;
         $keyName   = $2;
         $valueName = $3;


================================================================
  Commit: 18a6cd8fcc1e6cb332d26236f004426f1db1675a
      https://github.com/fusinv/fusioninventory-agent/commit/18a6cd8fcc1e6cb332d26236f004426f1db1675a
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-03-18 (Sun, 18 Mar 2012)

  Changed paths:
    R AUTHORS
    M Makefile.PL
    M README
    M fusioninventory-agent
    M fusioninventory-injector
    M lib/FusionInventory/Agent/HTTP/Protocol/https.pm
    M lib/FusionInventory/Agent/HTTP/Server.pm
    M lib/FusionInventory/Agent/Task/Inventory.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/USB.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/Vmsystem.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
    M lib/FusionInventory/Agent/Tools.pm
    M lib/FusionInventory/Agent/Tools/Hostname.pm
    M lib/FusionInventory/Agent/Tools/Screen.pm
    M lib/FusionInventory/Agent/Tools/Unix.pm
    R resources/macos/ioreg/IOUSBDevice
    A resources/macos/ioreg/IOUSBDevice1
    A resources/macos/ioreg/IOUSBDevice2
    A resources/win32/wmi/xp-Win32_NetworkAdapter.wmi
    A resources/win32/wmi/xp-Win32_NetworkAdapterConfiguration.wmi
    M t/02critic.t
    M t/03pod.t
    M t/04pod-coverage.t
    M t/05var.t
    A t/06spelling.t
    M t/inventory/macos/storages.t
    A t/inventory/macos/usb.t
    M t/inventory/solaris/networks.t
    M t/inventory/windows/networks.t
    M t/tools/generic.t
    M t/tools/macos.t

  Log Message:
  -----------
  Merge remote-tracking branch 'origin/2.2.x' into 2.2.x


diff --git a/AUTHORS b/AUTHORS
deleted file mode 100644
index 200d1d5..0000000
--- a/AUTHORS
+++ /dev/null
@@ -1,9 +0,0 @@
-maintainer:
-  Gonéri LE BOUDER <goneri at rulezlan.org>
-
-Copyright 2006-2010 OCS Inventory contributors
-Copyright 2010-2012 FusionInventory Team
-
-Website: http://www.fusioninventory.org
-
-Please read THANKS to get the list of the contributors
diff --git a/Makefile.PL b/Makefile.PL
index b27ed31..baf80b9 100644
--- a/Makefile.PL
+++ b/Makefile.PL
@@ -59,10 +59,6 @@ makemaker_args(
     },
 );
 
-auto_install(
-    do_once => 1 # skip previously failed modules
-);
-
 WriteAll;
 
 # substitute prefix everywhere
diff --git a/README b/README
index 27161a1..eb1c835 100644
--- a/README
+++ b/README
@@ -1,6 +1,17 @@
 			FusionInventory Agent
 			---------------------
 
+Description
+-----------
+The fusioinventory agent is a generic agent, running on each managed node. It
+can perform a certain number of actions, called tasks, according to its own
+execution plan, or on behalf of a GLPI server with fusioninventory plugin,
+acting as a control point.
+
+Two of these tasks are included in agent source distribution, local inventory
+and wake on lan. Other tasks are distributed separatly, excepted for binary
+distributions where they are bundled together.
+
 Dependencies
 ------------
 
@@ -77,6 +88,27 @@ privileges. On Windows, tough, running agent with SYSTEM privileges, which is
 implicit if running as a service, does sometimes gives less results, especially
 for shared printers only visible from a user account.
 
+Security
+--------
+They are several potential security issues in fusioninventory.
+
+First, the server automatically trust any received message, using the
+identifier found in the message (unfortunatly called DEVICEID) to identify the
+sending agent. If you want to protect your machine inventory from rogue
+reports, you have to restrict access to the plugin location on your GLPI
+server, typically using HTTP authentication. And preferentially over HTTPS,
+to prevent password sniffing.
+
+Second, some messages between the server and the agent may contain sensible
+informations. For instance, NetInventory tasks involves sending SNMP
+credentials from the server to the agent. In this case, HTTPS usage ensures
+proper communication encryption.
+
+Third, some tasks are explicitely designed to make the agent execute arbitrary
+commands on its host. For instance, the Deploy task is used to install
+software on agent side. In this case, HTTPS usage ensures proper server
+authentication.
+
 SSL support
 -----------
 LWP (also known as libwww-perl) is able to use either Crypt::SSLeay or
@@ -107,3 +139,51 @@ The available workaround:
   openssl and its perl bindings (Net::SSLeay)
 - disable server certificate checking on client
 
+Contacts
+--------
+
+Project websites:
+* main site: http://www.fusioninventory.org
+* forge: http://forge.fusioninventory.org
+
+Project mailing lists:
+* http://lists.alioth.debian.org/mailman/listinfo/fusioninventory-user
+* http://lists.alioth.debian.org/mailman/listinfo/fusioninventory-devel
+
+Project IRC channel:
+* #FusionInventory on FreeNode IRC Network
+
+Please report any issues on project forge bugtracker.
+
+Authors 
+-------
+* Gonéri Le Bouder <goneri at rulezlan.org>>
+* Guillaume Rousse <guillomovitch at gmail.com>
+
+Copyright 2006-2010 OCS Inventory contributors
+Copyright 2010-2012 FusionInventory Team
+
+License
+-------
+This software is licensed under the terms of GPLv2+, see LICENSE file for
+details.
+
+Additional pieces of software
+-----------------------------
+
+The memconf script:
+url: http://myweb.cableone.net/4schmidts/memconf.html
+author: Tom Schmidt
+copyright: 1996-2009 Tom Schmidt
+
+FusionInventory::Agent::Task::Inventory::Input::Virtualization::Vmsystem
+contains code from imvirt:
+url: http://micky.ibh.net/~liske/imvirt.html
+author: Thomas Liske <liske at ibh.de>
+copyright: 2008 IBH IT-Service GmbH [http://www.ibh.de/]
+License: GPLv2+
+
+FusionInventory::Agent::Tools::Screen contains code from monitor-edid:
+url: http://svn.mandriva.com/cgi-bin/viewvc.cgi/soft/monitor-edid
+copyright: 2005 Mandriva
+license: GPLv2+
diff --git a/fusioninventory-agent b/fusioninventory-agent
index f844aa1..6660684 100755
--- a/fusioninventory-agent
+++ b/fusioninventory-agent
@@ -269,9 +269,9 @@ The agent will launch each modules and pass the list of options found in the
 PROLOG RESP as parameter. The module can send information directly to the
 server (inventory, SNMP scan result, etc)
 
-=head2 Windows service or Deamon mode
+=head2 Server mode (Windows service or Unix daemon)
 
-In deamon mode, the agent wait during a period between the last PROLOG and
+In server mode, the agent wait during a period between the last PROLOG and
 PROLOG_FREQ. If PROLOG_FREQ is not set, it will use --delaytime value.
 The default value is 3600.
 
@@ -561,26 +561,19 @@ Print the version and exit.
 
 =back
 
+=head1 CONFIGURATION
 
-=head1 CONFIG FILE
+The agent is able to use multiple configuration backends. The registry backend
+is the default on Windows platform, and the file backend is the default
+everywhere else. Another backend can be specified using the B<--config> option.
 
-The agent initialize its settings from the configuration first.
+The I<file> backend reads configuration directives from a configuration file,
+whose default location is determined at installation time as
+PREFIX/etc/agent.cfg. An alternative location can also be given with
+B<--conf-file> option.
 
-On Unix, this configuration is loaded from a configuration file, the first
-found among the following locations:
-
-=over
-
-=item * F</etc/fusioninventory/agent.cfg>
-
-=item * F</usr/local/etc/fusioninventory/agent.cfg>
-
-=back
-
-An alternative configuration file can be specified with the B<--conf-file>
-parameter, and will be used instead.
-
-On Windows, the configuration is loaded from the registry, from an arch-dependant location:
+The I<registry> backend reads configuration directives from the Windows
+registry, with an arch-dependant location:
 
 =over
 
@@ -590,130 +583,5 @@ On Windows, the configuration is loaded from the registry, from an arch-dependan
 
 =back
 
-=head1 SECURITY
-
-Some modules like SNMPQuery needs to sent credential from the agent to the
-agent. We recommend to enable HTTPS support on the OCS or FusionInventory
-For GLPI server. We also recommend to use only trusted machine as agent in
-this case.
-
-=head1 AUTHORS
-
-The FusionInventory project L<fusioninventory-devel at lists.alioth.debian.org>
-
-The maintainer is Goneri LE BOUDER <goneri at rulezlan.org>
-
-Please read the AUTHORS, Changes and THANKS files to see who is behind
-FusionInventory.
-
-=head1 SEE ALSO
-
-=over 4
-
-=item
-
-FusionInventory website: L<http://www.FusionInventory.org/>
-
-=item
-
-project Forge: L<http://Forge.FusionInventory.org>
-
-=item
-
-The source code of the agent is available on:
-
-=over
-
-=item
-
-Gitorious: L<http://gitorious.org/fusioninventory>
-
-=item
-
-Github: L<http://github.com/fusinv/fusioninventory-agent>
-
-=back
-
-=item
-
-The mailing lists:
-
-=over
-
-=item
-
-L<http://lists.alioth.debian.org/mailman/listinfo/fusioninventory-devel>
-
-=item
-
-L<http://lists.alioth.debian.org/mailman/listinfo/fusioninventory-user>
-
-=back
-
-=item
-
-IRC: #FusionInventory on FreeNode IRC Network
-
-=back
-
-=head1 BUGS
-
-Please, use the mailing lists as much as possible. You can also use the bugtracker on
-http://forge.fusionInventory.org
-
-
-=head1 COPYRIGHT
-
-Copyright (C) 2006-2010 OCS Inventory contributors
-Copyright (C) 2010-2012 FusionInventory Team
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-The memconf script is maintained by Tom Schmidt
-http://myweb.cableone.net/4schmidts/memconf.html
-Copyright © 1996-2009 Tom Schmidt
-
-memconf is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 2 of the License, or (at your option) any later
-version.
-
-FusionInventory::Agent::Backend::Virtualization::Vmsystem uses code from
-imvirt:
-
-   Authors:
-     Thomas Liske <liske at ibh.de>
-
-   Copyright Holder:
-     2008 (C) IBH IT-Service GmbH [http://www.ibh.de/]
-
-   License:
-     This program is free software; you can redistribute it and/or modify
-     it under the terms of the GNU General Public License as published by
-     the Free Software Foundation; either version 2 of the License, or
-     (at your option) any later version.
-
-     This program is distributed in the hope that it will be useful,
-     but WITHOUT ANY WARRANTY; without even the implied warranty of
-     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-     GNU General Public License for more details.
-
-     You should have received a copy of the GNU General Public License
-     along with this package; if not, write to the Free Software
-     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301
-     USA
-
-
-=cut
+The I<none> backend doesn't read any configuration directive at all, allowing
+to isolate the agent execution from any installed configuration.
diff --git a/fusioninventory-injector b/fusioninventory-injector
index c45f688..db01136 100755
--- a/fusioninventory-injector
+++ b/fusioninventory-injector
@@ -32,6 +32,7 @@ sub loadfile {
     print "Loading $file..." if $options{verbose};
 
     open (my $fh, '<', $file) or die "can't open file $file: $ERRNO";
+    ## no critic (ProhibitBitwise)
     flock ($fh, LOCK_EX | LOCK_NB) or die "can't lock file $file: $ERRNO";
     local $RS;
     my $content = <$fh>;
diff --git a/lib/FusionInventory/Agent/HTTP/Protocol/https.pm b/lib/FusionInventory/Agent/HTTP/Protocol/https.pm
index d74a8b1..aa0bf7c 100644
--- a/lib/FusionInventory/Agent/HTTP/Protocol/https.pm
+++ b/lib/FusionInventory/Agent/HTTP/Protocol/https.pm
@@ -27,6 +27,7 @@ sub _extra_sock_opts {
     );
 }
 
+## no critic (ProhibitMultiplePackages)
 package FusionInventory::Agent::HTTP::Protocol::https::Socket;
 
 use base qw(Net::HTTPS LWP::Protocol::http::SocketMethods);
diff --git a/lib/FusionInventory/Agent/HTTP/Server.pm b/lib/FusionInventory/Agent/HTTP/Server.pm
index 001033e..4ef83c9 100644
--- a/lib/FusionInventory/Agent/HTTP/Server.pm
+++ b/lib/FusionInventory/Agent/HTTP/Server.pm
@@ -362,7 +362,7 @@ the directory where HTML templates and static files are stored
 
 =item I<ip>
 
-the network adress to listen to (default: all)
+the network address to listen to (default: all)
 
 =item I<port>
 
@@ -370,7 +370,7 @@ the network port to listen to
 
 =item I<trust>
 
-an IP adress or an IP adress range from which to trust incoming requests
+an IP address or an IP address range from which to trust incoming requests
 without authentication token (default: none)
 
 =back
diff --git a/lib/FusionInventory/Agent/Task/Inventory.pm b/lib/FusionInventory/Agent/Task/Inventory.pm
index 9c9aac7..ce3eb4c 100644
--- a/lib/FusionInventory/Agent/Task/Inventory.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory.pm
@@ -181,7 +181,7 @@ sub _initModulesList {
         $self->{modules}->{$module}->{done}    = 0;
         $self->{modules}->{$module}->{used}    = 0;
 
-        no strict 'refs'; ## no critic
+        no strict 'refs'; ## no critic (ProhibitNoStrict)
         $self->{modules}->{$module}->{runAfter} = [ 
             $parent ? $parent : (),
             ${$module . '::runAfter'} ? @${$module . '::runAfter'} : ()
@@ -190,7 +190,8 @@ sub _initModulesList {
 
     # second pass: disable fallback modules
     foreach my $module (@modules) {
-        no strict 'refs'; ## no critic
+        ## no critic (ProhibitNoStrict ProhibitProlongedStrictureOverride)
+        no strict 'refs';
 
         # skip modules already disabled
         next unless $self->{modules}->{$module}->{enabled};
@@ -364,4 +365,4 @@ FusionInventory::Agent::Task::Inventory - Inventory task for FusionInventory
 
 =head1 DESCRIPTION
 
-This task extract various hardware and software informations on the agent host.
+This task extract various hardware and software information on the agent host.
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
index 903297d..604bec6 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Screen.pm
@@ -1,23 +1,5 @@
 package FusionInventory::Agent::Task::Inventory::Input::Generic::Screen;
-#     Copyright (C) 2005 Mandriva
-#     Copyright (C) 2007 Gonéri Le Bouder <goneri at rulezlan.org> 
-#     This program is free software; you can redistribute it and/or modify
-#     it under the terms of the GNU General Public License as published by
-#     the Free Software Foundation; either version 2 of the License, or
-#     (at your option) any later version.
-
-#     This program is distributed in the hope that it will be useful,
-#     but WITHOUT ANY WARRANTY; without even the implied warranty of
-#     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-#     GNU General Public License for more details.
-
-#     You should have received a copy of the GNU General Public License
-#     along with this program; if not, write to the Free Software
-#     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-# Some part come from Mandriva's (great) monitor-edid
-# http://svn.mandriva.com/cgi-bin/viewvc.cgi/soft/monitor-edid/trunk/
-#
+
 use strict;
 use warnings;
 
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/USB.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/USB.pm
index 4f526d9..fd5e44a 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/USB.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/USB.pm
@@ -20,7 +20,7 @@ sub doInventory {
 
     foreach my $device (_getDevices(logger => $logger)) {
         # avoid duplicates
-        next if $seen->{$device->{SERIAL}}++;
+        next if $device->{SERIAL} && $seen->{$device->{SERIAL}}++;
         $inventory->addEntry(
             section => 'USBDEVICES',
             entry   => $device,
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/Vmsystem.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/Vmsystem.pm
index fdf2227..3866f38 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/Vmsystem.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/Vmsystem.pm
@@ -1,31 +1,10 @@
 package FusionInventory::Agent::Task::Inventory::Input::Virtualization::Vmsystem;
 
-# Initial FusionInventory::Agent::Task::Inventory::Input::Virtualization::Vmsystem version: Nicolas EISEN
-#
-# Code include from imvirt - I'm virtualized?
-#   http://micky.ibh.net/~liske/imvirt.html
-#
-# Authors:
-#   Thomas Liske <liske at ibh.de>
-#
-# Copyright Holder:
-#   2008 (C) IBH IT-Service GmbH [http://www.ibh.de/]
-#
-# License:
-#   This program is free software; you can redistribute it and/or modify
-#   it under the terms of the GNU General Public License as published by
-#   the Free Software Foundation; either version 2 of the License, or
-#   (at your option) any later version.
-#
-#   This program is distributed in the hope that it will be useful,
-#   but WITHOUT ANY WARRANTY; without even the implied warranty of
-#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-#   GNU General Public License for more details.
-#
-#   You should have received a copy of the GNU General Public License
-#   along with this package; if not, write to the Free Software
-#   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
-#
+# Contains code from imvirt:
+# URL: http://micky.ibh.net/~liske/imvirt.html
+# Authors:  Thomas Liske <liske at ibh.de>
+# Copyright: 2008 IBH IT-Service GmbH [http://www.ibh.de/]
+# License: GPLv2+
 
 
 ##
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
index 70eb701..58314a7 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
@@ -51,16 +51,16 @@ sub doInventory {
 
 sub _getInterfaces {
 
-    my @interfaces;
+    my @configurations;
 
     foreach my $object (getWmiObjects(
         class      => 'Win32_NetworkAdapterConfiguration',
-        properties => [ qw/Index Description IPEnabled DHCPServer MACAddress 
+        properties => [ qw/Index Description IPEnabled DHCPServer MACAddress
                            MTU DefaultIPGateway DNSServerSearchOrder IPAddress
                            IPSubnet/  ]
     )) {
 
-        my $interface = {
+        my $configuration = {
             DESCRIPTION => $object->{Description},
             STATUS      => $object->{IPEnabled} ? "Up" : "Down",
             IPDHCP      => $object->{DHCPServer},
@@ -69,46 +69,66 @@ sub _getInterfaces {
         };
 
         if ($object->{DefaultIPGateway}) {
-            $interface->{IPGATEWAY} = $object->{DefaultIPGateway}->[0];
+            $configuration->{IPGATEWAY} = $object->{DefaultIPGateway}->[0];
         }
 
         if ($object->{DNSServerSearchOrder}) {
-            $interface->{dns} = $object->{DNSServerSearchOrder}->[0];
+            $configuration->{dns} = $object->{DNSServerSearchOrder}->[0];
         }
 
         if ($object->{IPAddress}) {
             foreach my $address (@{$object->{IPAddress}}) {
                 my $mask = shift @{$object->{IPSubnet}};
                 if ($address =~ /$ip_address_pattern/) {
-                    push @{$interface->{IPADDRESS}}, $address;
-                    push @{$interface->{IPMASK}}, $mask;
-                    push @{$interface->{IPSUBNET}},
+                    push @{$configuration->{IPADDRESS}}, $address;
+                    push @{$configuration->{IPMASK}}, $mask;
+                    push @{$configuration->{IPSUBNET}},
                         getSubnetAddress($address, $mask);
                 } elsif ($address =~ /\S+/) {
-                    push @{$interface->{IPADDRESS6}}, $address;
-                    push @{$interface->{IPMASK6}}, $mask;
-                    push @{$interface->{IPSUBNET6}},
+                    push @{$configuration->{IPADDRESS6}}, $address;
+                    push @{$configuration->{IPMASK6}}, $mask;
+                    push @{$configuration->{IPSUBNET6}},
                         getSubnetAddressIPv6($address, $mask);
                 }
             }
         }
 
-        $interfaces[$object->{Index}] = $interface;
+        $configurations[$object->{Index}] = $configuration;
     }
 
+    my @interfaces;
+
     foreach my $object (getWmiObjects(
         class      => 'Win32_NetworkAdapter',
-        properties => [ qw/Index PNPDeviceID Speed MACAddress PhysicalAdapter 
-                           AdapterType/  ]
+        properties => [ qw/Index PNPDeviceID Speed PhysicalAdapter AdapterType/  ]
     )) {
         # http://comments.gmane.org/gmane.comp.monitoring.fusion-inventory.devel/34
         next unless $object->{PNPDeviceID};
 
-        my $interface = $interfaces[$object->{Index}];
+        my $configuration = $configurations[$object->{Index}];
 
-        $interface->{SPEED}       = $object->{Speed};
-        $interface->{MACADDR}     = $object->{MACAddress};
-        $interface->{PNPDEVICEID} = $object->{PNPDeviceID};
+        next unless 
+            $configuration->{IPADDRESS} ||
+            $configuration->{IPADDRESS6} ||
+            $configuration->{MACADDR};
+
+        my $interface = {
+            SPEED       => $object->{Speed},
+            PNPDEVICEID => $object->{PNPDeviceID},
+            MACADDR     => $configuration->{MACADDR},
+            DESCRIPTION => $configuration->{DESCRIPTION},
+            STATUS      => $configuration->{STATUS},
+            IPDHCP      => $configuration->{IPDHCP},
+            MTU         => $configuration->{MTU},
+            IPGATEWAY   => $configuration->{IPGATEWAY},
+            IPADDRESS   => $configuration->{IPADDRESS},
+            IPMASK      => $configuration->{IPMASK},
+            IPSUBNET    => $configuration->{IPSUBNET},
+            IPADDRESS6  => $configuration->{IPADDRESS6},
+            IPMASK6     => $configuration->{IPMASK6},
+            IPSUBNET6   => $configuration->{IPSUBNET6},
+            dns         => $configuration->{dns},
+        };
 
         # PhysicalAdapter only work on OS > XP
         if (defined $object->{PhysicalAdapter}) {
@@ -126,11 +146,11 @@ sub _getInterfaces {
             $interface->{TYPE} = $object->{AdapterType};
             $interface->{TYPE} =~ s/Ethernet.*/Ethernet/;
         }
+
+        push @interfaces, $interface;
     }
 
-    # exclude pure virtual interfaces
     return
-        grep { $_->{IPADDRESS} || $_->{IPADDRESS6} || $_->{MACADDR} }
         @interfaces;
 
 }
diff --git a/lib/FusionInventory/Agent/Tools.pm b/lib/FusionInventory/Agent/Tools.pm
index 1a2bee1..2614964 100644
--- a/lib/FusionInventory/Agent/Tools.pm
+++ b/lib/FusionInventory/Agent/Tools.pm
@@ -448,7 +448,7 @@ sub runFunction {
            alarm $params{timeout};
        }
 
-        no strict 'refs'; ## no critic
+        no strict 'refs'; ## no critic (ProhibitNoStrict)
         $result = &{$params{module} . '::' . $params{function}}(
             ref $params{params} eq 'HASH'  ? %{$params{params}} :
             ref $params{params} eq 'ARRAY' ? @{$params{params}} :
diff --git a/lib/FusionInventory/Agent/Tools/Hostname.pm b/lib/FusionInventory/Agent/Tools/Hostname.pm
index 16fcfed..7bd4dd7 100644
--- a/lib/FusionInventory/Agent/Tools/Hostname.pm
+++ b/lib/FusionInventory/Agent/Tools/Hostname.pm
@@ -9,7 +9,7 @@ use English qw(-no_match_vars);
 
 BEGIN {
     if ($OSNAME eq 'MSWin32') {
-        no warnings 'redefine';
+        no warnings 'redefine'; ## no critic (ProhibitNoWarnings)
         Win32::API->require();
         # Kernel32.dll is used more or less everywhere.
         # Without this, Win32::API will release the DLL even
diff --git a/lib/FusionInventory/Agent/Tools/Screen.pm b/lib/FusionInventory/Agent/Tools/Screen.pm
index f2cd98c..d3dddcb 100644
--- a/lib/FusionInventory/Agent/Tools/Screen.pm
+++ b/lib/FusionInventory/Agent/Tools/Screen.pm
@@ -1,24 +1,9 @@
 package FusionInventory::Agent::Tools::Screen;
 
-#     Copyright (C) 2005 Mandriva
-#     This program is free software; you can redistribute it and/or modify
-#     it under the terms of the GNU General Public License as published by
-#     the Free Software Foundation; either version 2 of the License, or
-#     (at your option) any later version.
-
-#     This program is distributed in the hope that it will be useful,
-#     but WITHOUT ANY WARRANTY; without even the implied warranty of
-#     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-#     GNU General Public License for more details.
-
-#     You should have received a copy of the GNU General Public License
-#     along with this program; if not, write to the Free Software
-#     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-#
-# Some part come from Mandriva's (great) monitor-edid
-# http://svn.mandriva.com/cgi-bin/viewvc.cgi/soft/monitor-edid/trunk/
-#
-
+# Contains code from monitor-edid:
+# URL: http://svn.mandriva.com/cgi-bin/viewvc.cgi/soft/monitor-edid
+# Copyright: 2005 Mandriva
+# License: GPLv2+
 
 use strict;
 use warnings;
diff --git a/lib/FusionInventory/Agent/Tools/Unix.pm b/lib/FusionInventory/Agent/Tools/Unix.pm
index decc968..3e5a7c4 100644
--- a/lib/FusionInventory/Agent/Tools/Unix.pm
+++ b/lib/FusionInventory/Agent/Tools/Unix.pm
@@ -171,10 +171,10 @@ sub getFilesystemsFromDf {
             $free       = $infos[4];
             $type       = $infos[6];
         } else {
-            $filesystem = $params{type},
-            $total = $infos[1];
-            $free  = $infos[3];
-            $type  = $infos[5];
+            $filesystem = $params{type};
+            $total      = $infos[1];
+            $free       = $infos[3];
+            $type       = $infos[5];
         }
 
         # skip some virtual filesystems
diff --git a/resources/macos/ioreg/IOUSBDevice b/resources/macos/ioreg/IOUSBDevice
deleted file mode 100644
index 3d58b39..0000000
--- a/resources/macos/ioreg/IOUSBDevice
+++ /dev/null
@@ -1,748 +0,0 @@
-+-o Root  <class IORegistryEntry, id 0x100000100, retain 13>
-  +-o MacBook2,1  <class IOPlatformExpertDevice, id 0x100000110, registered, matched, active, busy 0 (16937 ms), retain 25>
-    +-o AppleACPIPlatformExpert  <class AppleACPIPlatformExpert, id 0x100000111, registered, matched, active, busy 0 (15867 ms), retain 38>
-    | +-o IOPMrootDomain  <class IOPMrootDomain, id 0x100000114, registered, matched, active, busy 0 (12 ms), retain 48>
-    | | +-o IORootParent  <class IORootParent, id 0x100000115, !registered, !matched, active, busy 0, retain 7>
-    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000267, !registered, !matched, active, busy 0, retain 5>
-    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000268, !registered, !matched, active, busy 0, retain 5>
-    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x10000026d, !registered, !matched, active, busy 0, retain 5>
-    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x10000026e, !registered, !matched, active, busy 0, retain 5>
-    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000271, !registered, !matched, active, busy 0, retain 5>
-    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000272, !registered, !matched, active, busy 0, retain 5>
-    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x1000002ed, !registered, !matched, active, busy 0, retain 5>
-    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000319, !registered, !matched, active, busy 0, retain 5>
-    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000329, !registered, !matched, active, busy 0, retain 5>
-    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x10000032f, !registered, !matched, active, busy 0, retain 5>
-    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000332, !registered, !matched, active, busy 0, retain 5>
-    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000363, !registered, !matched, active, busy 0, retain 5>
-    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000364, !registered, !matched, active, busy 0, retain 5>
-    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x10000036d, !registered, !matched, active, busy 0, retain 5>
-    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x10000036e, !registered, !matched, active, busy 0, retain 5>
-    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x10000036f, !registered, !matched, active, busy 0, retain 5>
-    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000371, !registered, !matched, active, busy 0, retain 5>
-    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000392, !registered, !matched, active, busy 0, retain 5>
-    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000393, !registered, !matched, active, busy 0, retain 5>
-    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x1000003a1, !registered, !matched, active, busy 0, retain 5>
-    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x1000003a2, !registered, !matched, active, busy 0, retain 5>
-    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x1000003a3, !registered, !matched, active, busy 0, retain 5>
-    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x1000003b9, !registered, !matched, active, busy 0, retain 5>
-    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x1000003bc, !registered, !matched, active, busy 0, retain 5>
-    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x10000041e, !registered, !matched, active, busy 0, retain 5>
-    | +-o cpus  <class IOPlatformDevice, id 0x100000117, registered, matched, active, busy 0 (4 ms), retain 7>
-    | +-o CPU0 at 0  <class IOACPIPlatformDevice, id 0x100000118, registered, matched, active, busy 0 (418 ms), retain 7>
-    | | +-o AppleACPICPU  <class AppleACPICPU, id 0x10000011d, registered, matched, active, busy 0 (406 ms), retain 9>
-    | |   +-o AppleACPICPUInterruptController  <class AppleACPICPUInterruptController, id 0x10000011f, registered, matched, active, busy 0 (1 ms), retain 5>
-    | |   +-o ACPI_SMC_PlatformPlugin  <class ACPI_SMC_PlatformPlugin, id 0x10000027b, registered, matched, active, busy 0 (8 ms), retain 9>
-    | |   +-o AppleIntelMeromPerformanceMonitor  <class AppleIntelMeromPerformanceMonitor, id 0x10000027c, !registered, !matched, active, busy 0 (145 ms), retain 9>
-    | |   | +-o AppleIntelMeromGeneralPurposeCounter  <class AppleIntelMeromGeneralPurposeCounter, id 0x1000002ce, registered, matched, active, busy 0 (125 ms), retain 7>
-    | |   | | +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x100000292, registered, matched, active, busy 0 (175 ms), retain 17>
-    | |   | |   +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x1000002d4, !registered, !matched, active, busy 0, retain 5>
-    | |   | +-o AppleIntelMeromGeneralPurposeCounter  <class AppleIntelMeromGeneralPurposeCounter, id 0x1000002cf, registered, matched, active, busy 0 (126 ms), retain 7>
-    | |   | | +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x100000292, registered, matched, active, busy 0 (175 ms), retain 17>
-    | |   | |   +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x1000002d4, !registered, !matched, active, busy 0, retain 5>
-    | |   | +-o AppleIntelMeromFixedCounter  <class AppleIntelMeromFixedCounter, id 0x1000002d0, registered, matched, active, busy 0 (133 ms), retain 7>
-    | |   | | +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x100000292, registered, matched, active, busy 0 (175 ms), retain 17>
-    | |   | |   +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x1000002d4, !registered, !matched, active, busy 0, retain 5>
-    | |   | +-o AppleIntelMeromFixedCounter  <class AppleIntelMeromFixedCounter, id 0x1000002d1, registered, matched, active, busy 0 (145 ms), retain 7>
-    | |   | | +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x100000292, registered, matched, active, busy 0 (175 ms), retain 17>
-    | |   | |   +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x1000002d4, !registered, !matched, active, busy 0, retain 5>
-    | |   | +-o AppleIntelMeromFixedCounter  <class AppleIntelMeromFixedCounter, id 0x1000002d2, registered, matched, active, busy 0 (133 ms), retain 7>
-    | |   |   +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x100000292, registered, matched, active, busy 0 (175 ms), retain 17>
-    | |   |     +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x1000002d4, !registered, !matched, active, busy 0, retain 5>
-    | |   +-o AppleIntelMeromSPR  <class AppleIntelMeromSPR, id 0x1000002b4, registered, matched, active, busy 0 (135 ms), retain 4>
-    | +-o CPU1 at 1  <class IOACPIPlatformDevice, id 0x100000119, registered, matched, active, busy 0 (392 ms), retain 7>
-    | | +-o AppleACPICPU  <class AppleACPICPU, id 0x10000011e, registered, matched, active, busy 0 (374 ms), retain 7>
-    | |   +-o AppleIntelMeromPerformanceMonitor  <class AppleIntelMeromPerformanceMonitor, id 0x1000002ba, !registered, !matched, active, busy 0 (124 ms), retain 9>
-    | |   | +-o AppleIntelMeromGeneralPurposeCounter  <class AppleIntelMeromGeneralPurposeCounter, id 0x1000002c2, registered, matched, active, busy 0 (3 ms), retain 7>
-    | |   | | +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x100000292, registered, matched, active, busy 0 (175 ms), retain 17>
-    | |   | |   +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x1000002d4, !registered, !matched, active, busy 0, retain 5>
-    | |   | +-o AppleIntelMeromGeneralPurposeCounter  <class AppleIntelMeromGeneralPurposeCounter, id 0x1000002c4, registered, matched, active, busy 0 (6 ms), retain 7>
-    | |   | | +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x100000292, registered, matched, active, busy 0 (175 ms), retain 17>
-    | |   | |   +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x1000002d4, !registered, !matched, active, busy 0, retain 5>
-    | |   | +-o AppleIntelMeromFixedCounter  <class AppleIntelMeromFixedCounter, id 0x1000002c5, registered, matched, active, busy 0 (120 ms), retain 7>
-    | |   | | +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x100000292, registered, matched, active, busy 0 (175 ms), retain 17>
-    | |   | |   +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x1000002d4, !registered, !matched, active, busy 0, retain 5>
-    | |   | +-o AppleIntelMeromFixedCounter  <class AppleIntelMeromFixedCounter, id 0x1000002c6, registered, matched, active, busy 0 (122 ms), retain 7>
-    | |   | | +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x100000292, registered, matched, active, busy 0 (175 ms), retain 17>
-    | |   | |   +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x1000002d4, !registered, !matched, active, busy 0, retain 5>
-    | |   | +-o AppleIntelMeromFixedCounter  <class AppleIntelMeromFixedCounter, id 0x1000002c7, registered, matched, active, busy 0 (124 ms), retain 7>
-    | |   |   +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x100000292, registered, matched, active, busy 0 (175 ms), retain 17>
-    | |   |     +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x1000002d4, !registered, !matched, active, busy 0, retain 5>
-    | |   +-o AppleIntelMeromSPR  <class AppleIntelMeromSPR, id 0x1000002bb, registered, matched, active, busy 0 (125 ms), retain 4>
-    | +-o io-apic at fec00000  <class IOACPIPlatformDevice, id 0x10000011a, registered, matched, active, busy 0 (4 ms), retain 6>
-    | | +-o AppleAPICInterruptController  <class AppleAPICInterruptController, id 0x100000121, registered, matched, active, busy 0 (1 ms), retain 11>
-    | +-o AppleACPIEventController  <class AppleACPIEventController, id 0x100000122, !registered, !matched, active, busy 0, retain 6>
-    | +-o boot-ec  <class IOACPIPlatformDevice, id 0x100000123, registered, matched, active, busy 0 (3 ms), retain 6>
-    | | +-o AppleACPIEC  <class AppleACPIEC, id 0x100000124, !registered, !matched, active, busy 0, retain 6>
-    | +-o bios  <class IOPlatformDevice, id 0x100000125, registered, matched, active, busy 0 (4 ms), retain 5>
-    | | +-o AppleSMBIOS  <class AppleSMBIOS, id 0x100000126, registered, matched, active, busy 0 (1 ms), retain 4>
-    | +-o ADP1  <class IOACPIPlatformDevice, id 0x10000012a, registered, matched, active, busy 0 (2 ms), retain 7>
-    | | +-o AppleACPIACAdapter  <class AppleACPIACAdapter, id 0x1000001a2, !registered, !matched, active, busy 0, retain 4>
-    | +-o LID0  <class IOACPIPlatformDevice, id 0x10000012b, registered, matched, active, busy 0 (3 ms), retain 9>
-    | | +-o AppleACPILid  <class AppleACPILid, id 0x1000001a3, !registered, !matched, active, busy 0, retain 5>
-    | +-o PNLF  <class IOACPIPlatformDevice, id 0x10000012c, registered, matched, active, busy 0 (13 ms), retain 7>
-    | | +-o AppleIntelPanelA  <class AppleIntelPanelA, id 0x100000273, !registered, !matched, active, busy 0, retain 5>
-    | +-o PWRB  <class IOACPIPlatformDevice, id 0x10000012d, registered, matched, active, busy 0 (5 ms), retain 8>
-    | | +-o AppleACPIButton  <class AppleACPIButton, id 0x1000001a4, !registered, !matched, active, busy 0, retain 4>
-    | +-o SLPB  <class IOACPIPlatformDevice, id 0x10000012e, registered, matched, active, busy 0 (6 ms), retain 7>
-    | | +-o AppleACPIButton  <class AppleACPIButton, id 0x1000001a5, !registered, !matched, active, busy 0, retain 4>
-    | +-o PCI0 at 0  <class IOACPIPlatformDevice, id 0x10000012f, registered, matched, active, busy 0 (15786 ms), retain 43>
-    | | +-o AppleACPIPCI  <class AppleACPIPCI, id 0x1000001a6, registered, matched, active, busy 0 (15772 ms), retain 40>
-    | |   +-o pci8086,27a0 at 0  <class IOPCIDevice, id 0x1000001a8, registered, matched, active, busy 0 (5445 ms), retain 8>
-    | |   | +-o AppleSMCPDRC  <class AppleSMCPDRC, id 0x1000002a9, registered, matched, active, busy 0 (1 ms), retain 4>
-    | |   +-o GFX0 at 2  <class IOPCIDevice, id 0x100000174, registered, matched, active, busy 0 (551 ms), retain 17>
-    | |   | +-o AppleIntelIntegratedFramebuffer  <class AppleIntelIntegratedFramebuffer, id 0x1000002b5, !registered, !matched, active, busy 0, retain 6>
-    | |   | +-o AppleIntelFramebuffer  <class AppleIntelFramebuffer, id 0x1000002d8, registered, matched, active, busy 0 (239 ms), retain 14>
-    | |   | | +-o AppleMCCSControlModule  <class AppleMCCSControlModule, id 0x1000002e2, registered, matched, active, busy 0 (79 ms), retain 5>
-    | |   | | | +-o AppleMCCSParameterHandler  <class AppleMCCSParameterHandler, id 0x1000002eb, registered, matched, active, busy 0 (6 ms), retain 4>
-    | |   | | +-o AppleUpstreamUserClientDriver  <class AppleUpstreamUserClientDriver, id 0x1000002e3, registered, matched, active, busy 0 (3 ms), retain 4>
-    | |   | | +-o IOFramebufferI2CInterface  <class IOFramebufferI2CInterface, id 0x10000031c, registered, matched, active, busy 0 (3 ms), retain 5>
-    | |   | | +-o display0  <class IODisplayConnect, id 0x10000031d, registered, matched, active, busy 0 (28 ms), retain 5>
-    | |   | | | +-o AppleBacklightDisplay  <class AppleBacklightDisplay, id 0x10000031e, registered, matched, active, busy 0 (2 ms), retain 8>
-    | |   | | +-o IOFramebufferUserClient  <class IOFramebufferUserClient, id 0x100000325, !registered, !matched, active, busy 0, retain 5>
-    | |   | +-o AppleIntelFramebuffer  <class AppleIntelFramebuffer, id 0x1000002da, registered, matched, active, busy 0 (212 ms), retain 12>
-    | |   | | +-o AppleMCCSControlModule  <class AppleMCCSControlModule, id 0x1000002e5, registered, matched, active, busy 0 (8 ms), retain 5>
-    | |   | | | +-o AppleMCCSParameterHandler  <class AppleMCCSParameterHandler, id 0x1000002e9, registered, matched, active, busy 0 (6 ms), retain 4>
-    | |   | | +-o AppleUpstreamUserClientDriver  <class AppleUpstreamUserClientDriver, id 0x1000002e6, registered, matched, active, busy 0 (5 ms), retain 4>
-    | |   | | +-o IOFramebufferI2CInterface  <class IOFramebufferI2CInterface, id 0x100000324, registered, matched, active, busy 0 (3 ms), retain 5>
-    | |   | | +-o IOFramebufferUserClient  <class IOFramebufferUserClient, id 0x100000327, !registered, !matched, active, busy 0, retain 5>
-    | |   | +-o Intel915  <class Intel915, id 0x1000002b7, registered, matched, active, busy 0 (2 ms), retain 18>
-    | |   |   +-o Intel9152DContext  <class Intel9152DContext, id 0x100000326, !registered, !matched, active, busy 0, retain 5>
-    | |   |   +-o Intel9152DContext  <class Intel9152DContext, id 0x100000328, !registered, !matched, active, busy 0, retain 5>
-    | |   |   +-o Intel915Device  <class Intel915Device, id 0x10000032d, !registered, !matched, active, busy 0, retain 5>
-    | |   |   +-o Intel915GLContext  <class Intel915GLContext, id 0x10000032e, !registered, !matched, active, busy 0, retain 5>
-    | |   |   +-o Intel915Surface  <class Intel915Surface, id 0x10000035e, !registered, !matched, active, busy 0, retain 5>
-    | |   |   +-o Intel915Surface  <class Intel915Surface, id 0x100000372, !registered, !matched, active, busy 0, retain 5>
-    | |   |   +-o Intel915GLContext  <class Intel915GLContext, id 0x100000373, !registered, !matched, active, busy 0, retain 5>
-    | |   |   +-o Intel915Surface  <class Intel915Surface, id 0x100000384, !registered, !matched, active, busy 0, retain 5>
-    | |   |   +-o Intel915Surface  <class Intel915Surface, id 0x100000385, !registered, !matched, active, busy 0, retain 5>
-    | |   |   +-o Intel915Surface  <class Intel915Surface, id 0x100000391, !registered, !matched, active, busy 0, retain 5>
-    | |   |   +-o Intel915Device  <class Intel915Device, id 0x1000003be, !registered, !matched, active, busy 0, retain 5>
-    | |   |   +-o Intel915GLContext  <class Intel915GLContext, id 0x1000003bf, !registered, !matched, active, busy 0, retain 5>
-    | |   |   +-o Intel915GLContext  <class Intel915GLContext, id 0x1000003c0, !registered, !matched, active, busy 0, retain 5>
-    | |   |   +-o Intel915Surface  <class Intel915Surface, id 0x1000003c1, !registered, !matched, active, busy 0, retain 5>
-    | |   +-o display at 2,1  <class IOPCIDevice, id 0x1000001a9, registered, matched, active, busy 0 (637 ms), retain 9>
-    | |   | +-o IONDRVFramebuffer  <class IONDRVFramebuffer, id 0x100000277, registered, matched, active, busy 0 (458 ms), retain 7>
-    | |   |   +-o AppleMCCSControlModule  <class AppleMCCSControlModule, id 0x1000002ac, registered, matched, active, busy 0 (125 ms), retain 5>
-    | |   |   | +-o AppleMCCSParameterHandler  <class AppleMCCSParameterHandler, id 0x1000002dd, registered, matched, active, busy 0 (4 ms), retain 4>
-    | |   |   +-o AppleUpstreamUserClientDriver  <class AppleUpstreamUserClientDriver, id 0x1000002ad, registered, matched, active, busy 0 (107 ms), retain 4>
-    | |   +-o pci8086,27a3 at 7  <class IOPCIDevice, id 0x1000001aa, registered, matched, active, busy 0 (32 ms), retain 7>
-    | |   +-o HDEF at 1B  <class IOPCIDevice, id 0x100000178, registered, matched, active, busy 0 (739 ms), retain 10>
-    | |   | +-o AppleHDAController at 1B  <class AppleHDAController, id 0x100000280, registered, matched, active, busy 0 (348 ms), retain 7>
-    | |   |   +-o IOHDACodecDevice at 1B,0  <class IOHDACodecDevice, id 0x1000002a8, registered, matched, active, busy 0 (348 ms), retain 6>
-    | |   |     +-o IOHDACodecDriver  <class IOHDACodecDriver, id 0x1000002d6, !registered, !matched, active, busy 0 (261 ms), retain 5>
-    | |   |       +-o IOHDACodecFunction at 1B,0,1  <class IOHDACodecFunction, id 0x1000002d7, registered, matched, active, busy 0 (261 ms), retain 6>
-    | |   |         +-o AppleHDACodecGeneric  <class AppleHDACodecGeneric, id 0x1000002e1, registered, matched, active, busy 0 (101 ms), retain 5>
-    | |   |           +-o AppleHDADriver  <class AppleHDADriver, id 0x1000002ec, registered, matched, active, busy 0 (21 ms), retain 8>
-    | |   |             +-o AppleHDAEngineOutput at 1B,0,1,2  <class AppleHDAEngineOutput, id 0x100000302, registered, matched, active, busy 0 (9 ms), retain 28>
-    | |   |             | +-o AppleHDAStream  <class AppleHDAStream, id 0x100000303, registered, matched, active, busy 0 (5 ms), retain 8>
-    | |   |             | +-o IOAudioSelectorControl  <class IOAudioSelectorControl, id 0x100000304, !registered, !matched, active, busy 0 (0 ms), retain 12>
-    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000033f, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000039c, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003b4, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | +-o IOAudioLevelControl  <class IOAudioLevelControl, id 0x100000305, !registered, !matched, active, busy 0 (0 ms), retain 12>
-    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000340, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000039d, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003b5, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | +-o IOAudioLevelControl  <class IOAudioLevelControl, id 0x100000306, !registered, !matched, active, busy 0 (0 ms), retain 12>
-    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000341, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000039e, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003b6, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | +-o IOAudioToggleControl  <class IOAudioToggleControl, id 0x100000307, !registered, !matched, active, busy 0 (0 ms), retain 12>
-    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000342, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000039f, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003b7, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | +-o IOAudioToggleControl  <class IOAudioToggleControl, id 0x100000308, !registered, !matched, active, busy 0 (0 ms), retain 12>
-    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000343, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003a0, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003b8, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | +-o AudioAUUCDriver  <class AudioAUUCDriver, id 0x10000030a, registered, matched, active, busy 0 (4 ms), retain 4>
-    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000336, !registered, !matched, active, busy 0, retain 7>
-    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000347, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000368, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x10000036c, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000397, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x10000039b, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x1000003a7, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x1000003ab, !registered, !matched, active, busy 0, retain 6>
-    | |   |             +-o AppleHDAEngineInput at 1B,0,1,0  <class AppleHDAEngineInput, id 0x100000309, registered, matched, active, busy 0 (6 ms), retain 24>
-    | |   |             | +-o AppleHDAStream  <class AppleHDAStream, id 0x10000030b, registered, matched, active, busy 0 (5 ms), retain 7>
-    | |   |             | +-o IOAudioSelectorControl  <class IOAudioSelectorControl, id 0x10000030c, !registered, !matched, active, busy 0 (0 ms), retain 10>
-    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000033b, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003ac, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | +-o IOAudioLevelControl  <class IOAudioLevelControl, id 0x10000030d, !registered, !matched, active, busy 0 (0 ms), retain 10>
-    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000033c, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003ad, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | +-o IOAudioLevelControl  <class IOAudioLevelControl, id 0x10000030e, !registered, !matched, active, busy 0 (0 ms), retain 10>
-    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000033d, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003ae, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | +-o IOAudioToggleControl  <class IOAudioToggleControl, id 0x10000030f, !registered, !matched, active, busy 0 (0 ms), retain 18>
-    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000033e, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000345, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000036a, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000399, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003a9, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003af, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000335, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000346, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000367, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x10000036b, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000396, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x10000039a, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x1000003a6, !registered, !matched, active, busy 0, retain 6>
-    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x1000003aa, !registered, !matched, active, busy 0, retain 6>
-    | |   |             +-o AppleHDAEngineInput at 1B,0,1,1  <class AppleHDAEngineInput, id 0x100000310, registered, matched, active, busy 0 (6 ms), retain 24>
-    | |   |               +-o AppleHDAStream  <class AppleHDAStream, id 0x100000311, registered, matched, active, busy 0 (5 ms), retain 7>
-    | |   |               +-o IOAudioSelectorControl  <class IOAudioSelectorControl, id 0x100000313, !registered, !matched, active, busy 0 (0 ms), retain 10>
-    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000337, !registered, !matched, active, busy 0, retain 6>
-    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003b0, !registered, !matched, active, busy 0, retain 6>
-    | |   |               +-o IOAudioLevelControl  <class IOAudioLevelControl, id 0x100000314, !registered, !matched, active, busy 0 (0 ms), retain 10>
-    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000338, !registered, !matched, active, busy 0, retain 6>
-    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003b1, !registered, !matched, active, busy 0, retain 6>
-    | |   |               +-o IOAudioLevelControl  <class IOAudioLevelControl, id 0x100000315, !registered, !matched, active, busy 0 (0 ms), retain 10>
-    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000339, !registered, !matched, active, busy 0, retain 6>
-    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003b2, !registered, !matched, active, busy 0, retain 6>
-    | |   |               +-o IOAudioToggleControl  <class IOAudioToggleControl, id 0x100000316, !registered, !matched, active, busy 0 (0 ms), retain 10>
-    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000033a, !registered, !matched, active, busy 0, retain 6>
-    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003b3, !registered, !matched, active, busy 0, retain 6>
-    | |   |               +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000334, !registered, !matched, active, busy 0, retain 6>
-    | |   |               +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000344, !registered, !matched, active, busy 0, retain 6>
-    | |   |               +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000366, !registered, !matched, active, busy 0, retain 6>
-    | |   |               +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000369, !registered, !matched, active, busy 0, retain 6>
-    | |   |               +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000395, !registered, !matched, active, busy 0, retain 6>
-    | |   |               +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000398, !registered, !matched, active, busy 0, retain 6>
-    | |   |               +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x1000003a5, !registered, !matched, active, busy 0, retain 6>
-    | |   |               +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x1000003a8, !registered, !matched, active, busy 0, retain 6>
-    | |   +-o RP01 at 1C  <class IOPCIDevice, id 0x100000179, registered, matched, active, busy 0 (6297 ms), retain 11>
-    | |   | +-o IOPCI2PCIBridge  <class IOPCI2PCIBridge, id 0x1000001c2, registered, matched, active, busy 0 (6262 ms), retain 7>
-    | |   |   +-o PXS1 at 0  <class IOPCIDevice, id 0x10000017a, registered, matched, active, busy 0 (6262 ms), retain 10>
-    | |   |     +-o yukon2osx  <class yukon2osx, id 0x1000001c6, !registered, !matched, active, busy 0 (2 ms), retain 7>
-    | |   |       +-o yukon  <class yukon, id 0x100000260, !registered, !matched, active, busy 0 (2 ms), retain 8>
-    | |   |         +-o IOEthernetInterface  <class IOEthernetInterface, id 0x100000261, registered, matched, active, busy 0 (2 ms), retain 11>
-    | |   |           +-o IONetworkStack  <class IONetworkStack, id 0x1000001de, registered, matched, active, busy 0 (2 ms), retain 11>
-    | |   |             +-o IONetworkStackUserClient  <class IONetworkStackUserClient, id 0x100000266, !registered, !matched, active, busy 0, retain 5>
-    | |   +-o RP02 at 1C,1  <class IOPCIDevice, id 0x10000017b, registered, matched, active, busy 0 (509 ms), retain 11>
-    | |   | +-o IOPCI2PCIBridge  <class IOPCI2PCIBridge, id 0x1000001e3, registered, matched, active, busy 0 (299 ms), retain 7>
-    | |   |   +-o PXS2 at 0  <class IOPCIDevice, id 0x10000017c, registered, matched, active, busy 0 (288 ms), retain 12>
-    | |   |     +-o AirPort_AthrFusion21  <class AirPort_AthrFusion21, id 0x10000027d, registered, matched, active, busy 0 (100 ms), retain 8>
-    | |   |       +-o AtherosFusion21Interface  <class AtherosFusion21Interface, id 0x1000002ab, registered, matched, active, busy 0 (99 ms), retain 10>
-    | |   |         +-o IONetworkStack  <class IONetworkStack, id 0x1000001de, registered, matched, active, busy 0 (2 ms), retain 11>
-    | |   |           +-o IONetworkStackUserClient  <class IONetworkStackUserClient, id 0x100000266, !registered, !matched, active, busy 0, retain 5>
-    | |   +-o USB1 at 1D  <class IOPCIDevice, id 0x10000017d, registered, matched, active, busy 0 (967 ms), retain 11>
-    | |   | +-o AppleUSBUHCI  <class AppleUSBUHCI, id 0x1000001e1, registered, matched, active, busy 0 (634 ms), retain 9>
-    | |   |   +-o UHCI Root Hub Simulation at 1D  <class IOUSBRootHubDevice, id 0x1000001fe, registered, matched, active, busy 0 (8 ms), retain 10>
-    | |   |   | | {
-    | |   |   | |   "sessionID" = 555462596
-    | |   |   | |   "iManufacturer" = 2
-    | |   |   | |   "bNumConfigurations" = 1
-    | |   |   | |   "idProduct" = 32773
-    | |   |   | |   "bcdDevice" = 272
-    | |   |   | |   "Bus Power Available" = 250
-    | |   |   | |   "bMaxPacketSize0" = 8
-    | |   |   | |   "USB Product Name" = "UHCI Root Hub Simulation"
-    | |   |   | |   "iProduct" = 1
-    | |   |   | |   "iSerialNumber" = 0
-    | |   |   | |   "USB Address" = 1
-    | |   |   | |   "bDeviceClass" = 9
-    | |   |   | |   "locationID" = 486539264
-    | |   |   | |   "bDeviceSubClass" = 0
-    | |   |   | |   "IOUserClientClass" = "IOUSBDeviceUserClientV2"
-    | |   |   | |   "Ports" = 2
-    | |   |   | |   "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
-    | |   |   | |   "bDeviceProtocol" = 0
-    | |   |   | |   "USB Vendor Name" = "Apple Inc."
-    | |   |   | |   "Device Speed" = 1
-    | |   |   | |   "idVendor" = 1452
-    | |   |   | |   "AAPL,current-in-sleep" = 1000
-    | |   |   | |   "Requested Power" = 0
-    | |   |   | |   "AAPL,port-current-in-sleep" = 500
-    | |   |   | |   "Low Power Displayed" = No
-    | |   |   | | }
-    | |   |   | | 
-    | |   |   | +-o AppleUSBHub  <class AppleUSBHub, id 0x100000200, !registered, !matched, active, busy 0, retain 8>
-    | |   |   | +-o IOUSBInterface at 0  <class IOUSBInterface, id 0x100000202, !registered, !matched, active, busy 0, retain 7>
-    | |   |   +-o Apple Internal Keyboard / Trackpad at 1d200000  <class IOUSBDevice, id 0x100000227, registered, matched, active, busy 0 (625 ms), retain 12>
-    | |   |     | {
-    | |   |     |   "sessionID" = 922879256
-    | |   |     |   "iManufacturer" = 1
-    | |   |     |   "bNumConfigurations" = 1
-    | |   |     |   "idProduct" = 539
-    | |   |     |   "bcdDevice" = 24
-    | |   |     |   "Bus Power Available" = 250
-    | |   |     |   "bMaxPacketSize0" = 8
-    | |   |     |   "USB Product Name" = "Apple Internal Keyboard / Trackpad"
-    | |   |     |   "iProduct" = 2
-    | |   |     |   "iSerialNumber" = 0
-    | |   |     |   "USB Address" = 2
-    | |   |     |   "bDeviceClass" = 0
-    | |   |     |   "locationID" = 488636416
-    | |   |     |   "bDeviceSubClass" = 0
-    | |   |     |   "IOUserClientClass" = "IOUSBDeviceUserClientV2"
-    | |   |     |   "PortNum" = 2
-    | |   |     |   "non-removable" = "yes"
-    | |   |     |   "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
-    | |   |     |   "bDeviceProtocol" = 0
-    | |   |     |   "Need contiguous memory for isoch" = Yes
-    | |   |     |   "USB Vendor Name" = "Apple Computer"
-    | |   |     |   "Device Speed" = 1
-    | |   |     |   "idVendor" = 1452
-    | |   |     |   "Requested Power" = 20
-    | |   |     |   "IOGeneralInterest" = "IOCommand is not serializable"
-    | |   |     |   "Low Power Displayed" = No
-    | |   |     | }
-    | |   |     | 
-    | |   |     +-o IOUSBCompositeDriver  <class IOUSBCompositeDriver, id 0x100000229, !registered, !matched, active, busy 0, retain 4>
-    | |   |     +-o Apple Internal Keyboard at 0  <class IOUSBInterface, id 0x10000022b, registered, matched, active, busy 0 (520 ms), retain 8>
-    | |   |     | +-o AppleUSBTCKeyboard  <class AppleUSBTCKeyboard, id 0x100000232, registered, matched, active, busy 0 (101 ms), retain 8>
-    | |   |     |   +-o IOHIDInterface  <class IOHIDInterface, id 0x100000238, registered, matched, active, busy 0 (6 ms), retain 6>
-    | |   |     |     +-o AppleUSBTCKeyEventDriver  <class AppleUSBTCKeyEventDriver, id 0x100000239, registered, matched, active, busy 0 (1 ms), retain 8>
-    | |   |     |       +-o IOHIDKeyboard  <class IOHIDKeyboard, id 0x10000023b, registered, matched, active, busy 0 (0 ms), retain 8>
-    | |   |     |       | +-o IOHIDSystem  <class IOHIDSystem, id 0x1000001df, registered, matched, active, busy 0 (3 ms), retain 16>
-    | |   |     |       |   +-o IOHIDUserClient  <class IOHIDUserClient, id 0x10000031a, !registered, !matched, active, busy 0, retain 5>
-    | |   |     |       |   +-o IOHIDParamUserClient  <class IOHIDParamUserClient, id 0x10000031b, !registered, !matched, active, busy 0, retain 5>
-    | |   |     |       |   +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000032a, !registered, !matched, active, busy 0, retain 5>
-    | |   |     |       |   +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000032b, !registered, !matched, active, busy 0, retain 5>
-    | |   |     |       +-o IOHIDSystem  <class IOHIDSystem, id 0x1000001df, registered, matched, active, busy 0 (3 ms), retain 15>
-    | |   |     |         +-o IOHIDUserClient  <class IOHIDUserClient, id 0x10000031a, !registered, !matched, active, busy 0, retain 5>
-    | |   |     |         +-o IOHIDParamUserClient  <class IOHIDParamUserClient, id 0x10000031b, !registered, !matched, active, busy 0, retain 5>
-    | |   |     |         +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000032a, !registered, !matched, active, busy 0, retain 5>
-    | |   |     |         +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000032b, !registered, !matched, active, busy 0, retain 5>
-    | |   |     +-o Touchpad at 1  <class IOUSBInterface, id 0x10000022c, registered, matched, active, busy 0 (382 ms), retain 7>
-    | |   |     | +-o AppleUSBGrIIITrackpad  <class AppleUSBGrIIITrackpad, id 0x10000023d, registered, matched, active, busy 0 (117 ms), retain 16>
-    | |   |     |   +-o RawDataReporter  <class RawDataReporter, id 0x10000023e, registered, matched, active, busy 0 (105 ms), retain 6>
-    | |   |     |   | +-o IOHIDInterface  <class IOHIDInterface, id 0x10000023f, registered, matched, active, busy 0 (3 ms), retain 5>
-    | |   |     |   +-o IOHIDPointingDevice  <class IOHIDPointingDevice, id 0x100000241, registered, matched, active, busy 0 (107 ms), retain 6>
-    | |   |     |   | +-o IOHIDInterface  <class IOHIDInterface, id 0x100000242, registered, matched, active, busy 0 (3 ms), retain 5>
-    | |   |     |   +-o IOHIDSystem  <class IOHIDSystem, id 0x1000001df, registered, matched, active, busy 0 (3 ms), retain 15>
-    | |   |     |   | +-o IOHIDUserClient  <class IOHIDUserClient, id 0x10000031a, !registered, !matched, active, busy 0, retain 5>
-    | |   |     |   | +-o IOHIDParamUserClient  <class IOHIDParamUserClient, id 0x10000031b, !registered, !matched, active, busy 0, retain 5>
-    | |   |     |   | +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000032a, !registered, !matched, active, busy 0, retain 5>
-    | |   |     |   | +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000032b, !registered, !matched, active, busy 0, retain 5>
-    | |   |     |   +-o BaselineReporter  <class BaselineReporter, id 0x100000244, registered, matched, active, busy 0 (108 ms), retain 6>
-    | |   |     |     +-o IOHIDInterface  <class IOHIDInterface, id 0x100000245, registered, matched, active, busy 0 (3 ms), retain 5>
-    | |   |     +-o Apple Internal Keyboard at 2  <class IOUSBInterface, id 0x10000022d, registered, matched, active, busy 0 (202 ms), retain 8>
-    | |   |       +-o AppleUSBTCKeyboard  <class AppleUSBTCKeyboard, id 0x100000247, registered, matched, active, busy 0 (110 ms), retain 8>
-    | |   |         +-o IOHIDInterface  <class IOHIDInterface, id 0x100000248, registered, matched, active, busy 0 (103 ms), retain 6>
-    | |   |           +-o IOHIDEventDriver  <class IOHIDEventDriver, id 0x1000002a1, registered, matched, active, busy 0 (3 ms), retain 8>
-    | |   |             +-o IOHIDConsumer  <class IOHIDConsumer, id 0x1000002a2, registered, matched, active, busy 0 (1 ms), retain 8>
-    | |   |             | +-o IOHIDSystem  <class IOHIDSystem, id 0x1000001df, registered, matched, active, busy 0 (3 ms), retain 16>
-    | |   |             |   +-o IOHIDUserClient  <class IOHIDUserClient, id 0x10000031a, !registered, !matched, active, busy 0, retain 5>
-    | |   |             |   +-o IOHIDParamUserClient  <class IOHIDParamUserClient, id 0x10000031b, !registered, !matched, active, busy 0, retain 5>
-    | |   |             |   +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000032a, !registered, !matched, active, busy 0, retain 5>
-    | |   |             |   +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000032b, !registered, !matched, active, busy 0, retain 5>
-    | |   |             +-o IOHIDSystem  <class IOHIDSystem, id 0x1000001df, registered, matched, active, busy 0 (3 ms), retain 15>
-    | |   |               +-o IOHIDUserClient  <class IOHIDUserClient, id 0x10000031a, !registered, !matched, active, busy 0, retain 5>
-    | |   |               +-o IOHIDParamUserClient  <class IOHIDParamUserClient, id 0x10000031b, !registered, !matched, active, busy 0, retain 5>
-    | |   |               +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000032a, !registered, !matched, active, busy 0, retain 5>
-    | |   |               +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000032b, !registered, !matched, active, busy 0, retain 5>
-    | |   +-o USB2 at 1D,1  <class IOPCIDevice, id 0x100000181, registered, matched, active, busy 0 (352 ms), retain 11>
-    | |   | +-o AppleUSBUHCI  <class AppleUSBUHCI, id 0x1000001f3, registered, matched, active, busy 0 (13 ms), retain 8>
-    | |   |   +-o UHCI Root Hub Simulation at 1D,1  <class IOUSBRootHubDevice, id 0x100000206, registered, matched, active, busy 0 (10 ms), retain 8>
-    | |   |     | {
-    | |   |     |   "sessionID" = 564210044
-    | |   |     |   "iManufacturer" = 2
-    | |   |     |   "bNumConfigurations" = 1
-    | |   |     |   "idProduct" = 32773
-    | |   |     |   "bcdDevice" = 272
-    | |   |     |   "Bus Power Available" = 250
-    | |   |     |   "bMaxPacketSize0" = 8
-    | |   |     |   "USB Product Name" = "UHCI Root Hub Simulation"
-    | |   |     |   "iProduct" = 1
-    | |   |     |   "iSerialNumber" = 0
-    | |   |     |   "USB Address" = 1
-    | |   |     |   "bDeviceClass" = 9
-    | |   |     |   "locationID" = 1023410176
-    | |   |     |   "bDeviceSubClass" = 0
-    | |   |     |   "IOUserClientClass" = "IOUSBDeviceUserClientV2"
-    | |   |     |   "Ports" = 2
-    | |   |     |   "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
-    | |   |     |   "bDeviceProtocol" = 0
-    | |   |     |   "USB Vendor Name" = "Apple Inc."
-    | |   |     |   "Device Speed" = 1
-    | |   |     |   "idVendor" = 1452
-    | |   |     |   "AAPL,current-in-sleep" = 1000
-    | |   |     |   "Requested Power" = 0
-    | |   |     |   "AAPL,port-current-in-sleep" = 500
-    | |   |     |   "Low Power Displayed" = No
-    | |   |     | }
-    | |   |     | 
-    | |   |     +-o AppleUSBHub  <class AppleUSBHub, id 0x10000020b, !registered, !matched, active, busy 0, retain 6>
-    | |   |     +-o IOUSBInterface at 0  <class IOUSBInterface, id 0x10000020d, !registered, !matched, active, busy 0, retain 7>
-    | |   +-o USB3 at 1D,2  <class IOPCIDevice, id 0x100000185, registered, matched, active, busy 0 (647 ms), retain 11>
-    | |   | +-o AppleUSBUHCI  <class AppleUSBUHCI, id 0x1000001c8, registered, matched, active, busy 0 (297 ms), retain 9>
-    | |   |   +-o UHCI Root Hub Simulation at 1D,2  <class IOUSBRootHubDevice, id 0x100000209, registered, matched, active, busy 0 (20 ms), retain 10>
-    | |   |   | | {
-    | |   |   | |   "sessionID" = 572462640
-    | |   |   | |   "iManufacturer" = 2
-    | |   |   | |   "bNumConfigurations" = 1
-    | |   |   | |   "idProduct" = 32773
-    | |   |   | |   "bcdDevice" = 272
-    | |   |   | |   "Bus Power Available" = 250
-    | |   |   | |   "bMaxPacketSize0" = 8
-    | |   |   | |   "USB Product Name" = "UHCI Root Hub Simulation"
-    | |   |   | |   "iProduct" = 1
-    | |   |   | |   "iSerialNumber" = 0
-    | |   |   | |   "USB Address" = 1
-    | |   |   | |   "bDeviceClass" = 9
-    | |   |   | |   "locationID" = 1560281088
-    | |   |   | |   "bDeviceSubClass" = 0
-    | |   |   | |   "IOUserClientClass" = "IOUSBDeviceUserClientV2"
-    | |   |   | |   "Ports" = 2
-    | |   |   | |   "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
-    | |   |   | |   "bDeviceProtocol" = 0
-    | |   |   | |   "USB Vendor Name" = "Apple Inc."
-    | |   |   | |   "Device Speed" = 1
-    | |   |   | |   "idVendor" = 1452
-    | |   |   | |   "AAPL,current-in-sleep" = 1000
-    | |   |   | |   "Requested Power" = 0
-    | |   |   | |   "AAPL,port-current-in-sleep" = 500
-    | |   |   | |   "Low Power Displayed" = No
-    | |   |   | | }
-    | |   |   | | 
-    | |   |   | +-o AppleUSBHub  <class AppleUSBHub, id 0x100000218, !registered, !matched, active, busy 0, retain 8>
-    | |   |   | +-o IOUSBInterface at 0  <class IOUSBInterface, id 0x10000021a, !registered, !matched, active, busy 0, retain 7>
-    | |   |   +-o IR Receiver at 5d200000  <class IOUSBDevice, id 0x10000022a, registered, matched, active, busy 0 (276 ms), retain 9>
-    | |   |     | {
-    | |   |     |   "sessionID" = 944991920
-    | |   |     |   "iManufacturer" = 1
-    | |   |     |   "bNumConfigurations" = 1
-    | |   |     |   "idProduct" = 33344
-    | |   |     |   "bcdDevice" = 272
-    | |   |     |   "Bus Power Available" = 250
-    | |   |     |   "bMaxPacketSize0" = 8
-    | |   |     |   "USB Product Name" = "IR Receiver"
-    | |   |     |   "iProduct" = 2
-    | |   |     |   "iSerialNumber" = 0
-    | |   |     |   "USB Address" = 2
-    | |   |     |   "bDeviceClass" = 0
-    | |   |     |   "locationID" = 1562378240
-    | |   |     |   "bDeviceSubClass" = 0
-    | |   |     |   "IOUserClientClass" = "IOUSBDeviceUserClientV2"
-    | |   |     |   "PortNum" = 2
-    | |   |     |   "non-removable" = "yes"
-    | |   |     |   "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
-    | |   |     |   "bDeviceProtocol" = 0
-    | |   |     |   "Need contiguous memory for isoch" = Yes
-    | |   |     |   "USB Vendor Name" = "Apple Computer, Inc."
-    | |   |     |   "Device Speed" = 1
-    | |   |     |   "idVendor" = 1452
-    | |   |     |   "Requested Power" = 50
-    | |   |     |   "IOGeneralInterest" = "IOCommand is not serializable"
-    | |   |     |   "Low Power Displayed" = No
-    | |   |     | }
-    | |   |     | 
-    | |   |     +-o IOUSBCompositeDriver  <class IOUSBCompositeDriver, id 0x10000022f, !registered, !matched, active, busy 0, retain 4>
-    | |   |     +-o IOUSBInterface at 0  <class IOUSBInterface, id 0x100000230, registered, matched, active, busy 0 (261 ms), retain 8>
-    | |   |       +-o AppleIRController  <class AppleIRController, id 0x100000235, registered, matched, active, busy 0 (112 ms), retain 8>
-    | |   |         +-o IOHIDInterface  <class IOHIDInterface, id 0x100000236, registered, matched, active, busy 0 (3 ms), retain 5>
-    | |   |         +-o IOHIDLibUserClient  <class IOHIDLibUserClient, id 0x10000035d, !registered, !matched, active, busy 0, retain 6>
-    | |   +-o USB4 at 1D,3  <class IOPCIDevice, id 0x100000189, registered, matched, active, busy 0 (2390 ms), retain 11>
-    | |   | +-o AppleUSBUHCI  <class AppleUSBUHCI, id 0x1000001c9, registered, matched, active, busy 0 (2038 ms), retain 9>
-    | |   |   +-o UHCI Root Hub Simulation at 1D,3  <class IOUSBRootHubDevice, id 0x10000020e, registered, matched, active, busy 0 (8 ms), retain 10>
-    | |   |   | | {
-    | |   |   | |   "sessionID" = 575818003
-    | |   |   | |   "iManufacturer" = 2
-    | |   |   | |   "bNumConfigurations" = 1
-    | |   |   | |   "idProduct" = 32773
-    | |   |   | |   "bcdDevice" = 272
-    | |   |   | |   "Bus Power Available" = 250
-    | |   |   | |   "bMaxPacketSize0" = 8
-    | |   |   | |   "USB Product Name" = "UHCI Root Hub Simulation"
-    | |   |   | |   "iProduct" = 1
-    | |   |   | |   "iSerialNumber" = 0
-    | |   |   | |   "USB Address" = 1
-    | |   |   | |   "bDeviceClass" = 9
-    | |   |   | |   "locationID" = 2097152000
-    | |   |   | |   "bDeviceSubClass" = 0
-    | |   |   | |   "IOUserClientClass" = "IOUSBDeviceUserClientV2"
-    | |   |   | |   "Ports" = 2
-    | |   |   | |   "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
-    | |   |   | |   "bDeviceProtocol" = 0
-    | |   |   | |   "USB Vendor Name" = "Apple Inc."
-    | |   |   | |   "Device Speed" = 1
-    | |   |   | |   "idVendor" = 1452
-    | |   |   | |   "AAPL,current-in-sleep" = 1000
-    | |   |   | |   "Requested Power" = 0
-    | |   |   | |   "AAPL,port-current-in-sleep" = 500
-    | |   |   | |   "Low Power Displayed" = No
-    | |   |   | | }
-    | |   |   | | 
-    | |   |   | +-o AppleUSBHub  <class AppleUSBHub, id 0x100000212, !registered, !matched, active, busy 0, retain 8>
-    | |   |   | +-o IOUSBInterface at 0  <class IOUSBInterface, id 0x100000215, !registered, !matched, active, busy 0, retain 7>
-    | |   |   +-o WirelessControllerDevice at 7d100000  <class IOUSBDevice, id 0x100000256, registered, matched, active, busy 0 (250 ms), retain 10>
-    | |   |     | {
-    | |   |     |   "sessionID" = 3290864968
-    | |   |     |   "iManufacturer" = 0
-    | |   |     |   "idProduct" = 33285
-    | |   |     |   "bDeviceClass" = 224
-    | |   |     |   "bcdDevice" = 6501
-    | |   |     |   "Bus Power Available" = 250
-    | |   |     |   "bMaxPacketSize0" = 64
-    | |   |     |   "iProduct" = 0
-    | |   |     |   "iSerialNumber" = 0
-    | |   |     |   "USB Address" = 2
-    | |   |     |   "bNumConfigurations" = 1
-    | |   |     |   "IOUserClientClass" = "IOUSBDeviceUserClientV2"
-    | |   |     |   "locationID" = 2098200576
-    | |   |     |   "bDeviceSubClass" = 1
-    | |   |     |   "USB Product Name" = "Bluetooth USB Host Controller"
-    | |   |     |   "non-removable" = "yes"
-    | |   |     |   "PortNum" = 1
-    | |   |     |   "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
-    | |   |     |   "bDeviceProtocol" = 1
-    | |   |     |   "Need contiguous memory for isoch" = Yes
-    | |   |     |   "Device Speed" = 1
-    | |   |     |   "USB Vendor Name" = "Apple Inc."
-    | |   |     |   "idVendor" = 1452
-    | |   |     |   "Requested Power" = 0
-    | |   |     |   "IOGeneralInterest" = "IOCommand is not serializable"
-    | |   |     |   "Low Power Displayed" = No
-    | |   |     | }
-    | |   |     | 
-    | |   |     +-o CSRUSBBluetoothHCIController  <class CSRUSBBluetoothHCIController, id 0x100000258, registered, matched, active, busy 0 (0 ms), retain 10>
-    | |   |     | +-o IOBluetoothHCIUserClient  <class IOBluetoothHCIUserClient, id 0x100000270, !registered, !matched, active, busy 0, retain 5>
-    | |   |     | +-o IOBluetoothHCIUserClient  <class IOBluetoothHCIUserClient, id 0x1000003ba, !registered, !matched, active, busy 0, retain 5>
-    | |   |     +-o IOUSBInterface at 0  <class IOUSBInterface, id 0x10000025a, !registered, !matched, active, busy 0, retain 6>
-    | |   |     +-o IOUSBInterface at 1  <class IOUSBInterface, id 0x10000025b, !registered, !matched, active, busy 0, retain 6>
-    | |   |     +-o IOUSBInterface at 2  <class IOUSBInterface, id 0x10000025c, !registered, !matched, active, busy 0, retain 6>
-    | |   +-o USB7 at 1D,7  <class IOPCIDevice, id 0x10000018d, registered, matched, active, busy 0 (2564 ms), retain 13>
-    | |   | +-o IOService  <class IOService, id 0x1000001ca, !registered, !matched, active, busy 0, retain 4>
-    | |   | +-o AppleUSBEHCI  <class AppleUSBEHCI, id 0x1000001cb, registered, matched, active, busy 0 (2383 ms), retain 14>
-    | |   |   +-o EHCI Root Hub Simulation at 1D,7  <class IOUSBRootHubDevice, id 0x1000001d7, registered, matched, active, busy 0 (32 ms), retain 12>
-    | |   |   | | {
-    | |   |   | |   "sessionID" = 410970048
-    | |   |   | |   "iManufacturer" = 2
-    | |   |   | |   "bNumConfigurations" = 1
-    | |   |   | |   "idProduct" = 32774
-    | |   |   | |   "bcdDevice" = 512
-    | |   |   | |   "Bus Power Available" = 250
-    | |   |   | |   "bMaxPacketSize0" = 64
-    | |   |   | |   "USB Product Name" = "EHCI Root Hub Simulation"
-    | |   |   | |   "iProduct" = 1
-    | |   |   | |   "iSerialNumber" = 0
-    | |   |   | |   "USB Address" = 1
-    | |   |   | |   "bDeviceClass" = 9
-    | |   |   | |   "locationID" = 18446744073659219968
-    | |   |   | |   "bDeviceSubClass" = 0
-    | |   |   | |   "IOUserClientClass" = "IOUSBDeviceUserClientV2"
-    | |   |   | |   "Ports" = 8
-    | |   |   | |   "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
-    | |   |   | |   "bDeviceProtocol" = 1
-    | |   |   | |   "USB Vendor Name" = "Apple Inc."
-    | |   |   | |   "Device Speed" = 2
-    | |   |   | |   "idVendor" = 1452
-    | |   |   | |   "AAPL,current-in-sleep" = 4000
-    | |   |   | |   "Requested Power" = 0
-    | |   |   | |   "AAPL,port-current-in-sleep" = 500
-    | |   |   | |   "Low Power Displayed" = No
-    | |   |   | | }
-    | |   |   | | 
-    | |   |   | +-o AppleUSBHub  <class AppleUSBHub, id 0x1000001e8, registered, matched, active, busy 0 (0 ms), retain 9>
-    | |   |   | +-o IOUSBInterface at 0  <class IOUSBInterface, id 0x1000001ea, !registered, !matched, active, busy 0, retain 7>
-    | |   |   +-o Built-in iSight at fd400000  <class IOUSBDevice, id 0x10000024e, registered, matched, active, busy 0 (50 ms), retain 9>
-    | |   |   | | {
-    | |   |   | |   "sessionID" = 2717373407
-    | |   |   | |   "iManufacturer" = 1
-    | |   |   | |   "bNumConfigurations" = 1
-    | |   |   | |   "idProduct" = 34049
-    | |   |   | |   "bcdDevice" = 393
-    | |   |   | |   "Bus Power Available" = 250
-    | |   |   | |   "bMaxPacketSize0" = 64
-    | |   |   | |   "USB Product Name" = "Built-in iSight"
-    | |   |   | |   "iProduct" = 2
-    | |   |   | |   "iSerialNumber" = 0
-    | |   |   | |   "USB Address" = 2
-    | |   |   | |   "bDeviceClass" = 255
-    | |   |   | |   "locationID" = 18446744073663414272
-    | |   |   | |   "bDeviceSubClass" = 255
-    | |   |   | |   "IOUserClientClass" = "IOUSBDeviceUserClientV2"
-    | |   |   | |   "PortNum" = 4
-    | |   |   | |   "non-removable" = "yes"
-    | |   |   | |   "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
-    | |   |   | |   "bDeviceProtocol" = 255
-    | |   |   | |   "USB Vendor Name" = "Micron"
-    | |   |   | |   "Device Speed" = 2
-    | |   |   | |   "idVendor" = 1452
-    | |   |   | |   "Requested Power" = 50
-    | |   |   | |   "IOGeneralInterest" = "IOCommand is not serializable"
-    | |   |   | |   "kSuspendPort" = Yes
-    | |   |   | |   "Low Power Displayed" = No
-    | |   |   | | }
-    | |   |   | | 
-    | |   |   | +-o IOUSBCompositeDriver  <class IOUSBCompositeDriver, id 0x100000250, !registered, !matched, active, busy 0, retain 4>
-    | |   |   | +-o IOUSBInterface at 0  <class IOUSBInterface, id 0x100000252, registered, matched, active, busy 0 (15 ms), retain 6>
-    | |   |   | +-o IOUSBInterface at 1  <class IOUSBInterface, id 0x100000253, registered, matched, active, busy 0 (15 ms), retain 6>
-    | |   |   +-o Flash Disk at fd300000  <class IOUSBDevice, id 0x100000408, registered, matched, active, busy 0 (499 ms), retain 8>
-    | |   |     | {
-    | |   |     |   "sessionID" = 3995793432240
-    | |   |     |   "iManufacturer" = 1
-    | |   |     |   "bNumConfigurations" = 1
-    | |   |     |   "idProduct" = 24613
-    | |   |     |   "bcdDevice" = 256
-    | |   |     |   "Bus Power Available" = 250
-    | |   |     |   "bMaxPacketSize0" = 64
-    | |   |     |   "USB Product Name" = "Flash Disk"
-    | |   |     |   "iProduct" = 2
-    | |   |     |   "iSerialNumber" = 3
-    | |   |     |   "USB Address" = 3
-    | |   |     |   "bDeviceClass" = 0
-    | |   |     |   "bDeviceSubClass" = 0
-    | |   |     |   "locationID" = 18446744073662365696
-    | |   |     |   "IOUserClientClass" = "IOUSBDeviceUserClientV2"
-    | |   |     |   "kHasMSCInterface" = Yes
-    | |   |     |   "PortNum" = 3
-    | |   |     |   "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
-    | |   |     |   "bDeviceProtocol" = 0
-    | |   |     |   "uid" = "USB:197660250078C5C90000"
-    | |   |     |   "USB Vendor Name" = "CBM"
-    | |   |     |   "Device Speed" = 2
-    | |   |     |   "idVendor" = 6518
-    | |   |     |   "USB Serial Number" = "16270078C5C90000"
-    | |   |     |   "Requested Power" = 50
-    | |   |     |   "IOGeneralInterest" = "IOCommand is not serializable"
-    | |   |     |   "Low Power Displayed" = No
-    | |   |     | }
-    | |   |     | 
-    | |   |     +-o IOUSBCompositeDriver  <class IOUSBCompositeDriver, id 0x10000040a, !registered, !matched, active, busy 0, retain 4>
-    | |   |     +-o IOUSBInterface at 0  <class IOUSBInterface, id 0x10000040b, registered, matched, active, busy 0 (482 ms), retain 7>
-    | |   |       +-o IOUSBMassStorageClass  <class IOUSBMassStorageClass, id 0x10000040d, registered, matched, active, busy 0 (177 ms), retain 8>
-    | |   |         +-o IOSCSIPeripheralDeviceNub  <class IOSCSIPeripheralDeviceNub, id 0x10000040f, registered, matched, active, busy 0 (74 ms), retain 6>
-    | |   |           +-o IOSCSIPeripheralDeviceType00  <class IOSCSIPeripheralDeviceType00, id 0x100000410, !registered, !matched, active, busy 0 (20 ms), retain 7>
-    | |   |             +-o IOBlockStorageServices  <class IOBlockStorageServices, id 0x100000413, registered, matched, active, busy 0 (20 ms), retain 5>
-    | |   |               +-o IOBlockStorageDriver  <class IOBlockStorageDriver, id 0x100000414, registered, matched, active, busy 0 (18 ms), retain 7>
-    | |   |                 +-o CBM Flash Disk Media  <class IOMedia, id 0x100000415, registered, matched, active, busy 0 (16 ms), retain 10>
-    | |   |                   +-o IOMediaBSDClient  <class IOMediaBSDClient, id 0x100000416, registered, matched, active, busy 0 (2 ms), retain 5>
-    | |   |                   +-o IOFDiskPartitionScheme  <class IOFDiskPartitionScheme, id 0x100000419, !registered, !matched, active, busy 0 (10 ms), retain 6>
-    | |   |                     +-o Untitled 1 at 1  <class IOMedia, id 0x10000041b, registered, matched, active, busy 0 (10 ms), retain 9>
-    | |   |                       +-o IOMediaBSDClient  <class IOMediaBSDClient, id 0x10000041c, registered, matched, active, busy 0 (2 ms), retain 6>
-    | |   +-o PCIB at 1E  <class IOPCIDevice, id 0x100000197, registered, matched, active, busy 0 (712 ms), retain 11>
-    | |   | +-o IOPCI2PCIBridge  <class IOPCI2PCIBridge, id 0x1000001cd, registered, matched, active, busy 0 (542 ms), retain 7>
-    | |   |   +-o FRWR at 3  <class IOPCIDevice, id 0x100000198, registered, matched, active, busy 0 (494 ms), retain 10>
-    | |   |     +-o AppleFWOHCI  <class AppleFWOHCI, id 0x1000001d8, !registered, !matched, active, busy 0 (476 ms), retain 6>
-    | |   |       +-o IOFireWireController  <class IOFireWireController, id 0x1000001da, registered, matched, active, busy 0 (476 ms), retain 9>
-    | |   |         +-o IOFireWireLocalNode  <class IOFireWireLocalNode, id 0x100000214, registered, matched, active, busy 0 (476 ms), retain 12>
-    | |   |           +-o IOFireWireUserClientIniter  <class IOFireWireUserClientIniter, id 0x100000216, !registered, !matched, active, busy 0, retain 4>
-    | |   |           +-o IOFireWireUserClientIniter  <class IOFireWireUserClientIniter, id 0x1000002b0, !registered, !matched, active, busy 0, retain 4>
-    | |   |           +-o IOFireWireIP  <class IOFireWireIP, id 0x1000002b1, registered, matched, active, busy 0 (224 ms), retain 5>
-    | |   |             +-o IOFWInterface  <class IOFWInterface, id 0x1000002b9, registered, matched, active, busy 0 (224 ms), retain 10>
-    | |   |               +-o IONetworkStack  <class IONetworkStack, id 0x1000001de, registered, matched, active, busy 0 (2 ms), retain 11>
-    | |   |                 +-o IONetworkStackUserClient  <class IONetworkStackUserClient, id 0x100000266, !registered, !matched, active, busy 0, retain 5>
-    | |   +-o LPCB at 1F  <class IOPCIDevice, id 0x100000199, registered, matched, active, busy 0 (5615 ms), retain 28>
-    | |   | +-o AppleLPC  <class AppleLPC, id 0x100000275, registered, matched, active, busy 0 (3 ms), retain 5>
-    | |   +-o PATA at 1F,1  <class IOPCIDevice, id 0x10000019a, registered, matched, active, busy 0 (10462 ms), retain 13>
-    | |   | +-o AppleIntelPIIXATARoot  <class AppleIntelPIIXATARoot, id 0x1000001d1, !registered, !matched, active, busy 0 (10287 ms), retain 6>
-    | |   |   +-o PRID at 0  <class AppleIntelPIIXATAChannel, id 0x10000019b, registered, matched, active, busy 0 (10287 ms), retain 14>
-    | |   |   | +-o AppleIntelPIIXPATA  <class AppleIntelPIIXPATA, id 0x1000001e2, registered, matched, active, busy 0 (10231 ms), retain 7>
-    | |   |   |   +-o ATADeviceNub at 0  <class ATADeviceNub, id 0x1000001f5, registered, matched, active, busy 0 (10230 ms), retain 6>
-    | |   |   |     +-o IOATAPIProtocolTransport  <class IOATAPIProtocolTransport, id 0x1000001f8, registered, matched, active, busy 0 (10221 ms), retain 8>
-    | |   |   |       +-o IOSCSIPeripheralDeviceNub  <class IOSCSIPeripheralDeviceNub, id 0x1000001fb, registered, matched, active, busy 0 (10013 ms), retain 6>
-    | |   |   |         +-o IOSCSIPeripheralDeviceType05  <class IOSCSIPeripheralDeviceType05, id 0x100000222, !registered, !matched, active, busy 0 (3701 ms), retain 7>
-    | |   |   |           +-o IODVDServices  <class IODVDServices, id 0x100000263, registered, matched, active, busy 0 (3701 ms), retain 6>
-    | |   |   |             +-o IODVDBlockStorageDriver  <class IODVDBlockStorageDriver, id 0x100000264, registered, matched, active, busy 0 (3699 ms), retain 7>
-    | |   |   |             | +-o HL-DT-ST DVDRW GSA-S10N Media  <class IODVDMedia, id 0x100000269, registered, matched, active, busy 0 (3698 ms), retain 10>
-    | |   |   |             |   +-o IODVDMediaBSDClient  <class IODVDMediaBSDClient, id 0x10000026a, registered, matched, active, busy 0 (2 ms), retain 5>
-    | |   |   |             |   +-o IOApplePartitionScheme  <class IOApplePartitionScheme, id 0x1000002f4, !registered, !matched, active, busy 0 (14 ms), retain 8>
-    | |   |   |             |     +-o Apple at 1  <class IOMedia, id 0x1000002f5, registered, matched, active, busy 0 (11 ms), retain 8>
-    | |   |   |             |     | +-o IOMediaBSDClient  <class IOMediaBSDClient, id 0x1000002f8, registered, matched, active, busy 0 (5 ms), retain 5>
-    | |   |   |             |     +-o Macintosh at 2  <class IOMedia, id 0x1000002f6, registered, matched, active, busy 0 (12 ms), retain 8>
-    | |   |   |             |     | +-o IOMediaBSDClient  <class IOMediaBSDClient, id 0x1000002f9, registered, matched, active, busy 0 (5 ms), retain 5>
-    | |   |   |             |     +-o Mac_OS_X at 3  <class IOMedia, id 0x1000002f7, registered, matched, active, busy 0 (14 ms), retain 9>
-    | |   |   |             |       +-o IOMediaBSDClient  <class IOMediaBSDClient, id 0x1000002fa, registered, matched, active, busy 0 (5 ms), retain 6>
-    | |   |   |             +-o SCSITaskUserClientIniter  <class SCSITaskUserClientIniter, id 0x100000265, !registered, !matched, active, busy 0, retain 4>
-    | |   |   +-o CHN1 at 1  <class AppleIntelPIIXATAChannel, id 0x1000001d2, registered, matched, active, busy 0 (75 ms), retain 6>
-    | |   +-o SATA at 1F,2  <class IOPCIDevice, id 0x10000019e, registered, matched, active, busy 0 (387 ms), retain 13>
-    | |   | +-o AppleAHCI  <class AppleAHCI, id 0x1000001d3, registered, matched, active, busy 0 (208 ms), retain 7>
-    | |   |   +-o PRT2 at 2  <class AppleAHCIPort, id 0x1000001a0, registered, matched, active, busy 0 (170 ms), retain 10>
-    | |   |     +-o IOAHCIDevice at 0  <class IOAHCIDevice, id 0x1000001eb, registered, matched, active, busy 0 (170 ms), retain 11>
-    | |   |       +-o AppleAHCIDiskDriver  <class AppleAHCIDiskDriver, id 0x1000001ec, registered, matched, active, busy 0 (51 ms), retain 6>
-    | |   |         +-o IOAHCIBlockStorageDevice  <class IOAHCIBlockStorageDevice, id 0x100000203, registered, matched, active, busy 0 (51 ms), retain 6>
-    | |   |           +-o IOBlockStorageDriver  <class IOBlockStorageDriver, id 0x100000207, registered, matched, active, busy 0 (49 ms), retain 7>
-    | |   |             +-o FUJITSU MHY2120BH Media  <class IOMedia, id 0x100000208, registered, matched, active, busy 0 (49 ms), retain 10>
-    | |   |               +-o IOMediaBSDClient  <class IOMediaBSDClient, id 0x10000020f, registered, matched, active, busy 0 (0 ms), retain 5>
-    | |   |               +-o IOGUIDPartitionScheme  <class IOGUIDPartitionScheme, id 0x10000021b, !registered, !matched, active, busy 0 (13 ms), retain 7>
-    | |   |                 +-o EFI System Partition at 1  <class IOMedia, id 0x10000021e, registered, matched, active, busy 0 (3 ms), retain 8>
-    | |   |                 | +-o IOMediaBSDClient  <class IOMediaBSDClient, id 0x100000220, registered, matched, active, busy 0 (1 ms), retain 5>
-    | |   |                 +-o Untitled at 2  <class IOMedia, id 0x10000021f, registered, matched, active, busy 0 (13 ms), retain 10>
-    | |   |                   +-o IOMediaBSDClient  <class IOMediaBSDClient, id 0x100000221, registered, matched, active, busy 0 (1 ms), retain 6>
-    | |   +-o SBUS at 1F,3  <class IOPCIDevice, id 0x1000001a1, registered, matched, active, busy 0 (203 ms), retain 8>
-    | +-o PDRC  <class IOACPIPlatformDevice, id 0x100000130, registered, matched, active, busy 0 (9 ms), retain 6>
-    | +-o SMC  <class IOACPIPlatformDevice, id 0x10000015f, registered, matched, active, busy 0 (451 ms), retain 9>
-    | | +-o AppleSMC  <class AppleSMC, id 0x1000002ae, registered, matched, active, busy 0 (191 ms), retain 6>
-    | |   +-o SMCWatchDogTimer  <class SMCWatchDogTimer, id 0x1000002b3, registered, matched, active, busy 0 (129 ms), retain 5>
-    | +-o SMS0  <class IOACPIPlatformDevice, id 0x100000160, registered, matched, active, busy 0 (377 ms), retain 7>
-    | | +-o SMCMotionSensor  <class SMCMotionSensor, id 0x1000002dc, registered, matched, active, busy 0 (2 ms), retain 5>
-    | +-o EC  <class IOACPIPlatformDevice, id 0x100000161, registered, matched, active, busy 0 (245 ms), retain 10>
-    | | +-o AppleACPIEC  <class AppleACPIEC, id 0x100000124, !registered, !matched, active, busy 0, retain 6>
-    | +-o SMB0  <class IOACPIPlatformDevice, id 0x100000162, registered, matched, active, busy 0 (34 ms), retain 9>
-    | | +-o AppleECSMBusController  <class AppleECSMBusController, id 0x1000001ed, registered, matched, active, busy 0 (16 ms), retain 5>
-    | |   +-o AppleSmartBatteryManager  <class AppleSmartBatteryManager, id 0x1000001ee, registered, matched, active, busy 0 (3 ms), retain 6>
-    | |     +-o AppleSmartBattery  <class AppleSmartBattery, id 0x1000001f0, registered, matched, active, busy 0 (0 ms), retain 5>
-    | +-o SBS0  <class IOACPIPlatformDevice, id 0x100000163, registered, matched, active, busy 0 (19 ms), retain 6>
-    | +-o DMAC  <class IOACPIPlatformDevice, id 0x100000164, registered, matched, active, busy 0 (21 ms), retain 6>
-    | +-o FWHD  <class IOACPIPlatformDevice, id 0x100000165, registered, matched, active, busy 0 (22 ms), retain 6>
-    | +-o HPET  <class IOACPIPlatformDevice, id 0x100000166, registered, matched, active, busy 0 (24 ms), retain 7>
-    | | +-o AppleHPET  <class AppleHPET, id 0x1000001bc, !registered, !matched, active, busy 0, retain 4>
-    | +-o IPIC  <class IOACPIPlatformDevice, id 0x100000167, registered, matched, active, busy 0 (25 ms), retain 6>
-    | +-o MATH  <class IOACPIPlatformDevice, id 0x100000168, registered, matched, active, busy 0 (26 ms), retain 6>
-    | +-o LDRC  <class IOACPIPlatformDevice, id 0x100000169, registered, matched, active, busy 0 (27 ms), retain 6>
-    | +-o RTC  <class IOACPIPlatformDevice, id 0x10000016a, registered, matched, active, busy 0 (38 ms), retain 8>
-    | | +-o AppleRTC  <class AppleRTC, id 0x1000001bd, registered, matched, active, busy 0 (1 ms), retain 6>
-    | +-o TIMR  <class IOACPIPlatformDevice, id 0x10000016b, registered, matched, active, busy 0 (29 ms), retain 6>
-    | +-o AppleEFIRuntime  <class AppleEFIRuntime, id 0x1000001be, registered, matched, active, busy 0 (297 ms), retain 7>
-    | | +-o AppleEFINVRAM  <class AppleEFINVRAM, id 0x1000001bf, registered, matched, active, busy 0 (1 ms), retain 7>
-    | +-o IOPCIMessagedInterruptController  <class IOPCIMessagedInterruptController, id 0x1000001c1, registered, matched, active, busy 0 (2 ms), retain 6>
-    | +-o AppleRawIOAddressSpace  <class AppleRawIOAddressSpace, id 0x10000028a, registered, matched, active, busy 0 (2 ms), retain 4>
-    | +-o AppleRawPhysicalMemoryAddressSpace  <class AppleRawPhysicalMemoryAddressSpace, id 0x10000028b, registered, matched, active, busy 0 (4 ms), retain 4>
-    +-o IOResources  <class IOResources, id 0x100000113, registered, matched, active, busy 0 (824 ms), retain 24>
-      +-o AppleIntelCPUPowerManagement  <class AppleIntelCPUPowerManagement, id 0x10000011b, registered, matched, active, busy 0 (252 ms), retain 5>
-      | +-o AppleIntelCPUPowerManagementClient  <class AppleIntelCPUPowerManagementClient, id 0x100000120, !registered, !matched, active, busy 0, retain 4>
-      +-o IOHDIXController  <class IOHDIXController, id 0x10000011c, registered, matched, active, busy 0 (2 ms), retain 4>
-      +-o com_apple_AppleFSCompression_AppleFSCompressionTypeZlib  <class com_apple_AppleFSCompression_AppleFSCompressionTypeZlib, id 0x1000001dc, !registered, !matched, active, busy 0, retain 4>
-      +-o com_apple_BootCache  <class com_apple_BootCache, id 0x1000001dd, !registered, !matched, active, busy 0, retain 4>
-      +-o IONetworkStack  <class IONetworkStack, id 0x1000001de, registered, matched, active, busy 0 (2 ms), retain 11>
-      | +-o IONetworkStackUserClient  <class IONetworkStackUserClient, id 0x100000266, !registered, !matched, active, busy 0, retain 5>
-      +-o IOHIDSystem  <class IOHIDSystem, id 0x1000001df, registered, matched, active, busy 0 (3 ms), retain 15>
-      | +-o IOHIDUserClient  <class IOHIDUserClient, id 0x10000031a, !registered, !matched, active, busy 0, retain 5>
-      | +-o IOHIDParamUserClient  <class IOHIDParamUserClient, id 0x10000031b, !registered, !matched, active, busy 0, retain 5>
-      | +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000032a, !registered, !matched, active, busy 0, retain 5>
-      | +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000032b, !registered, !matched, active, busy 0, retain 5>
-      +-o AppleProfileOSHooks  <class AppleProfileOSHooks, id 0x100000281, registered, matched, active, busy 0 (187 ms), retain 15>
-      | +-o AppleProfileTimeTrigger  <class AppleProfileTimeTrigger, id 0x10000028f, registered, matched, active, busy 0 (168 ms), retain 6>
-      | +-o AppleProfilePMITrigger  <class AppleProfilePMITrigger, id 0x100000290, registered, matched, active, busy 0 (168 ms), retain 6>
-      | +-o AppleOSXPerformanceMonitor  <class AppleOSXPerformanceMonitor, id 0x100000291, !registered, !matched, active, busy 0 (173 ms), retain 6>
-      | | +-o AppleOSXPerformanceCounter  <class AppleOSXPerformanceCounter, id 0x10000029c, registered, matched, active, busy 0 (170 ms), retain 6>
-      | | | +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x100000292, registered, matched, active, busy 0 (175 ms), retain 18>
-      | | |   +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x1000002d4, !registered, !matched, active, busy 0, retain 5>
-      | | +-o AppleOSXPerformanceCounter  <class AppleOSXPerformanceCounter, id 0x10000029d, registered, matched, active, busy 0 (173 ms), retain 6>
-      | |   +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x100000292, registered, matched, active, busy 0 (175 ms), retain 18>
-      | |     +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x1000002d4, !registered, !matched, active, busy 0, retain 5>
-      | +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x100000292, registered, matched, active, busy 0 (175 ms), retain 17>
-      | | +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x1000002d4, !registered, !matched, active, busy 0, retain 5>
-      | +-o AppleProfileKEventTrigger  <class AppleProfileKEventTrigger, id 0x100000293, registered, matched, active, busy 0 (175 ms), retain 6>
-      | +-o AppleProfileManualTrigger  <class AppleProfileManualTrigger, id 0x100000294, registered, matched, active, busy 0 (2 ms), retain 6>
-      | +-o AppleProfileCallstackAction  <class AppleProfileCallstackAction, id 0x100000295, !registered, !matched, active, busy 0, retain 5>
-      | +-o AppleProfileKEventAction  <class AppleProfileKEventAction, id 0x100000296, !registered, !matched, active, busy 0, retain 5>
-      | +-o AppleProfileRegisterStateAction  <class AppleProfileRegisterStateAction, id 0x100000297, !registered, !matched, active, busy 0, retain 5>
-      | +-o AppleProfileThreadInfoAction  <class AppleProfileThreadInfoAction, id 0x100000298, !registered, !matched, active, busy 0, retain 5>
-      | +-o AppleProfileTimestampAction  <class AppleProfileTimestampAction, id 0x100000299, !registered, !matched, active, busy 0, retain 5>
-      +-o com_apple_driver_AudioIPCDevice  <class com_apple_driver_AudioIPCDevice, id 0x100000282, registered, matched, active, busy 0 (165 ms), retain 6>
-      | +-o com_apple_driver_AudioIPCEngine  <class com_apple_driver_AudioIPCEngine, id 0x10000028c, registered, matched, active, busy 0 (164 ms), retain 9>
-      |   +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000333, !registered, !matched, active, busy 0, retain 6>
-      |   +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000365, !registered, !matched, active, busy 0, retain 6>
-      |   +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000394, !registered, !matched, active, busy 0, retain 6>
-      |   +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x1000003a4, !registered, !matched, active, busy 0, retain 6>
-      +-o CHUDKernLib  <class CHUDKernLib, id 0x100000283, registered, matched, active, busy 0 (170 ms), retain 4>
-      +-o CHUDProf  <class CHUDProf, id 0x100000284, registered, matched, active, busy 0 (307 ms), retain 4>
-      +-o CHUDUtils  <class CHUDUtils, id 0x100000285, registered, matched, active, busy 0 (310 ms), retain 4>
-      +-o Dont_Steal_Mac_OS_X  <class Dont_Steal_Mac_OS_X, id 0x100000286, !registered, !matched, active, busy 0, retain 5>
-      +-o IOBluetoothSerialManager  <class IOBluetoothSerialManager, id 0x100000287, registered, matched, active, busy 0 (376 ms), retain 7>
-      | +-o IOBluetoothSerialClient  <class IOBluetoothSerialClient, id 0x1000002d3, !registered, !matched, active, busy 0 (133 ms), retain 5>
-      | | +-o IOBluetoothSerialClientSerialStreamSync  <class IOBluetoothSerialClientSerialStreamSync, id 0x1000002d5, registered, matched, active, busy 0 (133 ms), retain 5>
-      | |   +-o IOSerialBSDClient  <class IOSerialBSDClient, id 0x1000002df, registered, matched, active, busy 0 (6 ms), retain 4>
-      | +-o IOBluetoothSerialClient  <class IOBluetoothSerialClient, id 0x1000002de, !registered, !matched, active, busy 0 (76 ms), retain 5>
-      |   +-o IOBluetoothSerialClientModemStreamSync  <class IOBluetoothSerialClientModemStreamSync, id 0x1000002e0, registered, matched, active, busy 0 (76 ms), retain 5>
-      |     +-o IOSerialBSDClient  <class IOSerialBSDClient, id 0x1000002e8, registered, matched, active, busy 0 (6 ms), retain 4>
-      +-o IODisplayWrangler  <class IODisplayWrangler, id 0x100000288, registered, matched, active, busy 0 (169 ms), retain 7>
-      | +-o IOAccelerationUserClient  <class IOAccelerationUserClient, id 0x100000370, !registered, !matched, active, busy 0, retain 5>
-      +-o IOSurfaceRoot  <class IOSurfaceRoot, id 0x100000289, registered, matched, active, busy 0 (171 ms), retain 5>
-      +-o AppleSCSISubsystemGlobals  <class AppleSCSISubsystemGlobals, id 0x1000002fd, registered, matched, active, busy 0 (1 ms), retain 5>
diff --git a/resources/macos/ioreg/IOUSBDevice1 b/resources/macos/ioreg/IOUSBDevice1
new file mode 100644
index 0000000..3d58b39
--- /dev/null
+++ b/resources/macos/ioreg/IOUSBDevice1
@@ -0,0 +1,748 @@
++-o Root  <class IORegistryEntry, id 0x100000100, retain 13>
+  +-o MacBook2,1  <class IOPlatformExpertDevice, id 0x100000110, registered, matched, active, busy 0 (16937 ms), retain 25>
+    +-o AppleACPIPlatformExpert  <class AppleACPIPlatformExpert, id 0x100000111, registered, matched, active, busy 0 (15867 ms), retain 38>
+    | +-o IOPMrootDomain  <class IOPMrootDomain, id 0x100000114, registered, matched, active, busy 0 (12 ms), retain 48>
+    | | +-o IORootParent  <class IORootParent, id 0x100000115, !registered, !matched, active, busy 0, retain 7>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000267, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000268, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x10000026d, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x10000026e, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000271, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000272, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x1000002ed, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000319, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000329, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x10000032f, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000332, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000363, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000364, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x10000036d, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x10000036e, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x10000036f, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000371, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000392, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000393, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x1000003a1, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x1000003a2, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x1000003a3, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x1000003b9, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x1000003bc, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x10000041e, !registered, !matched, active, busy 0, retain 5>
+    | +-o cpus  <class IOPlatformDevice, id 0x100000117, registered, matched, active, busy 0 (4 ms), retain 7>
+    | +-o CPU0 at 0  <class IOACPIPlatformDevice, id 0x100000118, registered, matched, active, busy 0 (418 ms), retain 7>
+    | | +-o AppleACPICPU  <class AppleACPICPU, id 0x10000011d, registered, matched, active, busy 0 (406 ms), retain 9>
+    | |   +-o AppleACPICPUInterruptController  <class AppleACPICPUInterruptController, id 0x10000011f, registered, matched, active, busy 0 (1 ms), retain 5>
+    | |   +-o ACPI_SMC_PlatformPlugin  <class ACPI_SMC_PlatformPlugin, id 0x10000027b, registered, matched, active, busy 0 (8 ms), retain 9>
+    | |   +-o AppleIntelMeromPerformanceMonitor  <class AppleIntelMeromPerformanceMonitor, id 0x10000027c, !registered, !matched, active, busy 0 (145 ms), retain 9>
+    | |   | +-o AppleIntelMeromGeneralPurposeCounter  <class AppleIntelMeromGeneralPurposeCounter, id 0x1000002ce, registered, matched, active, busy 0 (125 ms), retain 7>
+    | |   | | +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x100000292, registered, matched, active, busy 0 (175 ms), retain 17>
+    | |   | |   +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x1000002d4, !registered, !matched, active, busy 0, retain 5>
+    | |   | +-o AppleIntelMeromGeneralPurposeCounter  <class AppleIntelMeromGeneralPurposeCounter, id 0x1000002cf, registered, matched, active, busy 0 (126 ms), retain 7>
+    | |   | | +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x100000292, registered, matched, active, busy 0 (175 ms), retain 17>
+    | |   | |   +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x1000002d4, !registered, !matched, active, busy 0, retain 5>
+    | |   | +-o AppleIntelMeromFixedCounter  <class AppleIntelMeromFixedCounter, id 0x1000002d0, registered, matched, active, busy 0 (133 ms), retain 7>
+    | |   | | +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x100000292, registered, matched, active, busy 0 (175 ms), retain 17>
+    | |   | |   +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x1000002d4, !registered, !matched, active, busy 0, retain 5>
+    | |   | +-o AppleIntelMeromFixedCounter  <class AppleIntelMeromFixedCounter, id 0x1000002d1, registered, matched, active, busy 0 (145 ms), retain 7>
+    | |   | | +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x100000292, registered, matched, active, busy 0 (175 ms), retain 17>
+    | |   | |   +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x1000002d4, !registered, !matched, active, busy 0, retain 5>
+    | |   | +-o AppleIntelMeromFixedCounter  <class AppleIntelMeromFixedCounter, id 0x1000002d2, registered, matched, active, busy 0 (133 ms), retain 7>
+    | |   |   +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x100000292, registered, matched, active, busy 0 (175 ms), retain 17>
+    | |   |     +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x1000002d4, !registered, !matched, active, busy 0, retain 5>
+    | |   +-o AppleIntelMeromSPR  <class AppleIntelMeromSPR, id 0x1000002b4, registered, matched, active, busy 0 (135 ms), retain 4>
+    | +-o CPU1 at 1  <class IOACPIPlatformDevice, id 0x100000119, registered, matched, active, busy 0 (392 ms), retain 7>
+    | | +-o AppleACPICPU  <class AppleACPICPU, id 0x10000011e, registered, matched, active, busy 0 (374 ms), retain 7>
+    | |   +-o AppleIntelMeromPerformanceMonitor  <class AppleIntelMeromPerformanceMonitor, id 0x1000002ba, !registered, !matched, active, busy 0 (124 ms), retain 9>
+    | |   | +-o AppleIntelMeromGeneralPurposeCounter  <class AppleIntelMeromGeneralPurposeCounter, id 0x1000002c2, registered, matched, active, busy 0 (3 ms), retain 7>
+    | |   | | +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x100000292, registered, matched, active, busy 0 (175 ms), retain 17>
+    | |   | |   +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x1000002d4, !registered, !matched, active, busy 0, retain 5>
+    | |   | +-o AppleIntelMeromGeneralPurposeCounter  <class AppleIntelMeromGeneralPurposeCounter, id 0x1000002c4, registered, matched, active, busy 0 (6 ms), retain 7>
+    | |   | | +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x100000292, registered, matched, active, busy 0 (175 ms), retain 17>
+    | |   | |   +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x1000002d4, !registered, !matched, active, busy 0, retain 5>
+    | |   | +-o AppleIntelMeromFixedCounter  <class AppleIntelMeromFixedCounter, id 0x1000002c5, registered, matched, active, busy 0 (120 ms), retain 7>
+    | |   | | +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x100000292, registered, matched, active, busy 0 (175 ms), retain 17>
+    | |   | |   +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x1000002d4, !registered, !matched, active, busy 0, retain 5>
+    | |   | +-o AppleIntelMeromFixedCounter  <class AppleIntelMeromFixedCounter, id 0x1000002c6, registered, matched, active, busy 0 (122 ms), retain 7>
+    | |   | | +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x100000292, registered, matched, active, busy 0 (175 ms), retain 17>
+    | |   | |   +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x1000002d4, !registered, !matched, active, busy 0, retain 5>
+    | |   | +-o AppleIntelMeromFixedCounter  <class AppleIntelMeromFixedCounter, id 0x1000002c7, registered, matched, active, busy 0 (124 ms), retain 7>
+    | |   |   +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x100000292, registered, matched, active, busy 0 (175 ms), retain 17>
+    | |   |     +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x1000002d4, !registered, !matched, active, busy 0, retain 5>
+    | |   +-o AppleIntelMeromSPR  <class AppleIntelMeromSPR, id 0x1000002bb, registered, matched, active, busy 0 (125 ms), retain 4>
+    | +-o io-apic at fec00000  <class IOACPIPlatformDevice, id 0x10000011a, registered, matched, active, busy 0 (4 ms), retain 6>
+    | | +-o AppleAPICInterruptController  <class AppleAPICInterruptController, id 0x100000121, registered, matched, active, busy 0 (1 ms), retain 11>
+    | +-o AppleACPIEventController  <class AppleACPIEventController, id 0x100000122, !registered, !matched, active, busy 0, retain 6>
+    | +-o boot-ec  <class IOACPIPlatformDevice, id 0x100000123, registered, matched, active, busy 0 (3 ms), retain 6>
+    | | +-o AppleACPIEC  <class AppleACPIEC, id 0x100000124, !registered, !matched, active, busy 0, retain 6>
+    | +-o bios  <class IOPlatformDevice, id 0x100000125, registered, matched, active, busy 0 (4 ms), retain 5>
+    | | +-o AppleSMBIOS  <class AppleSMBIOS, id 0x100000126, registered, matched, active, busy 0 (1 ms), retain 4>
+    | +-o ADP1  <class IOACPIPlatformDevice, id 0x10000012a, registered, matched, active, busy 0 (2 ms), retain 7>
+    | | +-o AppleACPIACAdapter  <class AppleACPIACAdapter, id 0x1000001a2, !registered, !matched, active, busy 0, retain 4>
+    | +-o LID0  <class IOACPIPlatformDevice, id 0x10000012b, registered, matched, active, busy 0 (3 ms), retain 9>
+    | | +-o AppleACPILid  <class AppleACPILid, id 0x1000001a3, !registered, !matched, active, busy 0, retain 5>
+    | +-o PNLF  <class IOACPIPlatformDevice, id 0x10000012c, registered, matched, active, busy 0 (13 ms), retain 7>
+    | | +-o AppleIntelPanelA  <class AppleIntelPanelA, id 0x100000273, !registered, !matched, active, busy 0, retain 5>
+    | +-o PWRB  <class IOACPIPlatformDevice, id 0x10000012d, registered, matched, active, busy 0 (5 ms), retain 8>
+    | | +-o AppleACPIButton  <class AppleACPIButton, id 0x1000001a4, !registered, !matched, active, busy 0, retain 4>
+    | +-o SLPB  <class IOACPIPlatformDevice, id 0x10000012e, registered, matched, active, busy 0 (6 ms), retain 7>
+    | | +-o AppleACPIButton  <class AppleACPIButton, id 0x1000001a5, !registered, !matched, active, busy 0, retain 4>
+    | +-o PCI0 at 0  <class IOACPIPlatformDevice, id 0x10000012f, registered, matched, active, busy 0 (15786 ms), retain 43>
+    | | +-o AppleACPIPCI  <class AppleACPIPCI, id 0x1000001a6, registered, matched, active, busy 0 (15772 ms), retain 40>
+    | |   +-o pci8086,27a0 at 0  <class IOPCIDevice, id 0x1000001a8, registered, matched, active, busy 0 (5445 ms), retain 8>
+    | |   | +-o AppleSMCPDRC  <class AppleSMCPDRC, id 0x1000002a9, registered, matched, active, busy 0 (1 ms), retain 4>
+    | |   +-o GFX0 at 2  <class IOPCIDevice, id 0x100000174, registered, matched, active, busy 0 (551 ms), retain 17>
+    | |   | +-o AppleIntelIntegratedFramebuffer  <class AppleIntelIntegratedFramebuffer, id 0x1000002b5, !registered, !matched, active, busy 0, retain 6>
+    | |   | +-o AppleIntelFramebuffer  <class AppleIntelFramebuffer, id 0x1000002d8, registered, matched, active, busy 0 (239 ms), retain 14>
+    | |   | | +-o AppleMCCSControlModule  <class AppleMCCSControlModule, id 0x1000002e2, registered, matched, active, busy 0 (79 ms), retain 5>
+    | |   | | | +-o AppleMCCSParameterHandler  <class AppleMCCSParameterHandler, id 0x1000002eb, registered, matched, active, busy 0 (6 ms), retain 4>
+    | |   | | +-o AppleUpstreamUserClientDriver  <class AppleUpstreamUserClientDriver, id 0x1000002e3, registered, matched, active, busy 0 (3 ms), retain 4>
+    | |   | | +-o IOFramebufferI2CInterface  <class IOFramebufferI2CInterface, id 0x10000031c, registered, matched, active, busy 0 (3 ms), retain 5>
+    | |   | | +-o display0  <class IODisplayConnect, id 0x10000031d, registered, matched, active, busy 0 (28 ms), retain 5>
+    | |   | | | +-o AppleBacklightDisplay  <class AppleBacklightDisplay, id 0x10000031e, registered, matched, active, busy 0 (2 ms), retain 8>
+    | |   | | +-o IOFramebufferUserClient  <class IOFramebufferUserClient, id 0x100000325, !registered, !matched, active, busy 0, retain 5>
+    | |   | +-o AppleIntelFramebuffer  <class AppleIntelFramebuffer, id 0x1000002da, registered, matched, active, busy 0 (212 ms), retain 12>
+    | |   | | +-o AppleMCCSControlModule  <class AppleMCCSControlModule, id 0x1000002e5, registered, matched, active, busy 0 (8 ms), retain 5>
+    | |   | | | +-o AppleMCCSParameterHandler  <class AppleMCCSParameterHandler, id 0x1000002e9, registered, matched, active, busy 0 (6 ms), retain 4>
+    | |   | | +-o AppleUpstreamUserClientDriver  <class AppleUpstreamUserClientDriver, id 0x1000002e6, registered, matched, active, busy 0 (5 ms), retain 4>
+    | |   | | +-o IOFramebufferI2CInterface  <class IOFramebufferI2CInterface, id 0x100000324, registered, matched, active, busy 0 (3 ms), retain 5>
+    | |   | | +-o IOFramebufferUserClient  <class IOFramebufferUserClient, id 0x100000327, !registered, !matched, active, busy 0, retain 5>
+    | |   | +-o Intel915  <class Intel915, id 0x1000002b7, registered, matched, active, busy 0 (2 ms), retain 18>
+    | |   |   +-o Intel9152DContext  <class Intel9152DContext, id 0x100000326, !registered, !matched, active, busy 0, retain 5>
+    | |   |   +-o Intel9152DContext  <class Intel9152DContext, id 0x100000328, !registered, !matched, active, busy 0, retain 5>
+    | |   |   +-o Intel915Device  <class Intel915Device, id 0x10000032d, !registered, !matched, active, busy 0, retain 5>
+    | |   |   +-o Intel915GLContext  <class Intel915GLContext, id 0x10000032e, !registered, !matched, active, busy 0, retain 5>
+    | |   |   +-o Intel915Surface  <class Intel915Surface, id 0x10000035e, !registered, !matched, active, busy 0, retain 5>
+    | |   |   +-o Intel915Surface  <class Intel915Surface, id 0x100000372, !registered, !matched, active, busy 0, retain 5>
+    | |   |   +-o Intel915GLContext  <class Intel915GLContext, id 0x100000373, !registered, !matched, active, busy 0, retain 5>
+    | |   |   +-o Intel915Surface  <class Intel915Surface, id 0x100000384, !registered, !matched, active, busy 0, retain 5>
+    | |   |   +-o Intel915Surface  <class Intel915Surface, id 0x100000385, !registered, !matched, active, busy 0, retain 5>
+    | |   |   +-o Intel915Surface  <class Intel915Surface, id 0x100000391, !registered, !matched, active, busy 0, retain 5>
+    | |   |   +-o Intel915Device  <class Intel915Device, id 0x1000003be, !registered, !matched, active, busy 0, retain 5>
+    | |   |   +-o Intel915GLContext  <class Intel915GLContext, id 0x1000003bf, !registered, !matched, active, busy 0, retain 5>
+    | |   |   +-o Intel915GLContext  <class Intel915GLContext, id 0x1000003c0, !registered, !matched, active, busy 0, retain 5>
+    | |   |   +-o Intel915Surface  <class Intel915Surface, id 0x1000003c1, !registered, !matched, active, busy 0, retain 5>
+    | |   +-o display at 2,1  <class IOPCIDevice, id 0x1000001a9, registered, matched, active, busy 0 (637 ms), retain 9>
+    | |   | +-o IONDRVFramebuffer  <class IONDRVFramebuffer, id 0x100000277, registered, matched, active, busy 0 (458 ms), retain 7>
+    | |   |   +-o AppleMCCSControlModule  <class AppleMCCSControlModule, id 0x1000002ac, registered, matched, active, busy 0 (125 ms), retain 5>
+    | |   |   | +-o AppleMCCSParameterHandler  <class AppleMCCSParameterHandler, id 0x1000002dd, registered, matched, active, busy 0 (4 ms), retain 4>
+    | |   |   +-o AppleUpstreamUserClientDriver  <class AppleUpstreamUserClientDriver, id 0x1000002ad, registered, matched, active, busy 0 (107 ms), retain 4>
+    | |   +-o pci8086,27a3 at 7  <class IOPCIDevice, id 0x1000001aa, registered, matched, active, busy 0 (32 ms), retain 7>
+    | |   +-o HDEF at 1B  <class IOPCIDevice, id 0x100000178, registered, matched, active, busy 0 (739 ms), retain 10>
+    | |   | +-o AppleHDAController at 1B  <class AppleHDAController, id 0x100000280, registered, matched, active, busy 0 (348 ms), retain 7>
+    | |   |   +-o IOHDACodecDevice at 1B,0  <class IOHDACodecDevice, id 0x1000002a8, registered, matched, active, busy 0 (348 ms), retain 6>
+    | |   |     +-o IOHDACodecDriver  <class IOHDACodecDriver, id 0x1000002d6, !registered, !matched, active, busy 0 (261 ms), retain 5>
+    | |   |       +-o IOHDACodecFunction at 1B,0,1  <class IOHDACodecFunction, id 0x1000002d7, registered, matched, active, busy 0 (261 ms), retain 6>
+    | |   |         +-o AppleHDACodecGeneric  <class AppleHDACodecGeneric, id 0x1000002e1, registered, matched, active, busy 0 (101 ms), retain 5>
+    | |   |           +-o AppleHDADriver  <class AppleHDADriver, id 0x1000002ec, registered, matched, active, busy 0 (21 ms), retain 8>
+    | |   |             +-o AppleHDAEngineOutput at 1B,0,1,2  <class AppleHDAEngineOutput, id 0x100000302, registered, matched, active, busy 0 (9 ms), retain 28>
+    | |   |             | +-o AppleHDAStream  <class AppleHDAStream, id 0x100000303, registered, matched, active, busy 0 (5 ms), retain 8>
+    | |   |             | +-o IOAudioSelectorControl  <class IOAudioSelectorControl, id 0x100000304, !registered, !matched, active, busy 0 (0 ms), retain 12>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000033f, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000039c, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003b4, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioLevelControl  <class IOAudioLevelControl, id 0x100000305, !registered, !matched, active, busy 0 (0 ms), retain 12>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000340, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000039d, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003b5, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioLevelControl  <class IOAudioLevelControl, id 0x100000306, !registered, !matched, active, busy 0 (0 ms), retain 12>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000341, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000039e, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003b6, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioToggleControl  <class IOAudioToggleControl, id 0x100000307, !registered, !matched, active, busy 0 (0 ms), retain 12>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000342, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000039f, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003b7, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioToggleControl  <class IOAudioToggleControl, id 0x100000308, !registered, !matched, active, busy 0 (0 ms), retain 12>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000343, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003a0, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003b8, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o AudioAUUCDriver  <class AudioAUUCDriver, id 0x10000030a, registered, matched, active, busy 0 (4 ms), retain 4>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000336, !registered, !matched, active, busy 0, retain 7>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000347, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000368, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x10000036c, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000397, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x10000039b, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x1000003a7, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x1000003ab, !registered, !matched, active, busy 0, retain 6>
+    | |   |             +-o AppleHDAEngineInput at 1B,0,1,0  <class AppleHDAEngineInput, id 0x100000309, registered, matched, active, busy 0 (6 ms), retain 24>
+    | |   |             | +-o AppleHDAStream  <class AppleHDAStream, id 0x10000030b, registered, matched, active, busy 0 (5 ms), retain 7>
+    | |   |             | +-o IOAudioSelectorControl  <class IOAudioSelectorControl, id 0x10000030c, !registered, !matched, active, busy 0 (0 ms), retain 10>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000033b, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003ac, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioLevelControl  <class IOAudioLevelControl, id 0x10000030d, !registered, !matched, active, busy 0 (0 ms), retain 10>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000033c, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003ad, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioLevelControl  <class IOAudioLevelControl, id 0x10000030e, !registered, !matched, active, busy 0 (0 ms), retain 10>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000033d, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003ae, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioToggleControl  <class IOAudioToggleControl, id 0x10000030f, !registered, !matched, active, busy 0 (0 ms), retain 18>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000033e, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000345, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000036a, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000399, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003a9, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003af, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000335, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000346, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000367, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x10000036b, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000396, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x10000039a, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x1000003a6, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x1000003aa, !registered, !matched, active, busy 0, retain 6>
+    | |   |             +-o AppleHDAEngineInput at 1B,0,1,1  <class AppleHDAEngineInput, id 0x100000310, registered, matched, active, busy 0 (6 ms), retain 24>
+    | |   |               +-o AppleHDAStream  <class AppleHDAStream, id 0x100000311, registered, matched, active, busy 0 (5 ms), retain 7>
+    | |   |               +-o IOAudioSelectorControl  <class IOAudioSelectorControl, id 0x100000313, !registered, !matched, active, busy 0 (0 ms), retain 10>
+    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000337, !registered, !matched, active, busy 0, retain 6>
+    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003b0, !registered, !matched, active, busy 0, retain 6>
+    | |   |               +-o IOAudioLevelControl  <class IOAudioLevelControl, id 0x100000314, !registered, !matched, active, busy 0 (0 ms), retain 10>
+    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000338, !registered, !matched, active, busy 0, retain 6>
+    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003b1, !registered, !matched, active, busy 0, retain 6>
+    | |   |               +-o IOAudioLevelControl  <class IOAudioLevelControl, id 0x100000315, !registered, !matched, active, busy 0 (0 ms), retain 10>
+    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000339, !registered, !matched, active, busy 0, retain 6>
+    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003b2, !registered, !matched, active, busy 0, retain 6>
+    | |   |               +-o IOAudioToggleControl  <class IOAudioToggleControl, id 0x100000316, !registered, !matched, active, busy 0 (0 ms), retain 10>
+    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000033a, !registered, !matched, active, busy 0, retain 6>
+    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003b3, !registered, !matched, active, busy 0, retain 6>
+    | |   |               +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000334, !registered, !matched, active, busy 0, retain 6>
+    | |   |               +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000344, !registered, !matched, active, busy 0, retain 6>
+    | |   |               +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000366, !registered, !matched, active, busy 0, retain 6>
+    | |   |               +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000369, !registered, !matched, active, busy 0, retain 6>
+    | |   |               +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000395, !registered, !matched, active, busy 0, retain 6>
+    | |   |               +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000398, !registered, !matched, active, busy 0, retain 6>
+    | |   |               +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x1000003a5, !registered, !matched, active, busy 0, retain 6>
+    | |   |               +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x1000003a8, !registered, !matched, active, busy 0, retain 6>
+    | |   +-o RP01 at 1C  <class IOPCIDevice, id 0x100000179, registered, matched, active, busy 0 (6297 ms), retain 11>
+    | |   | +-o IOPCI2PCIBridge  <class IOPCI2PCIBridge, id 0x1000001c2, registered, matched, active, busy 0 (6262 ms), retain 7>
+    | |   |   +-o PXS1 at 0  <class IOPCIDevice, id 0x10000017a, registered, matched, active, busy 0 (6262 ms), retain 10>
+    | |   |     +-o yukon2osx  <class yukon2osx, id 0x1000001c6, !registered, !matched, active, busy 0 (2 ms), retain 7>
+    | |   |       +-o yukon  <class yukon, id 0x100000260, !registered, !matched, active, busy 0 (2 ms), retain 8>
+    | |   |         +-o IOEthernetInterface  <class IOEthernetInterface, id 0x100000261, registered, matched, active, busy 0 (2 ms), retain 11>
+    | |   |           +-o IONetworkStack  <class IONetworkStack, id 0x1000001de, registered, matched, active, busy 0 (2 ms), retain 11>
+    | |   |             +-o IONetworkStackUserClient  <class IONetworkStackUserClient, id 0x100000266, !registered, !matched, active, busy 0, retain 5>
+    | |   +-o RP02 at 1C,1  <class IOPCIDevice, id 0x10000017b, registered, matched, active, busy 0 (509 ms), retain 11>
+    | |   | +-o IOPCI2PCIBridge  <class IOPCI2PCIBridge, id 0x1000001e3, registered, matched, active, busy 0 (299 ms), retain 7>
+    | |   |   +-o PXS2 at 0  <class IOPCIDevice, id 0x10000017c, registered, matched, active, busy 0 (288 ms), retain 12>
+    | |   |     +-o AirPort_AthrFusion21  <class AirPort_AthrFusion21, id 0x10000027d, registered, matched, active, busy 0 (100 ms), retain 8>
+    | |   |       +-o AtherosFusion21Interface  <class AtherosFusion21Interface, id 0x1000002ab, registered, matched, active, busy 0 (99 ms), retain 10>
+    | |   |         +-o IONetworkStack  <class IONetworkStack, id 0x1000001de, registered, matched, active, busy 0 (2 ms), retain 11>
+    | |   |           +-o IONetworkStackUserClient  <class IONetworkStackUserClient, id 0x100000266, !registered, !matched, active, busy 0, retain 5>
+    | |   +-o USB1 at 1D  <class IOPCIDevice, id 0x10000017d, registered, matched, active, busy 0 (967 ms), retain 11>
+    | |   | +-o AppleUSBUHCI  <class AppleUSBUHCI, id 0x1000001e1, registered, matched, active, busy 0 (634 ms), retain 9>
+    | |   |   +-o UHCI Root Hub Simulation at 1D  <class IOUSBRootHubDevice, id 0x1000001fe, registered, matched, active, busy 0 (8 ms), retain 10>
+    | |   |   | | {
+    | |   |   | |   "sessionID" = 555462596
+    | |   |   | |   "iManufacturer" = 2
+    | |   |   | |   "bNumConfigurations" = 1
+    | |   |   | |   "idProduct" = 32773
+    | |   |   | |   "bcdDevice" = 272
+    | |   |   | |   "Bus Power Available" = 250
+    | |   |   | |   "bMaxPacketSize0" = 8
+    | |   |   | |   "USB Product Name" = "UHCI Root Hub Simulation"
+    | |   |   | |   "iProduct" = 1
+    | |   |   | |   "iSerialNumber" = 0
+    | |   |   | |   "USB Address" = 1
+    | |   |   | |   "bDeviceClass" = 9
+    | |   |   | |   "locationID" = 486539264
+    | |   |   | |   "bDeviceSubClass" = 0
+    | |   |   | |   "IOUserClientClass" = "IOUSBDeviceUserClientV2"
+    | |   |   | |   "Ports" = 2
+    | |   |   | |   "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
+    | |   |   | |   "bDeviceProtocol" = 0
+    | |   |   | |   "USB Vendor Name" = "Apple Inc."
+    | |   |   | |   "Device Speed" = 1
+    | |   |   | |   "idVendor" = 1452
+    | |   |   | |   "AAPL,current-in-sleep" = 1000
+    | |   |   | |   "Requested Power" = 0
+    | |   |   | |   "AAPL,port-current-in-sleep" = 500
+    | |   |   | |   "Low Power Displayed" = No
+    | |   |   | | }
+    | |   |   | | 
+    | |   |   | +-o AppleUSBHub  <class AppleUSBHub, id 0x100000200, !registered, !matched, active, busy 0, retain 8>
+    | |   |   | +-o IOUSBInterface at 0  <class IOUSBInterface, id 0x100000202, !registered, !matched, active, busy 0, retain 7>
+    | |   |   +-o Apple Internal Keyboard / Trackpad at 1d200000  <class IOUSBDevice, id 0x100000227, registered, matched, active, busy 0 (625 ms), retain 12>
+    | |   |     | {
+    | |   |     |   "sessionID" = 922879256
+    | |   |     |   "iManufacturer" = 1
+    | |   |     |   "bNumConfigurations" = 1
+    | |   |     |   "idProduct" = 539
+    | |   |     |   "bcdDevice" = 24
+    | |   |     |   "Bus Power Available" = 250
+    | |   |     |   "bMaxPacketSize0" = 8
+    | |   |     |   "USB Product Name" = "Apple Internal Keyboard / Trackpad"
+    | |   |     |   "iProduct" = 2
+    | |   |     |   "iSerialNumber" = 0
+    | |   |     |   "USB Address" = 2
+    | |   |     |   "bDeviceClass" = 0
+    | |   |     |   "locationID" = 488636416
+    | |   |     |   "bDeviceSubClass" = 0
+    | |   |     |   "IOUserClientClass" = "IOUSBDeviceUserClientV2"
+    | |   |     |   "PortNum" = 2
+    | |   |     |   "non-removable" = "yes"
+    | |   |     |   "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
+    | |   |     |   "bDeviceProtocol" = 0
+    | |   |     |   "Need contiguous memory for isoch" = Yes
+    | |   |     |   "USB Vendor Name" = "Apple Computer"
+    | |   |     |   "Device Speed" = 1
+    | |   |     |   "idVendor" = 1452
+    | |   |     |   "Requested Power" = 20
+    | |   |     |   "IOGeneralInterest" = "IOCommand is not serializable"
+    | |   |     |   "Low Power Displayed" = No
+    | |   |     | }
+    | |   |     | 
+    | |   |     +-o IOUSBCompositeDriver  <class IOUSBCompositeDriver, id 0x100000229, !registered, !matched, active, busy 0, retain 4>
+    | |   |     +-o Apple Internal Keyboard at 0  <class IOUSBInterface, id 0x10000022b, registered, matched, active, busy 0 (520 ms), retain 8>
+    | |   |     | +-o AppleUSBTCKeyboard  <class AppleUSBTCKeyboard, id 0x100000232, registered, matched, active, busy 0 (101 ms), retain 8>
+    | |   |     |   +-o IOHIDInterface  <class IOHIDInterface, id 0x100000238, registered, matched, active, busy 0 (6 ms), retain 6>
+    | |   |     |     +-o AppleUSBTCKeyEventDriver  <class AppleUSBTCKeyEventDriver, id 0x100000239, registered, matched, active, busy 0 (1 ms), retain 8>
+    | |   |     |       +-o IOHIDKeyboard  <class IOHIDKeyboard, id 0x10000023b, registered, matched, active, busy 0 (0 ms), retain 8>
+    | |   |     |       | +-o IOHIDSystem  <class IOHIDSystem, id 0x1000001df, registered, matched, active, busy 0 (3 ms), retain 16>
+    | |   |     |       |   +-o IOHIDUserClient  <class IOHIDUserClient, id 0x10000031a, !registered, !matched, active, busy 0, retain 5>
+    | |   |     |       |   +-o IOHIDParamUserClient  <class IOHIDParamUserClient, id 0x10000031b, !registered, !matched, active, busy 0, retain 5>
+    | |   |     |       |   +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000032a, !registered, !matched, active, busy 0, retain 5>
+    | |   |     |       |   +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000032b, !registered, !matched, active, busy 0, retain 5>
+    | |   |     |       +-o IOHIDSystem  <class IOHIDSystem, id 0x1000001df, registered, matched, active, busy 0 (3 ms), retain 15>
+    | |   |     |         +-o IOHIDUserClient  <class IOHIDUserClient, id 0x10000031a, !registered, !matched, active, busy 0, retain 5>
+    | |   |     |         +-o IOHIDParamUserClient  <class IOHIDParamUserClient, id 0x10000031b, !registered, !matched, active, busy 0, retain 5>
+    | |   |     |         +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000032a, !registered, !matched, active, busy 0, retain 5>
+    | |   |     |         +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000032b, !registered, !matched, active, busy 0, retain 5>
+    | |   |     +-o Touchpad at 1  <class IOUSBInterface, id 0x10000022c, registered, matched, active, busy 0 (382 ms), retain 7>
+    | |   |     | +-o AppleUSBGrIIITrackpad  <class AppleUSBGrIIITrackpad, id 0x10000023d, registered, matched, active, busy 0 (117 ms), retain 16>
+    | |   |     |   +-o RawDataReporter  <class RawDataReporter, id 0x10000023e, registered, matched, active, busy 0 (105 ms), retain 6>
+    | |   |     |   | +-o IOHIDInterface  <class IOHIDInterface, id 0x10000023f, registered, matched, active, busy 0 (3 ms), retain 5>
+    | |   |     |   +-o IOHIDPointingDevice  <class IOHIDPointingDevice, id 0x100000241, registered, matched, active, busy 0 (107 ms), retain 6>
+    | |   |     |   | +-o IOHIDInterface  <class IOHIDInterface, id 0x100000242, registered, matched, active, busy 0 (3 ms), retain 5>
+    | |   |     |   +-o IOHIDSystem  <class IOHIDSystem, id 0x1000001df, registered, matched, active, busy 0 (3 ms), retain 15>
+    | |   |     |   | +-o IOHIDUserClient  <class IOHIDUserClient, id 0x10000031a, !registered, !matched, active, busy 0, retain 5>
+    | |   |     |   | +-o IOHIDParamUserClient  <class IOHIDParamUserClient, id 0x10000031b, !registered, !matched, active, busy 0, retain 5>
+    | |   |     |   | +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000032a, !registered, !matched, active, busy 0, retain 5>
+    | |   |     |   | +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000032b, !registered, !matched, active, busy 0, retain 5>
+    | |   |     |   +-o BaselineReporter  <class BaselineReporter, id 0x100000244, registered, matched, active, busy 0 (108 ms), retain 6>
+    | |   |     |     +-o IOHIDInterface  <class IOHIDInterface, id 0x100000245, registered, matched, active, busy 0 (3 ms), retain 5>
+    | |   |     +-o Apple Internal Keyboard at 2  <class IOUSBInterface, id 0x10000022d, registered, matched, active, busy 0 (202 ms), retain 8>
+    | |   |       +-o AppleUSBTCKeyboard  <class AppleUSBTCKeyboard, id 0x100000247, registered, matched, active, busy 0 (110 ms), retain 8>
+    | |   |         +-o IOHIDInterface  <class IOHIDInterface, id 0x100000248, registered, matched, active, busy 0 (103 ms), retain 6>
+    | |   |           +-o IOHIDEventDriver  <class IOHIDEventDriver, id 0x1000002a1, registered, matched, active, busy 0 (3 ms), retain 8>
+    | |   |             +-o IOHIDConsumer  <class IOHIDConsumer, id 0x1000002a2, registered, matched, active, busy 0 (1 ms), retain 8>
+    | |   |             | +-o IOHIDSystem  <class IOHIDSystem, id 0x1000001df, registered, matched, active, busy 0 (3 ms), retain 16>
+    | |   |             |   +-o IOHIDUserClient  <class IOHIDUserClient, id 0x10000031a, !registered, !matched, active, busy 0, retain 5>
+    | |   |             |   +-o IOHIDParamUserClient  <class IOHIDParamUserClient, id 0x10000031b, !registered, !matched, active, busy 0, retain 5>
+    | |   |             |   +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000032a, !registered, !matched, active, busy 0, retain 5>
+    | |   |             |   +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000032b, !registered, !matched, active, busy 0, retain 5>
+    | |   |             +-o IOHIDSystem  <class IOHIDSystem, id 0x1000001df, registered, matched, active, busy 0 (3 ms), retain 15>
+    | |   |               +-o IOHIDUserClient  <class IOHIDUserClient, id 0x10000031a, !registered, !matched, active, busy 0, retain 5>
+    | |   |               +-o IOHIDParamUserClient  <class IOHIDParamUserClient, id 0x10000031b, !registered, !matched, active, busy 0, retain 5>
+    | |   |               +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000032a, !registered, !matched, active, busy 0, retain 5>
+    | |   |               +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000032b, !registered, !matched, active, busy 0, retain 5>
+    | |   +-o USB2 at 1D,1  <class IOPCIDevice, id 0x100000181, registered, matched, active, busy 0 (352 ms), retain 11>
+    | |   | +-o AppleUSBUHCI  <class AppleUSBUHCI, id 0x1000001f3, registered, matched, active, busy 0 (13 ms), retain 8>
+    | |   |   +-o UHCI Root Hub Simulation at 1D,1  <class IOUSBRootHubDevice, id 0x100000206, registered, matched, active, busy 0 (10 ms), retain 8>
+    | |   |     | {
+    | |   |     |   "sessionID" = 564210044
+    | |   |     |   "iManufacturer" = 2
+    | |   |     |   "bNumConfigurations" = 1
+    | |   |     |   "idProduct" = 32773
+    | |   |     |   "bcdDevice" = 272
+    | |   |     |   "Bus Power Available" = 250
+    | |   |     |   "bMaxPacketSize0" = 8
+    | |   |     |   "USB Product Name" = "UHCI Root Hub Simulation"
+    | |   |     |   "iProduct" = 1
+    | |   |     |   "iSerialNumber" = 0
+    | |   |     |   "USB Address" = 1
+    | |   |     |   "bDeviceClass" = 9
+    | |   |     |   "locationID" = 1023410176
+    | |   |     |   "bDeviceSubClass" = 0
+    | |   |     |   "IOUserClientClass" = "IOUSBDeviceUserClientV2"
+    | |   |     |   "Ports" = 2
+    | |   |     |   "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
+    | |   |     |   "bDeviceProtocol" = 0
+    | |   |     |   "USB Vendor Name" = "Apple Inc."
+    | |   |     |   "Device Speed" = 1
+    | |   |     |   "idVendor" = 1452
+    | |   |     |   "AAPL,current-in-sleep" = 1000
+    | |   |     |   "Requested Power" = 0
+    | |   |     |   "AAPL,port-current-in-sleep" = 500
+    | |   |     |   "Low Power Displayed" = No
+    | |   |     | }
+    | |   |     | 
+    | |   |     +-o AppleUSBHub  <class AppleUSBHub, id 0x10000020b, !registered, !matched, active, busy 0, retain 6>
+    | |   |     +-o IOUSBInterface at 0  <class IOUSBInterface, id 0x10000020d, !registered, !matched, active, busy 0, retain 7>
+    | |   +-o USB3 at 1D,2  <class IOPCIDevice, id 0x100000185, registered, matched, active, busy 0 (647 ms), retain 11>
+    | |   | +-o AppleUSBUHCI  <class AppleUSBUHCI, id 0x1000001c8, registered, matched, active, busy 0 (297 ms), retain 9>
+    | |   |   +-o UHCI Root Hub Simulation at 1D,2  <class IOUSBRootHubDevice, id 0x100000209, registered, matched, active, busy 0 (20 ms), retain 10>
+    | |   |   | | {
+    | |   |   | |   "sessionID" = 572462640
+    | |   |   | |   "iManufacturer" = 2
+    | |   |   | |   "bNumConfigurations" = 1
+    | |   |   | |   "idProduct" = 32773
+    | |   |   | |   "bcdDevice" = 272
+    | |   |   | |   "Bus Power Available" = 250
+    | |   |   | |   "bMaxPacketSize0" = 8
+    | |   |   | |   "USB Product Name" = "UHCI Root Hub Simulation"
+    | |   |   | |   "iProduct" = 1
+    | |   |   | |   "iSerialNumber" = 0
+    | |   |   | |   "USB Address" = 1
+    | |   |   | |   "bDeviceClass" = 9
+    | |   |   | |   "locationID" = 1560281088
+    | |   |   | |   "bDeviceSubClass" = 0
+    | |   |   | |   "IOUserClientClass" = "IOUSBDeviceUserClientV2"
+    | |   |   | |   "Ports" = 2
+    | |   |   | |   "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
+    | |   |   | |   "bDeviceProtocol" = 0
+    | |   |   | |   "USB Vendor Name" = "Apple Inc."
+    | |   |   | |   "Device Speed" = 1
+    | |   |   | |   "idVendor" = 1452
+    | |   |   | |   "AAPL,current-in-sleep" = 1000
+    | |   |   | |   "Requested Power" = 0
+    | |   |   | |   "AAPL,port-current-in-sleep" = 500
+    | |   |   | |   "Low Power Displayed" = No
+    | |   |   | | }
+    | |   |   | | 
+    | |   |   | +-o AppleUSBHub  <class AppleUSBHub, id 0x100000218, !registered, !matched, active, busy 0, retain 8>
+    | |   |   | +-o IOUSBInterface at 0  <class IOUSBInterface, id 0x10000021a, !registered, !matched, active, busy 0, retain 7>
+    | |   |   +-o IR Receiver at 5d200000  <class IOUSBDevice, id 0x10000022a, registered, matched, active, busy 0 (276 ms), retain 9>
+    | |   |     | {
+    | |   |     |   "sessionID" = 944991920
+    | |   |     |   "iManufacturer" = 1
+    | |   |     |   "bNumConfigurations" = 1
+    | |   |     |   "idProduct" = 33344
+    | |   |     |   "bcdDevice" = 272
+    | |   |     |   "Bus Power Available" = 250
+    | |   |     |   "bMaxPacketSize0" = 8
+    | |   |     |   "USB Product Name" = "IR Receiver"
+    | |   |     |   "iProduct" = 2
+    | |   |     |   "iSerialNumber" = 0
+    | |   |     |   "USB Address" = 2
+    | |   |     |   "bDeviceClass" = 0
+    | |   |     |   "locationID" = 1562378240
+    | |   |     |   "bDeviceSubClass" = 0
+    | |   |     |   "IOUserClientClass" = "IOUSBDeviceUserClientV2"
+    | |   |     |   "PortNum" = 2
+    | |   |     |   "non-removable" = "yes"
+    | |   |     |   "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
+    | |   |     |   "bDeviceProtocol" = 0
+    | |   |     |   "Need contiguous memory for isoch" = Yes
+    | |   |     |   "USB Vendor Name" = "Apple Computer, Inc."
+    | |   |     |   "Device Speed" = 1
+    | |   |     |   "idVendor" = 1452
+    | |   |     |   "Requested Power" = 50
+    | |   |     |   "IOGeneralInterest" = "IOCommand is not serializable"
+    | |   |     |   "Low Power Displayed" = No
+    | |   |     | }
+    | |   |     | 
+    | |   |     +-o IOUSBCompositeDriver  <class IOUSBCompositeDriver, id 0x10000022f, !registered, !matched, active, busy 0, retain 4>
+    | |   |     +-o IOUSBInterface at 0  <class IOUSBInterface, id 0x100000230, registered, matched, active, busy 0 (261 ms), retain 8>
+    | |   |       +-o AppleIRController  <class AppleIRController, id 0x100000235, registered, matched, active, busy 0 (112 ms), retain 8>
+    | |   |         +-o IOHIDInterface  <class IOHIDInterface, id 0x100000236, registered, matched, active, busy 0 (3 ms), retain 5>
+    | |   |         +-o IOHIDLibUserClient  <class IOHIDLibUserClient, id 0x10000035d, !registered, !matched, active, busy 0, retain 6>
+    | |   +-o USB4 at 1D,3  <class IOPCIDevice, id 0x100000189, registered, matched, active, busy 0 (2390 ms), retain 11>
+    | |   | +-o AppleUSBUHCI  <class AppleUSBUHCI, id 0x1000001c9, registered, matched, active, busy 0 (2038 ms), retain 9>
+    | |   |   +-o UHCI Root Hub Simulation at 1D,3  <class IOUSBRootHubDevice, id 0x10000020e, registered, matched, active, busy 0 (8 ms), retain 10>
+    | |   |   | | {
+    | |   |   | |   "sessionID" = 575818003
+    | |   |   | |   "iManufacturer" = 2
+    | |   |   | |   "bNumConfigurations" = 1
+    | |   |   | |   "idProduct" = 32773
+    | |   |   | |   "bcdDevice" = 272
+    | |   |   | |   "Bus Power Available" = 250
+    | |   |   | |   "bMaxPacketSize0" = 8
+    | |   |   | |   "USB Product Name" = "UHCI Root Hub Simulation"
+    | |   |   | |   "iProduct" = 1
+    | |   |   | |   "iSerialNumber" = 0
+    | |   |   | |   "USB Address" = 1
+    | |   |   | |   "bDeviceClass" = 9
+    | |   |   | |   "locationID" = 2097152000
+    | |   |   | |   "bDeviceSubClass" = 0
+    | |   |   | |   "IOUserClientClass" = "IOUSBDeviceUserClientV2"
+    | |   |   | |   "Ports" = 2
+    | |   |   | |   "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
+    | |   |   | |   "bDeviceProtocol" = 0
+    | |   |   | |   "USB Vendor Name" = "Apple Inc."
+    | |   |   | |   "Device Speed" = 1
+    | |   |   | |   "idVendor" = 1452
+    | |   |   | |   "AAPL,current-in-sleep" = 1000
+    | |   |   | |   "Requested Power" = 0
+    | |   |   | |   "AAPL,port-current-in-sleep" = 500
+    | |   |   | |   "Low Power Displayed" = No
+    | |   |   | | }
+    | |   |   | | 
+    | |   |   | +-o AppleUSBHub  <class AppleUSBHub, id 0x100000212, !registered, !matched, active, busy 0, retain 8>
+    | |   |   | +-o IOUSBInterface at 0  <class IOUSBInterface, id 0x100000215, !registered, !matched, active, busy 0, retain 7>
+    | |   |   +-o WirelessControllerDevice at 7d100000  <class IOUSBDevice, id 0x100000256, registered, matched, active, busy 0 (250 ms), retain 10>
+    | |   |     | {
+    | |   |     |   "sessionID" = 3290864968
+    | |   |     |   "iManufacturer" = 0
+    | |   |     |   "idProduct" = 33285
+    | |   |     |   "bDeviceClass" = 224
+    | |   |     |   "bcdDevice" = 6501
+    | |   |     |   "Bus Power Available" = 250
+    | |   |     |   "bMaxPacketSize0" = 64
+    | |   |     |   "iProduct" = 0
+    | |   |     |   "iSerialNumber" = 0
+    | |   |     |   "USB Address" = 2
+    | |   |     |   "bNumConfigurations" = 1
+    | |   |     |   "IOUserClientClass" = "IOUSBDeviceUserClientV2"
+    | |   |     |   "locationID" = 2098200576
+    | |   |     |   "bDeviceSubClass" = 1
+    | |   |     |   "USB Product Name" = "Bluetooth USB Host Controller"
+    | |   |     |   "non-removable" = "yes"
+    | |   |     |   "PortNum" = 1
+    | |   |     |   "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
+    | |   |     |   "bDeviceProtocol" = 1
+    | |   |     |   "Need contiguous memory for isoch" = Yes
+    | |   |     |   "Device Speed" = 1
+    | |   |     |   "USB Vendor Name" = "Apple Inc."
+    | |   |     |   "idVendor" = 1452
+    | |   |     |   "Requested Power" = 0
+    | |   |     |   "IOGeneralInterest" = "IOCommand is not serializable"
+    | |   |     |   "Low Power Displayed" = No
+    | |   |     | }
+    | |   |     | 
+    | |   |     +-o CSRUSBBluetoothHCIController  <class CSRUSBBluetoothHCIController, id 0x100000258, registered, matched, active, busy 0 (0 ms), retain 10>
+    | |   |     | +-o IOBluetoothHCIUserClient  <class IOBluetoothHCIUserClient, id 0x100000270, !registered, !matched, active, busy 0, retain 5>
+    | |   |     | +-o IOBluetoothHCIUserClient  <class IOBluetoothHCIUserClient, id 0x1000003ba, !registered, !matched, active, busy 0, retain 5>
+    | |   |     +-o IOUSBInterface at 0  <class IOUSBInterface, id 0x10000025a, !registered, !matched, active, busy 0, retain 6>
+    | |   |     +-o IOUSBInterface at 1  <class IOUSBInterface, id 0x10000025b, !registered, !matched, active, busy 0, retain 6>
+    | |   |     +-o IOUSBInterface at 2  <class IOUSBInterface, id 0x10000025c, !registered, !matched, active, busy 0, retain 6>
+    | |   +-o USB7 at 1D,7  <class IOPCIDevice, id 0x10000018d, registered, matched, active, busy 0 (2564 ms), retain 13>
+    | |   | +-o IOService  <class IOService, id 0x1000001ca, !registered, !matched, active, busy 0, retain 4>
+    | |   | +-o AppleUSBEHCI  <class AppleUSBEHCI, id 0x1000001cb, registered, matched, active, busy 0 (2383 ms), retain 14>
+    | |   |   +-o EHCI Root Hub Simulation at 1D,7  <class IOUSBRootHubDevice, id 0x1000001d7, registered, matched, active, busy 0 (32 ms), retain 12>
+    | |   |   | | {
+    | |   |   | |   "sessionID" = 410970048
+    | |   |   | |   "iManufacturer" = 2
+    | |   |   | |   "bNumConfigurations" = 1
+    | |   |   | |   "idProduct" = 32774
+    | |   |   | |   "bcdDevice" = 512
+    | |   |   | |   "Bus Power Available" = 250
+    | |   |   | |   "bMaxPacketSize0" = 64
+    | |   |   | |   "USB Product Name" = "EHCI Root Hub Simulation"
+    | |   |   | |   "iProduct" = 1
+    | |   |   | |   "iSerialNumber" = 0
+    | |   |   | |   "USB Address" = 1
+    | |   |   | |   "bDeviceClass" = 9
+    | |   |   | |   "locationID" = 18446744073659219968
+    | |   |   | |   "bDeviceSubClass" = 0
+    | |   |   | |   "IOUserClientClass" = "IOUSBDeviceUserClientV2"
+    | |   |   | |   "Ports" = 8
+    | |   |   | |   "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
+    | |   |   | |   "bDeviceProtocol" = 1
+    | |   |   | |   "USB Vendor Name" = "Apple Inc."
+    | |   |   | |   "Device Speed" = 2
+    | |   |   | |   "idVendor" = 1452
+    | |   |   | |   "AAPL,current-in-sleep" = 4000
+    | |   |   | |   "Requested Power" = 0
+    | |   |   | |   "AAPL,port-current-in-sleep" = 500
+    | |   |   | |   "Low Power Displayed" = No
+    | |   |   | | }
+    | |   |   | | 
+    | |   |   | +-o AppleUSBHub  <class AppleUSBHub, id 0x1000001e8, registered, matched, active, busy 0 (0 ms), retain 9>
+    | |   |   | +-o IOUSBInterface at 0  <class IOUSBInterface, id 0x1000001ea, !registered, !matched, active, busy 0, retain 7>
+    | |   |   +-o Built-in iSight at fd400000  <class IOUSBDevice, id 0x10000024e, registered, matched, active, busy 0 (50 ms), retain 9>
+    | |   |   | | {
+    | |   |   | |   "sessionID" = 2717373407
+    | |   |   | |   "iManufacturer" = 1
+    | |   |   | |   "bNumConfigurations" = 1
+    | |   |   | |   "idProduct" = 34049
+    | |   |   | |   "bcdDevice" = 393
+    | |   |   | |   "Bus Power Available" = 250
+    | |   |   | |   "bMaxPacketSize0" = 64
+    | |   |   | |   "USB Product Name" = "Built-in iSight"
+    | |   |   | |   "iProduct" = 2
+    | |   |   | |   "iSerialNumber" = 0
+    | |   |   | |   "USB Address" = 2
+    | |   |   | |   "bDeviceClass" = 255
+    | |   |   | |   "locationID" = 18446744073663414272
+    | |   |   | |   "bDeviceSubClass" = 255
+    | |   |   | |   "IOUserClientClass" = "IOUSBDeviceUserClientV2"
+    | |   |   | |   "PortNum" = 4
+    | |   |   | |   "non-removable" = "yes"
+    | |   |   | |   "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
+    | |   |   | |   "bDeviceProtocol" = 255
+    | |   |   | |   "USB Vendor Name" = "Micron"
+    | |   |   | |   "Device Speed" = 2
+    | |   |   | |   "idVendor" = 1452
+    | |   |   | |   "Requested Power" = 50
+    | |   |   | |   "IOGeneralInterest" = "IOCommand is not serializable"
+    | |   |   | |   "kSuspendPort" = Yes
+    | |   |   | |   "Low Power Displayed" = No
+    | |   |   | | }
+    | |   |   | | 
+    | |   |   | +-o IOUSBCompositeDriver  <class IOUSBCompositeDriver, id 0x100000250, !registered, !matched, active, busy 0, retain 4>
+    | |   |   | +-o IOUSBInterface at 0  <class IOUSBInterface, id 0x100000252, registered, matched, active, busy 0 (15 ms), retain 6>
+    | |   |   | +-o IOUSBInterface at 1  <class IOUSBInterface, id 0x100000253, registered, matched, active, busy 0 (15 ms), retain 6>
+    | |   |   +-o Flash Disk at fd300000  <class IOUSBDevice, id 0x100000408, registered, matched, active, busy 0 (499 ms), retain 8>
+    | |   |     | {
+    | |   |     |   "sessionID" = 3995793432240
+    | |   |     |   "iManufacturer" = 1
+    | |   |     |   "bNumConfigurations" = 1
+    | |   |     |   "idProduct" = 24613
+    | |   |     |   "bcdDevice" = 256
+    | |   |     |   "Bus Power Available" = 250
+    | |   |     |   "bMaxPacketSize0" = 64
+    | |   |     |   "USB Product Name" = "Flash Disk"
+    | |   |     |   "iProduct" = 2
+    | |   |     |   "iSerialNumber" = 3
+    | |   |     |   "USB Address" = 3
+    | |   |     |   "bDeviceClass" = 0
+    | |   |     |   "bDeviceSubClass" = 0
+    | |   |     |   "locationID" = 18446744073662365696
+    | |   |     |   "IOUserClientClass" = "IOUSBDeviceUserClientV2"
+    | |   |     |   "kHasMSCInterface" = Yes
+    | |   |     |   "PortNum" = 3
+    | |   |     |   "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
+    | |   |     |   "bDeviceProtocol" = 0
+    | |   |     |   "uid" = "USB:197660250078C5C90000"
+    | |   |     |   "USB Vendor Name" = "CBM"
+    | |   |     |   "Device Speed" = 2
+    | |   |     |   "idVendor" = 6518
+    | |   |     |   "USB Serial Number" = "16270078C5C90000"
+    | |   |     |   "Requested Power" = 50
+    | |   |     |   "IOGeneralInterest" = "IOCommand is not serializable"
+    | |   |     |   "Low Power Displayed" = No
+    | |   |     | }
+    | |   |     | 
+    | |   |     +-o IOUSBCompositeDriver  <class IOUSBCompositeDriver, id 0x10000040a, !registered, !matched, active, busy 0, retain 4>
+    | |   |     +-o IOUSBInterface at 0  <class IOUSBInterface, id 0x10000040b, registered, matched, active, busy 0 (482 ms), retain 7>
+    | |   |       +-o IOUSBMassStorageClass  <class IOUSBMassStorageClass, id 0x10000040d, registered, matched, active, busy 0 (177 ms), retain 8>
+    | |   |         +-o IOSCSIPeripheralDeviceNub  <class IOSCSIPeripheralDeviceNub, id 0x10000040f, registered, matched, active, busy 0 (74 ms), retain 6>
+    | |   |           +-o IOSCSIPeripheralDeviceType00  <class IOSCSIPeripheralDeviceType00, id 0x100000410, !registered, !matched, active, busy 0 (20 ms), retain 7>
+    | |   |             +-o IOBlockStorageServices  <class IOBlockStorageServices, id 0x100000413, registered, matched, active, busy 0 (20 ms), retain 5>
+    | |   |               +-o IOBlockStorageDriver  <class IOBlockStorageDriver, id 0x100000414, registered, matched, active, busy 0 (18 ms), retain 7>
+    | |   |                 +-o CBM Flash Disk Media  <class IOMedia, id 0x100000415, registered, matched, active, busy 0 (16 ms), retain 10>
+    | |   |                   +-o IOMediaBSDClient  <class IOMediaBSDClient, id 0x100000416, registered, matched, active, busy 0 (2 ms), retain 5>
+    | |   |                   +-o IOFDiskPartitionScheme  <class IOFDiskPartitionScheme, id 0x100000419, !registered, !matched, active, busy 0 (10 ms), retain 6>
+    | |   |                     +-o Untitled 1 at 1  <class IOMedia, id 0x10000041b, registered, matched, active, busy 0 (10 ms), retain 9>
+    | |   |                       +-o IOMediaBSDClient  <class IOMediaBSDClient, id 0x10000041c, registered, matched, active, busy 0 (2 ms), retain 6>
+    | |   +-o PCIB at 1E  <class IOPCIDevice, id 0x100000197, registered, matched, active, busy 0 (712 ms), retain 11>
+    | |   | +-o IOPCI2PCIBridge  <class IOPCI2PCIBridge, id 0x1000001cd, registered, matched, active, busy 0 (542 ms), retain 7>
+    | |   |   +-o FRWR at 3  <class IOPCIDevice, id 0x100000198, registered, matched, active, busy 0 (494 ms), retain 10>
+    | |   |     +-o AppleFWOHCI  <class AppleFWOHCI, id 0x1000001d8, !registered, !matched, active, busy 0 (476 ms), retain 6>
+    | |   |       +-o IOFireWireController  <class IOFireWireController, id 0x1000001da, registered, matched, active, busy 0 (476 ms), retain 9>
+    | |   |         +-o IOFireWireLocalNode  <class IOFireWireLocalNode, id 0x100000214, registered, matched, active, busy 0 (476 ms), retain 12>
+    | |   |           +-o IOFireWireUserClientIniter  <class IOFireWireUserClientIniter, id 0x100000216, !registered, !matched, active, busy 0, retain 4>
+    | |   |           +-o IOFireWireUserClientIniter  <class IOFireWireUserClientIniter, id 0x1000002b0, !registered, !matched, active, busy 0, retain 4>
+    | |   |           +-o IOFireWireIP  <class IOFireWireIP, id 0x1000002b1, registered, matched, active, busy 0 (224 ms), retain 5>
+    | |   |             +-o IOFWInterface  <class IOFWInterface, id 0x1000002b9, registered, matched, active, busy 0 (224 ms), retain 10>
+    | |   |               +-o IONetworkStack  <class IONetworkStack, id 0x1000001de, registered, matched, active, busy 0 (2 ms), retain 11>
+    | |   |                 +-o IONetworkStackUserClient  <class IONetworkStackUserClient, id 0x100000266, !registered, !matched, active, busy 0, retain 5>
+    | |   +-o LPCB at 1F  <class IOPCIDevice, id 0x100000199, registered, matched, active, busy 0 (5615 ms), retain 28>
+    | |   | +-o AppleLPC  <class AppleLPC, id 0x100000275, registered, matched, active, busy 0 (3 ms), retain 5>
+    | |   +-o PATA at 1F,1  <class IOPCIDevice, id 0x10000019a, registered, matched, active, busy 0 (10462 ms), retain 13>
+    | |   | +-o AppleIntelPIIXATARoot  <class AppleIntelPIIXATARoot, id 0x1000001d1, !registered, !matched, active, busy 0 (10287 ms), retain 6>
+    | |   |   +-o PRID at 0  <class AppleIntelPIIXATAChannel, id 0x10000019b, registered, matched, active, busy 0 (10287 ms), retain 14>
+    | |   |   | +-o AppleIntelPIIXPATA  <class AppleIntelPIIXPATA, id 0x1000001e2, registered, matched, active, busy 0 (10231 ms), retain 7>
+    | |   |   |   +-o ATADeviceNub at 0  <class ATADeviceNub, id 0x1000001f5, registered, matched, active, busy 0 (10230 ms), retain 6>
+    | |   |   |     +-o IOATAPIProtocolTransport  <class IOATAPIProtocolTransport, id 0x1000001f8, registered, matched, active, busy 0 (10221 ms), retain 8>
+    | |   |   |       +-o IOSCSIPeripheralDeviceNub  <class IOSCSIPeripheralDeviceNub, id 0x1000001fb, registered, matched, active, busy 0 (10013 ms), retain 6>
+    | |   |   |         +-o IOSCSIPeripheralDeviceType05  <class IOSCSIPeripheralDeviceType05, id 0x100000222, !registered, !matched, active, busy 0 (3701 ms), retain 7>
+    | |   |   |           +-o IODVDServices  <class IODVDServices, id 0x100000263, registered, matched, active, busy 0 (3701 ms), retain 6>
+    | |   |   |             +-o IODVDBlockStorageDriver  <class IODVDBlockStorageDriver, id 0x100000264, registered, matched, active, busy 0 (3699 ms), retain 7>
+    | |   |   |             | +-o HL-DT-ST DVDRW GSA-S10N Media  <class IODVDMedia, id 0x100000269, registered, matched, active, busy 0 (3698 ms), retain 10>
+    | |   |   |             |   +-o IODVDMediaBSDClient  <class IODVDMediaBSDClient, id 0x10000026a, registered, matched, active, busy 0 (2 ms), retain 5>
+    | |   |   |             |   +-o IOApplePartitionScheme  <class IOApplePartitionScheme, id 0x1000002f4, !registered, !matched, active, busy 0 (14 ms), retain 8>
+    | |   |   |             |     +-o Apple at 1  <class IOMedia, id 0x1000002f5, registered, matched, active, busy 0 (11 ms), retain 8>
+    | |   |   |             |     | +-o IOMediaBSDClient  <class IOMediaBSDClient, id 0x1000002f8, registered, matched, active, busy 0 (5 ms), retain 5>
+    | |   |   |             |     +-o Macintosh at 2  <class IOMedia, id 0x1000002f6, registered, matched, active, busy 0 (12 ms), retain 8>
+    | |   |   |             |     | +-o IOMediaBSDClient  <class IOMediaBSDClient, id 0x1000002f9, registered, matched, active, busy 0 (5 ms), retain 5>
+    | |   |   |             |     +-o Mac_OS_X at 3  <class IOMedia, id 0x1000002f7, registered, matched, active, busy 0 (14 ms), retain 9>
+    | |   |   |             |       +-o IOMediaBSDClient  <class IOMediaBSDClient, id 0x1000002fa, registered, matched, active, busy 0 (5 ms), retain 6>
+    | |   |   |             +-o SCSITaskUserClientIniter  <class SCSITaskUserClientIniter, id 0x100000265, !registered, !matched, active, busy 0, retain 4>
+    | |   |   +-o CHN1 at 1  <class AppleIntelPIIXATAChannel, id 0x1000001d2, registered, matched, active, busy 0 (75 ms), retain 6>
+    | |   +-o SATA at 1F,2  <class IOPCIDevice, id 0x10000019e, registered, matched, active, busy 0 (387 ms), retain 13>
+    | |   | +-o AppleAHCI  <class AppleAHCI, id 0x1000001d3, registered, matched, active, busy 0 (208 ms), retain 7>
+    | |   |   +-o PRT2 at 2  <class AppleAHCIPort, id 0x1000001a0, registered, matched, active, busy 0 (170 ms), retain 10>
+    | |   |     +-o IOAHCIDevice at 0  <class IOAHCIDevice, id 0x1000001eb, registered, matched, active, busy 0 (170 ms), retain 11>
+    | |   |       +-o AppleAHCIDiskDriver  <class AppleAHCIDiskDriver, id 0x1000001ec, registered, matched, active, busy 0 (51 ms), retain 6>
+    | |   |         +-o IOAHCIBlockStorageDevice  <class IOAHCIBlockStorageDevice, id 0x100000203, registered, matched, active, busy 0 (51 ms), retain 6>
+    | |   |           +-o IOBlockStorageDriver  <class IOBlockStorageDriver, id 0x100000207, registered, matched, active, busy 0 (49 ms), retain 7>
+    | |   |             +-o FUJITSU MHY2120BH Media  <class IOMedia, id 0x100000208, registered, matched, active, busy 0 (49 ms), retain 10>
+    | |   |               +-o IOMediaBSDClient  <class IOMediaBSDClient, id 0x10000020f, registered, matched, active, busy 0 (0 ms), retain 5>
+    | |   |               +-o IOGUIDPartitionScheme  <class IOGUIDPartitionScheme, id 0x10000021b, !registered, !matched, active, busy 0 (13 ms), retain 7>
+    | |   |                 +-o EFI System Partition at 1  <class IOMedia, id 0x10000021e, registered, matched, active, busy 0 (3 ms), retain 8>
+    | |   |                 | +-o IOMediaBSDClient  <class IOMediaBSDClient, id 0x100000220, registered, matched, active, busy 0 (1 ms), retain 5>
+    | |   |                 +-o Untitled at 2  <class IOMedia, id 0x10000021f, registered, matched, active, busy 0 (13 ms), retain 10>
+    | |   |                   +-o IOMediaBSDClient  <class IOMediaBSDClient, id 0x100000221, registered, matched, active, busy 0 (1 ms), retain 6>
+    | |   +-o SBUS at 1F,3  <class IOPCIDevice, id 0x1000001a1, registered, matched, active, busy 0 (203 ms), retain 8>
+    | +-o PDRC  <class IOACPIPlatformDevice, id 0x100000130, registered, matched, active, busy 0 (9 ms), retain 6>
+    | +-o SMC  <class IOACPIPlatformDevice, id 0x10000015f, registered, matched, active, busy 0 (451 ms), retain 9>
+    | | +-o AppleSMC  <class AppleSMC, id 0x1000002ae, registered, matched, active, busy 0 (191 ms), retain 6>
+    | |   +-o SMCWatchDogTimer  <class SMCWatchDogTimer, id 0x1000002b3, registered, matched, active, busy 0 (129 ms), retain 5>
+    | +-o SMS0  <class IOACPIPlatformDevice, id 0x100000160, registered, matched, active, busy 0 (377 ms), retain 7>
+    | | +-o SMCMotionSensor  <class SMCMotionSensor, id 0x1000002dc, registered, matched, active, busy 0 (2 ms), retain 5>
+    | +-o EC  <class IOACPIPlatformDevice, id 0x100000161, registered, matched, active, busy 0 (245 ms), retain 10>
+    | | +-o AppleACPIEC  <class AppleACPIEC, id 0x100000124, !registered, !matched, active, busy 0, retain 6>
+    | +-o SMB0  <class IOACPIPlatformDevice, id 0x100000162, registered, matched, active, busy 0 (34 ms), retain 9>
+    | | +-o AppleECSMBusController  <class AppleECSMBusController, id 0x1000001ed, registered, matched, active, busy 0 (16 ms), retain 5>
+    | |   +-o AppleSmartBatteryManager  <class AppleSmartBatteryManager, id 0x1000001ee, registered, matched, active, busy 0 (3 ms), retain 6>
+    | |     +-o AppleSmartBattery  <class AppleSmartBattery, id 0x1000001f0, registered, matched, active, busy 0 (0 ms), retain 5>
+    | +-o SBS0  <class IOACPIPlatformDevice, id 0x100000163, registered, matched, active, busy 0 (19 ms), retain 6>
+    | +-o DMAC  <class IOACPIPlatformDevice, id 0x100000164, registered, matched, active, busy 0 (21 ms), retain 6>
+    | +-o FWHD  <class IOACPIPlatformDevice, id 0x100000165, registered, matched, active, busy 0 (22 ms), retain 6>
+    | +-o HPET  <class IOACPIPlatformDevice, id 0x100000166, registered, matched, active, busy 0 (24 ms), retain 7>
+    | | +-o AppleHPET  <class AppleHPET, id 0x1000001bc, !registered, !matched, active, busy 0, retain 4>
+    | +-o IPIC  <class IOACPIPlatformDevice, id 0x100000167, registered, matched, active, busy 0 (25 ms), retain 6>
+    | +-o MATH  <class IOACPIPlatformDevice, id 0x100000168, registered, matched, active, busy 0 (26 ms), retain 6>
+    | +-o LDRC  <class IOACPIPlatformDevice, id 0x100000169, registered, matched, active, busy 0 (27 ms), retain 6>
+    | +-o RTC  <class IOACPIPlatformDevice, id 0x10000016a, registered, matched, active, busy 0 (38 ms), retain 8>
+    | | +-o AppleRTC  <class AppleRTC, id 0x1000001bd, registered, matched, active, busy 0 (1 ms), retain 6>
+    | +-o TIMR  <class IOACPIPlatformDevice, id 0x10000016b, registered, matched, active, busy 0 (29 ms), retain 6>
+    | +-o AppleEFIRuntime  <class AppleEFIRuntime, id 0x1000001be, registered, matched, active, busy 0 (297 ms), retain 7>
+    | | +-o AppleEFINVRAM  <class AppleEFINVRAM, id 0x1000001bf, registered, matched, active, busy 0 (1 ms), retain 7>
+    | +-o IOPCIMessagedInterruptController  <class IOPCIMessagedInterruptController, id 0x1000001c1, registered, matched, active, busy 0 (2 ms), retain 6>
+    | +-o AppleRawIOAddressSpace  <class AppleRawIOAddressSpace, id 0x10000028a, registered, matched, active, busy 0 (2 ms), retain 4>
+    | +-o AppleRawPhysicalMemoryAddressSpace  <class AppleRawPhysicalMemoryAddressSpace, id 0x10000028b, registered, matched, active, busy 0 (4 ms), retain 4>
+    +-o IOResources  <class IOResources, id 0x100000113, registered, matched, active, busy 0 (824 ms), retain 24>
+      +-o AppleIntelCPUPowerManagement  <class AppleIntelCPUPowerManagement, id 0x10000011b, registered, matched, active, busy 0 (252 ms), retain 5>
+      | +-o AppleIntelCPUPowerManagementClient  <class AppleIntelCPUPowerManagementClient, id 0x100000120, !registered, !matched, active, busy 0, retain 4>
+      +-o IOHDIXController  <class IOHDIXController, id 0x10000011c, registered, matched, active, busy 0 (2 ms), retain 4>
+      +-o com_apple_AppleFSCompression_AppleFSCompressionTypeZlib  <class com_apple_AppleFSCompression_AppleFSCompressionTypeZlib, id 0x1000001dc, !registered, !matched, active, busy 0, retain 4>
+      +-o com_apple_BootCache  <class com_apple_BootCache, id 0x1000001dd, !registered, !matched, active, busy 0, retain 4>
+      +-o IONetworkStack  <class IONetworkStack, id 0x1000001de, registered, matched, active, busy 0 (2 ms), retain 11>
+      | +-o IONetworkStackUserClient  <class IONetworkStackUserClient, id 0x100000266, !registered, !matched, active, busy 0, retain 5>
+      +-o IOHIDSystem  <class IOHIDSystem, id 0x1000001df, registered, matched, active, busy 0 (3 ms), retain 15>
+      | +-o IOHIDUserClient  <class IOHIDUserClient, id 0x10000031a, !registered, !matched, active, busy 0, retain 5>
+      | +-o IOHIDParamUserClient  <class IOHIDParamUserClient, id 0x10000031b, !registered, !matched, active, busy 0, retain 5>
+      | +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000032a, !registered, !matched, active, busy 0, retain 5>
+      | +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000032b, !registered, !matched, active, busy 0, retain 5>
+      +-o AppleProfileOSHooks  <class AppleProfileOSHooks, id 0x100000281, registered, matched, active, busy 0 (187 ms), retain 15>
+      | +-o AppleProfileTimeTrigger  <class AppleProfileTimeTrigger, id 0x10000028f, registered, matched, active, busy 0 (168 ms), retain 6>
+      | +-o AppleProfilePMITrigger  <class AppleProfilePMITrigger, id 0x100000290, registered, matched, active, busy 0 (168 ms), retain 6>
+      | +-o AppleOSXPerformanceMonitor  <class AppleOSXPerformanceMonitor, id 0x100000291, !registered, !matched, active, busy 0 (173 ms), retain 6>
+      | | +-o AppleOSXPerformanceCounter  <class AppleOSXPerformanceCounter, id 0x10000029c, registered, matched, active, busy 0 (170 ms), retain 6>
+      | | | +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x100000292, registered, matched, active, busy 0 (175 ms), retain 18>
+      | | |   +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x1000002d4, !registered, !matched, active, busy 0, retain 5>
+      | | +-o AppleOSXPerformanceCounter  <class AppleOSXPerformanceCounter, id 0x10000029d, registered, matched, active, busy 0 (173 ms), retain 6>
+      | |   +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x100000292, registered, matched, active, busy 0 (175 ms), retain 18>
+      | |     +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x1000002d4, !registered, !matched, active, busy 0, retain 5>
+      | +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x100000292, registered, matched, active, busy 0 (175 ms), retain 17>
+      | | +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x1000002d4, !registered, !matched, active, busy 0, retain 5>
+      | +-o AppleProfileKEventTrigger  <class AppleProfileKEventTrigger, id 0x100000293, registered, matched, active, busy 0 (175 ms), retain 6>
+      | +-o AppleProfileManualTrigger  <class AppleProfileManualTrigger, id 0x100000294, registered, matched, active, busy 0 (2 ms), retain 6>
+      | +-o AppleProfileCallstackAction  <class AppleProfileCallstackAction, id 0x100000295, !registered, !matched, active, busy 0, retain 5>
+      | +-o AppleProfileKEventAction  <class AppleProfileKEventAction, id 0x100000296, !registered, !matched, active, busy 0, retain 5>
+      | +-o AppleProfileRegisterStateAction  <class AppleProfileRegisterStateAction, id 0x100000297, !registered, !matched, active, busy 0, retain 5>
+      | +-o AppleProfileThreadInfoAction  <class AppleProfileThreadInfoAction, id 0x100000298, !registered, !matched, active, busy 0, retain 5>
+      | +-o AppleProfileTimestampAction  <class AppleProfileTimestampAction, id 0x100000299, !registered, !matched, active, busy 0, retain 5>
+      +-o com_apple_driver_AudioIPCDevice  <class com_apple_driver_AudioIPCDevice, id 0x100000282, registered, matched, active, busy 0 (165 ms), retain 6>
+      | +-o com_apple_driver_AudioIPCEngine  <class com_apple_driver_AudioIPCEngine, id 0x10000028c, registered, matched, active, busy 0 (164 ms), retain 9>
+      |   +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000333, !registered, !matched, active, busy 0, retain 6>
+      |   +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000365, !registered, !matched, active, busy 0, retain 6>
+      |   +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000394, !registered, !matched, active, busy 0, retain 6>
+      |   +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x1000003a4, !registered, !matched, active, busy 0, retain 6>
+      +-o CHUDKernLib  <class CHUDKernLib, id 0x100000283, registered, matched, active, busy 0 (170 ms), retain 4>
+      +-o CHUDProf  <class CHUDProf, id 0x100000284, registered, matched, active, busy 0 (307 ms), retain 4>
+      +-o CHUDUtils  <class CHUDUtils, id 0x100000285, registered, matched, active, busy 0 (310 ms), retain 4>
+      +-o Dont_Steal_Mac_OS_X  <class Dont_Steal_Mac_OS_X, id 0x100000286, !registered, !matched, active, busy 0, retain 5>
+      +-o IOBluetoothSerialManager  <class IOBluetoothSerialManager, id 0x100000287, registered, matched, active, busy 0 (376 ms), retain 7>
+      | +-o IOBluetoothSerialClient  <class IOBluetoothSerialClient, id 0x1000002d3, !registered, !matched, active, busy 0 (133 ms), retain 5>
+      | | +-o IOBluetoothSerialClientSerialStreamSync  <class IOBluetoothSerialClientSerialStreamSync, id 0x1000002d5, registered, matched, active, busy 0 (133 ms), retain 5>
+      | |   +-o IOSerialBSDClient  <class IOSerialBSDClient, id 0x1000002df, registered, matched, active, busy 0 (6 ms), retain 4>
+      | +-o IOBluetoothSerialClient  <class IOBluetoothSerialClient, id 0x1000002de, !registered, !matched, active, busy 0 (76 ms), retain 5>
+      |   +-o IOBluetoothSerialClientModemStreamSync  <class IOBluetoothSerialClientModemStreamSync, id 0x1000002e0, registered, matched, active, busy 0 (76 ms), retain 5>
+      |     +-o IOSerialBSDClient  <class IOSerialBSDClient, id 0x1000002e8, registered, matched, active, busy 0 (6 ms), retain 4>
+      +-o IODisplayWrangler  <class IODisplayWrangler, id 0x100000288, registered, matched, active, busy 0 (169 ms), retain 7>
+      | +-o IOAccelerationUserClient  <class IOAccelerationUserClient, id 0x100000370, !registered, !matched, active, busy 0, retain 5>
+      +-o IOSurfaceRoot  <class IOSurfaceRoot, id 0x100000289, registered, matched, active, busy 0 (171 ms), retain 5>
+      +-o AppleSCSISubsystemGlobals  <class AppleSCSISubsystemGlobals, id 0x1000002fd, registered, matched, active, busy 0 (1 ms), retain 5>
diff --git a/resources/macos/ioreg/IOUSBDevice2 b/resources/macos/ioreg/IOUSBDevice2
new file mode 100644
index 0000000..7381f42
--- /dev/null
+++ b/resources/macos/ioreg/IOUSBDevice2
@@ -0,0 +1,976 @@
++-o Root  <class IORegistryEntry, id 0x100000100, retain 15>
+  +-o iMac7,1  <class IOPlatformExpertDevice, id 0x100000110, registered, matched, active, busy 0 (12850 ms), retain 23>
+    +-o AppleACPIPlatformExpert  <class AppleACPIPlatformExpert, id 0x100000111, registered, matched, active, busy 0 (10089 ms), retain 33>
+    | +-o IOPMrootDomain  <class IOPMrootDomain, id 0x100000114, registered, matched, active, busy 0 (10 ms), retain 54>
+    | | +-o IORootParent  <class IORootParent, id 0x100000115, !registered, !matched, active, busy 0, retain 7>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x1000002ab, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x1000002ac, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x1000002ad, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x1000002ae, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x1000002b0, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x10000030c, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x10000037a, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000384, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000398, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x1000003d5, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x1000003d8, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x1000003e9, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x1000003ea, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x1000003f3, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x1000003f4, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x1000003f5, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x1000003f9, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000410, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000412, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000413, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000414, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000432, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000434, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000438, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000459, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x10000046e, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000470, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000476, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000478, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x100000479, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x10000047a, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x10000047b, !registered, !matched, active, busy 0, retain 5>
+    | | +-o RootDomainUserClient  <class RootDomainUserClient, id 0x10000047d, !registered, !matched, active, busy 0, retain 5>
+    | +-o cpus  <class IOPlatformDevice, id 0x100000117, registered, matched, active, busy 0 (3 ms), retain 7>
+    | +-o CPU0 at 0  <class IOACPIPlatformDevice, id 0x100000118, registered, matched, active, busy 0 (173 ms), retain 7>
+    | | +-o AppleACPICPU  <class AppleACPICPU, id 0x10000011d, registered, matched, active, busy 0 (165 ms), retain 9>
+    | |   +-o AppleACPICPUInterruptController  <class AppleACPICPUInterruptController, id 0x10000011f, registered, matched, active, busy 0 (0 ms), retain 5>
+    | |   +-o ACPI_SMC_PlatformPlugin  <class ACPI_SMC_PlatformPlugin, id 0x1000002ba, registered, matched, active, busy 0 (13 ms), retain 9>
+    | |   +-o AppleIntelMeromPerformanceMonitor  <class AppleIntelMeromPerformanceMonitor, id 0x1000002bb, !registered, !matched, active, busy 0 (83 ms), retain 9>
+    | |   | +-o AppleIntelMeromGeneralPurposeCounter  <class AppleIntelMeromGeneralPurposeCounter, id 0x1000002f5, registered, matched, active, busy 0 (62 ms), retain 7>
+    | |   | | +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x1000002de, registered, matched, active, busy 0 (57 ms), retain 17>
+    | |   | |   +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x10000030d, !registered, !matched, active, busy 0, retain 5>
+    | |   | +-o AppleIntelMeromGeneralPurposeCounter  <class AppleIntelMeromGeneralPurposeCounter, id 0x1000002f6, registered, matched, active, busy 0 (64 ms), retain 7>
+    | |   | | +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x1000002de, registered, matched, active, busy 0 (57 ms), retain 17>
+    | |   | |   +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x10000030d, !registered, !matched, active, busy 0, retain 5>
+    | |   | +-o AppleIntelMeromFixedCounter  <class AppleIntelMeromFixedCounter, id 0x1000002f7, registered, matched, active, busy 0 (66 ms), retain 7>
+    | |   | | +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x1000002de, registered, matched, active, busy 0 (57 ms), retain 17>
+    | |   | |   +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x10000030d, !registered, !matched, active, busy 0, retain 5>
+    | |   | +-o AppleIntelMeromFixedCounter  <class AppleIntelMeromFixedCounter, id 0x1000002f8, registered, matched, active, busy 0 (65 ms), retain 7>
+    | |   | | +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x1000002de, registered, matched, active, busy 0 (57 ms), retain 17>
+    | |   | |   +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x10000030d, !registered, !matched, active, busy 0, retain 5>
+    | |   | +-o AppleIntelMeromFixedCounter  <class AppleIntelMeromFixedCounter, id 0x1000002f9, registered, matched, active, busy 0 (83 ms), retain 7>
+    | |   |   +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x1000002de, registered, matched, active, busy 0 (57 ms), retain 17>
+    | |   |     +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x10000030d, !registered, !matched, active, busy 0, retain 5>
+    | |   +-o AppleIntelMeromSPR  <class AppleIntelMeromSPR, id 0x1000002ee, registered, matched, active, busy 0 (67 ms), retain 4>
+    | +-o CPU1 at 1  <class IOACPIPlatformDevice, id 0x100000119, registered, matched, active, busy 0 (169 ms), retain 7>
+    | | +-o AppleACPICPU  <class AppleACPICPU, id 0x10000011e, registered, matched, active, busy 0 (155 ms), retain 7>
+    | |   +-o AppleIntelMeromPerformanceMonitor  <class AppleIntelMeromPerformanceMonitor, id 0x1000002ce, !registered, !matched, active, busy 0 (75 ms), retain 9>
+    | |   | +-o AppleIntelMeromGeneralPurposeCounter  <class AppleIntelMeromGeneralPurposeCounter, id 0x100000301, registered, matched, active, busy 0 (68 ms), retain 7>
+    | |   | | +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x1000002de, registered, matched, active, busy 0 (57 ms), retain 17>
+    | |   | |   +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x10000030d, !registered, !matched, active, busy 0, retain 5>
+    | |   | +-o AppleIntelMeromGeneralPurposeCounter  <class AppleIntelMeromGeneralPurposeCounter, id 0x100000302, registered, matched, active, busy 0 (69 ms), retain 7>
+    | |   | | +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x1000002de, registered, matched, active, busy 0 (57 ms), retain 17>
+    | |   | |   +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x10000030d, !registered, !matched, active, busy 0, retain 5>
+    | |   | +-o AppleIntelMeromFixedCounter  <class AppleIntelMeromFixedCounter, id 0x100000303, registered, matched, active, busy 0 (72 ms), retain 7>
+    | |   | | +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x1000002de, registered, matched, active, busy 0 (57 ms), retain 17>
+    | |   | |   +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x10000030d, !registered, !matched, active, busy 0, retain 5>
+    | |   | +-o AppleIntelMeromFixedCounter  <class AppleIntelMeromFixedCounter, id 0x100000304, registered, matched, active, busy 0 (73 ms), retain 7>
+    | |   | | +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x1000002de, registered, matched, active, busy 0 (57 ms), retain 17>
+    | |   | |   +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x10000030d, !registered, !matched, active, busy 0, retain 5>
+    | |   | +-o AppleIntelMeromFixedCounter  <class AppleIntelMeromFixedCounter, id 0x100000305, registered, matched, active, busy 0 (75 ms), retain 7>
+    | |   |   +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x1000002de, registered, matched, active, busy 0 (57 ms), retain 17>
+    | |   |     +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x10000030d, !registered, !matched, active, busy 0, retain 5>
+    | |   +-o AppleIntelMeromSPR  <class AppleIntelMeromSPR, id 0x1000002fa, registered, matched, active, busy 0 (75 ms), retain 4>
+    | +-o io-apic at fec00000  <class IOACPIPlatformDevice, id 0x10000011a, registered, matched, active, busy 0 (3 ms), retain 6>
+    | | +-o AppleAPICInterruptController  <class AppleAPICInterruptController, id 0x100000121, registered, matched, active, busy 0 (0 ms), retain 11>
+    | +-o AppleACPIEventController  <class AppleACPIEventController, id 0x100000122, !registered, !matched, active, busy 0, retain 6>
+    | +-o boot-ec  <class IOACPIPlatformDevice, id 0x100000123, registered, matched, active, busy 0 (1 ms), retain 6>
+    | | +-o AppleACPIEC  <class AppleACPIEC, id 0x100000124, !registered, !matched, active, busy 0, retain 6>
+    | +-o bios  <class IOPlatformDevice, id 0x100000125, registered, matched, active, busy 0 (4 ms), retain 5>
+    | | +-o AppleSMBIOS  <class AppleSMBIOS, id 0x100000126, registered, matched, active, busy 0 (1 ms), retain 4>
+    | +-o PNLF  <class IOACPIPlatformDevice, id 0x10000012a, registered, matched, active, busy 0 (34 ms), retain 7>
+    | | +-o AppleIntelPanelA  <class AppleIntelPanelA, id 0x1000002c5, !registered, !matched, active, busy 0, retain 5>
+    | +-o PWRB  <class IOACPIPlatformDevice, id 0x10000012b, registered, matched, active, busy 0 (2 ms), retain 8>
+    | | +-o AppleACPIButton  <class AppleACPIButton, id 0x1000001af, !registered, !matched, active, busy 0, retain 4>
+    | +-o SLPB  <class IOACPIPlatformDevice, id 0x10000012c, registered, matched, active, busy 0 (3 ms), retain 7>
+    | | +-o AppleACPIButton  <class AppleACPIButton, id 0x1000001b0, !registered, !matched, active, busy 0, retain 4>
+    | +-o PCI0  <class IOACPIPlatformDevice, id 0x10000012d, registered, matched, active, busy 0 (10058 ms), retain 45>
+    | | +-o AppleACPIPCI  <class AppleACPIPCI, id 0x1000001b1, registered, matched, active, busy 0 (10050 ms), retain 44>
+    | |   +-o MCHC at 0  <class IOPCIDevice, id 0x100000178, registered, matched, active, busy 0 (164 ms), retain 8>
+    | |   +-o PEGP at 1  <class IOPCIDevice, id 0x100000179, registered, matched, active, busy 0 (292 ms), retain 11>
+    | |   | +-o IOPCI2PCIBridge  <class IOPCI2PCIBridge, id 0x1000001ce, registered, matched, active, busy 0 (272 ms), retain 7>
+    | |   |   +-o GFX0 at 0  <class IOPCIDevice, id 0x10000017a, registered, matched, active, busy 0 (271 ms), retain 21>
+    | |   |     +-o ATI2600Controller  <class ATI2600Controller, id 0x1000002b1, registered, matched, active, busy 0 (61 ms), retain 4>
+    | |   |     +-o ATY,Hypoprion at 0  <class AtiFbStub, id 0x1000002b5, registered, matched, active, busy 0 (159 ms), retain 7>
+    | |   |     | +-o ATY_Hypoprion  <class ATIFramebuffer, id 0x100000306, registered, matched, active, busy 0 (87 ms), retain 15>
+    | |   |     |   +-o AppleMCCSControlModule  <class AppleMCCSControlModule, id 0x100000312, registered, matched, active, busy 0 (5 ms), retain 5>
+    | |   |     |   | +-o AppleMCCSParameterHandler  <class AppleMCCSParameterHandler, id 0x100000314, registered, matched, active, busy 0 (4 ms), retain 4>
+    | |   |     |   +-o AppleUpstreamUserClientDriver  <class AppleUpstreamUserClientDriver, id 0x100000313, registered, matched, active, busy 0 (1 ms), retain 4>
+    | |   |     |   +-o AMDNDRVService  <class AtiAppServices, id 0x10000036e, registered, matched, active, busy 0 (1 ms), retain 5>
+    | |   |     |   +-o IOFramebufferI2CInterface  <class IOFramebufferI2CInterface, id 0x10000036f, registered, matched, active, busy 0 (1 ms), retain 5>
+    | |   |     |   +-o display0  <class IODisplayConnect, id 0x100000370, registered, matched, active, busy 0 (2 ms), retain 5>
+    | |   |     |   | +-o AppleBacklightDisplay  <class AppleBacklightDisplay, id 0x100000371, registered, matched, active, busy 0 (1 ms), retain 8>
+    | |   |     |   +-o IOFramebufferUserClient  <class IOFramebufferUserClient, id 0x100000376, !registered, !matched, active, busy 0, retain 5>
+    | |   |     |   +-o IOFramebufferSharedUserClient  <class IOFramebufferSharedUserClient, id 0x100000483, !registered, !matched, active, busy 0, retain 5>
+    | |   |     +-o ATY,Hypoprion at 1  <class AtiFbStub, id 0x1000002b6, registered, matched, active, busy 0 (13 ms), retain 7>
+    | |   |     | +-o ATY_Hypoprion  <class ATIFramebuffer, id 0x100000318, registered, matched, active, busy 0 (11 ms), retain 12>
+    | |   |     |   +-o AppleMCCSControlModule  <class AppleMCCSControlModule, id 0x10000031b, registered, matched, active, busy 0 (4 ms), retain 5>
+    | |   |     |   | +-o AppleMCCSParameterHandler  <class AppleMCCSParameterHandler, id 0x10000031d, registered, matched, active, busy 0 (1 ms), retain 4>
+    | |   |     |   +-o AppleUpstreamUserClientDriver  <class AppleUpstreamUserClientDriver, id 0x10000031c, registered, matched, active, busy 0 (3 ms), retain 4>
+    | |   |     |   +-o AMDNDRVService  <class AtiAppServices, id 0x100000374, registered, matched, active, busy 0 (0 ms), retain 5>
+    | |   |     |   +-o IOFramebufferI2CInterface  <class IOFramebufferI2CInterface, id 0x100000375, registered, matched, active, busy 0 (1 ms), retain 5>
+    | |   |     |   +-o IOFramebufferUserClient  <class IOFramebufferUserClient, id 0x100000378, !registered, !matched, active, busy 0, retain 5>
+    | |   |     +-o ATISupport  <class ATISupport, id 0x1000002b2, registered, matched, active, busy 0 (1 ms), retain 4>
+    | |   |     +-o ATIRadeonX2000  <class ATIRadeonX2000, id 0x1000002b3, registered, matched, active, busy 0 (4 ms), retain 16>
+    | |   |       +-o IOService  <class IOService, id 0x100000322, registered, matched, active, busy 0 (4 ms), retain 6>
+    | |   |       | +-o IOHWSensor  <class IOHWSensor, id 0x100000323, registered, matched, active, busy 0 (1 ms), retain 7>
+    | |   |       +-o ATIR6002DContext  <class ATIR6002DContext, id 0x100000377, !registered, !matched, active, busy 0, retain 5>
+    | |   |       +-o ATIR6002DContext  <class ATIR6002DContext, id 0x100000379, !registered, !matched, active, busy 0, retain 5>
+    | |   |       +-o ATIR600Device  <class ATIR600Device, id 0x10000037f, !registered, !matched, active, busy 0, retain 5>
+    | |   |       +-o ATIR600GLContext  <class ATIR600GLContext, id 0x100000380, !registered, !matched, active, busy 0, retain 5>
+    | |   |       +-o ATIR600Surface  <class ATIR600Surface, id 0x1000003f6, !registered, !matched, active, busy 0, retain 5>
+    | |   |       +-o ATIR600Surface  <class ATIR600Surface, id 0x1000003fa, !registered, !matched, active, busy 0, retain 5>
+    | |   |       +-o ATIR600GLContext  <class ATIR600GLContext, id 0x1000003fb, !registered, !matched, active, busy 0, retain 5>
+    | |   |       +-o ATIR600Surface  <class ATIR600Surface, id 0x100000408, !registered, !matched, active, busy 0, retain 5>
+    | |   |       +-o ATIR600Surface  <class ATIR600Surface, id 0x100000409, !registered, !matched, active, busy 0, retain 5>
+    | |   |       +-o ATIR600Surface  <class ATIR600Surface, id 0x100000411, !registered, !matched, active, busy 0, retain 5>
+    | |   +-o UHC4 at 1A  <class IOPCIDevice, id 0x100000191, registered, matched, active, busy 0 (2874 ms), retain 11>
+    | |   | +-o AppleUSBUHCI  <class AppleUSBUHCI, id 0x1000001d2, registered, matched, active, busy 0 (2688 ms), retain 10>
+    | |   |   +-o UHCI Root Hub Simulation at 1A  <class IOUSBRootHubDevice, id 0x100000216, registered, matched, active, busy 0 (338 ms), retain 12>
+    | |   |   | | {
+    | |   |   | |   "sessionID" = 372634795
+    | |   |   | |   "AAPL,current-extra-in-sleep" = 500
+    | |   |   | |   "iManufacturer" = 2
+    | |   |   | |   "bNumConfigurations" = 1
+    | |   |   | |   "idProduct" = 32773
+    | |   |   | |   "bcdDevice" = 272
+    | |   |   | |   "Bus Power Available" = 250
+    | |   |   | |   "bMaxPacketSize0" = 8
+    | |   |   | |   "USB Product Name" = "UHCI Root Hub Simulation"
+    | |   |   | |   "iProduct" = 1
+    | |   |   | |   "iSerialNumber" = 0
+    | |   |   | |   "USB Address" = 1
+    | |   |   | |   "bDeviceClass" = 9
+    | |   |   | |   "locationID" = 436207616
+    | |   |   | |   "bDeviceSubClass" = 0
+    | |   |   | |   "IOUserClientClass" = "IOUSBDeviceUserClientV2"
+    | |   |   | |   "Ports" = 2
+    | |   |   | |   "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
+    | |   |   | |   "AAPL,max-port-current-in-sleep" = 1000
+    | |   |   | |   "bDeviceProtocol" = 0
+    | |   |   | |   "USB Vendor Name" = "Apple Inc."
+    | |   |   | |   "Device Speed" = 1
+    | |   |   | |   "idVendor" = 1452
+    | |   |   | |   "AAPL,current-in-sleep" = 1000
+    | |   |   | |   "Requested Power" = 0
+    | |   |   | |   "AAPL,port-current-in-sleep" = 500
+    | |   |   | |   "Low Power Displayed" = No
+    | |   |   | | }
+    | |   |   | | 
+    | |   |   | +-o AppleUSBHub  <class AppleUSBHub, id 0x100000218, !registered, !matched, active, busy 0, retain 10>
+    | |   |   | +-o IOUSBInterface at 0  <class IOUSBInterface, id 0x10000021a, !registered, !matched, active, busy 0, retain 7>
+    | |   |   +-o NetScroll + Mini Traveler at 1a200000  <class IOUSBDevice, id 0x100000270, registered, matched, active, busy 0 (730 ms), retain 9>
+    | |   |   | | {
+    | |   |   | |   "sessionID" = 1035836159
+    | |   |   | |   "iManufacturer" = 2
+    | |   |   | |   "bNumConfigurations" = 1
+    | |   |   | |   "idProduct" = 54
+    | |   |   | |   "bcdDevice" = 272
+    | |   |   | |   "Bus Power Available" = 250
+    | |   |   | |   "bMaxPacketSize0" = 8
+    | |   |   | |   "USB Product Name" = "NetScroll + Mini Traveler"
+    | |   |   | |   "iProduct" = 1
+    | |   |   | |   "iSerialNumber" = 0
+    | |   |   | |   "USB Address" = 3
+    | |   |   | |   "bDeviceClass" = 0
+    | |   |   | |   "locationID" = 438304768
+    | |   |   | |   "bDeviceSubClass" = 0
+    | |   |   | |   "IOUserClientClass" = "IOUSBDeviceUserClientV2"
+    | |   |   | |   "PortNum" = 2
+    | |   |   | |   "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
+    | |   |   | |   "bDeviceProtocol" = 0
+    | |   |   | |   "Need contiguous memory for isoch" = Yes
+    | |   |   | |   "USB Vendor Name" = "Genius"
+    | |   |   | |   "Device Speed" = 0
+    | |   |   | |   "idVendor" = 1112
+    | |   |   | |   "Requested Power" = 50
+    | |   |   | |   "IOGeneralInterest" = "IOCommand is not serializable"
+    | |   |   | |   "Low Power Displayed" = No
+    | |   |   | | }
+    | |   |   | | 
+    | |   |   | +-o IOUSBCompositeDriver  <class IOUSBCompositeDriver, id 0x10000027a, !registered, !matched, active, busy 0, retain 4>
+    | |   |   | +-o IOUSBInterface at 0  <class IOUSBInterface, id 0x100000280, registered, matched, active, busy 0 (706 ms), retain 8>
+    | |   |   |   +-o IOUSBHIDDriver  <class IOUSBHIDDriver, id 0x10000030a, registered, matched, active, busy 0 (20 ms), retain 7>
+    | |   |   |     +-o IOHIDInterface  <class IOHIDInterface, id 0x100000316, registered, matched, active, busy 0 (13 ms), retain 6>
+    | |   |   |       +-o IOHIDEventDriver  <class IOHIDEventDriver, id 0x10000031e, registered, matched, active, busy 0 (3 ms), retain 8>
+    | |   |   |         +-o IOHIDPointing  <class IOHIDPointing, id 0x10000031f, registered, matched, active, busy 0 (1 ms), retain 7>
+    | |   |   |         | +-o IOHIDSystem  <class IOHIDSystem, id 0x100000220, registered, matched, active, busy 0 (2 ms), retain 17>
+    | |   |   |         |   +-o IOHIDUserClient  <class IOHIDUserClient, id 0x10000036a, !registered, !matched, active, busy 0, retain 5>
+    | |   |   |         |   +-o IOHIDParamUserClient  <class IOHIDParamUserClient, id 0x10000036b, !registered, !matched, active, busy 0, retain 5>
+    | |   |   |         |   +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000037c, !registered, !matched, active, busy 0, retain 5>
+    | |   |   |         |   +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000037d, !registered, !matched, active, busy 0, retain 5>
+    | |   |   |         +-o IOHIDSystem  <class IOHIDSystem, id 0x100000220, registered, matched, active, busy 0 (2 ms), retain 16>
+    | |   |   |           +-o IOHIDUserClient  <class IOHIDUserClient, id 0x10000036a, !registered, !matched, active, busy 0, retain 5>
+    | |   |   |           +-o IOHIDParamUserClient  <class IOHIDParamUserClient, id 0x10000036b, !registered, !matched, active, busy 0, retain 5>
+    | |   |   |           +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000037c, !registered, !matched, active, busy 0, retain 5>
+    | |   |   |           +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000037d, !registered, !matched, active, busy 0, retain 5>
+    | |   |   +-o WirelessControllerDevice at 1a100000  <class IOUSBDevice, id 0x10000029e, registered, matched, active, busy 0 (564 ms), retain 10>
+    | |   |     | {
+    | |   |     |   "sessionID" = 3009829809
+    | |   |     |   "iManufacturer" = 0
+    | |   |     |   "idProduct" = 33286
+    | |   |     |   "bDeviceClass" = 224
+    | |   |     |   "bcdDevice" = 6501
+    | |   |     |   "Bus Power Available" = 250
+    | |   |     |   "bMaxPacketSize0" = 64
+    | |   |     |   "iProduct" = 0
+    | |   |     |   "iSerialNumber" = 0
+    | |   |     |   "USB Address" = 2
+    | |   |     |   "bNumConfigurations" = 1
+    | |   |     |   "IOUserClientClass" = "IOUSBDeviceUserClientV2"
+    | |   |     |   "locationID" = 437256192
+    | |   |     |   "bDeviceSubClass" = 1
+    | |   |     |   "USB Product Name" = "Bluetooth USB Host Controller"
+    | |   |     |   "non-removable" = "yes"
+    | |   |     |   "PortNum" = 1
+    | |   |     |   "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
+    | |   |     |   "bDeviceProtocol" = 1
+    | |   |     |   "Need contiguous memory for isoch" = Yes
+    | |   |     |   "Device Speed" = 1
+    | |   |     |   "USB Vendor Name" = "Apple Inc."
+    | |   |     |   "idVendor" = 1452
+    | |   |     |   "Requested Power" = 0
+    | |   |     |   "IOGeneralInterest" = "IOCommand is not serializable"
+    | |   |     |   "Low Power Displayed" = No
+    | |   |     | }
+    | |   |     | 
+    | |   |     +-o CSRUSBBluetoothHCIController  <class CSRUSBBluetoothHCIController, id 0x1000002a0, registered, matched, active, busy 0 (0 ms), retain 10>
+    | |   |     | +-o IOBluetoothHCIUserClient  <class IOBluetoothHCIUserClient, id 0x10000032a, !registered, !matched, active, busy 0, retain 5>
+    | |   |     | +-o IOBluetoothHCIUserClient  <class IOBluetoothHCIUserClient, id 0x100000433, !registered, !matched, active, busy 0, retain 5>
+    | |   |     +-o IOUSBInterface at 0  <class IOUSBInterface, id 0x1000002a2, !registered, !matched, active, busy 0, retain 6>
+    | |   |     +-o IOUSBInterface at 1  <class IOUSBInterface, id 0x1000002a3, !registered, !matched, active, busy 0, retain 6>
+    | |   |     +-o IOUSBInterface at 2  <class IOUSBInterface, id 0x1000002a4, !registered, !matched, active, busy 0, retain 6>
+    | |   +-o UHC5 at 1A,1  <class IOPCIDevice, id 0x100000195, registered, matched, active, busy 0 (570 ms), retain 11>
+    | |   | +-o AppleUSBUHCI  <class AppleUSBUHCI, id 0x1000001d3, registered, matched, active, busy 0 (377 ms), retain 8>
+    | |   |   +-o UHCI Root Hub Simulation at 1A,1  <class IOUSBRootHubDevice, id 0x10000021c, registered, matched, active, busy 0 (377 ms), retain 8>
+    | |   |     | {
+    | |   |     |   "sessionID" = 380960109
+    | |   |     |   "AAPL,current-extra-in-sleep" = 500
+    | |   |     |   "iManufacturer" = 2
+    | |   |     |   "bNumConfigurations" = 1
+    | |   |     |   "idProduct" = 32773
+    | |   |     |   "bcdDevice" = 272
+    | |   |     |   "Bus Power Available" = 250
+    | |   |     |   "bMaxPacketSize0" = 8
+    | |   |     |   "USB Product Name" = "UHCI Root Hub Simulation"
+    | |   |     |   "iProduct" = 1
+    | |   |     |   "iSerialNumber" = 0
+    | |   |     |   "USB Address" = 1
+    | |   |     |   "bDeviceClass" = 9
+    | |   |     |   "locationID" = 973078528
+    | |   |     |   "bDeviceSubClass" = 0
+    | |   |     |   "IOUserClientClass" = "IOUSBDeviceUserClientV2"
+    | |   |     |   "Ports" = 2
+    | |   |     |   "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
+    | |   |     |   "AAPL,max-port-current-in-sleep" = 1000
+    | |   |     |   "bDeviceProtocol" = 0
+    | |   |     |   "USB Vendor Name" = "Apple Inc."
+    | |   |     |   "Device Speed" = 1
+    | |   |     |   "idVendor" = 1452
+    | |   |     |   "AAPL,current-in-sleep" = 1000
+    | |   |     |   "Requested Power" = 0
+    | |   |     |   "AAPL,port-current-in-sleep" = 500
+    | |   |     |   "Low Power Displayed" = No
+    | |   |     | }
+    | |   |     | 
+    | |   |     +-o AppleUSBHub  <class AppleUSBHub, id 0x100000224, !registered, !matched, active, busy 0, retain 6>
+    | |   |     +-o IOUSBInterface at 0  <class IOUSBInterface, id 0x100000226, !registered, !matched, active, busy 0, retain 7>
+    | |   +-o EHC2 at 1A,7  <class IOPCIDevice, id 0x1000001a1, registered, matched, active, busy 0 (671 ms), retain 12>
+    | |   | +-o IOService  <class IOService, id 0x1000001d4, !registered, !matched, active, busy 0, retain 4>
+    | |   | +-o AppleUSBEHCI  <class AppleUSBEHCI, id 0x1000001d5, registered, matched, active, busy 0 (629 ms), retain 12>
+    | |   |   +-o EHCI Root Hub Simulation at 1A,7  <class IOUSBRootHubDevice, id 0x1000001e9, registered, matched, active, busy 0 (382 ms), retain 10>
+    | |   |   | | {
+    | |   |   | |   "sessionID" = 228913729
+    | |   |   | |   "AAPL,current-extra-in-sleep" = 500
+    | |   |   | |   "iManufacturer" = 2
+    | |   |   | |   "bNumConfigurations" = 1
+    | |   |   | |   "idProduct" = 32774
+    | |   |   | |   "bcdDevice" = 512
+    | |   |   | |   "Bus Power Available" = 250
+    | |   |   | |   "bMaxPacketSize0" = 64
+    | |   |   | |   "USB Product Name" = "EHCI Root Hub Simulation"
+    | |   |   | |   "iProduct" = 1
+    | |   |   | |   "iSerialNumber" = 0
+    | |   |   | |   "USB Address" = 1
+    | |   |   | |   "bDeviceClass" = 9
+    | |   |   | |   "locationID" = 18446744073608888320
+    | |   |   | |   "bDeviceSubClass" = 0
+    | |   |   | |   "AAPL,current-extra" = 1000
+    | |   |   | |   "IOUserClientClass" = "IOUSBDeviceUserClientV2"
+    | |   |   | |   "Ports" = 4
+    | |   |   | |   "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
+    | |   |   | |   "AAPL,current-available" = 1500
+    | |   |   | |   "bDeviceProtocol" = 1
+    | |   |   | |   "AAPL,max-port-current-in-sleep" = 1000
+    | |   |   | |   "USB Vendor Name" = "Apple Inc."
+    | |   |   | |   "Device Speed" = 2
+    | |   |   | |   "idVendor" = 1452
+    | |   |   | |   "AAPL,current-in-sleep" = 2000
+    | |   |   | |   "Requested Power" = 0
+    | |   |   | |   "AAPL,port-current-in-sleep" = 500
+    | |   |   | |   "Low Power Displayed" = No
+    | |   |   | | }
+    | |   |   | | 
+    | |   |   | +-o AppleUSBHub  <class AppleUSBHub, id 0x1000001eb, registered, matched, active, busy 0 (0 ms), retain 8>
+    | |   |   | +-o IOUSBInterface at 0  <class IOUSBInterface, id 0x1000001ed, !registered, !matched, active, busy 0, retain 7>
+    | |   |   +-o Keyboard Hub at fa400000  <class IOUSBHubDevice, id 0x100000243, registered, matched, active, busy 0 (273 ms), retain 10>
+    | |   |   | | {
+    | |   |   | |   "sessionID" = 565166469
+    | |   |   | |   "iManufacturer" = 1
+    | |   |   | |   "bNumConfigurations" = 1
+    | |   |   | |   "idProduct" = 4102
+    | |   |   | |   "bcdDevice" = 37909
+    | |   |   | |   "Bus Power Available" = 250
+    | |   |   | |   "bMaxPacketSize0" = 64
+    | |   |   | |   "USB Product Name" = "Keyboard Hub"
+    | |   |   | |   "iProduct" = 2
+    | |   |   | |   "iSerialNumber" = 3
+    | |   |   | |   "USB Address" = 2
+    | |   |   | |   "bDeviceClass" = 9
+    | |   |   | |   "bDeviceSubClass" = 0
+    | |   |   | |   "locationID" = 18446744073613082624
+    | |   |   | |   "IOUserClientClass" = "IOUSBDeviceUserClientV2"
+    | |   |   | |   "Ports" = 3
+    | |   |   | |   "PortNum" = 4
+    | |   |   | |   "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
+    | |   |   | |   "ExtraPowerRequest" = 600
+    | |   |   | |   "bDeviceProtocol" = 1
+    | |   |   | |   "USB Vendor Name" = "Apple, Inc."
+    | |   |   | |   "Device Speed" = 2
+    | |   |   | |   "idVendor" = 1452
+    | |   |   | |   "ExtraPowerForPorts" = 400
+    | |   |   | |   "USB Serial Number" = "000000000000"
+    | |   |   | |   "kHubPowerSequencingDelay" = Yes
+    | |   |   | |   "Requested Power" = 150
+    | |   |   | |   "Low Power Displayed" = No
+    | |   |   | | }
+    | |   |   | | 
+    | |   |   | +-o AppleUSBHub  <class AppleUSBHub, id 0x10000024a, registered, matched, active, busy 0 (0 ms), retain 9>
+    | |   |   | +-o IOUSBInterface at 0  <class IOUSBInterface, id 0x10000024c, !registered, !matched, active, busy 0, retain 7>
+    | |   |   +-o Apple Keyboard at fa420000  <class IOUSBDevice, id 0x100000271, registered, matched, active, busy 0 (578 ms), retain 11>
+    | |   |     | {
+    | |   |     |   "sessionID" = 1018522533
+    | |   |     |   "iManufacturer" = 1
+    | |   |     |   "bNumConfigurations" = 1
+    | |   |     |   "idProduct" = 545
+    | |   |     |   "bcdDevice" = 105
+    | |   |     |   "Bus Power Available" = 50
+    | |   |     |   "bMaxPacketSize0" = 8
+    | |   |     |   "USB Product Name" = "Apple Keyboard"
+    | |   |     |   "iProduct" = 2
+    | |   |     |   "iSerialNumber" = 0
+    | |   |     |   "USB Address" = 3
+    | |   |     |   "bDeviceClass" = 0
+    | |   |     |   "locationID" = 18446744073613213696
+    | |   |     |   "bDeviceSubClass" = 0
+    | |   |     |   "IOUserClientClass" = "IOUSBDeviceUserClientV2"
+    | |   |     |   "PortNum" = 2
+    | |   |     |   "non-removable" = "yes"
+    | |   |     |   "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
+    | |   |     |   "bDeviceProtocol" = 0
+    | |   |     |   "USB Vendor Name" = "Apple, Inc"
+    | |   |     |   "Device Speed" = 0
+    | |   |     |   "idVendor" = 1452
+    | |   |     |   "Requested Power" = 10
+    | |   |     |   "IOGeneralInterest" = "IOCommand is not serializable"
+    | |   |     |   "Low Power Displayed" = No
+    | |   |     | }
+    | |   |     | 
+    | |   |     +-o IOUSBCompositeDriver  <class IOUSBCompositeDriver, id 0x100000273, !registered, !matched, active, busy 0, retain 4>
+    | |   |     +-o IOUSBInterface at 0  <class IOUSBInterface, id 0x100000274, registered, matched, active, busy 0 (215 ms), retain 8>
+    | |   |     | +-o AppleUSBHIDKeyboard  <class AppleUSBHIDKeyboard, id 0x100000277, registered, matched, active, busy 0 (39 ms), retain 7>
+    | |   |     |   +-o IOHIDInterface  <class IOHIDInterface, id 0x10000027b, registered, matched, active, busy 0 (4 ms), retain 6>
+    | |   |     |     +-o AppleHIDKeyboardEventDriver  <class AppleHIDKeyboardEventDriver, id 0x10000027c, registered, matched, active, busy 0 (1 ms), retain 8>
+    | |   |     |       +-o IOHIDKeyboard  <class IOHIDKeyboard, id 0x10000027e, registered, matched, active, busy 0 (0 ms), retain 8>
+    | |   |     |       | +-o IOHIDSystem  <class IOHIDSystem, id 0x100000220, registered, matched, active, busy 0 (2 ms), retain 17>
+    | |   |     |       |   +-o IOHIDUserClient  <class IOHIDUserClient, id 0x10000036a, !registered, !matched, active, busy 0, retain 5>
+    | |   |     |       |   +-o IOHIDParamUserClient  <class IOHIDParamUserClient, id 0x10000036b, !registered, !matched, active, busy 0, retain 5>
+    | |   |     |       |   +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000037c, !registered, !matched, active, busy 0, retain 5>
+    | |   |     |       |   +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000037d, !registered, !matched, active, busy 0, retain 5>
+    | |   |     |       +-o IOHIDSystem  <class IOHIDSystem, id 0x100000220, registered, matched, active, busy 0 (2 ms), retain 16>
+    | |   |     |         +-o IOHIDUserClient  <class IOHIDUserClient, id 0x10000036a, !registered, !matched, active, busy 0, retain 5>
+    | |   |     |         +-o IOHIDParamUserClient  <class IOHIDParamUserClient, id 0x10000036b, !registered, !matched, active, busy 0, retain 5>
+    | |   |     |         +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000037c, !registered, !matched, active, busy 0, retain 5>
+    | |   |     |         +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000037d, !registered, !matched, active, busy 0, retain 5>
+    | |   |     +-o IOUSBInterface at 1  <class IOUSBInterface, id 0x100000275, registered, matched, active, busy 0 (196 ms), retain 8>
+    | |   |       +-o AppleUSBHIDKeyboard  <class AppleUSBHIDKeyboard, id 0x100000282, registered, matched, active, busy 0 (50 ms), retain 7>
+    | |   |         +-o IOHIDInterface  <class IOHIDInterface, id 0x100000283, registered, matched, active, busy 0 (41 ms), retain 6>
+    | |   |           +-o IOHIDEventDriver  <class IOHIDEventDriver, id 0x1000002c8, registered, matched, active, busy 0 (3 ms), retain 8>
+    | |   |             +-o IOHIDConsumer  <class IOHIDConsumer, id 0x1000002c9, registered, matched, active, busy 0 (1 ms), retain 8>
+    | |   |             | +-o IOHIDSystem  <class IOHIDSystem, id 0x100000220, registered, matched, active, busy 0 (2 ms), retain 17>
+    | |   |             |   +-o IOHIDUserClient  <class IOHIDUserClient, id 0x10000036a, !registered, !matched, active, busy 0, retain 5>
+    | |   |             |   +-o IOHIDParamUserClient  <class IOHIDParamUserClient, id 0x10000036b, !registered, !matched, active, busy 0, retain 5>
+    | |   |             |   +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000037c, !registered, !matched, active, busy 0, retain 5>
+    | |   |             |   +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000037d, !registered, !matched, active, busy 0, retain 5>
+    | |   |             +-o IOHIDSystem  <class IOHIDSystem, id 0x100000220, registered, matched, active, busy 0 (2 ms), retain 16>
+    | |   |               +-o IOHIDUserClient  <class IOHIDUserClient, id 0x10000036a, !registered, !matched, active, busy 0, retain 5>
+    | |   |               +-o IOHIDParamUserClient  <class IOHIDParamUserClient, id 0x10000036b, !registered, !matched, active, busy 0, retain 5>
+    | |   |               +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000037c, !registered, !matched, active, busy 0, retain 5>
+    | |   |               +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000037d, !registered, !matched, active, busy 0, retain 5>
+    | |   +-o HDEF at 1B  <class IOPCIDevice, id 0x10000017e, registered, matched, active, busy 0 (2793 ms), retain 10>
+    | |   | +-o AppleHDAController at 1B  <class AppleHDAController, id 0x1000002bc, registered, matched, active, busy 0 (2689 ms), retain 7>
+    | |   |   +-o IOHDACodecDevice at 1B,0  <class IOHDACodecDevice, id 0x1000002d8, registered, matched, active, busy 0 (2689 ms), retain 6>
+    | |   |     +-o IOHDACodecDriver  <class IOHDACodecDriver, id 0x1000002ec, !registered, !matched, active, busy 0 (2688 ms), retain 5>
+    | |   |       +-o IOHDACodecFunction at 1B,0,1  <class IOHDACodecFunction, id 0x1000002ed, registered, matched, active, busy 0 (2688 ms), retain 6>
+    | |   |         +-o AppleHDACodecGeneric  <class AppleHDACodecGeneric, id 0x10000030e, registered, matched, active, busy 0 (26 ms), retain 5>
+    | |   |           +-o AppleHDADriver  <class AppleHDADriver, id 0x100000328, registered, matched, active, busy 0 (9 ms), retain 8>
+    | |   |             +-o AppleHDAEngineOutput at 1B,0,1,2  <class AppleHDAEngineOutput, id 0x100000333, registered, matched, active, busy 0 (4 ms), retain 35>
+    | |   |             | +-o AppleHDAStream  <class AppleHDAStream, id 0x100000334, registered, matched, active, busy 0 (2 ms), retain 7>
+    | |   |             | +-o IOAudioSelectorControl  <class IOAudioSelectorControl, id 0x100000335, !registered, !matched, active, busy 0 (0 ms), retain 14>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003ab, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000042b, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000452, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000462, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioLevelControl  <class IOAudioLevelControl, id 0x100000336, !registered, !matched, active, busy 0 (0 ms), retain 14>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003ac, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000042c, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000453, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000463, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioLevelControl  <class IOAudioLevelControl, id 0x100000337, !registered, !matched, active, busy 0 (0 ms), retain 14>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003ad, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000042d, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000454, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000464, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioToggleControl  <class IOAudioToggleControl, id 0x100000338, !registered, !matched, active, busy 0 (0 ms), retain 14>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003ae, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000042e, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000455, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000465, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioToggleControl  <class IOAudioToggleControl, id 0x100000339, !registered, !matched, active, busy 0 (0 ms), retain 14>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003af, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000042f, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000456, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000466, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioToggleControl  <class IOAudioToggleControl, id 0x10000033a, !registered, !matched, active, busy 0 (0 ms), retain 14>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003b0, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000430, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000457, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000467, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioToggleControl  <class IOAudioToggleControl, id 0x10000033b, !registered, !matched, active, busy 0 (0 ms), retain 14>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003b1, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000431, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000458, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000468, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o AudioAUUCDriver  <class AudioAUUCDriver, id 0x10000033d, registered, matched, active, busy 0 (1 ms), retain 4>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x10000039c, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x1000003b5, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x1000003dc, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x1000003e0, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x1000003ee, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x1000003f2, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000418, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x10000041c, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x10000043c, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000441, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x10000045d, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000461, !registered, !matched, active, busy 0, retain 6>
+    | |   |             +-o AppleHDAEngineInput at 1B,0,1,0  <class AppleHDAEngineInput, id 0x10000033c, registered, matched, active, busy 0 (3 ms), retain 34>
+    | |   |             | +-o AppleHDAStream  <class AppleHDAStream, id 0x10000033e, registered, matched, active, busy 0 (2 ms), retain 7>
+    | |   |             | +-o IOAudioSelectorControl  <class IOAudioSelectorControl, id 0x10000033f, !registered, !matched, active, busy 0 (0 ms), retain 12>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003a4, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000041d, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000444, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioLevelControl  <class IOAudioLevelControl, id 0x100000340, !registered, !matched, active, busy 0 (0 ms), retain 12>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003a5, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000041e, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000445, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioLevelControl  <class IOAudioLevelControl, id 0x100000341, !registered, !matched, active, busy 0 (0 ms), retain 12>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003a6, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000041f, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000446, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioToggleControl  <class IOAudioToggleControl, id 0x100000342, !registered, !matched, active, busy 0 (0 ms), retain 12>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003a7, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000420, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000447, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioToggleControl  <class IOAudioToggleControl, id 0x100000343, !registered, !matched, active, busy 0 (0 ms), retain 12>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003a8, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000421, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000448, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioToggleControl  <class IOAudioToggleControl, id 0x100000344, !registered, !matched, active, busy 0 (0 ms), retain 12>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003a9, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000422, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000449, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioToggleControl  <class IOAudioToggleControl, id 0x100000345, !registered, !matched, active, busy 0 (0 ms), retain 24>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003aa, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003b3, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003de, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003f0, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000041a, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000423, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000043e, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000044a, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000045f, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x10000039b, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x1000003b4, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x1000003db, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x1000003df, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x1000003ed, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x1000003f1, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000417, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x10000041b, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x10000043b, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000440, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x10000045c, !registered, !matched, active, busy 0, retain 6>
+    | |   |             | +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000460, !registered, !matched, active, busy 0, retain 6>
+    | |   |             +-o AppleHDAEngineInput at 1B,0,1,1  <class AppleHDAEngineInput, id 0x100000346, registered, matched, active, busy 0 (2 ms), retain 34>
+    | |   |               +-o AppleHDAStream  <class AppleHDAStream, id 0x100000348, registered, matched, active, busy 0 (1 ms), retain 7>
+    | |   |               +-o IOAudioSelectorControl  <class IOAudioSelectorControl, id 0x100000349, !registered, !matched, active, busy 0 (0 ms), retain 12>
+    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000039d, !registered, !matched, active, busy 0, retain 6>
+    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000424, !registered, !matched, active, busy 0, retain 6>
+    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000044b, !registered, !matched, active, busy 0, retain 6>
+    | |   |               +-o IOAudioLevelControl  <class IOAudioLevelControl, id 0x10000034a, !registered, !matched, active, busy 0 (0 ms), retain 12>
+    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000039e, !registered, !matched, active, busy 0, retain 6>
+    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000425, !registered, !matched, active, busy 0, retain 6>
+    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000044c, !registered, !matched, active, busy 0, retain 6>
+    | |   |               +-o IOAudioLevelControl  <class IOAudioLevelControl, id 0x10000034b, !registered, !matched, active, busy 0 (0 ms), retain 12>
+    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000039f, !registered, !matched, active, busy 0, retain 6>
+    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000426, !registered, !matched, active, busy 0, retain 6>
+    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000044d, !registered, !matched, active, busy 0, retain 6>
+    | |   |               +-o IOAudioToggleControl  <class IOAudioToggleControl, id 0x10000034c, !registered, !matched, active, busy 0 (0 ms), retain 12>
+    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003a0, !registered, !matched, active, busy 0, retain 6>
+    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000427, !registered, !matched, active, busy 0, retain 6>
+    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000044e, !registered, !matched, active, busy 0, retain 6>
+    | |   |               +-o IOAudioToggleControl  <class IOAudioToggleControl, id 0x10000034d, !registered, !matched, active, busy 0 (0 ms), retain 12>
+    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003a1, !registered, !matched, active, busy 0, retain 6>
+    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000428, !registered, !matched, active, busy 0, retain 6>
+    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000044f, !registered, !matched, active, busy 0, retain 6>
+    | |   |               +-o IOAudioToggleControl  <class IOAudioToggleControl, id 0x10000034e, !registered, !matched, active, busy 0 (0 ms), retain 12>
+    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003a2, !registered, !matched, active, busy 0, retain 6>
+    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000429, !registered, !matched, active, busy 0, retain 6>
+    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000450, !registered, !matched, active, busy 0, retain 6>
+    | |   |               +-o IOAudioToggleControl  <class IOAudioToggleControl, id 0x10000034f, !registered, !matched, active, busy 0 (0 ms), retain 12>
+    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x1000003a3, !registered, !matched, active, busy 0, retain 6>
+    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x10000042a, !registered, !matched, active, busy 0, retain 6>
+    | |   |               | +-o IOAudioControlUserClient  <class IOAudioControlUserClient, id 0x100000451, !registered, !matched, active, busy 0, retain 6>
+    | |   |               +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x10000039a, !registered, !matched, active, busy 0, retain 6>
+    | |   |               +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x1000003b2, !registered, !matched, active, busy 0, retain 6>
+    | |   |               +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x1000003da, !registered, !matched, active, busy 0, retain 6>
+    | |   |               +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x1000003dd, !registered, !matched, active, busy 0, retain 6>
+    | |   |               +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x1000003ec, !registered, !matched, active, busy 0, retain 6>
+    | |   |               +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x1000003ef, !registered, !matched, active, busy 0, retain 6>
+    | |   |               +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000416, !registered, !matched, active, busy 0, retain 6>
+    | |   |               +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000419, !registered, !matched, active, busy 0, retain 6>
+    | |   |               +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x10000043a, !registered, !matched, active, busy 0, retain 6>
+    | |   |               +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x10000043d, !registered, !matched, active, busy 0, retain 6>
+    | |   |               +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x10000045b, !registered, !matched, active, busy 0, retain 6>
+    | |   |               +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x10000045e, !registered, !matched, active, busy 0, retain 6>
+    | |   +-o pci-bridge at 1C  <class IOPCIDevice, id 0x1000001b3, registered, matched, active, busy 0 (60 ms), retain 9>
+    | |   | +-o IOPCI2PCIBridge  <class IOPCI2PCIBridge, id 0x1000001d7, registered, matched, active, busy 0 (30 ms), retain 5>
+    | |   +-o RP04 at 1C,3  <class IOPCIDevice, id 0x10000017f, registered, matched, active, busy 0 (114 ms), retain 11>
+    | |   | +-o IOPCI2PCIBridge  <class IOPCI2PCIBridge, id 0x1000001da, registered, matched, active, busy 0 (82 ms), retain 7>
+    | |   |   +-o FRWR at 0  <class IOPCIDevice, id 0x100000180, registered, matched, active, busy 0 (80 ms), retain 10>
+    | |   |     +-o AppleFWOHCI  <class AppleFWOHCI, id 0x1000001f5, !registered, !matched, active, busy 0 (48 ms), retain 6>
+    | |   |       +-o IOFireWireController  <class IOFireWireController, id 0x1000001f7, registered, matched, active, busy 0 (48 ms), retain 9>
+    | |   |         +-o IOFireWireLocalNode  <class IOFireWireLocalNode, id 0x10000026e, registered, matched, active, busy 0 (47 ms), retain 12>
+    | |   |           +-o IOFireWireUserClientIniter  <class IOFireWireUserClientIniter, id 0x10000026f, !registered, !matched, active, busy 0, retain 4>
+    | |   |           +-o IOFireWireUserClientIniter  <class IOFireWireUserClientIniter, id 0x1000002ca, !registered, !matched, active, busy 0, retain 4>
+    | |   |           +-o IOFireWireIP  <class IOFireWireIP, id 0x1000002cb, registered, matched, active, busy 0 (4 ms), retain 5>
+    | |   |             +-o IOFWInterface  <class IOFWInterface, id 0x1000002cd, registered, matched, active, busy 0 (3 ms), retain 10>
+    | |   |               +-o IONetworkStack  <class IONetworkStack, id 0x10000021f, registered, matched, active, busy 0 (2 ms), retain 11>
+    | |   |                 +-o IONetworkStackUserClient  <class IONetworkStackUserClient, id 0x1000002aa, !registered, !matched, active, busy 0, retain 5>
+    | |   +-o RP05 at 1C,4  <class IOPCIDevice, id 0x100000181, registered, matched, active, busy 0 (237 ms), retain 11>
+    | |   | +-o IOPCI2PCIBridge  <class IOPCI2PCIBridge, id 0x1000001de, registered, matched, active, busy 0 (203 ms), retain 7>
+    | |   |   +-o ARPT at 0  <class IOPCIDevice, id 0x100000182, registered, matched, active, busy 0 (203 ms), retain 12>
+    | |   |     +-o AirPort_Brcm43224  <class AirPort_Brcm43224, id 0x1000001fb, registered, matched, active, busy 0 (9 ms), retain 8>
+    | |   |       +-o AirPort_Brcm43224Interface  <class AirPort_Brcm43224Interface, id 0x100000237, registered, matched, active, busy 0 (7 ms), retain 10>
+    | |   |         +-o IONetworkStack  <class IONetworkStack, id 0x10000021f, registered, matched, active, busy 0 (2 ms), retain 11>
+    | |   |           +-o IONetworkStackUserClient  <class IONetworkStackUserClient, id 0x1000002aa, !registered, !matched, active, busy 0, retain 5>
+    | |   +-o RP06 at 1C,5  <class IOPCIDevice, id 0x100000183, registered, matched, active, busy 0 (6723 ms), retain 11>
+    | |   | +-o IOPCI2PCIBridge  <class IOPCI2PCIBridge, id 0x1000001e2, registered, matched, active, busy 0 (6686 ms), retain 7>
+    | |   |   +-o GIGE at 0  <class IOPCIDevice, id 0x100000184, registered, matched, active, busy 0 (6686 ms), retain 10>
+    | |   |     +-o yukon2osx  <class yukon2osx, id 0x1000001fd, !registered, !matched, active, busy 0 (1 ms), retain 7>
+    | |   |       +-o yukon  <class yukon, id 0x1000002a8, !registered, !matched, active, busy 0 (1 ms), retain 8>
+    | |   |         +-o IOEthernetInterface  <class IOEthernetInterface, id 0x1000002a9, registered, matched, active, busy 0 (1 ms), retain 11>
+    | |   |           +-o IONetworkStack  <class IONetworkStack, id 0x10000021f, registered, matched, active, busy 0 (2 ms), retain 11>
+    | |   |             +-o IONetworkStackUserClient  <class IONetworkStackUserClient, id 0x1000002aa, !registered, !matched, active, busy 0, retain 5>
+    | |   +-o UHC1 at 1D  <class IOPCIDevice, id 0x100000185, registered, matched, active, busy 0 (634 ms), retain 11>
+    | |   | +-o AppleUSBUHCI  <class AppleUSBUHCI, id 0x1000001e6, registered, matched, active, busy 0 (292 ms), retain 9>
+    | |   |   +-o UHCI Root Hub Simulation at 1D  <class IOUSBRootHubDevice, id 0x100000242, registered, matched, active, busy 0 (281 ms), retain 8>
+    | |   |     | {
+    | |   |     |   "sessionID" = 542392661
+    | |   |     |   "AAPL,current-extra-in-sleep" = 500
+    | |   |     |   "iManufacturer" = 2
+    | |   |     |   "bNumConfigurations" = 1
+    | |   |     |   "idProduct" = 32773
+    | |   |     |   "bcdDevice" = 272
+    | |   |     |   "Bus Power Available" = 250
+    | |   |     |   "bMaxPacketSize0" = 8
+    | |   |     |   "USB Product Name" = "UHCI Root Hub Simulation"
+    | |   |     |   "iProduct" = 1
+    | |   |     |   "iSerialNumber" = 0
+    | |   |     |   "USB Address" = 1
+    | |   |     |   "bDeviceClass" = 9
+    | |   |     |   "locationID" = 486539264
+    | |   |     |   "bDeviceSubClass" = 0
+    | |   |     |   "IOUserClientClass" = "IOUSBDeviceUserClientV2"
+    | |   |     |   "Ports" = 2
+    | |   |     |   "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
+    | |   |     |   "AAPL,max-port-current-in-sleep" = 1000
+    | |   |     |   "bDeviceProtocol" = 0
+    | |   |     |   "USB Vendor Name" = "Apple Inc."
+    | |   |     |   "Device Speed" = 1
+    | |   |     |   "idVendor" = 1452
+    | |   |     |   "AAPL,current-in-sleep" = 1000
+    | |   |     |   "Requested Power" = 0
+    | |   |     |   "AAPL,port-current-in-sleep" = 500
+    | |   |     |   "Low Power Displayed" = No
+    | |   |     | }
+    | |   |     | 
+    | |   |     +-o AppleUSBHub  <class AppleUSBHub, id 0x100000245, !registered, !matched, active, busy 0, retain 6>
+    | |   |     +-o IOUSBInterface at 0  <class IOUSBInterface, id 0x100000247, !registered, !matched, active, busy 0, retain 7>
+    | |   +-o UHC2 at 1D,1  <class IOPCIDevice, id 0x100000189, registered, matched, active, busy 0 (756 ms), retain 11>
+    | |   | +-o AppleUSBUHCI  <class AppleUSBUHCI, id 0x1000001e7, registered, matched, active, busy 0 (416 ms), retain 8>
+    | |   |   +-o UHCI Root Hub Simulation at 1D,1  <class IOUSBRootHubDevice, id 0x100000238, registered, matched, active, busy 0 (416 ms), retain 8>
+    | |   |     | {
+    | |   |     |   "sessionID" = 528553166
+    | |   |     |   "AAPL,current-extra-in-sleep" = 500
+    | |   |     |   "iManufacturer" = 2
+    | |   |     |   "bNumConfigurations" = 1
+    | |   |     |   "idProduct" = 32773
+    | |   |     |   "bcdDevice" = 272
+    | |   |     |   "Bus Power Available" = 250
+    | |   |     |   "bMaxPacketSize0" = 8
+    | |   |     |   "USB Product Name" = "UHCI Root Hub Simulation"
+    | |   |     |   "iProduct" = 1
+    | |   |     |   "iSerialNumber" = 0
+    | |   |     |   "USB Address" = 1
+    | |   |     |   "bDeviceClass" = 9
+    | |   |     |   "locationID" = 1023410176
+    | |   |     |   "bDeviceSubClass" = 0
+    | |   |     |   "IOUserClientClass" = "IOUSBDeviceUserClientV2"
+    | |   |     |   "Ports" = 2
+    | |   |     |   "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
+    | |   |     |   "AAPL,max-port-current-in-sleep" = 1000
+    | |   |     |   "bDeviceProtocol" = 0
+    | |   |     |   "USB Vendor Name" = "Apple Inc."
+    | |   |     |   "Device Speed" = 1
+    | |   |     |   "idVendor" = 1452
+    | |   |     |   "AAPL,current-in-sleep" = 1000
+    | |   |     |   "Requested Power" = 0
+    | |   |     |   "AAPL,port-current-in-sleep" = 500
+    | |   |     |   "Low Power Displayed" = No
+    | |   |     | }
+    | |   |     | 
+    | |   |     +-o AppleUSBHub  <class AppleUSBHub, id 0x10000023a, !registered, !matched, active, busy 0, retain 6>
+    | |   |     +-o IOUSBInterface at 0  <class IOUSBInterface, id 0x10000023c, !registered, !matched, active, busy 0, retain 7>
+    | |   +-o UHC3 at 1D,2  <class IOPCIDevice, id 0x10000018d, registered, matched, active, busy 0 (924 ms), retain 11>
+    | |   | +-o AppleUSBUHCI  <class AppleUSBUHCI, id 0x1000001e8, registered, matched, active, busy 0 (583 ms), retain 9>
+    | |   |   +-o UHCI Root Hub Simulation at 1D,2  <class IOUSBRootHubDevice, id 0x10000023d, registered, matched, active, busy 0 (425 ms), retain 10>
+    | |   |   | | {
+    | |   |   | |   "sessionID" = 533559502
+    | |   |   | |   "AAPL,current-extra-in-sleep" = 500
+    | |   |   | |   "iManufacturer" = 2
+    | |   |   | |   "bNumConfigurations" = 1
+    | |   |   | |   "idProduct" = 32773
+    | |   |   | |   "bcdDevice" = 272
+    | |   |   | |   "Bus Power Available" = 250
+    | |   |   | |   "bMaxPacketSize0" = 8
+    | |   |   | |   "USB Product Name" = "UHCI Root Hub Simulation"
+    | |   |   | |   "iProduct" = 1
+    | |   |   | |   "iSerialNumber" = 0
+    | |   |   | |   "USB Address" = 1
+    | |   |   | |   "bDeviceClass" = 9
+    | |   |   | |   "locationID" = 1560281088
+    | |   |   | |   "bDeviceSubClass" = 0
+    | |   |   | |   "IOUserClientClass" = "IOUSBDeviceUserClientV2"
+    | |   |   | |   "Ports" = 2
+    | |   |   | |   "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
+    | |   |   | |   "AAPL,max-port-current-in-sleep" = 1000
+    | |   |   | |   "bDeviceProtocol" = 0
+    | |   |   | |   "USB Vendor Name" = "Apple Inc."
+    | |   |   | |   "Device Speed" = 1
+    | |   |   | |   "idVendor" = 1452
+    | |   |   | |   "AAPL,current-in-sleep" = 1000
+    | |   |   | |   "Requested Power" = 0
+    | |   |   | |   "AAPL,port-current-in-sleep" = 500
+    | |   |   | |   "Low Power Displayed" = No
+    | |   |   | | }
+    | |   |   | | 
+    | |   |   | +-o AppleUSBHub  <class AppleUSBHub, id 0x10000023f, !registered, !matched, active, busy 0, retain 8>
+    | |   |   | +-o IOUSBInterface at 0  <class IOUSBInterface, id 0x100000241, !registered, !matched, active, busy 0, retain 7>
+    | |   |   +-o IR Receiver at 5d100000  <class IOUSBDevice, id 0x100000286, registered, matched, active, busy 0 (577 ms), retain 9>
+    | |   |     | {
+    | |   |     |   "sessionID" = 1116620200
+    | |   |     |   "iManufacturer" = 1
+    | |   |     |   "bNumConfigurations" = 1
+    | |   |     |   "idProduct" = 33346
+    | |   |     |   "bcdDevice" = 22
+    | |   |     |   "Bus Power Available" = 250
+    | |   |     |   "bMaxPacketSize0" = 8
+    | |   |     |   "USB Product Name" = "IR Receiver"
+    | |   |     |   "iProduct" = 2
+    | |   |     |   "iSerialNumber" = 0
+    | |   |     |   "USB Address" = 2
+    | |   |     |   "bDeviceClass" = 0
+    | |   |     |   "locationID" = 1561329664
+    | |   |     |   "bDeviceSubClass" = 0
+    | |   |     |   "IOUserClientClass" = "IOUSBDeviceUserClientV2"
+    | |   |     |   "PortNum" = 1
+    | |   |     |   "non-removable" = "yes"
+    | |   |     |   "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
+    | |   |     |   "bDeviceProtocol" = 0
+    | |   |     |   "Need contiguous memory for isoch" = Yes
+    | |   |     |   "USB Vendor Name" = "Apple Computer, Inc."
+    | |   |     |   "Device Speed" = 0
+    | |   |     |   "idVendor" = 1452
+    | |   |     |   "Requested Power" = 50
+    | |   |     |   "IOGeneralInterest" = "IOCommand is not serializable"
+    | |   |     |   "Low Power Displayed" = No
+    | |   |     | }
+    | |   |     | 
+    | |   |     +-o IOUSBCompositeDriver  <class IOUSBCompositeDriver, id 0x100000288, !registered, !matched, active, busy 0, retain 4>
+    | |   |     +-o IOUSBInterface at 0  <class IOUSBInterface, id 0x100000289, registered, matched, active, busy 0 (272 ms), retain 8>
+    | |   |       +-o AppleIRController  <class AppleIRController, id 0x10000028b, registered, matched, active, busy 0 (51 ms), retain 8>
+    | |   |         +-o IOHIDInterface  <class IOHIDInterface, id 0x10000028c, registered, matched, active, busy 0 (2 ms), retain 5>
+    | |   |         +-o IOHIDLibUserClient  <class IOHIDLibUserClient, id 0x1000003d6, !registered, !matched, active, busy 0, retain 6>
+    | |   +-o EHC1 at 1D,7  <class IOPCIDevice, id 0x100000199, registered, matched, active, busy 0 (1067 ms), retain 17>
+    | |   | +-o IOService  <class IOService, id 0x1000001ff, !registered, !matched, active, busy 0, retain 4>
+    | |   | +-o AppleUSBEHCI  <class AppleUSBEHCI, id 0x100000200, registered, matched, active, busy 0 (978 ms), retain 13>
+    | |   |   +-o EHCI Root Hub Simulation at 1D,7  <class IOUSBRootHubDevice, id 0x100000209, registered, matched, active, busy 0 (446 ms), retain 12>
+    | |   |   | | {
+    | |   |   | |   "sessionID" = 278360131
+    | |   |   | |   "AAPL,current-extra-in-sleep" = 500
+    | |   |   | |   "iManufacturer" = 2
+    | |   |   | |   "bNumConfigurations" = 1
+    | |   |   | |   "idProduct" = 32774
+    | |   |   | |   "bcdDevice" = 512
+    | |   |   | |   "Bus Power Available" = 250
+    | |   |   | |   "bMaxPacketSize0" = 64
+    | |   |   | |   "USB Product Name" = "EHCI Root Hub Simulation"
+    | |   |   | |   "iProduct" = 1
+    | |   |   | |   "iSerialNumber" = 0
+    | |   |   | |   "USB Address" = 1
+    | |   |   | |   "bDeviceClass" = 9
+    | |   |   | |   "locationID" = 18446744073659219968
+    | |   |   | |   "bDeviceSubClass" = 0
+    | |   |   | |   "AAPL,current-extra" = 1000
+    | |   |   | |   "IOUserClientClass" = "IOUSBDeviceUserClientV2"
+    | |   |   | |   "Ports" = 6
+    | |   |   | |   "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
+    | |   |   | |   "AAPL,current-available" = 1500
+    | |   |   | |   "bDeviceProtocol" = 1
+    | |   |   | |   "AAPL,max-port-current-in-sleep" = 1000
+    | |   |   | |   "USB Vendor Name" = "Apple Inc."
+    | |   |   | |   "Device Speed" = 2
+    | |   |   | |   "idVendor" = 1452
+    | |   |   | |   "AAPL,current-in-sleep" = 3000
+    | |   |   | |   "Requested Power" = 0
+    | |   |   | |   "AAPL,port-current-in-sleep" = 500
+    | |   |   | |   "Low Power Displayed" = No
+    | |   |   | | }
+    | |   |   | | 
+    | |   |   | +-o AppleUSBHub  <class AppleUSBHub, id 0x10000020c, registered, matched, active, busy 0 (0 ms), retain 9>
+    | |   |   | +-o IOUSBInterface at 0  <class IOUSBInterface, id 0x10000020e, !registered, !matched, active, busy 0, retain 7>
+    | |   |   +-o LaCie Device at fd100000  <class IOUSBDevice, id 0x10000024d, registered, matched, active, busy 0 (725 ms), retain 8>
+    | |   |   | | {
+    | |   |   | |   "sessionID" = 637721320
+    | |   |   | |   "iManufacturer" = 10
+    | |   |   | |   "bNumConfigurations" = 1
+    | |   |   | |   "idProduct" = 4138
+    | |   |   | |   "bcdDevice" = 256
+    | |   |   | |   "Bus Power Available" = 250
+    | |   |   | |   "bMaxPacketSize0" = 64
+    | |   |   | |   "USB Product Name" = "LaCie Device"
+    | |   |   | |   "iProduct" = 11
+    | |   |   | |   "iSerialNumber" = 5
+    | |   |   | |   "USB Address" = 2
+    | |   |   | |   "bDeviceClass" = 0
+    | |   |   | |   "bDeviceSubClass" = 0
+    | |   |   | |   "locationID" = 18446744073660268544
+    | |   |   | |   "IOUserClientClass" = "IOUSBDeviceUserClientV2"
+    | |   |   | |   "kHasMSCInterface" = Yes
+    | |   |   | |   "PortNum" = 1
+    | |   |   | |   "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
+    | |   |   | |   "bDeviceProtocol" = 0
+    | |   |   | |   "uid" = "USB:059F102A6E7A5FFFFFFF"
+    | |   |   | |   "USB Vendor Name" = "LaCie"
+    | |   |   | |   "Device Speed" = 2
+    | |   |   | |   "idVendor" = 1439
+    | |   |   | |   "USB Serial Number" = "6E7A5FFFFFFF"
+    | |   |   | |   "Requested Power" = 1
+    | |   |   | |   "IOGeneralInterest" = "IOCommand is not serializable"
+    | |   |   | |   "Low Power Displayed" = No
+    | |   |   | | }
+    | |   |   | | 
+    | |   |   | +-o IOUSBCompositeDriver  <class IOUSBCompositeDriver, id 0x10000024f, !registered, !matched, active, busy 0, retain 4>
+    | |   |   | +-o MSC Bulk-Only Transfer at 0  <class IOUSBInterface, id 0x100000250, registered, matched, active, busy 0 (453 ms), retain 7>
+    | |   |   |   +-o IOUSBMassStorageClass  <class IOUSBMassStorageClass, id 0x100000254, registered, matched, active, busy 0 (248 ms), retain 8>
+    | |   |   |     +-o IOSCSIPeripheralDeviceNub  <class IOSCSIPeripheralDeviceNub, id 0x100000256, registered, matched, active, busy 0 (105 ms), retain 6>
+    | |   |   |       +-o IOSCSIPeripheralDeviceType00  <class IOSCSIPeripheralDeviceType00, id 0x100000260, !registered, !matched, active, busy 0 (101 ms), retain 7>
+    | |   |   |         +-o IOBlockStorageServices  <class IOBlockStorageServices, id 0x100000263, registered, matched, active, busy 0 (101 ms), retain 5>
+    | |   |   |           +-o IOBlockStorageDriver  <class IOBlockStorageDriver, id 0x100000264, registered, matched, active, busy 0 (100 ms), retain 7>
+    | |   |   |             +-o ST950032 5AS Media  <class IOMedia, id 0x10000028e, registered, matched, active, busy 0 (99 ms), retain 10>
+    | |   |   |               +-o IOMediaBSDClient  <class IOMediaBSDClient, id 0x10000028f, registered, matched, active, busy 0 (0 ms), retain 5>
+    | |   |   |               +-o IOApplePartitionScheme  <class IOApplePartitionScheme, id 0x100000293, !registered, !matched, active, busy 0 (25 ms), retain 10>
+    | |   |   |                 +-o Apple at 1  <class IOMedia, id 0x100000294, registered, matched, active, busy 0 (4 ms), retain 8>
+    | |   |   |                 | +-o IOMediaBSDClient  <class IOMediaBSDClient, id 0x100000299, registered, matched, active, busy 0 (2 ms), retain 5>
+    | |   |   |                 +-o osx104 at 3  <class IOMedia, id 0x100000295, registered, matched, active, busy 0 (9 ms), retain 9>
+    | |   |   |                 | +-o IOMediaBSDClient  <class IOMediaBSDClient, id 0x10000029a, registered, matched, active, busy 0 (2 ms), retain 6>
+    | |   |   |                 +-o osx105 at 5  <class IOMedia, id 0x100000296, registered, matched, active, busy 0 (10 ms), retain 9>
+    | |   |   |                 | +-o IOMediaBSDClient  <class IOMediaBSDClient, id 0x10000029b, registered, matched, active, busy 0 (2 ms), retain 6>
+    | |   |   |                 +-o osx106 at 7  <class IOMedia, id 0x100000297, registered, matched, active, busy 0 (10 ms), retain 9>
+    | |   |   |                 | +-o IOMediaBSDClient  <class IOMediaBSDClient, id 0x10000029c, registered, matched, active, busy 0 (2 ms), retain 6>
+    | |   |   |                 +-o vms at 9  <class IOMedia, id 0x100000298, registered, matched, active, busy 0 (11 ms), retain 9>
+    | |   |   |                   +-o IOMediaBSDClient  <class IOMediaBSDClient, id 0x10000029d, registered, matched, active, busy 0 (2 ms), retain 6>
+    | |   |   +-o Built-in iSight at fd400000  <class IOUSBDevice, id 0x10000025b, registered, matched, active, busy 0 (607 ms), retain 10>
+    | |   |     | {
+    | |   |     |   "sessionID" = 791376929
+    | |   |     |   "iManufacturer" = 1
+    | |   |     |   "bNumConfigurations" = 1
+    | |   |     |   "idProduct" = 34050
+    | |   |     |   "bcdDevice" = 341
+    | |   |     |   "Bus Power Available" = 250
+    | |   |     |   "bMaxPacketSize0" = 64
+    | |   |     |   "USB Product Name" = "Built-in iSight"
+    | |   |     |   "iProduct" = 2
+    | |   |     |   "iSerialNumber" = 3
+    | |   |     |   "USB Address" = 3
+    | |   |     |   "bDeviceClass" = 239
+    | |   |     |   "bDeviceSubClass" = 2
+    | |   |     |   "locationID" = 18446744073663414272
+    | |   |     |   "IOUserClientClass" = "IOUSBDeviceUserClientV2"
+    | |   |     |   "PortNum" = 4
+    | |   |     |   "non-removable" = "yes"
+    | |   |     |   "IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
+    | |   |     |   "bDeviceProtocol" = 1
+    | |   |     |   "USB Vendor Name" = "Apple Inc."
+    | |   |     |   "Device Speed" = 2
+    | |   |     |   "idVendor" = 1452
+    | |   |     |   "USB Serial Number" = "6067E773DA9722F4 (03.01)"
+    | |   |     |   "Requested Power" = 250
+    | |   |     |   "IOGeneralInterest" = "IOCommand is not serializable"
+    | |   |     |   "kSuspendPort" = Yes
+    | |   |     |   "Low Power Displayed" = No
+    | |   |     | }
+    | |   |     | 
+    | |   |     +-o IOUSBCompositeDriver  <class IOUSBCompositeDriver, id 0x10000025f, !registered, !matched, active, busy 0, retain 4>
+    | |   |     +-o IOUSBInterface at 0  <class IOUSBInterface, id 0x100000265, registered, matched, active, busy 0 (373 ms), retain 6>
+    | |   |     +-o IOUSBInterface at 1  <class IOUSBInterface, id 0x100000266, registered, matched, active, busy 0 (399 ms), retain 6>
+    | |   |     +-o IOUSBInterface at 2  <class IOUSBInterface, id 0x100000267, registered, matched, active, busy 0 (433 ms), retain 6>
+    | |   +-o pci-bridge at 1E  <class IOPCIDevice, id 0x1000001b4, registered, matched, active, busy 0 (199 ms), retain 9>
+    | |   | +-o IOPCI2PCIBridge  <class IOPCI2PCIBridge, id 0x100000204, registered, matched, active, busy 0 (113 ms), retain 5>
+    | |   +-o LPCB at 1F  <class IOPCIDevice, id 0x1000001a7, registered, matched, active, busy 0 (253 ms), retain 28>
+    | |   | +-o AppleLPC  <class AppleLPC, id 0x1000002b7, registered, matched, active, busy 0 (2 ms), retain 5>
+    | |   +-o PATA at 1F,1  <class IOPCIDevice, id 0x1000001a8, registered, matched, active, busy 0 (500 ms), retain 13>
+    | |   | +-o AppleIntelPIIXATARoot  <class AppleIntelPIIXATARoot, id 0x1000001ee, !registered, !matched, active, busy 0 (450 ms), retain 6>
+    | |   |   +-o PRID at 0  <class AppleIntelPIIXATAChannel, id 0x1000001a9, registered, matched, active, busy 0 (450 ms), retain 11>
+    | |   |   | +-o AppleIntelPIIXPATA  <class AppleIntelPIIXPATA, id 0x1000001f4, registered, matched, active, busy 0 (412 ms), retain 7>
+    | |   |   |   +-o ATADeviceNub at 0  <class ATADeviceNub, id 0x10000021b, registered, matched, active, busy 0 (306 ms), retain 6>
+    | |   |   |     +-o IOATAPIProtocolTransport  <class IOATAPIProtocolTransport, id 0x10000022e, registered, matched, active, busy 0 (276 ms), retain 9>
+    | |   |   |       +-o IOSCSIPeripheralDeviceNub  <class IOSCSIPeripheralDeviceNub, id 0x100000234, registered, matched, active, busy 0 (43 ms), retain 6>
+    | |   |   |         +-o IOSCSIPeripheralDeviceType05  <class IOSCSIPeripheralDeviceType05, id 0x100000251, !registered, !matched, active, busy 0 (2 ms), retain 7>
+    | |   |   |           +-o IODVDServices  <class IODVDServices, id 0x100000258, registered, matched, active, busy 0 (2 ms), retain 6>
+    | |   |   |             +-o IODVDBlockStorageDriver  <class IODVDBlockStorageDriver, id 0x100000259, registered, matched, active, busy 0 (0 ms), retain 5>
+    | |   |   |             +-o SCSITaskUserClientIniter  <class SCSITaskUserClientIniter, id 0x10000025a, !registered, !matched, active, busy 0, retain 4>
+    | |   |   +-o CHN1 at 1  <class AppleIntelPIIXATAChannel, id 0x1000001ef, registered, matched, active, busy 0 (51 ms), retain 6>
+    | |   +-o SATA at 1F,2  <class IOPCIDevice, id 0x1000001ac, registered, matched, active, busy 0 (309 ms), retain 12>
+    | |   | +-o AppleICH8AHCI  <class AppleICH8AHCI, id 0x1000001f0, registered, matched, active, busy 0 (254 ms), retain 7>
+    | |   |   +-o PRT0 at 0  <class AppleAHCIPort, id 0x1000001ad, registered, matched, active, busy 0 (246 ms), retain 10>
+    | |   |     +-o IOAHCIDevice at 0  <class IOAHCIDevice, id 0x1000001f9, registered, matched, active, busy 0 (246 ms), retain 12>
+    | |   |       +-o AppleAHCIDiskDriver  <class AppleAHCIDiskDriver, id 0x1000001fa, registered, matched, active, busy 0 (219 ms), retain 6>
+    | |   |         +-o IOAHCIBlockStorageDevice  <class IOAHCIBlockStorageDevice, id 0x10000020a, registered, matched, active, busy 0 (212 ms), retain 6>
+    | |   |           +-o IOBlockStorageDriver  <class IOBlockStorageDriver, id 0x100000211, registered, matched, active, busy 0 (211 ms), retain 7>
+    | |   |             +-o WDC WD3200AAJS-40VWA0 Media  <class IOMedia, id 0x100000212, registered, matched, active, busy 0 (211 ms), retain 10>
+    | |   |               +-o IOMediaBSDClient  <class IOMediaBSDClient, id 0x100000213, registered, matched, active, busy 0 (0 ms), retain 5>
+    | |   |               +-o IOGUIDPartitionScheme  <class IOGUIDPartitionScheme, id 0x100000215, !registered, !matched, active, busy 0 (96 ms), retain 8>
+    | |   |                 +-o EFI System Partition at 1  <class IOMedia, id 0x100000229, registered, matched, active, busy 0 (3 ms), retain 8>
+    | |   |                 | +-o IOMediaBSDClient  <class IOMediaBSDClient, id 0x10000022f, registered, matched, active, busy 0 (0 ms), retain 5>
+    | |   |                 +-o osx at 2  <class IOMedia, id 0x10000022a, registered, matched, active, busy 0 (95 ms), retain 10>
+    | |   |                 | +-o IOMediaBSDClient  <class IOMediaBSDClient, id 0x100000230, registered, matched, active, busy 0 (2 ms), retain 6>
+    | |   |                 +-o Sauvegardes at 3  <class IOMedia, id 0x10000022b, registered, matched, active, busy 0 (95 ms), retain 9>
+    | |   |                   +-o IOMediaBSDClient  <class IOMediaBSDClient, id 0x100000231, registered, matched, active, busy 0 (0 ms), retain 6>
+    | |   +-o SBUS at 1F,3  <class IOPCIDevice, id 0x1000001ae, registered, matched, active, busy 0 (68 ms), retain 8>
+    | +-o PDRC  <class IOACPIPlatformDevice, id 0x10000012f, registered, matched, active, busy 0 (4 ms), retain 6>
+    | +-o SMC  <class IOACPIPlatformDevice, id 0x100000167, registered, matched, active, busy 0 (155 ms), retain 7>
+    | | +-o AppleSMC  <class AppleSMC, id 0x1000002c1, registered, matched, active, busy 0 (83 ms), retain 6>
+    | |   +-o SMCWatchDogTimer  <class SMCWatchDogTimer, id 0x1000002d7, registered, matched, active, busy 0 (60 ms), retain 5>
+    | +-o EC  <class IOACPIPlatformDevice, id 0x100000168, registered, matched, active, busy 0 (7 ms), retain 8>
+    | | +-o AppleACPIEC  <class AppleACPIEC, id 0x100000124, !registered, !matched, active, busy 0, retain 6>
+    | +-o DMAC  <class IOACPIPlatformDevice, id 0x100000169, registered, matched, active, busy 0 (8 ms), retain 6>
+    | +-o FWHD  <class IOACPIPlatformDevice, id 0x10000016a, registered, matched, active, busy 0 (12 ms), retain 6>
+    | +-o HPET  <class IOACPIPlatformDevice, id 0x10000016b, registered, matched, active, busy 0 (26 ms), retain 7>
+    | | +-o AppleHPET  <class AppleHPET, id 0x1000001cc, !registered, !matched, active, busy 0, retain 4>
+    | +-o IPIC  <class IOACPIPlatformDevice, id 0x10000016c, registered, matched, active, busy 0 (13 ms), retain 6>
+    | +-o MATH  <class IOACPIPlatformDevice, id 0x10000016d, registered, matched, active, busy 0 (13 ms), retain 6>
+    | +-o LDRC  <class IOACPIPlatformDevice, id 0x10000016e, registered, matched, active, busy 0 (14 ms), retain 6>
+    | +-o RTC  <class IOACPIPlatformDevice, id 0x10000016f, registered, matched, active, busy 0 (99 ms), retain 8>
+    | | +-o AppleRTC  <class AppleRTC, id 0x1000001c8, registered, matched, active, busy 0 (75 ms), retain 6>
+    | +-o TIMR  <class IOACPIPlatformDevice, id 0x100000170, registered, matched, active, busy 0 (16 ms), retain 6>
+    | +-o AppleEFIRuntime  <class AppleEFIRuntime, id 0x1000001c9, registered, matched, active, busy 0 (693 ms), retain 7>
+    | | +-o AppleEFINVRAM  <class AppleEFINVRAM, id 0x1000001ca, registered, matched, active, busy 0 (1 ms), retain 6>
+    | +-o IOPCIMessagedInterruptController  <class IOPCIMessagedInterruptController, id 0x1000001cd, registered, matched, active, busy 0 (40 ms), retain 6>
+    | +-o AppleRawIOAddressSpace  <class AppleRawIOAddressSpace, id 0x1000002d5, registered, matched, active, busy 0 (23 ms), retain 4>
+    | +-o AppleRawPhysicalMemoryAddressSpace  <class AppleRawPhysicalMemoryAddressSpace, id 0x1000002d6, registered, matched, active, busy 0 (24 ms), retain 4>
+    +-o IOResources  <class IOResources, id 0x100000113, registered, matched, active, busy 0 (991 ms), retain 31>
+      +-o AppleIntelCPUPowerManagement  <class AppleIntelCPUPowerManagement, id 0x10000011b, registered, matched, active, busy 0 (234 ms), retain 5>
+      | +-o AppleIntelCPUPowerManagementClient  <class AppleIntelCPUPowerManagementClient, id 0x100000120, !registered, !matched, active, busy 0, retain 4>
+      +-o IOHDIXController  <class IOHDIXController, id 0x10000011c, registered, matched, active, busy 0 (1 ms), retain 4>
+      +-o com_apple_AppleFSCompression_AppleFSCompressionTypeZlib  <class com_apple_AppleFSCompression_AppleFSCompressionTypeZlib, id 0x10000021d, !registered, !matched, active, busy 0, retain 4>
+      +-o com_apple_BootCache  <class com_apple_BootCache, id 0x10000021e, !registered, !matched, active, busy 0, retain 4>
+      +-o IONetworkStack  <class IONetworkStack, id 0x10000021f, registered, matched, active, busy 0 (2 ms), retain 11>
+      | +-o IONetworkStackUserClient  <class IONetworkStackUserClient, id 0x1000002aa, !registered, !matched, active, busy 0, retain 5>
+      +-o IOHIDSystem  <class IOHIDSystem, id 0x100000220, registered, matched, active, busy 0 (2 ms), retain 16>
+      | +-o IOHIDUserClient  <class IOHIDUserClient, id 0x10000036a, !registered, !matched, active, busy 0, retain 5>
+      | +-o IOHIDParamUserClient  <class IOHIDParamUserClient, id 0x10000036b, !registered, !matched, active, busy 0, retain 5>
+      | +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000037c, !registered, !matched, active, busy 0, retain 5>
+      | +-o IOHIDEventSystemUserClient  <class IOHIDEventSystemUserClient, id 0x10000037d, !registered, !matched, active, busy 0, retain 5>
+      +-o AppleProfileOSHooks  <class AppleProfileOSHooks, id 0x1000002bd, registered, matched, active, busy 0 (86 ms), retain 15>
+      | +-o AppleProfileTimeTrigger  <class AppleProfileTimeTrigger, id 0x1000002db, registered, matched, active, busy 0 (53 ms), retain 6>
+      | +-o AppleProfilePMITrigger  <class AppleProfilePMITrigger, id 0x1000002dc, registered, matched, active, busy 0 (54 ms), retain 6>
+      | +-o AppleOSXPerformanceMonitor  <class AppleOSXPerformanceMonitor, id 0x1000002dd, !registered, !matched, active, busy 0 (55 ms), retain 6>
+      | | +-o AppleOSXPerformanceCounter  <class AppleOSXPerformanceCounter, id 0x1000002e8, registered, matched, active, busy 0 (55 ms), retain 6>
+      | | | +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x1000002de, registered, matched, active, busy 0 (57 ms), retain 18>
+      | | |   +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x10000030d, !registered, !matched, active, busy 0, retain 5>
+      | | +-o AppleOSXPerformanceCounter  <class AppleOSXPerformanceCounter, id 0x1000002e9, registered, matched, active, busy 0 (55 ms), retain 6>
+      | |   +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x1000002de, registered, matched, active, busy 0 (57 ms), retain 18>
+      | |     +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x10000030d, !registered, !matched, active, busy 0, retain 5>
+      | +-o ApplePerformanceCounterManager  <class ApplePerformanceCounterManager, id 0x1000002de, registered, matched, active, busy 0 (57 ms), retain 17>
+      | | +-o AppleProfileReadCounterAction  <class AppleProfileReadCounterAction, id 0x10000030d, !registered, !matched, active, busy 0, retain 5>
+      | +-o AppleProfileKEventTrigger  <class AppleProfileKEventTrigger, id 0x1000002df, registered, matched, active, busy 0 (57 ms), retain 6>
+      | +-o AppleProfileManualTrigger  <class AppleProfileManualTrigger, id 0x1000002e0, registered, matched, active, busy 0 (62 ms), retain 6>
+      | +-o AppleProfileCallstackAction  <class AppleProfileCallstackAction, id 0x1000002e1, !registered, !matched, active, busy 0, retain 5>
+      | +-o AppleProfileKEventAction  <class AppleProfileKEventAction, id 0x1000002e2, !registered, !matched, active, busy 0, retain 5>
+      | +-o AppleProfileRegisterStateAction  <class AppleProfileRegisterStateAction, id 0x1000002e3, !registered, !matched, active, busy 0, retain 5>
+      | +-o AppleProfileThreadInfoAction  <class AppleProfileThreadInfoAction, id 0x1000002e4, !registered, !matched, active, busy 0, retain 5>
+      | +-o AppleProfileTimestampAction  <class AppleProfileTimestampAction, id 0x1000002e5, !registered, !matched, active, busy 0, retain 5>
+      +-o com_apple_driver_AudioIPCDevice  <class com_apple_driver_AudioIPCDevice, id 0x1000002be, registered, matched, active, busy 0 (21 ms), retain 6>
+      | +-o com_apple_driver_AudioIPCEngine  <class com_apple_driver_AudioIPCEngine, id 0x1000002d2, registered, matched, active, busy 0 (19 ms), retain 11>
+      |   +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000399, !registered, !matched, active, busy 0, retain 6>
+      |   +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x1000003d9, !registered, !matched, active, busy 0, retain 6>
+      |   +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x1000003eb, !registered, !matched, active, busy 0, retain 6>
+      |   +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000415, !registered, !matched, active, busy 0, retain 6>
+      |   +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x100000439, !registered, !matched, active, busy 0, retain 6>
+      |   +-o IOAudioEngineUserClient  <class IOAudioEngineUserClient, id 0x10000045a, !registered, !matched, active, busy 0, retain 6>
+      +-o Dont_Steal_Mac_OS_X  <class Dont_Steal_Mac_OS_X, id 0x1000002bf, !registered, !matched, active, busy 0, retain 5>
+      +-o IOBluetoothSerialManager  <class IOBluetoothSerialManager, id 0x1000002c0, registered, matched, active, busy 0 (29 ms), retain 7>
+      | +-o IOBluetoothSerialClient  <class IOBluetoothSerialClient, id 0x10000032b, !registered, !matched, active, busy 0 (4 ms), retain 5>
+      | | +-o IOBluetoothSerialClientSerialStreamSync  <class IOBluetoothSerialClientSerialStreamSync, id 0x10000032c, registered, matched, active, busy 0 (4 ms), retain 5>
+      | |   +-o IOSerialBSDClient  <class IOSerialBSDClient, id 0x10000032d, registered, matched, active, busy 0 (2 ms), retain 4>
+      | +-o IOBluetoothSerialClient  <class IOBluetoothSerialClient, id 0x10000032e, !registered, !matched, active, busy 0 (4 ms), retain 5>
+      |   +-o IOBluetoothSerialClientModemStreamSync  <class IOBluetoothSerialClientModemStreamSync, id 0x10000032f, registered, matched, active, busy 0 (4 ms), retain 5>
+      |     +-o IOSerialBSDClient  <class IOSerialBSDClient, id 0x100000331, registered, matched, active, busy 0 (1 ms), retain 4>
+      +-o IODisplayWrangler  <class IODisplayWrangler, id 0x1000002c2, registered, matched, active, busy 0 (22 ms), retain 7>
+      | +-o IOAccelerationUserClient  <class IOAccelerationUserClient, id 0x1000003f8, !registered, !matched, active, busy 0, retain 5>
+      +-o IOSurfaceRoot  <class IOSurfaceRoot, id 0x1000002c3, registered, matched, active, busy 0 (82 ms), retain 5>
+      +-o AppleSCSISubsystemGlobals  <class AppleSCSISubsystemGlobals, id 0x100000329, registered, matched, active, busy 0 (1 ms), retain 5>
+      +-o com_parallels_hypervisor  <class com_parallels_hypervisor, id 0x100000353, registered, matched, active, busy 0 (2 ms), retain 6>
+      | +-o com_parallels_hypervisor_api  <class com_parallels_hypervisor_api, id 0x100000354, registered, matched, active, busy 0 (1 ms), retain 5>
+      +-o com_parallels_hid_hook  <class com_parallels_hid_hook, id 0x100000355, registered, matched, active, busy 0 (1 ms), retain 4>
+      +-o com_parallels_usb_control  <class com_parallels_usb_control, id 0x10000035c, registered, matched, active, busy 0 (14 ms), retain 4>
+      +-o com_parallels_kext_Prlnet  <class com_parallels_kext_Prlnet, id 0x10000035d, registered, matched, active, busy 0 (1 ms), retain 7>
+      | +-o com_parallels_kext_PrlnetUserClient  <class com_parallels_kext_PrlnetUserClient, id 0x100000385, !registered, !matched, active, busy 0, retain 5>
+      | +-o com_parallels_kext_PrlnetUserClient  <class com_parallels_kext_PrlnetUserClient, id 0x100000386, !registered, !matched, active, busy 0, retain 5>
+      | +-o com_parallels_kext_PrlnetUserClient  <class com_parallels_kext_PrlnetUserClient, id 0x100000387, !registered, !matched, active, busy 0, retain 5>
+      +-o com_parallels_kext_prl_vnic_bus  <class com_parallels_kext_prl_vnic_bus, id 0x10000035e, registered, matched, active, busy 0 (1 ms), retain 4>
+      +-o org_virtualbox_SupDrv  <class org_virtualbox_SupDrv, id 0x10000035f, registered, matched, active, busy 0 (1 ms), retain 4>
+      +-o org_virtualbox_VBoxUSB  <class org_virtualbox_VBoxUSB, id 0x100000363, registered, matched, active, busy 0 (5 ms), retain 5>
+      | +-o org_virtualbox_VBoxUSBClient  <class org_virtualbox_VBoxUSBClient, id 0x10000046f, !registered, !matched, active, busy 0, retain 5>
+      +-o com_vmware_kext_VmmonService  <class com_vmware_kext_VmmonService, id 0x100000388, !registered, !matched, active, busy 0, retain 5>
+      +-o com_vmware_kext_UsbPortArbiter  <class com_vmware_kext_UsbPortArbiter, id 0x100000395, registered, matched, active, busy 0 (15 ms), retain 4>
+      +-o com_vmware_kext_KeyboardState  <class com_vmware_kext_KeyboardState, id 0x100000396, registered, matched, active, busy 0 (16 ms), retain 4>
diff --git a/resources/win32/wmi/xp-Win32_NetworkAdapter.wmi b/resources/win32/wmi/xp-Win32_NetworkAdapter.wmi
new file mode 100644
index 0000000..5452fbe
Binary files /dev/null and b/resources/win32/wmi/xp-Win32_NetworkAdapter.wmi differ
diff --git a/resources/win32/wmi/xp-Win32_NetworkAdapterConfiguration.wmi b/resources/win32/wmi/xp-Win32_NetworkAdapterConfiguration.wmi
new file mode 100644
index 0000000..354fb68
Binary files /dev/null and b/resources/win32/wmi/xp-Win32_NetworkAdapterConfiguration.wmi differ
diff --git a/t/02critic.t b/t/02critic.t
index 3f753f5..bd3a677 100755
--- a/t/02critic.t
+++ b/t/02critic.t
@@ -2,22 +2,18 @@
 
 use strict;
 use warnings;
+
 use Test::More;
 use English qw(-no_match_vars);
 
-if (!$ENV{TEST_AUTHOR}) {
-    my $msg = 'Author test. Set $ENV{TEST_AUTHOR} to a true value to run.';
-    plan(skip_all => $msg);
-}
+plan(skip_all => 'Author test, set $ENV{TEST_AUTHOR} to a true value to run')
+    if !$ENV{TEST_AUTHOR};
 
 eval { require Test::Perl::Critic; };
-
-if ($EVAL_ERROR) {
-    my $msg = 'Test::Perl::Critic required to criticise code';
-    plan(skip_all => $msg);
-}
+plan(skip_all => 'Test::Perl::Critic required') if $EVAL_ERROR;
 
 my $config = File::Spec->catfile('t', 'perlcriticrc');
 Test::Perl::Critic->import(-profile => $config);
+
 all_critic_ok();
 
diff --git a/t/03pod.t b/t/03pod.t
index 98871db..af82d01 100755
--- a/t/03pod.t
+++ b/t/03pod.t
@@ -2,20 +2,16 @@
 
 use strict;
 use warnings;
+
 use Test::More;
 use English qw(-no_match_vars);
 
-if (!$ENV{TEST_AUTHOR}) {
-    my $msg = 'Author test. Set $ENV{TEST_AUTHOR} to a true value to run.';
-    plan(skip_all => $msg);
-}
+plan(skip_all => 'Author test, set $ENV{TEST_AUTHOR} to a true value to run')
+    if !$ENV{TEST_AUTHOR};
 
 eval { require Test::Pod; };
-
-if ($EVAL_ERROR) {
-    my $msg = 'Test::Pod required to check pod';
-    plan(skip_all => $msg);
-}
+plan(skip_all => 'Test::Pod required') if $EVAL_ERROR;
 
 Test::Pod->import();
+
 all_pod_files_ok();
diff --git a/t/04pod-coverage.t b/t/04pod-coverage.t
index bc59126..d1c35c1 100755
--- a/t/04pod-coverage.t
+++ b/t/04pod-coverage.t
@@ -1,29 +1,19 @@
 #!/usr/bin/perl
-# $Id: pod-coverage.t 1580 2007-03-22 13:38:55Z guillomovitch $
 
 use strict;
 use warnings;
+use lib 't';
 
 use Test::More;
 use English qw(-no_match_vars);
 
-use lib 't';
-
-if (!$ENV{TEST_AUTHOR}) {
-    my $msg = 'Author test. Set $ENV{TEST_AUTHOR} to a true value to run.';
-    plan(skip_all => $msg);
-}
+plan(skip_all => 'Author test, set $ENV{TEST_AUTHOR} to a true value to run')
+    if !$ENV{TEST_AUTHOR};
 
 eval { require Test::Pod::Coverage; };
-
-if ($EVAL_ERROR) {
-    my $msg = 'Test::Pod::Coverage required to check pod coverage';
-    plan(skip_all => $msg);
-}
+plan(skip_all => 'Test::Pod::Coverage required') if $EVAL_ERROR;
 
 Test::Pod::Coverage->import();
-
-# use mock modules for non-available ones
 if ($OSNAME eq 'MSWin32') {
     push @INC, 't/fake/unix';
 } else {
@@ -31,9 +21,7 @@ if ($OSNAME eq 'MSWin32') {
 }
 
 my @modules = grep { filter($_) } all_modules('lib');
-
 plan tests => scalar @modules;
-
 foreach my $module (@modules) {
     pod_coverage_ok(
         $module,
diff --git a/t/05var.t b/t/05var.t
index 2f1896b..d57ab9a 100644
--- a/t/05var.t
+++ b/t/05var.t
@@ -2,28 +2,29 @@
 
 use strict;
 use warnings;
+
 use Test::More;
 use English qw(-no_match_vars);
 
-if (!$ENV{TEST_AUTHOR}) {
-    my $msg = 'Author test. Set $ENV{TEST_AUTHOR} to a true value to run.';
-    plan(skip_all => $msg);
-}
+plan(skip_all => 'Author test, set $ENV{TEST_AUTHOR} to a true value to run')
+    if !$ENV{TEST_AUTHOR};
 
-# use mock modules for non-available ones
+eval { require Test::Vars; };
+plan(skip_all => 'Test::Vars required') if $EVAL_ERROR;
+
+Test::Vars->import();
 if ($OSNAME eq 'MSWin32') {
     push @INC, 't/fake/unix';
 } else {
     push @INC, 't/fake/windows';
 }
 
-eval { require Test::Vars; };
-
-if ($EVAL_ERROR) {
-    plan(skip_all => 'Test::Vars required to validate the code');
-}
-
-Test::Vars::all_vars_ok(
-    ignore_vars => { '$i' => 1, '%params' => 1, '$class' => 1 }
+all_vars_ok(
+    ignore_vars => {
+        '%params'   => 1,
+        '$class'    => 1,
+        '$request'  => 1, # FusionInventory::Agent::HTTP::Server
+        '$clientIp' => 1, # FusionInventory::Agent::HTTP::Server
+        '$num'      => 1  # Task::Inventory::Input::Solaris::Networks
+    }
 );
-
diff --git a/t/06spelling.t b/t/06spelling.t
new file mode 100755
index 0000000..b035de9
--- /dev/null
+++ b/t/06spelling.t
@@ -0,0 +1,17 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+use Test::More;
+use English qw(-no_match_vars);
+
+plan(skip_all => 'Author test, set $ENV{TEST_AUTHOR} to a true value to run')
+    if !$ENV{TEST_AUTHOR};
+
+eval { require Test::Pod::Spelling::CommonMistakes; };
+plan(skip_all => 'Test::Pod::Spelling::CommonMistakes required') if $EVAL_ERROR;
+
+Test::Pod::Spelling::CommonMistakes->import();
+
+all_pod_files_ok();
diff --git a/t/inventory/macos/storages.t b/t/inventory/macos/storages.t
index 62a3759..63de394 100755
--- a/t/inventory/macos/storages.t
+++ b/t/inventory/macos/storages.t
@@ -93,6 +93,5 @@ plan tests => scalar keys %tests;
 foreach my $test (keys %tests) {
     my $file = "resources/macos/system_profiler/$test";
     my @storages = FusionInventory::Agent::Task::Inventory::Input::MacOS::Storages::_getStorages(file => $file);
-    is_deeply(\@storages, $tests{$test}, $test) or print Dumper(\@storages);
-    use Data::Dumper;
+    is_deeply(\@storages, $tests{$test}, $test);
 }
diff --git a/t/inventory/macos/usb.t b/t/inventory/macos/usb.t
new file mode 100755
index 0000000..ff2c9d2
--- /dev/null
+++ b/t/inventory/macos/usb.t
@@ -0,0 +1,111 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+use Test::More;
+
+use FusionInventory::Agent::Task::Inventory::Input::MacOS::USB;
+
+my %tests = (
+    IOUSBDevice1 => [
+        {
+            CLASS     => '0',
+            NAME      => 'Apple Internal Keyboard / Trackpad',
+            SERIAL    => undef,
+            SUBCLASS  => '0',
+            VENDORID  => '0x5ac',
+            PRODUCTID => '0x21b'
+        },
+        {
+            CLASS     => '0',
+            NAME      => 'IR Receiver',
+            SERIAL    => undef,
+            SUBCLASS  => '0',
+            VENDORID  => '0x5ac',
+            PRODUCTID => '0x8240'
+        },
+        {
+            CLASS     => '224',
+            NAME      => 'Bluetooth USB Host Controller',
+            SERIAL    => undef,
+            SUBCLASS  => '1',
+            VENDORID  => '0x5ac',
+            PRODUCTID => '0x8205'
+        },
+        {
+            CLASS     => '255',
+            NAME      => 'Built-in iSight',
+            SERIAL    => undef,
+            SUBCLASS  => '255',
+            VENDORID  => '0x5ac',
+            PRODUCTID => '0x8501'
+        },
+        {
+            CLASS     => '0',
+            NAME      => 'Flash Disk',
+            SERIAL    => '16270078C5C90000',
+            SUBCLASS  => '0',
+            VENDORID  => '0x1976',
+            PRODUCTID => '0x6025'
+        }
+    ],
+    IOUSBDevice2 => [
+        {
+            CLASS     => '0',
+            NAME      => 'NetScroll + Mini Traveler',
+            SERIAL    => undef,
+            SUBCLASS  => '0',
+            VENDORID  => '0x458',
+            PRODUCTID => '0x36'
+        },
+        {
+            CLASS     => '224',
+            NAME      => 'Bluetooth USB Host Controller',
+            SERIAL    => undef,
+            SUBCLASS  => '1',
+            VENDORID  => '0x5ac',
+            PRODUCTID => '0x8206'
+        },
+        {
+            CLASS     => '0',
+            NAME      => 'Apple Keyboard',
+            SERIAL    => undef,
+            SUBCLASS  => '0',
+            VENDORID  => '0x5ac',
+            PRODUCTID => '0x221'
+        },
+        {
+            CLASS     => '0',
+            NAME      => 'IR Receiver',
+            SERIAL    => undef,
+            SUBCLASS  => '0',
+            VENDORID  => '0x5ac',
+            PRODUCTID => '0x8242'
+        },
+        {
+            CLASS     => '0',
+            NAME      => 'LaCie Device',
+            SERIAL    => '6E7A5FFFFFFF',
+            SUBCLASS  => '0',
+            VENDORID  => '0x59f',
+            PRODUCTID => '0x102a'
+        },
+        {
+            CLASS     => '239',
+            NAME      => 'Built-in iSight',
+            SERIAL    => '6067E773DA9722F4 (03.01)',
+            SUBCLASS  => '2',
+            VENDORID  => '0x5ac',
+            PRODUCTID => '0x8502'
+        }
+    ]
+);
+
+plan tests => scalar keys %tests;
+
+foreach my $test (keys %tests) {
+    my $file = "resources/macos/ioreg/$test";
+    my @devices = FusionInventory::Agent::Task::Inventory::Input::MacOS::USB::_getDevices(file => $file);
+    is_deeply(\@devices, $tests{$test}, $test);
+}
diff --git a/t/inventory/solaris/networks.t b/t/inventory/solaris/networks.t
index 7a231d6..8c0e1b0 100755
--- a/t/inventory/solaris/networks.t
+++ b/t/inventory/solaris/networks.t
@@ -116,14 +116,12 @@ my %ifconfig_tests = (
 plan tests =>
     int (1 + keys %ifconfig_tests);
 
-use Data::Dumper;
 foreach my $test (keys %ifconfig_tests) {
     my $file = "resources/generic/ifconfig/$test";
     my @results = FusionInventory::Agent::Task::Inventory::Input::Solaris::Networks::_getInterfaces(file => $file);
-    is_deeply(\@results, $ifconfig_tests{$test}, $test) or print Dumper(\@results);
+    is_deeply(\@results, $ifconfig_tests{$test}, $test);
 }
 
-
 my @parsefcinfo = (
       {
         'FIRMWARE' => '05.03.02',
@@ -150,4 +148,4 @@ my @parsefcinfo = (
 );
 my $file = "resources/solaris/fcinfo_hba-port/sample-1";
 my @result = FusionInventory::Agent::Task::Inventory::Input::Solaris::Networks::_parsefcinfo(file => $file);
-is_deeply(\@result, \@parsefcinfo, "_parsefcinfo") or print Dumper(\@result);
+is_deeply(\@result, \@parsefcinfo, "_parsefcinfo");
diff --git a/t/inventory/windows/networks.t b/t/inventory/windows/networks.t
index 8415248..b854a24 100755
--- a/t/inventory/windows/networks.t
+++ b/t/inventory/windows/networks.t
@@ -21,7 +21,7 @@ use FusionInventory::Agent::Task::Inventory::Input::Win32::Networks;
 my %tests = (
     7 => [
         {
-            'dns'       => '192.168.0.254',
+            dns         => '192.168.0.254',
             IPMASK6     => [ '64' ],
             IPMASK      => [ '255.255.255.0' ],
             IPGATEWAY   => '192.168.0.254',
@@ -40,6 +40,14 @@ my %tests = (
             TYPE        => 'Ethernet'
         },
         {
+            dns         => undef,
+            IPGATEWAY   => undef,
+            IPADDRESS6  => undef,
+            IPMASK6     => undef,
+            IPSUBNET6   => undef,
+            IPADDRESS   => undef,
+            IPMASK      => undef,
+            IPSUBNET    => undef,
             MTU         => undef,
             MACADDR     => '00:26:83:12:FB:0B',
             STATUS      => 'Up',
@@ -51,6 +59,141 @@ my %tests = (
             SPEED       => 0
         },
     ],
+    xp => [
+        {
+            dns         => undef,
+            IPADDRESS6  => undef,
+            IPMASK6     => undef,
+            IPSUBNET6   => undef,
+            IPADDRESS   => undef,
+            IPMASK      => undef,
+            IPSUBNET    => undef,
+            IPGATEWAY   => undef,
+            VIRTUALDEV  => 1,
+            PNPDEVICEID => 'ROOT\\MS_PPTPMINIPORT\\0000',
+            MACADDR     => '50:50:54:50:30:30',
+            STATUS      => 'Up',
+            TYPE        => "Red de \x{e1}rea extensa (WAN)",
+            SPEED       => undef,
+            IPDHCP      => undef,
+            MTU         => undef,
+            DESCRIPTION => 'Minipuerto WAN (PPTP)'
+        },
+        {
+            dns         => undef,
+            IPADDRESS6  => undef,
+            IPMASK6     => undef,
+            IPSUBNET6   => undef,
+            IPADDRESS   => undef,
+            IPMASK      => undef,
+            IPSUBNET    => undef,
+            IPGATEWAY   => undef,
+            VIRTUALDEV  => 1,
+            PNPDEVICEID => 'ROOT\\MS_PPPOEMINIPORT\\0000',
+            MACADDR     => '33:50:6F:45:30:30',
+            STATUS      => 'Up',
+            TYPE        => "Red de \x{e1}rea extensa (WAN)",
+            SPEED       => undef,
+            IPDHCP      => undef,
+            MTU         => undef,
+            DESCRIPTION => 'Minipuerto WAN (PPPOE)'
+        },
+        {
+            dns         => undef,
+            IPADDRESS6  => undef,
+            IPMASK6     => undef,
+            IPSUBNET6   => undef,
+            IPADDRESS   => undef,
+            IPMASK      => undef,
+            IPSUBNET    => undef,
+            IPGATEWAY   => undef,
+            VIRTUALDEV  => 1,
+            PNPDEVICEID => 'ROOT\\MS_PSCHEDMP\\0000',
+            MACADDR     => '26:0F:20:52:41:53',
+            STATUS      => 'Up',
+            TYPE        => 'Ethernet',
+            SPEED       => undef,
+            IPDHCP      => undef,
+            MTU         => undef,
+            DESCRIPTION => 'Minipuerto del administrador de paquetes'
+        },
+        {
+            dns         => '10.36.6.100',
+            IPMASK      => [ '255.255.254.0' ],
+            IPGATEWAY   => '10.36.6.1',
+            VIRTUALDEV  => 0,
+            PNPDEVICEID => 'PCI\\VEN_14E4&DEV_1677&SUBSYS_3006103C&REV_01\\4&1886B119&0&00E1',
+            MACADDR     => '00:14:C2:0D:B0:FB',
+            STATUS      => 'Up',
+            TYPE        => 'Ethernet',
+            SPEED       => undef,
+            IPDHCP      => '10.36.6.100',
+            IPSUBNET    => [ '10.36.6.0' ],
+            MTU         => undef,
+            DESCRIPTION => 'Broadcom NetXtreme Gigabit Ethernet - Teefer2 Miniport',
+            IPADDRESS => [ '10.36.6.30' ],
+            IPADDRESS6  => undef,
+            IPMASK6     => undef,
+            IPSUBNET6   => undef,
+        },
+        {
+            dns         => undef,
+            IPADDRESS6  => undef,
+            IPMASK6     => undef,
+            IPSUBNET6   => undef,
+            IPADDRESS   => undef,
+            IPMASK      => undef,
+            IPSUBNET    => undef,
+            IPGATEWAY   => undef,
+            VIRTUALDEV  => 1,
+            PNPDEVICEID => 'ROOT\\MS_PSCHEDMP\\0002',
+            MACADDR     => '00:14:C2:0D:B0:FB',
+            STATUS      => 'Up',
+            TYPE        => 'Ethernet',
+            SPEED       => undef,
+            IPDHCP      => undef,
+            MTU         => undef,
+            DESCRIPTION => 'Minipuerto del administrador de paquetes'
+        },
+        {
+            dns         => undef,
+            IPADDRESS6  => undef,
+            IPMASK6     => undef,
+            IPSUBNET6   => undef,
+            IPADDRESS   => undef,
+            IPMASK      => undef,
+            IPSUBNET    => undef,
+            IPGATEWAY   => undef,
+            VIRTUALDEV  => 1,
+            PNPDEVICEID => 'ROOT\\SYMC_TEEFER2MP\\0000',
+            MACADDR     => '00:14:C2:0D:B0:FB',
+            STATUS      => 'Up',
+            TYPE        => 'Ethernet',
+            SPEED       => undef,
+            IPDHCP      => undef,
+            MTU         => undef,
+            DESCRIPTION => 'Teefer2 Miniport'
+        },
+        {
+            dns         => undef,
+            IPADDRESS6  => undef,
+            IPMASK6     => undef,
+            IPSUBNET6   => undef,
+            IPADDRESS   => undef,
+            IPMASK      => undef,
+            IPSUBNET    => undef,
+            IPGATEWAY   => undef,
+            VIRTUALDEV  => 1,
+            PNPDEVICEID => 'ROOT\\SYMC_TEEFER2MP\\0002',
+            MACADDR     => '26:0F:20:52:41:53',
+            STATUS      => 'Up',
+            TYPE        => 'Ethernet',
+            SPEED       => undef,
+            IPDHCP      => undef,
+            MTU         => undef,
+            DESCRIPTION => 'Teefer2 Miniport'
+        }
+    ]
 );
 
 plan tests => scalar keys %tests;
diff --git a/t/tools/generic.t b/t/tools/generic.t
index 12090c8..671d570 100755
--- a/t/tools/generic.t
+++ b/t/tools/generic.t
@@ -6188,13 +6188,12 @@ foreach my $test (keys %dmidecode_tests) {
     my $file = "resources/generic/dmidecode/$test";
     my $infos = getDmidecodeInfos(file => $file);
     is_deeply($infos, $dmidecode_tests{$test}, "$test dmidecode parsing");
-    use Data::Dumper;
 }
 
 foreach my $test (keys %cpu_tests) {
     my $file = "resources/generic/dmidecode/$test";
     my @cpus = getCpusFromDmidecode(file => $file);
-    is_deeply(\@cpus, $cpu_tests{$test}, "$test dmidecode cpu extraction") or print Dumper(\@cpus);
+    is_deeply(\@cpus, $cpu_tests{$test}, "$test dmidecode cpu extraction");
 }
 
 foreach my $test (keys %lspci_tests) {
diff --git a/t/tools/macos.t b/t/tools/macos.t
index 34aefd5..164f94f 100755
--- a/t/tools/macos.t
+++ b/t/tools/macos.t
@@ -2844,170 +2844,333 @@ my %system_profiler_tests = (
     }
 );
 
-my %ioreg_tests = (
-    IOUSBDevice => [
-        {
-            'IOGeneralInterest' => 'IOCommand is not serializable',
-            'USB Address' => '2',
-            'Requested Power' => '20',
-            'idProduct' => '539',
-            'bMaxPacketSize0' => '8',
-            'USB Vendor Name' => 'Apple Computer',
-            'sessionID' => '922879256',
-            'bNumConfigurations' => '1',
-            'bDeviceProtocol' => '0',
-            'Bus Power Available' => '250',
-            'Device Speed' => '1',
-            'USB Product Name' => 'Apple Internal Keyboard / Trackpad',
-            'iProduct' => '2',
-            'IOUserClientClass' => 'IOUSBDeviceUserClientV2',
-            'non-removable' => 'yes',
-            'bDeviceClass' => '0',
-            'bDeviceSubClass' => '0',
-            'PortNum' => '2',
-            'bcdDevice' => '24',
-            'locationID' => '488636416',
-            'iManufacturer' => '1',
-            'iSerialNumber' => '0',
-            'idVendor' => '1452'
-        },
-        {
-            'IOGeneralInterest' => 'IOCommand is not serializable',
-            'USB Address' => '2',
-            'Requested Power' => '50',
-            'idProduct' => '33344',
-            'bMaxPacketSize0' => '8',
-            'USB Vendor Name' => 'Apple Computer, Inc.',
-            'sessionID' => '944991920',
-            'bNumConfigurations' => '1',
-            'bDeviceProtocol' => '0',
-            'Bus Power Available' => '250',
-            'Device Speed' => '1',
-            'USB Product Name' => 'IR Receiver',
-            'iProduct' => '2',
-            'IOUserClientClass' => 'IOUSBDeviceUserClientV2',
-            'non-removable' => 'yes',
-            'bDeviceClass' => '0',
-            'bDeviceSubClass' => '0',
-            'PortNum' => '2',
-            'bcdDevice' => '272',
-            'locationID' => '1562378240',
-            'iManufacturer' => '1',
-            'iSerialNumber' => '0',
-            'idVendor' => '1452'
-        },
-        {
-            'IOGeneralInterest' => 'IOCommand is not serializable',
-            'USB Address' => '2',
-            'Requested Power' => '0',
-            'idProduct' => '33285',
-            'bMaxPacketSize0' => '64',
-            'USB Vendor Name' => 'Apple Inc.',
-            'sessionID' => '3290864968',
-            'bNumConfigurations' => '1',
-            'bDeviceProtocol' => '1',
-            'Bus Power Available' => '250',
-            'Device Speed' => '1',
-            'iProduct' => '0',
-            'IOUserClientClass' => 'IOUSBDeviceUserClientV2',
-            'USB Product Name' => 'Bluetooth USB Host Controller',
-            'PortNum' => '1',
-            'bDeviceClass' => '224',
-            'bDeviceSubClass' => '1',
-            'non-removable' => 'yes',
-            'bcdDevice' => '6501',
-            'locationID' => '2098200576',
-            'iManufacturer' => '0',
-            'iSerialNumber' => '0',
-            'idVendor' => '1452'
-        },
-        {
-            'IOGeneralInterest' => 'IOCommand is not serializable',
-            'USB Address' => '2',
-            'Requested Power' => '50',
-            'idProduct' => '34049',
-            'bMaxPacketSize0' => '64',
-            'USB Vendor Name' => 'Micron',
-            'sessionID' => '2717373407',
-            'bNumConfigurations' => '1',
-            'bDeviceProtocol' => '255',
-            'Bus Power Available' => '250',
-            'Device Speed' => '2',
-            'USB Product Name' => 'Built-in iSight',
-            'iProduct' => '2',
-            'IOUserClientClass' => 'IOUSBDeviceUserClientV2',
-            'non-removable' => 'yes',
-            'bDeviceClass' => '255',
-            'bDeviceSubClass' => '255',
-            'PortNum' => '4',
-            'bcdDevice' => '393',
-            'locationID' => '18446744073663414272',
-            'iManufacturer' => '1',
-            'iSerialNumber' => '0',
-            'idVendor' => '1452'
-        },
-        {
-            'IOGeneralInterest' => 'IOCommand is not serializable',
-            'USB Address' => '3',
-            'Requested Power' => '50',
-            'idProduct' => '24613',
-            'bMaxPacketSize0' => '64',
-            'USB Vendor Name' => 'CBM',
-            'sessionID' => '3995793432240',
-            'bNumConfigurations' => '1',
-            'bDeviceProtocol' => '0',
-            'Bus Power Available' => '250',
-            'uid' => 'USB:197660250078C5C90000',
-            'Device Speed' => '2',
-            'USB Product Name' => 'Flash Disk',
-            'iProduct' => '2',
-            'IOUserClientClass' => 'IOUSBDeviceUserClientV2',
-            'bDeviceClass' => '0',
-            'bDeviceSubClass' => '0',
-            'PortNum' => '3',
-            'bcdDevice' => '256',
-            'locationID' => '18446744073662365696',
-            'iManufacturer' => '1',
-            'iSerialNumber' => '3',
-            'idVendor' => '6518',
-            'USB Serial Number' => '16270078C5C90000'
-        }
-    ],
-    IOPlatformExpertDevice => [
-        {
-            'IOPlatformUUID' => '00000000-0000-1000-8000-001B633026B1',
-            'IOBusyInterest' => 'IOCommand is not serializable',
-            'IOPlatformSerialNumber' => 'W87305UMYA8',
-            'IOPolledInterface' => 'SMCPolledInterface is not serializable',
-            'compatible' => 'MacBook2,1',
-            'model' => 'MacBook2,1',
-            'serial-number' => '59413800000000000000000000573837333035554',
-            'version' => '1.0',
-            'name' => '/',
-            'board-id' => 'Mac-F4208CAA',
-            'clock-frequency' => '00',
-            'system-type' => '02',
-            'manufacturer' => 'Apple Inc.',
-            'product-name' => 'MacBook2,1',
-            'IOPlatformArgs' => '0030'
-        }
-    ]
+my @ioreg_tests = (
+    {
+        file    => 'IOUSBDevice1',
+        class   => 'IOUSBDevice',
+        results => [
+            {
+                'IOGeneralInterest' => 'IOCommand is not serializable',
+                'USB Address' => '2',
+                'Requested Power' => '20',
+                'idProduct' => '539',
+                'bMaxPacketSize0' => '8',
+                'USB Vendor Name' => 'Apple Computer',
+                'sessionID' => '922879256',
+                'bNumConfigurations' => '1',
+                'bDeviceProtocol' => '0',
+                'Bus Power Available' => '250',
+                'Device Speed' => '1',
+                'USB Product Name' => 'Apple Internal Keyboard / Trackpad',
+                'iProduct' => '2',
+                'IOUserClientClass' => 'IOUSBDeviceUserClientV2',
+                'non-removable' => 'yes',
+                'bDeviceClass' => '0',
+                'bDeviceSubClass' => '0',
+                'PortNum' => '2',
+                'bcdDevice' => '24',
+                'locationID' => '488636416',
+                'iManufacturer' => '1',
+                'iSerialNumber' => '0',
+                'idVendor' => '1452'
+            },
+            {
+                'IOGeneralInterest' => 'IOCommand is not serializable',
+                'USB Address' => '2',
+                'Requested Power' => '50',
+                'idProduct' => '33344',
+                'bMaxPacketSize0' => '8',
+                'USB Vendor Name' => 'Apple Computer, Inc.',
+                'sessionID' => '944991920',
+                'bNumConfigurations' => '1',
+                'bDeviceProtocol' => '0',
+                'Bus Power Available' => '250',
+                'Device Speed' => '1',
+                'USB Product Name' => 'IR Receiver',
+                'iProduct' => '2',
+                'IOUserClientClass' => 'IOUSBDeviceUserClientV2',
+                'non-removable' => 'yes',
+                'bDeviceClass' => '0',
+                'bDeviceSubClass' => '0',
+                'PortNum' => '2',
+                'bcdDevice' => '272',
+                'locationID' => '1562378240',
+                'iManufacturer' => '1',
+                'iSerialNumber' => '0',
+                'idVendor' => '1452'
+            },
+            {
+                'IOGeneralInterest' => 'IOCommand is not serializable',
+                'USB Address' => '2',
+                'Requested Power' => '0',
+                'idProduct' => '33285',
+                'bMaxPacketSize0' => '64',
+                'USB Vendor Name' => 'Apple Inc.',
+                'sessionID' => '3290864968',
+                'bNumConfigurations' => '1',
+                'bDeviceProtocol' => '1',
+                'Bus Power Available' => '250',
+                'Device Speed' => '1',
+                'iProduct' => '0',
+                'IOUserClientClass' => 'IOUSBDeviceUserClientV2',
+                'USB Product Name' => 'Bluetooth USB Host Controller',
+                'PortNum' => '1',
+                'bDeviceClass' => '224',
+                'bDeviceSubClass' => '1',
+                'non-removable' => 'yes',
+                'bcdDevice' => '6501',
+                'locationID' => '2098200576',
+                'iManufacturer' => '0',
+                'iSerialNumber' => '0',
+                'idVendor' => '1452'
+            },
+            {
+                'IOGeneralInterest' => 'IOCommand is not serializable',
+                'USB Address' => '2',
+                'Requested Power' => '50',
+                'idProduct' => '34049',
+                'bMaxPacketSize0' => '64',
+                'USB Vendor Name' => 'Micron',
+                'sessionID' => '2717373407',
+                'bNumConfigurations' => '1',
+                'bDeviceProtocol' => '255',
+                'Bus Power Available' => '250',
+                'Device Speed' => '2',
+                'USB Product Name' => 'Built-in iSight',
+                'iProduct' => '2',
+                'IOUserClientClass' => 'IOUSBDeviceUserClientV2',
+                'non-removable' => 'yes',
+                'bDeviceClass' => '255',
+                'bDeviceSubClass' => '255',
+                'PortNum' => '4',
+                'bcdDevice' => '393',
+                'locationID' => '18446744073663414272',
+                'iManufacturer' => '1',
+                'iSerialNumber' => '0',
+                'idVendor' => '1452'
+            },
+            {
+                'IOGeneralInterest' => 'IOCommand is not serializable',
+                'USB Address' => '3',
+                'Requested Power' => '50',
+                'idProduct' => '24613',
+                'bMaxPacketSize0' => '64',
+                'USB Vendor Name' => 'CBM',
+                'sessionID' => '3995793432240',
+                'bNumConfigurations' => '1',
+                'bDeviceProtocol' => '0',
+                'Bus Power Available' => '250',
+                'uid' => 'USB:197660250078C5C90000',
+                'Device Speed' => '2',
+                'USB Product Name' => 'Flash Disk',
+                'iProduct' => '2',
+                'IOUserClientClass' => 'IOUSBDeviceUserClientV2',
+                'bDeviceClass' => '0',
+                'bDeviceSubClass' => '0',
+                'PortNum' => '3',
+                'bcdDevice' => '256',
+                'locationID' => '18446744073662365696',
+                'iManufacturer' => '1',
+                'iSerialNumber' => '3',
+                'idVendor' => '6518',
+                'USB Serial Number' => '16270078C5C90000'
+            }
+        ],
+    },
+    {
+        file    => 'IOUSBDevice2',
+        class   => 'IOUSBDevice',
+        results => [
+            {
+                'IOGeneralInterest' => 'IOCommand is not serializable',
+                'USB Address' => '3',
+                'Requested Power' => '50',
+                'idProduct' => '54',
+                'bMaxPacketSize0' => '8',
+                'USB Vendor Name' => 'Genius',
+                'sessionID' => '1035836159',
+                'bNumConfigurations' => '1',
+                'bDeviceProtocol' => '0',
+                'Bus Power Available' => '250',
+                'Device Speed' => '0',
+                'USB Product Name' => 'NetScroll + Mini Traveler',
+                'iProduct' => '1',
+                'IOUserClientClass' => 'IOUSBDeviceUserClientV2',
+                'bDeviceClass' => '0',
+                'bDeviceSubClass' => '0',
+                'PortNum' => '2',
+                'bcdDevice' => '272',
+                'locationID' => '438304768',
+                'iManufacturer' => '2',
+                'iSerialNumber' => '0',
+                'idVendor' => '1112'
+            },
+            {
+                'IOGeneralInterest' => 'IOCommand is not serializable',
+                'USB Address' => '2',
+                'Requested Power' => '0',
+                'idProduct' => '33286',
+                'bMaxPacketSize0' => '64',
+                'USB Vendor Name' => 'Apple Inc.',
+                'sessionID' => '3009829809',
+                'bNumConfigurations' => '1',
+                'bDeviceProtocol' => '1',
+                'Bus Power Available' => '250',
+                'Device Speed' => '1',
+                'iProduct' => '0',
+                'IOUserClientClass' => 'IOUSBDeviceUserClientV2',
+                'USB Product Name' => 'Bluetooth USB Host Controller',
+                'PortNum' => '1',
+                'bDeviceClass' => '224',
+                'bDeviceSubClass' => '1',
+                'non-removable' => 'yes',
+                'bcdDevice' => '6501',
+                'locationID' => '437256192',
+                'iManufacturer' => '0',
+                'iSerialNumber' => '0',
+                'idVendor' => '1452'
+            },
+            {
+                'IOGeneralInterest' => 'IOCommand is not serializable',
+                'USB Address' => '3',
+                'Requested Power' => '10',
+                'idProduct' => '545',
+                'bMaxPacketSize0' => '8',
+                'USB Vendor Name' => 'Apple, Inc',
+                'sessionID' => '1018522533',
+                'bNumConfigurations' => '1',
+                'bDeviceProtocol' => '0',
+                'Bus Power Available' => '50',
+                'Device Speed' => '0',
+                'USB Product Name' => 'Apple Keyboard',
+                'iProduct' => '2',
+                'IOUserClientClass' => 'IOUSBDeviceUserClientV2',
+                'non-removable' => 'yes',
+                'bDeviceClass' => '0',
+                'bDeviceSubClass' => '0',
+                'PortNum' => '2',
+                'bcdDevice' => '105',
+                'locationID' => '18446744073613213696',
+                'iManufacturer' => '1',
+                'iSerialNumber' => '0',
+                'idVendor' => '1452'
+            },
+            {
+                'IOGeneralInterest' => 'IOCommand is not serializable',
+                'USB Address' => '2',
+                'Requested Power' => '50',
+                'idProduct' => '33346',
+                'bMaxPacketSize0' => '8',
+                'USB Vendor Name' => 'Apple Computer, Inc.',
+                'sessionID' => '1116620200',
+                'bNumConfigurations' => '1',
+                'bDeviceProtocol' => '0',
+                'Bus Power Available' => '250',
+                'Device Speed' => '0',
+                'USB Product Name' => 'IR Receiver',
+                'iProduct' => '2',
+                'IOUserClientClass' => 'IOUSBDeviceUserClientV2',
+                'non-removable' => 'yes',
+                'bDeviceClass' => '0',
+                'bDeviceSubClass' => '0',
+                'PortNum' => '1',
+                'bcdDevice' => '22',
+                'locationID' => '1561329664',
+                'iManufacturer' => '1',
+                'iSerialNumber' => '0',
+                'idVendor' => '1452'
+            },
+            {
+                'IOGeneralInterest' => 'IOCommand is not serializable',
+                'USB Address' => '2',
+                'Requested Power' => '1',
+                'idProduct' => '4138',
+                'bMaxPacketSize0' => '64',
+                'USB Vendor Name' => 'LaCie',
+                'sessionID' => '637721320',
+                'bNumConfigurations' => '1',
+                'bDeviceProtocol' => '0',
+                'Bus Power Available' => '250',
+                'uid' => 'USB:059F102A6E7A5FFFFFFF',
+                'Device Speed' => '2',
+                'USB Product Name' => 'LaCie Device',
+                'iProduct' => '11',
+                'IOUserClientClass' => 'IOUSBDeviceUserClientV2',
+                'bDeviceClass' => '0',
+                'bDeviceSubClass' => '0',
+                'PortNum' => '1',
+                'bcdDevice' => '256',
+                'locationID' => '18446744073660268544',
+                'iManufacturer' => '10',
+                'iSerialNumber' => '5',
+                'idVendor' => '1439',
+                'USB Serial Number' => '6E7A5FFFFFFF'
+            },
+            {
+                'IOGeneralInterest' => 'IOCommand is not serializable',
+                'USB Address' => '3',
+                'Requested Power' => '250',
+                'idProduct' => '34050',
+                'bMaxPacketSize0' => '64',
+                'USB Vendor Name' => 'Apple Inc.',
+                'sessionID' => '791376929',
+                'bNumConfigurations' => '1',
+                'bDeviceProtocol' => '1',
+                'Bus Power Available' => '250',
+                'Device Speed' => '2',
+                'USB Product Name' => 'Built-in iSight',
+                'iProduct' => '2',
+                'IOUserClientClass' => 'IOUSBDeviceUserClientV2',
+                'non-removable' => 'yes',
+                'bDeviceClass' => '239',
+                'bDeviceSubClass' => '2',
+                'PortNum' => '4',
+                'bcdDevice' => '341',
+                'locationID' => '18446744073663414272',
+                'iManufacturer' => '1',
+                'iSerialNumber' => '3',
+                'idVendor' => '1452',
+                'USB Serial Number' => '6067E773DA9722F4 (03.01)'
+            }
+        ]
+    },
+    {
+        file   => 'IOPlatformExpertDevice',
+        class  => 'IOPlatformExpertDevice',
+        results => [
+            {
+                'IOPlatformUUID' => '00000000-0000-1000-8000-001B633026B1',
+                'IOBusyInterest' => 'IOCommand is not serializable',
+                'IOPlatformSerialNumber' => 'W87305UMYA8',
+                'IOPolledInterface' => 'SMCPolledInterface is not serializable',
+                'compatible' => 'MacBook2,1',
+                'model' => 'MacBook2,1',
+                'serial-number' => '59413800000000000000000000573837333035554',
+                'version' => '1.0',
+                'name' => '/',
+                'board-id' => 'Mac-F4208CAA',
+                'clock-frequency' => '00',
+                'system-type' => '02',
+                'manufacturer' => 'Apple Inc.',
+                'product-name' => 'MacBook2,1',
+                'IOPlatformArgs' => '0030'
+            }
+        ],
+    }
 );
 
 plan tests => 
     scalar (keys %system_profiler_tests) + 
-    scalar (keys %ioreg_tests);
-
+    scalar @ioreg_tests;
 
 foreach my $test (keys %system_profiler_tests) {
     my $file = "resources/macos/system_profiler/$test";
     my $infos = getSystemProfilerInfos(file => $file);
     is_deeply($infos, $system_profiler_tests{$test}, "$test system profiler parsing");
-    use Data::Dumper;
 }
 
-foreach my $test (keys %ioreg_tests) {
-    my $file = "resources/macos/ioreg/$test";
-    my @devices = getIODevices(file => $file, class => $test);
-    is_deeply(\@devices, $ioreg_tests{$test}, "$test ioreg parsing");
+foreach my $test (@ioreg_tests) {
+    my $file = "resources/macos/ioreg/$test->{file}";
+    my @devices = getIODevices(file => $file, class => $test->{class});
+    is_deeply(\@devices, $test->{results}, "$test->{file} ioreg parsing");
 }


================================================================
  Commit: 53339ac847285280542b7dc598f6ecfba43cb973
      https://github.com/fusinv/fusioninventory-agent/commit/53339ac847285280542b7dc598f6ecfba43cb973
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-19 (Mon, 19 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/HTTP/Client/Fusion.pm
    M lib/FusionInventory/Agent/HTTP/Client/OCS.pm
    M lib/FusionInventory/Agent/Task/Inventory.pm
    M lib/FusionInventory/Agent/Tools/Screen.pm

  Log Message:
  -----------
  make perlcritic happy


diff --git a/lib/FusionInventory/Agent/HTTP/Client/Fusion.pm b/lib/FusionInventory/Agent/HTTP/Client/Fusion.pm
index 87460a9..6ee5e7c 100644
--- a/lib/FusionInventory/Agent/HTTP/Client/Fusion.pm
+++ b/lib/FusionInventory/Agent/HTTP/Client/Fusion.pm
@@ -36,7 +36,7 @@ sub _prepareVal {
     return uri_escape($val);
 }
 
-sub send {
+sub send { ## no critic (ProhibitBuiltinHomonyms)
     my ($self, %params) = @_;
 
     push @{$self->{msgStack}}, $params{args} if $self->{debug};
diff --git a/lib/FusionInventory/Agent/HTTP/Client/OCS.pm b/lib/FusionInventory/Agent/HTTP/Client/OCS.pm
index 9c001f4..a65822b 100644
--- a/lib/FusionInventory/Agent/HTTP/Client/OCS.pm
+++ b/lib/FusionInventory/Agent/HTTP/Client/OCS.pm
@@ -50,7 +50,7 @@ sub new {
     return $self;
 }
 
-sub send {
+sub send { ## no critic (ProhibitBuiltinHomonyms)
     my ($self, %params) = @_;
 
     my $url = ref $params{url} eq 'URI' ?
diff --git a/lib/FusionInventory/Agent/Task/Inventory.pm b/lib/FusionInventory/Agent/Task/Inventory.pm
index ce3eb4c..13dc0b0 100644
--- a/lib/FusionInventory/Agent/Task/Inventory.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory.pm
@@ -190,8 +190,8 @@ sub _initModulesList {
 
     # second pass: disable fallback modules
     foreach my $module (@modules) {
-        ## no critic (ProhibitNoStrict ProhibitProlongedStrictureOverride)
-        no strict 'refs';
+        ## no critic (ProhibitProlongedStrictureOverride)
+        no strict 'refs'; ## no critic (ProhibitNoStrict)
 
         # skip modules already disabled
         next unless $self->{modules}->{$module}->{enabled};
diff --git a/lib/FusionInventory/Agent/Tools/Screen.pm b/lib/FusionInventory/Agent/Tools/Screen.pm
index d3dddcb..5cb71db 100644
--- a/lib/FusionInventory/Agent/Tools/Screen.pm
+++ b/lib/FusionInventory/Agent/Tools/Screen.pm
@@ -192,7 +192,7 @@ sub checkParsedEdid {
 sub parseEdid {
     my ($raw_edid) = @_;
 
-    no warnings 'uninitialized';
+    no warnings 'uninitialized'; ## no critic (ProhibitNoWarnings)
 
     my %edid;
     my @vals = unpack(join('', map { $_->[0] } @edid_info), $raw_edid);


================================================================
  Commit: a32bb8f0de834e009c74af0fc89d9d9eb4e86eb2
      https://github.com/fusinv/fusioninventory-agent/commit/a32bb8f0de834e009c74af0fc89d9d9eb4e86eb2
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-19 (Mon, 19 Mar 2012)

  Changed paths:
    A resources/generic/dmidecode/windows-xp

  Log Message:
  -----------
  initial import


diff --git a/resources/generic/dmidecode/windows-xp b/resources/generic/dmidecode/windows-xp
new file mode 100644
index 0000000..6b999c7
--- /dev/null
+++ b/resources/generic/dmidecode/windows-xp
@@ -0,0 +1,586 @@
+# dmidecode 2.11
+SMBIOS 2.4 present.
+57 structures occupying 2822 bytes.
+Table at 0x000F6570.
+
+Handle 0xDA00, DMI type 218, 251 bytes
+OEM-specific Type
+	Header and Data:
+		DA FB 00 DA B2 00 0D 5F 1F 37 40 7D 00 00 00 00
+		00 40 00 02 00 01 00 41 00 02 00 00 00 65 00 03
+		00 00 00 66 00 03 00 01 00 F1 00 04 00 00 00 F2
+		00 04 00 01 00 F3 00 04 00 02 00 0F 00 05 00 00
+		00 11 00 05 00 01 00 05 00 05 00 02 00 12 00 05
+		00 03 00 06 00 05 00 04 00 07 00 06 00 00 00 0B
+		00 06 00 01 00 0C 00 06 00 02 00 0D 00 06 00 03
+		00 89 01 07 00 00 00 8A 01 07 00 01 00 42 00 08
+		00 01 00 43 00 08 00 00 00 55 00 09 00 00 00 6D
+		00 09 00 01 00 16 02 09 00 02 00 98 01 09 00 03
+		00 0A 01 0A 00 01 00 0B 01 0A 00 00 00 2D 00 0B
+		00 02 00 6E 00 0B 00 01 00 2E 00 0B 00 00 00 11
+		01 0C 00 00 00 10 01 0C 00 01 00 F0 00 0D 00 01
+		00 ED 00 0D 00 00 00 41 01 0E 00 01 00 40 01 0E
+		00 00 00 47 01 0F 00 01 00 46 01 0F 00 00 00 4A
+		01 10 00 00 00 FF FF 00 00 00 00
+
+Handle 0xDA01, DMI type 218, 251 bytes
+OEM-specific Type
+	Header and Data:
+		DA FB 01 DA B2 00 0D 5F 1F 37 40 4B 01 10 00 01
+		00 04 02 11 00 00 00 05 02 11 00 01 00 02 02 12
+		00 00 00 03 02 12 00 01 00 52 01 13 00 01 00 53
+		01 13 00 00 00 80 01 14 00 01 00 7F 01 14 00 00
+		00 7C 01 15 00 01 00 7B 01 15 00 00 00 E8 02 16
+		00 00 00 E9 02 16 00 01 00 7E 01 17 00 01 00 7D
+		01 17 00 00 00 92 01 18 00 00 00 91 01 18 00 01
+		00 94 01 19 00 00 00 93 01 19 00 01 00 86 01 1A
+		00 01 00 85 01 1A 00 00 00 82 01 1B 00 01 00 81
+		01 1B 00 00 00 84 01 1C 00 01 00 83 01 1C 00 00
+		00 9B 01 1D 00 00 00 9C 01 1D 00 01 00 9D 01 1D
+		00 02 00 9E 01 1D 00 03 00 8D 01 1E 00 00 00 8E
+		01 1E 00 01 00 85 02 1F 00 00 00 86 02 1F 00 01
+		00 EA 00 20 00 00 00 EB 00 20 00 01 00 EC 00 20
+		00 02 00 A1 00 21 00 00 00 A3 00 21 00 01 00 28
+		00 22 00 00 00 FF FF 00 00 00 00
+
+Handle 0xDA02, DMI type 218, 251 bytes
+OEM-specific Type
+	Header and Data:
+		DA FB 02 DA B2 00 0D 5F 1F 37 40 29 00 22 00 01
+		00 2A 00 22 00 02 00 2B 00 23 00 00 00 2C 00 24
+		00 00 00 0E 01 25 00 01 00 0F 01 25 00 00 00 9B
+		00 26 00 01 00 9C 00 26 00 00 00 4D 01 27 00 01
+		00 4C 01 27 00 00 00 87 01 28 00 00 00 88 01 28
+		00 01 00 35 01 29 00 03 00 37 01 29 00 00 00 38
+		01 29 00 01 00 39 01 29 00 02 00 D9 01 2A 00 01
+		00 D8 01 2A 00 00 00 DF 01 2B 00 01 00 DE 01 2B
+		00 00 00 45 02 2C 00 00 00 44 02 2C 00 01 00 49
+		02 2D 00 00 00 48 02 2D 00 01 00 45 01 45 01 01
+		00 44 01 44 01 00 00 76 01 76 01 01 00 75 01 75
+		01 01 00 9F 00 9F 00 00 00 A0 00 A0 00 01 00 E1
+		01 E1 01 00 00 E3 01 E3 01 01 00 E2 01 E2 01 02
+		00 29 02 29 02 01 00 28 02 28 02 02 00 2A 02 2A
+		02 03 00 30 02 30 02 01 00 2F 02 2F 02 00 00 35
+		02 35 02 01 00 FF FF 00 00 00 00
+
+Handle 0xDA03, DMI type 218, 77 bytes
+OEM-specific Type
+	Header and Data:
+		DA 4D 03 DA B2 00 0D 5F 1F 37 40 36 02 36 02 00
+		00 37 02 37 02 02 00 4A 02 4A 02 01 00 0C 80 0C
+		80 01 00 6C 02 6C 02 01 00 6D 02 6D 02 00 00 01
+		F0 01 F0 00 00 02 F0 02 F0 00 00 03 F0 03 F0 00
+		00 04 F0 04 F0 00 00 FF FF 00 00 00 00
+
+Handle 0x0000, DMI type 0, 24 bytes
+BIOS Information
+	Vendor: Dell Inc.
+	Version: A24
+	Release Date: 08/19/2010
+	Address: 0xF0000
+	Runtime Size: 64 kB
+	ROM Size: 1728 kB
+	Characteristics:
+		ISA is supported
+		PCI is supported
+		PC Card (PCMCIA) is supported
+		PNP is supported
+		BIOS is upgradeable
+		BIOS shadowing is allowed
+		Boot from CD is supported
+		Selectable boot is supported
+		3.5"/720 kB floppy services are supported (int 13h)
+		Print screen service is supported (int 5h)
+		8042 keyboard services are supported (int 9h)
+		Serial services are supported (int 14h)
+		Printer services are supported (int 17h)
+		CGA/mono video services are supported (int 10h)
+		ACPI is supported
+		USB legacy is supported
+		AGP is supported
+		Smart battery is supported
+		BIOS boot specification is supported
+		Function key-initiated network boot is supported
+		Targeted content distribution is supported
+	BIOS Revision: 2.4
+	Firmware Revision: 2.4
+
+Handle 0x0100, DMI type 1, 27 bytes
+System Information
+	Manufacturer: Dell Inc.
+	Product Name: Precision M4400                 
+	Version: Not Specified
+	Serial Number: HLG964J
+	UUID: 44454C4C-4C00-1047-8039-C8C04F36344A
+	Wake-up Type: Power Switch
+	SKU Number: Not Specified
+	Family:  
+
+Handle 0x0200, DMI type 2, 9 bytes
+Base Board Information
+	Manufacturer: Dell Inc.
+	Product Name: 0P019G
+	Version:    
+	Serial Number: .HLG964J.CN129618C52450.
+	Asset Tag:           
+
+Handle 0x0300, DMI type 3, 13 bytes
+Chassis Information
+	Manufacturer: Dell Inc.
+	Type: Portable
+	Lock: Not Present
+	Version: Not Specified
+	Serial Number: HLG964J
+	Asset Tag: Not Specified
+	Boot-up State: Safe
+	Power Supply State: Safe
+	Thermal State: Safe
+	Security Status: None
+
+Handle 0x0400, DMI type 4, 40 bytes
+Processor Information
+	Socket Designation: Microprocessor
+	Type: Central Processor
+	Family: Core 2 Duo
+	Manufacturer: Intel
+	ID: 76 06 01 00 FF FB EB BF
+	Signature: Type 0, Family 6, Model 23, Stepping 6
+	Flags:
+		FPU (Floating-point unit on-chip)
+		VME (Virtual mode extension)
+		DE (Debugging extension)
+		PSE (Page size extension)
+		TSC (Time stamp counter)
+		MSR (Model specific registers)
+		PAE (Physical address extension)
+		MCE (Machine check exception)
+		CX8 (CMPXCHG8 instruction supported)
+		APIC (On-chip APIC hardware supported)
+		SEP (Fast system call)
+		MTRR (Memory type range registers)
+		PGE (Page global enable)
+		MCA (Machine check architecture)
+		CMOV (Conditional move instruction supported)
+		PAT (Page attribute table)
+		PSE-36 (36-bit page size extension)
+		CLFSH (CLFLUSH instruction supported)
+		DS (Debug store)
+		ACPI (ACPI supported)
+		MMX (MMX technology supported)
+		FXSR (FXSAVE and FXSTOR instructions supported)
+		SSE (Streaming SIMD extensions)
+		SSE2 (Streaming SIMD extensions 2)
+		SS (Self-snoop)
+		HTT (Multi-threading)
+		TM (Thermal monitor supported)
+		PBE (Pending break enabled)
+	Version: Not Specified
+	Voltage: 3.3 V
+	External Clock: 266 MHz
+	Max Speed: 2534 MHz
+	Current Speed: 2534 MHz
+	Status: Populated, Enabled
+	Upgrade: None
+	L1 Cache Handle: 0x0700
+	L2 Cache Handle: 0x0701
+	L3 Cache Handle: Not Provided
+	Serial Number: Not Specified
+	Asset Tag: Not Specified
+	Part Number: Not Specified
+	Core Count: 2
+	Core Enabled: 2
+	Thread Count: 2
+	Characteristics:
+		64-bit capable
+
+Handle 0x0700, DMI type 7, 19 bytes
+Cache Information
+	Socket Designation: Not Specified
+	Configuration: Enabled, Not Socketed, Level 1
+	Operational Mode: Write Back
+	Location: Internal
+	Installed Size: 128 kB
+	Maximum Size: 128 kB
+	Supported SRAM Types:
+		Unknown
+	Installed SRAM Type: Unknown
+	Speed: Unknown
+	Error Correction Type: None
+	System Type: Data
+	Associativity: 4-way Set-associative
+
+Handle 0x0701, DMI type 7, 19 bytes
+Cache Information
+	Socket Designation: Not Specified
+	Configuration: Enabled, Not Socketed, Level 2
+	Operational Mode: Varies With Memory Address
+	Location: Internal
+	Installed Size: 6144 kB
+	Maximum Size: 6144 kB
+	Supported SRAM Types:
+		Pipeline Burst
+	Installed SRAM Type: Pipeline Burst
+	Speed: 15 ns
+	Error Correction Type: None
+	System Type: Unified
+	Associativity: Other
+
+Handle 0x0800, DMI type 8, 9 bytes
+Port Connector Information
+	Internal Reference Designator: PARALLEL
+	Internal Connector Type: None
+	External Reference Designator: Not Specified
+	External Connector Type: DB-25 female
+	Port Type: Parallel Port PS/2
+
+Handle 0x0801, DMI type 8, 9 bytes
+Port Connector Information
+	Internal Reference Designator: SERIAL1
+	Internal Connector Type: None
+	External Reference Designator: Not Specified
+	External Connector Type: DB-9 male
+	Port Type: Serial Port 16550A Compatible
+
+Handle 0x0804, DMI type 8, 9 bytes
+Port Connector Information
+	Internal Reference Designator: USB
+	Internal Connector Type: None
+	External Reference Designator: Not Specified
+	External Connector Type: Access Bus (USB)
+	Port Type: USB
+
+Handle 0x0806, DMI type 8, 9 bytes
+Port Connector Information
+	Internal Reference Designator: MONITOR
+	Internal Connector Type: None
+	External Reference Designator: Not Specified
+	External Connector Type: DB-15 female
+	Port Type: Video Port
+
+Handle 0x080B, DMI type 8, 9 bytes
+Port Connector Information
+	Internal Reference Designator: FireWire
+	Internal Connector Type: None
+	External Reference Designator: Not Specified
+	External Connector Type: IEEE 1394
+	Port Type: Firewire (IEEE P1394)
+
+Handle 0x080C, DMI type 8, 9 bytes
+Port Connector Information
+	Internal Reference Designator: Modem
+	Internal Connector Type: None
+	External Reference Designator: Not Specified
+	External Connector Type: RJ-11
+	Port Type: Modem Port
+
+Handle 0x080D, DMI type 8, 9 bytes
+Port Connector Information
+	Internal Reference Designator: Ethernet
+	Internal Connector Type: None
+	External Reference Designator: Not Specified
+	External Connector Type: RJ-45
+	Port Type: Network Port
+
+Handle 0x0900, DMI type 9, 13 bytes
+System Slot Information
+	Designation: PCMCIA 0
+	Type: 32-bit PC Card (PCMCIA)
+	Current Usage: Available
+	Length: Other
+	ID: Adapter 0, Socket 0
+	Characteristics:
+		5.0 V is provided
+		3.3 V is provided
+		PC Card-16 is supported
+		Cardbus is supported
+		Zoom Video is supported
+		Modem ring resume is supported
+
+Handle 0x0A00, DMI type 10, 6 bytes
+On Board Device Information
+	Type: Video
+	Status: Enabled
+	Description: NVIDIA Quadro FX 1700M        
+
+Handle 0x0A01, DMI type 10, 6 bytes
+On Board Device Information
+	Type: Sound
+	Status: Enabled
+	Description: IDT 92HD71
+
+Handle 0x0B00, DMI type 11, 5 bytes
+OEM Strings
+	String 1: Dell System
+	String 2: 5[0003]
+	String 3: 13[PP04X]
+
+Handle 0x0D00, DMI type 13, 22 bytes
+BIOS Language Information
+	Language Description Format: Long
+	Installable Languages: 1
+		en|US|iso8859-1
+	Currently Installed Language: en|US|iso8859-1
+
+Handle 0x1000, DMI type 16, 15 bytes
+Physical Memory Array
+	Location: System Board Or Motherboard
+	Use: System Memory
+	Error Correction Type: None
+	Maximum Capacity: 8 GB
+	Error Information Handle: Not Provided
+	Number Of Devices: 2
+
+Handle 0x1100, DMI type 17, 27 bytes
+Memory Device
+	Array Handle: 0x1000
+	Error Information Handle: Not Provided
+	Total Width: 64 bits
+	Data Width: 64 bits
+	Size: 2048 MB
+	Form Factor: DIMM
+	Set: None
+	Locator: DIMM_A
+	Bank Locator: Not Specified
+	Type: DDR2
+	Type Detail: Synchronous
+	Speed: 800 MHz
+	Manufacturer: 7F7FFE0000000000
+	Serial Number: 14FA6621
+	Asset Tag: 200840
+	Part Number: EBE21UE8ACUA-8G-E 
+
+Handle 0x1101, DMI type 17, 27 bytes
+Memory Device
+	Array Handle: 0x1000
+	Error Information Handle: Not Provided
+	Total Width: 64 bits
+	Data Width: 64 bits
+	Size: 2048 MB
+	Form Factor: DIMM
+	Set: None
+	Locator: DIMM_B
+	Bank Locator: Not Specified
+	Type: DDR2
+	Type Detail: Synchronous
+	Speed: 800 MHz
+	Manufacturer: 7F7FFE0000000000
+	Serial Number: AEF96621
+	Asset Tag: 200840
+	Part Number: EBE21UE8ACUA-8G-E 
+
+Handle 0x1301, DMI type 19, 15 bytes
+Memory Array Mapped Address
+	Starting Address: 0x00000000000
+	Ending Address: 0x000FFFFFFFF
+	Range Size: 4 GB
+	Physical Array Handle: 0x1000
+	Partition Width: 1
+
+Handle 0x1401, DMI type 20, 19 bytes
+Memory Device Mapped Address
+	Starting Address: 0x00000000000
+	Ending Address: 0x000FFFFFFFF
+	Range Size: 4 GB
+	Physical Device Handle: 0x1100
+	Memory Array Mapped Address Handle: 0x1301
+	Partition Row Position: 1
+	Interleave Position: 1
+	Interleaved Data Depth: 8
+
+Handle 0x1411, DMI type 126, 19 bytes
+Inactive
+
+Handle 0x1402, DMI type 20, 19 bytes
+Memory Device Mapped Address
+	Starting Address: 0x00000000000
+	Ending Address: 0x000FFFFFFFF
+	Range Size: 4 GB
+	Physical Device Handle: 0x1101
+	Memory Array Mapped Address Handle: 0x1301
+	Partition Row Position: 1
+	Interleave Position: 2
+	Interleaved Data Depth: 8
+
+Handle 0x1412, DMI type 126, 19 bytes
+Inactive
+
+Handle 0x1500, DMI type 21, 7 bytes
+Built-in Pointing Device
+	Type: Touch Pad
+	Interface: Bus Mouse
+	Buttons: 2
+
+Handle 0x1600, DMI type 22, 26 bytes
+Portable Battery
+	Location: Sys. Battery Bay
+	Manufacturer: SMP             
+	Name: DELL HJ59008    
+	Design Capacity: 84000 mWh
+	Design Voltage: 11100 mV
+	SBDS Version: 1.0
+	Maximum Error: 3%
+	SBDS Serial Number: 02C7
+	SBDS Manufacture Date: 2010-08-31
+	SBDS Chemistry: LION            
+	OEM-specific Information: 0x00000001
+
+Handle 0x1601, DMI type 126, 26 bytes
+Inactive
+
+Handle 0x1B00, DMI type 27, 12 bytes
+Cooling Device
+	Type: Fan
+	Status: OK
+	OEM-specific Information: 0x0000DD00
+
+Handle 0x1C00, DMI type 28, 20 bytes
+Temperature Probe
+	Description: CPU Internal Temperature
+	Location: Processor
+	Status: OK
+	Maximum Value: 127.0 deg C
+	Minimum Value: 0.0 deg C
+	Resolution: 1.000 deg C
+	Tolerance: 0.5 deg C
+	Accuracy: Unknown
+	OEM-specific Information: 0x0000DC00
+
+Handle 0x2000, DMI type 32, 11 bytes
+System Boot Information
+	Status: No errors detected
+
+Handle 0xB000, DMI type 176, 5 bytes
+OEM-specific Type
+	Header and Data:
+		B0 05 00 B0 3A
+
+Handle 0xB100, DMI type 177, 12 bytes
+OEM-specific Type
+	Header and Data:
+		B1 0C 00 B1 82 00 00 00 00 00 00 00
+
+Handle 0xB200, DMI type 178, 96 bytes
+OEM-specific Type
+	Header and Data:
+		B2 60 00 B2 07 01 0C 00 08 01 0A 00 09 01 0B 00
+		0A 01 12 00 3B 00 20 00 3C 00 1F 00 3D 00 0E 00
+		41 00 12 00 42 00 18 00 00 02 FF FF 4B 00 15 00
+		48 00 14 00 50 00 13 00 10 00 FF 00 11 00 FF 00
+		12 00 FF 00 13 00 FF 00 14 00 FF 00 1E 00 FF 00
+		1F 00 FF 00 20 00 FF 00 21 00 FF 00 22 00 FF 00
+
+Handle 0xD000, DMI type 208, 10 bytes
+OEM-specific Type
+	Header and Data:
+		D0 0A 00 D0 01 04 FE 00 50 02
+
+Handle 0xD100, DMI type 209, 12 bytes
+OEM-specific Type
+	Header and Data:
+		D1 0C 00 D1 00 00 00 03 04 07 80 05
+
+Handle 0xD200, DMI type 210, 12 bytes
+OEM-specific Type
+	Header and Data:
+		D2 0C 00 D2 00 00 06 03 06 80 04 05
+
+Handle 0xD800, DMI type 216, 9 bytes
+OEM-specific Type
+	Header and Data:
+		D8 09 00 D8 01 03 01 F0 03
+	Strings:
+		NVidia Corp.         
+		 
+		62.94.8F.00.04        
+		  
+
+Handle 0xD900, DMI type 217, 8 bytes
+OEM-specific Type
+	Header and Data:
+		D9 08 00 D9 01 02 01 03
+	Strings:
+		US-101
+		Proprietary
+
+Handle 0xDB00, DMI type 219, 9 bytes
+OEM-specific Type
+	Header and Data:
+		DB 09 00 DB 03 01 02 03 FF
+	Strings:
+		System Device Bay
+		Battery, CD-ROM, CD-RW, DVD, DVD+RW, DVD+/-RW, Hard Disk
+		DVD+/-RW  
+
+Handle 0xDB01, DMI type 219, 9 bytes
+OEM-specific Type
+	Header and Data:
+		DB 09 01 DB 03 01 02 03 FF
+	Strings:
+		System eSATA Bay
+		CD-ROM, CD-RW, DVD, DVD+RW, DVD+/-RW, Hard Disk
+		EMPTY     
+
+Handle 0xDB02, DMI type 219, 9 bytes
+OEM-specific Type
+	Header and Data:
+		DB 09 02 DB 03 01 02 03 FF
+	Strings:
+		System eSATA Dock Bay
+		CD-ROM, CD-RW, DVD, DVD+RW, DVD+/-RW, Hard Disk
+		EMPTY     
+
+Handle 0x8100, DMI type 129, 8 bytes
+OEM-specific Type
+	Header and Data:
+		81 08 00 81 01 01 02 01
+	Strings:
+		Intel_ASF
+		Intel_ASF_001
+
+Handle 0x8200, DMI type 130, 20 bytes
+OEM-specific Type
+	Header and Data:
+		82 14 00 82 24 41 4D 54 01 00 00 00 01 A5 0B 02
+		00 00 00 00
+
+Handle 0x8300, DMI type 131, 64 bytes
+OEM-specific Type
+	Header and Data:
+		83 40 00 83 35 00 00 00 00 00 40 2A 0F 00 00 00
+		F8 00 17 29 00 00 00 00 00 00 00 00 00 00 00 00
+		00 00 00 00 03 00 01 02 C8 00 F5 10 00 00 00 0C
+		00 00 00 00 28 00 00 00 76 50 72 6F 00 00 00 00
+
+Handle 0xDC00, DMI type 220, 22 bytes
+OEM-specific Type
+	Header and Data:
+		DC 16 00 DC 01 F0 00 00 02 F0 00 00 00 00 03 F0
+		04 F0 00 00 00 00
+
+Handle 0xDD00, DMI type 221, 19 bytes
+OEM-specific Type
+	Header and Data:
+		DD 13 00 DD 00 00 00 00 00 00 00 00 00 00 00 00
+		00 00 00
+
+Handle 0xD400, DMI type 212, 47 bytes
+OEM-specific Type
+	Header and Data:
+		D4 2F 00 D4 74 00 75 00 00 10 2D 2E 5C 00 78 BF
+		40 5D 00 78 BF 00 2D 01 1D EF 10 2E 01 1D EF 00
+		08 00 1D DF 00 03 00 1D DF 00 FF FF 00 00 00
+
+Handle 0xD401, DMI type 212, 17 bytes
+OEM-specific Type
+	Header and Data:
+		D4 11 01 D4 74 00 75 00 03 40 49 4A FF FF 00 00
+		00
+
+Handle 0xDE00, DMI type 222, 16 bytes
+OEM-specific Type
+	Header and Data:
+		DE 10 00 DE 01 02 FF FF 00 00 00 00 00 00 00 01
+
+Handle 0x7F00, DMI type 127, 4 bytes
+End Of Table
+


================================================================
  Commit: 8f8f3babb076c33cc2c17666eb717d7925acaeb8
      https://github.com/fusinv/fusioninventory-agent/commit/8f8f3babb076c33cc2c17666eb717d7925acaeb8
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-03-19 (Mon, 19 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/HTTP/Client/Fusion.pm
    M lib/FusionInventory/Agent/HTTP/Client/OCS.pm
    M lib/FusionInventory/Agent/Task/Inventory.pm
    M lib/FusionInventory/Agent/Tools/Screen.pm
    A resources/generic/dmidecode/windows-xp

  Log Message:
  -----------
  Merge remote-tracking branch 'origin/2.2.x' into 2.2.x


diff --git a/lib/FusionInventory/Agent/HTTP/Client/Fusion.pm b/lib/FusionInventory/Agent/HTTP/Client/Fusion.pm
index 87460a9..6ee5e7c 100644
--- a/lib/FusionInventory/Agent/HTTP/Client/Fusion.pm
+++ b/lib/FusionInventory/Agent/HTTP/Client/Fusion.pm
@@ -36,7 +36,7 @@ sub _prepareVal {
     return uri_escape($val);
 }
 
-sub send {
+sub send { ## no critic (ProhibitBuiltinHomonyms)
     my ($self, %params) = @_;
 
     push @{$self->{msgStack}}, $params{args} if $self->{debug};
diff --git a/lib/FusionInventory/Agent/HTTP/Client/OCS.pm b/lib/FusionInventory/Agent/HTTP/Client/OCS.pm
index 9c001f4..a65822b 100644
--- a/lib/FusionInventory/Agent/HTTP/Client/OCS.pm
+++ b/lib/FusionInventory/Agent/HTTP/Client/OCS.pm
@@ -50,7 +50,7 @@ sub new {
     return $self;
 }
 
-sub send {
+sub send { ## no critic (ProhibitBuiltinHomonyms)
     my ($self, %params) = @_;
 
     my $url = ref $params{url} eq 'URI' ?
diff --git a/lib/FusionInventory/Agent/Task/Inventory.pm b/lib/FusionInventory/Agent/Task/Inventory.pm
index ce3eb4c..13dc0b0 100644
--- a/lib/FusionInventory/Agent/Task/Inventory.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory.pm
@@ -190,8 +190,8 @@ sub _initModulesList {
 
     # second pass: disable fallback modules
     foreach my $module (@modules) {
-        ## no critic (ProhibitNoStrict ProhibitProlongedStrictureOverride)
-        no strict 'refs';
+        ## no critic (ProhibitProlongedStrictureOverride)
+        no strict 'refs'; ## no critic (ProhibitNoStrict)
 
         # skip modules already disabled
         next unless $self->{modules}->{$module}->{enabled};
diff --git a/lib/FusionInventory/Agent/Tools/Screen.pm b/lib/FusionInventory/Agent/Tools/Screen.pm
index d3dddcb..5cb71db 100644
--- a/lib/FusionInventory/Agent/Tools/Screen.pm
+++ b/lib/FusionInventory/Agent/Tools/Screen.pm
@@ -192,7 +192,7 @@ sub checkParsedEdid {
 sub parseEdid {
     my ($raw_edid) = @_;
 
-    no warnings 'uninitialized';
+    no warnings 'uninitialized'; ## no critic (ProhibitNoWarnings)
 
     my %edid;
     my @vals = unpack(join('', map { $_->[0] } @edid_info), $raw_edid);
diff --git a/resources/generic/dmidecode/windows-xp b/resources/generic/dmidecode/windows-xp
new file mode 100644
index 0000000..6b999c7
--- /dev/null
+++ b/resources/generic/dmidecode/windows-xp
@@ -0,0 +1,586 @@
+# dmidecode 2.11
+SMBIOS 2.4 present.
+57 structures occupying 2822 bytes.
+Table at 0x000F6570.
+
+Handle 0xDA00, DMI type 218, 251 bytes
+OEM-specific Type
+	Header and Data:
+		DA FB 00 DA B2 00 0D 5F 1F 37 40 7D 00 00 00 00
+		00 40 00 02 00 01 00 41 00 02 00 00 00 65 00 03
+		00 00 00 66 00 03 00 01 00 F1 00 04 00 00 00 F2
+		00 04 00 01 00 F3 00 04 00 02 00 0F 00 05 00 00
+		00 11 00 05 00 01 00 05 00 05 00 02 00 12 00 05
+		00 03 00 06 00 05 00 04 00 07 00 06 00 00 00 0B
+		00 06 00 01 00 0C 00 06 00 02 00 0D 00 06 00 03
+		00 89 01 07 00 00 00 8A 01 07 00 01 00 42 00 08
+		00 01 00 43 00 08 00 00 00 55 00 09 00 00 00 6D
+		00 09 00 01 00 16 02 09 00 02 00 98 01 09 00 03
+		00 0A 01 0A 00 01 00 0B 01 0A 00 00 00 2D 00 0B
+		00 02 00 6E 00 0B 00 01 00 2E 00 0B 00 00 00 11
+		01 0C 00 00 00 10 01 0C 00 01 00 F0 00 0D 00 01
+		00 ED 00 0D 00 00 00 41 01 0E 00 01 00 40 01 0E
+		00 00 00 47 01 0F 00 01 00 46 01 0F 00 00 00 4A
+		01 10 00 00 00 FF FF 00 00 00 00
+
+Handle 0xDA01, DMI type 218, 251 bytes
+OEM-specific Type
+	Header and Data:
+		DA FB 01 DA B2 00 0D 5F 1F 37 40 4B 01 10 00 01
+		00 04 02 11 00 00 00 05 02 11 00 01 00 02 02 12
+		00 00 00 03 02 12 00 01 00 52 01 13 00 01 00 53
+		01 13 00 00 00 80 01 14 00 01 00 7F 01 14 00 00
+		00 7C 01 15 00 01 00 7B 01 15 00 00 00 E8 02 16
+		00 00 00 E9 02 16 00 01 00 7E 01 17 00 01 00 7D
+		01 17 00 00 00 92 01 18 00 00 00 91 01 18 00 01
+		00 94 01 19 00 00 00 93 01 19 00 01 00 86 01 1A
+		00 01 00 85 01 1A 00 00 00 82 01 1B 00 01 00 81
+		01 1B 00 00 00 84 01 1C 00 01 00 83 01 1C 00 00
+		00 9B 01 1D 00 00 00 9C 01 1D 00 01 00 9D 01 1D
+		00 02 00 9E 01 1D 00 03 00 8D 01 1E 00 00 00 8E
+		01 1E 00 01 00 85 02 1F 00 00 00 86 02 1F 00 01
+		00 EA 00 20 00 00 00 EB 00 20 00 01 00 EC 00 20
+		00 02 00 A1 00 21 00 00 00 A3 00 21 00 01 00 28
+		00 22 00 00 00 FF FF 00 00 00 00
+
+Handle 0xDA02, DMI type 218, 251 bytes
+OEM-specific Type
+	Header and Data:
+		DA FB 02 DA B2 00 0D 5F 1F 37 40 29 00 22 00 01
+		00 2A 00 22 00 02 00 2B 00 23 00 00 00 2C 00 24
+		00 00 00 0E 01 25 00 01 00 0F 01 25 00 00 00 9B
+		00 26 00 01 00 9C 00 26 00 00 00 4D 01 27 00 01
+		00 4C 01 27 00 00 00 87 01 28 00 00 00 88 01 28
+		00 01 00 35 01 29 00 03 00 37 01 29 00 00 00 38
+		01 29 00 01 00 39 01 29 00 02 00 D9 01 2A 00 01
+		00 D8 01 2A 00 00 00 DF 01 2B 00 01 00 DE 01 2B
+		00 00 00 45 02 2C 00 00 00 44 02 2C 00 01 00 49
+		02 2D 00 00 00 48 02 2D 00 01 00 45 01 45 01 01
+		00 44 01 44 01 00 00 76 01 76 01 01 00 75 01 75
+		01 01 00 9F 00 9F 00 00 00 A0 00 A0 00 01 00 E1
+		01 E1 01 00 00 E3 01 E3 01 01 00 E2 01 E2 01 02
+		00 29 02 29 02 01 00 28 02 28 02 02 00 2A 02 2A
+		02 03 00 30 02 30 02 01 00 2F 02 2F 02 00 00 35
+		02 35 02 01 00 FF FF 00 00 00 00
+
+Handle 0xDA03, DMI type 218, 77 bytes
+OEM-specific Type
+	Header and Data:
+		DA 4D 03 DA B2 00 0D 5F 1F 37 40 36 02 36 02 00
+		00 37 02 37 02 02 00 4A 02 4A 02 01 00 0C 80 0C
+		80 01 00 6C 02 6C 02 01 00 6D 02 6D 02 00 00 01
+		F0 01 F0 00 00 02 F0 02 F0 00 00 03 F0 03 F0 00
+		00 04 F0 04 F0 00 00 FF FF 00 00 00 00
+
+Handle 0x0000, DMI type 0, 24 bytes
+BIOS Information
+	Vendor: Dell Inc.
+	Version: A24
+	Release Date: 08/19/2010
+	Address: 0xF0000
+	Runtime Size: 64 kB
+	ROM Size: 1728 kB
+	Characteristics:
+		ISA is supported
+		PCI is supported
+		PC Card (PCMCIA) is supported
+		PNP is supported
+		BIOS is upgradeable
+		BIOS shadowing is allowed
+		Boot from CD is supported
+		Selectable boot is supported
+		3.5"/720 kB floppy services are supported (int 13h)
+		Print screen service is supported (int 5h)
+		8042 keyboard services are supported (int 9h)
+		Serial services are supported (int 14h)
+		Printer services are supported (int 17h)
+		CGA/mono video services are supported (int 10h)
+		ACPI is supported
+		USB legacy is supported
+		AGP is supported
+		Smart battery is supported
+		BIOS boot specification is supported
+		Function key-initiated network boot is supported
+		Targeted content distribution is supported
+	BIOS Revision: 2.4
+	Firmware Revision: 2.4
+
+Handle 0x0100, DMI type 1, 27 bytes
+System Information
+	Manufacturer: Dell Inc.
+	Product Name: Precision M4400                 
+	Version: Not Specified
+	Serial Number: HLG964J
+	UUID: 44454C4C-4C00-1047-8039-C8C04F36344A
+	Wake-up Type: Power Switch
+	SKU Number: Not Specified
+	Family:  
+
+Handle 0x0200, DMI type 2, 9 bytes
+Base Board Information
+	Manufacturer: Dell Inc.
+	Product Name: 0P019G
+	Version:    
+	Serial Number: .HLG964J.CN129618C52450.
+	Asset Tag:           
+
+Handle 0x0300, DMI type 3, 13 bytes
+Chassis Information
+	Manufacturer: Dell Inc.
+	Type: Portable
+	Lock: Not Present
+	Version: Not Specified
+	Serial Number: HLG964J
+	Asset Tag: Not Specified
+	Boot-up State: Safe
+	Power Supply State: Safe
+	Thermal State: Safe
+	Security Status: None
+
+Handle 0x0400, DMI type 4, 40 bytes
+Processor Information
+	Socket Designation: Microprocessor
+	Type: Central Processor
+	Family: Core 2 Duo
+	Manufacturer: Intel
+	ID: 76 06 01 00 FF FB EB BF
+	Signature: Type 0, Family 6, Model 23, Stepping 6
+	Flags:
+		FPU (Floating-point unit on-chip)
+		VME (Virtual mode extension)
+		DE (Debugging extension)
+		PSE (Page size extension)
+		TSC (Time stamp counter)
+		MSR (Model specific registers)
+		PAE (Physical address extension)
+		MCE (Machine check exception)
+		CX8 (CMPXCHG8 instruction supported)
+		APIC (On-chip APIC hardware supported)
+		SEP (Fast system call)
+		MTRR (Memory type range registers)
+		PGE (Page global enable)
+		MCA (Machine check architecture)
+		CMOV (Conditional move instruction supported)
+		PAT (Page attribute table)
+		PSE-36 (36-bit page size extension)
+		CLFSH (CLFLUSH instruction supported)
+		DS (Debug store)
+		ACPI (ACPI supported)
+		MMX (MMX technology supported)
+		FXSR (FXSAVE and FXSTOR instructions supported)
+		SSE (Streaming SIMD extensions)
+		SSE2 (Streaming SIMD extensions 2)
+		SS (Self-snoop)
+		HTT (Multi-threading)
+		TM (Thermal monitor supported)
+		PBE (Pending break enabled)
+	Version: Not Specified
+	Voltage: 3.3 V
+	External Clock: 266 MHz
+	Max Speed: 2534 MHz
+	Current Speed: 2534 MHz
+	Status: Populated, Enabled
+	Upgrade: None
+	L1 Cache Handle: 0x0700
+	L2 Cache Handle: 0x0701
+	L3 Cache Handle: Not Provided
+	Serial Number: Not Specified
+	Asset Tag: Not Specified
+	Part Number: Not Specified
+	Core Count: 2
+	Core Enabled: 2
+	Thread Count: 2
+	Characteristics:
+		64-bit capable
+
+Handle 0x0700, DMI type 7, 19 bytes
+Cache Information
+	Socket Designation: Not Specified
+	Configuration: Enabled, Not Socketed, Level 1
+	Operational Mode: Write Back
+	Location: Internal
+	Installed Size: 128 kB
+	Maximum Size: 128 kB
+	Supported SRAM Types:
+		Unknown
+	Installed SRAM Type: Unknown
+	Speed: Unknown
+	Error Correction Type: None
+	System Type: Data
+	Associativity: 4-way Set-associative
+
+Handle 0x0701, DMI type 7, 19 bytes
+Cache Information
+	Socket Designation: Not Specified
+	Configuration: Enabled, Not Socketed, Level 2
+	Operational Mode: Varies With Memory Address
+	Location: Internal
+	Installed Size: 6144 kB
+	Maximum Size: 6144 kB
+	Supported SRAM Types:
+		Pipeline Burst
+	Installed SRAM Type: Pipeline Burst
+	Speed: 15 ns
+	Error Correction Type: None
+	System Type: Unified
+	Associativity: Other
+
+Handle 0x0800, DMI type 8, 9 bytes
+Port Connector Information
+	Internal Reference Designator: PARALLEL
+	Internal Connector Type: None
+	External Reference Designator: Not Specified
+	External Connector Type: DB-25 female
+	Port Type: Parallel Port PS/2
+
+Handle 0x0801, DMI type 8, 9 bytes
+Port Connector Information
+	Internal Reference Designator: SERIAL1
+	Internal Connector Type: None
+	External Reference Designator: Not Specified
+	External Connector Type: DB-9 male
+	Port Type: Serial Port 16550A Compatible
+
+Handle 0x0804, DMI type 8, 9 bytes
+Port Connector Information
+	Internal Reference Designator: USB
+	Internal Connector Type: None
+	External Reference Designator: Not Specified
+	External Connector Type: Access Bus (USB)
+	Port Type: USB
+
+Handle 0x0806, DMI type 8, 9 bytes
+Port Connector Information
+	Internal Reference Designator: MONITOR
+	Internal Connector Type: None
+	External Reference Designator: Not Specified
+	External Connector Type: DB-15 female
+	Port Type: Video Port
+
+Handle 0x080B, DMI type 8, 9 bytes
+Port Connector Information
+	Internal Reference Designator: FireWire
+	Internal Connector Type: None
+	External Reference Designator: Not Specified
+	External Connector Type: IEEE 1394
+	Port Type: Firewire (IEEE P1394)
+
+Handle 0x080C, DMI type 8, 9 bytes
+Port Connector Information
+	Internal Reference Designator: Modem
+	Internal Connector Type: None
+	External Reference Designator: Not Specified
+	External Connector Type: RJ-11
+	Port Type: Modem Port
+
+Handle 0x080D, DMI type 8, 9 bytes
+Port Connector Information
+	Internal Reference Designator: Ethernet
+	Internal Connector Type: None
+	External Reference Designator: Not Specified
+	External Connector Type: RJ-45
+	Port Type: Network Port
+
+Handle 0x0900, DMI type 9, 13 bytes
+System Slot Information
+	Designation: PCMCIA 0
+	Type: 32-bit PC Card (PCMCIA)
+	Current Usage: Available
+	Length: Other
+	ID: Adapter 0, Socket 0
+	Characteristics:
+		5.0 V is provided
+		3.3 V is provided
+		PC Card-16 is supported
+		Cardbus is supported
+		Zoom Video is supported
+		Modem ring resume is supported
+
+Handle 0x0A00, DMI type 10, 6 bytes
+On Board Device Information
+	Type: Video
+	Status: Enabled
+	Description: NVIDIA Quadro FX 1700M        
+
+Handle 0x0A01, DMI type 10, 6 bytes
+On Board Device Information
+	Type: Sound
+	Status: Enabled
+	Description: IDT 92HD71
+
+Handle 0x0B00, DMI type 11, 5 bytes
+OEM Strings
+	String 1: Dell System
+	String 2: 5[0003]
+	String 3: 13[PP04X]
+
+Handle 0x0D00, DMI type 13, 22 bytes
+BIOS Language Information
+	Language Description Format: Long
+	Installable Languages: 1
+		en|US|iso8859-1
+	Currently Installed Language: en|US|iso8859-1
+
+Handle 0x1000, DMI type 16, 15 bytes
+Physical Memory Array
+	Location: System Board Or Motherboard
+	Use: System Memory
+	Error Correction Type: None
+	Maximum Capacity: 8 GB
+	Error Information Handle: Not Provided
+	Number Of Devices: 2
+
+Handle 0x1100, DMI type 17, 27 bytes
+Memory Device
+	Array Handle: 0x1000
+	Error Information Handle: Not Provided
+	Total Width: 64 bits
+	Data Width: 64 bits
+	Size: 2048 MB
+	Form Factor: DIMM
+	Set: None
+	Locator: DIMM_A
+	Bank Locator: Not Specified
+	Type: DDR2
+	Type Detail: Synchronous
+	Speed: 800 MHz
+	Manufacturer: 7F7FFE0000000000
+	Serial Number: 14FA6621
+	Asset Tag: 200840
+	Part Number: EBE21UE8ACUA-8G-E 
+
+Handle 0x1101, DMI type 17, 27 bytes
+Memory Device
+	Array Handle: 0x1000
+	Error Information Handle: Not Provided
+	Total Width: 64 bits
+	Data Width: 64 bits
+	Size: 2048 MB
+	Form Factor: DIMM
+	Set: None
+	Locator: DIMM_B
+	Bank Locator: Not Specified
+	Type: DDR2
+	Type Detail: Synchronous
+	Speed: 800 MHz
+	Manufacturer: 7F7FFE0000000000
+	Serial Number: AEF96621
+	Asset Tag: 200840
+	Part Number: EBE21UE8ACUA-8G-E 
+
+Handle 0x1301, DMI type 19, 15 bytes
+Memory Array Mapped Address
+	Starting Address: 0x00000000000
+	Ending Address: 0x000FFFFFFFF
+	Range Size: 4 GB
+	Physical Array Handle: 0x1000
+	Partition Width: 1
+
+Handle 0x1401, DMI type 20, 19 bytes
+Memory Device Mapped Address
+	Starting Address: 0x00000000000
+	Ending Address: 0x000FFFFFFFF
+	Range Size: 4 GB
+	Physical Device Handle: 0x1100
+	Memory Array Mapped Address Handle: 0x1301
+	Partition Row Position: 1
+	Interleave Position: 1
+	Interleaved Data Depth: 8
+
+Handle 0x1411, DMI type 126, 19 bytes
+Inactive
+
+Handle 0x1402, DMI type 20, 19 bytes
+Memory Device Mapped Address
+	Starting Address: 0x00000000000
+	Ending Address: 0x000FFFFFFFF
+	Range Size: 4 GB
+	Physical Device Handle: 0x1101
+	Memory Array Mapped Address Handle: 0x1301
+	Partition Row Position: 1
+	Interleave Position: 2
+	Interleaved Data Depth: 8
+
+Handle 0x1412, DMI type 126, 19 bytes
+Inactive
+
+Handle 0x1500, DMI type 21, 7 bytes
+Built-in Pointing Device
+	Type: Touch Pad
+	Interface: Bus Mouse
+	Buttons: 2
+
+Handle 0x1600, DMI type 22, 26 bytes
+Portable Battery
+	Location: Sys. Battery Bay
+	Manufacturer: SMP             
+	Name: DELL HJ59008    
+	Design Capacity: 84000 mWh
+	Design Voltage: 11100 mV
+	SBDS Version: 1.0
+	Maximum Error: 3%
+	SBDS Serial Number: 02C7
+	SBDS Manufacture Date: 2010-08-31
+	SBDS Chemistry: LION            
+	OEM-specific Information: 0x00000001
+
+Handle 0x1601, DMI type 126, 26 bytes
+Inactive
+
+Handle 0x1B00, DMI type 27, 12 bytes
+Cooling Device
+	Type: Fan
+	Status: OK
+	OEM-specific Information: 0x0000DD00
+
+Handle 0x1C00, DMI type 28, 20 bytes
+Temperature Probe
+	Description: CPU Internal Temperature
+	Location: Processor
+	Status: OK
+	Maximum Value: 127.0 deg C
+	Minimum Value: 0.0 deg C
+	Resolution: 1.000 deg C
+	Tolerance: 0.5 deg C
+	Accuracy: Unknown
+	OEM-specific Information: 0x0000DC00
+
+Handle 0x2000, DMI type 32, 11 bytes
+System Boot Information
+	Status: No errors detected
+
+Handle 0xB000, DMI type 176, 5 bytes
+OEM-specific Type
+	Header and Data:
+		B0 05 00 B0 3A
+
+Handle 0xB100, DMI type 177, 12 bytes
+OEM-specific Type
+	Header and Data:
+		B1 0C 00 B1 82 00 00 00 00 00 00 00
+
+Handle 0xB200, DMI type 178, 96 bytes
+OEM-specific Type
+	Header and Data:
+		B2 60 00 B2 07 01 0C 00 08 01 0A 00 09 01 0B 00
+		0A 01 12 00 3B 00 20 00 3C 00 1F 00 3D 00 0E 00
+		41 00 12 00 42 00 18 00 00 02 FF FF 4B 00 15 00
+		48 00 14 00 50 00 13 00 10 00 FF 00 11 00 FF 00
+		12 00 FF 00 13 00 FF 00 14 00 FF 00 1E 00 FF 00
+		1F 00 FF 00 20 00 FF 00 21 00 FF 00 22 00 FF 00
+
+Handle 0xD000, DMI type 208, 10 bytes
+OEM-specific Type
+	Header and Data:
+		D0 0A 00 D0 01 04 FE 00 50 02
+
+Handle 0xD100, DMI type 209, 12 bytes
+OEM-specific Type
+	Header and Data:
+		D1 0C 00 D1 00 00 00 03 04 07 80 05
+
+Handle 0xD200, DMI type 210, 12 bytes
+OEM-specific Type
+	Header and Data:
+		D2 0C 00 D2 00 00 06 03 06 80 04 05
+
+Handle 0xD800, DMI type 216, 9 bytes
+OEM-specific Type
+	Header and Data:
+		D8 09 00 D8 01 03 01 F0 03
+	Strings:
+		NVidia Corp.         
+		 
+		62.94.8F.00.04        
+		  
+
+Handle 0xD900, DMI type 217, 8 bytes
+OEM-specific Type
+	Header and Data:
+		D9 08 00 D9 01 02 01 03
+	Strings:
+		US-101
+		Proprietary
+
+Handle 0xDB00, DMI type 219, 9 bytes
+OEM-specific Type
+	Header and Data:
+		DB 09 00 DB 03 01 02 03 FF
+	Strings:
+		System Device Bay
+		Battery, CD-ROM, CD-RW, DVD, DVD+RW, DVD+/-RW, Hard Disk
+		DVD+/-RW  
+
+Handle 0xDB01, DMI type 219, 9 bytes
+OEM-specific Type
+	Header and Data:
+		DB 09 01 DB 03 01 02 03 FF
+	Strings:
+		System eSATA Bay
+		CD-ROM, CD-RW, DVD, DVD+RW, DVD+/-RW, Hard Disk
+		EMPTY     
+
+Handle 0xDB02, DMI type 219, 9 bytes
+OEM-specific Type
+	Header and Data:
+		DB 09 02 DB 03 01 02 03 FF
+	Strings:
+		System eSATA Dock Bay
+		CD-ROM, CD-RW, DVD, DVD+RW, DVD+/-RW, Hard Disk
+		EMPTY     
+
+Handle 0x8100, DMI type 129, 8 bytes
+OEM-specific Type
+	Header and Data:
+		81 08 00 81 01 01 02 01
+	Strings:
+		Intel_ASF
+		Intel_ASF_001
+
+Handle 0x8200, DMI type 130, 20 bytes
+OEM-specific Type
+	Header and Data:
+		82 14 00 82 24 41 4D 54 01 00 00 00 01 A5 0B 02
+		00 00 00 00
+
+Handle 0x8300, DMI type 131, 64 bytes
+OEM-specific Type
+	Header and Data:
+		83 40 00 83 35 00 00 00 00 00 40 2A 0F 00 00 00
+		F8 00 17 29 00 00 00 00 00 00 00 00 00 00 00 00
+		00 00 00 00 03 00 01 02 C8 00 F5 10 00 00 00 0C
+		00 00 00 00 28 00 00 00 76 50 72 6F 00 00 00 00
+
+Handle 0xDC00, DMI type 220, 22 bytes
+OEM-specific Type
+	Header and Data:
+		DC 16 00 DC 01 F0 00 00 02 F0 00 00 00 00 03 F0
+		04 F0 00 00 00 00
+
+Handle 0xDD00, DMI type 221, 19 bytes
+OEM-specific Type
+	Header and Data:
+		DD 13 00 DD 00 00 00 00 00 00 00 00 00 00 00 00
+		00 00 00
+
+Handle 0xD400, DMI type 212, 47 bytes
+OEM-specific Type
+	Header and Data:
+		D4 2F 00 D4 74 00 75 00 00 10 2D 2E 5C 00 78 BF
+		40 5D 00 78 BF 00 2D 01 1D EF 10 2E 01 1D EF 00
+		08 00 1D DF 00 03 00 1D DF 00 FF FF 00 00 00
+
+Handle 0xD401, DMI type 212, 17 bytes
+OEM-specific Type
+	Header and Data:
+		D4 11 01 D4 74 00 75 00 03 40 49 4A FF FF 00 00
+		00
+
+Handle 0xDE00, DMI type 222, 16 bytes
+OEM-specific Type
+	Header and Data:
+		DE 10 00 DE 01 02 FF FF 00 00 00 00 00 00 00 01
+
+Handle 0x7F00, DMI type 127, 4 bytes
+End Of Table
+


================================================================
  Commit: 3d713ca3676de556fb05fc02ad6ac714a2e6c43a
      https://github.com/fusinv/fusioninventory-agent/commit/3d713ca3676de556fb05fc02ad6ac714a2e6c43a
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-19 (Mon, 19 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent.pm

  Log Message:
  -----------
  compute tasks list before creating HTTP interface

This ensure the listening thread is created after everything else
has been initialized


diff --git a/lib/FusionInventory/Agent.pm b/lib/FusionInventory/Agent.pm
index 3673bfa..edd3950 100644
--- a/lib/FusionInventory/Agent.pm
+++ b/lib/FusionInventory/Agent.pm
@@ -150,6 +150,13 @@ sub init {
         }
     }
 
+    # compute list of allowed tasks
+    my %available = $self->getAvailableTasks(disabledTasks => $config->{'no-task'});
+    my @tasks = keys %available;
+
+    $self->{tasks} = \@tasks;
+
+    # create HTTP interface
     if (($config->{daemon} || $config->{service}) && !$config->{'no-httpd'}) {
         FusionInventory::Agent::HTTP::Server->require();
         if ($EVAL_ERROR) {
@@ -178,12 +185,6 @@ sub init {
         }
     }
 
-    # compute list of allowed tasks
-    my %available = $self->getAvailableTasks(disabledTasks => $config->{'no-task'});
-    my @tasks = keys %available;
-
-    $self->{tasks} = \@tasks;
-
     $logger->debug("FusionInventory Agent initialised");
 }
 


================================================================
  Commit: fa04fe1073e4e3e59c3e86ab8575d2b711ab88f9
      https://github.com/fusinv/fusioninventory-agent/commit/fa04fe1073e4e3e59c3e86ab8575d2b711ab88f9
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-19 (Mon, 19 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent.pm

  Log Message:
  -----------
  log available tasks


diff --git a/lib/FusionInventory/Agent.pm b/lib/FusionInventory/Agent.pm
index edd3950..a6ba3db 100644
--- a/lib/FusionInventory/Agent.pm
+++ b/lib/FusionInventory/Agent.pm
@@ -154,6 +154,11 @@ sub init {
     my %available = $self->getAvailableTasks(disabledTasks => $config->{'no-task'});
     my @tasks = keys %available;
 
+    $logger->debug("Available tasks:");
+    foreach my $task (keys %available) {
+        $logger->debug("- $task: $available{$task}");
+    }
+
     $self->{tasks} = \@tasks;
 
     # create HTTP interface


================================================================
  Commit: 050c20a3e9a532f0af0440e7f5b72101adc2f0db
      https://github.com/fusinv/fusioninventory-agent/commit/050c20a3e9a532f0af0440e7f5b72101adc2f0db
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-19 (Mon, 19 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent.pm

  Log Message:
  -----------
  fork before loading tasks code in server mode

This avoid cluttering main process memory uselessly.


diff --git a/lib/FusionInventory/Agent.pm b/lib/FusionInventory/Agent.pm
index a6ba3db..4ab768e 100644
--- a/lib/FusionInventory/Agent.pm
+++ b/lib/FusionInventory/Agent.pm
@@ -255,25 +255,10 @@ sub _runTarget {
 sub _runTask {
     my ($self, $target, $name, $response) = @_;
 
-    my $class = "FusionInventory::Agent::Task::$name";
-    my $task = $class->new(
-        config       => $self->{config},
-        confdir      => $self->{confdir},
-        datadir      => $self->{datadir},
-        logger       => $self->{logger},
-        target       => $target,
-        deviceid     => $self->{deviceid},
-    );
-
-    if (!$task->isEnabled($response)) {
-        $self->{logger}->info("task $name is not enabled");
-        return;
-    }
-
     $self->{status} = "running task $name";
 
     if ($self->{config}->{daemon} || $self->{config}->{service}) {
-        # daemon mode: run each task in a child process
+        # server mode: run each task in a child process
         if (my $pid = fork()) {
             # parent
             waitpid($pid, 0);
@@ -282,28 +267,45 @@ sub _runTask {
             die "fork failed: $ERRNO" unless defined $pid;
 
             $self->{logger}->debug("running task $name in process $PID");
-            $task->run(
-                user         => $self->{config}->{user},
-                password     => $self->{config}->{password},
-                proxy        => $self->{config}->{proxy},
-                ca_cert_file => $self->{config}->{'ca-cert-file'},
-                ca_cert_dir  => $self->{config}->{'ca-cert-dir'},
-                no_ssl_check => $self->{config}->{'no-ssl-check'},
-            );
+            $self->_runTaskReal($target, $name, $response);
             exit(0);
         }
     } else {
         # standalone mode: run each task directly
         $self->{logger}->debug("running task $name");
-        $task->run(
-            user         => $self->{config}->{user},
-            password     => $self->{config}->{password},
-            proxy        => $self->{config}->{proxy},
-            ca_cert_file => $self->{config}->{'ca-cert-file'},
-            ca_cert_dir  => $self->{config}->{'ca-cert-dir'},
-            no_ssl_check => $self->{config}->{'no-ssl-check'},
-        );
+        $self->_runTaskReal($target, $name, $response);
+    }
+}
+
+sub _runTaskReal {
+    my ($self, $target, $name, $response) = @_;
+
+    my $class = "FusionInventory::Agent::Task::$name";
+
+    $class->require();
+
+    my $task = $class->new(
+        config       => $self->{config},
+        confdir      => $self->{confdir},
+        datadir      => $self->{datadir},
+        logger       => $self->{logger},
+        target       => $target,
+        deviceid     => $self->{deviceid},
+    );
+
+    if (!$task->isEnabled($response)) {
+        $self->{logger}->info("task $name is not enabled");
+        return;
     }
+
+    $task->run(
+        user         => $self->{config}->{user},
+        password     => $self->{config}->{password},
+        proxy        => $self->{config}->{proxy},
+        ca_cert_file => $self->{config}->{'ca-cert-file'},
+        ca_cert_dir  => $self->{config}->{'ca-cert-dir'},
+        no_ssl_check => $self->{config}->{'no-ssl-check'},
+    );
 }
 
 sub getToken {
@@ -324,7 +326,6 @@ sub getStatus {
 sub getAvailableTasks {
     my ($self, %params) = @_;
 
-    my $logger = $self->{logger};
     my %tasks;
     my %disabled  = map { lc($_) => 1 } @{$params{disabledTasks}};
 
@@ -340,30 +341,60 @@ sub getAvailableTasks {
 
         next if $disabled{lc($name)};
 
-        # check module
-        # todo: use a child process when running as a server to save memory
-        if (!$module->require()) {
-            $logger->debug2("module $module does not compile") if $logger;
-            next;
-        }
-        if (!$module->isa('FusionInventory::Agent::Task')) {
-            $logger->debug2("module $module is not a task") if $logger;
-            next;
-        }
-
-        # retrieve version
         my $version;
-        {
-            no strict 'refs';  ## no critic
-            $version = ${$module . '::VERSION'};
+        if ($self->{config}->{daemon} || $self->{config}->{service}) {
+            # server mode: check each task version in a child process
+            my $pid = open(my $handle, '-|');
+            die "fork failed: $ERRNO" unless defined $pid;
+
+            if ($pid) {
+                # parent
+                $version = <$handle>;
+                close $handle;
+            } else {
+                # child
+                $version = $self->_getTaskVersion($module);
+                print $version if $version;
+                exit(0);
+            }
+        } else {
+            # standalone mode: check each task version directly
+            $version = $self->_getTaskVersion($module);
         }
 
+        # no version means non-functionning task
+        next unless $version;
+
         $tasks{$name} = $version;
     }
 
     return %tasks;
 }
 
+sub _getTaskVersion {
+    my ($self, $module) = @_;
+
+    my $logger = $self->{logger};
+
+    if (!$module->require()) {
+        $logger->debug2("module $module does not compile") if $logger;
+        return;
+    }
+
+    if (!$module->isa('FusionInventory::Agent::Task')) {
+        $logger->debug2("module $module is not a task") if $logger;
+        return;
+    }
+
+    my $version;
+    {
+        no strict 'refs';  ## no critic
+        $version = ${$module . '::VERSION'};
+    }
+
+    return $version;
+}
+
 sub _isAlreadyRunning {
     my ($self) = @_;
 


================================================================
  Commit: 58128f37dbf70e885022737f8c8524bd2901298c
      https://github.com/fusinv/fusioninventory-agent/commit/58128f37dbf70e885022737f8c8524bd2901298c
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-03-19 (Mon, 19 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Videos.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Networks.pm
    M lib/FusionInventory/Agent/Tools.pm
    M lib/FusionInventory/Agent/Tools/Win32.pm

  Log Message:
  -----------
  Merge remote-tracking branch 'forge/2.2.x' into 2.2.x


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Videos.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Videos.pm
index be4aef8..cff31ad 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Videos.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Videos.pm
@@ -6,8 +6,6 @@ use warnings;
 use FusionInventory::Agent::Tools;
 use FusionInventory::Agent::Tools::Unix;
 
-my $seen;
-
 sub isEnabled {
     return 1;
 }
@@ -66,9 +64,6 @@ sub doInventory {
         $video->{RESOLUTION} =~ s/@.*//;
     }
 
-    # avoid duplicates
-    next if $seen->{$video->{NAME}}++;
-
     $inventory->addEntry(
         section => 'VIDEOS',
         entry   => $video
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Networks.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Networks.pm
index 90aaa59..772ee74 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Networks.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Networks.pm
@@ -135,7 +135,7 @@ sub _check_nic {
 
 # Function to test eri Fast-Ethernet (eri_).
 sub _check_eri {
-    my ($nic, $num) = @_;
+    my ($nic) = @_;
 
     my $speed = getFirstMatch(
         command => "/usr/sbin/ndd -get /dev/$nic link_speed",
diff --git a/lib/FusionInventory/Agent/Tools.pm b/lib/FusionInventory/Agent/Tools.pm
index b5c24ba..2614964 100644
--- a/lib/FusionInventory/Agent/Tools.pm
+++ b/lib/FusionInventory/Agent/Tools.pm
@@ -443,8 +443,10 @@ sub runFunction {
     my $result;
     eval {
         # set a timeout if needed
-        local $SIG{ALRM} = sub { die "alarm\n" } if $params{timeout};
-        alarm $params{timeout};
+       if ($params{timeout}) {
+           local $SIG{ALRM} = sub { die "alarm\n" };
+           alarm $params{timeout};
+       }
 
         no strict 'refs'; ## no critic (ProhibitNoStrict)
         $result = &{$params{module} . '::' . $params{function}}(
diff --git a/lib/FusionInventory/Agent/Tools/Win32.pm b/lib/FusionInventory/Agent/Tools/Win32.pm
index f062ac7..42c854a 100644
--- a/lib/FusionInventory/Agent/Tools/Win32.pm
+++ b/lib/FusionInventory/Agent/Tools/Win32.pm
@@ -97,7 +97,7 @@ sub getRegistryValue {
     my (%params) = @_;
 
     my ($root, $keyName, $valueName);
-    if ($params{path} =~ /^(HKEY_\S+)\/(.+)\/([^\/]+)/ ) {
+    if ($params{path} =~ /^(HKEY_[^\/\\]+)[\/\\](.+)[\/\\]([^\/]+)/ ) {
         $root      = $1;
         $keyName   = $2;
         $valueName = $3;


================================================================
  Commit: 31ac548fe3d8bfad7e77b5cc17b812f34d719e63
      https://github.com/fusinv/fusioninventory-agent/commit/31ac548fe3d8bfad7e77b5cc17b812f34d719e63
  Author: Guillaume Rousse <guillomovitch at gmail.com>
  Date:   2012-03-20 (Tue, 20 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent.pm

  Log Message:
  -----------
  use explicit pipe, rather than open (close #1521)

the safe pipe syntax open($handle, '-|') seems to be invalid under Windows.


diff --git a/lib/FusionInventory/Agent.pm b/lib/FusionInventory/Agent.pm
index 4ab768e..515ef26 100644
--- a/lib/FusionInventory/Agent.pm
+++ b/lib/FusionInventory/Agent.pm
@@ -7,6 +7,7 @@ use Cwd;
 use English qw(-no_match_vars);
 use UNIVERSAL::require;
 use File::Glob;
+use IO::Handle;
 
 use FusionInventory::Agent::Config;
 use FusionInventory::Agent::HTTP::Client::OCS;
@@ -344,17 +345,24 @@ sub getAvailableTasks {
         my $version;
         if ($self->{config}->{daemon} || $self->{config}->{service}) {
             # server mode: check each task version in a child process
-            my $pid = open(my $handle, '-|');
-            die "fork failed: $ERRNO" unless defined $pid;
+            my ($reader, $writer);
+            pipe($reader, $writer);
+            $writer->autoflush(1);
 
-            if ($pid) {
+            if (my $pid = fork()) {
                 # parent
-                $version = <$handle>;
-                close $handle;
+                close $writer;
+                $version = <$reader>;
+                close $reader;
+                waitpid($pid, 0);
             } else {
                 # child
+                die "fork failed: $ERRNO" unless defined $pid;
+
+                close $reader;
                 $version = $self->_getTaskVersion($module);
-                print $version if $version;
+                print $writer $version if $version;
+                close $writer;
                 exit(0);
             }
         } else {


================================================================
  Commit: 507519756054881264e4cdaff5116d2a619aca26
      https://github.com/fusinv/fusioninventory-agent/commit/507519756054881264e4cdaff5116d2a619aca26
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-03-22 (Thu, 22 Mar 2012)

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

  Log Message:
  -----------
  do not define $SIG{ALRM} in another scope


diff --git a/lib/FusionInventory/Agent/Tools.pm b/lib/FusionInventory/Agent/Tools.pm
index 2614964..af6addd 100644
--- a/lib/FusionInventory/Agent/Tools.pm
+++ b/lib/FusionInventory/Agent/Tools.pm
@@ -442,11 +442,9 @@ sub runFunction {
 
     my $result;
     eval {
+        local $SIG{ALRM} = sub { die "alarm\n" };
         # set a timeout if needed
-       if ($params{timeout}) {
-           local $SIG{ALRM} = sub { die "alarm\n" };
-           alarm $params{timeout};
-       }
+        alarm $params{timeout} if $params{timeout};
 
         no strict 'refs'; ## no critic (ProhibitNoStrict)
         $result = &{$params{module} . '::' . $params{function}}(


================================================================
  Commit: ed6698182956d90a832d6a1e0a9291e3a39d37df
      https://github.com/fusinv/fusioninventory-agent/commit/ed6698182956d90a832d6a1e0a9291e3a39d37df
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-03-30 (Fri, 30 Mar 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/BSD.pm

  Log Message:
  -----------
  use qr/XX/ to protect the regex


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD.pm
index 9e7f4f1..bf9c543 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD.pm
@@ -44,7 +44,7 @@ sub doInventory {
     if (canRun('lsb_release')) {
         $OSName = getFirstMatch(
             command => 'lsb_release -d',
-            pattern => /Description:\s+(.+)/
+            pattern => qr/Description:\s+(.+)/
         );
     }
 


================================================================
  Commit: c2c2302289617ce04e3b10940253853356fa91e8
      https://github.com/fusinv/fusioninventory-agent/commit/c2c2302289617ce04e3b10940253853356fa91e8
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-04-02 (Mon, 02 Apr 2012)

  Changed paths:
    M Changes
    M lib/FusionInventory/Agent.pm

  Log Message:
  -----------
  prepare the 2.2.0 release


diff --git a/Changes b/Changes
index a152f51..4dd3879 100644
--- a/Changes
+++ b/Changes
@@ -1,6 +1,6 @@
 Revision history for FusionInventory agent
 
-2.2.0
+2.2.0  Mon, 02 Apr 2012 14:52:02 +0200
 
 Major changes:
 * large speed improvement: up to 150% for a local inventory
diff --git a/lib/FusionInventory/Agent.pm b/lib/FusionInventory/Agent.pm
index 515ef26..ce06f78 100644
--- a/lib/FusionInventory/Agent.pm
+++ b/lib/FusionInventory/Agent.pm
@@ -22,7 +22,7 @@ use FusionInventory::Agent::Tools;
 use FusionInventory::Agent::Tools::Hostname;
 use FusionInventory::Agent::XML::Query::Prolog;
 
-our $VERSION = '2.1.9904';
+our $VERSION = '2.2.0';
 our $VERSION_STRING = 
     "FusionInventory unified agent for UNIX, Linux and MacOSX ($VERSION)";
 our $AGENT_STRING =


================================================================
  Commit: 122ae9082db4c1383ccf88c8b78d02b48f4ff7f8
      https://github.com/fusinv/fusioninventory-agent/commit/122ae9082db4c1383ccf88c8b78d02b48f4ff7f8
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-04-02 (Mon, 02 Apr 2012)

  Changed paths:
    M lib/FusionInventory/Agent/HTTP/Server.pm

  Log Message:
  -----------
  accpet /now without token

with --httpd-trust=X, the token is not mandatory anymore.


diff --git a/lib/FusionInventory/Agent/HTTP/Server.pm b/lib/FusionInventory/Agent/HTTP/Server.pm
index 4ef83c9..99cb44f 100644
--- a/lib/FusionInventory/Agent/HTTP/Server.pm
+++ b/lib/FusionInventory/Agent/HTTP/Server.pm
@@ -76,7 +76,7 @@ sub _handle {
         }
 
         # now request
-        if ($path =~ m{^/now(?:/(\S+))?$}) {
+        if ($path =~ m{^/now(?:/(\S*))?$}) {
             $self->_handle_now($client, $request, $clientIp, $1);
             last SWITCH;
         }


================================================================
  Commit: 1c40d30e1224a5e29e60726b3a385f0489804679
      https://github.com/fusinv/fusioninventory-agent/commit/1c40d30e1224a5e29e60726b3a385f0489804679
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-04-02 (Mon, 02 Apr 2012)

  Changed paths:
    A lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Softwares.pm
    A lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Softwares/Deb.pm
    A lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Softwares/Gentoo.pm
    A lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Softwares/Pacman.pm
    A lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Softwares/RPM.pm
    A lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Softwares/Slackware.pm
    R lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Softwares/Deb.pm
    R lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Softwares/Gentoo.pm
    R lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Softwares/Pacman.pm
    R lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Softwares/RPM.pm
    R lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Softwares/Slackware.pm

  Log Message:
  -----------
  move in Generic the Linux package inventory

Most of these tools can be used on non-Linux system.


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Softwares.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Softwares.pm
new file mode 100644
index 0000000..b752445
--- /dev/null
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Softwares.pm
@@ -0,0 +1,12 @@
+package FusionInventory::Agent::Task::Inventory::Input::Generic::Softwares;
+
+use strict;
+use warnings;
+
+sub isEnabled {
+    return 1;
+}
+
+sub doInventory {}
+
+1;
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Softwares/Deb.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Softwares/Deb.pm
new file mode 100644
index 0000000..7e1310b
--- /dev/null
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Softwares/Deb.pm
@@ -0,0 +1,62 @@
+package FusionInventory::Agent::Task::Inventory::Input::Generic::Softwares::Deb;
+
+use strict;
+use warnings;
+
+use FusionInventory::Agent::Tools;
+
+sub isEnabled {
+    return canRun('dpkg-query');
+}
+
+sub doInventory {
+    my (%params) = @_;
+
+    my $inventory = $params{inventory};
+    my $logger    = $params{logger};
+
+    my $command =
+        'dpkg-query --show --showformat=\'' .
+        '${Package}\t' .
+        '${Version}\t'.
+        '${Installed-Size}\t' .
+        '${Description}\n' .
+        '\'';
+
+    my $packages = _getPackagesList(
+        logger => $logger, command => $command
+    );
+    return unless $packages;
+
+    foreach my $package (@$packages) {
+        $inventory->addEntry(
+            section => 'SOFTWARES',
+            entry   => $package
+        );
+    }
+}
+
+sub _getPackagesList {
+    my $handle = getFileHandle(@_);
+    return unless $handle;
+
+    my @packages;
+    while (my $line = <$handle>) {
+        # skip descriptions
+        next if $line =~ /^ /;
+        chomp $line;
+        my @infos = split("\t", $line);
+        push @packages, {
+            NAME        => $infos[0],
+            VERSION     => $infos[1],
+            FILESIZE    => $infos[2],
+            COMMENTS    => $infos[3],
+            FROM        => 'deb'
+        };
+    }
+    close $handle;
+
+    return \@packages;
+}
+
+1;
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Softwares/Gentoo.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Softwares/Gentoo.pm
new file mode 100644
index 0000000..8002aec
--- /dev/null
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Softwares/Gentoo.pm
@@ -0,0 +1,64 @@
+package FusionInventory::Agent::Task::Inventory::Input::Generic::Softwares::Gentoo;
+
+use strict;
+use warnings;
+
+use English qw(-no_match_vars);
+
+use FusionInventory::Agent::Tools;
+
+sub isEnabled {
+    return canRun('equery');
+}
+
+sub doInventory {
+    my (%params) = @_;
+
+    my $inventory = $params{inventory};
+    my $logger    = $params{logger};
+
+    my $command = _equeryNeedsWildcard() ?
+        "equery list -i '*'" : "equery list -i";
+
+    my $packages = _getPackagesList(
+        logger => $logger, command => $command
+    );
+
+    foreach my $package (@$packages) {
+        $inventory->addEntry(
+            section => 'SOFTWARES',
+            entry   => $package
+        );
+    }
+}
+
+sub _getPackagesList {
+    my $handle = getFileHandle(@_);
+
+    my @packages;
+    while (my $line = <$handle>) {
+        chomp $line;
+        next unless $line =~ /^(.*)-([0-9]+.*)/;
+        push @packages, {
+            NAME    => $1,
+            VERSION => $2,
+        };
+    }
+    close $handle;
+
+    return \@packages;
+}
+
+# http://forge.fusioninventory.org/issues/852
+sub _equeryNeedsWildcard {
+    my ($major, $minor) = getFirstMatch(
+        command => 'equery -V',
+        pattern => qr/^equery ?\((\d+)\.(\d+)\.\d+\)/,
+        @_
+    );
+
+    # true starting from version 0.3
+    return compareVersion($major, $minor, 0, 3);
+}
+
+1;
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Softwares/Pacman.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Softwares/Pacman.pm
new file mode 100644
index 0000000..0407336
--- /dev/null
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Softwares/Pacman.pm
@@ -0,0 +1,40 @@
+package FusionInventory::Agent::Task::Inventory::Input::Generic::Softwares::Pacman;
+
+use strict;
+use warnings;
+
+use FusionInventory::Agent::Tools;
+
+sub isEnabled {
+    return canRun('pacman');
+}
+
+sub doInventory {
+    my (%params) = @_;
+
+    my $inventory = $params{inventory};
+    my $logger    = $params{logger};
+
+    my $handle = getFileHandle(
+        logger  => $logger,
+        command => 'pacman -Q'
+    );
+    return unless $handle;
+
+    while (my $line = <$handle>) {
+        next unless $line =~ /^(\S+)\s+(\S+)/;
+        my $name = $1;
+        my $version = $2;
+
+       $inventory->addEntry(
+            section => 'SOFTWARES',
+            entry   => {
+                NAME    => $name,
+                VERSION => $version
+            }
+        );
+    }
+    close $handle;
+}
+
+1;
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Softwares/RPM.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Softwares/RPM.pm
new file mode 100644
index 0000000..68434a9
--- /dev/null
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Softwares/RPM.pm
@@ -0,0 +1,65 @@
+package FusionInventory::Agent::Task::Inventory::Input::Generic::Softwares::RPM;
+
+use strict;
+use warnings;
+
+use FusionInventory::Agent::Tools;
+
+sub isEnabled {
+    return canRun('rpm');
+}
+
+sub doInventory {
+    my (%params) = @_;
+
+    my $inventory = $params{inventory};
+    my $logger    = $params{logger};
+
+    my $command =
+        'rpm -qa --queryformat \'' .
+        '%{NAME}\t' .
+        '%{VERSION}-%{RELEASE}\t' .
+        '%{INSTALLTIME:date}\t' .
+        '%{SIZE}\t' .
+        '%{VENDOR}\t' .
+        '%{SUMMARY}\n' . 
+        '\'';
+
+    my $packages = _getPackagesList(
+        logger => $logger, command => $command
+    );
+    return unless $packages;
+
+    foreach my $package (@$packages) {
+        $inventory->addEntry(
+            section => 'SOFTWARES',
+            entry   => $package
+        );
+    }
+}
+
+sub _getPackagesList {
+    my $handle = getFileHandle(@_);
+    return unless $handle;
+
+    my @packages;
+    while (my $line = <$handle>) {
+        chomp $line;
+        my @infos = split("\t", $line);
+        push @packages, {
+            NAME        => $infos[0],
+            VERSION     => $infos[1],
+            INSTALLDATE => $infos[2],
+            FILESIZE    => $infos[3],
+            PUBLISHER   => $infos[4],
+            COMMENTS    => $infos[5],
+            FROM        => 'rpm'
+        };
+    }
+
+    close $handle;
+
+    return \@packages;
+}
+
+1;
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Softwares/Slackware.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Softwares/Slackware.pm
new file mode 100644
index 0000000..f71fc14
--- /dev/null
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Softwares/Slackware.pm
@@ -0,0 +1,39 @@
+package FusionInventory::Agent::Task::Inventory::Input::Generic::Softwares::Slackware;
+
+use strict;
+use warnings;
+
+use FusionInventory::Agent::Tools;
+
+sub isEnabled {
+    return canRun('pkgtool');
+}
+
+sub doInventory {
+    my (%params) = @_;
+
+    my $inventory = $params{inventory};
+    my $logger    = $params{logger};
+
+    my $handle = getDirectoryHandle(
+        directory => '/var/log/packages', logger => $logger
+    );
+    return unless $handle;
+
+    while (my $file = readdir($handle)) {
+        next unless $file =~ /^(.+)([^-]+-[^-]+-[^-]+)$/;
+        my $name = $1;
+        my $version = $2;
+
+        $inventory->addEntry(
+            section => 'SOFTWARES',
+            entry   => {
+                NAME    => $name,
+                VERSION => $version
+            }
+        );
+    }
+    closedir $handle;
+}
+
+1;
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Softwares/Deb.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Softwares/Deb.pm
deleted file mode 100644
index 66ca9fb..0000000
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Softwares/Deb.pm
+++ /dev/null
@@ -1,62 +0,0 @@
-package FusionInventory::Agent::Task::Inventory::Input::Linux::Softwares::Deb;
-
-use strict;
-use warnings;
-
-use FusionInventory::Agent::Tools;
-
-sub isEnabled {
-    return canRun('dpkg-query');
-}
-
-sub doInventory {
-    my (%params) = @_;
-
-    my $inventory = $params{inventory};
-    my $logger    = $params{logger};
-
-    my $command =
-        'dpkg-query --show --showformat=\'' .
-        '${Package}\t' .
-        '${Version}\t'.
-        '${Installed-Size}\t' .
-        '${Description}\n' .
-        '\'';
-
-    my $packages = _getPackagesList(
-        logger => $logger, command => $command
-    );
-    return unless $packages;
-
-    foreach my $package (@$packages) {
-        $inventory->addEntry(
-            section => 'SOFTWARES',
-            entry   => $package
-        );
-    }
-}
-
-sub _getPackagesList {
-    my $handle = getFileHandle(@_);
-    return unless $handle;
-
-    my @packages;
-    while (my $line = <$handle>) {
-        # skip descriptions
-        next if $line =~ /^ /;
-        chomp $line;
-        my @infos = split("\t", $line);
-        push @packages, {
-            NAME        => $infos[0],
-            VERSION     => $infos[1],
-            FILESIZE    => $infos[2],
-            COMMENTS    => $infos[3],
-            FROM        => 'deb'
-        };
-    }
-    close $handle;
-
-    return \@packages;
-}
-
-1;
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Softwares/Gentoo.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Softwares/Gentoo.pm
deleted file mode 100644
index 125e593..0000000
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Softwares/Gentoo.pm
+++ /dev/null
@@ -1,64 +0,0 @@
-package FusionInventory::Agent::Task::Inventory::Input::Linux::Softwares::Gentoo;
-
-use strict;
-use warnings;
-
-use English qw(-no_match_vars);
-
-use FusionInventory::Agent::Tools;
-
-sub isEnabled {
-    return canRun('equery');
-}
-
-sub doInventory {
-    my (%params) = @_;
-
-    my $inventory = $params{inventory};
-    my $logger    = $params{logger};
-
-    my $command = _equeryNeedsWildcard() ?
-        "equery list -i '*'" : "equery list -i";
-
-    my $packages = _getPackagesList(
-        logger => $logger, command => $command
-    );
-
-    foreach my $package (@$packages) {
-        $inventory->addEntry(
-            section => 'SOFTWARES',
-            entry   => $package
-        );
-    }
-}
-
-sub _getPackagesList {
-    my $handle = getFileHandle(@_);
-
-    my @packages;
-    while (my $line = <$handle>) {
-        chomp $line;
-        next unless $line =~ /^(.*)-([0-9]+.*)/;
-        push @packages, {
-            NAME    => $1,
-            VERSION => $2,
-        };
-    }
-    close $handle;
-
-    return \@packages;
-}
-
-# http://forge.fusioninventory.org/issues/852
-sub _equeryNeedsWildcard {
-    my ($major, $minor) = getFirstMatch(
-        command => 'equery -V',
-        pattern => qr/^equery ?\((\d+)\.(\d+)\.\d+\)/,
-        @_
-    );
-
-    # true starting from version 0.3
-    return compareVersion($major, $minor, 0, 3);
-}
-
-1;
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Softwares/Pacman.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Softwares/Pacman.pm
deleted file mode 100644
index 04425ed..0000000
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Softwares/Pacman.pm
+++ /dev/null
@@ -1,40 +0,0 @@
-package FusionInventory::Agent::Task::Inventory::Input::Linux::Softwares::Pacman;
-
-use strict;
-use warnings;
-
-use FusionInventory::Agent::Tools;
-
-sub isEnabled {
-    return canRun('pacman');
-}
-
-sub doInventory {
-    my (%params) = @_;
-
-    my $inventory = $params{inventory};
-    my $logger    = $params{logger};
-
-    my $handle = getFileHandle(
-        logger  => $logger,
-        command => 'pacman -Q'
-    );
-    return unless $handle;
-
-    while (my $line = <$handle>) {
-        next unless $line =~ /^(\S+)\s+(\S+)/;
-        my $name = $1;
-        my $version = $2;
-
-       $inventory->addEntry(
-            section => 'SOFTWARES',
-            entry   => {
-                NAME    => $name,
-                VERSION => $version
-            }
-        );
-    }
-    close $handle;
-}
-
-1;
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Softwares/RPM.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Softwares/RPM.pm
deleted file mode 100644
index 53c27c0..0000000
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Softwares/RPM.pm
+++ /dev/null
@@ -1,65 +0,0 @@
-package FusionInventory::Agent::Task::Inventory::Input::Linux::Softwares::RPM;
-
-use strict;
-use warnings;
-
-use FusionInventory::Agent::Tools;
-
-sub isEnabled {
-    return canRun('rpm');
-}
-
-sub doInventory {
-    my (%params) = @_;
-
-    my $inventory = $params{inventory};
-    my $logger    = $params{logger};
-
-    my $command =
-        'rpm -qa --queryformat \'' .
-        '%{NAME}\t' .
-        '%{VERSION}-%{RELEASE}\t' .
-        '%{INSTALLTIME:date}\t' .
-        '%{SIZE}\t' .
-        '%{VENDOR}\t' .
-        '%{SUMMARY}\n' . 
-        '\'';
-
-    my $packages = _getPackagesList(
-        logger => $logger, command => $command
-    );
-    return unless $packages;
-
-    foreach my $package (@$packages) {
-        $inventory->addEntry(
-            section => 'SOFTWARES',
-            entry   => $package
-        );
-    }
-}
-
-sub _getPackagesList {
-    my $handle = getFileHandle(@_);
-    return unless $handle;
-
-    my @packages;
-    while (my $line = <$handle>) {
-        chomp $line;
-        my @infos = split("\t", $line);
-        push @packages, {
-            NAME        => $infos[0],
-            VERSION     => $infos[1],
-            INSTALLDATE => $infos[2],
-            FILESIZE    => $infos[3],
-            PUBLISHER   => $infos[4],
-            COMMENTS    => $infos[5],
-            FROM        => 'rpm'
-        };
-    }
-
-    close $handle;
-
-    return \@packages;
-}
-
-1;
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Softwares/Slackware.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Softwares/Slackware.pm
deleted file mode 100644
index 25f8418..0000000
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Softwares/Slackware.pm
+++ /dev/null
@@ -1,39 +0,0 @@
-package FusionInventory::Agent::Task::Inventory::Input::Linux::Softwares::Slackware;
-
-use strict;
-use warnings;
-
-use FusionInventory::Agent::Tools;
-
-sub isEnabled {
-    return canRun('pkgtool');
-}
-
-sub doInventory {
-    my (%params) = @_;
-
-    my $inventory = $params{inventory};
-    my $logger    = $params{logger};
-
-    my $handle = getDirectoryHandle(
-        directory => '/var/log/packages', logger => $logger
-    );
-    return unless $handle;
-
-    while (my $file = readdir($handle)) {
-        next unless $file =~ /^(.+)([^-]+-[^-]+-[^-]+)$/;
-        my $name = $1;
-        my $version = $2;
-
-        $inventory->addEntry(
-            section => 'SOFTWARES',
-            entry   => {
-                NAME    => $name,
-                VERSION => $version
-            }
-        );
-    }
-    closedir $handle;
-}
-
-1;


================================================================
  Commit: a18a14a212b4e924cf51b725d1b4486c62abbfb8
      https://github.com/fusinv/fusioninventory-agent/commit/a18a14a212b4e924cf51b725d1b4486c62abbfb8
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-04-02 (Mon, 02 Apr 2012)

  Changed paths:
    M Changes
    M lib/FusionInventory/Agent.pm
    M lib/FusionInventory/Agent/HTTP/Server.pm

  Log Message:
  -----------
  Merge remote-tracking branch 'origin/2.2.x' into 2.2.x


diff --git a/Changes b/Changes
index a152f51..4dd3879 100644
--- a/Changes
+++ b/Changes
@@ -1,6 +1,6 @@
 Revision history for FusionInventory agent
 
-2.2.0
+2.2.0  Mon, 02 Apr 2012 14:52:02 +0200
 
 Major changes:
 * large speed improvement: up to 150% for a local inventory
diff --git a/lib/FusionInventory/Agent.pm b/lib/FusionInventory/Agent.pm
index 515ef26..ce06f78 100644
--- a/lib/FusionInventory/Agent.pm
+++ b/lib/FusionInventory/Agent.pm
@@ -22,7 +22,7 @@ use FusionInventory::Agent::Tools;
 use FusionInventory::Agent::Tools::Hostname;
 use FusionInventory::Agent::XML::Query::Prolog;
 
-our $VERSION = '2.1.9904';
+our $VERSION = '2.2.0';
 our $VERSION_STRING = 
     "FusionInventory unified agent for UNIX, Linux and MacOSX ($VERSION)";
 our $AGENT_STRING =
diff --git a/lib/FusionInventory/Agent/HTTP/Server.pm b/lib/FusionInventory/Agent/HTTP/Server.pm
index 4ef83c9..99cb44f 100644
--- a/lib/FusionInventory/Agent/HTTP/Server.pm
+++ b/lib/FusionInventory/Agent/HTTP/Server.pm
@@ -76,7 +76,7 @@ sub _handle {
         }
 
         # now request
-        if ($path =~ m{^/now(?:/(\S+))?$}) {
+        if ($path =~ m{^/now(?:/(\S*))?$}) {
             $self->_handle_now($client, $request, $clientIp, $1);
             last SWITCH;
         }


================================================================
  Commit: d6592042c174b4490fd12d22d9d7dd799ca6e9e0
      https://github.com/fusinv/fusioninventory-agent/commit/d6592042c174b4490fd12d22d9d7dd799ca6e9e0
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-04-02 (Mon, 02 Apr 2012)

  Changed paths:
    M t/inventory/linux/softwares.t

  Log Message:
  -----------
  fix test broken by commit #1c40d30


diff --git a/t/inventory/linux/softwares.t b/t/inventory/linux/softwares.t
index 3afbcbb..661da0e 100755
--- a/t/inventory/linux/softwares.t
+++ b/t/inventory/linux/softwares.t
@@ -5,9 +5,9 @@ use warnings;
 
 use Test::More;
 
-use FusionInventory::Agent::Task::Inventory::Input::Linux::Softwares::RPM;
-use FusionInventory::Agent::Task::Inventory::Input::Linux::Softwares::Deb;
-use FusionInventory::Agent::Task::Inventory::Input::Linux::Softwares::Gentoo;
+use FusionInventory::Agent::Task::Inventory::Input::Generic::Softwares::RPM;
+use FusionInventory::Agent::Task::Inventory::Input::Generic::Softwares::Deb;
+use FusionInventory::Agent::Task::Inventory::Input::Generic::Softwares::Gentoo;
 
 my $rpm_packages = [
     {
@@ -102,25 +102,25 @@ my $deb_packages = [
 plan tests => 4;
 
 my $packages;
-$packages = FusionInventory::Agent::Task::Inventory::Input::Linux::Softwares::RPM::_getPackagesList(
+$packages = FusionInventory::Agent::Task::Inventory::Input::Generic::Softwares::RPM::_getPackagesList(
     file => "resources/linux/packaging/rpm"
 );
 is_deeply($packages, $rpm_packages, 'rpm parsing');
 
-$packages = FusionInventory::Agent::Task::Inventory::Input::Linux::Softwares::Deb::_getPackagesList(
+$packages = FusionInventory::Agent::Task::Inventory::Input::Generic::Softwares::Deb::_getPackagesList(
     file => "resources/linux/packaging/dpkg"
 );
 is_deeply($packages, $deb_packages, 'dpkg parsing');
 
 ok(
-    !FusionInventory::Agent::Task::Inventory::Input::Linux::Softwares::Gentoo::_equeryNeedsWildcard(
+    !FusionInventory::Agent::Task::Inventory::Input::Generic::Softwares::Gentoo::_equeryNeedsWildcard(
         file => "resources/linux/equery/gentoo1"
     ),
     "old equery version"
 );
 
 ok(
-    FusionInventory::Agent::Task::Inventory::Input::Linux::Softwares::Gentoo::_equeryNeedsWildcard(
+    FusionInventory::Agent::Task::Inventory::Input::Generic::Softwares::Gentoo::_equeryNeedsWildcard(
         file => "resources/linux/equery/gentoo2"
     ),
     "new equery version"


================================================================
  Commit: b5a736f6fee4ca91005b7b8019922d7b9d07a4e6
      https://github.com/fusinv/fusioninventory-agent/commit/b5a736f6fee4ca91005b7b8019922d7b9d07a4e6
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-04-02 (Mon, 02 Apr 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Softwares.pm

  Log Message:
  -----------
  fix breakage introduced  by commit #1c40d30


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Softwares.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Softwares.pm
index b752445..6cdce6f 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Softwares.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Softwares.pm
@@ -4,7 +4,9 @@ use strict;
 use warnings;
 
 sub isEnabled {
-    return 1;
+    my (%params) = @_;
+
+    return !$params{no_category}->{software};
 }
 
 sub doInventory {}


================================================================
  Commit: 552b4777913406c7b05d5a55e8f30613d914dd3f
      https://github.com/fusinv/fusioninventory-agent/commit/552b4777913406c7b05d5a55e8f30613d914dd3f
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-04-02 (Mon, 02 Apr 2012)

  Changed paths:
    R lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Softwares.pm

  Log Message:
  -----------
  useless now


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Softwares.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Softwares.pm
deleted file mode 100644
index d9db905..0000000
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Softwares.pm
+++ /dev/null
@@ -1,17 +0,0 @@
-package FusionInventory::Agent::Task::Inventory::Input::Linux::Softwares;
-
-use strict;
-use warnings;
-
-use FusionInventory::Agent::Tools;
-
-sub isEnabled {
-    my (%params) = @_;
-
-    return !$params{no_category}->{software};
-}
-
-sub doInventory {
-}
-
-1;


================================================================
  Commit: 9c47c0634b6d704ca9793586eef40def60b6f984
      https://github.com/fusinv/fusioninventory-agent/commit/9c47c0634b6d704ca9793586eef40def60b6f984
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-04-02 (Mon, 02 Apr 2012)

  Changed paths:
    M t/apps/agent.t

  Log Message:
  -----------
  better test descriptions


diff --git a/t/apps/agent.t b/t/apps/agent.t
index a76ebdd..ab336a3 100755
--- a/t/apps/agent.t
+++ b/t/apps/agent.t
@@ -131,13 +131,13 @@ ok(
 
 ok(
     ref $content->{REQUEST}->{CONTENT}->{SOFTWARES} eq 'HASH',
-    'inventory has expected software list'
+    'inventory contains only one software'
 );
 
 ok(
     $content->{REQUEST}->{CONTENT}->{SOFTWARES}->{NAME} eq 'foo' &&
     $content->{REQUEST}->{CONTENT}->{SOFTWARES}->{VERSION} eq 'bar',
-    'expected software'
+    'inventory contains the expected software'
 );
 
 ok(


================================================================
  Commit: c07436b5f5e3c1f40dc4a90c547fea3a08796493
      https://github.com/fusinv/fusioninventory-agent/commit/c07436b5f5e3c1f40dc4a90c547fea3a08796493
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-04-03 (Tue, 03 Apr 2012)

  Changed paths:
    M Changes

  Log Message:
  -----------
  refresh the date of the 2.2.0 release


diff --git a/Changes b/Changes
index 4dd3879..2d8ea9c 100644
--- a/Changes
+++ b/Changes
@@ -1,6 +1,6 @@
 Revision history for FusionInventory agent
 
-2.2.0  Mon, 02 Apr 2012 14:52:02 +0200
+2.2.0  Tue, 03 Apr 2012 11:36:51 +0200
 
 Major changes:
 * large speed improvement: up to 150% for a local inventory


================================================================
  Commit: c8b6562e7013c2b187a2636003a7d659cf97c49a
      https://github.com/fusinv/fusioninventory-agent/commit/c8b6562e7013c2b187a2636003a7d659cf97c49a
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-04-03 (Tue, 03 Apr 2012)

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

  Log Message:
  -----------
  don't use File::Which for absolute pathes


diff --git a/lib/FusionInventory/Agent/Tools.pm b/lib/FusionInventory/Agent/Tools.pm
index af6addd..39b4a71 100644
--- a/lib/FusionInventory/Agent/Tools.pm
+++ b/lib/FusionInventory/Agent/Tools.pm
@@ -333,7 +333,9 @@ sub getLinesCount {
 sub canRun {
     my ($binary) = @_;
 
-    return scalar(which($binary));
+    return $binary =~ m{^/} ?
+        -x $binary :            # full path
+        scalar(which($binary)); # executable name
 }
 
 sub canRead {


================================================================
  Commit: 05e5caa1e30a3a93ca7166d3d33edac87f26db66
      https://github.com/fusinv/fusioninventory-agent/commit/05e5caa1e30a3a93ca7166d3d33edac87f26db66
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-04-03 (Tue, 03 Apr 2012)

  Changed paths:
    A resources/generic/ifconfig/linux-archlinux

  Log Message:
  -----------
  initial import


diff --git a/resources/generic/ifconfig/linux-archlinux b/resources/generic/ifconfig/linux-archlinux
new file mode 100644
index 0000000..9758367
--- /dev/null
+++ b/resources/generic/ifconfig/linux-archlinux
@@ -0,0 +1,25 @@
+eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500  metric 1
+        inet 192.168.2.43  netmask 255.255.255.0  broadcast 192.168.2.255
+        inet6 fe80::4a5b:39ff:fec6:53ba  prefixlen 64  scopeid 0x20<link>
+        ether 48:5b:39:c6:53:ba  txqueuelen 1000  (Ethernet)
+        RX packets 20124909  bytes 3625717309 (3.3 GiB)
+        RX errors 0  dropped 82  overruns 0  frame 0
+        TX packets 15743857  bytes 2221212850 (2.0 GiB)
+        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
+        device interrupt 43  base 0x8000  
+
+lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 16436  metric 1
+        inet 127.0.0.1  netmask 255.0.0.0
+        inet6 ::1  prefixlen 128  scopeid 0x10<host>
+        loop  txqueuelen 0  (Local Loopback)
+        RX packets 69371  bytes 3675083 (3.5 MiB)
+        RX errors 0  dropped 0  overruns 0  frame 0
+        TX packets 69371  bytes 3675083 (3.5 MiB)
+        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
+
+vboxnet0: flags=4098<BROADCAST,MULTICAST>  mtu 1500  metric 1
+        ether 0a:00:27:00:00:00  txqueuelen 1000  (Ethernet)
+        RX packets 0  bytes 0 (0.0 B)
+        RX errors 0  dropped 0  overruns 0  frame 0
+        TX packets 0  bytes 0 (0.0 B)
+        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0


================================================================
  Commit: b24ed53b7aaa42894be6b2fd377e22ca85140600
      https://github.com/fusinv/fusioninventory-agent/commit/b24ed53b7aaa42894be6b2fd377e22ca85140600
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-04-03 (Tue, 03 Apr 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/AIX/LVM.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Networks.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Distro/LSB.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Distro/NonLSB.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Linux/LVM.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Networks.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Linux/iLO.pm
    M lib/FusionInventory/Agent/Tools/Solaris.pm

  Log Message:
  -----------
  use consistent quoting character everywhere


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/AIX/LVM.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/AIX/LVM.pm
index 3bb8c7f..72bc1b9 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/AIX/LVM.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/AIX/LVM.pm
@@ -8,7 +8,7 @@ use warnings;
 use English qw(-no_match_vars);
 
 sub isEnabled {
-    canRun("lspv");
+    canRun('lspv');
 }
 
 sub doInventory {
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Networks.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Networks.pm
index 44b26fb..6e23255 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Networks.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Networks.pm
@@ -8,7 +8,7 @@ use FusionInventory::Agent::Tools::Network;
 use FusionInventory::Agent::Tools::Unix;
 
 sub isEnabled {
-    return canRun("ifconfig");
+    return canRun('ifconfig');
 }
 
 sub doInventory {
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Distro/LSB.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Distro/LSB.pm
index 4792d11..835df43 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Distro/LSB.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Distro/LSB.pm
@@ -6,7 +6,7 @@ use warnings;
 use FusionInventory::Agent::Tools;
 
 sub isEnabled {
-    return canRun("lsb_release");
+    return canRun('lsb_release');
 }
 
 sub doInventory {
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Distro/NonLSB.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Distro/NonLSB.pm
index a42afe6..97a36f1 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Distro/NonLSB.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Distro/NonLSB.pm
@@ -63,7 +63,7 @@ our $runMeIfTheseChecksFailed =
     ["FusionInventory::Agent::Task::Inventory::Input::Linux::Distro::LSB"];
 
 sub isEnabled {
-    return !canRun("lsb_release");
+    return !canRun('lsb_release');
 }
 
 sub doInventory {
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/LVM.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/LVM.pm
index 997617d..143f50d 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/LVM.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/LVM.pm
@@ -8,7 +8,7 @@ use English qw(-no_match_vars);
 use FusionInventory::Agent::Tools;
 
 sub isEnabled {
-    canRun("lvs");
+    canRun('lvs');
 }
 
 sub doInventory {
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Networks.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Networks.pm
index 5fdf0a0..703646e 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Networks.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Networks.pm
@@ -44,7 +44,7 @@ sub _getInterfaces {
 
     my $logger = $params{logger};
 
-    my @interfaces = canRun("/sbin/ip") ?
+    my @interfaces = canRun('/sbin/ip') ?
         getInterfacesFromIp(logger => $logger):
         getInterfacesFromIfconfig(logger => $logger);
 
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/iLO.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/iLO.pm
index a78752e..a5787de 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/iLO.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/iLO.pm
@@ -7,7 +7,7 @@ use FusionInventory::Agent::Tools;
 use FusionInventory::Agent::Tools::Network;
 
 sub isEnabled {
-    return unless canRun("hponcfg");
+    return unless canRun('hponcfg');
 }
 
 sub _parseHponcfg {
diff --git a/lib/FusionInventory/Agent/Tools/Solaris.pm b/lib/FusionInventory/Agent/Tools/Solaris.pm
index 6103956..c249d71 100644
--- a/lib/FusionInventory/Agent/Tools/Solaris.pm
+++ b/lib/FusionInventory/Agent/Tools/Solaris.pm
@@ -38,7 +38,7 @@ memoize('getClass');
 
 sub getZone {
 
-    return 'global' unless canRun("zonename");
+    return 'global' unless canRun('zonename');
 
     my $zone = getFirstLine(command => 'zonename');
 


================================================================
  Commit: 9808a364f662e941ade86c30b2997a7ca51a764a
      https://github.com/fusinv/fusioninventory-agent/commit/9808a364f662e941ade86c30b2997a7ca51a764a
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-04-03 (Tue, 03 Apr 2012)

  Changed paths:
    M t/components/client/ssl.t

  Log Message:
  -----------
  better phrasing


diff --git a/t/components/client/ssl.t b/t/components/client/ssl.t
index 62ea6bc..a852de1 100755
--- a/t/components/client/ssl.t
+++ b/t/components/client/ssl.t
@@ -114,7 +114,7 @@ $server->background();
 
 
 SKIP: {
-skip "Too all LWP for alternate hostname", 1 unless $LWP::VERSION >= 6;
+skip "LWP version too old, skipping", 1 unless $LWP::VERSION >= 6;
 ok(
     $secure_client->request(HTTP::Request->new(GET => $url))->is_success(),
     'trusted certificate, alternate hostname: connection success'
@@ -200,8 +200,7 @@ ok(
 );
 
 SKIP: {
-skip "Check disabled on LWP<6", 1 unless $LWP::VERSION >= 6;
-# Unless you wan to fix this
+skip "LWP version too old, skipping", 1 unless $LWP::VERSION >= 6;
 ok(
     $unsafe_client->request(HTTP::Request->new(GET => $url))->is_success(),
     'untrusted certificate, correct hostname, no check: connection success'


================================================================
  Commit: 9edbb9551031ceec0d0a0aa4117d035cf881c15d
      https://github.com/fusinv/fusioninventory-agent/commit/9edbb9551031ceec0d0a0aa4117d035cf881c15d
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-04-03 (Tue, 03 Apr 2012)

  Changed paths:
    M t/FusionInventory/Test/Utils.pm

  Log Message:
  -----------
  check proper localhost resolution


diff --git a/t/FusionInventory/Test/Utils.pm b/t/FusionInventory/Test/Utils.pm
index e2e5e17..5bf0a88 100644
--- a/t/FusionInventory/Test/Utils.pm
+++ b/t/FusionInventory/Test/Utils.pm
@@ -7,8 +7,11 @@ use base 'Exporter';
 use English qw(-no_match_vars);
 use Socket;
 
+use FusionInventory::Agent::Tools;
+
 our @EXPORT = qw(
     test_port
+    test_localhost
     mockGetWmiObjects
     mockGetRegistryKey
 );
@@ -29,6 +32,20 @@ sub test_port {
     return 0;
 }
 
+sub test_localhost {
+
+    return 0 unless inet_aton('localhost');
+
+    my $ipv6;
+    eval {
+        my ($err, @result) = Socket::getaddrinfo("localhost", "http");
+        $ipv6 = any { $_->{family} == Socket::PF_INET6 } @result;
+    };
+    return 0 if $ipv6;
+
+    return 1;
+}
+
 sub mockGetWmiObjects {
     my ($test) = @_;
 


================================================================
  Commit: 654d5c38fb7a23be72cee972ac155ab37bd36e34
      https://github.com/fusinv/fusioninventory-agent/commit/654d5c38fb7a23be72cee972ac155ab37bd36e34
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-04-03 (Tue, 03 Apr 2012)

  Changed paths:
    M t/components/client/connection.t
    M t/components/client/ssl.t

  Log Message:
  -----------
  skip tests for IPv6 localhost (close #1540)


diff --git a/t/components/client/connection.t b/t/components/client/connection.t
index 1f1d255..e301eb0 100755
--- a/t/components/client/connection.t
+++ b/t/components/client/connection.t
@@ -6,6 +6,7 @@ use lib 't';
 
 use English qw(-no_match_vars);
 use HTTP::Request;
+
 use Test::More;
 use Test::Exception;
 
@@ -34,6 +35,9 @@ my $client = FusionInventory::Agent::HTTP::Client->new(
 # no connection tests
 BAIL_OUT("port aleady used") if test_port(8080);
 
+# check than 'localhost' resolves, to an IPv4 address only
+my $localhost_ok = test_localhost();
+
 subtest "no response" => sub {
     check_response_nok(
         $client,
@@ -103,6 +107,7 @@ $server->stop();
 SKIP: {
 skip 'non working test under MacOS', 12 if $OSNAME eq 'darwin';
 skip 'non working test under Windows', 12 if $OSNAME eq 'MSWin32';
+skip 'non working test without pure IPv4 localhost', 12 if !$localhost_ok;
 # https connection tests
 
 $server = FusionInventory::Test::Server->new(
@@ -217,6 +222,7 @@ $server->stop();
 
 SKIP: {
 skip 'non working test under Windows', 18 if $OSNAME eq 'MSWin32';
+skip 'non working test without pure IPv4 localhost', 18 if !$localhost_ok;
 # http connection through proxy tests
 
 $server = FusionInventory::Test::Server->new(
diff --git a/t/components/client/ssl.t b/t/components/client/ssl.t
index a852de1..98122ea 100755
--- a/t/components/client/ssl.t
+++ b/t/components/client/ssl.t
@@ -13,8 +13,15 @@ use FusionInventory::Agent::HTTP::Client;
 use FusionInventory::Test::Server;
 use FusionInventory::Test::Utils;
 
-if ($OSNAME eq 'MSWin32' || $OSNAME eq 'darwin') {
-    plan skip_all => 'non working test on Windows and MacOS';
+# check than 'localhost' resolves, to an IPv4 address only
+my $localhost_ok = test_localhost();
+
+if (!$localhost_ok) {
+    plan skip_all => 'non working test without pure IPv4 localhost';
+} elsif ($OSNAME eq 'MSWin32') {
+    plan skip_all => 'non working test on Windows';
+} elsif ($OSNAME eq 'darwin') {
+    plan skip_all => 'non working test on MacOS';
 } else {
     plan tests => 8;
 }


================================================================
  Commit: ce140292a8fbffc77f5b40b337c81227a2abd002
      https://github.com/fusinv/fusioninventory-agent/commit/ce140292a8fbffc77f5b40b337c81227a2abd002
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-04-04 (Wed, 04 Apr 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Logger/Stderr.pm

  Log Message:
  -----------
  avoid warning of log level is 'debug2'


diff --git a/lib/FusionInventory/Agent/Logger/Stderr.pm b/lib/FusionInventory/Agent/Logger/Stderr.pm
index 3e9959c..cc64568 100644
--- a/lib/FusionInventory/Agent/Logger/Stderr.pm
+++ b/lib/FusionInventory/Agent/Logger/Stderr.pm
@@ -31,7 +31,7 @@ sub addMessage {
             $format = "\033[1;31m[%s] %s\033[0m\n";
         } elsif ($level eq 'info') {
             $format = "\033[1;34m[%s]\033[0m %s\n";
-        } elsif ($level eq 'debug') {
+        } elsif ($level =~ /^debug/ ) {
             $format = "\033[1;1m[%s]\033[0m %s\n";
         }
     } else {


================================================================
  Commit: a94fefab67983fc23a354a7a2512e9582b0617f5
      https://github.com/fusinv/fusioninventory-agent/commit/a94fefab67983fc23a354a7a2512e9582b0617f5
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-04-04 (Wed, 04 Apr 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/AIX/LVM.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Networks.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Distro/LSB.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Distro/NonLSB.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Linux/LVM.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Networks.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Linux/iLO.pm
    M lib/FusionInventory/Agent/Tools.pm
    M lib/FusionInventory/Agent/Tools/Solaris.pm
    A resources/generic/ifconfig/linux-archlinux
    M t/FusionInventory/Test/Utils.pm
    M t/components/client/connection.t
    M t/components/client/ssl.t

  Log Message:
  -----------
  Merge remote-tracking branch 'origin/2.2.x' into 2.2.x


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/AIX/LVM.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/AIX/LVM.pm
index 3bb8c7f..72bc1b9 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/AIX/LVM.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/AIX/LVM.pm
@@ -8,7 +8,7 @@ use warnings;
 use English qw(-no_match_vars);
 
 sub isEnabled {
-    canRun("lspv");
+    canRun('lspv');
 }
 
 sub doInventory {
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Networks.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Networks.pm
index 44b26fb..6e23255 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Networks.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Networks.pm
@@ -8,7 +8,7 @@ use FusionInventory::Agent::Tools::Network;
 use FusionInventory::Agent::Tools::Unix;
 
 sub isEnabled {
-    return canRun("ifconfig");
+    return canRun('ifconfig');
 }
 
 sub doInventory {
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Distro/LSB.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Distro/LSB.pm
index 4792d11..835df43 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Distro/LSB.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Distro/LSB.pm
@@ -6,7 +6,7 @@ use warnings;
 use FusionInventory::Agent::Tools;
 
 sub isEnabled {
-    return canRun("lsb_release");
+    return canRun('lsb_release');
 }
 
 sub doInventory {
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Distro/NonLSB.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Distro/NonLSB.pm
index a42afe6..97a36f1 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Distro/NonLSB.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Distro/NonLSB.pm
@@ -63,7 +63,7 @@ our $runMeIfTheseChecksFailed =
     ["FusionInventory::Agent::Task::Inventory::Input::Linux::Distro::LSB"];
 
 sub isEnabled {
-    return !canRun("lsb_release");
+    return !canRun('lsb_release');
 }
 
 sub doInventory {
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/LVM.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/LVM.pm
index 997617d..143f50d 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/LVM.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/LVM.pm
@@ -8,7 +8,7 @@ use English qw(-no_match_vars);
 use FusionInventory::Agent::Tools;
 
 sub isEnabled {
-    canRun("lvs");
+    canRun('lvs');
 }
 
 sub doInventory {
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Networks.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Networks.pm
index 5fdf0a0..703646e 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Networks.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Networks.pm
@@ -44,7 +44,7 @@ sub _getInterfaces {
 
     my $logger = $params{logger};
 
-    my @interfaces = canRun("/sbin/ip") ?
+    my @interfaces = canRun('/sbin/ip') ?
         getInterfacesFromIp(logger => $logger):
         getInterfacesFromIfconfig(logger => $logger);
 
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/iLO.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/iLO.pm
index a78752e..a5787de 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/iLO.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/iLO.pm
@@ -7,7 +7,7 @@ use FusionInventory::Agent::Tools;
 use FusionInventory::Agent::Tools::Network;
 
 sub isEnabled {
-    return unless canRun("hponcfg");
+    return unless canRun('hponcfg');
 }
 
 sub _parseHponcfg {
diff --git a/lib/FusionInventory/Agent/Tools.pm b/lib/FusionInventory/Agent/Tools.pm
index af6addd..39b4a71 100644
--- a/lib/FusionInventory/Agent/Tools.pm
+++ b/lib/FusionInventory/Agent/Tools.pm
@@ -333,7 +333,9 @@ sub getLinesCount {
 sub canRun {
     my ($binary) = @_;
 
-    return scalar(which($binary));
+    return $binary =~ m{^/} ?
+        -x $binary :            # full path
+        scalar(which($binary)); # executable name
 }
 
 sub canRead {
diff --git a/lib/FusionInventory/Agent/Tools/Solaris.pm b/lib/FusionInventory/Agent/Tools/Solaris.pm
index 6103956..c249d71 100644
--- a/lib/FusionInventory/Agent/Tools/Solaris.pm
+++ b/lib/FusionInventory/Agent/Tools/Solaris.pm
@@ -38,7 +38,7 @@ memoize('getClass');
 
 sub getZone {
 
-    return 'global' unless canRun("zonename");
+    return 'global' unless canRun('zonename');
 
     my $zone = getFirstLine(command => 'zonename');
 
diff --git a/resources/generic/ifconfig/linux-archlinux b/resources/generic/ifconfig/linux-archlinux
new file mode 100644
index 0000000..9758367
--- /dev/null
+++ b/resources/generic/ifconfig/linux-archlinux
@@ -0,0 +1,25 @@
+eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500  metric 1
+        inet 192.168.2.43  netmask 255.255.255.0  broadcast 192.168.2.255
+        inet6 fe80::4a5b:39ff:fec6:53ba  prefixlen 64  scopeid 0x20<link>
+        ether 48:5b:39:c6:53:ba  txqueuelen 1000  (Ethernet)
+        RX packets 20124909  bytes 3625717309 (3.3 GiB)
+        RX errors 0  dropped 82  overruns 0  frame 0
+        TX packets 15743857  bytes 2221212850 (2.0 GiB)
+        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
+        device interrupt 43  base 0x8000  
+
+lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 16436  metric 1
+        inet 127.0.0.1  netmask 255.0.0.0
+        inet6 ::1  prefixlen 128  scopeid 0x10<host>
+        loop  txqueuelen 0  (Local Loopback)
+        RX packets 69371  bytes 3675083 (3.5 MiB)
+        RX errors 0  dropped 0  overruns 0  frame 0
+        TX packets 69371  bytes 3675083 (3.5 MiB)
+        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
+
+vboxnet0: flags=4098<BROADCAST,MULTICAST>  mtu 1500  metric 1
+        ether 0a:00:27:00:00:00  txqueuelen 1000  (Ethernet)
+        RX packets 0  bytes 0 (0.0 B)
+        RX errors 0  dropped 0  overruns 0  frame 0
+        TX packets 0  bytes 0 (0.0 B)
+        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
diff --git a/t/FusionInventory/Test/Utils.pm b/t/FusionInventory/Test/Utils.pm
index e2e5e17..5bf0a88 100644
--- a/t/FusionInventory/Test/Utils.pm
+++ b/t/FusionInventory/Test/Utils.pm
@@ -7,8 +7,11 @@ use base 'Exporter';
 use English qw(-no_match_vars);
 use Socket;
 
+use FusionInventory::Agent::Tools;
+
 our @EXPORT = qw(
     test_port
+    test_localhost
     mockGetWmiObjects
     mockGetRegistryKey
 );
@@ -29,6 +32,20 @@ sub test_port {
     return 0;
 }
 
+sub test_localhost {
+
+    return 0 unless inet_aton('localhost');
+
+    my $ipv6;
+    eval {
+        my ($err, @result) = Socket::getaddrinfo("localhost", "http");
+        $ipv6 = any { $_->{family} == Socket::PF_INET6 } @result;
+    };
+    return 0 if $ipv6;
+
+    return 1;
+}
+
 sub mockGetWmiObjects {
     my ($test) = @_;
 
diff --git a/t/components/client/connection.t b/t/components/client/connection.t
index 1f1d255..e301eb0 100755
--- a/t/components/client/connection.t
+++ b/t/components/client/connection.t
@@ -6,6 +6,7 @@ use lib 't';
 
 use English qw(-no_match_vars);
 use HTTP::Request;
+
 use Test::More;
 use Test::Exception;
 
@@ -34,6 +35,9 @@ my $client = FusionInventory::Agent::HTTP::Client->new(
 # no connection tests
 BAIL_OUT("port aleady used") if test_port(8080);
 
+# check than 'localhost' resolves, to an IPv4 address only
+my $localhost_ok = test_localhost();
+
 subtest "no response" => sub {
     check_response_nok(
         $client,
@@ -103,6 +107,7 @@ $server->stop();
 SKIP: {
 skip 'non working test under MacOS', 12 if $OSNAME eq 'darwin';
 skip 'non working test under Windows', 12 if $OSNAME eq 'MSWin32';
+skip 'non working test without pure IPv4 localhost', 12 if !$localhost_ok;
 # https connection tests
 
 $server = FusionInventory::Test::Server->new(
@@ -217,6 +222,7 @@ $server->stop();
 
 SKIP: {
 skip 'non working test under Windows', 18 if $OSNAME eq 'MSWin32';
+skip 'non working test without pure IPv4 localhost', 18 if !$localhost_ok;
 # http connection through proxy tests
 
 $server = FusionInventory::Test::Server->new(
diff --git a/t/components/client/ssl.t b/t/components/client/ssl.t
index 62ea6bc..98122ea 100755
--- a/t/components/client/ssl.t
+++ b/t/components/client/ssl.t
@@ -13,8 +13,15 @@ use FusionInventory::Agent::HTTP::Client;
 use FusionInventory::Test::Server;
 use FusionInventory::Test::Utils;
 
-if ($OSNAME eq 'MSWin32' || $OSNAME eq 'darwin') {
-    plan skip_all => 'non working test on Windows and MacOS';
+# check than 'localhost' resolves, to an IPv4 address only
+my $localhost_ok = test_localhost();
+
+if (!$localhost_ok) {
+    plan skip_all => 'non working test without pure IPv4 localhost';
+} elsif ($OSNAME eq 'MSWin32') {
+    plan skip_all => 'non working test on Windows';
+} elsif ($OSNAME eq 'darwin') {
+    plan skip_all => 'non working test on MacOS';
 } else {
     plan tests => 8;
 }
@@ -114,7 +121,7 @@ $server->background();
 
 
 SKIP: {
-skip "Too all LWP for alternate hostname", 1 unless $LWP::VERSION >= 6;
+skip "LWP version too old, skipping", 1 unless $LWP::VERSION >= 6;
 ok(
     $secure_client->request(HTTP::Request->new(GET => $url))->is_success(),
     'trusted certificate, alternate hostname: connection success'
@@ -200,8 +207,7 @@ ok(
 );
 
 SKIP: {
-skip "Check disabled on LWP<6", 1 unless $LWP::VERSION >= 6;
-# Unless you wan to fix this
+skip "LWP version too old, skipping", 1 unless $LWP::VERSION >= 6;
 ok(
     $unsafe_client->request(HTTP::Request->new(GET => $url))->is_success(),
     'untrusted certificate, correct hostname, no check: connection success'


================================================================
  Commit: 3528abfbefd26a4c68bca234b038c8551ba4982e
      https://github.com/fusinv/fusioninventory-agent/commit/3528abfbefd26a4c68bca234b038c8551ba4982e
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-04-04 (Wed, 04 Apr 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Tools/Linux.pm
    A resources/linux/ip/ip_addr-3
    M t/tools/linux.t

  Log Message:
  -----------
  improve "ip addr show" parsing

-do not ignore interface with no UP or DOWN in the status
-do not ignore the last interface
-do not keep only the last IPv4 address anymore. Create a <NETWORKS />
per address instead.


diff --git a/lib/FusionInventory/Agent/Tools/Linux.pm b/lib/FusionInventory/Agent/Tools/Linux.pm
index ec5a364..1ba3cd4 100644
--- a/lib/FusionInventory/Agent/Tools/Linux.pm
+++ b/lib/FusionInventory/Agent/Tools/Linux.pm
@@ -313,25 +313,47 @@ sub getInterfacesFromIp {
 
     my @interfaces;
     my $interface;
+    my @adresses;
 
-    while (my $line = <$handle>) {
+    my @lines = <$handle>;
+    # We parse the output in the reverse order
+    while (my $line = pop(@lines)) {
         chomp $line;
-        if ($line =~ /^\d+:\s+(\S+): .*(UP|DOWN)/) {
-            push @interfaces, $interface if $interface;
-            $interface = {
-                DESCRIPTION => $1,
-                STATUS      => ucfirst(lc($2))
-            };
+        if ($line =~ /^\d+:\s+(\S+): .*<(.+?)>(.*)/) {
+            my $status;
+            $interface->{DESCRIPTION} = $1;
+
+            if ($3 =~ /state DOWN /) {
+                $interface->{STATUS} = 'Down';
+            } else {
+                foreach (split(/,/, $2)) {
+                    next unless /^(UP|DOWN)$/;
+                    $interface->{STATUS} = ucfirst(lc($1));
+                }
+            }
+
+            if (@adresses) {
+                foreach my $if (@adresses) {
+                    foreach (keys %$interface) {
+                        $if->{$_} = $interface->{$_};
+                    }
+                    unshift @interfaces, $if;
+                }
+            } else {
+                unshift @interfaces, $interface;
+            }
+            $interface = {};
+            @adresses = ();
         } elsif ($line =~ /link\/ether ($mac_address_pattern)/) {
             $interface->{MACADDR} = $1;
         } elsif ($line =~ /inet6 (\S+)\//) {
-            $interface->{IPADDRESS6} = $1;
+            push @adresses, {IPADDRESS6 => $1}
         } elsif ($line =~ /inet ($ip_address_pattern)\/(\d{1,3})/) {
-            $interface->{IPADDRESS} = $1;
-            $interface->{IPMASK}    = getNetworkMask($2);
-            $interface->{IPSUBNET}  = getSubnetAddress(
-                $interface->{IPADDRESS}, $interface->{IPMASK}
-            );
+            my $ifAddr = {};
+            $ifAddr->{IPADDRESS} = $1;
+            $ifAddr->{IPMASK} = getNetworkMask($2);
+            $ifAddr->{IPSUBNET} = getSubnetAddress($interface->{IPADDRESS}, $interface->{IPMASK});
+            push @adresses, $ifAddr if $ifAddr->{IPADDRESS};
         }
     }
 
diff --git a/resources/linux/ip/ip_addr-3 b/resources/linux/ip/ip_addr-3
new file mode 100644
index 0000000..fc0f8c2
--- /dev/null
+++ b/resources/linux/ip/ip_addr-3
@@ -0,0 +1,12 @@
+1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue 
+    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
+    inet 127.0.0.1/8 scope host lo
+    inet6 ::1/128 scope host 
+       valid_lft forever preferred_lft forever
+2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
+    link/ether 00:50:56:8b:70:b7 brd ff:ff:ff:ff:ff:ff
+    inet 10.40.1.16/24 brd 10.40.1.255 scope global eth0
+    inet6 fe80::250:56ff:fe8b:70b7/64 scope link 
+       valid_lft forever preferred_lft forever
+3: sit0: <NOARP> mtu 1480 qdisc noop 
+    link/sit 0.0.0.0 brd 0.0.0.0
diff --git a/t/tools/linux.t b/t/tools/linux.t
index ffb4172..a57d8e5 100755
--- a/t/tools/linux.t
+++ b/t/tools/linux.t
@@ -674,23 +674,38 @@ my %ifconfig_tests = (
 my %ipaddrshow_tests = (
     'ip_addr-1' => [
         {
-            IPSUBNET    => '127.0.0.0',
+            IPSUBNET    => undef,
             IPMASK      => '255.0.0.0',
-            STATUS      => 'Up',
             DESCRIPTION => 'lo',
-            IPADDRESS6  => '::1',
+            STATUS      => 'Up',
             IPADDRESS   => '127.0.0.1'
         },
         {
-            IPSUBNET    => '192.168.0.0',
+            DESCRIPTION => 'lo',
+            STATUS      => 'Up',
+            IPADDRESS6  => '::1'
+        },
+        {
+            IPSUBNET    => undef,
             IPMASK      => '255.255.255.0',
             MACADDR     => '00:23:18:91:db:8d',
-            STATUS      => 'Up',
             DESCRIPTION => 'eth0',
-            IPADDRESS6  => 'fe80::223:18ff:fe91:db8d',
+            STATUS      => 'Up',
             IPADDRESS   => '192.168.0.10'
         },
         {
+            MACADDR     => '00:23:18:91:db:8d',
+            DESCRIPTION => 'eth0',
+            STATUS      => 'Up',
+            IPADDRESS6  => '2a01:e34:ef9c:64d0:223:18ff:fe91:db8d'
+        },
+        {
+            MACADDR     => '00:23:18:91:db:8d',
+            DESCRIPTION => 'eth0',
+            STATUS      => 'Up',
+            IPADDRESS6  => 'fe80::223:18ff:fe91:db8d'
+        },
+        {
             STATUS      => 'Up',
             DESCRIPTION => 'tun0'
         },
@@ -699,36 +714,104 @@ my %ipaddrshow_tests = (
             DESCRIPTION => 'tun1'
         },
         {
-            MACADDR     => 'e8:39:df:3f:7d:ef',
             STATUS      => 'Down',
-            DESCRIPTION => 'wlan0'
+            DESCRIPTION => 'wlan0',
+            MACADDR     => 'e8:39:df:3f:7d:ef'
+        },
+        {
+            IPSUBNET    => undef,
+            IPMASK      => '255.255.255.0',
+            MACADDR     => '8a:84:99:29:46:05',
+            DESCRIPTION => 'tap0',
+            STATUS      => 'Up',
+            IPADDRESS   => '172.28.218.101'
+        },
+        {
+            MACADDR     => '8a:84:99:29:46:05',
+            DESCRIPTION => 'tap0',
+            STATUS      => 'Up',
+            IPADDRESS6  => 'fe80::8884:99ff:fe29:4605'
         }
     ],
     'ip_addr-2' => [
         {
-            IPSUBNET    => '127.0.0.0',
+            IPSUBNET    => undef,
             IPMASK      => '255.0.0.0',
-            STATUS      => 'Up',
             DESCRIPTION => 'lo',
-            IPADDRESS6  => '::1',
+            STATUS      => 'Up',
             IPADDRESS   => '127.0.0.1'
         },
         {
-            IPSUBNET    => '172.16.0.0',
-            IPMASK      => '255.255.128.0',
+            DESCRIPTION => 'lo',
+            STATUS      => 'Up',
+            IPADDRESS6  => '::1'
+        },
+        {
+            IPSUBNET    => undef,
+            IPMASK      => '255.255.255.128',
             MACADDR     => '0f:0f:0f:0f:0f:0f',
+            DESCRIPTION => 'eth0',
             STATUS      => 'Up',
+            IPADDRESS   => '11.11.11.11'
+        },
+        {
+            IPSUBNET    => undef,
+            IPMASK      => '255.255.128.0',
+            MACADDR     => '0f:0f:0f:0f:0f:0f',
             DESCRIPTION => 'eth0',
-            IPADDRESS6  => 'fe80::201:29ff:fed1:feb4',
+            STATUS      => 'Up',
             IPADDRESS   => '172.16.0.201'
         },
         {
+            MACADDR     => '0f:0f:0f:0f:0f:0f',
+            DESCRIPTION => 'eth0',
+            STATUS      => 'Up',
+            IPADDRESS6  => 'fe80::201:29ff:fed1:feb4'
+        },
+        {
             STATUS      => 'Down',
             DESCRIPTION => 'eql'
         },
         {
             STATUS      => 'Down',
             DESCRIPTION => 'sit0'
+        },
+        {
+            STATUS      => 'Down',
+            DESCRIPTION => 'wlan0',
+            MACADDR     => '0f:0f:0f:0f:0f:0f'
+        }
+    ],
+    # RHEL 5.6
+    'ip_addr-3' => [
+        {
+            IPSUBNET    => undef,
+            IPMASK      => '255.0.0.0',
+            DESCRIPTION => 'lo',
+            STATUS      => 'Up',
+            IPADDRESS   => '127.0.0.1'
+        },
+        {
+            DESCRIPTION => 'lo',
+            STATUS      => 'Up',
+            IPADDRESS6  => '::1'
+        },
+        {
+            IPSUBNET    => undef,
+            IPMASK      => '255.255.255.0',
+            MACADDR     => '00:50:56:8b:70:b7',
+            DESCRIPTION => 'eth0',
+            STATUS      => 'Up',
+            IPADDRESS   => '10.40.1.16'
+        },
+        {
+            MACADDR     => '00:50:56:8b:70:b7',
+            DESCRIPTION => 'eth0',
+            STATUS      => 'Up',
+            IPADDRESS6  => 'fe80::250:56ff:fe8b:70b7'
+        },
+        {
+            DESCRIPTION => 'sit0'
         }
     ]
 );


================================================================
  Commit: 1d1e743020e294d75fab874ba98f0f428520215a
      https://github.com/fusinv/fusioninventory-agent/commit/1d1e743020e294d75fab874ba98f0f428520215a
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-04-04 (Wed, 04 Apr 2012)

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

  Log Message:
  -----------
  fix network address computation


diff --git a/lib/FusionInventory/Agent/Tools/Linux.pm b/lib/FusionInventory/Agent/Tools/Linux.pm
index 1ba3cd4..54558fc 100644
--- a/lib/FusionInventory/Agent/Tools/Linux.pm
+++ b/lib/FusionInventory/Agent/Tools/Linux.pm
@@ -347,13 +347,18 @@ sub getInterfacesFromIp {
         } elsif ($line =~ /link\/ether ($mac_address_pattern)/) {
             $interface->{MACADDR} = $1;
         } elsif ($line =~ /inet6 (\S+)\//) {
-            push @adresses, {IPADDRESS6 => $1}
+            push @adresses, {
+                IPADDRESS6 => $1
+            };
         } elsif ($line =~ /inet ($ip_address_pattern)\/(\d{1,3})/) {
-            my $ifAddr = {};
-            $ifAddr->{IPADDRESS} = $1;
-            $ifAddr->{IPMASK} = getNetworkMask($2);
-            $ifAddr->{IPSUBNET} = getSubnetAddress($interface->{IPADDRESS}, $interface->{IPMASK});
-            push @adresses, $ifAddr if $ifAddr->{IPADDRESS};
+            my $address = {
+                IPADDRESS => $1,
+                IPMASK    => getNetworkMask($2),
+            };
+            $address->{IPSUBNET} = getSubnetAddress(
+                $address->{IPADDRESS}, $address->{IPMASK}
+            );
+            push @adresses, $address;
         }
     }
 
diff --git a/t/tools/linux.t b/t/tools/linux.t
index a57d8e5..4409ad2 100755
--- a/t/tools/linux.t
+++ b/t/tools/linux.t
@@ -674,7 +674,7 @@ my %ifconfig_tests = (
 my %ipaddrshow_tests = (
     'ip_addr-1' => [
         {
-            IPSUBNET    => undef,
+            IPSUBNET    => '127.0.0.0',
             IPMASK      => '255.0.0.0',
             DESCRIPTION => 'lo',
             STATUS      => 'Up',
@@ -686,7 +686,7 @@ my %ipaddrshow_tests = (
             IPADDRESS6  => '::1'
         },
         {
-            IPSUBNET    => undef,
+            IPSUBNET    => '192.168.0.0',
             IPMASK      => '255.255.255.0',
             MACADDR     => '00:23:18:91:db:8d',
             DESCRIPTION => 'eth0',
@@ -719,7 +719,7 @@ my %ipaddrshow_tests = (
             MACADDR     => 'e8:39:df:3f:7d:ef'
         },
         {
-            IPSUBNET    => undef,
+            IPSUBNET    => '172.28.218.0',
             IPMASK      => '255.255.255.0',
             MACADDR     => '8a:84:99:29:46:05',
             DESCRIPTION => 'tap0',
@@ -735,7 +735,7 @@ my %ipaddrshow_tests = (
     ],
     'ip_addr-2' => [
         {
-            IPSUBNET    => undef,
+            IPSUBNET    => '127.0.0.0',
             IPMASK      => '255.0.0.0',
             DESCRIPTION => 'lo',
             STATUS      => 'Up',
@@ -747,7 +747,7 @@ my %ipaddrshow_tests = (
             IPADDRESS6  => '::1'
         },
         {
-            IPSUBNET    => undef,
+            IPSUBNET    => '11.11.11.0',
             IPMASK      => '255.255.255.128',
             MACADDR     => '0f:0f:0f:0f:0f:0f',
             DESCRIPTION => 'eth0',
@@ -755,7 +755,7 @@ my %ipaddrshow_tests = (
             IPADDRESS   => '11.11.11.11'
         },
         {
-            IPSUBNET    => undef,
+            IPSUBNET    => '172.16.0.0',
             IPMASK      => '255.255.128.0',
             MACADDR     => '0f:0f:0f:0f:0f:0f',
             DESCRIPTION => 'eth0',
@@ -785,7 +785,7 @@ my %ipaddrshow_tests = (
     # RHEL 5.6
     'ip_addr-3' => [
         {
-            IPSUBNET    => undef,
+            IPSUBNET    => '127.0.0.0',
             IPMASK      => '255.0.0.0',
             DESCRIPTION => 'lo',
             STATUS      => 'Up',
@@ -797,7 +797,7 @@ my %ipaddrshow_tests = (
             IPADDRESS6  => '::1'
         },
         {
-            IPSUBNET    => undef,
+            IPSUBNET    => '10.40.1.0',
             IPMASK      => '255.255.255.0',
             MACADDR     => '00:50:56:8b:70:b7',
             DESCRIPTION => 'eth0',


================================================================
  Commit: e58c2a1714bab347870dc727e9edfa996403ca75
      https://github.com/fusinv/fusioninventory-agent/commit/e58c2a1714bab347870dc727e9edfa996403ca75
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-04-04 (Wed, 04 Apr 2012)

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

  Log Message:
  -----------
  even better ip output parsing

- less confusion between interfaces and addresses
- recognize IPv4 address without mask, as for tun interfaces
- keep processing the file in normal order, as for all other parsing
  functions


diff --git a/lib/FusionInventory/Agent/Tools/Linux.pm b/lib/FusionInventory/Agent/Tools/Linux.pm
index 54558fc..293a831 100644
--- a/lib/FusionInventory/Agent/Tools/Linux.pm
+++ b/lib/FusionInventory/Agent/Tools/Linux.pm
@@ -313,55 +313,62 @@ sub getInterfacesFromIp {
 
     my @interfaces;
     my $interface;
-    my @adresses;
 
-    my @lines = <$handle>;
-    # We parse the output in the reverse order
-    while (my $line = pop(@lines)) {
-        chomp $line;
-        if ($line =~ /^\d+:\s+(\S+): .*<(.+?)>(.*)/) {
-            my $status;
-            $interface->{DESCRIPTION} = $1;
+    while (my $line = <$handle>) {
+        if ($line =~ /^\d+:\s+(\S+): <(.+?)>(.*)/) {
+            # push previous interface if down, as there was no related address
+            push @interfaces, $interface
+                if $interface           &&
+                   $interface->{STATUS} &&
+                   $interface->{STATUS} eq 'Down';
+
+            $interface = {
+                DESCRIPTION => $1
+            };
 
-            if ($3 =~ /state DOWN /) {
+            my $flags = $2;
+            my $remaining = $3;
+
+            if ($remaining =~ /state DOWN /) {
                 $interface->{STATUS} = 'Down';
             } else {
-                foreach (split(/,/, $2)) {
-                    next unless /^(UP|DOWN)$/;
-                    $interface->{STATUS} = ucfirst(lc($1));
-                }
-            }
-
-            if (@adresses) {
-                foreach my $if (@adresses) {
-                    foreach (keys %$interface) {
-                        $if->{$_} = $interface->{$_};
-                    }
-                    unshift @interfaces, $if;
+                foreach my $flag (split(/,/, $flags)) {
+                    next unless $flag eq 'UP' || $flag eq 'DOWN';
+                    $interface->{STATUS} = ucfirst(lc($flag));
                 }
-            } else {
-                unshift @interfaces, $interface;
             }
-            $interface = {};
-            @adresses = ();
         } elsif ($line =~ /link\/ether ($mac_address_pattern)/) {
             $interface->{MACADDR} = $1;
         } elsif ($line =~ /inet6 (\S+)\//) {
-            push @adresses, {
-                IPADDRESS6 => $1
+            push @interfaces, {
+                IPADDRESS6  => $1,
+                STATUS      => $interface->{STATUS},
+                DESCRIPTION => $interface->{DESCRIPTION},
+                MACADDR     => $interface->{MACADDR}
             };
-        } elsif ($line =~ /inet ($ip_address_pattern)\/(\d{1,3})/) {
-            my $address = {
-                IPADDRESS => $1,
-                IPMASK    => getNetworkMask($2),
+        } elsif ($line =~ /inet ($ip_address_pattern)(?:\/(\d{1,3}))?/) {
+            my $address = $1;
+            my $mask    = $2 ? getNetworkMask($2) : undef;
+            my $subnet  = $address && $mask ?
+                getSubnetAddress($address, $mask) : undef;
+
+            push @interfaces, {
+                IPADDRESS   => $address,
+                IPMASK      => $mask,
+                IPSUBNET    => $subnet,
+                STATUS      => $interface->{STATUS},
+                DESCRIPTION => $interface->{DESCRIPTION},
+                MACADDR     => $interface->{MACADDR}
             };
-            $address->{IPSUBNET} = getSubnetAddress(
-                $address->{IPADDRESS}, $address->{IPMASK}
-            );
-            push @adresses, $address;
         }
     }
 
+    # push last interface if down, as there was no related address
+    push @interfaces, $interface
+        if $interface           &&
+           $interface->{STATUS} &&
+           $interface->{STATUS} eq 'Down';
+
     return @interfaces;
 }
 
diff --git a/t/tools/linux.t b/t/tools/linux.t
index 4409ad2..7949408 100755
--- a/t/tools/linux.t
+++ b/t/tools/linux.t
@@ -678,12 +678,14 @@ my %ipaddrshow_tests = (
             IPMASK      => '255.0.0.0',
             DESCRIPTION => 'lo',
             STATUS      => 'Up',
-            IPADDRESS   => '127.0.0.1'
+            IPADDRESS   => '127.0.0.1',
+            MACADDR     => undef
         },
         {
             DESCRIPTION => 'lo',
             STATUS      => 'Up',
-            IPADDRESS6  => '::1'
+            IPADDRESS6  => '::1',
+            MACADDR     => undef
         },
         {
             IPSUBNET    => '192.168.0.0',
@@ -707,11 +709,19 @@ my %ipaddrshow_tests = (
         },
         {
             STATUS      => 'Up',
-            DESCRIPTION => 'tun0'
+            DESCRIPTION => 'tun0',
+            IPADDRESS   => '192.168.41.6',
+            IPSUBNET    => undef,
+            IPMASK      => undef,
+            MACADDR     => undef
         },
         {
             STATUS      => 'Up',
-            DESCRIPTION => 'tun1'
+            DESCRIPTION => 'tun1',
+            IPADDRESS   => '192.168.222.14',
+            IPSUBNET    => undef,
+            IPMASK      => undef,
+            MACADDR     => undef
         },
         {
             STATUS      => 'Down',
@@ -739,12 +749,14 @@ my %ipaddrshow_tests = (
             IPMASK      => '255.0.0.0',
             DESCRIPTION => 'lo',
             STATUS      => 'Up',
-            IPADDRESS   => '127.0.0.1'
+            IPADDRESS   => '127.0.0.1',
+            MACADDR     => undef
         },
         {
             DESCRIPTION => 'lo',
             STATUS      => 'Up',
-            IPADDRESS6  => '::1'
+            IPADDRESS6  => '::1',
+            MACADDR     => undef
         },
         {
             IPSUBNET    => '11.11.11.0',
@@ -770,11 +782,11 @@ my %ipaddrshow_tests = (
         },
         {
             STATUS      => 'Down',
-            DESCRIPTION => 'eql'
+            DESCRIPTION => 'eql',
         },
         {
             STATUS      => 'Down',
-            DESCRIPTION => 'sit0'
+            DESCRIPTION => 'sit0',
         },
         {
             STATUS      => 'Down',
@@ -789,12 +801,14 @@ my %ipaddrshow_tests = (
             IPMASK      => '255.0.0.0',
             DESCRIPTION => 'lo',
             STATUS      => 'Up',
-            IPADDRESS   => '127.0.0.1'
+            IPADDRESS   => '127.0.0.1',
+            MACADDR     => undef
         },
         {
             DESCRIPTION => 'lo',
             STATUS      => 'Up',
-            IPADDRESS6  => '::1'
+            IPADDRESS6  => '::1',
+            MACADDR     => undef
         },
         {
             IPSUBNET    => '10.40.1.0',
@@ -802,7 +816,7 @@ my %ipaddrshow_tests = (
             MACADDR     => '00:50:56:8b:70:b7',
             DESCRIPTION => 'eth0',
             STATUS      => 'Up',
-            IPADDRESS   => '10.40.1.16'
+            IPADDRESS   => '10.40.1.16',
         },
         {
             MACADDR     => '00:50:56:8b:70:b7',
@@ -810,9 +824,6 @@ my %ipaddrshow_tests = (
             STATUS      => 'Up',
             IPADDRESS6  => 'fe80::250:56ff:fe8b:70b7'
         },
-        {
-            DESCRIPTION => 'sit0'
-        }
     ]
 );
 


================================================================
  Commit: c631e6e1b23651125e9bc579a97f729db23aa800
      https://github.com/fusinv/fusioninventory-agent/commit/c631e6e1b23651125e9bc579a97f729db23aa800
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-04-05 (Thu, 05 Apr 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/VirtualBox.pm

  Log Message:
  -----------
  fix a misassumption regarding the VM owner

there is no reason to believe the one who run the agent
is the owner of the virtualmachine


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/VirtualBox.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/VirtualBox.pm
index 6fcaf90..ccbbccf 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/VirtualBox.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/VirtualBox.pm
@@ -28,12 +28,9 @@ sub doInventory {
 
     my $command = "VBoxManage -nologo list --long vms";
 
-    my $owner = getpwuid($REAL_USER_ID)->name();
-
     foreach my $machine (_parseVBoxManage(
         logger => $logger, command => $command
     )) {
-        $machine->{OWNER} = $owner;
         $inventory->addEntry(
             section => 'VIRTUALMACHINES', entry => $machine
         );


================================================================
  Commit: 28575092ea8299129c7d402a7aba5a5f22df2e75
      https://github.com/fusinv/fusioninventory-agent/commit/28575092ea8299129c7d402a7aba5a5f22df2e75
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-04-05 (Thu, 05 Apr 2012)

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

  Log Message:
  -----------
  Merge remote-tracking branch 'origin/2.2.x' into 2.2.x


diff --git a/lib/FusionInventory/Agent/Tools/Linux.pm b/lib/FusionInventory/Agent/Tools/Linux.pm
index 1ba3cd4..293a831 100644
--- a/lib/FusionInventory/Agent/Tools/Linux.pm
+++ b/lib/FusionInventory/Agent/Tools/Linux.pm
@@ -313,50 +313,62 @@ sub getInterfacesFromIp {
 
     my @interfaces;
     my $interface;
-    my @adresses;
 
-    my @lines = <$handle>;
-    # We parse the output in the reverse order
-    while (my $line = pop(@lines)) {
-        chomp $line;
-        if ($line =~ /^\d+:\s+(\S+): .*<(.+?)>(.*)/) {
-            my $status;
-            $interface->{DESCRIPTION} = $1;
+    while (my $line = <$handle>) {
+        if ($line =~ /^\d+:\s+(\S+): <(.+?)>(.*)/) {
+            # push previous interface if down, as there was no related address
+            push @interfaces, $interface
+                if $interface           &&
+                   $interface->{STATUS} &&
+                   $interface->{STATUS} eq 'Down';
+
+            $interface = {
+                DESCRIPTION => $1
+            };
+
+            my $flags = $2;
+            my $remaining = $3;
 
-            if ($3 =~ /state DOWN /) {
+            if ($remaining =~ /state DOWN /) {
                 $interface->{STATUS} = 'Down';
             } else {
-                foreach (split(/,/, $2)) {
-                    next unless /^(UP|DOWN)$/;
-                    $interface->{STATUS} = ucfirst(lc($1));
+                foreach my $flag (split(/,/, $flags)) {
+                    next unless $flag eq 'UP' || $flag eq 'DOWN';
+                    $interface->{STATUS} = ucfirst(lc($flag));
                 }
             }
-
-            if (@adresses) {
-                foreach my $if (@adresses) {
-                    foreach (keys %$interface) {
-                        $if->{$_} = $interface->{$_};
-                    }
-                    unshift @interfaces, $if;
-                }
-            } else {
-                unshift @interfaces, $interface;
-            }
-            $interface = {};
-            @adresses = ();
         } elsif ($line =~ /link\/ether ($mac_address_pattern)/) {
             $interface->{MACADDR} = $1;
         } elsif ($line =~ /inet6 (\S+)\//) {
-            push @adresses, {IPADDRESS6 => $1}
-        } elsif ($line =~ /inet ($ip_address_pattern)\/(\d{1,3})/) {
-            my $ifAddr = {};
-            $ifAddr->{IPADDRESS} = $1;
-            $ifAddr->{IPMASK} = getNetworkMask($2);
-            $ifAddr->{IPSUBNET} = getSubnetAddress($interface->{IPADDRESS}, $interface->{IPMASK});
-            push @adresses, $ifAddr if $ifAddr->{IPADDRESS};
+            push @interfaces, {
+                IPADDRESS6  => $1,
+                STATUS      => $interface->{STATUS},
+                DESCRIPTION => $interface->{DESCRIPTION},
+                MACADDR     => $interface->{MACADDR}
+            };
+        } elsif ($line =~ /inet ($ip_address_pattern)(?:\/(\d{1,3}))?/) {
+            my $address = $1;
+            my $mask    = $2 ? getNetworkMask($2) : undef;
+            my $subnet  = $address && $mask ?
+                getSubnetAddress($address, $mask) : undef;
+
+            push @interfaces, {
+                IPADDRESS   => $address,
+                IPMASK      => $mask,
+                IPSUBNET    => $subnet,
+                STATUS      => $interface->{STATUS},
+                DESCRIPTION => $interface->{DESCRIPTION},
+                MACADDR     => $interface->{MACADDR}
+            };
         }
     }
 
+    # push last interface if down, as there was no related address
+    push @interfaces, $interface
+        if $interface           &&
+           $interface->{STATUS} &&
+           $interface->{STATUS} eq 'Down';
+
     return @interfaces;
 }
 
diff --git a/t/tools/linux.t b/t/tools/linux.t
index a57d8e5..7949408 100755
--- a/t/tools/linux.t
+++ b/t/tools/linux.t
@@ -674,19 +674,21 @@ my %ifconfig_tests = (
 my %ipaddrshow_tests = (
     'ip_addr-1' => [
         {
-            IPSUBNET    => undef,
+            IPSUBNET    => '127.0.0.0',
             IPMASK      => '255.0.0.0',
             DESCRIPTION => 'lo',
             STATUS      => 'Up',
-            IPADDRESS   => '127.0.0.1'
+            IPADDRESS   => '127.0.0.1',
+            MACADDR     => undef
         },
         {
             DESCRIPTION => 'lo',
             STATUS      => 'Up',
-            IPADDRESS6  => '::1'
+            IPADDRESS6  => '::1',
+            MACADDR     => undef
         },
         {
-            IPSUBNET    => undef,
+            IPSUBNET    => '192.168.0.0',
             IPMASK      => '255.255.255.0',
             MACADDR     => '00:23:18:91:db:8d',
             DESCRIPTION => 'eth0',
@@ -707,11 +709,19 @@ my %ipaddrshow_tests = (
         },
         {
             STATUS      => 'Up',
-            DESCRIPTION => 'tun0'
+            DESCRIPTION => 'tun0',
+            IPADDRESS   => '192.168.41.6',
+            IPSUBNET    => undef,
+            IPMASK      => undef,
+            MACADDR     => undef
         },
         {
             STATUS      => 'Up',
-            DESCRIPTION => 'tun1'
+            DESCRIPTION => 'tun1',
+            IPADDRESS   => '192.168.222.14',
+            IPSUBNET    => undef,
+            IPMASK      => undef,
+            MACADDR     => undef
         },
         {
             STATUS      => 'Down',
@@ -719,7 +729,7 @@ my %ipaddrshow_tests = (
             MACADDR     => 'e8:39:df:3f:7d:ef'
         },
         {
-            IPSUBNET    => undef,
+            IPSUBNET    => '172.28.218.0',
             IPMASK      => '255.255.255.0',
             MACADDR     => '8a:84:99:29:46:05',
             DESCRIPTION => 'tap0',
@@ -735,19 +745,21 @@ my %ipaddrshow_tests = (
     ],
     'ip_addr-2' => [
         {
-            IPSUBNET    => undef,
+            IPSUBNET    => '127.0.0.0',
             IPMASK      => '255.0.0.0',
             DESCRIPTION => 'lo',
             STATUS      => 'Up',
-            IPADDRESS   => '127.0.0.1'
+            IPADDRESS   => '127.0.0.1',
+            MACADDR     => undef
         },
         {
             DESCRIPTION => 'lo',
             STATUS      => 'Up',
-            IPADDRESS6  => '::1'
+            IPADDRESS6  => '::1',
+            MACADDR     => undef
         },
         {
-            IPSUBNET    => undef,
+            IPSUBNET    => '11.11.11.0',
             IPMASK      => '255.255.255.128',
             MACADDR     => '0f:0f:0f:0f:0f:0f',
             DESCRIPTION => 'eth0',
@@ -755,7 +767,7 @@ my %ipaddrshow_tests = (
             IPADDRESS   => '11.11.11.11'
         },
         {
-            IPSUBNET    => undef,
+            IPSUBNET    => '172.16.0.0',
             IPMASK      => '255.255.128.0',
             MACADDR     => '0f:0f:0f:0f:0f:0f',
             DESCRIPTION => 'eth0',
@@ -770,11 +782,11 @@ my %ipaddrshow_tests = (
         },
         {
             STATUS      => 'Down',
-            DESCRIPTION => 'eql'
+            DESCRIPTION => 'eql',
         },
         {
             STATUS      => 'Down',
-            DESCRIPTION => 'sit0'
+            DESCRIPTION => 'sit0',
         },
         {
             STATUS      => 'Down',
@@ -785,24 +797,26 @@ my %ipaddrshow_tests = (
     # RHEL 5.6
     'ip_addr-3' => [
         {
-            IPSUBNET    => undef,
+            IPSUBNET    => '127.0.0.0',
             IPMASK      => '255.0.0.0',
             DESCRIPTION => 'lo',
             STATUS      => 'Up',
-            IPADDRESS   => '127.0.0.1'
+            IPADDRESS   => '127.0.0.1',
+            MACADDR     => undef
         },
         {
             DESCRIPTION => 'lo',
             STATUS      => 'Up',
-            IPADDRESS6  => '::1'
+            IPADDRESS6  => '::1',
+            MACADDR     => undef
         },
         {
-            IPSUBNET    => undef,
+            IPSUBNET    => '10.40.1.0',
             IPMASK      => '255.255.255.0',
             MACADDR     => '00:50:56:8b:70:b7',
             DESCRIPTION => 'eth0',
             STATUS      => 'Up',
-            IPADDRESS   => '10.40.1.16'
+            IPADDRESS   => '10.40.1.16',
         },
         {
             MACADDR     => '00:50:56:8b:70:b7',
@@ -810,9 +824,6 @@ my %ipaddrshow_tests = (
             STATUS      => 'Up',
             IPADDRESS6  => 'fe80::250:56ff:fe8b:70b7'
         },
-        {
-            DESCRIPTION => 'sit0'
-        }
     ]
 );
 


================================================================
  Commit: 8927940fab52a78f4882c0ffefe720b7b8395131
      https://github.com/fusinv/fusioninventory-agent/commit/8927940fab52a78f4882c0ffefe720b7b8395131
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-04-05 (Thu, 05 Apr 2012)

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

  Log Message:
  -----------
  parsing improvements

- check interface status when second line is reached, not when new
  interface is found
- change condition to report all interfaces, even when status is unknown


diff --git a/lib/FusionInventory/Agent/Tools/Linux.pm b/lib/FusionInventory/Agent/Tools/Linux.pm
index 293a831..1d93f1e 100644
--- a/lib/FusionInventory/Agent/Tools/Linux.pm
+++ b/lib/FusionInventory/Agent/Tools/Linux.pm
@@ -316,11 +316,6 @@ sub getInterfacesFromIp {
 
     while (my $line = <$handle>) {
         if ($line =~ /^\d+:\s+(\S+): <(.+?)>(.*)/) {
-            # push previous interface if down, as there was no related address
-            push @interfaces, $interface
-                if $interface           &&
-                   $interface->{STATUS} &&
-                   $interface->{STATUS} eq 'Down';
 
             $interface = {
                 DESCRIPTION => $1
@@ -337,8 +332,12 @@ sub getInterfacesFromIp {
                     $interface->{STATUS} = ucfirst(lc($flag));
                 }
             }
-        } elsif ($line =~ /link\/ether ($mac_address_pattern)/) {
+        } elsif ($line =~ /link\/\S+ ($mac_address_pattern)?/) {
             $interface->{MACADDR} = $1;
+
+            # if courrent interface is not up, there won't be any address lines
+            push @interfaces, $interface
+                unless $interface->{STATUS} && $interface->{STATUS} eq 'Up';
         } elsif ($line =~ /inet6 (\S+)\//) {
             push @interfaces, {
                 IPADDRESS6  => $1,
@@ -363,12 +362,6 @@ sub getInterfacesFromIp {
         }
     }
 
-    # push last interface if down, as there was no related address
-    push @interfaces, $interface
-        if $interface           &&
-           $interface->{STATUS} &&
-           $interface->{STATUS} eq 'Down';
-
     return @interfaces;
 }
 
diff --git a/t/tools/linux.t b/t/tools/linux.t
index 7949408..0446db4 100755
--- a/t/tools/linux.t
+++ b/t/tools/linux.t
@@ -679,13 +679,13 @@ my %ipaddrshow_tests = (
             DESCRIPTION => 'lo',
             STATUS      => 'Up',
             IPADDRESS   => '127.0.0.1',
-            MACADDR     => undef
+            MACADDR     => '00:00:00:00:00:00',
         },
         {
             DESCRIPTION => 'lo',
             STATUS      => 'Up',
             IPADDRESS6  => '::1',
-            MACADDR     => undef
+            MACADDR     => '00:00:00:00:00:00',
         },
         {
             IPSUBNET    => '192.168.0.0',
@@ -750,13 +750,13 @@ my %ipaddrshow_tests = (
             DESCRIPTION => 'lo',
             STATUS      => 'Up',
             IPADDRESS   => '127.0.0.1',
-            MACADDR     => undef
+            MACADDR     => '00:00:00:00:00:00',
         },
         {
             DESCRIPTION => 'lo',
             STATUS      => 'Up',
             IPADDRESS6  => '::1',
-            MACADDR     => undef
+            MACADDR     => '00:00:00:00:00:00',
         },
         {
             IPSUBNET    => '11.11.11.0',
@@ -783,10 +783,12 @@ my %ipaddrshow_tests = (
         {
             STATUS      => 'Down',
             DESCRIPTION => 'eql',
+            MACADDR     => undef
         },
         {
             STATUS      => 'Down',
             DESCRIPTION => 'sit0',
+            MACADDR     => undef
         },
         {
             STATUS      => 'Down',
@@ -802,13 +804,13 @@ my %ipaddrshow_tests = (
             DESCRIPTION => 'lo',
             STATUS      => 'Up',
             IPADDRESS   => '127.0.0.1',
-            MACADDR     => undef
+            MACADDR     => '00:00:00:00:00:00',
         },
         {
             DESCRIPTION => 'lo',
             STATUS      => 'Up',
             IPADDRESS6  => '::1',
-            MACADDR     => undef
+            MACADDR     => '00:00:00:00:00:00',
         },
         {
             IPSUBNET    => '10.40.1.0',
@@ -824,6 +826,10 @@ my %ipaddrshow_tests = (
             STATUS      => 'Up',
             IPADDRESS6  => 'fe80::250:56ff:fe8b:70b7'
         },
+        {
+            DESCRIPTION => 'sit0',
+            MACADDR     => undef
+        },
     ]
 );
 


================================================================
  Commit: 0c4292b7b3391c976d15fe2dc0b23a27e50daf6f
      https://github.com/fusinv/fusioninventory-agent/commit/0c4292b7b3391c976d15fe2dc0b23a27e50daf6f
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-04-05 (Thu, 05 Apr 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/VirtualBox.pm

  Log Message:
  -----------
  Merge remote-tracking branch 'forge/2.2.x' into 2.2.x


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/VirtualBox.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/VirtualBox.pm
index 6fcaf90..ccbbccf 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/VirtualBox.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/VirtualBox.pm
@@ -28,12 +28,9 @@ sub doInventory {
 
     my $command = "VBoxManage -nologo list --long vms";
 
-    my $owner = getpwuid($REAL_USER_ID)->name();
-
     foreach my $machine (_parseVBoxManage(
         logger => $logger, command => $command
     )) {
-        $machine->{OWNER} = $owner;
         $inventory->addEntry(
             section => 'VIRTUALMACHINES', entry => $machine
         );


================================================================
  Commit: f923a9b949f1c39140e95ef23fc5ab6d7d92dab5
      https://github.com/fusinv/fusioninventory-agent/commit/f923a9b949f1c39140e95ef23fc5ab6d7d92dab5
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-04-05 (Thu, 05 Apr 2012)

  Changed paths:
    M resources/generic/lspci/dell-xt2
    M t/tools/generic.t

  Log Message:
  -----------
  update test sample, using a single -v flag


diff --git a/resources/generic/lspci/dell-xt2 b/resources/generic/lspci/dell-xt2
index 9171e9d..0b43c66 100644
--- a/resources/generic/lspci/dell-xt2
+++ b/resources/generic/lspci/dell-xt2
@@ -1,284 +1,241 @@
 00:00.0 Host bridge [0600]: Intel Corporation Mobile 4 Series Chipset Memory Controller Hub [8086:2a40] (rev 07)
 	Subsystem: Dell Device [1028:0252]
-	Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
-	Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort+ >SERR- <PERR- INTx-
-	Latency: 0
-	Capabilities: <access denied>
+	Flags: bus master, fast devsel, latency 0
+	Capabilities: [e0] Vendor Specific Information: Len=0a <?>
 	Kernel driver in use: agpgart-intel
 
 00:02.0 VGA compatible controller [0300]: Intel Corporation Mobile 4 Series Chipset Integrated Graphics Controller [8086:2a42] (rev 07) (prog-if 00 [VGA controller])
 	Subsystem: Dell Device [1028:0252]
-	Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx+
-	Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
-	Latency: 0
-	Interrupt: pin A routed to IRQ 28
-	Region 0: Memory at f6c00000 (64-bit, non-prefetchable) [size=4M]
-	Region 2: Memory at e0000000 (64-bit, prefetchable) [size=256M]
-	Region 4: I/O ports at ef98 [size=8]
+	Flags: bus master, fast devsel, latency 0, IRQ 43
+	Memory at f6c00000 (64-bit, non-prefetchable) [size=4M]
+	Memory at e0000000 (64-bit, prefetchable) [size=256M]
+	I/O ports at ef98 [size=8]
 	Expansion ROM at <unassigned> [disabled]
-	Capabilities: <access denied>
+	Capabilities: [90] MSI: Enable+ Count=1/1 Maskable- 64bit-
+	Capabilities: [d0] Power Management version 3
 	Kernel driver in use: i915
 	Kernel modules: i915
 
 00:02.1 Display controller [0380]: Intel Corporation Mobile 4 Series Chipset Integrated Graphics Controller [8086:2a43] (rev 07)
 	Subsystem: Dell Device [1028:0252]
-	Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
-	Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
-	Latency: 0
-	Region 0: Memory at f6b00000 (64-bit, non-prefetchable) [size=1M]
-	Capabilities: <access denied>
+	Flags: bus master, fast devsel, latency 0
+	Memory at f6b00000 (64-bit, non-prefetchable) [size=1M]
+	Capabilities: [d0] Power Management version 3
 
 00:19.0 Ethernet controller [0200]: Intel Corporation 82567LM Gigabit Network Connection [8086:10f5] (rev 03)
 	Subsystem: Dell Device [1028:0252]
-	Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR+ FastB2B- DisINTx+
-	Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
-	Latency: 0
-	Interrupt: pin A routed to IRQ 29
-	Region 0: Memory at f6ae0000 (32-bit, non-prefetchable) [size=128K]
-	Region 1: Memory at f6adb000 (32-bit, non-prefetchable) [size=4K]
-	Region 2: I/O ports at efe0 [size=32]
-	Capabilities: <access denied>
+	Flags: bus master, fast devsel, latency 0, IRQ 45
+	Memory at f6ae0000 (32-bit, non-prefetchable) [size=128K]
+	Memory at f6adb000 (32-bit, non-prefetchable) [size=4K]
+	I/O ports at efe0 [size=32]
+	Capabilities: [c8] Power Management version 2
+	Capabilities: [d0] MSI: Enable+ Count=1/1 Maskable- 64bit+
+	Capabilities: [e0] PCI Advanced Features
 	Kernel driver in use: e1000e
 	Kernel modules: e1000e
 
-00:1a.0 USB Controller [0c03]: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #4 [8086:2937] (rev 03) (prog-if 00 [UHCI])
+00:1a.0 USB controller [0c03]: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #4 [8086:2937] (rev 03) (prog-if 00 [UHCI])
 	Subsystem: Dell Device [1028:0252]
-	Control: I/O+ Mem- BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
-	Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
-	Latency: 0
-	Interrupt: pin A routed to IRQ 20
-	Region 4: I/O ports at 6f60 [size=32]
-	Capabilities: <access denied>
+	Flags: bus master, medium devsel, latency 0, IRQ 20
+	I/O ports at 6f60 [size=32]
+	Capabilities: [50] PCI Advanced Features
 	Kernel driver in use: uhci_hcd
 	Kernel modules: uhci-hcd
 
-00:1a.1 USB Controller [0c03]: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #5 [8086:2938] (rev 03) (prog-if 00 [UHCI])
+00:1a.1 USB controller [0c03]: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #5 [8086:2938] (rev 03) (prog-if 00 [UHCI])
 	Subsystem: Dell Device [1028:0252]
-	Control: I/O+ Mem- BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
-	Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
-	Latency: 0
-	Interrupt: pin B routed to IRQ 21
-	Region 4: I/O ports at 6f80 [size=32]
-	Capabilities: <access denied>
+	Flags: bus master, medium devsel, latency 0, IRQ 21
+	I/O ports at 6f80 [size=32]
+	Capabilities: [50] PCI Advanced Features
 	Kernel driver in use: uhci_hcd
 	Kernel modules: uhci-hcd
 
-00:1a.2 USB Controller [0c03]: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #6 [8086:2939] (rev 03) (prog-if 00 [UHCI])
+00:1a.2 USB controller [0c03]: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #6 [8086:2939] (rev 03) (prog-if 00 [UHCI])
 	Subsystem: Dell Device [1028:0252]
-	Control: I/O+ Mem- BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
-	Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
-	Latency: 0
-	Interrupt: pin C routed to IRQ 22
-	Region 4: I/O ports at 6fa0 [size=32]
-	Capabilities: <access denied>
+	Flags: bus master, medium devsel, latency 0, IRQ 22
+	I/O ports at 6fa0 [size=32]
+	Capabilities: [50] PCI Advanced Features
 	Kernel driver in use: uhci_hcd
 	Kernel modules: uhci-hcd
 
-00:1a.7 USB Controller [0c03]: Intel Corporation 82801I (ICH9 Family) USB2 EHCI Controller #2 [8086:293c] (rev 03) (prog-if 20 [EHCI])
+00:1a.7 USB controller [0c03]: Intel Corporation 82801I (ICH9 Family) USB2 EHCI Controller #2 [8086:293c] (rev 03) (prog-if 20 [EHCI])
 	Subsystem: Dell Device [1028:0252]
-	Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR+ FastB2B- DisINTx-
-	Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
-	Latency: 0
-	Interrupt: pin C routed to IRQ 22
-	Region 0: Memory at fed1c400 (32-bit, non-prefetchable) [size=1K]
-	Capabilities: <access denied>
+	Flags: bus master, medium devsel, latency 0, IRQ 22
+	Memory at fed1c400 (32-bit, non-prefetchable) [size=1K]
+	Capabilities: [50] Power Management version 2
+	Capabilities: [58] Debug port: BAR=1 offset=00a0
+	Capabilities: [98] PCI Advanced Features
 	Kernel driver in use: ehci_hcd
 	Kernel modules: ehci-hcd
 
 00:1b.0 Audio device [0403]: Intel Corporation 82801I (ICH9 Family) HD Audio Controller [8086:293e] (rev 03)
 	Subsystem: Dell Device [1028:0252]
-	Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR+ FastB2B- DisINTx+
-	Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
-	Latency: 0, Cache Line Size: 64 bytes
-	Interrupt: pin A routed to IRQ 30
-	Region 0: Memory at f6adc000 (64-bit, non-prefetchable) [size=16K]
-	Capabilities: <access denied>
-	Kernel driver in use: HDA Intel
+	Flags: bus master, fast devsel, latency 0, IRQ 46
+	Memory at f6adc000 (64-bit, non-prefetchable) [size=16K]
+	Capabilities: [50] Power Management version 2
+	Capabilities: [60] MSI: Enable+ Count=1/1 Maskable- 64bit+
+	Capabilities: [70] Express Root Complex Integrated Endpoint, MSI 00
+	Capabilities: [100] Virtual Channel
+	Capabilities: [130] Root Complex Link
+	Kernel driver in use: snd_hda_intel
 	Kernel modules: snd-hda-intel
 
 00:1c.0 PCI bridge [0604]: Intel Corporation 82801I (ICH9 Family) PCI Express Port 1 [8086:2940] (rev 03) (prog-if 00 [Normal decode])
-	Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR+ FastB2B- DisINTx+
-	Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
-	Latency: 0, Cache Line Size: 64 bytes
+	Flags: bus master, fast devsel, latency 0
 	Bus: primary=00, secondary=0b, subordinate=0b, sec-latency=0
-	I/O behind bridge: 00002000-00002fff
-	Memory behind bridge: c4000000-c41fffff
-	Prefetchable memory behind bridge: 00000000c4200000-00000000c43fffff
-	Secondary status: 66MHz- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort+ <SERR- <PERR-
-	BridgeCtl: Parity- SERR+ NoISA- VGA- MAbort- >Reset- FastB2B-
-		PriDiscTmr- SecDiscTmr- DiscTmrStat- DiscTmrSERREn-
-	Capabilities: <access denied>
+	I/O behind bridge: 00004000-00004fff
+	Memory behind bridge: c4200000-c43fffff
+	Prefetchable memory behind bridge: 00000000c4400000-00000000c45fffff
+	Capabilities: [40] Express Root Port (Slot+), MSI 00
+	Capabilities: [80] MSI: Enable+ Count=1/1 Maskable- 64bit-
+	Capabilities: [90] Subsystem: Dell Device [1028:0252]
+	Capabilities: [a0] Power Management version 2
+	Capabilities: [100] Virtual Channel
+	Capabilities: [180] Root Complex Link
 	Kernel driver in use: pcieport
 	Kernel modules: shpchp
 
 00:1c.1 PCI bridge [0604]: Intel Corporation 82801I (ICH9 Family) PCI Express Port 2 [8086:2942] (rev 03) (prog-if 00 [Normal decode])
-	Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR+ FastB2B- DisINTx+
-	Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
-	Latency: 0, Cache Line Size: 64 bytes
+	Flags: bus master, fast devsel, latency 0
 	Bus: primary=00, secondary=0c, subordinate=0c, sec-latency=0
 	I/O behind bridge: 00003000-00003fff
 	Memory behind bridge: f6900000-f69fffff
-	Prefetchable memory behind bridge: 00000000c4400000-00000000c45fffff
-	Secondary status: 66MHz- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort+ <SERR- <PERR-
-	BridgeCtl: Parity- SERR+ NoISA- VGA- MAbort- >Reset- FastB2B-
-		PriDiscTmr- SecDiscTmr- DiscTmrStat- DiscTmrSERREn-
-	Capabilities: <access denied>
+	Prefetchable memory behind bridge: 00000000c4000000-00000000c41fffff
+	Capabilities: [40] Express Root Port (Slot+), MSI 00
+	Capabilities: [80] MSI: Enable+ Count=1/1 Maskable- 64bit-
+	Capabilities: [90] Subsystem: Dell Device [1028:0252]
+	Capabilities: [a0] Power Management version 2
+	Capabilities: [100] Virtual Channel
+	Capabilities: [180] Root Complex Link
 	Kernel driver in use: pcieport
 	Kernel modules: shpchp
 
 00:1c.3 PCI bridge [0604]: Intel Corporation 82801I (ICH9 Family) PCI Express Port 4 [8086:2946] (rev 03) (prog-if 00 [Normal decode])
-	Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx+
-	Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
-	Latency: 0, Cache Line Size: 64 bytes
+	Flags: bus master, fast devsel, latency 0
 	Bus: primary=00, secondary=0d, subordinate=0e, sec-latency=0
 	I/O behind bridge: 0000d000-0000dfff
 	Memory behind bridge: f6600000-f68fffff
 	Prefetchable memory behind bridge: 00000000f0000000-00000000f01fffff
-	Secondary status: 66MHz- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort+ <SERR- <PERR-
-	BridgeCtl: Parity- SERR+ NoISA- VGA- MAbort- >Reset- FastB2B-
-		PriDiscTmr- SecDiscTmr- DiscTmrStat- DiscTmrSERREn-
-	Capabilities: <access denied>
+	Capabilities: [40] Express Root Port (Slot+), MSI 00
+	Capabilities: [80] MSI: Enable+ Count=1/1 Maskable- 64bit-
+	Capabilities: [90] Subsystem: Dell Device [1028:0252]
+	Capabilities: [a0] Power Management version 2
+	Capabilities: [100] Virtual Channel
+	Capabilities: [180] Root Complex Link
 	Kernel driver in use: pcieport
 	Kernel modules: shpchp
 
-00:1d.0 USB Controller [0c03]: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #1 [8086:2934] (rev 03) (prog-if 00 [UHCI])
+00:1d.0 USB controller [0c03]: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #1 [8086:2934] (rev 03) (prog-if 00 [UHCI])
 	Subsystem: Dell Device [1028:0252]
-	Control: I/O+ Mem- BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
-	Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
-	Latency: 0
-	Interrupt: pin A routed to IRQ 20
-	Region 4: I/O ports at 6f00 [size=32]
-	Capabilities: <access denied>
+	Flags: bus master, medium devsel, latency 0, IRQ 20
+	I/O ports at 6f00 [size=32]
+	Capabilities: [50] PCI Advanced Features
 	Kernel driver in use: uhci_hcd
 	Kernel modules: uhci-hcd
 
-00:1d.1 USB Controller [0c03]: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #2 [8086:2935] (rev 03) (prog-if 00 [UHCI])
+00:1d.1 USB controller [0c03]: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #2 [8086:2935] (rev 03) (prog-if 00 [UHCI])
 	Subsystem: Dell Device [1028:0252]
-	Control: I/O+ Mem- BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
-	Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
-	Latency: 0
-	Interrupt: pin B routed to IRQ 21
-	Region 4: I/O ports at 6f20 [size=32]
-	Capabilities: <access denied>
+	Flags: bus master, medium devsel, latency 0, IRQ 21
+	I/O ports at 6f20 [size=32]
+	Capabilities: [50] PCI Advanced Features
 	Kernel driver in use: uhci_hcd
 	Kernel modules: uhci-hcd
 
-00:1d.2 USB Controller [0c03]: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #3 [8086:2936] (rev 03) (prog-if 00 [UHCI])
+00:1d.2 USB controller [0c03]: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #3 [8086:2936] (rev 03) (prog-if 00 [UHCI])
 	Subsystem: Dell Device [1028:0252]
-	Control: I/O+ Mem- BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
-	Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
-	Latency: 0
-	Interrupt: pin C routed to IRQ 22
-	Region 4: I/O ports at 6f40 [size=32]
-	Capabilities: <access denied>
+	Flags: bus master, medium devsel, latency 0, IRQ 22
+	I/O ports at 6f40 [size=32]
+	Capabilities: [50] PCI Advanced Features
 	Kernel driver in use: uhci_hcd
 	Kernel modules: uhci-hcd
 
-00:1d.7 USB Controller [0c03]: Intel Corporation 82801I (ICH9 Family) USB2 EHCI Controller #1 [8086:293a] (rev 03) (prog-if 20 [EHCI])
+00:1d.7 USB controller [0c03]: Intel Corporation 82801I (ICH9 Family) USB2 EHCI Controller #1 [8086:293a] (rev 03) (prog-if 20 [EHCI])
 	Subsystem: Dell Device [1028:0252]
-	Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR+ FastB2B- DisINTx-
-	Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
-	Latency: 0
-	Interrupt: pin A routed to IRQ 20
-	Region 0: Memory at fed1c000 (32-bit, non-prefetchable) [size=1K]
-	Capabilities: <access denied>
+	Flags: bus master, medium devsel, latency 0, IRQ 20
+	Memory at fed1c000 (32-bit, non-prefetchable) [size=1K]
+	Capabilities: [50] Power Management version 2
+	Capabilities: [58] Debug port: BAR=1 offset=00a0
+	Capabilities: [98] PCI Advanced Features
 	Kernel driver in use: ehci_hcd
 	Kernel modules: ehci-hcd
 
 00:1e.0 PCI bridge [0604]: Intel Corporation 82801 Mobile PCI Bridge [8086:2448] (rev 93) (prog-if 01 [Subtractive decode])
-	Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR+ FastB2B- DisINTx-
-	Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
-	Latency: 0
-	Bus: primary=00, secondary=02, subordinate=06, sec-latency=32
-	I/O behind bridge: 00004000-00004fff
+	Flags: bus master, fast devsel, latency 0
+	Bus: primary=00, secondary=02, subordinate=0a, sec-latency=32
+	I/O behind bridge: 00002000-00002fff
 	Memory behind bridge: f6500000-f65fffff
 	Prefetchable memory behind bridge: 00000000c0000000-00000000c3ffffff
-	Secondary status: 66MHz- FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort+ <SERR- <PERR-
-	BridgeCtl: Parity- SERR+ NoISA- VGA- MAbort- >Reset- FastB2B-
-		PriDiscTmr- SecDiscTmr- DiscTmrStat- DiscTmrSERREn-
-	Capabilities: <access denied>
+	Capabilities: [50] Subsystem: Dell Device [1028:0252]
 
 00:1f.0 ISA bridge [0601]: Intel Corporation ICH9M-E LPC Interface Controller [8086:2917] (rev 03)
 	Subsystem: Dell Device [1028:0252]
-	Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR+ FastB2B- DisINTx-
-	Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
-	Latency: 0
-	Capabilities: <access denied>
+	Flags: bus master, medium devsel, latency 0
+	Capabilities: [e0] Vendor Specific Information: Len=0c <?>
 	Kernel modules: iTCO_wdt
 
-00:1f.2 RAID bus controller [0104]: Intel Corporation Mobile 82801 SATA RAID Controller [8086:282a] (rev 03)
-	Subsystem: Dell Device [1028:0252]
-	Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx+
-	Status: Cap+ 66MHz+ UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
-	Latency: 0
-	Interrupt: pin D routed to IRQ 27
-	Region 0: I/O ports at 6e70 [size=8]
-	Region 1: I/O ports at 6e78 [size=4]
-	Region 2: I/O ports at 6e80 [size=8]
-	Region 3: I/O ports at 6e88 [size=4]
-	Region 4: I/O ports at 6ea0 [size=32]
-	Region 5: Memory at fed1c800 (32-bit, non-prefetchable) [size=2K]
-	Capabilities: <access denied>
+00:1f.2 RAID bus controller [0104]: Intel Corporation 82801 Mobile SATA Controller [RAID mode] [8086:282a] (rev 03)
+	Subsystem: Dell Device [1028:0252]
+	Flags: bus master, 66MHz, medium devsel, latency 0, IRQ 44
+	I/O ports at 6e70 [size=8]
+	I/O ports at 6e78 [size=4]
+	I/O ports at 6e80 [size=8]
+	I/O ports at 6e88 [size=4]
+	I/O ports at 6ea0 [size=32]
+	Memory at fed1c800 (32-bit, non-prefetchable) [size=2K]
+	Capabilities: [80] MSI: Enable+ Count=1/16 Maskable- 64bit-
+	Capabilities: [70] Power Management version 3
+	Capabilities: [a8] SATA HBA v1.0
+	Capabilities: [b0] PCI Advanced Features
 	Kernel driver in use: ahci
 	Kernel modules: ahci
 
 00:1f.3 SMBus [0c05]: Intel Corporation 82801I (ICH9 Family) SMBus Controller [8086:2930] (rev 03)
 	Subsystem: Dell Device [1028:0252]
-	Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR+ FastB2B- DisINTx-
-	Status: Cap- 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
-	Interrupt: pin B routed to IRQ 19
-	Region 0: Memory at f6adaf00 (64-bit, non-prefetchable) [size=256]
-	Region 4: I/O ports at 1100 [size=32]
+	Flags: medium devsel, IRQ 19
+	Memory at f6adaf00 (64-bit, non-prefetchable) [size=256]
+	I/O ports at 1100 [size=32]
 	Kernel driver in use: i801_smbus
 	Kernel modules: i2c-i801
 
 02:01.0 CardBus bridge [0607]: Texas Instruments PCIxx12 Cardbus Controller [104c:8039]
-	Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
-	Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
-	Latency: 168, Cache Line Size: 64 bytes
-	Interrupt: pin A routed to IRQ 18
-	Region 0: Memory at f6500000 (32-bit, non-prefetchable) [size=4K]
-	Bus: primary=02, secondary=03, subordinate=06, sec-latency=176
-	Memory window 0: c0000000-c3fff000 (prefetchable)
-	Memory window 1: c8000000-cbfff000
-	I/O window 0: 00004000-000040ff
-	I/O window 1: 00004400-000044ff
-	BridgeCtl: Parity- SERR- ISA- VGA- MAbort- >Reset+ 16bInt+ PostWrite+
-	<access denied to the rest>
+	Subsystem: Dell Device [1028:0252]
+	Flags: bus master, medium devsel, latency 168, IRQ 18
+	Memory at c8000000 (32-bit, non-prefetchable) [size=4K]
+	Bus: primary=02, secondary=40, subordinate=43, sec-latency=176
+	Memory window 0: c0000000-c3ffffff (prefetchable)
+	Memory window 1: cc000000-cfffffff
+	I/O window 0: 00002400-000024ff
+	I/O window 1: 00002000-000020ff
+	16-bit legacy interface ports at 0001
 	Kernel driver in use: yenta_cardbus
 	Kernel modules: yenta_socket
 
 02:01.1 FireWire (IEEE 1394) [0c00]: Texas Instruments PCIxx12 OHCI Compliant IEEE 1394 Host Controller [104c:803a] (prog-if 10 [OHCI])
 	Subsystem: Dell Device [1028:0252]
-	Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV+ VGASnoop- ParErr- Stepping- SERR+ FastB2B- DisINTx-
-	Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
-	Latency: 64 (500ns min, 1000ns max), Cache Line Size: 64 bytes
-	Interrupt: pin B routed to IRQ 19
-	Region 0: Memory at f65fb800 (32-bit, non-prefetchable) [size=2K]
-	Region 1: Memory at f65fc000 (32-bit, non-prefetchable) [size=16K]
-	Capabilities: <access denied>
-	Kernel driver in use: ohci1394
-	Kernel modules: ohci1394
+	Flags: bus master, medium devsel, latency 64, IRQ 19
+	Memory at f65fb800 (32-bit, non-prefetchable) [size=2K]
+	Memory at f65fc000 (32-bit, non-prefetchable) [size=16K]
+	Capabilities: [44] Power Management version 2
+	Kernel driver in use: firewire_ohci
+	Kernel modules: firewire-ohci
 
 02:01.3 SD Host controller [0805]: Texas Instruments PCIxx12 SDA Standard Compliant SD Host Controller [104c:803c] (prog-if 01)
 	Subsystem: Dell Device [1028:0252]
-	Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR+ FastB2B- DisINTx-
-	Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
-	Latency: 64 (1750ns min, 1000ns max), Cache Line Size: 64 bytes
-	Interrupt: pin A routed to IRQ 18
-	Region 0: Memory at f65fb700 (32-bit, non-prefetchable) [size=256]
-	Capabilities: <access denied>
+	Flags: bus master, medium devsel, latency 64, IRQ 18
+	Memory at f65fb700 (32-bit, non-prefetchable) [size=256]
+	Capabilities: [80] Power Management version 2
 	Kernel driver in use: sdhci-pci
 	Kernel modules: sdhci-pci
 
-0c:00.0 Network controller [0280]: Intel Corporation Wireless WiFi Link 5100 [8086:4232]
-	Subsystem: Intel Corporation Wireless WiFi Link 5100 [8086:1321]
-	Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR+ FastB2B- DisINTx+
-	Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
-	Latency: 0, Cache Line Size: 64 bytes
-	Interrupt: pin A routed to IRQ 31
-	Region 0: Memory at f69fe000 (64-bit, non-prefetchable) [size=8K]
-	Capabilities: <access denied>
-	Kernel driver in use: iwlagn
-	Kernel modules: iwlagn
+0c:00.0 Network controller [0280]: Intel Corporation WiFi Link 5100 [8086:4232]
+	Subsystem: Intel Corporation WiFi Link 5100 AGN [8086:1321]
+	Flags: bus master, fast devsel, latency 0, IRQ 47
+	Memory at f69fe000 (64-bit, non-prefetchable) [size=8K]
+	Capabilities: [c8] Power Management version 3
+	Capabilities: [d0] MSI: Enable+ Count=1/1 Maskable- 64bit+
+	Capabilities: [e0] Express Endpoint, MSI 00
+	Capabilities: [100] Advanced Error Reporting
+	Capabilities: [140] Device Serial Number 00-24-d6-ff-ff-6f-81-3a
+	Kernel driver in use: iwlwifi
+	Kernel modules: iwlwifi
 
diff --git a/t/tools/generic.t b/t/tools/generic.t
index 671d570..42f4c6d 100755
--- a/t/tools/generic.t
+++ b/t/tools/generic.t
@@ -6000,7 +6000,7 @@ my %lspci_tests = (
         },
         {
             PCICLASS     => '0c03',
-            NAME         => 'USB Controller',
+            NAME         => 'USB controller',
             MANUFACTURER => 'Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #4',
             REV          => '03',
             PCIID        => '8086:2937',
@@ -6009,7 +6009,7 @@ my %lspci_tests = (
         },
         {
             PCICLASS     => '0c03',
-            NAME         => 'USB Controller',
+            NAME         => 'USB controller',
             MANUFACTURER => 'Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #5',
             REV          => '03',
             PCIID        => '8086:2938',
@@ -6018,7 +6018,7 @@ my %lspci_tests = (
         },
         {
             PCICLASS     => '0c03',
-            NAME         => 'USB Controller',
+            NAME         => 'USB controller',
             MANUFACTURER => 'Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #6',
             REV          => '03',
             PCIID        => '8086:2939',
@@ -6027,7 +6027,7 @@ my %lspci_tests = (
         },
         {
             PCICLASS     => '0c03',
-            NAME         => 'USB Controller',
+            NAME         => 'USB controller',
             MANUFACTURER => 'Intel Corporation 82801I (ICH9 Family) USB2 EHCI Controller #2',
             REV          => '03',
             PCIID        => '8086:293c',
@@ -6040,7 +6040,7 @@ my %lspci_tests = (
             MANUFACTURER => 'Intel Corporation 82801I (ICH9 Family) HD Audio Controller',
             REV          => '03',
             PCIID        => '8086:293e',
-            DRIVER       => 'HDA',
+            DRIVER       => 'snd_hda_intel',
             PCISLOT      => '00:1b.0'
         },
         {
@@ -6072,7 +6072,7 @@ my %lspci_tests = (
         },
         {
             PCICLASS     => '0c03',
-            NAME         => 'USB Controller',
+            NAME         => 'USB controller',
             MANUFACTURER => 'Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #1',
             REV          => '03',
             PCIID        => '8086:2934',
@@ -6081,7 +6081,7 @@ my %lspci_tests = (
         },
         {
             PCICLASS     => '0c03',
-            NAME         => 'USB Controller',
+            NAME         => 'USB controller',
             MANUFACTURER => 'Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #2',
             REV          => '03',
             PCIID        => '8086:2935',
@@ -6090,7 +6090,7 @@ my %lspci_tests = (
         },
         {
             PCICLASS     => '0c03',
-            NAME         => 'USB Controller',
+            NAME         => 'USB controller',
             MANUFACTURER => 'Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #3',
             REV          => '03',
             PCIID        => '8086:2936',
@@ -6099,7 +6099,7 @@ my %lspci_tests = (
         },
         {
             PCICLASS     => '0c03',
-            NAME         => 'USB Controller',
+            NAME         => 'USB controller',
             MANUFACTURER => 'Intel Corporation 82801I (ICH9 Family) USB2 EHCI Controller #1',
             REV          => '03',
             PCIID        => '8086:293a',
@@ -6123,15 +6123,6 @@ my %lspci_tests = (
             PCISLOT      => '00:1f.0'
         },
         {
-            PCICLASS     => '0104',
-            NAME         => 'RAID bus controller',
-            MANUFACTURER => 'Intel Corporation Mobile 82801 SATA RAID Controller',
-            REV          => '03',
-            PCIID        => '8086:282a',
-            DRIVER       => 'ahci',
-            PCISLOT      => '00:1f.2'
-        },
-        {
             PCICLASS     => '0c05',
             NAME         => 'SMBus',
             MANUFACTURER => 'Intel Corporation 82801I (ICH9 Family) SMBus Controller',
@@ -6155,7 +6146,7 @@ my %lspci_tests = (
             MANUFACTURER => 'Texas Instruments PCIxx12 OHCI Compliant IEEE 1394 Host Controller',
             REV          => undef,
             PCIID        => '104c:803a',
-            DRIVER       => 'ohci1394',
+            DRIVER       => 'firewire_ohci',
             PCISLOT      => '02:01.1'
         },
         {
@@ -6170,10 +6161,10 @@ my %lspci_tests = (
         {
             PCICLASS     => '0280',
             NAME         => 'Network controller',
-            MANUFACTURER => 'Intel Corporation Wireless WiFi Link 5100',
+            MANUFACTURER => 'Intel Corporation WiFi Link 5100',
             REV          => undef,
             PCIID        => '8086:4232',
-            DRIVER       => 'iwlagn',
+            DRIVER       => 'iwlwifi',
             PCISLOT      => '0c:00.0'
         }
     ]


================================================================
  Commit: bf0939c383f2aa0666b10a4d6c5367ed4a8ef459
      https://github.com/fusinv/fusioninventory-agent/commit/bf0939c383f2aa0666b10a4d6c5367ed4a8ef459
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-04-05 (Thu, 05 Apr 2012)

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

  Log Message:
  -----------
  a single -v flag is enough for lspci

this produce a less verbose output, and protect against buggy hardware
side-effects such as http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=631359


diff --git a/lib/FusionInventory/Agent/Tools/Generic.pm b/lib/FusionInventory/Agent/Tools/Generic.pm
index 03c1cc5..25ac7ba 100644
--- a/lib/FusionInventory/Agent/Tools/Generic.pm
+++ b/lib/FusionInventory/Agent/Tools/Generic.pm
@@ -125,7 +125,7 @@ sub getCpusFromDmidecode {
 
 sub getPCIDevices {
     my (%params) = (
-        command => 'lspci -vvv -nn',
+        command => 'lspci -v -nn',
         @_
     );
     my $handle = getFileHandle(%params);


================================================================
  Commit: acdd0ccde871f71b9d13d05d6cfbf9b09f1fdedd
      https://github.com/fusinv/fusioninventory-agent/commit/acdd0ccde871f71b9d13d05d6cfbf9b09f1fdedd
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-04-05 (Thu, 05 Apr 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
    M t/inventory/windows/networks.t

  Log Message:
  -----------
  enforce  consistent behaviour with Linux


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
index 58314a7..047783b 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
@@ -79,17 +79,7 @@ sub _getInterfaces {
         if ($object->{IPAddress}) {
             foreach my $address (@{$object->{IPAddress}}) {
                 my $mask = shift @{$object->{IPSubnet}};
-                if ($address =~ /$ip_address_pattern/) {
-                    push @{$configuration->{IPADDRESS}}, $address;
-                    push @{$configuration->{IPMASK}}, $mask;
-                    push @{$configuration->{IPSUBNET}},
-                        getSubnetAddress($address, $mask);
-                } elsif ($address =~ /\S+/) {
-                    push @{$configuration->{IPADDRESS6}}, $address;
-                    push @{$configuration->{IPMASK6}}, $mask;
-                    push @{$configuration->{IPSUBNET6}},
-                        getSubnetAddressIPv6($address, $mask);
-                }
+                push @{$configuration->{addresses}}, [ $address, $mask ];
             }
         }
 
@@ -107,47 +97,63 @@ sub _getInterfaces {
 
         my $configuration = $configurations[$object->{Index}];
 
-        next unless 
-            $configuration->{IPADDRESS} ||
-            $configuration->{IPADDRESS6} ||
-            $configuration->{MACADDR};
-
-        my $interface = {
-            SPEED       => $object->{Speed},
-            PNPDEVICEID => $object->{PNPDeviceID},
-            MACADDR     => $configuration->{MACADDR},
-            DESCRIPTION => $configuration->{DESCRIPTION},
-            STATUS      => $configuration->{STATUS},
-            IPDHCP      => $configuration->{IPDHCP},
-            MTU         => $configuration->{MTU},
-            IPGATEWAY   => $configuration->{IPGATEWAY},
-            IPADDRESS   => $configuration->{IPADDRESS},
-            IPMASK      => $configuration->{IPMASK},
-            IPSUBNET    => $configuration->{IPSUBNET},
-            IPADDRESS6  => $configuration->{IPADDRESS6},
-            IPMASK6     => $configuration->{IPMASK6},
-            IPSUBNET6   => $configuration->{IPSUBNET6},
-            dns         => $configuration->{dns},
-        };
+        if ($configuration->{addresses}) {
+            foreach my $address (@{$configuration->{addresses}}) {
+
+                my $interface = {
+                    SPEED       => $object->{Speed},
+                    PNPDEVICEID => $object->{PNPDeviceID},
+                    MACADDR     => $configuration->{MACADDR},
+                    DESCRIPTION => $configuration->{DESCRIPTION},
+                    STATUS      => $configuration->{STATUS},
+                    IPDHCP      => $configuration->{IPDHCP},
+                    MTU         => $configuration->{MTU},
+                    IPGATEWAY   => $configuration->{IPGATEWAY},
+                    dns         => $configuration->{dns},
+                };
+
+                if ($address->[0] =~ /$ip_address_pattern/) {
+                    $interface->{IPADDRESS} = $address->[0];
+                    $interface->{IPMASK}    = $address->[1];
+                    $interface->{IPSUBNET}  = getSubnetAddress(
+                        $address->[0],
+                        $address->[1]
+                    );
+                } else {
+                    $interface->{IPADDRESS6} = $address->[0];
+                    $interface->{IPMASK6}    = $address->[1];
+                    $interface->{IPSUBNET6}  = getSubnetAddressIPv6(
+                        $address->[0],
+                        $address->[1]
+                    );
+                }
 
-        # PhysicalAdapter only work on OS > XP
-        if (defined $object->{PhysicalAdapter}) {
-            $interface->{VIRTUALDEV} = $object->{PhysicalAdapter} ? 0 : 1;
-        # http://forge.fusioninventory.org/issues/1166 
-        } elsif ($interface->{DESCRIPTION}
-              && $interface->{DESCRIPTION} =~ /RAS/
-              && $interface->{DESCRIPTION} =~ /Adapter/i) {
-            $interface->{VIRTUALDEV} = 1;
-        } else {
-            $interface->{VIRTUALDEV} = $object->{PNPDeviceID} =~ /^ROOT/ ? 1 : 0;
-        }
+                $interface->{VIRTUALDEV} = _isVirtual($object, $configuration);
+                $interface->{TYPE}       = _getType($object);
 
-        if (defined $object->{AdapterType}) {
-            $interface->{TYPE} = $object->{AdapterType};
-            $interface->{TYPE} =~ s/Ethernet.*/Ethernet/;
+                push @interfaces, $interface;
+            }
+        } else {
+            next unless $configuration->{MACADDR};
+
+            my $interface = {
+                SPEED       => $object->{Speed},
+                PNPDEVICEID => $object->{PNPDeviceID},
+                MACADDR     => $configuration->{MACADDR},
+                DESCRIPTION => $configuration->{DESCRIPTION},
+                STATUS      => $configuration->{STATUS},
+                IPDHCP      => $configuration->{IPDHCP},
+                MTU         => $configuration->{MTU},
+                IPGATEWAY   => $configuration->{IPGATEWAY},
+                dns         => $configuration->{dns},
+            };
+
+            $interface->{VIRTUALDEV} = _isVirtual($object, $configuration);
+            $interface->{TYPE}       = _getType($object);
+
+            push @interfaces, $interface;
         }
 
-        push @interfaces, $interface;
     }
 
     return
@@ -155,4 +161,34 @@ sub _getInterfaces {
 
 }
 
+sub _isVirtual {
+    my ($object, $configuration) = @_;
+
+    # PhysicalAdapter only work on OS > XP
+    if (defined $object->{PhysicalAdapter}) {
+        return $object->{PhysicalAdapter} ? 0 : 1;
+    }
+
+    # http://forge.fusioninventory.org/issues/1166 
+    if ($configuration->{DESCRIPTION} &&
+        $configuration->{DESCRIPTION} =~ /RAS/ &&
+        $configuration->{DESCRIPTION} =~ /Adapter/i
+    ) {
+          return 1;
+    }
+
+    return $object->{PNPDeviceID} =~ /^ROOT/ ? 1 : 0;
+}
+
+sub _getType {
+    my ($object) = @_;
+
+    return unless $object->{AdapterType};
+
+    my $type = $object->{AdapterType};
+    $type =~ s/Ethernet.*/Ethernet/;
+
+    return $type;
+}
+
 1;
diff --git a/t/inventory/windows/networks.t b/t/inventory/windows/networks.t
index b854a24..460c9d8 100755
--- a/t/inventory/windows/networks.t
+++ b/t/inventory/windows/networks.t
@@ -22,18 +22,31 @@ my %tests = (
     7 => [
         {
             dns         => '192.168.0.254',
-            IPMASK6     => [ '64' ],
-            IPMASK      => [ '255.255.255.0' ],
+            IPMASK      => '255.255.255.0',
             IPGATEWAY   => '192.168.0.254',
             MACADDR     => 'F4:6D:04:97:2D:3E',
             STATUS      => 'Up',
-            IPADDRESS6  => [ 'fe80::311a:2127:dded:6618' ],
             IPDHCP      => '192.168.0.254',
-            IPSUBNET    => [ '192.168.0.0' ],
+            IPSUBNET    => '192.168.0.0',
             MTU         => undef,
-            IPSUBNET6   => [],
             DESCRIPTION => 'Realtek PCIe GBE Family Controller',
-            IPADDRESS   => [ '192.168.0.1' ],
+            IPADDRESS   => '192.168.0.1',
+            VIRTUALDEV  => 0,
+            SPEED       => 100000000,
+            PNPDEVICEID => 'PCI\VEN_10EC&DEV_8168&SUBSYS_84321043&REV_06\4&87D54EE&0&00E5',
+            TYPE        => 'Ethernet'
+        },
+        {
+            dns         => '192.168.0.254',
+            IPMASK6     => '64',
+            IPGATEWAY   => '192.168.0.254',
+            MACADDR     => 'F4:6D:04:97:2D:3E',
+            STATUS      => 'Up',
+            IPADDRESS6  => 'fe80::311a:2127:dded:6618',
+            IPDHCP      => '192.168.0.254',
+            MTU         => undef,
+            IPSUBNET6   => undef,
+            DESCRIPTION => 'Realtek PCIe GBE Family Controller',
             VIRTUALDEV  => 0,
             SPEED       => 100000000,
             PNPDEVICEID => 'PCI\VEN_10EC&DEV_8168&SUBSYS_84321043&REV_06\4&87D54EE&0&00E5',
@@ -42,12 +55,6 @@ my %tests = (
         {
             dns         => undef,
             IPGATEWAY   => undef,
-            IPADDRESS6  => undef,
-            IPMASK6     => undef,
-            IPSUBNET6   => undef,
-            IPADDRESS   => undef,
-            IPMASK      => undef,
-            IPSUBNET    => undef,
             MTU         => undef,
             MACADDR     => '00:26:83:12:FB:0B',
             STATUS      => 'Up',
@@ -62,12 +69,6 @@ my %tests = (
     xp => [
         {
             dns         => undef,
-            IPADDRESS6  => undef,
-            IPMASK6     => undef,
-            IPSUBNET6   => undef,
-            IPADDRESS   => undef,
-            IPMASK      => undef,
-            IPSUBNET    => undef,
             IPGATEWAY   => undef,
             VIRTUALDEV  => 1,
             PNPDEVICEID => 'ROOT\\MS_PPTPMINIPORT\\0000',
@@ -81,12 +82,6 @@ my %tests = (
         },
         {
             dns         => undef,
-            IPADDRESS6  => undef,
-            IPMASK6     => undef,
-            IPSUBNET6   => undef,
-            IPADDRESS   => undef,
-            IPMASK      => undef,
-            IPSUBNET    => undef,
             IPGATEWAY   => undef,
             VIRTUALDEV  => 1,
             PNPDEVICEID => 'ROOT\\MS_PPPOEMINIPORT\\0000',
@@ -100,12 +95,6 @@ my %tests = (
         },
         {
             dns         => undef,
-            IPADDRESS6  => undef,
-            IPMASK6     => undef,
-            IPSUBNET6   => undef,
-            IPADDRESS   => undef,
-            IPMASK      => undef,
-            IPSUBNET    => undef,
             IPGATEWAY   => undef,
             VIRTUALDEV  => 1,
             PNPDEVICEID => 'ROOT\\MS_PSCHEDMP\\0000',
@@ -119,7 +108,7 @@ my %tests = (
         },
         {
             dns         => '10.36.6.100',
-            IPMASK      => [ '255.255.254.0' ],
+            IPMASK      => '255.255.254.0',
             IPGATEWAY   => '10.36.6.1',
             VIRTUALDEV  => 0,
             PNPDEVICEID => 'PCI\\VEN_14E4&DEV_1677&SUBSYS_3006103C&REV_01\\4&1886B119&0&00E1',
@@ -128,22 +117,13 @@ my %tests = (
             TYPE        => 'Ethernet',
             SPEED       => undef,
             IPDHCP      => '10.36.6.100',
-            IPSUBNET    => [ '10.36.6.0' ],
+            IPSUBNET    => '10.36.6.0',
             MTU         => undef,
             DESCRIPTION => 'Broadcom NetXtreme Gigabit Ethernet - Teefer2 Miniport',
-            IPADDRESS => [ '10.36.6.30' ],
-            IPADDRESS6  => undef,
-            IPMASK6     => undef,
-            IPSUBNET6   => undef,
+            IPADDRESS   => '10.36.6.30',
         },
         {
             dns         => undef,
-            IPADDRESS6  => undef,
-            IPMASK6     => undef,
-            IPSUBNET6   => undef,
-            IPADDRESS   => undef,
-            IPMASK      => undef,
-            IPSUBNET    => undef,
             IPGATEWAY   => undef,
             VIRTUALDEV  => 1,
             PNPDEVICEID => 'ROOT\\MS_PSCHEDMP\\0002',
@@ -157,12 +137,6 @@ my %tests = (
         },
         {
             dns         => undef,
-            IPADDRESS6  => undef,
-            IPMASK6     => undef,
-            IPSUBNET6   => undef,
-            IPADDRESS   => undef,
-            IPMASK      => undef,
-            IPSUBNET    => undef,
             IPGATEWAY   => undef,
             VIRTUALDEV  => 1,
             PNPDEVICEID => 'ROOT\\SYMC_TEEFER2MP\\0000',
@@ -176,12 +150,6 @@ my %tests = (
         },
         {
             dns         => undef,
-            IPADDRESS6  => undef,
-            IPMASK6     => undef,
-            IPSUBNET6   => undef,
-            IPADDRESS   => undef,
-            IPMASK      => undef,
-            IPSUBNET    => undef,
             IPGATEWAY   => undef,
             VIRTUALDEV  => 1,
             PNPDEVICEID => 'ROOT\\SYMC_TEEFER2MP\\0002',
@@ -213,5 +181,6 @@ foreach my $test (keys %tests) {
         \@interfaces,
         $tests{$test},
         "$test sample"
-    );
+    ) or print Dumper(\@interfaces);
+use Data::Dumper;
 }


================================================================
  Commit: 025733414ba5ae66e583ce82b1989370e2608947
      https://github.com/fusinv/fusioninventory-agent/commit/025733414ba5ae66e583ce82b1989370e2608947
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-04-05 (Thu, 05 Apr 2012)

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

  Log Message:
  -----------
  better regexp

use explicit character class rather than non-greedy quantifier, for
consistency


diff --git a/lib/FusionInventory/Agent/Tools/Linux.pm b/lib/FusionInventory/Agent/Tools/Linux.pm
index 1d93f1e..fed5844 100644
--- a/lib/FusionInventory/Agent/Tools/Linux.pm
+++ b/lib/FusionInventory/Agent/Tools/Linux.pm
@@ -315,7 +315,7 @@ sub getInterfacesFromIp {
     my $interface;
 
     while (my $line = <$handle>) {
-        if ($line =~ /^\d+:\s+(\S+): <(.+?)>(.*)/) {
+        if ($line =~ /^\d+:\s+(\S+): <([^>]+)>(.*)/) {
 
             $interface = {
                 DESCRIPTION => $1


================================================================
  Commit: a26b229a9c2b63d838131ea6855ec1f94414ba99
      https://github.com/fusinv/fusioninventory-agent/commit/a26b229a9c2b63d838131ea6855ec1f94414ba99
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-04-05 (Thu, 05 Apr 2012)

  Changed paths:
    M t/inventory/windows/networks.t

  Log Message:
  -----------
  remove debug code


diff --git a/t/inventory/windows/networks.t b/t/inventory/windows/networks.t
index 460c9d8..b6367c0 100755
--- a/t/inventory/windows/networks.t
+++ b/t/inventory/windows/networks.t
@@ -181,6 +181,5 @@ foreach my $test (keys %tests) {
         \@interfaces,
         $tests{$test},
         "$test sample"
-    ) or print Dumper(\@interfaces);
-use Data::Dumper;
+    );
 }


================================================================
  Commit: 711d919980aa51b052f476d46bc8b08d38b4fe69
      https://github.com/fusinv/fusioninventory-agent/commit/711d919980aa51b052f476d46bc8b08d38b4fe69
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-04-06 (Fri, 06 Apr 2012)

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

  Log Message:
  -----------
  add getNetworkMaskIPv6 function


diff --git a/lib/FusionInventory/Agent/Tools/Network.pm b/lib/FusionInventory/Agent/Tools/Network.pm
index 27bdd20..636c0d1 100644
--- a/lib/FusionInventory/Agent/Tools/Network.pm
+++ b/lib/FusionInventory/Agent/Tools/Network.pm
@@ -17,6 +17,7 @@ our @EXPORT = qw(
     getSubnetAddress
     getSubnetAddressIPv6
     getNetworkMask
+    getNetworkMaskIPv6
     hex2canonical
     alt2canonical
 );
@@ -96,6 +97,12 @@ sub getNetworkMask {
     return join ('.', map { oct('0b' . $_) } @bytes);
 }
 
+sub getNetworkMaskIPv6 {
+    my ($prefix) = @_;
+
+    return ip_compress_address(ip_bintoip(ip_get_mask($prefix, 6), 6), 6);
+}
+
 1;
 __END__
 
@@ -145,4 +152,8 @@ Returns the subnet address for IPv6.
 
 =head2 getNetworkMask($prefix)
 
-Returns the network mask.
+Returns the network mask for IPv4.
+
+=head2 getNetworkMaskIPv6($prefix)
+
+Returns the network mask for IPv6.


================================================================
  Commit: 525d3e607b29ad7f0945303f64d1c9797499ff4d
      https://github.com/fusinv/fusioninventory-agent/commit/525d3e607b29ad7f0945303f64d1c9797499ff4d
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-04-06 (Fri, 06 Apr 2012)

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

  Log Message:
  -----------
  fix getSubnetAddressIPv6 function


diff --git a/lib/FusionInventory/Agent/Tools/Network.pm b/lib/FusionInventory/Agent/Tools/Network.pm
index 636c0d1..c3e08b5 100644
--- a/lib/FusionInventory/Agent/Tools/Network.pm
+++ b/lib/FusionInventory/Agent/Tools/Network.pm
@@ -62,14 +62,11 @@ sub getSubnetAddressIPv6 {
 
     return unless $address && $mask;
 
-    my $binaddress = ip_iptobin($address, 6);
-    my $binmask    = ip_iptobin($mask, 6);
-
-    return unless $binaddress && $binmask;
-
+    my $binaddress = ip_iptobin(ip_expand_address($address, 6), 6);
+    my $binmask    = ip_iptobin(ip_expand_address($mask, 6), 6);
     my $binsubnet  = $binaddress & $binmask; ## no critic (ProhibitBitwise)
 
-    return ip_bintoip($binsubnet, 6);
+    return ip_compress_address(ip_bintoip($binsubnet, 6), 6);
 }
 
 sub hex2canonical {


================================================================
  Commit: d8e75b063b8d37391715626a16a46c9cc7cd0f13
      https://github.com/fusinv/fusioninventory-agent/commit/d8e75b063b8d37391715626a16a46c9cc7cd0f13
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-04-06 (Fri, 06 Apr 2012)

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

  Log Message:
  -----------
  return explicit undef for invalid arguments


diff --git a/lib/FusionInventory/Agent/Tools/Network.pm b/lib/FusionInventory/Agent/Tools/Network.pm
index c3e08b5..3428fb0 100644
--- a/lib/FusionInventory/Agent/Tools/Network.pm
+++ b/lib/FusionInventory/Agent/Tools/Network.pm
@@ -48,7 +48,7 @@ our $network_pattern = qr/
 sub getSubnetAddress {
     my ($address, $mask) = @_;
 
-    return unless $address && $mask;
+    return undef unless $address && $mask; ## no critic (ExplicitReturnUndef)
 
     my $binaddress = ip_iptobin($address, 4);
     my $binmask    = ip_iptobin($mask, 4);
@@ -60,7 +60,7 @@ sub getSubnetAddress {
 sub getSubnetAddressIPv6 {
     my ($address, $mask) = @_;
 
-    return unless $address && $mask;
+    return undef unless $address && $mask; ## no critic (ExplicitReturnUndef)
 
     my $binaddress = ip_iptobin(ip_expand_address($address, 6), 6);
     my $binmask    = ip_iptobin(ip_expand_address($mask, 6), 6);
@@ -86,6 +86,8 @@ sub alt2canonical {
 sub getNetworkMask {
     my ($prefix) = @_;
 
+    return undef unless $prefix; ## no critic (ExplicitReturnUndef)
+
     my $mask;
     $mask .= 1 foreach(1..$prefix);
     $mask .= 0 foreach(1..(32-$prefix));
@@ -97,6 +99,8 @@ sub getNetworkMask {
 sub getNetworkMaskIPv6 {
     my ($prefix) = @_;
 
+    return undef unless $prefix; ## no critic (ExplicitReturnUndef)
+
     return ip_compress_address(ip_bintoip(ip_get_mask($prefix, 6), 6), 6);
 }
 


================================================================
  Commit: d08d2d9145327988d25f4077bcd2ad4eef1b4bb8
      https://github.com/fusinv/fusioninventory-agent/commit/d08d2d9145327988d25f4077bcd2ad4eef1b4bb8
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-04-06 (Fri, 06 Apr 2012)

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

  Log Message:
  -----------
  keep code consistent between v4/v6 versions

No need to ressort to custom code as long as Net::IP is required anyway


diff --git a/lib/FusionInventory/Agent/Tools/Network.pm b/lib/FusionInventory/Agent/Tools/Network.pm
index 3428fb0..a544bf9 100644
--- a/lib/FusionInventory/Agent/Tools/Network.pm
+++ b/lib/FusionInventory/Agent/Tools/Network.pm
@@ -88,12 +88,7 @@ sub getNetworkMask {
 
     return undef unless $prefix; ## no critic (ExplicitReturnUndef)
 
-    my $mask;
-    $mask .= 1 foreach(1..$prefix);
-    $mask .= 0 foreach(1..(32-$prefix));
-
-    my @bytes = $mask =~ /^(\d{8})(\d{8})(\d{8})(\d{8})$/;
-    return join ('.', map { oct('0b' . $_) } @bytes);
+    return ip_bintoip(ip_get_mask($prefix, 4), 4);
 }
 
 sub getNetworkMaskIPv6 {


================================================================
  Commit: f1c420d5d6f75e314b967e4712fbc505b91d5001
      https://github.com/fusinv/fusioninventory-agent/commit/f1c420d5d6f75e314b967e4712fbc505b91d5001
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-04-06 (Fri, 06 Apr 2012)

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

  Log Message:
  -----------
  capture all IPv6 parameters


diff --git a/lib/FusionInventory/Agent/Tools/Linux.pm b/lib/FusionInventory/Agent/Tools/Linux.pm
index fed5844..5399bbe 100644
--- a/lib/FusionInventory/Agent/Tools/Linux.pm
+++ b/lib/FusionInventory/Agent/Tools/Linux.pm
@@ -338,9 +338,16 @@ sub getInterfacesFromIp {
             # if courrent interface is not up, there won't be any address lines
             push @interfaces, $interface
                 unless $interface->{STATUS} && $interface->{STATUS} eq 'Up';
-        } elsif ($line =~ /inet6 (\S+)\//) {
+        } elsif ($line =~ /inet6 (\S+)\/(\d{1,2})/) {
+            my $address = $1;
+            my $mask    = $2 ? getNetworkMaskIPv6($2) : undef;
+            my $subnet  = $address && $mask ?
+                getSubnetAddressIPv6($address, $mask) : undef;
+
             push @interfaces, {
-                IPADDRESS6  => $1,
+                IPADDRESS6  => $address,
+                IPMASK6     => $mask,
+                IPSUBNET6   => $subnet,
                 STATUS      => $interface->{STATUS},
                 DESCRIPTION => $interface->{DESCRIPTION},
                 MACADDR     => $interface->{MACADDR}
diff --git a/t/tools/linux.t b/t/tools/linux.t
index 0446db4..9ca970d 100755
--- a/t/tools/linux.t
+++ b/t/tools/linux.t
@@ -685,6 +685,8 @@ my %ipaddrshow_tests = (
             DESCRIPTION => 'lo',
             STATUS      => 'Up',
             IPADDRESS6  => '::1',
+            IPMASK6     => 'fff0::',
+            IPSUBNET6   => '::',
             MACADDR     => '00:00:00:00:00:00',
         },
         {
@@ -699,13 +701,17 @@ my %ipaddrshow_tests = (
             MACADDR     => '00:23:18:91:db:8d',
             DESCRIPTION => 'eth0',
             STATUS      => 'Up',
-            IPADDRESS6  => '2a01:e34:ef9c:64d0:223:18ff:fe91:db8d'
+            IPADDRESS6  => '2a01:e34:ef9c:64d0:223:18ff:fe91:db8d',
+            IPMASK6     => 'ffff:ffff:ffff:ffff::',
+            IPSUBNET6   => '2a01:e34:ef9c:64d0::'
         },
         {
             MACADDR     => '00:23:18:91:db:8d',
             DESCRIPTION => 'eth0',
             STATUS      => 'Up',
-            IPADDRESS6  => 'fe80::223:18ff:fe91:db8d'
+            IPADDRESS6  => 'fe80::223:18ff:fe91:db8d',
+            IPMASK6     => 'ffff:ffff:ffff:ffff::',
+            IPSUBNET6   => 'fe80::'
         },
         {
             STATUS      => 'Up',
@@ -740,7 +746,9 @@ my %ipaddrshow_tests = (
             MACADDR     => '8a:84:99:29:46:05',
             DESCRIPTION => 'tap0',
             STATUS      => 'Up',
-            IPADDRESS6  => 'fe80::8884:99ff:fe29:4605'
+            IPADDRESS6  => 'fe80::8884:99ff:fe29:4605',
+            IPMASK6     => 'ffff:ffff:ffff:ffff::',
+            IPSUBNET6   => 'fe80::'
         }
     ],
     'ip_addr-2' => [
@@ -756,6 +764,8 @@ my %ipaddrshow_tests = (
             DESCRIPTION => 'lo',
             STATUS      => 'Up',
             IPADDRESS6  => '::1',
+            IPMASK6     => 'fff0::',
+            IPSUBNET6   => '::',
             MACADDR     => '00:00:00:00:00:00',
         },
         {
@@ -778,7 +788,9 @@ my %ipaddrshow_tests = (
             MACADDR     => '0f:0f:0f:0f:0f:0f',
             DESCRIPTION => 'eth0',
             STATUS      => 'Up',
-            IPADDRESS6  => 'fe80::201:29ff:fed1:feb4'
+            IPADDRESS6  => 'fe80::201:29ff:fed1:feb4',
+            IPMASK6     => 'ffff:ffff:ffff:ffff::',
+            IPSUBNET6   => 'fe80::'
         },
         {
             STATUS      => 'Down',
@@ -810,6 +822,8 @@ my %ipaddrshow_tests = (
             DESCRIPTION => 'lo',
             STATUS      => 'Up',
             IPADDRESS6  => '::1',
+            IPMASK6     => 'fff0::',
+            IPSUBNET6   => '::',
             MACADDR     => '00:00:00:00:00:00',
         },
         {
@@ -824,7 +838,9 @@ my %ipaddrshow_tests = (
             MACADDR     => '00:50:56:8b:70:b7',
             DESCRIPTION => 'eth0',
             STATUS      => 'Up',
-            IPADDRESS6  => 'fe80::250:56ff:fe8b:70b7'
+            IPADDRESS6  => 'fe80::250:56ff:fe8b:70b7',
+            IPMASK6     => 'ffff:ffff:ffff:ffff::',
+            IPSUBNET6   => 'fe80::'
         },
         {
             DESCRIPTION => 'sit0',


================================================================
  Commit: d49702406d57956bcd66fa37deec3fd6d5da8c21
      https://github.com/fusinv/fusioninventory-agent/commit/d49702406d57956bcd66fa37deec3fd6d5da8c21
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-04-06 (Fri, 06 Apr 2012)

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

  Log Message:
  -----------
  simplification


diff --git a/lib/FusionInventory/Agent/Tools/Linux.pm b/lib/FusionInventory/Agent/Tools/Linux.pm
index 5399bbe..94a38c8 100644
--- a/lib/FusionInventory/Agent/Tools/Linux.pm
+++ b/lib/FusionInventory/Agent/Tools/Linux.pm
@@ -340,9 +340,8 @@ sub getInterfacesFromIp {
                 unless $interface->{STATUS} && $interface->{STATUS} eq 'Up';
         } elsif ($line =~ /inet6 (\S+)\/(\d{1,2})/) {
             my $address = $1;
-            my $mask    = $2 ? getNetworkMaskIPv6($2) : undef;
-            my $subnet  = $address && $mask ?
-                getSubnetAddressIPv6($address, $mask) : undef;
+            my $mask    = getNetworkMaskIPv6($2);
+            my $subnet  = getSubnetAddressIPv6($address, $mask);
 
             push @interfaces, {
                 IPADDRESS6  => $address,
@@ -354,9 +353,8 @@ sub getInterfacesFromIp {
             };
         } elsif ($line =~ /inet ($ip_address_pattern)(?:\/(\d{1,3}))?/) {
             my $address = $1;
-            my $mask    = $2 ? getNetworkMask($2) : undef;
-            my $subnet  = $address && $mask ?
-                getSubnetAddress($address, $mask) : undef;
+            my $mask    = getNetworkMask($2);
+            my $subnet  = getSubnetAddress($address, $mask);
 
             push @interfaces, {
                 IPADDRESS   => $address,


================================================================
  Commit: 8a613a5582a21e433a28d1a3e2cecfe5f2d428e6
      https://github.com/fusinv/fusioninventory-agent/commit/8a613a5582a21e433a28d1a3e2cecfe5f2d428e6
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-04-06 (Fri, 06 Apr 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
    M t/inventory/windows/networks.t

  Log Message:
  -----------
  fix IPv6 mask and subnet computation


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
index 047783b..a7ae01c 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
@@ -78,8 +78,8 @@ sub _getInterfaces {
 
         if ($object->{IPAddress}) {
             foreach my $address (@{$object->{IPAddress}}) {
-                my $mask = shift @{$object->{IPSubnet}};
-                push @{$configuration->{addresses}}, [ $address, $mask ];
+                my $prefix = shift @{$object->{IPSubnet}};
+                push @{$configuration->{addresses}}, [ $address, $prefix ];
             }
         }
 
@@ -116,15 +116,15 @@ sub _getInterfaces {
                     $interface->{IPADDRESS} = $address->[0];
                     $interface->{IPMASK}    = $address->[1];
                     $interface->{IPSUBNET}  = getSubnetAddress(
-                        $address->[0],
-                        $address->[1]
+                        $interface->{IPADDRESS},
+                        $interface->{IPMASK}
                     );
                 } else {
                     $interface->{IPADDRESS6} = $address->[0];
-                    $interface->{IPMASK6}    = $address->[1];
+                    $interface->{IPMASK6}    = getNetworkMaskIPv6($address->[1]);
                     $interface->{IPSUBNET6}  = getSubnetAddressIPv6(
-                        $address->[0],
-                        $address->[1]
+                        $interface->{IPADDRESS6},
+                        $interface->{IPMASK6}
                     );
                 }
 
diff --git a/t/inventory/windows/networks.t b/t/inventory/windows/networks.t
index b6367c0..f943441 100755
--- a/t/inventory/windows/networks.t
+++ b/t/inventory/windows/networks.t
@@ -38,14 +38,14 @@ my %tests = (
         },
         {
             dns         => '192.168.0.254',
-            IPMASK6     => '64',
+            IPMASK6     => 'ffff:ffff:ffff:ffff::',
             IPGATEWAY   => '192.168.0.254',
             MACADDR     => 'F4:6D:04:97:2D:3E',
             STATUS      => 'Up',
             IPADDRESS6  => 'fe80::311a:2127:dded:6618',
             IPDHCP      => '192.168.0.254',
             MTU         => undef,
-            IPSUBNET6   => undef,
+            IPSUBNET6   => 'fe80::',
             DESCRIPTION => 'Realtek PCIe GBE Family Controller',
             VIRTUALDEV  => 0,
             SPEED       => 100000000,


================================================================
  Commit: 2c3775059e4611bd31198b6cbe76050586804768
      https://github.com/fusinv/fusioninventory-agent/commit/2c3775059e4611bd31198b6cbe76050586804768
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-04-07 (Sat, 07 Apr 2012)

  Changed paths:
    A resources/virtualization/vboxmanage/sample3
    M t/inventory/virtualization/virtualbox.t

  Log Message:
  -----------
  new virtualbox sample


diff --git a/resources/virtualization/vboxmanage/sample3 b/resources/virtualization/vboxmanage/sample3
new file mode 100644
index 0000000..985648d
--- /dev/null
+++ b/resources/virtualization/vboxmanage/sample3
@@ -0,0 +1,507 @@
+Name:            Node 1 : Debian
+Guest OS:        Debian (64 bit)
+UUID:            e8e1f52d-700b-4fe8-b024-db04550eaddc
+Config file:     /home/normation/VirtualBox VMs/Node 1 : Debian/Node 1 : Debian.vbox
+Snapshot folder: /home/normation/VirtualBox VMs/Node 1 : Debian/Snapshots
+Log folder:      /home/normation/VirtualBox VMs/Node 1 : Debian/Logs
+Hardware UUID:   e8e1f52d-700b-4fe8-b024-db04550eaddc
+Memory size:     256MB
+Page Fusion:     off
+VRAM size:       12MB
+CPU exec cap:    100%
+HPET:            off
+Chipset:         piix3
+Firmware:        BIOS
+Number of CPUs:  1
+Synthetic Cpu:   off
+CPUID overrides: None
+Boot menu mode:  message and menu
+Boot Device (1): Floppy
+Boot Device (2): DVD
+Boot Device (3): HardDisk
+Boot Device (4): Not Assigned
+ACPI:            on
+IOAPIC:          on
+PAE:             off
+Time offset:     0 ms
+RTC:             UTC
+Hardw. virt.ext: on
+Hardw. virt.ext exclusive: on
+Nested Paging:   on
+Large Pages:     off
+VT-x VPID:       on
+State:           powered off (since 2012-04-04T17:47:16.000000000)
+Monitor count:   1
+3D Acceleration: off
+2D Video Acceleration: off
+Teleporter Enabled: off
+Teleporter Port: 0
+Teleporter Address: 
+Teleporter Password: 
+Storage Controller Name (0):            Contrôleur IDE
+Storage Controller Type (0):            PIIX4
+Storage Controller Instance Number (0): 0
+Storage Controller Max Port Count (0):  2
+Storage Controller Port Count (0):      2
+Storage Controller Bootable (0):        on
+Storage Controller Name (1):            Contrôleur SATA
+Storage Controller Type (1):            IntelAhci
+Storage Controller Instance Number (1): 0
+Storage Controller Max Port Count (1):  30
+Storage Controller Port Count (1):      1
+Storage Controller Bootable (1):        on
+Contrôleur IDE (1, 0): Empty
+Contrôleur SATA (0, 0): /home/normation/VirtualBox VMs/Node 1 : Debian/Node 1 : Debian.vdi (UUID: 741fe4ad-0581-45c8-94b5-0d4cd6b23e14)
+NIC 1:           MAC: 0800272C26F0, Attachment: NAT, Cable connected: on, Trace: off (file: none), Type: 82540EM, Reported speed: 0 Mbps, Boot priority: 0, Promisc Policy: deny
+NIC 1 Settings:  MTU: 0, Socket (send: 64, receive: 64), TCP Window (send:64, receive: 64)
+NIC 2:           MAC: 0800270C5FB5, Attachment: Host-only Interface 'vboxnet0', Cable connected: on, Trace: off (file: none), Type: 82540EM, Reported speed: 0 Mbps, Boot priority: 0, Promisc Policy: deny
+NIC 3:           disabled
+NIC 4:           disabled
+NIC 5:           disabled
+NIC 6:           disabled
+NIC 7:           disabled
+NIC 8:           disabled
+Pointing Device: USB Tablet
+Keyboard Device: PS/2 Keyboard
+UART 1:          disabled
+UART 2:          disabled
+Audio:           disabled
+Clipboard Mode:  Bidirectional
+VRDE:            disabled
+USB:             enabled
+
+USB Device Filters:
+
+<none>
+
+Shared folders:  <none>
+
+Guest:
+
+Configured memory balloon size:      0 MB
+
+
+Name:            Node 2 : Debian
+Guest OS:        Debian (64 bit)
+UUID:            1922b52b-aa28-4d4a-b384-2d3429e3a6ad
+Config file:     /home/normation/VirtualBox VMs/Node 2 : Debian/Node 2 : Debian.vbox
+Snapshot folder: /home/normation/VirtualBox VMs/Node 2 : Debian/Snapshots
+Log folder:      /home/normation/VirtualBox VMs/Node 2 : Debian/Logs
+Hardware UUID:   1922b52b-aa28-4d4a-b384-2d3429e3a6ad
+Memory size:     256MB
+Page Fusion:     off
+VRAM size:       12MB
+CPU exec cap:    100%
+HPET:            off
+Chipset:         piix3
+Firmware:        BIOS
+Number of CPUs:  1
+Synthetic Cpu:   off
+CPUID overrides: None
+Boot menu mode:  message and menu
+Boot Device (1): Floppy
+Boot Device (2): DVD
+Boot Device (3): HardDisk
+Boot Device (4): Not Assigned
+ACPI:            on
+IOAPIC:          on
+PAE:             off
+Time offset:     0 ms
+RTC:             UTC
+Hardw. virt.ext: on
+Hardw. virt.ext exclusive: on
+Nested Paging:   on
+Large Pages:     off
+VT-x VPID:       on
+State:           powered off (since 2012-04-01T15:33:33.000000000)
+Monitor count:   1
+3D Acceleration: off
+2D Video Acceleration: off
+Teleporter Enabled: off
+Teleporter Port: 0
+Teleporter Address: 
+Teleporter Password: 
+Storage Controller Name (0):            Contrôleur IDE
+Storage Controller Type (0):            PIIX4
+Storage Controller Instance Number (0): 0
+Storage Controller Max Port Count (0):  2
+Storage Controller Port Count (0):      2
+Storage Controller Bootable (0):        on
+Storage Controller Name (1):            Contrôleur SATA
+Storage Controller Type (1):            IntelAhci
+Storage Controller Instance Number (1): 0
+Storage Controller Max Port Count (1):  30
+Storage Controller Port Count (1):      1
+Storage Controller Bootable (1):        on
+Contrôleur IDE (1, 0): Empty
+Contrôleur SATA (0, 0): /home/normation/VirtualBox VMs/Node 2 : Debian/Node 2 : Debian.vdi (UUID: 2a667060-5634-44e2-8727-f9a9c44cdcc4)
+NIC 1:           MAC: 08002714E92D, Attachment: NAT, Cable connected: off, Trace: off (file: none), Type: 82540EM, Reported speed: 0 Mbps, Boot priority: 0, Promisc Policy: deny
+NIC 1 Settings:  MTU: 0, Socket (send: 64, receive: 64), TCP Window (send:64, receive: 64)
+NIC 2:           MAC: 0800271B1CE0, Attachment: Host-only Interface 'vboxnet0', Cable connected: on, Trace: off (file: none), Type: 82540EM, Reported speed: 0 Mbps, Boot priority: 0, Promisc Policy: deny
+NIC 3:           disabled
+NIC 4:           disabled
+NIC 5:           disabled
+NIC 6:           disabled
+NIC 7:           disabled
+NIC 8:           disabled
+Pointing Device: USB Tablet
+Keyboard Device: PS/2 Keyboard
+UART 1:          disabled
+UART 2:          disabled
+Audio:           disabled
+Clipboard Mode:  Bidirectional
+VRDE:            disabled
+USB:             enabled
+
+USB Device Filters:
+
+<none>
+
+Shared folders:  <none>
+
+Guest:
+
+Configured memory balloon size:      0 MB
+
+
+Name:            Node 3 : CentOS
+Guest OS:        Red Hat (64 bit)
+UUID:            a93b30fb-c0f8-4dbf-b439-f6e26d923cf7
+Config file:     /home/normation/VirtualBox VMs/Node 3 : CentOS/Node 3 : CentOS.vbox
+Snapshot folder: /home/normation/VirtualBox VMs/Node 3 : CentOS/Snapshots
+Log folder:      /home/normation/VirtualBox VMs/Node 3 : CentOS/Logs
+Hardware UUID:   a93b30fb-c0f8-4dbf-b439-f6e26d923cf7
+Memory size:     256MB
+Page Fusion:     off
+VRAM size:       12MB
+CPU exec cap:    100%
+HPET:            off
+Chipset:         piix3
+Firmware:        BIOS
+Number of CPUs:  1
+Synthetic Cpu:   off
+CPUID overrides: None
+Boot menu mode:  message and menu
+Boot Device (1): Floppy
+Boot Device (2): DVD
+Boot Device (3): HardDisk
+Boot Device (4): Not Assigned
+ACPI:            on
+IOAPIC:          on
+PAE:             on
+Time offset:     0 ms
+RTC:             UTC
+Hardw. virt.ext: on
+Hardw. virt.ext exclusive: on
+Nested Paging:   on
+Large Pages:     off
+VT-x VPID:       on
+State:           powered off (since 2012-04-04T15:38:21.000000000)
+Monitor count:   1
+3D Acceleration: off
+2D Video Acceleration: off
+Teleporter Enabled: off
+Teleporter Port: 0
+Teleporter Address: 
+Teleporter Password: 
+Storage Controller Name (0):            Contrôleur IDE
+Storage Controller Type (0):            PIIX4
+Storage Controller Instance Number (0): 0
+Storage Controller Max Port Count (0):  2
+Storage Controller Port Count (0):      2
+Storage Controller Bootable (0):        on
+Storage Controller Name (1):            Contrôleur SATA
+Storage Controller Type (1):            IntelAhci
+Storage Controller Instance Number (1): 0
+Storage Controller Max Port Count (1):  30
+Storage Controller Port Count (1):      1
+Storage Controller Bootable (1):        on
+Contrôleur IDE (1, 0): Empty
+Contrôleur SATA (0, 0): /home/normation/VirtualBox VMs/Node 3 : CentOS/Node 3 : CentOS.vdi (UUID: 7e1f77f5-a17a-4fdd-9e23-f3547f8db25b)
+NIC 1:           MAC: 080027B572C5, Attachment: NAT, Cable connected: off, Trace: off (file: none), Type: 82540EM, Reported speed: 0 Mbps, Boot priority: 0, Promisc Policy: deny
+NIC 1 Settings:  MTU: 0, Socket (send: 64, receive: 64), TCP Window (send:64, receive: 64)
+NIC 2:           MAC: 080027243CFA, Attachment: Host-only Interface 'vboxnet0', Cable connected: on, Trace: off (file: none), Type: 82540EM, Reported speed: 0 Mbps, Boot priority: 0, Promisc Policy: deny
+NIC 3:           disabled
+NIC 4:           disabled
+NIC 5:           disabled
+NIC 6:           disabled
+NIC 7:           disabled
+NIC 8:           disabled
+Pointing Device: PS/2 Mouse
+Keyboard Device: PS/2 Keyboard
+UART 1:          disabled
+UART 2:          disabled
+Audio:           disabled
+Clipboard Mode:  Bidirectional
+VRDE:            disabled
+USB:             enabled
+
+USB Device Filters:
+
+<none>
+
+Shared folders:  <none>
+
+Guest:
+
+Configured memory balloon size:      0 MB
+
+
+Name:            Node 4 : CentOS
+Guest OS:        Red Hat (64 bit)
+UUID:            677daaa1-3e7a-441a-91be-449e02c82dd0
+Config file:     /home/normation/VirtualBox VMs/Node 4 : CentOS/Node 4 : CentOS.vbox
+Snapshot folder: /home/normation/VirtualBox VMs/Node 4 : CentOS/Snapshots
+Log folder:      /home/normation/VirtualBox VMs/Node 4 : CentOS/Logs
+Hardware UUID:   677daaa1-3e7a-441a-91be-449e02c82dd0
+Memory size:     256MB
+Page Fusion:     off
+VRAM size:       12MB
+CPU exec cap:    100%
+HPET:            off
+Chipset:         piix3
+Firmware:        BIOS
+Number of CPUs:  1
+Synthetic Cpu:   off
+CPUID overrides: None
+Boot menu mode:  message and menu
+Boot Device (1): Floppy
+Boot Device (2): DVD
+Boot Device (3): HardDisk
+Boot Device (4): Not Assigned
+ACPI:            on
+IOAPIC:          on
+PAE:             on
+Time offset:     0 ms
+RTC:             UTC
+Hardw. virt.ext: on
+Hardw. virt.ext exclusive: on
+Nested Paging:   on
+Large Pages:     off
+VT-x VPID:       on
+State:           powered off (since 2012-04-01T15:33:47.000000000)
+Monitor count:   1
+3D Acceleration: off
+2D Video Acceleration: off
+Teleporter Enabled: off
+Teleporter Port: 0
+Teleporter Address: 
+Teleporter Password: 
+Storage Controller Name (0):            Contrôleur IDE
+Storage Controller Type (0):            PIIX4
+Storage Controller Instance Number (0): 0
+Storage Controller Max Port Count (0):  2
+Storage Controller Port Count (0):      2
+Storage Controller Bootable (0):        on
+Storage Controller Name (1):            Contrôleur SATA
+Storage Controller Type (1):            IntelAhci
+Storage Controller Instance Number (1): 0
+Storage Controller Max Port Count (1):  30
+Storage Controller Port Count (1):      1
+Storage Controller Bootable (1):        on
+Contrôleur IDE (1, 0): Empty
+Contrôleur SATA (0, 0): /home/normation/VirtualBox VMs/Node 4 : CentOS/Node 4 : CentOS.vdi (UUID: 771d6b7b-eb29-464b-b9eb-9e4d03e43ea9)
+NIC 1:           MAC: 080027C989C8, Attachment: NAT, Cable connected: off, Trace: off (file: none), Type: 82540EM, Reported speed: 0 Mbps, Boot priority: 0, Promisc Policy: deny
+NIC 1 Settings:  MTU: 0, Socket (send: 64, receive: 64), TCP Window (send:64, receive: 64)
+NIC 2:           MAC: 0800276684E9, Attachment: Host-only Interface 'vboxnet0', Cable connected: on, Trace: off (file: none), Type: 82540EM, Reported speed: 0 Mbps, Boot priority: 0, Promisc Policy: deny
+NIC 3:           disabled
+NIC 4:           disabled
+NIC 5:           disabled
+NIC 6:           disabled
+NIC 7:           disabled
+NIC 8:           disabled
+Pointing Device: PS/2 Mouse
+Keyboard Device: PS/2 Keyboard
+UART 1:          disabled
+UART 2:          disabled
+Audio:           disabled
+Clipboard Mode:  Bidirectional
+VRDE:            disabled
+USB:             enabled
+
+USB Device Filters:
+
+<none>
+
+Shared folders:  <none>
+
+Guest:
+
+Configured memory balloon size:      0 MB
+
+
+Name:            FormationCFengine
+Guest OS:        Debian (64 bit)
+UUID:            b8b35683-eb17-4689-8213-6a46b28b139f
+Config file:     /home/normation/VirtualBox VMs/FormationCFengine/FormationCFengine.vbox
+Snapshot folder: /home/normation/VirtualBox VMs/FormationCFengine/Snapshots
+Log folder:      /home/normation/VirtualBox VMs/FormationCFengine/Logs
+Hardware UUID:   b8b35683-eb17-4689-8213-6a46b28b139f
+Memory size:     384MB
+Page Fusion:     off
+VRAM size:       12MB
+CPU exec cap:    100%
+HPET:            off
+Chipset:         piix3
+Firmware:        BIOS
+Number of CPUs:  1
+Synthetic Cpu:   off
+CPUID overrides: None
+Boot menu mode:  message and menu
+Boot Device (1): HardDisk
+Boot Device (2): Not Assigned
+Boot Device (3): Not Assigned
+Boot Device (4): Not Assigned
+ACPI:            on
+IOAPIC:          on
+PAE:             off
+Time offset:     0 ms
+RTC:             UTC
+Hardw. virt.ext: on
+Hardw. virt.ext exclusive: on
+Nested Paging:   on
+Large Pages:     off
+VT-x VPID:       on
+State:           powered off (since 2011-06-17T14:51:25.000000000)
+Monitor count:   1
+3D Acceleration: off
+2D Video Acceleration: off
+Teleporter Enabled: off
+Teleporter Port: 0
+Teleporter Address: 
+Teleporter Password: 
+Storage Controller Name (0):            Contrôleur IDE
+Storage Controller Type (0):            PIIX4
+Storage Controller Instance Number (0): 0
+Storage Controller Max Port Count (0):  2
+Storage Controller Port Count (0):      2
+Storage Controller Bootable (0):        on
+Storage Controller Name (1):            Contrôleur SATA
+Storage Controller Type (1):            IntelAhci
+Storage Controller Instance Number (1): 0
+Storage Controller Max Port Count (1):  30
+Storage Controller Port Count (1):      1
+Storage Controller Bootable (1):        on
+Contrôleur IDE (1, 0): /dev/sr0 (UUID: 00445644-0000-0000-2f64-65762f737230)
+Contrôleur SATA (0, 0): /home/normation/VirtualBox VMs/FormationCFengine/FormationCFengine.vdi (UUID: c126e75e-b5d5-41e6-b148-541eed583c96)
+NIC 1:           MAC: 0800279BA8C4, Attachment: NAT, Cable connected: on, Trace: off (file: none), Type: 82540EM, Reported speed: 0 Mbps, Boot priority: 0, Promisc Policy: deny
+NIC 1 Settings:  MTU: 0, Socket (send: 64, receive: 64), TCP Window (send:64, receive: 64)
+NIC 2:           MAC: 080027F037C9, Attachment: Host-only Interface 'vboxnet0', Cable connected: on, Trace: off (file: none), Type: 82540EM, Reported speed: 0 Mbps, Boot priority: 0, Promisc Policy: deny
+NIC 3:           disabled
+NIC 4:           disabled
+NIC 5:           disabled
+NIC 6:           disabled
+NIC 7:           disabled
+NIC 8:           disabled
+Pointing Device: USB Tablet
+Keyboard Device: PS/2 Keyboard
+UART 1:          disabled
+UART 2:          disabled
+Audio:           enabled (Driver: PulseAudio, Controller: AC97)
+Clipboard Mode:  Bidirectional
+VRDE:            disabled
+USB:             enabled
+
+USB Device Filters:
+
+Index:            0
+Active:           yes
+Name:             USB DISK 2.0 [0100]
+VendorId:         13fe
+ProductId:        1a00
+Revision:         0100
+Manufacturer:             
+Product:          USB DISK 2.0    
+Remote:           0
+Serial Number:    07731D3906F9
+
+Shared folders:  <none>
+
+Guest:
+
+Configured memory balloon size:      0 MB
+
+
+Name:            Debian Maître - Squeeze
+Guest OS:        Debian (64 bit)
+UUID:            ab6afdd6-aa78-4a22-8fc9-02b471c9084c
+Config file:     /home/normation/VirtualBox VMs/Debian Maître - Squeeze/Debian Maître - Squeeze.vbox
+Snapshot folder: /home/normation/VirtualBox VMs/Debian Maître - Squeeze/Snapshots
+Log folder:      /home/normation/VirtualBox VMs/Debian Maître - Squeeze/Logs
+Hardware UUID:   ab6afdd6-aa78-4a22-8fc9-02b471c9084c
+Memory size:     1024MB
+Page Fusion:     off
+VRAM size:       12MB
+CPU exec cap:    100%
+HPET:            off
+Chipset:         piix3
+Firmware:        BIOS
+Number of CPUs:  1
+Synthetic Cpu:   off
+CPUID overrides: None
+Boot menu mode:  message and menu
+Boot Device (1): Floppy
+Boot Device (2): DVD
+Boot Device (3): HardDisk
+Boot Device (4): Not Assigned
+ACPI:            on
+IOAPIC:          on
+PAE:             off
+Time offset:     0 ms
+RTC:             UTC
+Hardw. virt.ext: on
+Hardw. virt.ext exclusive: on
+Nested Paging:   on
+Large Pages:     off
+VT-x VPID:       on
+State:           powered off (since 2012-04-04T17:47:33.000000000)
+Monitor count:   1
+3D Acceleration: off
+2D Video Acceleration: off
+Teleporter Enabled: off
+Teleporter Port: 0
+Teleporter Address: 
+Teleporter Password: 
+Storage Controller Name (0):            Contrôleur IDE
+Storage Controller Type (0):            PIIX4
+Storage Controller Instance Number (0): 0
+Storage Controller Max Port Count (0):  2
+Storage Controller Port Count (0):      2
+Storage Controller Bootable (0):        on
+Storage Controller Name (1):            Contrôleur SATA
+Storage Controller Type (1):            IntelAhci
+Storage Controller Instance Number (1): 0
+Storage Controller Max Port Count (1):  30
+Storage Controller Port Count (1):      1
+Storage Controller Bootable (1):        on
+Contrôleur IDE (1, 0): Empty
+Contrôleur SATA (0, 0): /home/normation/VirtualBox VMs/Debian Maître - Squeeze/Debian Maître - Squeeze.vdi (UUID: 19db8e90-4fd6-4294-81da-0a5d0d6cf94e)
+NIC 1:           MAC: 0800279FE582, Attachment: NAT, Cable connected: on, Trace: off (file: none), Type: 82540EM, Reported speed: 0 Mbps, Boot priority: 0, Promisc Policy: deny
+NIC 1 Settings:  MTU: 0, Socket (send: 64, receive: 64), TCP Window (send:64, receive: 64)
+NIC 2:           MAC: 080027DC79DF, Attachment: Host-only Interface 'vboxnet0', Cable connected: on, Trace: off (file: none), Type: 82540EM, Reported speed: 0 Mbps, Boot priority: 0, Promisc Policy: deny
+NIC 3:           disabled
+NIC 4:           disabled
+NIC 5:           disabled
+NIC 6:           disabled
+NIC 7:           disabled
+NIC 8:           disabled
+Pointing Device: USB Tablet
+Keyboard Device: PS/2 Keyboard
+UART 1:          disabled
+UART 2:          disabled
+Audio:           disabled
+Clipboard Mode:  Bidirectional
+VRDE:            disabled
+USB:             enabled
+
+USB Device Filters:
+
+<none>
+
+Shared folders:  <none>
+
+Guest:
+
+Configured memory balloon size:      0 MB
+
+
diff --git a/t/inventory/virtualization/virtualbox.t b/t/inventory/virtualization/virtualbox.t
index 8a77466..51b4a9e 100755
--- a/t/inventory/virtualization/virtualbox.t
+++ b/t/inventory/virtualization/virtualbox.t
@@ -209,6 +209,62 @@ my %tests = (
             UUID      => 'd1fe6cfa-80c6-41ae-9f4b-2a15dbafcf2c',
             VCPU      => 1
         }
+    ],
+    sample3 => [
+        {
+            VMTYPE    => 'VirtualBox',
+            NAME      => 'Node 1 : Debian',
+            SUBSYSTEM => 'Oracle VM VirtualBox',
+            STATUS    => 'off',
+            MEMORY    => '256MB',
+            UUID      => 'e8e1f52d-700b-4fe8-b024-db04550eaddc',
+            VCPU      => 1
+        },
+        {
+            VMTYPE    => 'VirtualBox',
+            NAME      => 'Node 2 : Debian',
+            SUBSYSTEM => 'Oracle VM VirtualBox',
+            STATUS    => 'off',
+            MEMORY    => '256MB',
+            UUID      => '1922b52b-aa28-4d4a-b384-2d3429e3a6ad',
+            VCPU      => 1
+        },
+        {
+            VMTYPE    => 'VirtualBox',
+            NAME      => 'Node 3 : CentOS',
+            SUBSYSTEM => 'Oracle VM VirtualBox',
+            STATUS    => 'off',
+            MEMORY    => '256MB',
+            UUID      => 'a93b30fb-c0f8-4dbf-b439-f6e26d923cf7',
+            VCPU      => 1
+        },
+        {
+            VMTYPE    => 'VirtualBox',
+            NAME      => 'Node 4 : CentOS',
+            SUBSYSTEM => 'Oracle VM VirtualBox',
+            STATUS    => 'off',
+            MEMORY    => '256MB',
+            UUID      => '677daaa1-3e7a-441a-91be-449e02c82dd0',
+            VCPU      => 1
+        },
+        {
+            VMTYPE    => 'VirtualBox',
+            NAME      => 'FormationCFengine',
+            SUBSYSTEM => 'Oracle VM VirtualBox',
+            STATUS    => 'off',
+            MEMORY    => '384MB',
+            UUID      => 'b8b35683-eb17-4689-8213-6a46b28b139f',
+            VCPU      => 1
+        },
+        {
+            VMTYPE    => 'VirtualBox',
+            NAME      => 'Debian Maître - Squeeze',
+            SUBSYSTEM => 'Oracle VM VirtualBox',
+            STATUS    => 'off',
+            MEMORY    => '1024MB',
+            UUID      => 'ab6afdd6-aa78-4a22-8fc9-02b471c9084c',
+            VCPU      => 1
+        }
     ]
 );
 


================================================================
  Commit: dc1be653f4e501bf53a7a2cd14918abfe9497df9
      https://github.com/fusinv/fusioninventory-agent/commit/dc1be653f4e501bf53a7a2cd14918abfe9497df9
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-04-07 (Sat, 07 Apr 2012)

  Changed paths:
    M t/inventory/generic/lspci/controllers.t

  Log Message:
  -----------
  update the expected test result


diff --git a/t/inventory/generic/lspci/controllers.t b/t/inventory/generic/lspci/controllers.t
index 2550eb1..0faab3d 100755
--- a/t/inventory/generic/lspci/controllers.t
+++ b/t/inventory/generic/lspci/controllers.t
@@ -100,7 +100,7 @@ my %tests = (
             NAME         => '82801I (ICH9 Family) HD Audio Controller',
             TYPE         => 'Audio device',
             CAPTION      => '82801I (ICH9 Family) HD Audio Controller',
-            DRIVER       => 'HDA',
+            DRIVER       => 'snd_hda_intel',
             PCISLOT      => '00:1b.0',
             PCICLASS     => '0403',
             MANUFACTURER => 'Intel Corporation',
@@ -205,17 +205,6 @@ my %tests = (
             PCIID        => '8086:2917'
         },
         {
-            NAME         => 'Mobile 82801 SATA RAID Controller',
-            TYPE         => 'RAID bus controller',
-            CAPTION      => 'Mobile 82801 SATA RAID Controller',
-            DRIVER       => 'ahci',
-            PCISLOT      => '00:1f.2',
-            PCICLASS     => '0104',
-            MANUFACTURER => 'Intel Corporation',
-            REV          => '03',
-            PCIID        => '8086:282a'
-        },
-        {
             NAME         => '82801I (ICH9 Family) SMBus Controller',
             TYPE         => 'SMBus',
             CAPTION      => '82801I (ICH9 Family) SMBus Controller',
@@ -241,7 +230,7 @@ my %tests = (
             NAME         => 'PCIxx12 OHCI Compliant IEEE 1394 Host Controller',
             TYPE         => 'FireWire (IEEE 1394)',
             CAPTION      => 'PCIxx12 OHCI Compliant IEEE 1394 Host Controller',
-            DRIVER       => 'ohci1394',
+            DRIVER       => 'firewire_ohci',
             PCISLOT      => '02:01.1',
             PCICLASS     => '0c00',
             MANUFACTURER => 'Texas Instruments',
@@ -263,7 +252,7 @@ my %tests = (
             NAME         => 'WiFi Link 5100',
             TYPE         => 'Network controller',
             CAPTION      => 'WiFi Link 5100',
-            DRIVER       => 'iwlagn',
+            DRIVER       => 'iwlwifi',
             PCISLOT      => '0c:00.0',
             PCICLASS     => '0280',
             MANUFACTURER => 'Intel Corporation',


================================================================
  Commit: 5383d74f9718383d875dec0ff1aa4f86a4f3080c
      https://github.com/fusinv/fusioninventory-agent/commit/5383d74f9718383d875dec0ff1aa4f86a4f3080c
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-04-07 (Sat, 07 Apr 2012)

  Changed paths:
    M Changes

  Log Message:
  -----------
  update the Changes


diff --git a/Changes b/Changes
index 2d8ea9c..a464ea5 100644
--- a/Changes
+++ b/Changes
@@ -1,6 +1,6 @@
 Revision history for FusionInventory agent
 
-2.2.0  Tue, 03 Apr 2012 11:36:51 +0200
+2.2.0  Sat, 07 Apr 2012 18:57:49 +0200
 
 Major changes:
 * large speed improvement: up to 150% for a local inventory


================================================================
  Commit: 6a358dff36e2cabce7a33d25304d5f4bc73176bb
      https://github.com/fusinv/fusioninventory-agent/commit/6a358dff36e2cabce7a33d25304d5f4bc73176bb
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-04-09 (Mon, 09 Apr 2012)

  Changed paths:
    M Changes
    M t/inventory/generic/lspci/controllers.t

  Log Message:
  -----------
  Merge remote-tracking branch 'forge/2.2.x' into 2.2.x


diff --git a/Changes b/Changes
index 2d8ea9c..a464ea5 100644
--- a/Changes
+++ b/Changes
@@ -1,6 +1,6 @@
 Revision history for FusionInventory agent
 
-2.2.0  Tue, 03 Apr 2012 11:36:51 +0200
+2.2.0  Sat, 07 Apr 2012 18:57:49 +0200
 
 Major changes:
 * large speed improvement: up to 150% for a local inventory
diff --git a/t/inventory/generic/lspci/controllers.t b/t/inventory/generic/lspci/controllers.t
index 2550eb1..0faab3d 100755
--- a/t/inventory/generic/lspci/controllers.t
+++ b/t/inventory/generic/lspci/controllers.t
@@ -100,7 +100,7 @@ my %tests = (
             NAME         => '82801I (ICH9 Family) HD Audio Controller',
             TYPE         => 'Audio device',
             CAPTION      => '82801I (ICH9 Family) HD Audio Controller',
-            DRIVER       => 'HDA',
+            DRIVER       => 'snd_hda_intel',
             PCISLOT      => '00:1b.0',
             PCICLASS     => '0403',
             MANUFACTURER => 'Intel Corporation',
@@ -205,17 +205,6 @@ my %tests = (
             PCIID        => '8086:2917'
         },
         {
-            NAME         => 'Mobile 82801 SATA RAID Controller',
-            TYPE         => 'RAID bus controller',
-            CAPTION      => 'Mobile 82801 SATA RAID Controller',
-            DRIVER       => 'ahci',
-            PCISLOT      => '00:1f.2',
-            PCICLASS     => '0104',
-            MANUFACTURER => 'Intel Corporation',
-            REV          => '03',
-            PCIID        => '8086:282a'
-        },
-        {
             NAME         => '82801I (ICH9 Family) SMBus Controller',
             TYPE         => 'SMBus',
             CAPTION      => '82801I (ICH9 Family) SMBus Controller',
@@ -241,7 +230,7 @@ my %tests = (
             NAME         => 'PCIxx12 OHCI Compliant IEEE 1394 Host Controller',
             TYPE         => 'FireWire (IEEE 1394)',
             CAPTION      => 'PCIxx12 OHCI Compliant IEEE 1394 Host Controller',
-            DRIVER       => 'ohci1394',
+            DRIVER       => 'firewire_ohci',
             PCISLOT      => '02:01.1',
             PCICLASS     => '0c00',
             MANUFACTURER => 'Texas Instruments',
@@ -263,7 +252,7 @@ my %tests = (
             NAME         => 'WiFi Link 5100',
             TYPE         => 'Network controller',
             CAPTION      => 'WiFi Link 5100',
-            DRIVER       => 'iwlagn',
+            DRIVER       => 'iwlwifi',
             PCISLOT      => '0c:00.0',
             PCICLASS     => '0280',
             MANUFACTURER => 'Intel Corporation',


================================================================
  Commit: 00d4db565dd5212377dd2850f53715cbd53b203e
      https://github.com/fusinv/fusioninventory-agent/commit/00d4db565dd5212377dd2850f53715cbd53b203e
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-04-10 (Tue, 10 Apr 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm

  Log Message:
  -----------
  fix the network inventory on Windows

closes: #1549


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
index a7ae01c..e370379 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
@@ -20,11 +20,10 @@ sub doInventory {
     foreach my $interface (_getInterfaces()) {
         push @gateways, $interface->{IPGATEWAY}
             if $interface->{IPGATEWAY};
-
         push @dns, $interface->{dns}
             if $interface->{dns};
 
-        push @ips, @{$interface->{IPADDRESS}}
+        push @ips, $interface->{IPADDRESS}
             if $interface->{IPADDRESS};
 
         delete $interface->{dns};
@@ -32,6 +31,7 @@ sub doInventory {
         # flatten multivalued keys
         foreach my $key (qw/IPADDRESS IPMASK IPSUBNET IPADDRESS6/) {
             next unless $interface->{$key};
+            next unless ref($interface->{$key}) eq 'ARRAY';
             $interface->{$key} = join('/', @{$interface->{$key}});
         }
 


================================================================
  Commit: fe67d4e5ec396bae92870fc79ff5bbcfe81f7e3b
      https://github.com/fusinv/fusioninventory-agent/commit/fe67d4e5ec396bae92870fc79ff5bbcfe81f7e3b
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-04-10 (Tue, 10 Apr 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm

  Log Message:
  -----------
  Merge remote-tracking branch 'forge/2.2.x' into 2.2.x


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
index a7ae01c..e370379 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
@@ -20,11 +20,10 @@ sub doInventory {
     foreach my $interface (_getInterfaces()) {
         push @gateways, $interface->{IPGATEWAY}
             if $interface->{IPGATEWAY};
-
         push @dns, $interface->{dns}
             if $interface->{dns};
 
-        push @ips, @{$interface->{IPADDRESS}}
+        push @ips, $interface->{IPADDRESS}
             if $interface->{IPADDRESS};
 
         delete $interface->{dns};
@@ -32,6 +31,7 @@ sub doInventory {
         # flatten multivalued keys
         foreach my $key (qw/IPADDRESS IPMASK IPSUBNET IPADDRESS6/) {
             next unless $interface->{$key};
+            next unless ref($interface->{$key}) eq 'ARRAY';
             $interface->{$key} = join('/', @{$interface->{$key}});
         }
 


================================================================
  Commit: d796148d9fefd82dc65186f0013863c4a9e831b3
      https://github.com/fusinv/fusioninventory-agent/commit/d796148d9fefd82dc65186f0013863c4a9e831b3
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-04-10 (Tue, 10 Apr 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm

  Log Message:
  -----------
  no more multivalued properties


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
index e370379..f9ea784 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
@@ -28,13 +28,6 @@ sub doInventory {
 
         delete $interface->{dns};
 
-        # flatten multivalued keys
-        foreach my $key (qw/IPADDRESS IPMASK IPSUBNET IPADDRESS6/) {
-            next unless $interface->{$key};
-            next unless ref($interface->{$key}) eq 'ARRAY';
-            $interface->{$key} = join('/', @{$interface->{$key}});
-        }
-
         $inventory->addEntry(
             section => 'NETWORKS',
             entry   => $interface


================================================================
  Commit: 25b45f9371a82e51f6fde53fb0a2879ba5902742
      https://github.com/fusinv/fusioninventory-agent/commit/25b45f9371a82e51f6fde53fb0a2879ba5902742
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-04-10 (Tue, 10 Apr 2012)

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

  Log Message:
  -----------
  fix: force UTF-8 encoding on WMI output

After upgrading Fusioninventory Agent to 2.2.0 there's a problem
with encoding in several fields with Russian version of Windows.

So it looks like:
Microsoft Windows 7 Ïðîôåññèîíàëüíàÿ

Instead of:
Microsoft Windows 7 Профессиональная

Same problem happens with hardware names.

Reported-by: akrus akrus <akrus at flygroup.st>


diff --git a/lib/FusionInventory/Agent/Tools/Win32.pm b/lib/FusionInventory/Agent/Tools/Win32.pm
index 42c854a..920427b 100644
--- a/lib/FusionInventory/Agent/Tools/Win32.pm
+++ b/lib/FusionInventory/Agent/Tools/Win32.pm
@@ -10,7 +10,7 @@ use constant KEY_WOW64_32 => 0x200;
 use Encode;
 use English qw(-no_match_vars);
 
-use Win32::OLE qw(in CP_UTF8);
+use Win32::OLE qw(in);
 use Win32::OLE::Const;
 use Win32::TieRegistry (
     Delimiter   => '/',
@@ -18,7 +18,7 @@ use Win32::TieRegistry (
     qw/KEY_READ/
 );
 
-Win32::OLE->Option(CP => 'CP_UTF8');
+Win32::OLE->Option(CP => Win32::OLE::CP_UTF8);
 
 use FusionInventory::Agent::Tools;
 


================================================================
  Commit: 50657e2de7128a1a0ac15587cba89d44b87a549b
      https://github.com/fusinv/fusioninventory-agent/commit/50657e2de7128a1a0ac15587cba89d44b87a549b
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-04-10 (Tue, 10 Apr 2012)

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

  Log Message:
  -----------
  Merge remote-tracking branch 'forge/2.2.x' into 2.2.x


diff --git a/lib/FusionInventory/Agent/Tools/Win32.pm b/lib/FusionInventory/Agent/Tools/Win32.pm
index 42c854a..920427b 100644
--- a/lib/FusionInventory/Agent/Tools/Win32.pm
+++ b/lib/FusionInventory/Agent/Tools/Win32.pm
@@ -10,7 +10,7 @@ use constant KEY_WOW64_32 => 0x200;
 use Encode;
 use English qw(-no_match_vars);
 
-use Win32::OLE qw(in CP_UTF8);
+use Win32::OLE qw(in);
 use Win32::OLE::Const;
 use Win32::TieRegistry (
     Delimiter   => '/',
@@ -18,7 +18,7 @@ use Win32::TieRegistry (
     qw/KEY_READ/
 );
 
-Win32::OLE->Option(CP => 'CP_UTF8');
+Win32::OLE->Option(CP => Win32::OLE::CP_UTF8);
 
 use FusionInventory::Agent::Tools;
 


================================================================
  Commit: bf7de3a1473120fa8afaffe3887db2df894ff580
      https://github.com/fusinv/fusioninventory-agent/commit/bf7de3a1473120fa8afaffe3887db2df894ff580
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-04-10 (Tue, 10 Apr 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Sound.pm

  Log Message:
  -----------
  fix: addEntry() odd number of element

closes: #1559


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Sound.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Sound.pm
index dd9ae96..72166df 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Sound.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS/Sound.pm
@@ -22,14 +22,14 @@ sub doInventory {
 
     # add sound cards
     foreach my $x (keys %$info){
-        $inventory->addEntry({
+        $inventory->addEntry(
             section => 'SOUNDS',
             entry   => {
                 NAME         => $x,
                 MANUFACTURER => $x,
                 DESCRIPTION  => $x,
             }
-        });
+        );
     }
 }
 


================================================================
  Commit: c5ee51251cafa216285509854a56711ec1d16928
      https://github.com/fusinv/fusioninventory-agent/commit/c5ee51251cafa216285509854a56711ec1d16928
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-04-10 (Tue, 10 Apr 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
    A resources/virtualization/vboxmanage/sample3
    M t/inventory/virtualization/virtualbox.t

  Log Message:
  -----------
  Merge remote-tracking branch 'origin/2.2.x' into 2.2.x


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
index e370379..f9ea784 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Networks.pm
@@ -28,13 +28,6 @@ sub doInventory {
 
         delete $interface->{dns};
 
-        # flatten multivalued keys
-        foreach my $key (qw/IPADDRESS IPMASK IPSUBNET IPADDRESS6/) {
-            next unless $interface->{$key};
-            next unless ref($interface->{$key}) eq 'ARRAY';
-            $interface->{$key} = join('/', @{$interface->{$key}});
-        }
-
         $inventory->addEntry(
             section => 'NETWORKS',
             entry   => $interface
diff --git a/resources/virtualization/vboxmanage/sample3 b/resources/virtualization/vboxmanage/sample3
new file mode 100644
index 0000000..985648d
--- /dev/null
+++ b/resources/virtualization/vboxmanage/sample3
@@ -0,0 +1,507 @@
+Name:            Node 1 : Debian
+Guest OS:        Debian (64 bit)
+UUID:            e8e1f52d-700b-4fe8-b024-db04550eaddc
+Config file:     /home/normation/VirtualBox VMs/Node 1 : Debian/Node 1 : Debian.vbox
+Snapshot folder: /home/normation/VirtualBox VMs/Node 1 : Debian/Snapshots
+Log folder:      /home/normation/VirtualBox VMs/Node 1 : Debian/Logs
+Hardware UUID:   e8e1f52d-700b-4fe8-b024-db04550eaddc
+Memory size:     256MB
+Page Fusion:     off
+VRAM size:       12MB
+CPU exec cap:    100%
+HPET:            off
+Chipset:         piix3
+Firmware:        BIOS
+Number of CPUs:  1
+Synthetic Cpu:   off
+CPUID overrides: None
+Boot menu mode:  message and menu
+Boot Device (1): Floppy
+Boot Device (2): DVD
+Boot Device (3): HardDisk
+Boot Device (4): Not Assigned
+ACPI:            on
+IOAPIC:          on
+PAE:             off
+Time offset:     0 ms
+RTC:             UTC
+Hardw. virt.ext: on
+Hardw. virt.ext exclusive: on
+Nested Paging:   on
+Large Pages:     off
+VT-x VPID:       on
+State:           powered off (since 2012-04-04T17:47:16.000000000)
+Monitor count:   1
+3D Acceleration: off
+2D Video Acceleration: off
+Teleporter Enabled: off
+Teleporter Port: 0
+Teleporter Address: 
+Teleporter Password: 
+Storage Controller Name (0):            Contrôleur IDE
+Storage Controller Type (0):            PIIX4
+Storage Controller Instance Number (0): 0
+Storage Controller Max Port Count (0):  2
+Storage Controller Port Count (0):      2
+Storage Controller Bootable (0):        on
+Storage Controller Name (1):            Contrôleur SATA
+Storage Controller Type (1):            IntelAhci
+Storage Controller Instance Number (1): 0
+Storage Controller Max Port Count (1):  30
+Storage Controller Port Count (1):      1
+Storage Controller Bootable (1):        on
+Contrôleur IDE (1, 0): Empty
+Contrôleur SATA (0, 0): /home/normation/VirtualBox VMs/Node 1 : Debian/Node 1 : Debian.vdi (UUID: 741fe4ad-0581-45c8-94b5-0d4cd6b23e14)
+NIC 1:           MAC: 0800272C26F0, Attachment: NAT, Cable connected: on, Trace: off (file: none), Type: 82540EM, Reported speed: 0 Mbps, Boot priority: 0, Promisc Policy: deny
+NIC 1 Settings:  MTU: 0, Socket (send: 64, receive: 64), TCP Window (send:64, receive: 64)
+NIC 2:           MAC: 0800270C5FB5, Attachment: Host-only Interface 'vboxnet0', Cable connected: on, Trace: off (file: none), Type: 82540EM, Reported speed: 0 Mbps, Boot priority: 0, Promisc Policy: deny
+NIC 3:           disabled
+NIC 4:           disabled
+NIC 5:           disabled
+NIC 6:           disabled
+NIC 7:           disabled
+NIC 8:           disabled
+Pointing Device: USB Tablet
+Keyboard Device: PS/2 Keyboard
+UART 1:          disabled
+UART 2:          disabled
+Audio:           disabled
+Clipboard Mode:  Bidirectional
+VRDE:            disabled
+USB:             enabled
+
+USB Device Filters:
+
+<none>
+
+Shared folders:  <none>
+
+Guest:
+
+Configured memory balloon size:      0 MB
+
+
+Name:            Node 2 : Debian
+Guest OS:        Debian (64 bit)
+UUID:            1922b52b-aa28-4d4a-b384-2d3429e3a6ad
+Config file:     /home/normation/VirtualBox VMs/Node 2 : Debian/Node 2 : Debian.vbox
+Snapshot folder: /home/normation/VirtualBox VMs/Node 2 : Debian/Snapshots
+Log folder:      /home/normation/VirtualBox VMs/Node 2 : Debian/Logs
+Hardware UUID:   1922b52b-aa28-4d4a-b384-2d3429e3a6ad
+Memory size:     256MB
+Page Fusion:     off
+VRAM size:       12MB
+CPU exec cap:    100%
+HPET:            off
+Chipset:         piix3
+Firmware:        BIOS
+Number of CPUs:  1
+Synthetic Cpu:   off
+CPUID overrides: None
+Boot menu mode:  message and menu
+Boot Device (1): Floppy
+Boot Device (2): DVD
+Boot Device (3): HardDisk
+Boot Device (4): Not Assigned
+ACPI:            on
+IOAPIC:          on
+PAE:             off
+Time offset:     0 ms
+RTC:             UTC
+Hardw. virt.ext: on
+Hardw. virt.ext exclusive: on
+Nested Paging:   on
+Large Pages:     off
+VT-x VPID:       on
+State:           powered off (since 2012-04-01T15:33:33.000000000)
+Monitor count:   1
+3D Acceleration: off
+2D Video Acceleration: off
+Teleporter Enabled: off
+Teleporter Port: 0
+Teleporter Address: 
+Teleporter Password: 
+Storage Controller Name (0):            Contrôleur IDE
+Storage Controller Type (0):            PIIX4
+Storage Controller Instance Number (0): 0
+Storage Controller Max Port Count (0):  2
+Storage Controller Port Count (0):      2
+Storage Controller Bootable (0):        on
+Storage Controller Name (1):            Contrôleur SATA
+Storage Controller Type (1):            IntelAhci
+Storage Controller Instance Number (1): 0
+Storage Controller Max Port Count (1):  30
+Storage Controller Port Count (1):      1
+Storage Controller Bootable (1):        on
+Contrôleur IDE (1, 0): Empty
+Contrôleur SATA (0, 0): /home/normation/VirtualBox VMs/Node 2 : Debian/Node 2 : Debian.vdi (UUID: 2a667060-5634-44e2-8727-f9a9c44cdcc4)
+NIC 1:           MAC: 08002714E92D, Attachment: NAT, Cable connected: off, Trace: off (file: none), Type: 82540EM, Reported speed: 0 Mbps, Boot priority: 0, Promisc Policy: deny
+NIC 1 Settings:  MTU: 0, Socket (send: 64, receive: 64), TCP Window (send:64, receive: 64)
+NIC 2:           MAC: 0800271B1CE0, Attachment: Host-only Interface 'vboxnet0', Cable connected: on, Trace: off (file: none), Type: 82540EM, Reported speed: 0 Mbps, Boot priority: 0, Promisc Policy: deny
+NIC 3:           disabled
+NIC 4:           disabled
+NIC 5:           disabled
+NIC 6:           disabled
+NIC 7:           disabled
+NIC 8:           disabled
+Pointing Device: USB Tablet
+Keyboard Device: PS/2 Keyboard
+UART 1:          disabled
+UART 2:          disabled
+Audio:           disabled
+Clipboard Mode:  Bidirectional
+VRDE:            disabled
+USB:             enabled
+
+USB Device Filters:
+
+<none>
+
+Shared folders:  <none>
+
+Guest:
+
+Configured memory balloon size:      0 MB
+
+
+Name:            Node 3 : CentOS
+Guest OS:        Red Hat (64 bit)
+UUID:            a93b30fb-c0f8-4dbf-b439-f6e26d923cf7
+Config file:     /home/normation/VirtualBox VMs/Node 3 : CentOS/Node 3 : CentOS.vbox
+Snapshot folder: /home/normation/VirtualBox VMs/Node 3 : CentOS/Snapshots
+Log folder:      /home/normation/VirtualBox VMs/Node 3 : CentOS/Logs
+Hardware UUID:   a93b30fb-c0f8-4dbf-b439-f6e26d923cf7
+Memory size:     256MB
+Page Fusion:     off
+VRAM size:       12MB
+CPU exec cap:    100%
+HPET:            off
+Chipset:         piix3
+Firmware:        BIOS
+Number of CPUs:  1
+Synthetic Cpu:   off
+CPUID overrides: None
+Boot menu mode:  message and menu
+Boot Device (1): Floppy
+Boot Device (2): DVD
+Boot Device (3): HardDisk
+Boot Device (4): Not Assigned
+ACPI:            on
+IOAPIC:          on
+PAE:             on
+Time offset:     0 ms
+RTC:             UTC
+Hardw. virt.ext: on
+Hardw. virt.ext exclusive: on
+Nested Paging:   on
+Large Pages:     off
+VT-x VPID:       on
+State:           powered off (since 2012-04-04T15:38:21.000000000)
+Monitor count:   1
+3D Acceleration: off
+2D Video Acceleration: off
+Teleporter Enabled: off
+Teleporter Port: 0
+Teleporter Address: 
+Teleporter Password: 
+Storage Controller Name (0):            Contrôleur IDE
+Storage Controller Type (0):            PIIX4
+Storage Controller Instance Number (0): 0
+Storage Controller Max Port Count (0):  2
+Storage Controller Port Count (0):      2
+Storage Controller Bootable (0):        on
+Storage Controller Name (1):            Contrôleur SATA
+Storage Controller Type (1):            IntelAhci
+Storage Controller Instance Number (1): 0
+Storage Controller Max Port Count (1):  30
+Storage Controller Port Count (1):      1
+Storage Controller Bootable (1):        on
+Contrôleur IDE (1, 0): Empty
+Contrôleur SATA (0, 0): /home/normation/VirtualBox VMs/Node 3 : CentOS/Node 3 : CentOS.vdi (UUID: 7e1f77f5-a17a-4fdd-9e23-f3547f8db25b)
+NIC 1:           MAC: 080027B572C5, Attachment: NAT, Cable connected: off, Trace: off (file: none), Type: 82540EM, Reported speed: 0 Mbps, Boot priority: 0, Promisc Policy: deny
+NIC 1 Settings:  MTU: 0, Socket (send: 64, receive: 64), TCP Window (send:64, receive: 64)
+NIC 2:           MAC: 080027243CFA, Attachment: Host-only Interface 'vboxnet0', Cable connected: on, Trace: off (file: none), Type: 82540EM, Reported speed: 0 Mbps, Boot priority: 0, Promisc Policy: deny
+NIC 3:           disabled
+NIC 4:           disabled
+NIC 5:           disabled
+NIC 6:           disabled
+NIC 7:           disabled
+NIC 8:           disabled
+Pointing Device: PS/2 Mouse
+Keyboard Device: PS/2 Keyboard
+UART 1:          disabled
+UART 2:          disabled
+Audio:           disabled
+Clipboard Mode:  Bidirectional
+VRDE:            disabled
+USB:             enabled
+
+USB Device Filters:
+
+<none>
+
+Shared folders:  <none>
+
+Guest:
+
+Configured memory balloon size:      0 MB
+
+
+Name:            Node 4 : CentOS
+Guest OS:        Red Hat (64 bit)
+UUID:            677daaa1-3e7a-441a-91be-449e02c82dd0
+Config file:     /home/normation/VirtualBox VMs/Node 4 : CentOS/Node 4 : CentOS.vbox
+Snapshot folder: /home/normation/VirtualBox VMs/Node 4 : CentOS/Snapshots
+Log folder:      /home/normation/VirtualBox VMs/Node 4 : CentOS/Logs
+Hardware UUID:   677daaa1-3e7a-441a-91be-449e02c82dd0
+Memory size:     256MB
+Page Fusion:     off
+VRAM size:       12MB
+CPU exec cap:    100%
+HPET:            off
+Chipset:         piix3
+Firmware:        BIOS
+Number of CPUs:  1
+Synthetic Cpu:   off
+CPUID overrides: None
+Boot menu mode:  message and menu
+Boot Device (1): Floppy
+Boot Device (2): DVD
+Boot Device (3): HardDisk
+Boot Device (4): Not Assigned
+ACPI:            on
+IOAPIC:          on
+PAE:             on
+Time offset:     0 ms
+RTC:             UTC
+Hardw. virt.ext: on
+Hardw. virt.ext exclusive: on
+Nested Paging:   on
+Large Pages:     off
+VT-x VPID:       on
+State:           powered off (since 2012-04-01T15:33:47.000000000)
+Monitor count:   1
+3D Acceleration: off
+2D Video Acceleration: off
+Teleporter Enabled: off
+Teleporter Port: 0
+Teleporter Address: 
+Teleporter Password: 
+Storage Controller Name (0):            Contrôleur IDE
+Storage Controller Type (0):            PIIX4
+Storage Controller Instance Number (0): 0
+Storage Controller Max Port Count (0):  2
+Storage Controller Port Count (0):      2
+Storage Controller Bootable (0):        on
+Storage Controller Name (1):            Contrôleur SATA
+Storage Controller Type (1):            IntelAhci
+Storage Controller Instance Number (1): 0
+Storage Controller Max Port Count (1):  30
+Storage Controller Port Count (1):      1
+Storage Controller Bootable (1):        on
+Contrôleur IDE (1, 0): Empty
+Contrôleur SATA (0, 0): /home/normation/VirtualBox VMs/Node 4 : CentOS/Node 4 : CentOS.vdi (UUID: 771d6b7b-eb29-464b-b9eb-9e4d03e43ea9)
+NIC 1:           MAC: 080027C989C8, Attachment: NAT, Cable connected: off, Trace: off (file: none), Type: 82540EM, Reported speed: 0 Mbps, Boot priority: 0, Promisc Policy: deny
+NIC 1 Settings:  MTU: 0, Socket (send: 64, receive: 64), TCP Window (send:64, receive: 64)
+NIC 2:           MAC: 0800276684E9, Attachment: Host-only Interface 'vboxnet0', Cable connected: on, Trace: off (file: none), Type: 82540EM, Reported speed: 0 Mbps, Boot priority: 0, Promisc Policy: deny
+NIC 3:           disabled
+NIC 4:           disabled
+NIC 5:           disabled
+NIC 6:           disabled
+NIC 7:           disabled
+NIC 8:           disabled
+Pointing Device: PS/2 Mouse
+Keyboard Device: PS/2 Keyboard
+UART 1:          disabled
+UART 2:          disabled
+Audio:           disabled
+Clipboard Mode:  Bidirectional
+VRDE:            disabled
+USB:             enabled
+
+USB Device Filters:
+
+<none>
+
+Shared folders:  <none>
+
+Guest:
+
+Configured memory balloon size:      0 MB
+
+
+Name:            FormationCFengine
+Guest OS:        Debian (64 bit)
+UUID:            b8b35683-eb17-4689-8213-6a46b28b139f
+Config file:     /home/normation/VirtualBox VMs/FormationCFengine/FormationCFengine.vbox
+Snapshot folder: /home/normation/VirtualBox VMs/FormationCFengine/Snapshots
+Log folder:      /home/normation/VirtualBox VMs/FormationCFengine/Logs
+Hardware UUID:   b8b35683-eb17-4689-8213-6a46b28b139f
+Memory size:     384MB
+Page Fusion:     off
+VRAM size:       12MB
+CPU exec cap:    100%
+HPET:            off
+Chipset:         piix3
+Firmware:        BIOS
+Number of CPUs:  1
+Synthetic Cpu:   off
+CPUID overrides: None
+Boot menu mode:  message and menu
+Boot Device (1): HardDisk
+Boot Device (2): Not Assigned
+Boot Device (3): Not Assigned
+Boot Device (4): Not Assigned
+ACPI:            on
+IOAPIC:          on
+PAE:             off
+Time offset:     0 ms
+RTC:             UTC
+Hardw. virt.ext: on
+Hardw. virt.ext exclusive: on
+Nested Paging:   on
+Large Pages:     off
+VT-x VPID:       on
+State:           powered off (since 2011-06-17T14:51:25.000000000)
+Monitor count:   1
+3D Acceleration: off
+2D Video Acceleration: off
+Teleporter Enabled: off
+Teleporter Port: 0
+Teleporter Address: 
+Teleporter Password: 
+Storage Controller Name (0):            Contrôleur IDE
+Storage Controller Type (0):            PIIX4
+Storage Controller Instance Number (0): 0
+Storage Controller Max Port Count (0):  2
+Storage Controller Port Count (0):      2
+Storage Controller Bootable (0):        on
+Storage Controller Name (1):            Contrôleur SATA
+Storage Controller Type (1):            IntelAhci
+Storage Controller Instance Number (1): 0
+Storage Controller Max Port Count (1):  30
+Storage Controller Port Count (1):      1
+Storage Controller Bootable (1):        on
+Contrôleur IDE (1, 0): /dev/sr0 (UUID: 00445644-0000-0000-2f64-65762f737230)
+Contrôleur SATA (0, 0): /home/normation/VirtualBox VMs/FormationCFengine/FormationCFengine.vdi (UUID: c126e75e-b5d5-41e6-b148-541eed583c96)
+NIC 1:           MAC: 0800279BA8C4, Attachment: NAT, Cable connected: on, Trace: off (file: none), Type: 82540EM, Reported speed: 0 Mbps, Boot priority: 0, Promisc Policy: deny
+NIC 1 Settings:  MTU: 0, Socket (send: 64, receive: 64), TCP Window (send:64, receive: 64)
+NIC 2:           MAC: 080027F037C9, Attachment: Host-only Interface 'vboxnet0', Cable connected: on, Trace: off (file: none), Type: 82540EM, Reported speed: 0 Mbps, Boot priority: 0, Promisc Policy: deny
+NIC 3:           disabled
+NIC 4:           disabled
+NIC 5:           disabled
+NIC 6:           disabled
+NIC 7:           disabled
+NIC 8:           disabled
+Pointing Device: USB Tablet
+Keyboard Device: PS/2 Keyboard
+UART 1:          disabled
+UART 2:          disabled
+Audio:           enabled (Driver: PulseAudio, Controller: AC97)
+Clipboard Mode:  Bidirectional
+VRDE:            disabled
+USB:             enabled
+
+USB Device Filters:
+
+Index:            0
+Active:           yes
+Name:             USB DISK 2.0 [0100]
+VendorId:         13fe
+ProductId:        1a00
+Revision:         0100
+Manufacturer:             
+Product:          USB DISK 2.0    
+Remote:           0
+Serial Number:    07731D3906F9
+
+Shared folders:  <none>
+
+Guest:
+
+Configured memory balloon size:      0 MB
+
+
+Name:            Debian Maître - Squeeze
+Guest OS:        Debian (64 bit)
+UUID:            ab6afdd6-aa78-4a22-8fc9-02b471c9084c
+Config file:     /home/normation/VirtualBox VMs/Debian Maître - Squeeze/Debian Maître - Squeeze.vbox
+Snapshot folder: /home/normation/VirtualBox VMs/Debian Maître - Squeeze/Snapshots
+Log folder:      /home/normation/VirtualBox VMs/Debian Maître - Squeeze/Logs
+Hardware UUID:   ab6afdd6-aa78-4a22-8fc9-02b471c9084c
+Memory size:     1024MB
+Page Fusion:     off
+VRAM size:       12MB
+CPU exec cap:    100%
+HPET:            off
+Chipset:         piix3
+Firmware:        BIOS
+Number of CPUs:  1
+Synthetic Cpu:   off
+CPUID overrides: None
+Boot menu mode:  message and menu
+Boot Device (1): Floppy
+Boot Device (2): DVD
+Boot Device (3): HardDisk
+Boot Device (4): Not Assigned
+ACPI:            on
+IOAPIC:          on
+PAE:             off
+Time offset:     0 ms
+RTC:             UTC
+Hardw. virt.ext: on
+Hardw. virt.ext exclusive: on
+Nested Paging:   on
+Large Pages:     off
+VT-x VPID:       on
+State:           powered off (since 2012-04-04T17:47:33.000000000)
+Monitor count:   1
+3D Acceleration: off
+2D Video Acceleration: off
+Teleporter Enabled: off
+Teleporter Port: 0
+Teleporter Address: 
+Teleporter Password: 
+Storage Controller Name (0):            Contrôleur IDE
+Storage Controller Type (0):            PIIX4
+Storage Controller Instance Number (0): 0
+Storage Controller Max Port Count (0):  2
+Storage Controller Port Count (0):      2
+Storage Controller Bootable (0):        on
+Storage Controller Name (1):            Contrôleur SATA
+Storage Controller Type (1):            IntelAhci
+Storage Controller Instance Number (1): 0
+Storage Controller Max Port Count (1):  30
+Storage Controller Port Count (1):      1
+Storage Controller Bootable (1):        on
+Contrôleur IDE (1, 0): Empty
+Contrôleur SATA (0, 0): /home/normation/VirtualBox VMs/Debian Maître - Squeeze/Debian Maître - Squeeze.vdi (UUID: 19db8e90-4fd6-4294-81da-0a5d0d6cf94e)
+NIC 1:           MAC: 0800279FE582, Attachment: NAT, Cable connected: on, Trace: off (file: none), Type: 82540EM, Reported speed: 0 Mbps, Boot priority: 0, Promisc Policy: deny
+NIC 1 Settings:  MTU: 0, Socket (send: 64, receive: 64), TCP Window (send:64, receive: 64)
+NIC 2:           MAC: 080027DC79DF, Attachment: Host-only Interface 'vboxnet0', Cable connected: on, Trace: off (file: none), Type: 82540EM, Reported speed: 0 Mbps, Boot priority: 0, Promisc Policy: deny
+NIC 3:           disabled
+NIC 4:           disabled
+NIC 5:           disabled
+NIC 6:           disabled
+NIC 7:           disabled
+NIC 8:           disabled
+Pointing Device: USB Tablet
+Keyboard Device: PS/2 Keyboard
+UART 1:          disabled
+UART 2:          disabled
+Audio:           disabled
+Clipboard Mode:  Bidirectional
+VRDE:            disabled
+USB:             enabled
+
+USB Device Filters:
+
+<none>
+
+Shared folders:  <none>
+
+Guest:
+
+Configured memory balloon size:      0 MB
+
+
diff --git a/t/inventory/virtualization/virtualbox.t b/t/inventory/virtualization/virtualbox.t
index 8a77466..51b4a9e 100755
--- a/t/inventory/virtualization/virtualbox.t
+++ b/t/inventory/virtualization/virtualbox.t
@@ -209,6 +209,62 @@ my %tests = (
             UUID      => 'd1fe6cfa-80c6-41ae-9f4b-2a15dbafcf2c',
             VCPU      => 1
         }
+    ],
+    sample3 => [
+        {
+            VMTYPE    => 'VirtualBox',
+            NAME      => 'Node 1 : Debian',
+            SUBSYSTEM => 'Oracle VM VirtualBox',
+            STATUS    => 'off',
+            MEMORY    => '256MB',
+            UUID      => 'e8e1f52d-700b-4fe8-b024-db04550eaddc',
+            VCPU      => 1
+        },
+        {
+            VMTYPE    => 'VirtualBox',
+            NAME      => 'Node 2 : Debian',
+            SUBSYSTEM => 'Oracle VM VirtualBox',
+            STATUS    => 'off',
+            MEMORY    => '256MB',
+            UUID      => '1922b52b-aa28-4d4a-b384-2d3429e3a6ad',
+            VCPU      => 1
+        },
+        {
+            VMTYPE    => 'VirtualBox',
+            NAME      => 'Node 3 : CentOS',
+            SUBSYSTEM => 'Oracle VM VirtualBox',
+            STATUS    => 'off',
+            MEMORY    => '256MB',
+            UUID      => 'a93b30fb-c0f8-4dbf-b439-f6e26d923cf7',
+            VCPU      => 1
+        },
+        {
+            VMTYPE    => 'VirtualBox',
+            NAME      => 'Node 4 : CentOS',
+            SUBSYSTEM => 'Oracle VM VirtualBox',
+            STATUS    => 'off',
+            MEMORY    => '256MB',
+            UUID      => '677daaa1-3e7a-441a-91be-449e02c82dd0',
+            VCPU      => 1
+        },
+        {
+            VMTYPE    => 'VirtualBox',
+            NAME      => 'FormationCFengine',
+            SUBSYSTEM => 'Oracle VM VirtualBox',
+            STATUS    => 'off',
+            MEMORY    => '384MB',
+            UUID      => 'b8b35683-eb17-4689-8213-6a46b28b139f',
+            VCPU      => 1
+        },
+        {
+            VMTYPE    => 'VirtualBox',
+            NAME      => 'Debian Maître - Squeeze',
+            SUBSYSTEM => 'Oracle VM VirtualBox',
+            STATUS    => 'off',
+            MEMORY    => '1024MB',
+            UUID      => 'ab6afdd6-aa78-4a22-8fc9-02b471c9084c',
+            VCPU      => 1
+        }
     ]
 );
 


================================================================
  Commit: 0de099950db488ebe78263fafad0bb760c94b254
      https://github.com/fusinv/fusioninventory-agent/commit/0de099950db488ebe78263fafad0bb760c94b254
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-04-11 (Wed, 11 Apr 2012)

  Changed paths:
    M lib/FusionInventory/Agent.pm

  Log Message:
  -----------
  don't hide useful debug message

If a package fails to build, we show the error message on debug2


diff --git a/lib/FusionInventory/Agent.pm b/lib/FusionInventory/Agent.pm
index ce06f78..f9f4e14 100644
--- a/lib/FusionInventory/Agent.pm
+++ b/lib/FusionInventory/Agent.pm
@@ -385,7 +385,7 @@ sub _getTaskVersion {
     my $logger = $self->{logger};
 
     if (!$module->require()) {
-        $logger->debug2("module $module does not compile") if $logger;
+        $logger->debug2("module $module does not compile: $@") if $logger;
         return;
     }
 


================================================================
  Commit: e40321b1ac7e4946ece59af068e4bc9394c28554
      https://github.com/fusinv/fusioninventory-agent/commit/e40321b1ac7e4946ece59af068e4bc9394c28554
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-04-11 (Wed, 11 Apr 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/Xen.pm
    R resources/virtualization/xm/sample1
    A resources/virtualization/xm/xm_list
    A resources/virtualization/xm/xm_list_-l_vmname
    M t/inventory/virtualization/xen.t

  Log Message:
  -----------
  fix: UUID in Xen have ")"

Without this patch, the Xen VM UUID includes a trailing ')' caracter.

closes: #1562

Reported-by: DuyLong LE <dle at unistra.fr>


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/Xen.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/Xen.pm
index 60c5ba1..b1efe5f 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/Xen.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/Xen.pm
@@ -19,9 +19,8 @@ sub doInventory {
 
     my $command = 'xm list';
     foreach my $machine (_getVirtualMachines(command => $command, logger => $logger)) {
-        my $uuid = getFirstMatch(
+        my $uuid = _getUUID(
             command => "xm list -l $machine->{NAME}",
-            pattern => qr/\s+.*uuid\s+(.*)/,
             logger  => $logger
         );
         $machine->{UUID} = $uuid;
@@ -31,6 +30,17 @@ sub doInventory {
     }
 }
 
+sub _getUUID {
+    my (%params) = @_;
+
+        my $uuid = getFirstMatch(
+            pattern => qr/\s+.*uuid\s+([^\)]*)/,
+            %params
+        );
+
+    return $uuid;
+}
+
 sub  _getVirtualMachines {
 
     my $handle = getFileHandle(@_);
diff --git a/resources/virtualization/xm/sample1 b/resources/virtualization/xm/sample1
deleted file mode 100644
index 850746a..0000000
--- a/resources/virtualization/xm/sample1
+++ /dev/null
@@ -1,7 +0,0 @@
-Name                         ID Mem(MiB) VCPUs State  Time(s)
-Domain-0                      0       98     1 r-----  5068.6
-Fedora3                     164      128     1 r-----     7.6
-Fedora4                     165      128     1 ------     0.6
-Mandrake2006                166      128     1 -b----     3.6
-Mandrake10.2                167      128     1 ------     2.5
-Suse9.2                     168      100     1 ------     1.8
diff --git a/resources/virtualization/xm/xm_list b/resources/virtualization/xm/xm_list
new file mode 100644
index 0000000..850746a
--- /dev/null
+++ b/resources/virtualization/xm/xm_list
@@ -0,0 +1,7 @@
+Name                         ID Mem(MiB) VCPUs State  Time(s)
+Domain-0                      0       98     1 r-----  5068.6
+Fedora3                     164      128     1 r-----     7.6
+Fedora4                     165      128     1 ------     0.6
+Mandrake2006                166      128     1 -b----     3.6
+Mandrake10.2                167      128     1 ------     2.5
+Suse9.2                     168      100     1 ------     1.8
diff --git a/resources/virtualization/xm/xm_list_-l_vmname b/resources/virtualization/xm/xm_list_-l_vmname
new file mode 100644
index 0000000..17ef4a8
--- /dev/null
+++ b/resources/virtualization/xm/xm_list_-l_vmname
@@ -0,0 +1,95 @@
+(domain
+    (domid 34)
+    (cpu_weight 27500)
+    (cpu_cap 0)
+    (on_crash restart)
+    (uuid 0004fb00-0006-0000-4acc-3678187fb85c)
+    (bootloader_args -q)
+    (vcpus 2)
+    (name 0004fb00000600004acc3678187fb85c)
+    (on_poweroff destroy)
+    (on_reboot restart)
+    (cpus (() ()))
+    (description '')
+    (bootloader /usr/bin/pygrub)
+    (maxmem 2048)
+    (memory 2048)
+    (shadow_memory 0)
+    (features '')
+    (on_xend_start ignore)
+    (on_xend_stop ignore)
+    (start_time 1332281343.74)
+    (cpu_time 4822.14137234)
+    (online_vcpus 2)
+    (image
+        (linux
+            (kernel '')
+            (expose_host_uuid 0)
+            (superpages 0)
+            (tsc_mode 0)
+            (videoram 4)
+            (pci ())
+            (nomigrate 0)
+            (device_model /usr/lib/xen/bin/qemu-dm)
+            (notes
+                (HV_START_LOW 18446603336221196288)
+                (FEATURES '!writable_page_tables|pae_pgdir_above_4gb')
+                (VIRT_BASE 18446744071562067968)
+                (GUEST_VERSION 2.6)
+                (PADDR_OFFSET 0)
+                (GUEST_OS linux)
+                (HYPERCALL_PAGE 18446744071578882048)
+                (LOADER generic)
+                (SUSPEND_CANCEL 1)
+                (PAE_MODE yes)
+                (ENTRY 18446744071590609408)
+                (XEN_VERSION xen-3.0)
+            )
+        )
+    )
+    (status 2)
+    (state -b----)
+    (store_mfn 36383344)
+    (console_mfn 36383343)
+    (device
+        (vif
+            (bridge 0004fb0010baa08)
+            (mac 00:21:f6:01:02:03)
+            (script /etc/xen/scripts/vif-bridge)
+            (uuid 866122fd-86e0-51f5-a1a8-a0d3345390d2)
+            (backend 0)
+        )
+    )
+    (device
+        (vbd
+            (protocol x86_64-abi)
+            (uuid 696f80bd-204d-8e8d-c446-fdeb33587b41)
+            (bootable 1)
+            (dev xvda:disk)
+            (uname
+                file:/Repositories/0004fb00000300006629b4e4211cf999/VirtualDisks/0004fb0000120000fd104eecf5e5926b.img
+            )
+            (mode w)
+            (backend 0)
+            (VDI '')
+        )
+    )
+    (device (vkbd (backend 0)))
+    (device
+        (vfb
+            (vncunused 1)
+            (vnc 1)
+            (xauthority //.Xauthority)
+            (vnclisten 127.0.0.1)
+            (location 127.0.0.1:5905)
+            (uuid bf589d9a-57e2-aaa2-add7-db481bf3af69)
+        )
+    )
+    (device
+        (console
+            (protocol vt100)
+            (location 2)
+            (uuid ab6c0df7-966a-5a56-5e19-514d473d9a3f)
+        )
+    )
+)
diff --git a/t/inventory/virtualization/xen.t b/t/inventory/virtualization/xen.t
index 2786ac2..f68ceba 100755
--- a/t/inventory/virtualization/xen.t
+++ b/t/inventory/virtualization/xen.t
@@ -7,8 +7,8 @@ use Test::More;
 
 use FusionInventory::Agent::Task::Inventory::Input::Virtualization::Xen;
 
-my %tests = (
-    sample1 => [
+my %tests_xm_list = (
+    xm_list => [
         {
             NAME      => 'Fedora3',
             SUBSYSTEM => 'xm',
@@ -57,11 +57,22 @@ my %tests = (
     ]
 );
 
-plan tests => scalar keys %tests;
 
-foreach my $test (keys %tests) {
+my %tests_getUUID = (
+    'xm_list_-l_vmname' => '0004fb00-0006-0000-4acc-3678187fb85c'
+);
+
+plan tests => scalar keys (%tests_xm_list) + scalar keys (%tests_getUUID);
+
+foreach my $test (keys %tests_xm_list) {
     my $file = "resources/virtualization/xm/$test";
     my @machines = FusionInventory::Agent::Task::Inventory::Input::Virtualization::Xen::_getVirtualMachines(file => $file);
-    is_deeply(\@machines, $tests{$test}, $test);
+    is_deeply(\@machines, $tests_xm_list{$test}, $test);
+}
+
+foreach my $test (keys %tests_getUUID) {
+    my $file = "resources/virtualization/xm/$test";
+    my $uuid = FusionInventory::Agent::Task::Inventory::Input::Virtualization::Xen::_getUUID(file => $file);
+    is_deeply($uuid, $tests_getUUID{$test}, $test);
 }
 


================================================================
  Commit: 459b43bb954275b76a7f25ef92c5789f06c989b2
      https://github.com/fusinv/fusioninventory-agent/commit/459b43bb954275b76a7f25ef92c5789f06c989b2
  Author: Vincent Membré <vincent.membre at normation.com>
  Date:   2012-04-12 (Thu, 12 Apr 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Archs/SPARC.pm

  Log Message:
  -----------
  SPARC arch type mismatch

for SPARC Architecture, ARCH is set to ARM (line 42)

closes: #1573


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Archs/SPARC.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Archs/SPARC.pm
index e0eef88..60e9bfa 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Archs/SPARC.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Archs/SPARC.pm
@@ -39,7 +39,7 @@ sub _getCPUsFromProc {
     my @cpus;
     foreach (1 .. $cpu->{'ncpus probed'}) {
         push @cpus, {
-            ARCH => 'ARM',
+            ARCH => 'SPARC',
             TYPE => $cpu->{cpu},
         };
     }


================================================================
  Commit: d9adcc658d7726f4c1a5e2410f4f5058e3c4be38
      https://github.com/fusinv/fusioninventory-agent/commit/d9adcc658d7726f4c1a5e2410f4f5058e3c4be38
  Author: Vincent Membré <vincent.membre at normation.com>
  Date:   2012-04-12 (Thu, 12 Apr 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/VirtualBox.pm

  Log Message:
  -----------
  VM : Invalid status with VirtualBox

This changes add support most (all?) of VirtalBox support status.

closes: #1547


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/VirtualBox.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/VirtualBox.pm
index ccbbccf..c9c08e5 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/VirtualBox.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/VirtualBox.pm
@@ -71,6 +71,21 @@ sub _parseVBoxManage {
 
     my (@machines, $machine, $index);
 
+    my %status_list = (
+        'powered off' => 'off',
+        'saved'   => 'off',
+        'teleported'   => 'off',
+        'aborted'    => 'crashed',
+        'stuck' => 'blocked',
+        'teleporting'   => 'paused',
+        'live snapshotting'     => 'running',
+        'starting'   => 'running',
+        'stopping' => 'dying',
+        'saving' => 'dying',
+        'restoring' => 'running',
+        'running' => 'running',
+        'paused' => 'paused'
+    );
     while (my $line = <$handle>) {
         chomp $line;
 
@@ -93,7 +108,7 @@ sub _parseVBoxManage {
         } elsif ($line =~ m/^Memory size:\s+(.+)/ ) {
             $machine->{MEMORY} = $1;
         } elsif ($line =~ m/^State:\s+(.+) \(/) {
-            $machine->{STATUS} = $1 eq 'powered off' ? 'off' : $1;
+            $machine->{STATUS} = $status_list{$1};
         } elsif ($line =~ m/^Index:\s+(\d+)$/) {
             $index = $1;
         }


================================================================
  Commit: 0d6b7787938d51a0d18a0cc3674e43e4f7df2812
      https://github.com/fusinv/fusioninventory-agent/commit/0d6b7787938d51a0d18a0cc3674e43e4f7df2812
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-04-12 (Thu, 12 Apr 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/Xen.pm

  Log Message:
  -----------
  drop useless intermediate variable


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/Xen.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/Xen.pm
index b1efe5f..b1cd9bb 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/Xen.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/Xen.pm
@@ -33,12 +33,10 @@ sub doInventory {
 sub _getUUID {
     my (%params) = @_;
 
-        my $uuid = getFirstMatch(
-            pattern => qr/\s+.*uuid\s+([^\)]*)/,
-            %params
-        );
-
-    return $uuid;
+    return getFirstMatch(
+        pattern => qr/\s+.*uuid\s+([^\)]*)/,
+        %params
+    );
 }
 
 sub  _getVirtualMachines {


================================================================
  Commit: 9c47555de9dcf78ed79127507ddba4c2abed831a
      https://github.com/fusinv/fusioninventory-agent/commit/9c47555de9dcf78ed79127507ddba4c2abed831a
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-04-12 (Thu, 12 Apr 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/Xen.pm

  Log Message:
  -----------
  more readable regexp


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/Xen.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/Xen.pm
index b1cd9bb..91437fc 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/Xen.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/Xen.pm
@@ -34,7 +34,7 @@ sub _getUUID {
     my (%params) = @_;
 
     return getFirstMatch(
-        pattern => qr/\s+.*uuid\s+([^\)]*)/,
+        pattern => qr/\( uuid \s ([^)]+) \)/x,
         %params
     );
 }


================================================================
  Commit: 3735ae16c336980facd89b1216d1651946df3db2
      https://github.com/fusinv/fusioninventory-agent/commit/3735ae16c336980facd89b1216d1651946df3db2
  Author: Marcel Werner <marcel.werner at bt.com>
  Date:   2012-04-13 (Fri, 13 Apr 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Memory.pm

  Log Message:
  -----------
  fix: Solaris 8 / 9 / 10   SWAP Bug

With the version fusion-inventory-agent 2.2.0-2/3
we have problems with the <SWAP> entry.

The SWAP - Entry in the ocs file is filled with :
<SWAP>free</SWAP>

but should be a number.

like <SWAP>203720256</SWAP>

the problem is located in :

perl/agent/FusionInventory/Agent/Task/Inventory/Input/Solaris/Memory.pm

my $swapSize = getFirstMatch(
  command => 'swap -l',
  logger  => $logger,
  pattern => qr/\s+(\S+)$/
    );

It should be look like :

my $swapSize = getFirstMatch(
  command => 'swap -l',
  logger  => $logger,
  pattern => qr/\s+(\d+)$/
    );

A other problem "free" is not the complete swap space on Solaris.
swap -l
swapfile             dev  swaplo blocks   free
/dev/md/dsk/d1      85,1      16 8568176 8568176

better way you do it with:

swap -s
total: 365600k bytes allocated + 14992k reserved = 380592k used, 4472248k available

rg
marcel

closes: #1577


There was an error trying to read the diff from github.com (execution expired)

================================================================
  Commit: 33effcd4426f6301bd672bf266c981dd93b99efc
      https://github.com/fusinv/fusioninventory-agent/commit/33effcd4426f6301bd672bf266c981dd93b99efc
  Author: Gonéri Le Bouder <goneri at rulezlan.org>
  Date:   2012-04-13 (Fri, 13 Apr 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/Xen.pm

  Log Message:
  -----------
  Merge remote-tracking branch 'origin/2.2.x' into 2.2.x


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/Xen.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/Xen.pm
index b1efe5f..91437fc 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/Xen.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/Xen.pm
@@ -33,12 +33,10 @@ sub doInventory {
 sub _getUUID {
     my (%params) = @_;
 
-        my $uuid = getFirstMatch(
-            pattern => qr/\s+.*uuid\s+([^\)]*)/,
-            %params
-        );
-
-    return $uuid;
+    return getFirstMatch(
+        pattern => qr/\( uuid \s ([^)]+) \)/x,
+        %params
+    );
 }
 
 sub  _getVirtualMachines {


================================================================
  Commit: d9c31d1e85217fd11be28f1f0df699a855ae3df1
      https://github.com/fusinv/fusioninventory-agent/commit/d9c31d1e85217fd11be28f1f0df699a855ae3df1
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-04-16 (Mon, 16 Apr 2012)

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

  Log Message:
  -----------
  more explicit implementation and documentation


diff --git a/lib/FusionInventory/Agent/Tools/Solaris.pm b/lib/FusionInventory/Agent/Tools/Solaris.pm
index c249d71..3e6588e 100644
--- a/lib/FusionInventory/Agent/Tools/Solaris.pm
+++ b/lib/FusionInventory/Agent/Tools/Solaris.pm
@@ -37,12 +37,9 @@ memoize('getModel');
 memoize('getClass');
 
 sub getZone {
-
-    return 'global' unless canRun('zonename');
-
-    my $zone = getFirstLine(command => 'zonename');
-
-    return $zone;
+    return canRun('zonename') ?
+        getFirstLine(command => 'zonename') : # actual zone name
+        'global';                             # outside zone name
 }
 
 sub getModel {
@@ -118,7 +115,7 @@ This module provides some generic functions for Solaris.
 
 =head2 getZone()
 
-Returns system zone.
+Returns current zone name, or 'global' if there is no defined zone.
 
 =head2 getModel()
 


================================================================
  Commit: 160683a2f49a35abc7f7e8df2e6c67226a0dc225
      https://github.com/fusinv/fusioninventory-agent/commit/160683a2f49a35abc7f7e8df2e6c67226a0dc225
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-04-16 (Mon, 16 Apr 2012)

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

  Log Message:
  -----------
  more explicit implementation and documentation


diff --git a/lib/FusionInventory/Agent/Tools/Solaris.pm b/lib/FusionInventory/Agent/Tools/Solaris.pm
index 3e6588e..bc7778b 100644
--- a/lib/FusionInventory/Agent/Tools/Solaris.pm
+++ b/lib/FusionInventory/Agent/Tools/Solaris.pm
@@ -43,21 +43,9 @@ sub getZone {
 }
 
 sub getModel {
-
-    my $zone = getZone();
-
-    my $model;
-    if ($zone) {
-        # first, we need determinate on which model of Sun Server we run,
-        # because prtdiags output (and with that memconfs output) is differend
-        # from server model to server model
-        # we try to classified our box in one of the known classes
-        $model = getFirstLine(command => 'uname -i');
-    } else {
-        $model = "Solaris Containers";
-    }
-
-    return $model;
+    return getZone() eq 'global' ?
+        getFirstLine(command => 'uname -i') :
+        'Solaris Containers';
 }
 
 sub getClass {
@@ -119,8 +107,8 @@ Returns current zone name, or 'global' if there is no defined zone.
 
 =head2 getModel()
 
-Returns system model.
+Returns system model, as a string.
 
 =head2 getclass()
 
-Returns system class.
+Returns system class, as a symbolic constant.


================================================================
  Commit: 2390678af5a2bbf0af58c627796cf2cdb7606fa6
      https://github.com/fusinv/fusioninventory-agent/commit/2390678af5a2bbf0af58c627796cf2cdb7606fa6
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-04-16 (Mon, 16 Apr 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/SolarisZones.pm

  Log Message:
  -----------
  disable inside containers (close #1586)


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/SolarisZones.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/SolarisZones.pm
index 2909a3e..8f913f0 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/SolarisZones.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Virtualization/SolarisZones.pm
@@ -4,10 +4,12 @@ use strict;
 use warnings;
 
 use FusionInventory::Agent::Tools;
+use FusionInventory::Agent::Tools::Solaris;
 
 sub isEnabled { 
     return 
         canRun('zoneadm') &&
+        getZone() eq 'global' &&
         _check_solaris_valid_release('/etc/release');
 }
 


================================================================
  Commit: 7a77851dfb9834e51a51ab5a320fbebc0b5dd81c
      https://github.com/fusinv/fusioninventory-agent/commit/7a77851dfb9834e51a51ab5a320fbebc0b5dd81c
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-04-16 (Mon, 16 Apr 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Bios.pm

  Log Message:
  -----------
  fix container detection (close #1586)


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Bios.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Bios.pm
index 65c1546..975b91a 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Bios.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Bios.pm
@@ -20,9 +20,7 @@ sub doInventory {
 
     my ($bios, $hardware);
 
-    my $zone = getZone();
-    if ($zone) {
-
+    if (getZone() eq 'global') {
         my $arch;
         if (canRun('showrev')) {
             my $infos = _parseShowRev(logger => $logger);


================================================================
  Commit: 44748cb376111c18b59c3b4dbe438cc65029103c
      https://github.com/fusinv/fusioninventory-agent/commit/44748cb376111c18b59c3b4dbe438cc65029103c
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-04-16 (Mon, 16 Apr 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Memory.pm

  Log Message:
  -----------
  no need to identify model for generic informations

Close: #1594
Reported-by: Marcel Werner <marcel.werner at bt.com>


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Memory.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Memory.pm
index 75345ea..4c7bef8 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Memory.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/Memory.pm
@@ -16,10 +16,29 @@ sub doInventory {
     my $inventory = $params{inventory};
     my $logger    = $params{logger};
 
+    my $memorySize = getFirstMatch(
+        command => 'prtconf',
+        logger  => $logger,
+        pattern => qr/^Memory\ssize:\s+(\S+)/
+    );
+
+    my $swapSize = getFirstMatch(
+        command => 'swap -l',
+        logger  => $logger,
+        pattern => qr/\s+(\d+)$/
+    );
+
+    $inventory->setHardware({
+        MEMORY => $memorySize,
+        SWAP =>   $swapSize
+    });
+
     my $class = getClass();
 
     if (!$class) {
-        $logger->debug("sorry, unknown model, could not detect memory configuration");
+        $logger->debug(
+            "Unknown model, impossible to detect memory configuration"
+        );
         return;
     }
 
@@ -39,24 +58,6 @@ sub doInventory {
             entry   => $memory
         );
     }
-
-    my $memorySize = getFirstMatch(
-        command => 'prtconf',
-        logger  => $logger,
-        pattern => qr/^Memory\ssize:\s+(\S+)/
-    );
-
-    my $swapSize = getFirstMatch(
-        command => 'swap -l',
-        logger  => $logger,
-        pattern => qr/\s+(\d+)$/
-    );
-
-    $inventory->setHardware({
-        MEMORY => $memorySize,
-        SWAP =>   $swapSize
-    });
-
 }
 
 sub _getMemories1 {


================================================================
  Commit: 6984f218ead6e378e77158d1fb735ed5967c7b6e
      https://github.com/fusinv/fusioninventory-agent/commit/6984f218ead6e378e77158d1fb735ed5967c7b6e
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-04-16 (Mon, 16 Apr 2012)

  Changed paths:
    A resources/solaris/memconf/sample3

  Log Message:
  -----------
  initial import


diff --git a/resources/solaris/memconf/sample3 b/resources/solaris/memconf/sample3
new file mode 100644
index 0000000..5fa3f0d
--- /dev/null
+++ b/resources/solaris/memconf/sample3
@@ -0,0 +1,13 @@
+hostname: xxxxxxxxxxxx
+Sun/Oracle America, Inc. SPARC T3-1 (16-Core 8-Thread SPARC-T3 1649MHz)
+Memory Interleave Factor: 2-way
+socket MB/CMP0/BOB0/CH0/D0 has a Samsung 511-1616 2GB DDR3 DIMM
+socket MB/CMP0/BOB0/CH1/D0 has a Samsung 511-1616 2GB DDR3 DIMM
+socket MB/CMP0/BOB1/CH0/D0 has a Samsung 511-1616 2GB DDR3 DIMM
+socket MB/CMP0/BOB1/CH1/D0 has a Samsung 511-1616 2GB DDR3 DIMM
+socket MB/CMP0/BOB2/CH0/D0 has a Samsung 511-1616 2GB DDR3 DIMM
+socket MB/CMP0/BOB2/CH1/D0 has a Samsung 511-1616 2GB DDR3 DIMM
+socket MB/CMP0/BOB3/CH0/D0 has a Samsung 511-1616 2GB DDR3 DIMM
+socket MB/CMP0/BOB3/CH1/D0 has a Samsung 511-1616 2GB DDR3 DIMM
+empty sockets: MB/CMP0/BOB0/CH1/D1 MB/CMP0/BOB1/CH1/D1 MB/CMP0/BOB2/CH1/D1 MB/CMP0/BOB3/CH1/D1 MB/CMP0/BOB0/CH0/D1 MB/CMP0/BOB1/CH0/D1 MB/CMP0/BOB2/CH0/D1 MB/CMP0/BOB3/CH0/D1
+total memory = 32768MB (32GB)


================================================================
  Commit: ae88d8e176342fb2460173a5c21fbeb75c185cb1
      https://github.com/fusinv/fusioninventory-agent/commit/ae88d8e176342fb2460173a5c21fbeb75c185cb1
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-04-16 (Mon, 16 Apr 2012)

  Changed paths:
    M t/inventory/solaris/cpu.t

  Log Message:
  -----------
  oops


diff --git a/t/inventory/solaris/cpu.t b/t/inventory/solaris/cpu.t
index c71b4ea..27d9f8e 100755
--- a/t/inventory/solaris/cpu.t
+++ b/t/inventory/solaris/cpu.t
@@ -17,6 +17,16 @@ my %memconf_tests = (
             CORE         => '2'
         },
     ],
+    sample3 => [
+        1,
+        {
+            NAME         => 'SPARC-T3 (16-Core 8-Thread)',
+            MANUFACTURER => 'Sun Microsystems',
+            SPEED        => '1649',
+            CORE         => '16',
+            THREAD       => '8'
+        },
+    ],
     sample2 => [
         1,
         {


================================================================
  Commit: 32251413f6bda06c04ca273acb0d7807b2273848
      https://github.com/fusinv/fusioninventory-agent/commit/32251413f6bda06c04ca273acb0d7807b2273848
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-04-16 (Mon, 16 Apr 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/CPU.pm

  Log Message:
  -----------
  fix Sun pattern matching

Close: #1583
Reported-by: Marcel Werner <marcel.werner at bt.com>


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/CPU.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/CPU.pm
index 6fc0d9f..80a64bb 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/CPU.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/CPU.pm
@@ -53,7 +53,7 @@ sub doInventory {
 sub _getCPUFromMemconf {
     my $spec = getFirstMatch(
         command => 'memconf',
-        pattern => qr/^((Sun\s|Fujitsu|Intel).*\d+(G|M)Hz\)).*$/x,
+        pattern => qr/^((Sun|Fujitsu|Intel).*\d+(G|M)Hz\)).*$/x,
         @_
     );
     return _parseSpec($spec);
@@ -63,9 +63,9 @@ sub _parseCoreString {
     my ($v) = @_;
 
     return
-        $v =~ /dual/i               ? 2  :
-        $v =~ /quad/i               ? 4  :
-        $v =~ /(\d+)-(core|thread)/ ? $1 :
+        $v =~ /dual/i     ? 2  :
+        $v =~ /quad/i     ? 4  :
+        $v =~ /(\d+)-\w+/ ? $1 :
         $v;
 }
 
@@ -75,9 +75,8 @@ sub _parseSpec {
     my $manufacturer;
     if ($spec =~ /(AMD|Fujitsu|Intel)\s/g) {
         $manufacturer = $1;
-    } elsif ($spec =~ /(Sun)\s/) {
-        $manufacturer = $1;
-        $manufacturer =~ s/.*Sun.*/Sun Microsystems/;
+    } elsif ($spec =~ /Sun/) {
+        $manufacturer = 'Sun Microsystems';
     }
 
     # 4 X UltraSPARC-III 750MHz
@@ -103,7 +102,8 @@ sub _parseSpec {
 
     # 8-core quad-thread UltraSPARC-T1 1000MHz
     # 8-core 8-thread UltraSPARC-T2 1165MHz
-    if ($spec =~ /(\d+ -core) \s (\S+) \s (\S+) \s (\d+) MHz/x) {
+    # 16-Core 8-Thread SPARC-T3 1649MHz
+    if ($spec =~ /(\d+ -[cC]ore) \s (\S+) \s (\S+) \s (\d+) MHz/x) {
         return 1, {
             MANUFACTURER => $manufacturer,
             NAME         => $3 . " (" . $1 . " " . $2 . ")",


================================================================
  Commit: 37e1cedf254d1aa60945f0349e4cbd8e951da084
      https://github.com/fusinv/fusioninventory-agent/commit/37e1cedf254d1aa60945f0349e4cbd8e951da084
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-04-16 (Mon, 16 Apr 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/CPU.pm

  Log Message:
  -----------
  better regexp


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/CPU.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/CPU.pm
index 80a64bb..81a0076 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/CPU.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Solaris/CPU.pm
@@ -53,7 +53,7 @@ sub doInventory {
 sub _getCPUFromMemconf {
     my $spec = getFirstMatch(
         command => 'memconf',
-        pattern => qr/^((Sun|Fujitsu|Intel).*\d+(G|M)Hz\)).*$/x,
+        pattern => qr/^((?:Sun|Fujitsu|Intel) .* \d+ [GM]Hz\))/x,
         @_
     );
     return _parseSpec($spec);


================================================================
  Commit: 234955cd8389ce166c60fbc4a7ab6e28f6eb9021
      https://github.com/fusinv/fusioninventory-agent/commit/234955cd8389ce166c60fbc4a7ab6e28f6eb9021
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-04-16 (Mon, 16 Apr 2012)

  Changed paths:
    A resources/lvm/linux/pvs/linux-2

  Log Message:
  -----------
  initial import


diff --git a/resources/lvm/linux/pvs/linux-2 b/resources/lvm/linux/pvs/linux-2
new file mode 100644
index 0000000..eddce83
--- /dev/null
+++ b/resources/lvm/linux/pvs/linux-2
@@ -0,0 +1,3 @@
+  /dev/sda2  vg00 lvm2 a--  311452.24 125694.90 CnCKHH-tnlS-BFL5-qRMa-HaV2-10zm-kNIpEp  9282 311452.24 OFXZR2-dEjD-qVIj-VJnw-1dQY-wC57-O1TABn
+  /dev/sdb2  vg00 lvm2 a--   58921.58  18119.39 XMzcNr-5qrL-pXk1-9Ycl-FyfN-nXPe-ndRvHF  1756  58921.58 OFXZR2-dEjD-qVIj-VJnw-1dQY-wC57-O1TABn
+  /dev/sdc1  vg00 lvm2 a--  500095.25 241323.47 GnT78t-kb92-k8di-1uUv-28HK-H6za-SXe2EZ 14904 500095.25 OFXZR2-dEjD-qVIj-VJnw-1dQY-wC57-O1TABn


================================================================
  Commit: 4261c7068fa1a80d4d097b966f92be7c2bf1e9e8
      https://github.com/fusinv/fusioninventory-agent/commit/4261c7068fa1a80d4d097b966f92be7c2bf1e9e8
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-04-16 (Mon, 16 Apr 2012)

  Changed paths:
    M t/inventory/linux/lvm.t

  Log Message:
  -----------
  add new test case


diff --git a/t/inventory/linux/lvm.t b/t/inventory/linux/lvm.t
index b0aa3a3..e1417be 100644
--- a/t/inventory/linux/lvm.t
+++ b/t/inventory/linux/lvm.t
@@ -1,14 +1,12 @@
 #!/usr/bin/perl
-use strict;
 
+use strict;
 use warnings;
 
-use FusionInventory::Agent::Task::Inventory::Input::Linux::LVM; 
-
 use Test::More;
 
+use FusionInventory::Agent::Task::Inventory::Input::Linux::LVM; 
 
-plan tests => 3;
 my %lvs = (
     'linux-1' => [
         {
@@ -113,6 +111,41 @@ my %pvs = (
             PV_UUID     => 'xkxfmu-fQLt-DtKZ-YnkY-vwcj-JqC2-WmQddD',
             PE_SIZE     => 4
         }
+    ],
+    'linux-2' => [
+        {
+            SIZE        => 311452,
+            FORMAT      => 'lvm2',
+            ATTR        => 'a--',
+            FREE        => 125694,
+            DEVICE      => '/dev/sda2',
+            PV_NAME     => 'vg00',
+            PV_PE_COUNT => 9282,
+            PE_SIZE     => 33,
+            PV_UUID     => 'CnCKHH-tnlS-BFL5-qRMa-HaV2-10zm-kNIpEp'
+        },
+        {
+            SIZE        => 58921,
+            FORMAT      => 'lvm2',
+            ATTR        => 'a--',
+            FREE        => 18119,
+            DEVICE      => '/dev/sdb2',
+            PV_NAME     => 'vg00',
+            PV_PE_COUNT => 1756,
+            PE_SIZE     => 33,
+            PV_UUID     => 'XMzcNr-5qrL-pXk1-9Ycl-FyfN-nXPe-ndRvHF'
+        },
+        {
+            SIZE        => 500095,
+            FORMAT      => 'lvm2',
+            ATTR        => 'a--',
+            FREE        => 241323,
+            DEVICE      => '/dev/sdc1',
+            PV_NAME     => 'vg00',
+            PV_PE_COUNT => 14904,
+            PE_SIZE     => 33,
+            PV_UUID     => 'GnT78t-kb92-k8di-1uUv-28HK-H6za-SXe2EZ'
+        }
     ]
 );
 
@@ -151,6 +184,11 @@ my %vgs = (
     ]
 );
 
+plan tests =>
+    (scalar keys %pvs) +
+    (scalar keys %lvs) +
+    (scalar keys %vgs);
+
 foreach my $test (keys %pvs) {
     my @pvs = FusionInventory::Agent::Task::Inventory::Input::Linux::LVM::_getPhysicalVolumes(file => 'resources/lvm/linux/pvs/'.$test);
     is_deeply(\@pvs, $pvs{$test}, '_parsePvs()');


================================================================
  Commit: afac647c0bc98b4f0168563f9976f76a56ccb4a3
      https://github.com/fusinv/fusioninventory-agent/commit/afac647c0bc98b4f0168563f9976f76a56ccb4a3
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-04-16 (Mon, 16 Apr 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Linux/LVM.pm
    M lib/FusionInventory/Agent/Task/Inventory/Inventory.pm
    M resources/lvm/linux/pvs/README
    M t/inventory/linux/lvm.t

  Log Message:
  -----------
  Add volume group identifier

Close: #1585
Reported-by: Remi Collet <Remi at FamilleCollet.com>


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/LVM.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/LVM.pm
index 143f50d..57e9241 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/LVM.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/LVM.pm
@@ -25,7 +25,7 @@ sub doInventory {
     }
 
     foreach my $volume (_getPhysicalVolumes(
-        command => 'pvs --noheading --nosuffix --units M -o +pv_uuid,pv_pe_count,pv_size',
+        command => 'pvs --noheading --nosuffix --units M -o +pv_uuid,pv_pe_count,pv_size,vg_uuid',
         logger  => $logger
     )) {
         $inventory->addEntry(section => 'PHYSICAL_VOLUMES', entry => $volume);
@@ -79,7 +79,8 @@ sub _getPhysicalVolumes {
             FREE        => int($infos[6]||0),
             PV_UUID     => $infos[7],
             PV_PE_COUNT => $infos[8],
-            PE_SIZE     =>  int($infos[5] / $infos[8])
+            PE_SIZE     => int($infos[5] / $infos[8]),
+            VG_UUID     => $infos[10]
         };
     }
     close $handle;
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Inventory.pm b/lib/FusionInventory/Agent/Task/Inventory/Inventory.pm
index 1242d90..99bcf9a 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Inventory.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Inventory.pm
@@ -70,7 +70,7 @@ my %fields = (
     LOGICAL_VOLUMES  => [ qw/LV_NAME VGN_AME ATTR SIZE LV_UUID SEG_COUNT 
                              VG_UUID/ ],
     PHYSICAL_VOLUMES => [ qw/DEVICE PV_NAME PV_PE_COUNT PV_UUID FORMAT ATTR 
-                             SIZE FREE PE_SIZE/ ],
+                             SIZE FREE PE_SIZE VG_UUID/ ],
     VOLUME_GROUPS    => [ qw/VG_NAME PV_COUNT LV_COUNT ATTR SIZE FREE VG_UUID 
                              VG_EXTENT_SIZE/ ],
 );
diff --git a/resources/lvm/linux/pvs/README b/resources/lvm/linux/pvs/README
index 34869b4..d3d797f 100644
--- a/resources/lvm/linux/pvs/README
+++ b/resources/lvm/linux/pvs/README
@@ -1 +1 @@
-pvs --noheading --nosuffix --units M -o +pv_uuid,pv_pe_count,pv_size,pv_attr
+pvs --noheading --nosuffix --units M -o +pv_uuid,pv_pe_count,pv_size,pv_attr,vg_uuid
diff --git a/t/inventory/linux/lvm.t b/t/inventory/linux/lvm.t
index e1417be..c7a9153 100644
--- a/t/inventory/linux/lvm.t
+++ b/t/inventory/linux/lvm.t
@@ -86,8 +86,9 @@ my %pvs = (
             DEVICE      => '/dev/sda5',
             PV_NAME     => 'lvm',
             PV_PE_COUNT => '3778',
+            PE_SIZE     => 4,
             PV_UUID     => 'MjsnP7-GaGC-NIo7-tS3o-gf2t-di2R-eP3Au7',
-            PE_SIZE     => 4
+            VG_UUID     => undef
         },
         {
             SIZE        => 2466,
@@ -97,8 +98,9 @@ my %pvs = (
             DEVICE      => '/dev/sdb1',
             PV_NAME     => 'lvm2',
             PV_PE_COUNT => '588',
+            PE_SIZE     => 4,
             PV_UUID     => 'LNDa6y-PQGQ-gtnc-c7Wc-W2lS-Soaf-Bwu2Me',
-            PE_SIZE     => 4
+            VG_UUID     => undef
         },
         {
             SIZE        => 2894,
@@ -108,8 +110,9 @@ my %pvs = (
             DEVICE      => '/dev/sdb2',
             PV_NAME     => 'lvm2',
             PV_PE_COUNT => '690',
+            PE_SIZE     => 4,
             PV_UUID     => 'xkxfmu-fQLt-DtKZ-YnkY-vwcj-JqC2-WmQddD',
-            PE_SIZE     => 4
+            VG_UUID     => undef
         }
     ],
     'linux-2' => [
@@ -122,7 +125,8 @@ my %pvs = (
             PV_NAME     => 'vg00',
             PV_PE_COUNT => 9282,
             PE_SIZE     => 33,
-            PV_UUID     => 'CnCKHH-tnlS-BFL5-qRMa-HaV2-10zm-kNIpEp'
+            PV_UUID     => 'CnCKHH-tnlS-BFL5-qRMa-HaV2-10zm-kNIpEp',
+            VG_UUID     => 'OFXZR2-dEjD-qVIj-VJnw-1dQY-wC57-O1TABn'
         },
         {
             SIZE        => 58921,
@@ -133,7 +137,8 @@ my %pvs = (
             PV_NAME     => 'vg00',
             PV_PE_COUNT => 1756,
             PE_SIZE     => 33,
-            PV_UUID     => 'XMzcNr-5qrL-pXk1-9Ycl-FyfN-nXPe-ndRvHF'
+            PV_UUID     => 'XMzcNr-5qrL-pXk1-9Ycl-FyfN-nXPe-ndRvHF',
+            VG_UUID     => 'OFXZR2-dEjD-qVIj-VJnw-1dQY-wC57-O1TABn'
         },
         {
             SIZE        => 500095,
@@ -144,7 +149,8 @@ my %pvs = (
             PV_NAME     => 'vg00',
             PV_PE_COUNT => 14904,
             PE_SIZE     => 33,
-            PV_UUID     => 'GnT78t-kb92-k8di-1uUv-28HK-H6za-SXe2EZ'
+            PV_UUID     => 'GnT78t-kb92-k8di-1uUv-28HK-H6za-SXe2EZ',
+            VG_UUID     => 'OFXZR2-dEjD-qVIj-VJnw-1dQY-wC57-O1TABn'
         }
     ]
 );


================================================================
  Commit: e893713ae13c4e6ca910943301ae09eab402baa7
      https://github.com/fusinv/fusioninventory-agent/commit/e893713ae13c4e6ca910943301ae09eab402baa7
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-04-16 (Mon, 16 Apr 2012)

  Changed paths:
    A resources/lvm/linux/vgs/linux-2

  Log Message:
  -----------
  initial import


diff --git a/resources/lvm/linux/vgs/linux-2 b/resources/lvm/linux/vgs/linux-2
new file mode 100644
index 0000000..5f6c13c
--- /dev/null
+++ b/resources/lvm/linux/vgs/linux-2
@@ -0,0 +1 @@
+  vg00   3  16   0 wz--n- 870469.07 385137.77 OFXZR2-dEjD-qVIj-VJnw-1dQY-wC57-O1TABn 33.55 CnCKHH-tnlS-BFL5-qRMa-HaV2-10zm-kNIpEp


================================================================
  Commit: b2d5a0be7bcfed269ed0ac48a1a5746c4f16bbba
      https://github.com/fusinv/fusioninventory-agent/commit/b2d5a0be7bcfed269ed0ac48a1a5746c4f16bbba
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-04-16 (Mon, 16 Apr 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Linux/LVM.pm
    M resources/lvm/linux/vgs/README
    M resources/lvm/linux/vgs/linux-1
    M t/inventory/linux/lvm.t

  Log Message:
  -----------
  don't get PV identifier from VG list

As one VG may have several PV, this just result in multiple lines for
the same VG in the output.

Close: #1582
Reported-by: Remi Collet <Remi at FamilleCollet.com>


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/LVM.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/LVM.pm
index 57e9241..2c4e802 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/LVM.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/LVM.pm
@@ -32,7 +32,7 @@ sub doInventory {
     }
 
     foreach my $group (_getVolumeGroups(
-        command => 'vgs --noheading --nosuffix --units M -o +vg_uuid,vg_extent_size,pv_uuid',
+        command => 'vgs --noheading --nosuffix --units M -o +vg_uuid,vg_extent_size',
         logger  => $logger
     )) {
         $inventory->addEntry(section => 'VOLUME_GROUPS', entry => $group);
diff --git a/resources/lvm/linux/vgs/README b/resources/lvm/linux/vgs/README
index e94e849..dfee8f8 100644
--- a/resources/lvm/linux/vgs/README
+++ b/resources/lvm/linux/vgs/README
@@ -1 +1 @@
-vgs --noheading --nosuffix --units M -o +vg_uuid,vg_extent_size,pv_uuid
+vgs --noheading --nosuffix --units M -o +vg_uuid,vg_extent_size
diff --git a/resources/lvm/linux/vgs/linux-1 b/resources/lvm/linux/vgs/linux-1
index 2b99c60..ff5c9c2 100644
--- a/resources/lvm/linux/vgs/linux-1
+++ b/resources/lvm/linux/vgs/linux-1
@@ -1,3 +1,2 @@
-  lvm    1   6   0 wz--n- 15846.08       0 Eubwcw-UFh2-P3Kn-aI6y-qcLT-VCzU-ls49ha 4.19 MjsnP7-GaGC-NIo7-tS3o-gf2t-di2R-eP3Au7
-  lvm2   2   2   0 wz--n-  5360.32 5150.61 ZHOqQg-SNQJ-a79U-Jfn1-Az84-e04w-d9zH23 4.19 LNDa6y-PQGQ-gtnc-c7Wc-W2lS-Soaf-Bwu2Me
-  lvm2   2   2   0 wz--n-  5360.32 5150.61 ZHOqQg-SNQJ-a79U-Jfn1-Az84-e04w-d9zH23 4.19 xkxfmu-fQLt-DtKZ-YnkY-vwcj-JqC2-WmQddD
+  lvm    1   6   0 wz--n- 15846.08       0 Eubwcw-UFh2-P3Kn-aI6y-qcLT-VCzU-ls49ha 4.19
+  lvm2   2   2   0 wz--n-  5360.32 5150.61 ZHOqQg-SNQJ-a79U-Jfn1-Az84-e04w-d9zH23 4.19
diff --git a/t/inventory/linux/lvm.t b/t/inventory/linux/lvm.t
index c7a9153..5a38065 100644
--- a/t/inventory/linux/lvm.t
+++ b/t/inventory/linux/lvm.t
@@ -176,16 +176,18 @@ my %vgs = (
             VG_UUID        => 'ZHOqQg-SNQJ-a79U-Jfn1-Az84-e04w-d9zH23',
             LV_COUNT       => '2',
             VG_EXTENT_SIZE => '4.19'
-        },
+        }
+    ],
+    'linux-2' => [
         {
-            SIZE           => 5360,
-            ATTR           => 'wz--n-',
-            VG_NAME        => 'lvm2',
-            FREE           => 5150,
-            PV_COUNT       => '2',
-            VG_UUID        => 'ZHOqQg-SNQJ-a79U-Jfn1-Az84-e04w-d9zH23',
-            LV_COUNT       => '2',
-            VG_EXTENT_SIZE => '4.19'
+            'SIZE' => 870469,
+            'ATTR' => 'wz--n-',
+            'VG_NAME' => 'vg00',
+            'FREE' => 385137,
+            'PV_COUNT' => '3',
+            'VG_UUID' => 'OFXZR2-dEjD-qVIj-VJnw-1dQY-wC57-O1TABn',
+            'LV_COUNT' => '16',
+            'VG_EXTENT_SIZE' => '33.55'
         }
     ]
 );


================================================================
  Commit: 6056908a46720665fe918a64403dd8425643098f
      https://github.com/fusinv/fusioninventory-agent/commit/6056908a46720665fe918a64403dd8425643098f
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-04-16 (Mon, 16 Apr 2012)

  Changed paths:
    M t/inventory/linux/lvm.t

  Log Message:
  -----------
  cosmetics


diff --git a/t/inventory/linux/lvm.t b/t/inventory/linux/lvm.t
index 5a38065..16112df 100644
--- a/t/inventory/linux/lvm.t
+++ b/t/inventory/linux/lvm.t
@@ -180,14 +180,14 @@ my %vgs = (
     ],
     'linux-2' => [
         {
-            'SIZE' => 870469,
-            'ATTR' => 'wz--n-',
-            'VG_NAME' => 'vg00',
-            'FREE' => 385137,
-            'PV_COUNT' => '3',
-            'VG_UUID' => 'OFXZR2-dEjD-qVIj-VJnw-1dQY-wC57-O1TABn',
-            'LV_COUNT' => '16',
-            'VG_EXTENT_SIZE' => '33.55'
+            SIZE           => 870469,
+            ATTR           => 'wz--n-',
+            VG_NAME        => 'vg00',
+            FREE           => 385137,
+            PV_COUNT       => '3',
+            VG_UUID        => 'OFXZR2-dEjD-qVIj-VJnw-1dQY-wC57-O1TABn',
+            LV_COUNT       => '16',
+            VG_EXTENT_SIZE => '33.55'
         }
     ]
 );
@@ -198,16 +198,16 @@ plan tests =>
     (scalar keys %vgs);
 
 foreach my $test (keys %pvs) {
-    my @pvs = FusionInventory::Agent::Task::Inventory::Input::Linux::LVM::_getPhysicalVolumes(file => 'resources/lvm/linux/pvs/'.$test);
-    is_deeply(\@pvs, $pvs{$test}, '_parsePvs()');
+    my @pvs = FusionInventory::Agent::Task::Inventory::Input::Linux::LVM::_getPhysicalVolumes(file => "resources/lvm/linux/pvs/$test");
+    is_deeply(\@pvs, $pvs{$test}, "physical volumes list: $test");
 }
 
 foreach my $test (keys %lvs) {
-    my @lvs = FusionInventory::Agent::Task::Inventory::Input::Linux::LVM::_getLogicalVolumes(file => 'resources/lvm/linux/lvs/'.$test);
-    is_deeply(\@lvs, $lvs{$test}, '_parseLvs()');
+    my @lvs = FusionInventory::Agent::Task::Inventory::Input::Linux::LVM::_getLogicalVolumes(file => "resources/lvm/linux/lvs/$test");
+    is_deeply(\@lvs, $lvs{$test}, "logical volumes list: $test");
 }
 
 foreach my $test (keys %vgs) {
-    my @vgs = FusionInventory::Agent::Task::Inventory::Input::Linux::LVM::_getVolumeGroups(file => 'resources/lvm/linux/vgs/'.$test);
-    is_deeply(\@vgs, $vgs{$test}, '_parseVgs()');
+    my @vgs = FusionInventory::Agent::Task::Inventory::Input::Linux::LVM::_getVolumeGroups(file => "resources/lvm/linux/vgs/$test");
+    is_deeply(\@vgs, $vgs{$test}, "volume groups list: $test");
 }


================================================================
  Commit: d211274aa8c71602c2d606cb4d219b3b0cfe5f6c
      https://github.com/fusinv/fusioninventory-agent/commit/d211274aa8c71602c2d606cb4d219b3b0cfe5f6c
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-04-17 (Tue, 17 Apr 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Linux/LVM.pm
    M lib/FusionInventory/Agent/Task/Inventory/Inventory.pm
    M t/inventory/linux/lvm.t

  Log Message:
  -----------
  There is no name for physical volume, just uuid

Close: #1587
Reported-by: Remi Collet <Remi at FamilleCollet.com>


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/LVM.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/LVM.pm
index 2c4e802..1ac7695 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/LVM.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/LVM.pm
@@ -72,7 +72,6 @@ sub _getPhysicalVolumes {
 
         push @volumes, {
             DEVICE      => $infos[1],
-            PV_NAME     => $infos[2],
             FORMAT      => $infos[3],
             ATTR        => $infos[4],
             SIZE        => int($infos[5]||0),
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Inventory.pm b/lib/FusionInventory/Agent/Task/Inventory/Inventory.pm
index 99bcf9a..82f2b58 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Inventory.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Inventory.pm
@@ -69,7 +69,7 @@ my %fields = (
                              VMID MAC COMMENT OWNER/ ],
     LOGICAL_VOLUMES  => [ qw/LV_NAME VGN_AME ATTR SIZE LV_UUID SEG_COUNT 
                              VG_UUID/ ],
-    PHYSICAL_VOLUMES => [ qw/DEVICE PV_NAME PV_PE_COUNT PV_UUID FORMAT ATTR 
+    PHYSICAL_VOLUMES => [ qw/DEVICE PV_PE_COUNT PV_UUID FORMAT ATTR 
                              SIZE FREE PE_SIZE VG_UUID/ ],
     VOLUME_GROUPS    => [ qw/VG_NAME PV_COUNT LV_COUNT ATTR SIZE FREE VG_UUID 
                              VG_EXTENT_SIZE/ ],
diff --git a/t/inventory/linux/lvm.t b/t/inventory/linux/lvm.t
index 16112df..3d6e1aa 100644
--- a/t/inventory/linux/lvm.t
+++ b/t/inventory/linux/lvm.t
@@ -84,7 +84,6 @@ my %pvs = (
             ATTR        => 'a-',
             FREE        => 0,
             DEVICE      => '/dev/sda5',
-            PV_NAME     => 'lvm',
             PV_PE_COUNT => '3778',
             PE_SIZE     => 4,
             PV_UUID     => 'MjsnP7-GaGC-NIo7-tS3o-gf2t-di2R-eP3Au7',
@@ -96,7 +95,6 @@ my %pvs = (
             ATTR        => 'a-',
             FREE        => 2256,
             DEVICE      => '/dev/sdb1',
-            PV_NAME     => 'lvm2',
             PV_PE_COUNT => '588',
             PE_SIZE     => 4,
             PV_UUID     => 'LNDa6y-PQGQ-gtnc-c7Wc-W2lS-Soaf-Bwu2Me',
@@ -108,7 +106,6 @@ my %pvs = (
             ATTR        => 'a-',
             FREE        => 2894,
             DEVICE      => '/dev/sdb2',
-            PV_NAME     => 'lvm2',
             PV_PE_COUNT => '690',
             PE_SIZE     => 4,
             PV_UUID     => 'xkxfmu-fQLt-DtKZ-YnkY-vwcj-JqC2-WmQddD',
@@ -122,7 +119,6 @@ my %pvs = (
             ATTR        => 'a--',
             FREE        => 125694,
             DEVICE      => '/dev/sda2',
-            PV_NAME     => 'vg00',
             PV_PE_COUNT => 9282,
             PE_SIZE     => 33,
             PV_UUID     => 'CnCKHH-tnlS-BFL5-qRMa-HaV2-10zm-kNIpEp',
@@ -134,7 +130,6 @@ my %pvs = (
             ATTR        => 'a--',
             FREE        => 18119,
             DEVICE      => '/dev/sdb2',
-            PV_NAME     => 'vg00',
             PV_PE_COUNT => 1756,
             PE_SIZE     => 33,
             PV_UUID     => 'XMzcNr-5qrL-pXk1-9Ycl-FyfN-nXPe-ndRvHF',
@@ -146,7 +141,6 @@ my %pvs = (
             ATTR        => 'a--',
             FREE        => 241323,
             DEVICE      => '/dev/sdc1',
-            PV_NAME     => 'vg00',
             PV_PE_COUNT => 14904,
             PE_SIZE     => 33,
             PV_UUID     => 'GnT78t-kb92-k8di-1uUv-28HK-H6za-SXe2EZ',


================================================================
  Commit: 1c3897959ab43805d696e5f9f4d044853ca06012
      https://github.com/fusinv/fusioninventory-agent/commit/1c3897959ab43805d696e5f9f4d044853ca06012
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-04-17 (Tue, 17 Apr 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Linux/LVM.pm

  Log Message:
  -----------
  move command definition in parsing function


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/LVM.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/LVM.pm
index 1ac7695..0cf3bb1 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/LVM.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/LVM.pm
@@ -17,30 +17,26 @@ sub doInventory {
     my $inventory = $params{inventory};
     my $logger    = $params{inventory};
 
-    foreach my $volume (_getLogicalVolumes(
-        command => 'lvs -a --noheading --nosuffix --units M -o lv_name,vg_name,lv_attr,lv_size,lv_uuid,seg_count',
-        logger  => $logger
-    )) {
+    foreach my $volume (_getLogicalVolumes(logger => $logger)) {
         $inventory->addEntry(section => 'LOGICAL_VOLUMES', entry => $volume);
     }
 
-    foreach my $volume (_getPhysicalVolumes(
-        command => 'pvs --noheading --nosuffix --units M -o +pv_uuid,pv_pe_count,pv_size,vg_uuid',
-        logger  => $logger
-    )) {
+    foreach my $volume (_getPhysicalVolumes(logger => $logger)) {
         $inventory->addEntry(section => 'PHYSICAL_VOLUMES', entry => $volume);
     }
 
-    foreach my $group (_getVolumeGroups(
-        command => 'vgs --noheading --nosuffix --units M -o +vg_uuid,vg_extent_size',
-        logger  => $logger
-    )) {
+    foreach my $group (_getVolumeGroups(logger => $logger)) {
         $inventory->addEntry(section => 'VOLUME_GROUPS', entry => $group);
     }
 }
 
 sub _getLogicalVolumes {
-    my $handle = getFileHandle(@_);
+    my (%params) = (
+        command => 'lvs -a --noheading --nosuffix --units M -o lv_name,vg_name,lv_attr,lv_size,lv_uuid,seg_count',
+        @_
+    );
+
+    my $handle = getFileHandle(%params);
     return unless $handle;
 
     my @volumes;
@@ -63,7 +59,12 @@ sub _getLogicalVolumes {
 }
 
 sub _getPhysicalVolumes {
-    my $handle = getFileHandle(@_);
+    my (%params) = (
+        command => 'pvs --noheading --nosuffix --units M -o +pv_uuid,pv_pe_count,pv_size,vg_uuid',
+        @_
+    );
+
+    my $handle = getFileHandle(%params);
     return unless $handle;
 
     my @volumes;
@@ -88,7 +89,12 @@ sub _getPhysicalVolumes {
 }
 
 sub _getVolumeGroups {
-    my $handle = getFileHandle(@_);
+    my (%params) = (
+        command => 'vgs --noheading --nosuffix --units M -o +vg_uuid,vg_extent_size',
+        @_
+    );
+
+    my $handle = getFileHandle(%params);
     return unless $handle;
 
     my @groups;


================================================================
  Commit: 384643b914bcf67c933acfe4acb3b111c60509b9
      https://github.com/fusinv/fusioninventory-agent/commit/384643b914bcf67c933acfe4acb3b111c60509b9
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-04-17 (Tue, 17 Apr 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Linux/LVM.pm

  Log Message:
  -----------
  ask for VG id, not name

Close: #1584
Reported-by: Remi Collet <Remi at FamilleCollet.com>


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/LVM.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/LVM.pm
index 0cf3bb1..58b86b0 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/LVM.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/LVM.pm
@@ -32,7 +32,7 @@ sub doInventory {
 
 sub _getLogicalVolumes {
     my (%params) = (
-        command => 'lvs -a --noheading --nosuffix --units M -o lv_name,vg_name,lv_attr,lv_size,lv_uuid,seg_count',
+        command => 'lvs -a --noheading --nosuffix --units M -o lv_name,vg_uuid,lv_attr,lv_size,lv_uuid,seg_count',
         @_
     );
 


================================================================
  Commit: e9aa0f62ce6b56626036783fd636817f9cc120a1
      https://github.com/fusinv/fusioninventory-agent/commit/e9aa0f62ce6b56626036783fd636817f9cc120a1
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-04-17 (Tue, 17 Apr 2012)

  Changed paths:
    A contrib/fedora/fusioninventory-agent.service

  Log Message:
  -----------
  initial import

Author: Remi Collet <Remi at FamilleCollet.com>


diff --git a/contrib/fedora/fusioninventory-agent.service b/contrib/fedora/fusioninventory-agent.service
new file mode 100644
index 0000000..0e14f59
--- /dev/null
+++ b/contrib/fedora/fusioninventory-agent.service
@@ -0,0 +1,10 @@
+[Unit]
+Description=FusionInventory agent
+After=syslog.target network.target
+ 
+[Service]
+EnvironmentFile=/etc/sysconfig/fusioninventory-agent
+ExecStart=/usr/bin/fusioninventory-agent $OPTIONS
+ 
+[Install]
+WantedBy=multi-user.target


================================================================
  Commit: c2923f441fb7defa3a63c00f5fb5328cbab01a48
      https://github.com/fusinv/fusioninventory-agent/commit/c2923f441fb7defa3a63c00f5fb5328cbab01a48
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-04-17 (Tue, 17 Apr 2012)

  Changed paths:
    R contrib/fedora/fusioninventory-agent.spec

  Log Message:
  -----------
  no need to ship an outdated spec file


diff --git a/contrib/fedora/fusioninventory-agent.spec b/contrib/fedora/fusioninventory-agent.spec
deleted file mode 100644
index 922ff1f..0000000
--- a/contrib/fedora/fusioninventory-agent.spec
+++ /dev/null
@@ -1,202 +0,0 @@
-%global gitver ddfdeaf
-
-Name:        fusioninventory-agent
-Summary:     FusionInventory agent
-Summary(fr): Agent FusionInventory
-
-Version:   2.0.4
-
-%if 0%{?gitver:1}
-Release:   4.git%{gitver}%{?dist}
-Source0:   fusinv-fusioninventory-agent-2.0.4-9-gddfdeaf.tar.gz
-%else
-Release:   1.%{?dist}
-Source0:   http://search.cpan.org/CPAN/authors/id/F/FU/FUSINV/FusionInventory-Agent-%{version}.tar.gz
-%endif
-
-Source1:   %{name}.cron
-Source2:   %{name}.init
-
-Group:     Applications/System
-License:   GPLv2+
-URL:       http://fusioninventory.org/
-
-BuildArch: noarch
-BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
-
-BuildRequires: perl(Module::Install)
-Requires:  perl(:MODULE_COMPAT_%(eval "`%{__perl} -V:version`"; echo $version))
-Requires:  perl(LWP) perl(Net::IP) perl(HTTP::Status) perl(Net::SSLeay) perl(Crypt::SSLeay)
-Requires:  perl(Proc::Daemon) perl(Proc::PID::File)
-# Not yet available in EPEL ...
-%if %{?fedora}%{?rhel} > 4
-Requires:  perl(Archive::Extract)
-Requires:  perl(Net::CUPS)
-%endif
-Requires(post): /sbin/chkconfig
-Requires(preun): /sbin/chkconfig, /sbin/service
-Requires(postun): /sbin/service
-
-%{?perl_default_filter}
-
-
-%description
-FusionInventory Agent is an application designed to help a network
-or system administrator to keep track of the hardware and software
-configurations of computers that are installed on the network.
-
-This agent can send information about the computer to a OCS Inventory NG
-or GLPI server with the FusionInventory for GLPI plugin.
-
-You can add additional packages for optionnal tasks:
-
-* perl-FusionInventory-Agent-Task-OcsDeploy
-    OCS Inventory Software deployment support
-
-
-%description -l fr
-L'agent FusionInventory est une application destinée à aider l'administrateur
-système ou réseau à surveiller la configuration des machines du réseau
-et les logiciels qui y sont installés.
-
-Cet agent peut envoyer les informations de l'ordinateur à un serveur
-OCS Inventory NG ou à un serveur GLPI disposant de l'extension FusionInventory.
-
-Vous pouvez ajouter les paquets additionnels pour les tâches optionnelles :
-
-* perl-FusionInventory-Agent-Task-OcsDeploy
-    Gestion du déploiement logiciel OCS Inventory
-
-
-%prep
-%if 0%{?gitver:1}
-%setup -q -n fusinv-fusioninventory-agent-%{gitver}
-%else
-%setup -q -n FusionInventory-Agent-%{version}
-%endif
-
-cat <<EOF | tee logrotate
-%{_localstatedir}/log/%{name}/*.log {
-    weekly
-    rotate 7
-    compress
-    notifempty
-    missingok
-}
-EOF
-
-cat <<EOF | tee %{name}.conf
-#
-# Fusion Inventory Agent Configuration File
-# used by hourly cron job used to override the %{name}.cfg setup.
-#
-# Add tools directory if needed (tw_cli, hpacucli, ipssend, ...)
-PATH=/sbin:/bin:/usr/sbin:/usr/bin
-# Global options
-#FUSINVOPT=--debug
-# Mode, change to "cron" or "daemon" to activate
-OCSMODE[0]=none
-# OCS server URI
-# OCSSERVER[0]=your.ocsserver.name
-# corresponds with --local=%{_localstatedir}/lib/%{name}
-# OCSSERVER[0]=local
-# Wait before inventory
-OCSPAUSE[0]=120
-# Administrative TAG (optional, must be filed before first inventory)
-OCSTAG[0]=
-EOF
-
-cat <<EOF | tee agent.cfg
-# This file provides global and command line settings
-# For CRON or DAEMON configuration, see %{_sysconfdir}/sysconfig/%{name}
-basevardir=%{_localstatedir}/lib/%{name}
-logger=Stderr
-server=""
-EOF
-
-
-%build
-%{__perl} Makefile.PL INSTALLDIRS=vendor
-make %{?_smp_mflags}
-
-
-%install
-rm -rf %{buildroot}
-
-make pure_install DESTDIR=%{buildroot}
-find %{buildroot} -type f -name .packlist -exec rm -f {} ';'
-find %{buildroot} -type d -depth -exec rmdir {} 2>/dev/null ';'
-
-%{_fixperms} $RPM_BUILD_ROOT/*
-
-
-%{__mkdir_p} %{buildroot}%{_localstatedir}/{log,lib}/%{name}
-
-%{__install} -m 644 -D  logrotate    %{buildroot}%{_sysconfdir}/logrotate.d/%{name}
-%{__install} -m 644 -D  %{name}.conf %{buildroot}%{_sysconfdir}/sysconfig/%{name}
-%{__install} -m 644 -D  agent.cfg    %{buildroot}%{_sysconfdir}/fusioninventory/agent.cfg
-%{__install} -m 755 -Dp %{SOURCE1}   %{buildroot}%{_sysconfdir}/cron.hourly/%{name}
-%{__install} -m 755 -Dp %{SOURCE2}   %{buildroot}%{_initrddir}/%{name}
-
-
-%clean
-rm -rf %{buildroot}
-
-
-%post
-/sbin/chkconfig --add %{name}
-
-
-%preun
-if [ "$1" = 0 ] ; then
-    /sbin/service %{name} stop &>/dev/null
-    /sbin/chkconfig --del %{name}
-fi
-exit 0
-
-
-%postun
-if [ "$1" -ge 1 ]; then
-    /sbin/service %{name} condrestart &>/dev/null
-fi
-exit 0
-
-
-%files
-%defattr(-, root, root, -)
-%doc AUTHORS Changes LICENSE README THANKS
-%dir %{_sysconfdir}/fusioninventory
-%config(noreplace) %{_sysconfdir}/logrotate.d/%{name}
-%config(noreplace) %{_sysconfdir}/sysconfig/%{name}
-%config(noreplace) %{_sysconfdir}/fusioninventory/agent.cfg
-%{_sysconfdir}/cron.hourly/%{name}
-%{_initrddir}/%{name}
-%{perl_vendorlib}/FusionInventory
-%{_bindir}/%{name}
-%exclude %{_bindir}/%{name}-config
-%{_mandir}/man1/%{name}*
-%{_mandir}/man3/Fusion*
-%dir %{_localstatedir}/log/%{name}
-%dir %{_localstatedir}/lib/%{name}
-
-
-%changelog
-* Sat May 08 2010 Remi Collet <Fedora at famillecollet.com> 2.0.4-4.gitddfdeaf
-- git snapshot fix daemon issue
-- add FUSINVOPT for global options (p.e.--debug)
-
-* Sat May 08 2010 Remi Collet <Fedora at famillecollet.com> 2.0.4-3
-- add support for daemon mode
-
-* Fri May 07 2010 Remi Collet <Fedora at famillecollet.com> 2.0.4-2
-- info about perl-FusionInventory-Agent-Task-OcsDeploy
-- spec cleanup
-- french translation
-- set Net::CUPS and Archive::Extract optionnal on RHEL4
-
-* Fri May 07 2010 Remi Collet <Fedora at famillecollet.com> 2.0.4-1
-- update to 2.0.4 which fixes important bugs when cron is used
-
-* Sat May 01 2010 Remi Collet <Fedora at famillecollet.com> 2.0.3-1
-- initial spec
-


================================================================
  Commit: 509536bb6050d34bba66ed8c9fb5a7eeadbb46d8
      https://github.com/fusinv/fusioninventory-agent/commit/509536bb6050d34bba66ed8c9fb5a7eeadbb46d8
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-04-17 (Tue, 17 Apr 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Linux/LVM.pm
    M resources/lvm/linux/pvs/README
    M resources/lvm/linux/pvs/linux-1
    M resources/lvm/linux/pvs/linux-2
    M t/inventory/linux/lvm.t

  Log Message:
  -----------
  use explicit fields list

This is safer than relying on default fields list
Reported-by: Remi Collet <Remi at FamilleCollet.com>


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/LVM.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/LVM.pm
index 58b86b0..df917ca 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/LVM.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/LVM.pm
@@ -60,7 +60,7 @@ sub _getLogicalVolumes {
 
 sub _getPhysicalVolumes {
     my (%params) = (
-        command => 'pvs --noheading --nosuffix --units M -o +pv_uuid,pv_pe_count,pv_size,vg_uuid',
+        command => 'pvs --noheading --nosuffix --units M -o pv_name,pv_fmt,pv_attr,pv_size,pv_free,pv_uuid,pv_pe_count,vg_uuid',
         @_
     );
 
@@ -73,14 +73,14 @@ sub _getPhysicalVolumes {
 
         push @volumes, {
             DEVICE      => $infos[1],
-            FORMAT      => $infos[3],
-            ATTR        => $infos[4],
-            SIZE        => int($infos[5]||0),
-            FREE        => int($infos[6]||0),
-            PV_UUID     => $infos[7],
-            PV_PE_COUNT => $infos[8],
-            PE_SIZE     => int($infos[5] / $infos[8]),
-            VG_UUID     => $infos[10]
+            FORMAT      => $infos[2],
+            ATTR        => $infos[3],
+            SIZE        => int($infos[4]||0),
+            FREE        => int($infos[5]||0),
+            PV_UUID     => $infos[6],
+            PV_PE_COUNT => $infos[7],
+            PE_SIZE     => int($infos[4] / $infos[7]),
+            VG_UUID     => $infos[8]
         };
     }
     close $handle;
diff --git a/resources/lvm/linux/pvs/README b/resources/lvm/linux/pvs/README
index d3d797f..3cfe0b0 100644
--- a/resources/lvm/linux/pvs/README
+++ b/resources/lvm/linux/pvs/README
@@ -1 +1 @@
-pvs --noheading --nosuffix --units M -o +pv_uuid,pv_pe_count,pv_size,pv_attr,vg_uuid
+pvs --noheading --nosuffix --units M -o pv_name,pv_fmt,pv_attr,pv_size,pv_free,pv_uuid,pv_pe_count,vg_uuid
diff --git a/resources/lvm/linux/pvs/linux-1 b/resources/lvm/linux/pvs/linux-1
index 21a7b6f..ae59a74 100644
--- a/resources/lvm/linux/pvs/linux-1
+++ b/resources/lvm/linux/pvs/linux-1
@@ -1,3 +1,3 @@
-  /dev/sda5  lvm  lvm2 a-   15846.08       0 MjsnP7-GaGC-NIo7-tS3o-gf2t-di2R-eP3Au7 3778 15846.08
-  /dev/sdb1  lvm2 lvm2 a-    2466.25 2256.54 LNDa6y-PQGQ-gtnc-c7Wc-W2lS-Soaf-Bwu2Me  588  2466.25
-  /dev/sdb2  lvm2 lvm2 a-    2894.07 2894.07 xkxfmu-fQLt-DtKZ-YnkY-vwcj-JqC2-WmQddD  690  2894.07
+  /dev/sda5  lvm2 a-   15846.08       0 MjsnP7-GaGC-NIo7-tS3o-gf2t-di2R-eP3Au7 3778
+  /dev/sdb1  lvm2 a-    2466.25 2256.54 LNDa6y-PQGQ-gtnc-c7Wc-W2lS-Soaf-Bwu2Me  588
+  /dev/sdb2  lvm2 a-    2894.07 2894.07 xkxfmu-fQLt-DtKZ-YnkY-vwcj-JqC2-WmQddD  690
diff --git a/resources/lvm/linux/pvs/linux-2 b/resources/lvm/linux/pvs/linux-2
index eddce83..c83b312 100644
--- a/resources/lvm/linux/pvs/linux-2
+++ b/resources/lvm/linux/pvs/linux-2
@@ -1,3 +1,3 @@
-  /dev/sda2  vg00 lvm2 a--  311452.24 125694.90 CnCKHH-tnlS-BFL5-qRMa-HaV2-10zm-kNIpEp  9282 311452.24 OFXZR2-dEjD-qVIj-VJnw-1dQY-wC57-O1TABn
-  /dev/sdb2  vg00 lvm2 a--   58921.58  18119.39 XMzcNr-5qrL-pXk1-9Ycl-FyfN-nXPe-ndRvHF  1756  58921.58 OFXZR2-dEjD-qVIj-VJnw-1dQY-wC57-O1TABn
-  /dev/sdc1  vg00 lvm2 a--  500095.25 241323.47 GnT78t-kb92-k8di-1uUv-28HK-H6za-SXe2EZ 14904 500095.25 OFXZR2-dEjD-qVIj-VJnw-1dQY-wC57-O1TABn
+  /dev/sda2  lvm2 a--  311452.24 125694.90 CnCKHH-tnlS-BFL5-qRMa-HaV2-10zm-kNIpEp  9282 OFXZR2-dEjD-qVIj-VJnw-1dQY-wC57-O1TABn
+  /dev/sdb2  lvm2 a--   58921.58  18119.39 XMzcNr-5qrL-pXk1-9Ycl-FyfN-nXPe-ndRvHF  1756  OFXZR2-dEjD-qVIj-VJnw-1dQY-wC57-O1TABn
+  /dev/sdc1  lvm2 a--  500095.25 241323.47 GnT78t-kb92-k8di-1uUv-28HK-H6za-SXe2EZ 14904 OFXZR2-dEjD-qVIj-VJnw-1dQY-wC57-O1TABn
diff --git a/t/inventory/linux/lvm.t b/t/inventory/linux/lvm.t
index 3d6e1aa..4a3196d 100644
--- a/t/inventory/linux/lvm.t
+++ b/t/inventory/linux/lvm.t
@@ -146,6 +146,41 @@ my %pvs = (
             PV_UUID     => 'GnT78t-kb92-k8di-1uUv-28HK-H6za-SXe2EZ',
             VG_UUID     => 'OFXZR2-dEjD-qVIj-VJnw-1dQY-wC57-O1TABn'
         }
+    ],
+    'linux-3' => [
+        {
+            SIZE        => 53791,
+            FORMAT      => 'lvm2',
+            ATTR        => 'a-',
+            FREE        => 18694,
+            DEVICE      => '/dev/sda5',
+            PV_PE_COUNT => 12825,
+            VG_UUID     => '4D8fsm-J18u-IBB8-0TDT-tdIc-qDWr-COXhld',
+            PE_SIZE     => 4,
+            PV_UUID     => 'wDobJX-zfTq-A1Ka-70Nz-caiV-uNbt-QZEsKS'
+        },
+        {
+            SIZE        => 182087,
+            FORMAT      => 'lvm2',
+            ATTR        => 'a-',
+            FREE        => 0,
+            DEVICE      => '/dev/sdb',
+            PV_PE_COUNT => 43413,
+            VG_UUID     => '8VYDvK-WrSD-5v8m-UgyR-g7GR-V4hK-y7q2On',
+            PE_SIZE     => 4,
+            PV_UUID     => 'HIQlf6-bTeX-douO-zHZQ-U1SG-637I-tsaxwL'
+        },
+        {
+            SIZE        => 182087,
+            FORMAT      => 'lvm2',
+            ATTR        => 'a-',
+            FREE        => 4,
+            DEVICE      => '/dev/sdc',
+            PV_PE_COUNT => 43413,
+            VG_UUID     => '8VYDvK-WrSD-5v8m-UgyR-g7GR-V4hK-y7q2On',
+            PE_SIZE     => 4,
+            PV_UUID     => 'FyNUgz-K2Qs-q8vt-1yO4-3TQy-3z1H-Xg6B0r'
+        }
     ]
 );
 
@@ -193,7 +228,8 @@ plan tests =>
 
 foreach my $test (keys %pvs) {
     my @pvs = FusionInventory::Agent::Task::Inventory::Input::Linux::LVM::_getPhysicalVolumes(file => "resources/lvm/linux/pvs/$test");
-    is_deeply(\@pvs, $pvs{$test}, "physical volumes list: $test");
+    is_deeply(\@pvs, $pvs{$test}, "physical volumes list: $test") or print Dumper(\@pvs);
+    use Data::Dumper;
 }
 
 foreach my $test (keys %lvs) {


================================================================
  Commit: 50d0884512206e83a2f45cc2957f7f11129584dc
      https://github.com/fusinv/fusioninventory-agent/commit/50d0884512206e83a2f45cc2957f7f11129584dc
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-04-17 (Tue, 17 Apr 2012)

  Changed paths:
    A resources/lvm/linux/pvs/linux-3

  Log Message:
  -----------
  initial import


diff --git a/resources/lvm/linux/pvs/linux-3 b/resources/lvm/linux/pvs/linux-3
new file mode 100644
index 0000000..7e7689e
--- /dev/null
+++ b/resources/lvm/linux/pvs/linux-3
@@ -0,0 +1,3 @@
+  /dev/sda5  lvm2 a-    53791.95 18694.01 wDobJX-zfTq-A1Ka-70Nz-caiV-uNbt-QZEsKS 12825 4D8fsm-J18u-IBB8-0TDT-tdIc-qDWr-COXhld
+  /dev/sdb   lvm2 a-   182087.32        0 HIQlf6-bTeX-douO-zHZQ-U1SG-637I-tsaxwL 43413 8VYDvK-WrSD-5v8m-UgyR-g7GR-V4hK-y7q2On
+  /dev/sdc   lvm2 a-   182087.32     4.19 FyNUgz-K2Qs-q8vt-1yO4-3TQy-3z1H-Xg6B0r 43413 8VYDvK-WrSD-5v8m-UgyR-g7GR-V4hK-y7q2On


================================================================
  Commit: b96fced3473aaf10f83936239b800e50f20530e4
      https://github.com/fusinv/fusioninventory-agent/commit/b96fced3473aaf10f83936239b800e50f20530e4
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-04-17 (Tue, 17 Apr 2012)

  Changed paths:
    A resources/lvm/linux/vgs/linux-3
    M t/inventory/linux/lvm.t

  Log Message:
  -----------
  new test case


diff --git a/resources/lvm/linux/vgs/linux-3 b/resources/lvm/linux/vgs/linux-3
new file mode 100644
index 0000000..5a99b00
--- /dev/null
+++ b/resources/lvm/linux/vgs/linux-3
@@ -0,0 +1,2 @@
+  vg0    1   5   0 wz--n-  53791.95 18694.01 4D8fsm-J18u-IBB8-0TDT-tdIc-qDWr-COXhld 4.19
+  vg1    2   1   0 wz--n- 364174.64     4.19 8VYDvK-WrSD-5v8m-UgyR-g7GR-V4hK-y7q2On 4.19
diff --git a/t/inventory/linux/lvm.t b/t/inventory/linux/lvm.t
index 4a3196d..d259cab 100644
--- a/t/inventory/linux/lvm.t
+++ b/t/inventory/linux/lvm.t
@@ -218,6 +218,28 @@ my %vgs = (
             LV_COUNT       => '16',
             VG_EXTENT_SIZE => '33.55'
         }
+    ],
+    'linux-3' => [
+        {
+            SIZE           => 53791,
+            ATTR           => 'wz--n-',
+            VG_NAME        => 'vg0',
+            FREE           => 18694,
+            PV_COUNT       => '1',
+            VG_UUID        => '4D8fsm-J18u-IBB8-0TDT-tdIc-qDWr-COXhld',
+            LV_COUNT       => '5',
+            VG_EXTENT_SIZE => '4.19'
+        },
+        {
+            SIZE           => 364174,
+            ATTR           => 'wz--n-',
+            VG_NAME        => 'vg1',
+            FREE           => 4,
+            PV_COUNT       => '2',
+            VG_UUID        => '8VYDvK-WrSD-5v8m-UgyR-g7GR-V4hK-y7q2On',
+            LV_COUNT       => '1',
+            VG_EXTENT_SIZE => '4.19'
+        }
     ]
 );
 
@@ -228,8 +250,7 @@ plan tests =>
 
 foreach my $test (keys %pvs) {
     my @pvs = FusionInventory::Agent::Task::Inventory::Input::Linux::LVM::_getPhysicalVolumes(file => "resources/lvm/linux/pvs/$test");
-    is_deeply(\@pvs, $pvs{$test}, "physical volumes list: $test") or print Dumper(\@pvs);
-    use Data::Dumper;
+    is_deeply(\@pvs, $pvs{$test}, "physical volumes list: $test");
 }
 
 foreach my $test (keys %lvs) {


================================================================
  Commit: eebcdd1b17abf9796fc8021354f01fe8d18e80ab
      https://github.com/fusinv/fusioninventory-agent/commit/eebcdd1b17abf9796fc8021354f01fe8d18e80ab
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-04-17 (Tue, 17 Apr 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Linux/LVM.pm
    M resources/lvm/linux/vgs/README
    M resources/lvm/linux/vgs/linux-1
    M resources/lvm/linux/vgs/linux-2
    M resources/lvm/linux/vgs/linux-3

  Log Message:
  -----------
  use explicit fields list

This is safer than relying on default fields list
Reported-by: Remi Collet <Remi at FamilleCollet.com>


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/LVM.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/LVM.pm
index df917ca..d4bf1a8 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/LVM.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/LVM.pm
@@ -90,7 +90,7 @@ sub _getPhysicalVolumes {
 
 sub _getVolumeGroups {
     my (%params) = (
-        command => 'vgs --noheading --nosuffix --units M -o +vg_uuid,vg_extent_size',
+        command => 'vgs --noheading --nosuffix --units M -o vg_name,pv_count,lv_count,vg_attr,vg_size,vg_free,vg_uuid,vg_extent_size',
         @_
     );
 
@@ -105,11 +105,11 @@ sub _getVolumeGroups {
             VG_NAME        => $infos[1],
             PV_COUNT       => $infos[2],
             LV_COUNT       => $infos[3],
-            ATTR           => $infos[5],
-            SIZE           => int($infos[6]||0),
-            FREE           => int($infos[7]||0),
-            VG_UUID        => $infos[8],
-            VG_EXTENT_SIZE => $infos[9],
+            ATTR           => $infos[4],
+            SIZE           => int($infos[5]||0),
+            FREE           => int($infos[6]||0),
+            VG_UUID        => $infos[7],
+            VG_EXTENT_SIZE => $infos[8],
         };
     }
     close $handle;
diff --git a/resources/lvm/linux/vgs/README b/resources/lvm/linux/vgs/README
index dfee8f8..7e7f833 100644
--- a/resources/lvm/linux/vgs/README
+++ b/resources/lvm/linux/vgs/README
@@ -1 +1 @@
-vgs --noheading --nosuffix --units M -o +vg_uuid,vg_extent_size
+vgs --noheading --nosuffix --units M -o vg_name,pv_count,lv_count,vg_attr,vg_size,vg_free,vg_uuid,vg_extent_size
diff --git a/resources/lvm/linux/vgs/linux-1 b/resources/lvm/linux/vgs/linux-1
index ff5c9c2..680a04b 100644
--- a/resources/lvm/linux/vgs/linux-1
+++ b/resources/lvm/linux/vgs/linux-1
@@ -1,2 +1,2 @@
-  lvm    1   6   0 wz--n- 15846.08       0 Eubwcw-UFh2-P3Kn-aI6y-qcLT-VCzU-ls49ha 4.19
-  lvm2   2   2   0 wz--n-  5360.32 5150.61 ZHOqQg-SNQJ-a79U-Jfn1-Az84-e04w-d9zH23 4.19
+  lvm    1   6   wz--n- 15846.08       0 Eubwcw-UFh2-P3Kn-aI6y-qcLT-VCzU-ls49ha 4.19
+  lvm2   2   2   wz--n-  5360.32 5150.61 ZHOqQg-SNQJ-a79U-Jfn1-Az84-e04w-d9zH23 4.19
diff --git a/resources/lvm/linux/vgs/linux-2 b/resources/lvm/linux/vgs/linux-2
index 5f6c13c..519e05b 100644
--- a/resources/lvm/linux/vgs/linux-2
+++ b/resources/lvm/linux/vgs/linux-2
@@ -1 +1 @@
-  vg00   3  16   0 wz--n- 870469.07 385137.77 OFXZR2-dEjD-qVIj-VJnw-1dQY-wC57-O1TABn 33.55 CnCKHH-tnlS-BFL5-qRMa-HaV2-10zm-kNIpEp
+  vg00   3  16   wz--n- 870469.07 385137.77 OFXZR2-dEjD-qVIj-VJnw-1dQY-wC57-O1TABn 33.55
diff --git a/resources/lvm/linux/vgs/linux-3 b/resources/lvm/linux/vgs/linux-3
index 5a99b00..1afceae 100644
--- a/resources/lvm/linux/vgs/linux-3
+++ b/resources/lvm/linux/vgs/linux-3
@@ -1,2 +1,2 @@
-  vg0    1   5   0 wz--n-  53791.95 18694.01 4D8fsm-J18u-IBB8-0TDT-tdIc-qDWr-COXhld 4.19
-  vg1    2   1   0 wz--n- 364174.64     4.19 8VYDvK-WrSD-5v8m-UgyR-g7GR-V4hK-y7q2On 4.19
+  vg0    1   5 wz--n-  53791.95 18694.01 4D8fsm-J18u-IBB8-0TDT-tdIc-qDWr-COXhld 4.19
+  vg1    2   1 wz--n- 364174.64     4.19 8VYDvK-WrSD-5v8m-UgyR-g7GR-V4hK-y7q2On 4.19


================================================================
  Commit: 497291cf520727a0e7e14ff48eeaccb7f7937c0f
      https://github.com/fusinv/fusioninventory-agent/commit/497291cf520727a0e7e14ff48eeaccb7f7937c0f
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-04-17 (Tue, 17 Apr 2012)

  Changed paths:
    M share/html/now.tpl

  Log Message:
  -----------
  fix css path

Close: #1580
Reported-by: Remi Collet <Remi at FamilleCollet.com>


diff --git a/share/html/now.tpl b/share/html/now.tpl
index c9f1987..7068b05 100644
--- a/share/html/now.tpl
+++ b/share/html/now.tpl
@@ -3,7 +3,7 @@
 
 <meta content="text/html; charset=UTF-8" http-equiv="content-type" />
 <title>FusionInventory-Agent</title>
-<link rel="stylesheet" href="/files/site.css" type="text/css" />
+<link rel="stylesheet" href="site.css" type="text/css" />
 
 </head>
 <body>


================================================================
  Commit: 198a95575ecfe213ccef347a6a0fb455b0de60c3
      https://github.com/fusinv/fusioninventory-agent/commit/198a95575ecfe213ccef347a6a0fb455b0de60c3
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-04-17 (Tue, 17 Apr 2012)

  Changed paths:
    M Makefile.PL

  Log Message:
  -----------
  IO::Socket::SSL is mandatory for tests

Close: #1575


diff --git a/Makefile.PL b/Makefile.PL
index baf80b9..a5f7d41 100644
--- a/Makefile.PL
+++ b/Makefile.PL
@@ -40,6 +40,7 @@ if ($OSNAME ne 'MSWin32') {
 test_requires  'HTTP::Proxy'                  => undef;
 test_requires  'HTTP::Server::Simple'         => undef;
 test_requires  'HTTP::Server::Simple::Authen' => undef;
+test_requires  'IO::Socket::SSL'              => undef;
 test_requires  'IO::Capture::Stderr'          => undef;
 test_requires  'IPC::Run'                     => undef;
 test_requires  'Test::Exception'              => undef;


================================================================
  Commit: 93f53acad0fec68bba4b4ce5e90b34d1bf2ac0d5
      https://github.com/fusinv/fusioninventory-agent/commit/93f53acad0fec68bba4b4ce5e90b34d1bf2ac0d5
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-04-17 (Tue, 17 Apr 2012)

  Changed paths:
    A resources/generic/ifconfig/freebsd-bis

  Log Message:
  -----------
  initial import


diff --git a/resources/generic/ifconfig/freebsd-bis b/resources/generic/ifconfig/freebsd-bis
new file mode 100644
index 0000000..b870a0b
--- /dev/null
+++ b/resources/generic/ifconfig/freebsd-bis
@@ -0,0 +1,7 @@
+re0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
+        options=c01bb<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,JUMBO_MTU,VLAN_HWCSUM,TSO4,VLAN_HWTSO,LINKSTATE>
+        ether 00:ab:cd:ef:1a:00
+        inet 192.168.10.10 netmask 0xffffff00 broadcast 192.168.10.11
+        inet 192.168.10.11 netmask 0xffffffff broadcast 192.168.10.11
+        media: Ethernet autoselect (100baseTX <full-duplex>)
+        status: active


================================================================
  Commit: 3dba6e2274d2ec899e92649d731da25e7b8580c7
      https://github.com/fusinv/fusioninventory-agent/commit/3dba6e2274d2ec899e92649d731da25e7b8580c7
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-04-17 (Tue, 17 Apr 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Networks.pm
    M t/inventory/bsd/networks.t

  Log Message:
  -----------
  handle multiple addresses per interface

This allow to handle IPv6 addresses and  IPv4 aliases (bug #1565).
This make status management consistent with Linux code.

Close: #1565
Reported-by: Egor Morozov <akrus at flygroup.st>


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Networks.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Networks.pm
index 6e23255..b2f71e8 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Networks.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Networks.pm
@@ -66,42 +66,77 @@ sub _parseIfconfig {
     my $handle = getFileHandle(@_);
     return unless $handle;
 
-    my @interfaces;
-    my $interface;
+    my @interfaces; # global list of interfaces
+    my @addresses;  # per-interface list of addresses
+    my $interface;  # current interface
 
     while (my $line = <$handle>) {
-        if ($line =~ /^(\S+):/) {
-            # new interface
-            push @interfaces, $interface if $interface;
+        if ($line =~ /^(\S+): flags=\d+<([^>]+)> metric \d+ mtu (\d+)/) {
+
+            if (@addresses) {
+                push @interfaces, @addresses;
+                undef @addresses;
+            } else {
+                push @interfaces, $interface if $interface;
+            }
+
             $interface = {
-                STATUS      => 'Down',
-                DESCRIPTION => $1
+                DESCRIPTION => $1,
+                MTU         => $3
             };
-        }
+            my $flags = $2;
 
-        if ($line =~ /inet ($ip_address_pattern)/) {
-            $interface->{IPADDRESS} = $1;
-        }
-        if ($line =~ /netmask 0x($hex_ip_address_pattern)/) {
-            $interface->{IPMASK} = hex2canonical($1);
-        }
-        if ($line =~ /(?:address:|ether|lladdr) ($mac_address_pattern)/) {
+            foreach my $flag (split(/,/, $flags)) {
+                next unless $flag eq 'UP' || $flag eq 'DOWN';
+                $interface->{STATUS} = ucfirst(lc($flag));
+            }
+        } elsif ($line =~ /(?:address:|ether|lladdr) ($mac_address_pattern)/) {
             $interface->{MACADDR} = $1;
+
+        } elsif ($line =~ /inet ($ip_address_pattern) (?:--> $ip_address_pattern )?netmask 0x($hex_ip_address_pattern)/) {
+            my $address = $1;
+            my $mask    = hex2canonical($2);
+            my $subnet  = getSubnetAddress($address, $mask);
+
+            push @addresses, {
+                IPADDRESS   => $address,
+                IPMASK      => $mask,
+                IPSUBNET    => $subnet,
+                STATUS      => $interface->{STATUS},
+                DESCRIPTION => $interface->{DESCRIPTION},
+                MACADDR     => $interface->{MACADDR},
+                MTU         => $interface->{MTU}
+            };
+        } elsif ($line =~ /inet6 ([\w:]+)\S* prefixlen (\d+)/) {
+            my $address = $1;
+            my $mask    = getNetworkMaskIPv6($2);
+            my $subnet  = getSubnetAddressIPv6($address, $mask);
+
+            push @addresses, {
+                IPADDRESS6  => $address,
+                IPMASK6     => $mask,
+                IPSUBNET6   => $subnet,
+                STATUS      => $interface->{STATUS},
+                DESCRIPTION => $interface->{DESCRIPTION},
+                MACADDR     => $interface->{MACADDR},
+                MTU         => $interface->{MTU}
+            };
+
         }
-        if ($line =~ /mtu (\S+)/) {
-            $interface->{MTU} = $1;
-        }
+
         if ($line =~ /media (\S+)/) {
             $interface->{TYPE} = $1;
-        }
-        if ($line =~ /<UP/) {
-            $interface->{STATUS} = 'Up';
+            $_->{TYPE} = $1 foreach @addresses;
         }
     }
     close $handle;
 
     # last interface
-    push @interfaces, $interface if $interface;
+    if (@addresses) {
+        push @interfaces, @addresses;
+    } else {
+        push @interfaces, $interface if $interface;
+    }
 
     return @interfaces;
 }
diff --git a/t/inventory/bsd/networks.t b/t/inventory/bsd/networks.t
index 1e464bd..fc00c0a 100755
--- a/t/inventory/bsd/networks.t
+++ b/t/inventory/bsd/networks.t
@@ -10,88 +10,86 @@ use FusionInventory::Agent::Task::Inventory::Input::BSD::Networks;
 my %ifconfig_tests = (
     'freebsd-8.1' => [
         {
-            MTU         => '1500',
-            IPMASK      => '255.255.255.192',
-            MACADDR     => 'c8:0a:a9:3f:35:fa',
             DESCRIPTION => 're0',
             STATUS      => 'Up',
-            IPADDRESS   => '129.132.95.98'
+            MTU         => '1500',
+            MACADDR     => 'c8:0a:a9:3f:35:fa',
+            IPADDRESS   => '129.132.95.98',
+            IPMASK      => '255.255.255.192',
+            IPSUBNET    => '129.132.95.64',
         },
         {
+            DESCRIPTION => 'fwe0',
             MTU         => '1500',
             MACADDR     => '02:24:1b:9d:ca:01',
-            DESCRIPTION => 'fwe0',
-            STATUS      => 'Down'
         },
         {
-            MTU         => '1500',
             DESCRIPTION => 'fwip0',
-            STATUS      => 'Down'
+            MTU         => '1500',
         },
         {
-            MTU         => '16384',
-            IPMASK      => '255.0.0.0',
             DESCRIPTION => 'lo0',
+            MTU         => '16384',
             STATUS      => 'Up',
-            IPADDRESS   => '127.0.0.1'
+            MACADDR     => undef,
+            IPADDRESS6  => 'fe80::1',
+            IPMASK6     => 'ffff:ffff:ffff:ffff::',
+            IPSUBNET6   => 'fe80::',
         },
         {
-            MTU         => '1500',
-            MACADDR     => '0a:00:27:00:00:00',
-            DESCRIPTION => 'vboxnet0',
-            STATUS      => 'Down'
-        },
-        {
-            MTU         => '1500',
-            IPMASK      => '255.255.255.255',
-            DESCRIPTION => 'tun0',
-            STATUS      => 'Up',
-            IPADDRESS   => '192.168.200.6'
-        }
-    ],
-    'solaris-10' => [
-           {
-            MTU         => '8232',
             DESCRIPTION => 'lo0',
             STATUS      => 'Up',
-            IPADDRESS   => '127.0.0.1'
+            MTU         => '16384',
+            MACADDR     => undef,
+            IPADDRESS6  => '::1',
+            IPMASK6     => 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff',
+            IPSUBNET6   => '::1',
         },
         {
-            MTU         => '1500',
-            DESCRIPTION => 'aggr1',
+            DESCRIPTION => 'lo0',
             STATUS      => 'Up',
-            IPADDRESS   => '130.79.0.1'
+            MTU         => '16384',
+            MACADDR     => undef,
+            IPADDRESS   => '127.0.0.1',
+            IPSUBNET    => '127.0.0.0',
+            IPMASK      => '255.0.0.0',
         },
         {
+            DESCRIPTION => 'vboxnet0',
             MTU         => '1500',
-            DESCRIPTION => 'e1000g0',
-            STATUS      => 'Up',
-            IPADDRESS   => '130.79.0.2'
+            MACADDR     => '0a:00:27:00:00:00',
         },
         {
-            MTU         => '1500',
-            DESCRIPTION => 'e1000g2',
+            DESCRIPTION => 'tun0',
             STATUS      => 'Up',
-            IPADDRESS   => '130.79.0.3'
-        },
-        {
             MTU         => '1500',
-            DESCRIPTION => 'e1000g3',
-            STATUS      => 'Up',
-            IPADDRESS   => '192.168.19.1'
-        },
+            MACADDR     => undef,
+            IPADDRESS   => '192.168.200.6',
+            IPSUBNET    => '192.168.200.6',
+            IPMASK      => '255.255.255.255',
+        }
+    ],
+    'freebsd-bis' => [
         {
-            MTU         => '1500',
-            DESCRIPTION => 'e1000g4',
+            DESCRIPTION => 're0',
             STATUS      => 'Up',
-            IPADDRESS   => '130.79.255.1'
+            MTU         => '1500',
+            MACADDR     => '00:ab:cd:ef:1a:00',
+            IPADDRESS   => '192.168.10.10',
+            IPMASK      => '255.255.255.0',
+            IPSUBNET    => '192.168.10.0',
+
         },
         {
-            MTU         => '1500',
-            DESCRIPTION => 'igb0',
+            DESCRIPTION => 're0',
             STATUS      => 'Up',
-            IPADDRESS   => '192.168.20.1'
-        } 
+            MTU         => '1500',
+            MACADDR     => '00:ab:cd:ef:1a:00',
+            IPADDRESS   => '192.168.10.11',
+            IPMASK      => '255.255.255.255',
+            IPSUBNET    => '192.168.10.11',
+
+        }
     ]
 );
 


================================================================
  Commit: 022ad0fa128fea503ae5383a6cecd48526f1e58a
      https://github.com/fusinv/fusioninventory-agent/commit/022ad0fa128fea503ae5383a6cecd48526f1e58a
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-04-18 (Wed, 18 Apr 2012)

  Changed paths:
    M resources/generic/ifconfig/freebsd-bis
    M t/inventory/bsd/networks.t

  Log Message:
  -----------
  use an actual ifconfig sample


diff --git a/resources/generic/ifconfig/freebsd-bis b/resources/generic/ifconfig/freebsd-bis
index b870a0b..385606c 100644
--- a/resources/generic/ifconfig/freebsd-bis
+++ b/resources/generic/ifconfig/freebsd-bis
@@ -1,7 +1,20 @@
-re0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
-        options=c01bb<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,JUMBO_MTU,VLAN_HWCSUM,TSO4,VLAN_HWTSO,LINKSTATE>
-        ether 00:ab:cd:ef:1a:00
-        inet 192.168.10.10 netmask 0xffffff00 broadcast 192.168.10.11
-        inet 192.168.10.11 netmask 0xffffffff broadcast 192.168.10.11
-        media: Ethernet autoselect (100baseTX <full-duplex>)
+bce0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
+        options=19b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,TSO4>
+        ether 00:16:18:87:ca:b5
+        inet 11.105.11.105 netmask 0xffffffc0 broadcast 11.105.11.127
+        inet 11.105.11.110 netmask 0xffffffff broadcast 11.105.11.110
+        inet 11.105.11.111 netmask 0xffffffff broadcast 11.105.11.111
+        media: Ethernet autoselect (1000baseT <full-duplex>)
         status: active
+bce1: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
+        options=19b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,TSO4>
+        ether 00:16:18:87:ca:b6
+        inet 192.168.12.105 netmask 0xffffff00 broadcast 192.168.12.255
+        media: Ethernet autoselect (1000baseT <full-duplex>)
+        status: active
+lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
+        options=3<RXCSUM,TXCSUM>
+        inet6 fe80::1%lo0 prefixlen 64 scopeid 0x3 
+        inet6 ::1 prefixlen 128 
+        inet 127.0.0.1 netmask 0xff000000 
+        nd6 options=3<PERFORMNUD,ACCEPT_RTADV>
diff --git a/t/inventory/bsd/networks.t b/t/inventory/bsd/networks.t
index fc00c0a..725cfa3 100755
--- a/t/inventory/bsd/networks.t
+++ b/t/inventory/bsd/networks.t
@@ -71,23 +71,73 @@ my %ifconfig_tests = (
     ],
     'freebsd-bis' => [
         {
-            DESCRIPTION => 're0',
+            DESCRIPTION => 'bce0',
             STATUS      => 'Up',
             MTU         => '1500',
-            MACADDR     => '00:ab:cd:ef:1a:00',
-            IPADDRESS   => '192.168.10.10',
-            IPMASK      => '255.255.255.0',
-            IPSUBNET    => '192.168.10.0',
+            MACADDR     => '00:16:18:87:ca:b5',
+            IPADDRESS   => '11.105.11.105',
+            IPMASK      => '255.255.255.192',
+            IPSUBNET    => '11.105.11.64',
 
         },
         {
-            DESCRIPTION => 're0',
+            DESCRIPTION => 'bce0',
             STATUS      => 'Up',
             MTU         => '1500',
-            MACADDR     => '00:ab:cd:ef:1a:00',
-            IPADDRESS   => '192.168.10.11',
+            MACADDR     => '00:16:18:87:ca:b5',
+            IPADDRESS   => '11.105.11.110',
             IPMASK      => '255.255.255.255',
-            IPSUBNET    => '192.168.10.11',
+            IPSUBNET    => '11.105.11.110',
+
+        },
+        {
+            DESCRIPTION => 'bce0',
+            STATUS      => 'Up',
+            MTU         => '1500',
+            MACADDR     => '00:16:18:87:ca:b5',
+            IPADDRESS   => '11.105.11.111',
+            IPMASK      => '255.255.255.255',
+            IPSUBNET    => '11.105.11.111',
+
+        },
+        {
+            DESCRIPTION => 'bce1',
+            STATUS      => 'Up',
+            MTU         => '1500',
+            MACADDR     => '00:16:18:87:ca:b6',
+            IPADDRESS   => '192.168.12.105',
+            IPMASK      => '255.255.255.0',
+            IPSUBNET    => '192.168.12.0'
+
+        },
+        {
+            DESCRIPTION => 'lo0',
+            STATUS      => 'Up',
+            MTU         => '16384',
+            MACADDR     => undef,
+            IPADDRESS6  => 'fe80::1',
+            IPMASK6     => 'ffff:ffff:ffff:ffff::',
+            IPSUBNET6   => 'fe80::'
+
+        },
+        {
+            DESCRIPTION => 'lo0',
+            STATUS      => 'Up',
+            MTU         => '16384',
+            MACADDR     => undef,
+            IPADDRESS6  => '::1',
+            IPMASK6     => 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff',
+            IPSUBNET6   => '::1'
+
+        },
+        {
+            DESCRIPTION => 'lo0',
+            STATUS      => 'Up',
+            MTU         => '16384',
+            MACADDR     => undef,
+            IPADDRESS   => '127.0.0.1',
+            IPMASK      => '255.0.0.0',
+            IPSUBNET    => '127.0.0.0'
 
         }
     ]


================================================================
  Commit: 8b0bd2c1b17fc49d26ceb5c8eb44a478e15a5bc8
      https://github.com/fusinv/fusioninventory-agent/commit/8b0bd2c1b17fc49d26ceb5c8eb44a478e15a5bc8
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-04-18 (Wed, 18 Apr 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Networks.pm
    M t/inventory/bsd/networks.t

  Log Message:
  -----------
  fix type parsing


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Networks.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Networks.pm
index b2f71e8..6ed965c 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Networks.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD/Networks.pm
@@ -124,7 +124,7 @@ sub _parseIfconfig {
 
         }
 
-        if ($line =~ /media (\S+)/) {
+        if ($line =~ /media: (\S+)/) {
             $interface->{TYPE} = $1;
             $_->{TYPE} = $1 foreach @addresses;
         }
diff --git a/t/inventory/bsd/networks.t b/t/inventory/bsd/networks.t
index 725cfa3..a3ae5a3 100755
--- a/t/inventory/bsd/networks.t
+++ b/t/inventory/bsd/networks.t
@@ -13,6 +13,7 @@ my %ifconfig_tests = (
             DESCRIPTION => 're0',
             STATUS      => 'Up',
             MTU         => '1500',
+            TYPE        => 'Ethernet',
             MACADDR     => 'c8:0a:a9:3f:35:fa',
             IPADDRESS   => '129.132.95.98',
             IPMASK      => '255.255.255.192',
@@ -74,6 +75,7 @@ my %ifconfig_tests = (
             DESCRIPTION => 'bce0',
             STATUS      => 'Up',
             MTU         => '1500',
+            TYPE        => 'Ethernet',
             MACADDR     => '00:16:18:87:ca:b5',
             IPADDRESS   => '11.105.11.105',
             IPMASK      => '255.255.255.192',
@@ -84,6 +86,7 @@ my %ifconfig_tests = (
             DESCRIPTION => 'bce0',
             STATUS      => 'Up',
             MTU         => '1500',
+            TYPE        => 'Ethernet',
             MACADDR     => '00:16:18:87:ca:b5',
             IPADDRESS   => '11.105.11.110',
             IPMASK      => '255.255.255.255',
@@ -94,6 +97,7 @@ my %ifconfig_tests = (
             DESCRIPTION => 'bce0',
             STATUS      => 'Up',
             MTU         => '1500',
+            TYPE        => 'Ethernet',
             MACADDR     => '00:16:18:87:ca:b5',
             IPADDRESS   => '11.105.11.111',
             IPMASK      => '255.255.255.255',
@@ -104,6 +108,7 @@ my %ifconfig_tests = (
             DESCRIPTION => 'bce1',
             STATUS      => 'Up',
             MTU         => '1500',
+            TYPE        => 'Ethernet',
             MACADDR     => '00:16:18:87:ca:b6',
             IPADDRESS   => '192.168.12.105',
             IPMASK      => '255.255.255.0',


================================================================
  Commit: 142619796e9c249aa9960706a4962ef281bb42c1
      https://github.com/fusinv/fusioninventory-agent/commit/142619796e9c249aa9960706a4962ef281bb42c1
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-04-18 (Wed, 18 Apr 2012)

  Changed paths:
    A resources/linux/proc/cpuinfo/linux-armel-2
    M t/inventory/linux/cpu.t

  Log Message:
  -----------
  new test sample


diff --git a/resources/linux/proc/cpuinfo/linux-armel-2 b/resources/linux/proc/cpuinfo/linux-armel-2
new file mode 100644
index 0000000..53128ef
--- /dev/null
+++ b/resources/linux/proc/cpuinfo/linux-armel-2
@@ -0,0 +1,12 @@
+Processor	: Feroceon 88FR131 rev 1 (v5l)
+BogoMIPS	: 1192.75
+Features	: swp half thumb fastmult edsp 
+CPU implementer	: 0x56
+CPU architecture: 5TE
+CPU variant	: 0x2
+CPU part	: 0x131
+CPU revision	: 1
+
+Hardware	: Marvell SheevaPlug Reference Board
+Revision	: 0000
+Serial		: 0000000000000000
diff --git a/t/inventory/linux/cpu.t b/t/inventory/linux/cpu.t
index 4493dd3..a82dd7c 100755
--- a/t/inventory/linux/cpu.t
+++ b/t/inventory/linux/cpu.t
@@ -221,6 +221,12 @@ my %arm = (
             ARCH => 'ARM',
             TYPE => 'XScale-80219 rev 0 (v5l)'
         }
+    ],
+    'linux-armel-2' => [
+        {
+            ARCH => 'ARM',
+            TYPE => 'Feroceon 88FR131 rev 1 (v5l)'
+        }
     ]
 );
 
@@ -303,7 +309,8 @@ foreach my $test (keys %mips) {
 foreach my $test (keys %arm) {
     my $file = "resources/linux/proc/cpuinfo/$test";
     my @cpus = FusionInventory::Agent::Task::Inventory::Input::Linux::Archs::ARM::_getCPUsFromProc(file => $file);
-    is_deeply(\@cpus, $arm{$test}, $test);
+    is_deeply(\@cpus, $arm{$test}, $test) or print Dumper(\@cpus);
+    use Data::Dumper;
 }
 
 foreach my $test (keys %ppc) {


================================================================
  Commit: 16faee5570b4ea78a3bb3d263f485b55e81cd6d1
      https://github.com/fusinv/fusioninventory-agent/commit/16faee5570b4ea78a3bb3d263f485b55e81cd6d1
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-04-18 (Wed, 18 Apr 2012)

  Changed paths:
    M t/inventory/linux/cpu.t

  Log Message:
  -----------
  fix expected results


diff --git a/t/inventory/linux/cpu.t b/t/inventory/linux/cpu.t
index a82dd7c..40a05f0 100755
--- a/t/inventory/linux/cpu.t
+++ b/t/inventory/linux/cpu.t
@@ -205,11 +205,11 @@ my %alpha = (
 my %sparc = (
     'linux-sparc-1' => [
         {
-            ARCH => 'ARM',
+            ARCH => 'SPARC',
             TYPE => 'TI UltraSparc IIIi (Jalapeno)'
         },
         {
-            ARCH => 'ARM',
+            ARCH => 'SPARC',
             TYPE => 'TI UltraSparc IIIi (Jalapeno)'
         }
     ]


================================================================
  Commit: fa97310708e6d86b02848ef0f66581d667ecdcb2
      https://github.com/fusinv/fusioninventory-agent/commit/fa97310708e6d86b02848ef0f66581d667ecdcb2
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-04-18 (Wed, 18 Apr 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Archs/ARM.pm
    M t/inventory/linux/cpu.t

  Log Message:
  -----------
  add processor speed


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Archs/ARM.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Archs/ARM.pm
index 46a1ee3..b90361b 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Archs/ARM.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Archs/ARM.pm
@@ -34,8 +34,9 @@ sub _getCPUsFromProc {
 
     foreach my $cpu (getCPUsFromProc(@_)) {
         push @cpus, {
-            ARCH => 'ARM',
-            TYPE => $cpu->{processor}
+            ARCH  => 'ARM',
+            TYPE  => $cpu->{processor},
+            SPEED => $cpu->{bogomips}
         };
     }
 
diff --git a/t/inventory/linux/cpu.t b/t/inventory/linux/cpu.t
index 40a05f0..807b595 100755
--- a/t/inventory/linux/cpu.t
+++ b/t/inventory/linux/cpu.t
@@ -218,14 +218,16 @@ my %sparc = (
 my %arm = (
     'linux-armel-1' => [
         {
-            ARCH => 'ARM',
-            TYPE => 'XScale-80219 rev 0 (v5l)'
+            ARCH  => 'ARM',
+            SPEED => '593.10',
+            TYPE  => 'XScale-80219 rev 0 (v5l)'
         }
     ],
     'linux-armel-2' => [
         {
-            ARCH => 'ARM',
-            TYPE => 'Feroceon 88FR131 rev 1 (v5l)'
+            ARCH  => 'ARM',
+            SPEED => '1192.75',
+            TYPE  => 'Feroceon 88FR131 rev 1 (v5l)'
         }
     ]
 );


================================================================
  Commit: ffde6ef269ce2c028fbe7a872d3cd0e59967acfd
      https://github.com/fusinv/fusioninventory-agent/commit/ffde6ef269ce2c028fbe7a872d3cd0e59967acfd
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-04-18 (Wed, 18 Apr 2012)

  Changed paths:
    A resources/win32/registry/xp-uninstall.reg
    A t/inventory/windows/softwares.t

  Log Message:
  -----------
  initial import


diff --git a/resources/win32/registry/xp-uninstall.reg b/resources/win32/registry/xp-uninstall.reg
new file mode 100644
index 0000000..f23ea61
Binary files /dev/null and b/resources/win32/registry/xp-uninstall.reg differ
diff --git a/t/inventory/windows/softwares.t b/t/inventory/windows/softwares.t
new file mode 100755
index 0000000..a5165d0
--- /dev/null
+++ b/t/inventory/windows/softwares.t
@@ -0,0 +1,7107 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+#use utf8;
+use lib 't';
+
+use Encode;
+use English qw(-no_match_vars);
+use Test::More;
+use Test::MockModule;
+
+use FusionInventory::Test::Utils;
+
+BEGIN {
+    # use mock modules for non-available ones
+    push @INC, 't/fake/windows' if $OSNAME ne 'MSWin32';
+}
+
+use FusionInventory::Agent::Task::Inventory::Input::Win32::Softwares;
+
+my %tests = (
+    xp => [
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB977914)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '15/02/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'KB977914',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=977914',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Kay Bruns',
+            NAME             => 'Super User Run (SuRun)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => undef,
+            GUID             => 'SuRun',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => 'http://kay-bruns.de/surun',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1.2.0.8',
+            UNINSTALL_STRING => 'C:\\\\WINDOWS\\\\SuRun.exe /UNINSTALL',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB2641653)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '16/03/2012',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2641653',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2641653',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft',
+            NAME             => 'Update for Microsoft Office 2010 (KB2553310) 32-Bit Edition',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => 0,
+            GUID             => '{90140000-006E-0409-0000-0000000FF1CE}_Office14.PROPLUS_{73E67A3A-8D61-44EF-90C2-1697C3DBE668}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://support.microsoft.com/kb/2553310',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com/kb/2553310',
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft',
+            NAME             => 'Microsoft Office 2010 Service Pack 1 (SP1)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => 0,
+            GUID             => '{90140000-0044-0409-0000-0000000FF1CE}_Office14.PROPLUS_{6BD185A0-E67F-4F77-8BCD-E34EA6AE76DF}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://support.microsoft.com/kb/2460049',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com/kb/2460049',
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Microsoft Office InfoPath MUI (English) 2010',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '04/10/2011',
+            NO_REMOVE        => undef,
+            GUID             => '{90140000-0044-0409-0000-0000000FF1CE}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => undef,
+            VERSION_MAJOR    => undef,
+            VERSION          => '14.0.6029.1000',
+            UNINSTALL_STRING => undef,
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Update for Windows XP (KB2141007)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '20/09/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2141007',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2141007',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Microsoft .NET Framework 4 Client Profile (KB2518870)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => undef,
+            GUID             => '{3C3901C5-3455-3E0A-A214-0B093A5070A6}.KB2518870',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com/kb/2518870',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => 'C:\\\\windows\\\\Microsoft.NET\\\\Framework\\\\v4.0.30319\\\\SetupCache\\\\Client\\\\setup.exe /uninstallpatch {2CE2EB39-45C8-32D4-8A99-5529C38F1B99} /parameterfolder Client',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB2508272)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '18/04/2011',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2508272',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2508272',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Microsoft Office Access MUI (English) 2010',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '04/10/2011',
+            NO_REMOVE        => undef,
+            GUID             => '{90140000-0015-0409-0000-0000000FF1CE}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => undef,
+            VERSION_MAJOR    => undef,
+            VERSION          => '14.0.6029.1000',
+            UNINSTALL_STRING => undef,
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB2506223)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '18/04/2011',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2506223',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2506223',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'O&O Software GmbH',
+            NAME             => 'O&O DiskStat Workstation',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '23/02/2011',
+            NO_REMOVE        => undef,
+            GUID             => '{754F24D0-D2FF-4801-B7ED-588D4E88415B}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => 'http://www.oo-software.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '2.0.386',
+            UNINSTALL_STRING => undef,
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Update for Windows XP (KB973687)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '14/12/2009',
+            NO_REMOVE        => undef,
+            GUID             => 'KB973687',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=973687',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB2115168)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '16/08/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2115168',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2115168',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB950582)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '01/11/2008',
+            NO_REMOVE        => undef,
+            GUID             => 'KB950582',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=950582',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Update for Windows XP (KB951072-v2)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '09/07/2008',
+            NO_REMOVE        => undef,
+            GUID             => 'KB951072-v2',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=951072',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '2',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows Media Player (KB954155)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '09/11/2009',
+            NO_REMOVE        => undef,
+            GUID             => 'KB954155_WM9',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://support.microsoft.com/?kbid=954155',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB2618451)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '20/12/2011',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2618451',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2618451',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Microsoft .NET Framework 4 Extended (KB2656351)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => undef,
+            GUID             => '{0A0CADCF-78DA-33C4-A350-CD51849B9702}.KB2656351',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com/kb/2656351',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => 'c:\\\\windows\\\\Microsoft.NET\\\\Framework\\\\v4.0.30319\\\\SetupCache\\\\Extended\\\\setup.exe /uninstallpatch {4952F442-5C1A-38EB-8C23-B18EFE77E20C} /parameterfolder Extended',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows Internet Explorer 8 (KB982381)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '14/06/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'KB982381-IE8',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=982381',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB971557)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '03/09/2009',
+            NO_REMOVE        => undef,
+            GUID             => 'KB971557',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=971557',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB923561)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '18/05/2009',
+            NO_REMOVE        => undef,
+            GUID             => 'KB923561',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=923561',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Update for Windows XP (KB2345886)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '18/10/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2345886',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2345886',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB978706)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '15/02/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'KB978706',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=978706',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Hotfix for Windows XP (KB954550-v5)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '02/04/2009',
+            NO_REMOVE        => 1,
+            GUID             => 'KB954550-v5',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Hotfix',
+            HELPLINK         => 'http://support.microsoft.com?kbid=954550',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '5',
+            UNINSTALL_STRING => undef,
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB2478971)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '14/02/2011',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2478971',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2478971',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB960803)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '18/05/2009',
+            NO_REMOVE        => undef,
+            GUID             => 'KB960803',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=960803',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Symantec Corporation',
+            NAME             => 'Symantec Endpoint Protection',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '25/01/2012',
+            NO_REMOVE        => undef,
+            GUID             => '{FA689023-0B72-4771-98A6-A1C927E58207}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => undef,
+            VERSION_MAJOR    => undef,
+            VERSION          => '12.1.1000.157',
+            UNINSTALL_STRING => undef,
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => undef,
+            NAME             => 'Microsoft .NET Framework 1.1 Security Update (KB2656370)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => undef,
+            GUID             => 'M2656370',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => undef,
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB2624667)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '20/12/2011',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2624667',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2624667',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB2296011)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '18/10/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2296011',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2296011',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows Media Player (KB978695)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '14/06/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'KB978695_WM9',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://support.microsoft.com/?kbid=978695',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB2544893)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '21/06/2011',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2544893',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2544893',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Microsoft .NET Framework 3.5 SP1',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '03/01/2012',
+            NO_REMOVE        => undef,
+            GUID             => '{CE2CDD62-0124-36CA-84D3-9F4DCF5C5BD9}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => undef,
+            VERSION_MAJOR    => undef,
+            VERSION          => '3.5.30729',
+            UNINSTALL_STRING => undef,
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Microsoft .NET Framework 4 Client Profile (KB2446708)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => undef,
+            GUID             => '{3C3901C5-3455-3E0A-A214-0B093A5070A6}.KB2446708',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com/kb/2446708',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => 'C:\\\\windows\\\\Microsoft.NET\\\\Framework\\\\v4.0.30319\\\\SetupCache\\\\Client\\\\setup.exe /uninstallpatch {3E0806DB-3085-378A-840A-F0D3AE3609D1} /parameterfolder Client',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Hotfix for Windows XP (KB2570791)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '04/10/2011',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2570791',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Hotfix',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2570791',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB951376-v2)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '09/07/2008',
+            NO_REMOVE        => 1,
+            GUID             => 'KB951376-v2',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=951376',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '2',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Microsoft Office Shared Setup Metadata MUI (English) 2010',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '04/10/2011',
+            NO_REMOVE        => undef,
+            GUID             => '{90140000-0115-0409-0000-0000000FF1CE}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => undef,
+            VERSION_MAJOR    => undef,
+            VERSION          => '14.0.6029.1000',
+            UNINSTALL_STRING => undef,
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft',
+            NAME             => 'Microsoft Office 2010 Service Pack 1 (SP1)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => 0,
+            GUID             => '{90140000-001A-0409-0000-0000000FF1CE}_Office14.PROPLUS_{6BD185A0-E67F-4F77-8BCD-E34EA6AE76DF}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://support.microsoft.com/kb/2460049',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com/kb/2460049',
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows Internet Explorer 8 (KB2183461)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '16/08/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2183461-IE8',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2183461',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB2555917)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '19/07/2011',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2555917',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2555917',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'LogMeIn Inc.',
+            NAME             => 'Network Console',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '15/10/2010',
+            NO_REMOVE        => 1,
+            GUID             => '{5B21BB9A-E23E-472b-AD2A-FB9B06A4727C}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => 'http://www.logmein.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '9.00.175',
+            UNINSTALL_STRING => undef,
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB958215)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '15/01/2009',
+            NO_REMOVE        => undef,
+            GUID             => 'KB958215',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=958215',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Microsoft Office Outlook MUI (English) 2010',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '17/04/2012',
+            NO_REMOVE        => undef,
+            GUID             => '{90140000-001A-0409-0000-0000000FF1CE}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => undef,
+            VERSION_MAJOR    => undef,
+            VERSION          => '14.0.6029.1000',
+            UNINSTALL_STRING => undef,
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft',
+            NAME             => 'Update for Microsoft Office 2010 (KB2553385) 32-Bit Edition',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => 0,
+            GUID             => '{90140000-0011-0000-0000-0000000FF1CE}_Office14.PROPLUS_{28FAC187-7C0E-413A-B90A-76F19D0FBF30}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://support.microsoft.com/kb/2553385',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com/kb/2553385',
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB2567680)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '16/08/2011',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2567680',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2567680',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Microsoft Office Professional Plus 2010',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '17/04/2012',
+            NO_REMOVE        => undef,
+            GUID             => '{90140000-0011-0000-0000-0000000FF1CE}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => undef,
+            VERSION_MAJOR    => undef,
+            VERSION          => '14.0.6029.1000',
+            UNINSTALL_STRING => undef,
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Step By Step Interactive Training (KB923723)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '23/08/2007',
+            NO_REMOVE        => undef,
+            GUID             => 'KB923723',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://support.microsoft.com/kb/923723',
+            URL_INFO_ABOUT   => undef,
+            VERSION_MAJOR    => undef,
+            VERSION          => '20050502.101010',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows Internet Explorer 8 (KB2360131)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '18/10/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2360131-IE8',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2360131',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Adobe Systems Incorporated',
+            NAME             => 'Adobe Reader X (10.1.2)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => '   ',
+            INSTALLDATE      => '09/02/2012',
+            NO_REMOVE        => undef,
+            GUID             => '{AC76BA86-7AD7-1033-7B44-AA1000000001}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => 'http://www.adobe.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '10.1.2',
+            UNINSTALL_STRING => undef,
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows Internet Explorer 8 (KB971961)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '10/11/2009',
+            NO_REMOVE        => undef,
+            GUID             => 'KB971961-IE8',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=971961',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB960225)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '02/04/2009',
+            NO_REMOVE        => undef,
+            GUID             => 'KB960225',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=960225',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB2229593)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '19/07/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2229593',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2229593',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows Internet Explorer 8 (KB974455)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '09/11/2009',
+            NO_REMOVE        => undef,
+            GUID             => 'KB974455-IE8',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=974455',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB2507618)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '18/04/2011',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2507618',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2507618',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Microsoft .NET Framework 4 Client Profile (KB2539636)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => undef,
+            GUID             => '{3C3901C5-3455-3E0A-A214-0B093A5070A6}.KB2539636',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com/kb/2539636',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => 'C:\\\\windows\\\\Microsoft.NET\\\\Framework\\\\v4.0.30319\\\\SetupCache\\\\Client\\\\setup.exe /uninstallpatch {7E97AB83-C1FE-38DE-B848-877E0A4BD81E} /parameterfolder Client',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows Internet Explorer 8 (KB981332)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '19/04/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'KB981332-IE8',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=981332',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB980232)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '19/04/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'KB980232',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=980232',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB2393802)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '14/02/2011',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2393802',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2393802',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB2485663)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '18/04/2011',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2485663',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2485663',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB2286198)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '09/08/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2286198',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2286198',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB974318)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '14/12/2009',
+            NO_REMOVE        => undef,
+            GUID             => 'KB974318',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=974318',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB974571)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '09/11/2009',
+            NO_REMOVE        => undef,
+            GUID             => 'KB974571',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=974571',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB978037)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '15/02/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'KB978037',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=978037',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => undef,
+            NAME             => 'OSSEC HIDS 2.5.1',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => undef,
+            GUID             => 'OSSEC',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://www.ossec.net/main/support/',
+            URL_INFO_ABOUT   => 'http://www.ossec.net',
+            VERSION_MAJOR    => undef,
+            VERSION          => '2.5.1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB951748)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '09/07/2008',
+            NO_REMOVE        => 1,
+            GUID             => 'KB951748',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=951748',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows Media Player (KB911564)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '05/04/2006',
+            NO_REMOVE        => undef,
+            GUID             => 'KB911564',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://support.microsoft.com/?kbid=911564',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => undef,
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Sun Microsystems, Inc.',
+            NAME             => 'Java Auto Updater',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '20/02/2012',
+            NO_REMOVE        => 1,
+            GUID             => '{4A03706F-666A-4037-7777-5F2748764D10}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => undef,
+            VERSION_MAJOR    => undef,
+            VERSION          => '2.0.7.1',
+            UNINSTALL_STRING => undef,
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB2660465)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '21/02/2012',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2660465',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2660465',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows Media Player 6.4 (KB925398)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '13/12/2006',
+            NO_REMOVE        => undef,
+            GUID             => 'KB925398_WMP64',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com/?kbid=925398',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => undef,
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB956844)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '09/11/2009',
+            NO_REMOVE        => undef,
+            GUID             => 'KB956844',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=956844',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB2483614)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '28/03/2011',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2483614',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2483614',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Update for Microsoft .NET Framework 3.5 SP1 (KB963707)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => undef,
+            GUID             => '{CE2CDD62-0124-36CA-84D3-9F4DCF5C5BD9}.KB963707',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Update',
+            HELPLINK         => 'http://support.microsoft.com/kb/963707',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => 'C:\\\\WINDOWS\\\\system32\\\\msiexec.exe /package {CE2CDD62-0124-36CA-84D3-9F4DCF5C5BD9} /uninstall {B2AE9C82-DC7B-3641-BFC8-87275C4F3607} /qb+ REBOOTPROMPT=\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB954600)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '15/01/2009',
+            NO_REMOVE        => undef,
+            GUID             => 'KB954600',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=954600',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB978251)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '15/02/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'KB978251',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=978251',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => undef,
+            NAME             => 'Microsoft .NET Framework 1.1',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => undef,
+            GUID             => 'Microsoft .NET Framework 1.1  (1033)',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => undef,
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => 'msiexec.exe /X {CB2F7EDD-9D1F-43C1-90FC-4F52EAE172A1}',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft',
+            NAME             => 'Update for Microsoft Excel 2010 (KB2553439) 32-Bit Edition',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => 0,
+            GUID             => '{90140000-0011-0000-0000-0000000FF1CE}_Office14.PROPLUS_{3D1F379C-AA64-4823-90A4-A8DDD4B48C21}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://support.microsoft.com/kb/2553439',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com/kb/2553439',
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'WebFldrs XP',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '05/04/2006',
+            NO_REMOVE        => 1,
+            GUID             => '{350C97B0-3D7C-4EE8-BAA9-00BCB3D54227}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => undef,
+            VERSION_MAJOR    => undef,
+            VERSION          => '9.50.7523',
+            UNINSTALL_STRING => undef,
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft',
+            NAME             => 'Update for Microsoft Outlook Social Connector 2010 (KB2553406) 32-Bit Edition',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => 0,
+            GUID             => '{90140000-001A-0409-0000-0000000FF1CE}_Office14.PROPLUS_{1EEFF749-6F29-4F0B-AB08-4C6EA52AA110}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://support.microsoft.com/kb/2553406',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com/kb/2553406',
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft',
+            NAME             => 'Update for Microsoft Office 2010 (KB2553267) 32-Bit Edition',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => 0,
+            GUID             => '{90140000-0011-0000-0000-0000000FF1CE}_Office14.PROPLUS_{18B3CF2A-73F7-4716-B1AE-86D68726D408}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://support.microsoft.com/kb/2553267',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com/kb/2553267',
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Update for Windows Internet Explorer 8 (KB2447568)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '28/03/2011',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2447568-IE8',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2447568',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB2639417)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '20/12/2011',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2639417',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2639417',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'ScriptLogic Corporation',
+            NAME             => 'Privilege Authority Client',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '09/02/2012',
+            NO_REMOVE        => undef,
+            GUID             => '{41BDFA12-0E3D-4AA4-ACBC-CF64E1AE18FF}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => 'http://www.scriptlogic.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '2.7.1.80',
+            UNINSTALL_STRING => undef,
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Proxy Networks, Inc.',
+            NAME             => 'PROXY Pro Master',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '11/12/2009',
+            NO_REMOVE        => undef,
+            GUID             => '{1AE60321-BFC1-43F3-95D6-B03C420AF04D}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => 'http://www.proxynetworks.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '7.0.1515',
+            UNINSTALL_STRING => undef,
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB956802)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '15/01/2009',
+            NO_REMOVE        => undef,
+            GUID             => 'KB956802',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=956802',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB975560)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '15/02/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'KB975560',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=975560',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows Internet Explorer 8 (KB2675157)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '17/04/2012',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2675157-IE8',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2675157',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Update for Windows XP (KB968389)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '03/09/2009',
+            NO_REMOVE        => undef,
+            GUID             => 'KB968389',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=968389',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft',
+            NAME             => 'Update for Microsoft Office 2010 (KB2596964) 32-Bit Edition',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => 0,
+            GUID             => '{90140000-0011-0000-0000-0000000FF1CE}_Office14.PROPLUS_{ED31DE9A-3E13-4E2C-9106-E0D8AFFB9FA6}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://support.microsoft.com/kb/2596964',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com/kb/2596964',
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Update for Windows XP (KB955839)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '15/01/2009',
+            NO_REMOVE        => undef,
+            GUID             => 'KB955839',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=955839',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft',
+            NAME             => 'Security Update for Microsoft Office 2010 (KB2589320) 32-Bit Edition',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => 0,
+            GUID             => '{90140000-0011-0000-0000-0000000FF1CE}_Office14.PROPLUS_{DCE6D0BF-93E4-46C5-9A7C-F1EFF9707C02}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://support.microsoft.com/kb/2589320',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com/kb/2589320',
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Update for Windows XP (KB2264107)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '09/08/2011',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2264107',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2264107',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB953838)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '09/07/2008',
+            NO_REMOVE        => 1,
+            GUID             => 'KB953838',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=953838',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Microsoft .NET Framework 2.0 Service Pack 2',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '17/04/2012',
+            NO_REMOVE        => undef,
+            GUID             => '{C09FB3CD-3D0C-3F2D-899A-6A1D67F2073F}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => undef,
+            VERSION_MAJOR    => undef,
+            VERSION          => '2.2.30729',
+            UNINSTALL_STRING => undef,
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB978601)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '19/04/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'KB978601',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=978601',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft',
+            NAME             => 'Microsoft Office 2010 Service Pack 1 (SP1)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => 0,
+            GUID             => '{90140000-001B-0409-0000-0000000FF1CE}_Office14.PROPLUS_{6BD185A0-E67F-4F77-8BCD-E34EA6AE76DF}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://support.microsoft.com/kb/2460049',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com/kb/2460049',
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB2536276-v2)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '16/08/2011',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2536276-v2',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2536276',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '2',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB956841)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '31/10/2008',
+            NO_REMOVE        => undef,
+            GUID             => 'KB956841',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=956841',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB2479628)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '14/02/2011',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2479628',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2479628',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Windows Presentation Foundation',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '10/04/2008',
+            NO_REMOVE        => undef,
+            GUID             => '{BAF78226-3200-4DB4-BE33-4D922A799840}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => undef,
+            VERSION_MAJOR    => undef,
+            VERSION          => '3.0.6920.0',
+            UNINSTALL_STRING => undef,
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows Media Player (KB968816)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '09/11/2009',
+            NO_REMOVE        => undef,
+            GUID             => 'KB968816_WM9',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://support.microsoft.com/?kbid=968816',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB978338)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '19/04/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'KB978338',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=978338',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Microsoft .NET Framework 4 Client Profile',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '17/04/2012',
+            NO_REMOVE        => undef,
+            GUID             => '{3C3901C5-3455-3E0A-A214-0B093A5070A6}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => 'http://go.microsoft.com/fwlink/?LinkId=164164',
+            VERSION_MAJOR    => undef,
+            VERSION          => '4.0.30319',
+            UNINSTALL_STRING => undef,
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => undef,
+            NAME             => 'QT Lite 4.1.0',
+            VERSION_MINOR    => 1,
+            COMMENTS         => undef,
+            INSTALLDATE      => '23/11/2011',
+            NO_REMOVE        => undef,
+            GUID             => 'quicktime_lite_is1',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => undef,
+            VERSION_MAJOR    => 4,
+            VERSION          => '4.1.0',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB973354)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '03/09/2009',
+            NO_REMOVE        => undef,
+            GUID             => 'KB973354',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=973354',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Update for Windows XP (KB2616676-v2)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '27/09/2011',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2616676-v2',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2616676',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '2',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB2535512)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '21/06/2011',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2535512',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2535512',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Update for Microsoft .NET Framework 4 Client Profile (KB2473228)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => undef,
+            GUID             => '{3C3901C5-3455-3E0A-A214-0B093A5070A6}.KB2473228',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Update',
+            HELPLINK         => 'http://support.microsoft.com/kb/2473228',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => 'C:\\\\windows\\\\Microsoft.NET\\\\Framework\\\\v4.0.30319\\\\SetupCache\\\\Client\\\\setup.exe /uninstallpatch {FD988F49-E1C8-3C84-9683-0448B6BB8E20} /parameterfolder Client',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows Media Player 10 (KB911565)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '05/04/2006',
+            NO_REMOVE        => undef,
+            GUID             => 'KB911565',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://support.microsoft.com/?kbid=911565',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft',
+            NAME             => 'Microsoft Office 2010 Service Pack 1 (SP1)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => 0,
+            GUID             => '{90140000-00BA-0409-0000-0000000FF1CE}_Office14.PROPLUS_{6BD185A0-E67F-4F77-8BCD-E34EA6AE76DF}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://support.microsoft.com/kb/2460049',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com/kb/2460049',
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'O&O Software GmbH',
+            NAME             => 'O&O Defrag Workstation',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '30/04/2011',
+            NO_REMOVE        => undef,
+            GUID             => '{C6DC78B1-C060-4621-8140-226380141AA1}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => 'http://www.oo-software.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '11.5.4065',
+            UNINSTALL_STRING => undef,
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB2419632)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '17/01/2011',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2419632',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2419632',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB957095)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '31/10/2008',
+            NO_REMOVE        => undef,
+            GUID             => 'KB957095',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=957095',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Hotfix for Windows XP (KB961118)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '18/05/2009',
+            NO_REMOVE        => undef,
+            GUID             => 'KB961118',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Hotfix',
+            HELPLINK         => 'http://support.microsoft.com?kbid=961118',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows Media Player 10 (KB936782)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '23/09/2007',
+            NO_REMOVE        => undef,
+            GUID             => 'KB936782_WMP10',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://support.microsoft.com/?kbid=936782',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Hotfix for Windows XP (KB2158563)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '22/11/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2158563',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Hotfix',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2158563',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'MSXML 4.0 SP2 (KB954430)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '14/12/2009',
+            NO_REMOVE        => undef,
+            GUID             => '{86493ADD-824D-4B8E-BD72-8C5DCDC52A71}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => undef,
+            VERSION_MAJOR    => undef,
+            VERSION          => '4.20.9870.0',
+            UNINSTALL_STRING => undef,
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB950760)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '10/04/2008',
+            NO_REMOVE        => undef,
+            GUID             => 'KB950760',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=950760',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft',
+            NAME             => 'Update for Microsoft Office 2010 (KB2553181) 32-Bit Edition',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => 0,
+            GUID             => '{90140000-0011-0000-0000-0000000FF1CE}_Office14.PROPLUS_{48E1B6C2-7299-4F3F-AA63-42F0ACE55AA4}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://support.microsoft.com/kb/2553181',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com/kb/2553181',
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB979683)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '19/04/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'KB979683',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=979683',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Microsoft .NET Framework 3.5 SP1 (KB2657424)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => undef,
+            GUID             => '{CE2CDD62-0124-36CA-84D3-9F4DCF5C5BD9}.KB2657424',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com/kb/2657424',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => 'C:\\\\windows\\\\system32\\\\msiexec.exe /package {CE2CDD62-0124-36CA-84D3-9F4DCF5C5BD9} /uninstall {F6F5AC31-9833-3E77-AC8E-8E910CAB39AE} /qb+ REBOOTPROMPT=\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB2079403)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '16/08/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2079403',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2079403',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft',
+            NAME             => 'Security Update for Microsoft Visio Viewer 2010 (KB2597170) 32-Bit Edition',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => 0,
+            GUID             => '{90140000-0011-0000-0000-0000000FF1CE}_Office14.PROPLUS_{011FE2F6-5427-4EC9-AE80-6B28E69781C1}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://support.microsoft.com/kb/2597170',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com/kb/2597170',
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Microsoft .NET Framework 4 Client Profile (KB2572078)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => undef,
+            GUID             => '{3C3901C5-3455-3E0A-A214-0B093A5070A6}.KB2572078',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com/kb/2572078',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => 'C:\\\\windows\\\\Microsoft.NET\\\\Framework\\\\v4.0.30319\\\\SetupCache\\\\Client\\\\setup.exe /uninstallpatch {DB31DEDD-BF95-31E7-A9B7-5480561CEFF3} /parameterfolder Client',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows Internet Explorer 8 (KB2544521)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '21/06/2011',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2544521-IE8',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2544521',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Microsoft Office PowerPoint MUI (English) 2010',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '04/10/2011',
+            NO_REMOVE        => undef,
+            GUID             => '{90140000-0018-0409-0000-0000000FF1CE}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => undef,
+            VERSION_MAJOR    => undef,
+            VERSION          => '14.0.6029.1000',
+            UNINSTALL_STRING => undef,
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB975562)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '14/06/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'KB975562',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=975562',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Hummingbird Ltd.',
+            NAME             => 'Hummingbird Exceed 2006',
+            VERSION_MINOR    => undef,
+            COMMENTS         => 'Exceed 2006 Setup for Windows Installer',
+            INSTALLDATE      => '23/08/2007',
+            NO_REMOVE        => undef,
+            GUID             => '{35DFFE62-9F48-4236-9249-9EAB5C7123C9}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => 'http://www.hummingbird.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '11.0.28.0',
+            UNINSTALL_STRING => undef,
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for CAPICOM (KB931906)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '03/09/2009',
+            NO_REMOVE        => undef,
+            GUID             => '{0EFDF2F9-836D-4EB7-A32D-038BD3F1FB2A}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => undef,
+            VERSION_MAJOR    => undef,
+            VERSION          => '2.1.0.2',
+            UNINSTALL_STRING => undef,
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB2584146)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '17/01/2012',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2584146',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2584146',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB981997)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '16/08/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'KB981997',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=981997',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB975713)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '15/02/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'KB975713',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=975713',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => undef,
+            NAME             => 'Windows Media Player 10',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => undef,
+            GUID             => 'Windows Media Player',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => undef,
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft',
+            NAME             => 'PDFCREATOR1.2.1XP',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '12/07/2011',
+            NO_REMOVE        => undef,
+            GUID             => '{5D6991B6-0406-4518-9A6E-3DBBF760BB1B}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => undef,
+            VERSION_MAJOR    => undef,
+            VERSION          => '1.2.1.0',
+            UNINSTALL_STRING => undef,
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB981322)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '20/09/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'KB981322',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=981322',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Windows Genuine Advantage Notifications (KB905474)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '16/06/2006',
+            NO_REMOVE        => 1,
+            GUID             => 'WgaNotify',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://support.microsoft.com?kbid=905474',
+            URL_INFO_ABOUT   => 'http://www.microsoft.com/genuine',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1.5.0554.0',
+            UNINSTALL_STRING => undef,
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB956390)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '31/10/2008',
+            NO_REMOVE        => undef,
+            GUID             => 'KB956390',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=956390',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB953839)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '09/07/2008',
+            NO_REMOVE        => undef,
+            GUID             => 'KB953839',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=953839',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB973525)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '09/11/2009',
+            NO_REMOVE        => undef,
+            GUID             => 'KB973525',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=973525',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB2524375)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '28/03/2011',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2524375',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2524375',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB974455)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '09/11/2009',
+            NO_REMOVE        => undef,
+            GUID             => 'KB974455',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=974455',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Oracle',
+            NAME             => 'Java(TM) 6 Update 31',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '20/02/2012',
+            NO_REMOVE        => undef,
+            GUID             => '{26A24AE4-039D-4CA4-87B4-2F83216031FF}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => 'http://java.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '6.0.310',
+            UNINSTALL_STRING => undef,
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Hotfix for Windows XP (KB976098-v2)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '01/02/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'KB976098-v2',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Hotfix',
+            HELPLINK         => 'http://support.microsoft.com?kbid=976098',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '2',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => undef,
+            NAME             => 'PDFTK Builder 2.3',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => undef,
+            GUID             => 'PDFTK Builder_is1',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => undef,
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft',
+            NAME             => 'Update for Microsoft OneNote 2010 (KB2553290) 32-Bit Edition',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => 0,
+            GUID             => '{90140000-0011-0000-0000-0000000FF1CE}_Office14.PROPLUS_{BEBC2484-290C-46AD-9834-6DAD1FA80273}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://support.microsoft.com/kb/2553290',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com/kb/2553290',
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows Internet Explorer 8 (KB2559049)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '16/08/2011',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2559049-IE8',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2559049',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB951698)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '09/07/2008',
+            NO_REMOVE        => 1,
+            GUID             => 'KB951698',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=951698',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'MSXML 6.0 Parser (KB933579)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '10/04/2008',
+            NO_REMOVE        => undef,
+            GUID             => '{0A869A65-8C94-4F7C-A5C7-972D3C8CED9E}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => undef,
+            VERSION_MAJOR    => undef,
+            VERSION          => '6.10.1200.0',
+            UNINSTALL_STRING => undef,
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Symantec Corporation',
+            NAME             => 'Symantec Backup Exec Remote Agent for Windows Systems',
+            VERSION_MINOR    => undef,
+            COMMENTS         => 'Symantec Backup Exec Remote Agent for Windows Systems 32-bit',
+            INSTALLDATE      => '10/12/2009',
+            NO_REMOVE        => undef,
+            GUID             => '{F72C6003-60EF-448D-AC89-0B69C97678DC}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => 'http://www.symantec.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '11.0.6235',
+            UNINSTALL_STRING => undef,
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft',
+            NAME             => 'Security Update for Microsoft PowerPoint 2010 (KB2553185) 32-Bit Edition',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => 0,
+            GUID             => '{90140000-0011-0000-0000-0000000FF1CE}_Office14.PROPLUS_{61461470-8168-4F4B-97B7-617AF354F028}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://support.microsoft.com/kb/2553185',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com/kb/2553185',
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'O&O Software GmbH',
+            NAME             => 'O&O DriveLED Workstation',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '23/02/2011',
+            NO_REMOVE        => undef,
+            GUID             => '{98166E4E-CB20-4039-AD27-DF0BFA772352}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => 'http://www.oo-software.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '4.1.119',
+            UNINSTALL_STRING => undef,
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB979309)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '19/04/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'KB979309',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=979309',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Microsoft Software Update for Web Folders  (English) 14',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '04/10/2011',
+            NO_REMOVE        => 1,
+            GUID             => '{90140000-0010-0409-0000-0000000FF1CE}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => undef,
+            VERSION_MAJOR    => undef,
+            VERSION          => '14.0.6029.1000',
+            UNINSTALL_STRING => undef,
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => undef,
+            NAME             => 'K-Lite Codec Pack 7.1.0 (Standard)',
+            VERSION_MINOR    => 1,
+            COMMENTS         => undef,
+            INSTALLDATE      => '23/11/2011',
+            NO_REMOVE        => undef,
+            GUID             => 'KLiteCodecPack_is1',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => undef,
+            VERSION_MAJOR    => 7,
+            VERSION          => '7.1.0',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Microsoft Office OneNote MUI (English) 2010',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '15/11/2011',
+            NO_REMOVE        => undef,
+            GUID             => '{90140000-00A1-0409-0000-0000000FF1CE}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => undef,
+            VERSION_MAJOR    => undef,
+            VERSION          => '14.0.6029.1000',
+            UNINSTALL_STRING => undef,
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft',
+            NAME             => 'Update for Microsoft Outlook 2010 (KB2553248) 32-Bit Edition',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => 0,
+            GUID             => '{90140000-001A-0409-0000-0000000FF1CE}_Office14.PROPLUS_{5EBDE1DE-3B28-4134-AB00-85CFF2B4F94D}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://support.microsoft.com/kb/2553248',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com/kb/2553248',
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB971961)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '09/11/2009',
+            NO_REMOVE        => undef,
+            GUID             => 'KB971961',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=971961',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Windows Media Player 10 Hotfix - KB888656',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '05/04/2006',
+            NO_REMOVE        => undef,
+            GUID             => 'KB888656',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://support.microsoft.com?kbid=888656',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB982214)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '16/08/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'KB982214',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=982214',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Windows Management Framework Core',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '01/02/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'KB968930',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Software Update',
+            HELPLINK         => 'http://go.microsoft.com/fwlink/?LinkID=163790',
+            URL_INFO_ABOUT   => 'http://go.microsoft.com/fwlink/?LinkID=163792',
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB2121546)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '20/09/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2121546',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2121546',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Microsoft .NET Framework 4 Client Profile (KB2633870)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => undef,
+            GUID             => '{3C3901C5-3455-3E0A-A214-0B093A5070A6}.KB2633870',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com/kb/2633870',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => 'C:\\\\windows\\\\Microsoft.NET\\\\Framework\\\\v4.0.30319\\\\SetupCache\\\\Client\\\\setup.exe /uninstallpatch {8DDEFC7E-0C61-3D11-AFC6-5414F2DAFD01} /parameterfolder Client',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Hotfix for Windows XP (KB979306)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '05/04/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'KB979306',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Hotfix',
+            HELPLINK         => 'http://support.microsoft.com?kbid=979306',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Update for Windows XP (KB971737)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '14/12/2009',
+            NO_REMOVE        => undef,
+            GUID             => 'KB971737',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=971737',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft',
+            NAME             => 'Update for Microsoft Office 2010 (KB2566458)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => 0,
+            GUID             => '{90140000-0011-0000-0000-0000000FF1CE}_Office14.PROPLUS_{EFB525A0-E1C0-4E32-9968-FE401BC87363}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://support.microsoft.com/kb/2566458',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com/kb/2566458',
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft',
+            NAME             => 'Microsoft Office 2010 Service Pack 1 (SP1)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => 0,
+            GUID             => '{90140000-0117-0409-0000-0000000FF1CE}_Office14.PROPLUS_{6BD185A0-E67F-4F77-8BCD-E34EA6AE76DF}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://support.microsoft.com/kb/2460049',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com/kb/2460049',
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB971468)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '15/02/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'KB971468',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=971468',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB950974)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '09/07/2008',
+            NO_REMOVE        => 1,
+            GUID             => 'KB950974',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=950974',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB2440591)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '20/12/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2440591',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2440591',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'LogMeIn Inc.',
+            NAME             => 'Network Console',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => undef,
+            GUID             => 'Network Console',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://www.logmein.com',
+            URL_INFO_ABOUT   => 'http://www.logmein.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '9.00.175',
+            UNINSTALL_STRING => 'C:\\\\Program Files\\\\Network Console\\\\NetworkConsole.exe uninstall /I{5B21BB9A-E23E-472b-AD2A-FB9B06A4727C}',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'FusionInventory Team',
+            NAME             => 'FusionInventory Agent',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => undef,
+            GUID             => 'FusionInventory Agent',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => 'http://www.FusionInventory.org',
+            VERSION_MAJOR    => undef,
+            VERSION          => '2.2.0-2',
+            UNINSTALL_STRING => 'C:\\\\Program Files\\\\FusionInventory-Agent\\\\uninstFI.exe',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB982132)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '18/10/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'KB982132',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=982132',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft',
+            NAME             => 'Security Update for Microsoft Office 2010 (KB2553096)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => 0,
+            GUID             => '{90140000-0011-0000-0000-0000000FF1CE}_Office14.PROPLUS_{10802A6D-EDBF-4383-BCBD-9D5B32F56D35}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://support.microsoft.com/kb/2553096',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com/kb/2553096',
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB973904)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '14/12/2009',
+            NO_REMOVE        => undef,
+            GUID             => 'KB973904',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=973904',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Microsoft Office Proofing (English) 2010',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '04/10/2011',
+            NO_REMOVE        => undef,
+            GUID             => '{90140000-002C-0409-0000-0000000FF1CE}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => undef,
+            VERSION_MAJOR    => undef,
+            VERSION          => '14.0.6029.1000',
+            UNINSTALL_STRING => undef,
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Update for Windows Internet Explorer 8 (KB976749)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '10/11/2009',
+            NO_REMOVE        => undef,
+            GUID             => 'KB976749-IE8',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=976749',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB975025)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '09/11/2009',
+            NO_REMOVE        => undef,
+            GUID             => 'KB975025',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=975025',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Microsoft Visual C++ 2005 Redistributable',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '29/11/2011',
+            NO_REMOVE        => undef,
+            GUID             => '{710f4c1c-cc18-4c49-8cbf-51240c89a1a2}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => undef,
+            VERSION_MAJOR    => undef,
+            VERSION          => '8.0.61001',
+            UNINSTALL_STRING => undef,
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB2592799)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '18/10/2011',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2592799',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2592799',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft',
+            NAME             => 'Microsoft .NET Framework 1.1',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '17/04/2012',
+            NO_REMOVE        => undef,
+            GUID             => '{CB2F7EDD-9D1F-43C1-90FC-4F52EAE172A1}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => undef,
+            VERSION_MAJOR    => undef,
+            VERSION          => '1.1.4322',
+            UNINSTALL_STRING => undef,
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Microsoft Office Proof (English) 2010',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '20/12/2011',
+            NO_REMOVE        => undef,
+            GUID             => '{90140000-001F-0409-0000-0000000FF1CE}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => undef,
+            VERSION_MAJOR    => undef,
+            VERSION          => '14.0.6029.1000',
+            UNINSTALL_STRING => undef,
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows Internet Explorer 8 (KB2647516)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '21/02/2012',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2647516-IE8',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2647516',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft',
+            NAME             => 'Microsoft Office 2010 Service Pack 1 (SP1)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => 0,
+            GUID             => '{90140000-002C-0409-0000-0000000FF1CE}_Office14.PROPLUS_{7CA93DF4-8902-449E-A42E-4C5923CFBDE3}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://support.microsoft.com/kb/2460049',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com/kb/2460049',
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB971657)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '03/09/2009',
+            NO_REMOVE        => undef,
+            GUID             => 'KB971657',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=971657',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Hotfix for Microsoft .NET Framework 3.5 SP1 (KB958484)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => undef,
+            GUID             => '{CE2CDD62-0124-36CA-84D3-9F4DCF5C5BD9}.KB958484',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Hotfix',
+            HELPLINK         => 'http://support.microsoft.com/kb/958484',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => 'C:\\\\windows\\\\system32\\\\msiexec.exe /package {CE2CDD62-0124-36CA-84D3-9F4DCF5C5BD9} /uninstall {A7EEA2F2-BFCD-4A54-A575-7B81A786E658} /qb+ REBOOTPROMPT=\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB980218)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '14/06/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'KB980218',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=980218',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft',
+            NAME             => 'Microsoft Office 2010 Service Pack 1 (SP1)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => 0,
+            GUID             => '{90140000-001F-040C-0000-0000000FF1CE}_Office14.PROPLUS_{46298F6A-1E7E-4D4A-B5F5-106A4F0E48C6}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://support.microsoft.com/kb/2460049',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com/kb/2460049',
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB961501)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '09/07/2009',
+            NO_REMOVE        => undef,
+            GUID             => 'KB961501',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=961501',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Microsoft .NET Framework 4 Extended',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => undef,
+            GUID             => 'Microsoft .NET Framework 4 Extended',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => 'http://go.microsoft.com/fwlink/?LinkId=164164',
+            VERSION_MAJOR    => undef,
+            VERSION          => '4.0.30319',
+            UNINSTALL_STRING => 'C:\\\\windows\\\\Microsoft.NET\\\\Framework\\\\v4.0.30319\\\\SetupCache\\\\Extended\\\\Setup.exe /repair /x86 /parameterfolder Extended',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB2508429)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '18/04/2011',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2508429',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2508429',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB956391)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '31/10/2008',
+            NO_REMOVE        => undef,
+            GUID             => 'KB956391',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=956391',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Update for Windows XP (KB973815)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '03/09/2009',
+            NO_REMOVE        => undef,
+            GUID             => 'KB973815',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=973815',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB981852)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '16/08/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'KB981852',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=981852',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB2570222)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '16/08/2011',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2570222',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2570222',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Update for Windows XP (KB2467659)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '20/12/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2467659',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2467659',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows Media Player (KB952069)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '15/01/2009',
+            NO_REMOVE        => undef,
+            GUID             => 'KB952069_WM9',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://support.microsoft.com/?kbid=952069',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB2585542)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '17/01/2012',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2585542',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2585542',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft',
+            NAME             => 'Microsoft Office 2010 Service Pack 1 (SP1)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => 0,
+            GUID             => '{90140000-006E-0409-0000-0000000FF1CE}_Office14.PROPLUS_{4560037C-E356-444A-A015-D21F487D809E}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://support.microsoft.com/kb/2460049',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com/kb/2460049',
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft',
+            NAME             => 'Microsoft Office 2010 Service Pack 1 (SP1)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => 0,
+            GUID             => '{90140000-0019-0409-0000-0000000FF1CE}_Office14.PROPLUS_{6BD185A0-E67F-4F77-8BCD-E34EA6AE76DF}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://support.microsoft.com/kb/2460049',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com/kb/2460049',
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB2536276)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '21/06/2011',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2536276',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2536276',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB954459)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '15/01/2009',
+            NO_REMOVE        => undef,
+            GUID             => 'KB954459',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=954459',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Update for Windows Media Player 10 (KB912452)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '05/04/2006',
+            NO_REMOVE        => undef,
+            GUID             => 'KB912452',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://support.microsoft.com/?kbid=912452',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows Internet Explorer 8 (KB978207)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '25/01/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'KB978207-IE8',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=978207',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => undef,
+            NAME             => 'Microsoft .NET Framework 1.1 Security Update (KB979906)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => undef,
+            GUID             => 'M979906',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => undef,
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Microsoft Office Shared MUI (English) 2010',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '15/11/2011',
+            NO_REMOVE        => undef,
+            GUID             => '{90140000-006E-0409-0000-0000000FF1CE}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => undef,
+            VERSION_MAJOR    => undef,
+            VERSION          => '14.0.6029.1000',
+            UNINSTALL_STRING => undef,
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB958687)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '15/01/2009',
+            NO_REMOVE        => undef,
+            GUID             => 'KB958687',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=958687',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => undef,
+            NAME             => 'Microsoft .NET Framework 1.1 Security Update (KB2656353)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => undef,
+            GUID             => 'M2656353',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => undef,
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB954211)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '31/10/2008',
+            NO_REMOVE        => undef,
+            GUID             => 'KB954211',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=954211',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB961373)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '18/05/2009',
+            NO_REMOVE        => undef,
+            GUID             => 'KB961373',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=961373',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB2360937)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '18/10/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2360937',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2360937',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB2506212)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '18/04/2011',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2506212',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2506212',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft',
+            NAME             => 'Microsoft Office 2010 Service Pack 1 (SP1)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => 0,
+            GUID             => '{90140000-0018-0409-0000-0000000FF1CE}_Office14.PROPLUS_{6BD185A0-E67F-4F77-8BCD-E34EA6AE76DF}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://support.microsoft.com/kb/2460049',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com/kb/2460049',
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows Media Player 10 (KB917734)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '16/06/2006',
+            NO_REMOVE        => undef,
+            GUID             => 'KB917734_WMP10',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://support.microsoft.com/?kbid=917734',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB959426)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '18/05/2009',
+            NO_REMOVE        => undef,
+            GUID             => 'KB959426',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=959426',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'O&O Software GmbH',
+            NAME             => 'O&O DiskImage Workstation',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '17/01/2012',
+            NO_REMOVE        => 1,
+            GUID             => '{8B2E50B7-E372-4045-A5FC-3E6A30A6C871}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => 'http://www.oo-software.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '6.0.440',
+            UNINSTALL_STRING => undef,
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft',
+            NAME             => 'Microsoft Office 2010 Service Pack 1 (SP1)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => 0,
+            GUID             => '{90140000-001F-0409-0000-0000000FF1CE}_Office14.PROPLUS_{99ACCA38-6DD3-48A8-96AE-A283C9759279}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://support.microsoft.com/kb/2460049',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com/kb/2460049',
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft',
+            NAME             => 'Update for Microsoft Office 2010 (KB2597091) 32-Bit Edition',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => 0,
+            GUID             => '{90140000-0011-0000-0000-0000000FF1CE}_Office14.PROPLUS_{4D98EEEA-A31B-42FA-991A-F989594F4DA5}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://support.microsoft.com/kb/2597091',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com/kb/2597091',
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB951066)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '09/07/2008',
+            NO_REMOVE        => 1,
+            GUID             => 'KB951066',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=951066',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows Internet Explorer 8 (KB2618444)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '20/12/2011',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2618444-IE8',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2618444',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB2160329)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '16/08/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2160329',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2160329',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB2603381)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '17/01/2012',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2603381',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2603381',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft',
+            NAME             => 'Security Update for Microsoft Office 2010 (KB2553091)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => 0,
+            GUID             => '{90140000-0011-0000-0000-0000000FF1CE}_Office14.PROPLUS_{07CA44F3-F5B3-4D12-8C91-EDC5FE91D45C}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://support.microsoft.com/kb/2553091',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com/kb/2553091',
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB950762)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '09/07/2008',
+            NO_REMOVE        => 1,
+            GUID             => 'KB950762',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=950762',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB2621440)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '16/03/2012',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2621440',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2621440',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Update for Microsoft .NET Framework 4 Extended (KB2468871)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => undef,
+            GUID             => '{0A0CADCF-78DA-33C4-A350-CD51849B9702}.KB2468871',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Update',
+            HELPLINK         => 'http://support.microsoft.com/kb/2468871',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => 'c:\\\\windows\\\\Microsoft.NET\\\\Framework\\\\v4.0.30319\\\\SetupCache\\\\Extended\\\\setup.exe /uninstallpatch {5E9CF3A4-ADB3-3080-A8BF-976A28340758} /parameterfolder Extended',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Microsoft .NET Framework 3.5 SP1',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => undef,
+            GUID             => 'Microsoft .NET Framework 3.5 SP1',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://go.microsoft.com/fwlink/?LinkId=120337',
+            URL_INFO_ABOUT   => undef,
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => 'C:\\\\WINDOWS\\\\Microsoft.NET\\\\Framework\\\\v3.5\\\\Microsoft .NET Framework 3.5 SP1\\\\setup.exe',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'O&O Software GmbH',
+            NAME             => 'O&O Event Viewer',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '23/02/2011',
+            NO_REMOVE        => undef,
+            GUID             => '{ED088F40-C86D-4548-9EAB-54CF3FEA3579}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => 'http://www.oo-software.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1.0.270',
+            UNINSTALL_STRING => undef,
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Update for Windows Internet Explorer 8 (KB2362765)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '22/11/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2362765-IE8',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2362765',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Microsoft Office Publisher MUI (English) 2010',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '04/10/2011',
+            NO_REMOVE        => undef,
+            GUID             => '{90140000-0019-0409-0000-0000000FF1CE}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => undef,
+            VERSION_MAJOR    => undef,
+            VERSION          => '14.0.6029.1000',
+            UNINSTALL_STRING => undef,
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB2620712)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '20/12/2011',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2620712',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2620712',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB923689)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '13/12/2006',
+            NO_REMOVE        => undef,
+            GUID             => 'KB923689',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=923689',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => undef,
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB982665)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '16/08/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'KB982665',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=982665',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB2478960)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '14/02/2011',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2478960',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2478960',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Hotfix for Windows XP (KB969084)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '01/02/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'KB969084',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Hotfix',
+            HELPLINK         => 'http://support.microsoft.com?kbid=969084',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '3',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'VS Revo Group',
+            NAME             => 'Revo Uninstaller 1.93',
+            VERSION_MINOR    => undef,
+            COMMENTS         => 'Thank you for choosing Revo Uninstaller!',
+            INSTALLDATE      => undef,
+            NO_REMOVE        => undef,
+            GUID             => 'Revo Uninstaller',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://www.revouninstaller.com',
+            URL_INFO_ABOUT   => 'http://www.revouninstaller.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1.93',
+            UNINSTALL_STRING => 'C:\\\\Program Files\\\\VS Revo Group\\\\Revo Uninstaller\\\\uninst.exe',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB974112)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '09/11/2009',
+            NO_REMOVE        => undef,
+            GUID             => 'KB974112',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=974112',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Microsoft Office Proof (Spanish) 2010',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '20/12/2011',
+            NO_REMOVE        => undef,
+            GUID             => '{90140000-001F-0C0A-0000-0000000FF1CE}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => undef,
+            VERSION_MAJOR    => undef,
+            VERSION          => '14.0.6029.1000',
+            UNINSTALL_STRING => undef,
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft',
+            NAME             => 'Microsoft Office 2010 Service Pack 1 (SP1)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => 0,
+            GUID             => '{90140000-001F-0C0A-0000-0000000FF1CE}_Office14.PROPLUS_{DEA87BE2-FFCC-4F33-9946-FCBE55A1E998}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://support.microsoft.com/kb/2460049',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com/kb/2460049',
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB956744)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '03/09/2009',
+            NO_REMOVE        => undef,
+            GUID             => 'KB956744',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=956744',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB960859)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '03/09/2009',
+            NO_REMOVE        => undef,
+            GUID             => 'KB960859',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=960859',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Microsoft .NET Framework 4 Client Profile (KB2656368)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => undef,
+            GUID             => '{3C3901C5-3455-3E0A-A214-0B093A5070A6}.KB2656368',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com/kb/2656368',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => 'C:\\\\windows\\\\Microsoft.NET\\\\Framework\\\\v4.0.30319\\\\SetupCache\\\\Client\\\\setup.exe /uninstallpatch {9EC88EA8-4ABE-393C-87BD-90EABB1C4C9B} /parameterfolder Client',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB2347290)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '20/09/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2347290',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2347290',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB963027)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '18/05/2009',
+            NO_REMOVE        => undef,
+            GUID             => 'KB963027',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=963027',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB938464)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '31/10/2008',
+            NO_REMOVE        => undef,
+            GUID             => 'KB938464',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=938464',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB955069)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '15/01/2009',
+            NO_REMOVE        => undef,
+            GUID             => 'KB955069',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=955069',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB981957)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '18/10/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'KB981957',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=981957',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'User Profile Hive Cleanup Service',
+            VERSION_MINOR    => undef,
+            COMMENTS         => 'Installer for User Profile Hive Cleanup Service',
+            INSTALLDATE      => '23/08/2007',
+            NO_REMOVE        => undef,
+            GUID             => '{FF77941A-2BFA-4A18-BE2E-69B9498E4D55}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => 'http://www.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1.6.30',
+            UNINSTALL_STRING => undef,
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB978262)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '15/02/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'KB978262',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=978262',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB2633171)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '20/12/2011',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2633171',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2633171',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB2646524)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '17/01/2012',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2646524',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2646524',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft',
+            NAME             => 'Microsoft Windows Journal Viewer',
+            VERSION_MINOR    => undef,
+            COMMENTS         => 'A viewer for Windows Journal documents.',
+            INSTALLDATE      => '05/04/2006',
+            NO_REMOVE        => undef,
+            GUID             => '{43DCF766-6838-4F9A-8C91-D92DA586DFA8}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => undef,
+            VERSION_MAJOR    => undef,
+            VERSION          => '1.5.2316.0',
+            UNINSTALL_STRING => undef,
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Microsoft .NET Framework 4 Extended (KB2487367)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => undef,
+            GUID             => '{0A0CADCF-78DA-33C4-A350-CD51849B9702}.KB2487367',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com/kb/2487367',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => 'c:\\\\windows\\\\Microsoft.NET\\\\Framework\\\\v4.0.30319\\\\SetupCache\\\\Extended\\\\setup.exe /uninstallpatch {42A3562E-8B4E-39A4-B82D-CC12F82889E3} /parameterfolder Extended',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'XML Paper Specification Shared Components Pack 1.0',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '10/04/2008',
+            NO_REMOVE        => 1,
+            GUID             => 'XpsEPSC',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://support.microsoft.com?kbid=test',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => undef,
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB952004)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '18/05/2009',
+            NO_REMOVE        => undef,
+            GUID             => 'KB952004',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=952004',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB970430)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '14/12/2009',
+            NO_REMOVE        => undef,
+            GUID             => 'KB970430',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=970430',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB971486)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '09/11/2009',
+            NO_REMOVE        => undef,
+            GUID             => 'KB971486',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=971486',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows Internet Explorer 8 (KB2510531)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '18/04/2011',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2510531-IE8',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2510531',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB2570947)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '20/09/2011',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2570947',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2570947',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Adobe Systems Inc.',
+            NAME             => 'Adobe AIR',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '08/07/2008',
+            NO_REMOVE        => undef,
+            GUID             => '{00203668-8170-44A0-BE44-B632FA4D780F}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => undef,
+            VERSION_MAJOR    => undef,
+            VERSION          => '1.0.8.4990',
+            UNINSTALL_STRING => undef,
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'MSXML 4.0 SP2 (KB973688)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '14/12/2009',
+            NO_REMOVE        => undef,
+            GUID             => '{F662A8E6-F4DC-41A2-901E-8C11F044BDEC}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => undef,
+            VERSION_MAJOR    => undef,
+            VERSION          => '4.20.9876.0',
+            UNINSTALL_STRING => undef,
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB958690)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '02/04/2009',
+            NO_REMOVE        => undef,
+            GUID             => 'KB958690',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=958690',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB973346)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '03/09/2009',
+            NO_REMOVE        => undef,
+            GUID             => 'KB973346',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=973346',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB979482)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '14/06/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'KB979482',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=979482',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Update for Windows Internet Explorer 8 (KB975364)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '10/11/2009',
+            NO_REMOVE        => undef,
+            GUID             => 'KB975364-IE8',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=975364',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Symantec Corporation',
+            NAME             => 'Symantec Backup Exec Remote Agent for Windows Systems',
+            VERSION_MINOR    => undef,
+            COMMENTS         => 'Symantec Backup Exec Remote Agent for Windows Systems 32-bit',
+            INSTALLDATE      => '10/12/2009',
+            NO_REMOVE        => undef,
+            GUID             => 'Remote Agent for Windows Servers',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => 'http://www.symantec.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '11.0.6235',
+            UNINSTALL_STRING => undef,
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB2485376)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '14/02/2011',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2485376',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2485376',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows Internet Explorer 8 (KB976325)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '14/12/2009',
+            NO_REMOVE        => undef,
+            GUID             => 'KB976325-IE8',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=976325',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB946648)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '09/07/2008',
+            NO_REMOVE        => 1,
+            GUID             => 'KB946648',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=946648',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft',
+            NAME             => 'Microsoft Office 2010 Service Pack 1 (SP1)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => 0,
+            GUID             => '{90140000-0015-0409-0000-0000000FF1CE}_Office14.PROPLUS_{6BD185A0-E67F-4F77-8BCD-E34EA6AE76DF}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://support.microsoft.com/kb/2460049',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com/kb/2460049',
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB2483185)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '14/02/2011',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2483185',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2483185',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB958644)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '31/10/2008',
+            NO_REMOVE        => undef,
+            GUID             => 'KB958644',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=958644',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => undef,
+            NAME             => 'Windows Media Format Runtime',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => undef,
+            GUID             => 'Windows Media Format Runtime',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => undef,
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Windows Genuine Advantage Validation Tool (KB892130)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '12/04/2006',
+            NO_REMOVE        => 1,
+            GUID             => 'WGA',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://support.microsoft.com?kbid=892130',
+            URL_INFO_ABOUT   => 'http://www.microsoft.com/genuine',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1.7.0069.2',
+            UNINSTALL_STRING => undef,
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Update for Microsoft Windows (KB971513)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '09/11/2009',
+            NO_REMOVE        => undef,
+            GUID             => 'KB971513',
+            FROM             => 'registry',
+            RELEASETYPE      => '%HOTFIX%',
+            HELPLINK         => 'http://support.microsoft.com/kb/971513',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB977816)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '19/04/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'KB977816',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=977816',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Update for Windows Internet Explorer 8 (KB976662)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '01/03/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'KB976662-IE8',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=976662',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Adobe Systems, Inc.',
+            NAME             => 'Adobe Shockwave Player 11',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => undef,
+            GUID             => 'Adobe Shockwave Player',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://www.adobe.com/support/shockwave',
+            URL_INFO_ABOUT   => 'http://www.adobe.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '11',
+            UNINSTALL_STRING => 'C:\\\\WINDOWS\\\\system32\\\\adobe\\\\SHOCKW~1\\\\UNWISE.EXE C:\\\\WINDOWS\\\\system32\\\\Adobe\\\\SHOCKW~1\\\\Install.log',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Update for Windows XP (KB955759)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '14/12/2009',
+            NO_REMOVE        => undef,
+            GUID             => 'KB955759',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=955759',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows Internet Explorer 8 (KB2586448)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '18/10/2011',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2586448-IE8',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2586448',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Update for Windows Internet Explorer 8 (KB980302)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '05/04/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'KB980302-IE8',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=980302',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB2279986)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '18/10/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2279986',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2279986',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB972260)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '03/09/2009',
+            NO_REMOVE        => undef,
+            GUID             => 'KB972260',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=972260',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB2661637)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '21/02/2012',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2661637',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2661637',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Proxy Networks, Inc.',
+            NAME             => 'PROXY Pro Host',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '09/07/2009',
+            NO_REMOVE        => undef,
+            GUID             => '{A17F60BF-18E7-49ED-8AA2-8AC82B7F3993}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => 'http://www.proxynetworks.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '6.10.1374',
+            UNINSTALL_STRING => undef,
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Simon Tatham',
+            NAME             => 'PuTTY version 0.58',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => undef,
+            GUID             => 'PuTTY_is1',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => 'http://www.chiark.greenend.org.uk/~sgtatham/putty/',
+            VERSION_MAJOR    => undef,
+            VERSION          => '0.58',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB969897)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '09/07/2009',
+            NO_REMOVE        => undef,
+            GUID             => 'KB969897',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=969897',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB2598479)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '17/01/2012',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2598479',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2598479',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Hummingbird Ltd.',
+            NAME             => 'Hummingbird Connectivity Secure Shell 2006',
+            VERSION_MINOR    => undef,
+            COMMENTS         => 'Connectivity Secure Shell 2006 Setup for Windows Installer',
+            INSTALLDATE      => '23/08/2007',
+            NO_REMOVE        => undef,
+            GUID             => '{82FA2169-16BD-404E-A743-FDDAC1DA81C1}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => 'http://www.hummingbird.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '11.0.6.0',
+            UNINSTALL_STRING => undef,
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB969898)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '09/07/2009',
+            NO_REMOVE        => undef,
+            GUID             => 'KB969898',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=969898',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Adobe Systems Incorporated',
+            NAME             => 'Adobe Flash Player 11 Plugin',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '20/02/2012',
+            NO_REMOVE        => undef,
+            GUID             => '{35E1B1BF-D8E5-4B7F-9FD6-87D2E5694015}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => 'http://www.adobe.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '11.1.102.62',
+            UNINSTALL_STRING => undef,
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB2476490)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '21/06/2011',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2476490',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2476490',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'OCS Inventory NG Team',
+            NAME             => 'OCS Inventory Agent 4.0.4.8',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => undef,
+            GUID             => 'OCS Inventory Agent',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => 'http://ocsinventory.sourceforge.net',
+            VERSION_MAJOR    => undef,
+            VERSION          => '4.0.4.8',
+            UNINSTALL_STRING => 'C:\\\\Program Files\\\\OCS Inventory Agent\\\\uninst.exe',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Microsoft Office Excel MUI (English) 2010',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '04/10/2011',
+            NO_REMOVE        => undef,
+            GUID             => '{90140000-0016-0409-0000-0000000FF1CE}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => undef,
+            VERSION_MAJOR    => undef,
+            VERSION          => '14.0.6029.1000',
+            UNINSTALL_STRING => undef,
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Hotfix for Windows XP (KB2443685)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '28/03/2011',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2443685',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Hotfix',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2443685',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows Internet Explorer 8 (KB2482017)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '14/02/2011',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2482017-IE8',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2482017',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB971633)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '03/09/2009',
+            NO_REMOVE        => undef,
+            GUID             => 'KB971633',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=971633',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB923789)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => undef,
+            GUID             => 'KB923789',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://support.microsoft.com?kbid=923789',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => 'C:\\\\WINDOWS\\\\system32\\\\MacroMed\\\\Flash\\\\genuinst.exe C:\\\\WINDOWS\\\\system32\\\\MacroMed\\\\Flash\\\\KB923789.inf',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft',
+            NAME             => 'Update for Microsoft Outlook Social Connector 2010 (KB2553406) 32-Bit Edition',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => 0,
+            GUID             => '{90140000-0011-0000-0000-0000000FF1CE}_Office14.PROPLUS_{BC6DFBFD-16DD-47E1-A7EF-2C062930FA4F}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://support.microsoft.com/kb/2553406',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com/kb/2553406',
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Microsoft Windows (KB2564958)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '18/10/2011',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2564958',
+            FROM             => 'registry',
+            RELEASETYPE      => '%HOTFIX%',
+            HELPLINK         => 'http://support.microsoft.com/kb/2564958',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft',
+            NAME             => 'Security Update for Microsoft SharePoint Workspace 2010 (KB2566445)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => 0,
+            GUID             => '{90140000-0011-0000-0000-0000000FF1CE}_Office14.PROPLUS_{337A3FB9-281D-4EC8-9CC1-7F6DDAC2359F}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://support.microsoft.com/kb/2566445',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com/kb/2566445',
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft',
+            NAME             => 'Update for Microsoft OneNote 2010 (KB2553290) 32-Bit Edition',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => 0,
+            GUID             => '{90140000-00A1-0409-0000-0000000FF1CE}_Office14.PROPLUS_{9865DC3A-2898-48D9-B96A-46397571C934}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://support.microsoft.com/kb/2553290',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com/kb/2553290',
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB980436)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '16/08/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'KB980436',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=980436',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows Media Player (KB2378111)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '18/10/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2378111_WM9',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://support.microsoft.com/?kbid=2378111',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Hotfix for Windows XP (KB970653-v3)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '03/09/2009',
+            NO_REMOVE        => undef,
+            GUID             => 'KB970653-v3',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Hotfix',
+            HELPLINK         => 'http://support.microsoft.com?kbid=970653',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '3',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft',
+            NAME             => 'Security Update for Microsoft Office 2010 (KB2598039) 32-Bit Edition',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => 1,
+            GUID             => '{90140000-0011-0000-0000-0000000FF1CE}_Office14.PROPLUS_{01F2485C-FAEE-47E7-986E-B4F2FFC22D57}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://support.microsoft.com/kb/2598039',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com/kb/2598039',
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB2503658)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '18/04/2011',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2503658',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2503658',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows Media Player (KB975558)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '20/09/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'KB975558_WM8',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://support.microsoft.com/?kbid=975558',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB977165)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '15/02/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'KB977165',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=977165',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Colin Harrison',
+            NAME             => 'Xming 7.5.0.15',
+            VERSION_MINOR    => 5,
+            COMMENTS         => undef,
+            INSTALLDATE      => '23/02/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'Xming_is1',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://www.StraightRunning.com/XmingNotes',
+            URL_INFO_ABOUT   => 'http://www.StraightRunning.com/XmingNotes',
+            VERSION_MAJOR    => 7,
+            VERSION          => '7.5.0.15',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft',
+            NAME             => 'Update for Microsoft Office 2010 (KB2553270) 32-Bit Edition',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => 0,
+            GUID             => '{90140000-001F-0C0A-0000-0000000FF1CE}_Office14.PROPLUS_{995A7832-B512-46D5-87C9-2D71FB541435}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://support.microsoft.com/kb/2553270',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com/kb/2553270',
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Microsoft Office Word MUI (English) 2010',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '04/10/2011',
+            NO_REMOVE        => undef,
+            GUID             => '{90140000-001B-0409-0000-0000000FF1CE}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => undef,
+            VERSION_MAJOR    => undef,
+            VERSION          => '14.0.6029.1000',
+            UNINSTALL_STRING => undef,
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Hotfix for Windows Media Format SDK (KB902344)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '05/04/2006',
+            NO_REMOVE        => undef,
+            GUID             => 'KB902344',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://support.microsoft.com?kbid=902344',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Windows Internet Explorer 8',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '09/11/2009',
+            NO_REMOVE        => undef,
+            GUID             => 'ie8',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://www.microsoft.com/ie',
+            URL_INFO_ABOUT   => 'http://www.microsoft.com/ie',
+            VERSION_MAJOR    => undef,
+            VERSION          => '20090308.140743',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB973869)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '03/09/2009',
+            NO_REMOVE        => undef,
+            GUID             => 'KB973869',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=973869',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft',
+            NAME             => 'Update for Microsoft Office 2010 (KB2553310) 32-Bit Edition',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => 0,
+            GUID             => '{90140000-0011-0000-0000-0000000FF1CE}_Office14.PROPLUS_{C8694FF0-8203-483B-A07A-2BC40433167D}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://support.microsoft.com/kb/2553310',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com/kb/2553310',
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Microsoft .NET Framework 3.0 Service Pack 2',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '05/07/2010',
+            NO_REMOVE        => undef,
+            GUID             => '{A3051CD0-2F64-3813-A88D-B8DCCDE8F8C7}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => undef,
+            VERSION_MAJOR    => undef,
+            VERSION          => '3.2.30729',
+            UNINSTALL_STRING => undef,
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB956803)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '31/10/2008',
+            NO_REMOVE        => undef,
+            GUID             => 'KB956803',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=956803',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Update for Windows XP (KB2641690)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '15/11/2011',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2641690',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2641690',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Hotfix for Microsoft .NET Framework 3.5 SP1 (KB953595)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => 1,
+            GUID             => '{CE2CDD62-0124-36CA-84D3-9F4DCF5C5BD9}.KB953595',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Hotfix',
+            HELPLINK         => 'http://support.microsoft.com/kb/953595',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => 'C:\\\\WINDOWS\\\\system32\\\\msiexec.exe /package {CE2CDD62-0124-36CA-84D3-9F4DCF5C5BD9} /uninstall  /qb+ REBOOTPROMPT=\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'HighMAT Extension to Microsoft Windows XP CD Writing Wizard',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '05/04/2006',
+            NO_REMOVE        => undef,
+            GUID             => '{FCE65C4E-B0E8-4FBD-AD16-EDCBE6CD591F}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => undef,
+            VERSION_MAJOR    => undef,
+            VERSION          => '1.1.1905.1',
+            UNINSTALL_STRING => undef,
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB2544893-v2)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '15/11/2011',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2544893-v2',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2544893',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '2',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft',
+            NAME             => 'Update for Microsoft Outlook 2010 (KB2553248) 32-Bit Edition',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => 0,
+            GUID             => '{90140000-0011-0000-0000-0000000FF1CE}_Office14.PROPLUS_{38990592-F6A1-4A26-96C7-0600E36AE794}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://support.microsoft.com/kb/2553248',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com/kb/2553248',
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows Internet Explorer 8 (KB2530548)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '21/06/2011',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2530548-IE8',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2530548',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB2507938)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '19/07/2011',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2507938',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2507938',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Microsoft Office Groove MUI (English) 2010',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '04/10/2011',
+            NO_REMOVE        => undef,
+            GUID             => '{90140000-00BA-0409-0000-0000000FF1CE}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => undef,
+            VERSION_MAJOR    => undef,
+            VERSION          => '14.0.6029.1000',
+            UNINSTALL_STRING => undef,
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Microsoft .NET Framework 4 Client Profile (KB2478663)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => undef,
+            GUID             => '{3C3901C5-3455-3E0A-A214-0B093A5070A6}.KB2478663',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com/kb/2478663',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => 'C:\\\\windows\\\\Microsoft.NET\\\\Framework\\\\v4.0.30319\\\\SetupCache\\\\Client\\\\setup.exe /uninstallpatch {728D9A6A-2206-31E8-9F65-C3EABEFCF53E} /parameterfolder Client',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB952954)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '09/07/2008',
+            NO_REMOVE        => 1,
+            GUID             => 'KB952954',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=952954',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB2259922)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '20/09/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2259922',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2259922',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft',
+            NAME             => 'Microsoft Office 2010 Service Pack 1 (SP1)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => 0,
+            GUID             => '{90140000-0016-0409-0000-0000000FF1CE}_Office14.PROPLUS_{6BD185A0-E67F-4F77-8BCD-E34EA6AE76DF}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://support.microsoft.com/kb/2460049',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com/kb/2460049',
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Adobe Systems Incorporated',
+            NAME             => 'Spelling Dictionaries Support For Adobe Reader 9',
+            VERSION_MINOR    => undef,
+            COMMENTS         => 'This is a placeholder for ARP comments for Spelling Dictionaries for Adobe Reader 9.0',
+            INSTALLDATE      => '03/09/2009',
+            NO_REMOVE        => undef,
+            GUID             => '{AC76BA86-7AD7-5464-3428-900000000004}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => 'http://www.adobe.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '9.0.0',
+            UNINSTALL_STRING => undef,
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB941569)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '01/01/2008',
+            NO_REMOVE        => undef,
+            GUID             => 'KB941569',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=941569',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Oracle',
+            NAME             => 'Oracle Calendar',
+            VERSION_MINOR    => undef,
+            COMMENTS         => ' ',
+            INSTALLDATE      => '24/10/2006',
+            NO_REMOVE        => undef,
+            GUID             => '{4DA016C7-9AC2-4BA7-AD31-3EBA29BC21B1}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => 'http://www.oracle.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '10.1.2.3.0',
+            UNINSTALL_STRING => undef,
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Opera Software ASA',
+            NAME             => 'Opera 11.52',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => undef,
+            GUID             => 'Opera 11.52.1100',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://www.opera.com/support',
+            URL_INFO_ABOUT   => 'http://www.opera.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '11.52.1100',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB2436673)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '20/12/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2436673',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2436673',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft',
+            NAME             => 'Microsoft Office 2010 Service Pack 1 (SP1)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => 0,
+            GUID             => '{90140000-0115-0409-0000-0000000FF1CE}_Office14.PROPLUS_{4560037C-E356-444A-A015-D21F487D809E}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://support.microsoft.com/kb/2460049',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com/kb/2460049',
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB2443105)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '20/12/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2443105',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2443105',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB2509553)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '18/04/2011',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2509553',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2509553',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft',
+            NAME             => 'Update for Microsoft Office 2010 (KB2553092)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => 0,
+            GUID             => '{90140000-0011-0000-0000-0000000FF1CE}_Office14.PROPLUS_{7AC49FC8-F8D2-4DD8-9086-09E52385A21F}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://support.microsoft.com/kb/2553092',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com/kb/2553092',
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB960714)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '15/01/2009',
+            NO_REMOVE        => undef,
+            GUID             => 'KB960714',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=960714',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Microsoft .NET Framework 4 Extended (KB2416472)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => undef,
+            GUID             => '{0A0CADCF-78DA-33C4-A350-CD51849B9702}.KB2416472',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com/kb/2416472',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => 'c:\\\\windows\\\\Microsoft.NET\\\\Framework\\\\v4.0.30319\\\\SetupCache\\\\Extended\\\\setup.exe /uninstallpatch {7A2C18A1-D2A2-3177-82F1-5FE9CC08ECB0} /parameterfolder Extended',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => undef,
+            NAME             => 'Real Alternative 2.0.2 Lite',
+            VERSION_MINOR    => 0,
+            COMMENTS         => undef,
+            INSTALLDATE      => '23/11/2011',
+            NO_REMOVE        => undef,
+            GUID             => 'RealAlt_is1',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => undef,
+            VERSION_MAJOR    => 2,
+            VERSION          => '2.0.2',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Frank Heindörfer, Philip Chinery',
+            NAME             => 'PDFCreator',
+            VERSION_MINOR    => undef,
+            COMMENTS         => 'PDFCreator - Opensource',
+            INSTALLDATE      => '05/07/2011',
+            NO_REMOVE        => undef,
+            GUID             => '{0001B4FD-9EA3-4D90-A79E-FD14BA3AB01D}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://www.sf.net/projects/pdfcreator',
+            URL_INFO_ABOUT   => 'http://www.sf.net/projects/pdfcreator',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1.2.1',
+            UNINSTALL_STRING => 'C:\\\\Program Files\\\\PDFCreator\\\\unins000.exe',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows Internet Explorer 8 (KB2497640)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '18/04/2011',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2497640-IE8',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2497640',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft',
+            NAME             => 'Update for Microsoft Office 2010 (KB2553270) 32-Bit Edition',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => 0,
+            GUID             => '{90140000-001F-040C-0000-0000000FF1CE}_Office14.PROPLUS_{15058154-469F-4794-ACD5-94F8420F9B80}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://support.microsoft.com/kb/2553270',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com/kb/2553270',
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB978542)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '17/05/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'KB978542',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=978542',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB2387149)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '18/10/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2387149',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2387149',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Microsoft .NET Framework 4 Client Profile (KB2656351)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => undef,
+            GUID             => '{3C3901C5-3455-3E0A-A214-0B093A5070A6}.KB2656351',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com/kb/2656351',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => 'C:\\\\windows\\\\Microsoft.NET\\\\Framework\\\\v4.0.30319\\\\SetupCache\\\\Client\\\\setup.exe /uninstallpatch {4952F442-5C1A-38EB-8C23-B18EFE77E20C} /parameterfolder Client',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for CAPICOM (KB931906)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => undef,
+            GUID             => 'KB931906',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=931906',
+            URL_INFO_ABOUT   => undef,
+            VERSION_MAJOR    => undef,
+            VERSION          => '2.1.0.2',
+            UNINSTALL_STRING => 'MsiExec.exe /X{0EFDF2F9-836D-4EB7-A32D-038BD3F1FB2A}',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB969947)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '14/12/2009',
+            NO_REMOVE        => undef,
+            GUID             => 'KB969947',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=969947',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB979559)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '14/06/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'KB979559',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=979559',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Update for Windows XP (KB951978)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '09/07/2008',
+            NO_REMOVE        => undef,
+            GUID             => 'KB951978',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=951978',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB2566454)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '16/08/2011',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2566454',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2566454',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB2653956)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '17/04/2012',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2653956',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2653956',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Piriform',
+            NAME             => 'CCleaner (remove only)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => undef,
+            GUID             => 'CCleaner',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => undef,
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft',
+            NAME             => '{90140000-0011-0000-0000-0000000FF1CE}_Office14.PROPLUS_{DC6A88F2-14D6-468F-9E68-CBF7779FEE00}',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => 1,
+            GUID             => '{90140000-0011-0000-0000-0000000FF1CE}_Office14.PROPLUS_{DC6A88F2-14D6-468F-9E68-CBF7779FEE00}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => undef,
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB975561)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '15/03/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'KB975561',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=975561',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Mozilla',
+            NAME             => 'Mozilla Firefox 10.0.2 (x86 en-US)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => 'Mozilla Firefox 10.0.2 (x86 en-US)',
+            INSTALLDATE      => undef,
+            NO_REMOVE        => undef,
+            GUID             => 'Mozilla Firefox 10.0.2 (x86 en-US)',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => 'http://www.mozilla.com/en-US/',
+            VERSION_MAJOR    => undef,
+            VERSION          => '10.0.2',
+            UNINSTALL_STRING => 'C:\\\\Program Files\\\\Mozilla Firefox\\\\uninstall\\\\helper.exe',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Update for Windows XP (KB2607712)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '13/09/2011',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2607712',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2607712',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Hotfix for Microsoft .NET Framework 3.0 (KB932471)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => undef,
+            GUID             => 'KB932471.T301_380ToU433_380',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Hotfix',
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => undef,
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => 'C:\\\\WINDOWS\\\\system32\\\\msiexec.exe /promptrestart /uninstall {ECD292A0-0347-4244-8C24-5DBCE990FB40} /package {BAF78226-3200-4DB4-BE33-4D922A799840}',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Step By Step Interactive Training (KB898458)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '05/04/2006',
+            NO_REMOVE        => undef,
+            GUID             => 'KB898458',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://support.microsoft.com/kb/898458',
+            URL_INFO_ABOUT   => undef,
+            VERSION_MAJOR    => undef,
+            VERSION          => '20050502.101010',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Colin Harrison',
+            NAME             => 'Xming-fonts 7.5.0.25',
+            VERSION_MINOR    => 5,
+            COMMENTS         => undef,
+            INSTALLDATE      => '02/09/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'Xming-fonts_is1',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://www.StraightRunning.com/XmingNotes',
+            URL_INFO_ABOUT   => 'http://www.StraightRunning.com/XmingNotes',
+            VERSION_MAJOR    => 7,
+            VERSION          => '7.5.0.25',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB975467)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '09/11/2009',
+            NO_REMOVE        => undef,
+            GUID             => 'KB975467',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=975467',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Microsoft Office Proof (French) 2010',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '20/12/2011',
+            NO_REMOVE        => undef,
+            GUID             => '{90140000-001F-040C-0000-0000000FF1CE}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => undef,
+            VERSION_MAJOR    => undef,
+            VERSION          => '14.0.6029.1000',
+            UNINSTALL_STRING => undef,
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Cornell University',
+            NAME             => 'Spider4',
+            VERSION_MINOR    => undef,
+            COMMENTS         => 'This installer database contains the logic and data required to install Spider4.',
+            INSTALLDATE      => '27/04/2010',
+            NO_REMOVE        => undef,
+            GUID             => '{FB9448E7-477B-4F92-81A0-90754E2A259B}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => 'http://www.cit.cornell.edu/security/tools',
+            VERSION_MAJOR    => undef,
+            VERSION          => '4.0.2',
+            UNINSTALL_STRING => undef,
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft',
+            NAME             => 'Update for Microsoft Office 2010 (KB2553065)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => 0,
+            GUID             => '{90140000-0011-0000-0000-0000000FF1CE}_Office14.PROPLUS_{A8686D24-1E89-43A1-973E-05A258D2B3F8}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://support.microsoft.com/kb/2553065',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com/kb/2553065',
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Microsoft Office Professional Plus 2010',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => 0,
+            GUID             => 'Office14.PROPLUS',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => undef,
+            VERSION_MAJOR    => undef,
+            VERSION          => '14.0.6029.1000',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => undef,
+            NAME             => 'Shockwave',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => undef,
+            GUID             => 'Shockwave',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => undef,
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => undef,
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Update for Windows XP (KB2541763)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '05/07/2011',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2541763',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2541763',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB2412687)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '18/04/2011',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2412687',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2412687',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB974392)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '14/12/2009',
+            NO_REMOVE        => undef,
+            GUID             => 'KB974392',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=974392',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Windows XP Service Pack 3',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '09/07/2008',
+            NO_REMOVE        => 1,
+            GUID             => 'Windows XP Service Pack',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://support.microsoft.com?kbid=936929',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '20080414.031525',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB956572)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '18/05/2009',
+            NO_REMOVE        => undef,
+            GUID             => 'KB956572',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=956572',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB2619339)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '20/12/2011',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2619339',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2619339',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB2479943)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '14/03/2011',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2479943',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2479943',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB968537)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '09/07/2009',
+            NO_REMOVE        => undef,
+            GUID             => 'KB968537',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=968537',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Update for Windows XP (KB2492386)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '09/08/2011',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2492386',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2492386',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Windows Genuine Advantage Validation Tool (KB892130)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '03/09/2009',
+            NO_REMOVE        => 1,
+            GUID             => 'KB892130',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://support.microsoft.com?kbid=892130',
+            URL_INFO_ABOUT   => 'http://www.microsoft.com/genuine',
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => undef,
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB982802)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '20/09/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'KB982802',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=982802',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows Media Player (KB973540)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '03/09/2009',
+            NO_REMOVE        => undef,
+            GUID             => 'KB973540_WM9',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://support.microsoft.com/?kbid=973540',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Windows Media Hotfix - KB895181',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '05/04/2006',
+            NO_REMOVE        => undef,
+            GUID             => 'KB895181',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://support.microsoft.com?kbid=895181',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft',
+            NAME             => 'Update for Microsoft Office 2010 (KB2553270) 32-Bit Edition',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => 0,
+            GUID             => '{90140000-001F-0409-0000-0000000FF1CE}_Office14.PROPLUS_{17E7B9AB-2DD2-457D-8D8E-CD14ACA973FE}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://support.microsoft.com/kb/2553270',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com/kb/2553270',
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB2296199)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '20/12/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2296199',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2296199',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB2503665)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '21/06/2011',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2503665',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2503665',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB972270)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '18/01/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'KB972270',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=972270',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft',
+            NAME             => 'Microsoft Office 2010 Service Pack 1 (SP1)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => 0,
+            GUID             => '{90140000-00A1-0409-0000-0000000FF1CE}_Office14.PROPLUS_{6BD185A0-E67F-4F77-8BCD-E34EA6AE76DF}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://support.microsoft.com/kb/2460049',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com/kb/2460049',
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB960715)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '02/04/2009',
+            NO_REMOVE        => undef,
+            GUID             => 'KB960715',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=960715',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Hotfix for Windows XP (KB952287)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '09/07/2008',
+            NO_REMOVE        => 1,
+            GUID             => 'KB952287',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Hotfix',
+            HELPLINK         => 'http://support.microsoft.com?kbid=952287',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Update for Windows Internet Explorer 8 (KB980182)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '05/04/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'KB980182-IE8',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=980182',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB2476687)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '14/02/2011',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2476687',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2476687',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Microsoft .NET Framework 4 Extended',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '03/01/2012',
+            NO_REMOVE        => undef,
+            GUID             => '{0A0CADCF-78DA-33C4-A350-CD51849B9702}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => 'http://go.microsoft.com/fwlink/?LinkId=164164',
+            VERSION_MAJOR    => undef,
+            VERSION          => '4.0.30319',
+            UNINSTALL_STRING => undef,
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB961371-v2)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '03/09/2009',
+            NO_REMOVE        => undef,
+            GUID             => 'KB961371-v2',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=961371',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '2',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB957097)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '15/01/2009',
+            NO_REMOVE        => undef,
+            GUID             => 'KB957097',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=957097',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Identity Finder, LLC',
+            NAME             => 'Identity Finder',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '11/11/2010',
+            NO_REMOVE        => undef,
+            GUID             => '{19DD1E9D-51E7-4A63-83F0-BAB7D6FBFC55}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => undef,
+            VERSION_MAJOR    => undef,
+            VERSION          => '4.6.1.0',
+            UNINSTALL_STRING => undef,
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Update for Windows XP (KB971029)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '28/03/2011',
+            NO_REMOVE        => undef,
+            GUID             => 'KB971029',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=971029',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Update for Microsoft .NET Framework 4 Client Profile (KB2468871)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => undef,
+            GUID             => '{3C3901C5-3455-3E0A-A214-0B093A5070A6}.KB2468871',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Update',
+            HELPLINK         => 'http://support.microsoft.com/kb/2468871',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => 'C:\\\\windows\\\\Microsoft.NET\\\\Framework\\\\v4.0.30319\\\\SetupCache\\\\Client\\\\setup.exe /uninstallpatch {5E9CF3A4-ADB3-3080-A8BF-976A28340758} /parameterfolder Client',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB973507)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '03/09/2009',
+            NO_REMOVE        => undef,
+            GUID             => 'KB973507',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=973507',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Microsoft Office Access Setup Metadata MUI (English) 2010',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '04/10/2011',
+            NO_REMOVE        => undef,
+            GUID             => '{90140000-0117-0409-0000-0000000FF1CE}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => undef,
+            VERSION_MAJOR    => undef,
+            VERSION          => '14.0.6029.1000',
+            UNINSTALL_STRING => undef,
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB2423089)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '20/12/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2423089',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2423089',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Windows Imaging Component',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '10/04/2008',
+            NO_REMOVE        => 1,
+            GUID             => 'WIC',
+            FROM             => 'registry',
+            RELEASETYPE      => 'HotFix',
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => undef,
+            VERSION_MAJOR    => undef,
+            VERSION          => '3.0.0.0',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB969059)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '09/11/2009',
+            NO_REMOVE        => undef,
+            GUID             => 'KB969059',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=969059',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows Internet Explorer 8 (KB2416400)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '20/12/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2416400-IE8',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2416400',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft',
+            NAME             => 'Definition update for Microsoft Office 2010 (KB982726) 32-Bit Edition',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => 0,
+            GUID             => '{90140000-0011-0000-0000-0000000FF1CE}_Office14.PROPLUS_{28857979-5507-4C10-A922-FF709A19D38C}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://support.microsoft.com/kb/982726',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com/kb/982726',
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB2511455)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '18/04/2011',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2511455',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2511455',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB958869)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '09/11/2009',
+            NO_REMOVE        => undef,
+            GUID             => 'KB958869',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=958869',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB2631813)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '17/01/2012',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2631813',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2631813',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB980195)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '14/06/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'KB980195',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=980195',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB950759)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '09/07/2008',
+            NO_REMOVE        => 1,
+            GUID             => 'KB950759',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=950759',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB979687)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '18/10/2010',
+            NO_REMOVE        => undef,
+            GUID             => 'KB979687',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=979687',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Martin Prikryl',
+            NAME             => 'WinSCP 4.0.7',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '15/01/2009',
+            NO_REMOVE        => undef,
+            GUID             => 'winscp3_is1',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://winscp.net/forum/',
+            URL_INFO_ABOUT   => 'http://winscp.net/',
+            VERSION_MAJOR    => undef,
+            VERSION          => '4.0.7',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB2567053)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '18/10/2011',
+            NO_REMOVE        => undef,
+            GUID             => 'KB2567053',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=2567053',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Update for Windows XP (KB943729)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '09/11/2009',
+            NO_REMOVE        => undef,
+            GUID             => 'KB943729',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://support.microsoft.com?kbid=943729',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Microsoft .NET Framework 4 Client Profile',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => undef,
+            GUID             => 'Microsoft .NET Framework 4 Client Profile',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => 'http://go.microsoft.com/fwlink/?LinkId=164164',
+            VERSION_MAJOR    => undef,
+            VERSION          => '4.0.30319',
+            UNINSTALL_STRING => 'C:\\\\windows\\\\Microsoft.NET\\\\Framework\\\\v4.0.30319\\\\SetupCache\\\\Client\\\\Setup.exe /repair /x86 /parameterfolder Client',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft',
+            NAME             => 'Microsoft Office 2010 Service Pack 1 (SP1)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => undef,
+            NO_REMOVE        => 0,
+            GUID             => '{90140000-0011-0000-0000-0000000FF1CE}_Office14.PROPLUS_{047B0968-E622-4FAA-9B4B-121FA109EDDE}',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => 'http://support.microsoft.com/kb/2460049',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com/kb/2460049',
+            VERSION_MAJOR    => undef,
+            VERSION          => undef,
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Microsoft Corporation',
+            NAME             => 'Security Update for Windows XP (KB970238)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => undef,
+            INSTALLDATE      => '09/07/2009',
+            NO_REMOVE        => undef,
+            GUID             => 'KB970238',
+            FROM             => 'registry',
+            RELEASETYPE      => 'Security Update',
+            HELPLINK         => 'http://support.microsoft.com?kbid=970238',
+            URL_INFO_ABOUT   => 'http://support.microsoft.com',
+            VERSION_MAJOR    => undef,
+            VERSION          => '1',
+            UNINSTALL_STRING => '\\',
+            IS64BIT          => undef
+        },
+        {
+            PUBLISHER        => 'Mozilla',
+            NAME             => 'Mozilla Thunderbird (2.0.0.23)',
+            VERSION_MINOR    => undef,
+            COMMENTS         => 'Mozilla Thunderbird',
+            INSTALLDATE      => undef,
+            NO_REMOVE        => undef,
+            GUID             => 'Mozilla Thunderbird (2.0.0.23)',
+            FROM             => 'registry',
+            RELEASETYPE      => undef,
+            HELPLINK         => undef,
+            URL_INFO_ABOUT   => 'http://www.mozilla.org/',
+            VERSION_MAJOR    => undef,
+            VERSION          => '2.0.0.23 (en-US)',
+            UNINSTALL_STRING => 'C:\\\\Program Files\\\\Mozilla Thunderbird\\\\uninstall\\\\helper.exe',
+            IS64BIT          => undef
+        }
+    ]
+);
+
+plan tests => scalar keys %tests;
+
+my $module = Test::MockModule->new(
+    'FusionInventory::Agent::Task::Inventory::Input::Win32::Softwares'
+);
+$module->mock(
+    'encodeFromRegistry',
+    sub {
+        return undef unless $_[0];
+        return encode("UTF-8", decode('cp1252', $_[0]));
+    }
+);
+
+foreach my $test (keys %tests) {
+    my $softwares = FusionInventory::Test::Utils::loadRegistryDump(
+        "resources/win32/registry/$test-uninstall.reg"
+    );
+
+    my @softwares = FusionInventory::Agent::Task::Inventory::Input::Win32::Softwares::_getSoftwares(softwares => $softwares);
+
+    is_deeply(
+        \@softwares,
+        $tests{$test},
+        "$test sample"
+    );
+}


================================================================
  Commit: 73542101060d4ea844156d1ba15a3863044b10a0
      https://github.com/fusinv/fusioninventory-agent/commit/73542101060d4ea844156d1ba15a3863044b10a0
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-04-18 (Wed, 18 Apr 2012)

  Changed paths:
    R contrib/fedora/README
    R contrib/fedora/fusioninventory-agent.cron
    R contrib/fedora/fusioninventory-agent.init
    R contrib/fedora/fusioninventory-agent.service

  Log Message:
  -----------
  removal, asked by fedora package maintainer


diff --git a/contrib/fedora/README b/contrib/fedora/README
deleted file mode 100644
index 05f9fc6..0000000
--- a/contrib/fedora/README
+++ /dev/null
@@ -1,2 +0,0 @@
-RemiCollet branch is avalaible here:
-http://github.com/remicollet/fusioninventory-agent
diff --git a/contrib/fedora/fusioninventory-agent.cron b/contrib/fedora/fusioninventory-agent.cron
deleted file mode 100644
index e09c0db..0000000
--- a/contrib/fedora/fusioninventory-agent.cron
+++ /dev/null
@@ -1,37 +0,0 @@
-#!/bin/bash
-NAME=fusioninventory-agent
-LOG=/var/log/$NAME/$NAME.log
-
-exec >>$LOG 2>&1
-
-[ -f   /etc/sysconfig/$NAME ] || exit 0
-source /etc/sysconfig/$NAME
-export PATH
-
-i=0
-while [ $i -lt ${#OCSMODE[*]} ]
-do
-	if [ ${OCSMODE[$i]:-none} == cron ]; then
-		OPTS=
-		if [ ! -z "${OCSPAUSE[$i]}" ]; then
-			OPTS="--wait ${OCSPAUSE[$i]}"
-		fi
-
-		if [ ! -z "${OCSTAG[$i]}" ]; then
-		        OPTS="$OPTS --tag=${OCSTAG[$i]}"
-		fi
-
-		if [ "z${OCSSERVER[$i]}" = 'zlocal' ]; then
-	        	# Local inventory
-	        	OPTS="$OPTS --local=/var/lib/$NAME"
-		elif [ ! -z "${OCSSERVER[$i]}" ]; then
-	        	# Remote inventory
-		        OPTS="$OPTS --lazy --server=${OCSSERVER[$i]}"
-		fi
-		echo "[$(date '+%c')] Running $NAME $OPTS"
-		/usr/bin/$NAME $FUSINVOPT --logfile=$LOG $OPTS
-	fi
-	((i++))
-done
-echo "[$(date '+%c')] End of cron job ($PATH)"
-
diff --git a/contrib/fedora/fusioninventory-agent.init b/contrib/fedora/fusioninventory-agent.init
deleted file mode 100755
index 12e0725..0000000
--- a/contrib/fedora/fusioninventory-agent.init
+++ /dev/null
@@ -1,94 +0,0 @@
-#!/bin/bash
-#
-# chkconfig: 345 88 12
-# description:	FusionInventory Agent
-# processname: fusioninventory-agent
-# config: /etc/sysconfig/fusioninventory-agent.pid
-# pidfile: /var/run/fusioninventory-agent.pid
-
-# source function library
-. /etc/rc.d/init.d/functions
-
-RETVAL=0
-desc="FusionInventory Agent"
-prog=fusioninventory-agent
-lockfile=/var/lock/subsys/$prog
-pidfile=/var/run/$prog.pid
-logfile=/var/log/$prog/$prog.log
-
-# pull in sysconfig settings
-[ -r /etc/sysconfig/$prog ] && . /etc/sysconfig/$prog
-
-#
-# Function that starts the daemon/service
-#
-do_start()
-{
-	# Read configuration
-	i=0
-	OPTS=
-	while [ $i -lt ${#OCSMODE[*]} ]
-	do
-		if [ ${OCSMODE[$i]:-none} == daemon ]; then
-			if [ ! -z "${OCSTAG[$i]}" ]; then
-				OPTS="$OPTS --tag=${OCSTAG[$i]}"
-			fi
-			if [ "z${OCSSERVER[$i]}" = 'zlocal' ]; then
-				# Local inventory
-				OPTS="$OPTS --local=/var/lib/$prog"
-			elif [ ! -z "${OCSSERVER[$i]}" ]; then
-				# Remote inventory
-				OPTS="$OPTS --server=${OCSSERVER[$i]}"
-			fi
-		fi
-		((i++))
-	done
-	if [ -n "$OPTS" ]; then
-		echo -n $"Starting $prog: "
-		daemon $prog $FUSINVOPT --logfile=$logfile --daemon $OPTS
-		RETVAL=$?
-		echo
-	else
-		RETVAL=1
-	fi
-	[ $RETVAL -eq 0 ] && touch $lockfile
-}
-
-#
-# Function that stops the daemon/service
-#
-do_stop()
-{
-	echo -n $"Stopping $prog: "
-	killproc $prog
-	RETVAL=$?
-	echo
-	if [ $RETVAL -eq 0 ] ; then
-	    rm -f $lockfile $pidfile
-	fi
-}
-
-case "$1" in
-  start)
-	do_start
-	;;
-  stop)
-	do_stop
-	;;
-  status)
-	status $prog
-	;;
-  restart|reload|force-reload)
-	do_stop
-	do_start
-	;;
-  condrestart)
-	[ -f $lockfile ] && restart || :
-	;;
-  *)
-	echo $"Usage: $0 {start|stop|status|restart|reload|force-reload|condrestart}"
-	exit 1
-	;;
-esac
-exit $RETVAL
-
diff --git a/contrib/fedora/fusioninventory-agent.service b/contrib/fedora/fusioninventory-agent.service
deleted file mode 100644
index 0e14f59..0000000
--- a/contrib/fedora/fusioninventory-agent.service
+++ /dev/null
@@ -1,10 +0,0 @@
-[Unit]
-Description=FusionInventory agent
-After=syslog.target network.target
- 
-[Service]
-EnvironmentFile=/etc/sysconfig/fusioninventory-agent
-ExecStart=/usr/bin/fusioninventory-agent $OPTIONS
- 
-[Install]
-WantedBy=multi-user.target


================================================================
  Commit: f6d8e7858d58bf003b5cd63e0386672648a127af
      https://github.com/fusinv/fusioninventory-agent/commit/f6d8e7858d58bf003b5cd63e0386672648a127af
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-04-23 (Mon, 23 Apr 2012)

  Changed paths:
    M t/fake/windows/Win32/OLE.pm

  Log Message:
  -----------
  add a new UTF8 constant


diff --git a/t/fake/windows/Win32/OLE.pm b/t/fake/windows/Win32/OLE.pm
index c135d2c..dee8a2c 100644
--- a/t/fake/windows/Win32/OLE.pm
+++ b/t/fake/windows/Win32/OLE.pm
@@ -3,6 +3,8 @@ package Win32::OLE;
 use strict;
 use warnings;
 
+use constant CP_UTF8 => 0;
+
 $INC{'Win32/OLE/Const.pm'} = 1;
 $INC{'Win32/OLE/Enum.pm'} = 1;
 $INC{'Win32/OLE/Variant.pm'} = 1;


================================================================
  Commit: c63d1961f5cbfcf7558e5673c67e7e074979373a
      https://github.com/fusinv/fusioninventory-agent/commit/c63d1961f5cbfcf7558e5673c67e7e074979373a
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-04-23 (Mon, 23 Apr 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm
    M lib/FusionInventory/Agent/Task/Inventory/Inventory.pm
    M t/inventory/windows/softwares.t

  Log Message:
  -----------
  replace IS64BIT with mire generic ARCH property


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm
index 5b182ee..dbd322b 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/Softwares.pm
@@ -149,7 +149,7 @@ sub _getSoftwares {
             VERSION_MINOR    => hex2dec($data->{'/MinorVersion'}),
             VERSION_MAJOR    => hex2dec($data->{'/MajorVersion'}),
             NO_REMOVE        => hex2dec($data->{'/NoRemove'}),
-            IS64BIT          => $params{is64bit},
+            ARCH             => $params{is64bit} ? 'x86_64' : 'i586',
             GUID             => $guid,
         };
 
@@ -168,7 +168,7 @@ sub _addSoftware {
     my $entry = $params{entry};
 
     # avoid duplicates
-    return if $seen->{$entry->{NAME}}->{$entry->{IS64BIT}}{$entry->{VERSION} || '_undef_'}++;
+    return if $seen->{$entry->{NAME}}->{$entry->{ARCH}}{$entry->{VERSION} || '_undef_'}++;
 
     $params{inventory}->addEntry(section => 'SOFTWARES', entry => $entry);
 }
@@ -187,7 +187,7 @@ sub _processMSIE {
         inventory => $params{inventory},
         entry     => {
             FROM      => "registry",
-            IS64BIT   => $params{is64bit},
+            ARCH      => $params{is64bit} ? 'x86_64' : 'i586',
             NAME      => $name,
             VERSION   => $version,
             PUBLISHER => "Microsoft Corporation"
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Inventory.pm b/lib/FusionInventory/Agent/Task/Inventory/Inventory.pm
index 82f2b58..6db1ae9 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Inventory.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Inventory.pm
@@ -41,7 +41,7 @@ my %fields = (
     SOFTWARES   => [ qw/COMMENTS FILESIZE FOLDER FROM HELPLINK INSTALLDATE NAME
                         NO_REMOVE RELEASE_TYPE PUBLISHER UNINSTALL_STRING 
                         URL_INFO_ABOUT VERSION VERSION_MINOR VERSION_MAJOR 
-                        IS64BIT GUID RELEASETYPE/ ],
+                        GUID RELEASETYPE ARCH/ ],
     SOUNDS      => [ qw/CAPTION DESCRIPTION MANUFACTURER NAME/ ],
     STORAGES    => [ qw/DESCRIPTION DISKSIZE INTERFACE MANUFACTURER MODEL NAME
                         TYPE SERIAL SERIALNUMBER FIRMWARE SCSI_COID SCSI_CHID
diff --git a/t/inventory/windows/softwares.t b/t/inventory/windows/softwares.t
index a5165d0..ab276b6 100755
--- a/t/inventory/windows/softwares.t
+++ b/t/inventory/windows/softwares.t
@@ -36,7 +36,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Kay Bruns',
@@ -53,7 +53,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1.2.0.8',
             UNINSTALL_STRING => 'C:\\\\WINDOWS\\\\SuRun.exe /UNINSTALL',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -70,7 +70,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft',
@@ -87,7 +87,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft',
@@ -104,7 +104,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -121,7 +121,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '14.0.6029.1000',
             UNINSTALL_STRING => undef,
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -138,7 +138,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -155,7 +155,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => 'C:\\\\windows\\\\Microsoft.NET\\\\Framework\\\\v4.0.30319\\\\SetupCache\\\\Client\\\\setup.exe /uninstallpatch {2CE2EB39-45C8-32D4-8A99-5529C38F1B99} /parameterfolder Client',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -172,7 +172,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -189,7 +189,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '14.0.6029.1000',
             UNINSTALL_STRING => undef,
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -206,7 +206,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'O&O Software GmbH',
@@ -223,7 +223,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '2.0.386',
             UNINSTALL_STRING => undef,
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -240,7 +240,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -257,7 +257,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -274,7 +274,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -291,7 +291,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '2',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -308,7 +308,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -325,7 +325,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -342,7 +342,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => 'c:\\\\windows\\\\Microsoft.NET\\\\Framework\\\\v4.0.30319\\\\SetupCache\\\\Extended\\\\setup.exe /uninstallpatch {4952F442-5C1A-38EB-8C23-B18EFE77E20C} /parameterfolder Extended',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -359,7 +359,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -376,7 +376,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -393,7 +393,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -410,7 +410,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -427,7 +427,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -444,7 +444,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '5',
             UNINSTALL_STRING => undef,
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -461,7 +461,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -478,7 +478,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Symantec Corporation',
@@ -495,7 +495,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '12.1.1000.157',
             UNINSTALL_STRING => undef,
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => undef,
@@ -512,7 +512,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -529,7 +529,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -546,7 +546,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -563,7 +563,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -580,7 +580,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -597,7 +597,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '3.5.30729',
             UNINSTALL_STRING => undef,
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -614,7 +614,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => 'C:\\\\windows\\\\Microsoft.NET\\\\Framework\\\\v4.0.30319\\\\SetupCache\\\\Client\\\\setup.exe /uninstallpatch {3E0806DB-3085-378A-840A-F0D3AE3609D1} /parameterfolder Client',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -631,7 +631,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -648,7 +648,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '2',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -665,7 +665,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '14.0.6029.1000',
             UNINSTALL_STRING => undef,
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft',
@@ -682,7 +682,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -699,7 +699,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -716,7 +716,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'LogMeIn Inc.',
@@ -733,7 +733,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '9.00.175',
             UNINSTALL_STRING => undef,
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -750,7 +750,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -767,7 +767,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '14.0.6029.1000',
             UNINSTALL_STRING => undef,
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft',
@@ -784,7 +784,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -801,7 +801,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -818,7 +818,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '14.0.6029.1000',
             UNINSTALL_STRING => undef,
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -835,7 +835,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '20050502.101010',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -852,7 +852,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Adobe Systems Incorporated',
@@ -869,7 +869,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '10.1.2',
             UNINSTALL_STRING => undef,
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -886,7 +886,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -903,7 +903,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -920,7 +920,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -937,7 +937,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -954,7 +954,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -971,7 +971,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => 'C:\\\\windows\\\\Microsoft.NET\\\\Framework\\\\v4.0.30319\\\\SetupCache\\\\Client\\\\setup.exe /uninstallpatch {7E97AB83-C1FE-38DE-B848-877E0A4BD81E} /parameterfolder Client',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -988,7 +988,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -1005,7 +1005,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -1022,7 +1022,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -1039,7 +1039,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -1056,7 +1056,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -1073,7 +1073,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -1090,7 +1090,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -1107,7 +1107,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => undef,
@@ -1124,7 +1124,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '2.5.1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -1141,7 +1141,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -1158,7 +1158,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => undef,
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Sun Microsystems, Inc.',
@@ -1175,7 +1175,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '2.0.7.1',
             UNINSTALL_STRING => undef,
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -1192,7 +1192,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -1209,7 +1209,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => undef,
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -1226,7 +1226,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -1243,7 +1243,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -1260,7 +1260,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => 'C:\\\\WINDOWS\\\\system32\\\\msiexec.exe /package {CE2CDD62-0124-36CA-84D3-9F4DCF5C5BD9} /uninstall {B2AE9C82-DC7B-3641-BFC8-87275C4F3607} /qb+ REBOOTPROMPT=\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -1277,7 +1277,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -1294,7 +1294,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => undef,
@@ -1311,7 +1311,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => 'msiexec.exe /X {CB2F7EDD-9D1F-43C1-90FC-4F52EAE172A1}',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft',
@@ -1328,7 +1328,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -1345,7 +1345,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '9.50.7523',
             UNINSTALL_STRING => undef,
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft',
@@ -1362,7 +1362,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft',
@@ -1379,7 +1379,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -1396,7 +1396,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -1413,7 +1413,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'ScriptLogic Corporation',
@@ -1430,7 +1430,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '2.7.1.80',
             UNINSTALL_STRING => undef,
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Proxy Networks, Inc.',
@@ -1447,7 +1447,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '7.0.1515',
             UNINSTALL_STRING => undef,
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -1464,7 +1464,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -1481,7 +1481,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -1498,7 +1498,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -1515,7 +1515,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft',
@@ -1532,7 +1532,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -1549,7 +1549,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft',
@@ -1566,7 +1566,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -1583,7 +1583,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -1600,7 +1600,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -1617,7 +1617,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '2.2.30729',
             UNINSTALL_STRING => undef,
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -1634,7 +1634,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft',
@@ -1651,7 +1651,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -1668,7 +1668,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '2',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -1685,7 +1685,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -1702,7 +1702,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -1719,7 +1719,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '3.0.6920.0',
             UNINSTALL_STRING => undef,
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -1736,7 +1736,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -1753,7 +1753,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -1770,7 +1770,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '4.0.30319',
             UNINSTALL_STRING => undef,
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => undef,
@@ -1787,7 +1787,7 @@ my %tests = (
             VERSION_MAJOR    => 4,
             VERSION          => '4.1.0',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -1804,7 +1804,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -1821,7 +1821,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '2',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -1838,7 +1838,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -1855,7 +1855,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => 'C:\\\\windows\\\\Microsoft.NET\\\\Framework\\\\v4.0.30319\\\\SetupCache\\\\Client\\\\setup.exe /uninstallpatch {FD988F49-E1C8-3C84-9683-0448B6BB8E20} /parameterfolder Client',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -1872,7 +1872,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft',
@@ -1889,7 +1889,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'O&O Software GmbH',
@@ -1906,7 +1906,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '11.5.4065',
             UNINSTALL_STRING => undef,
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -1923,7 +1923,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -1940,7 +1940,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -1957,7 +1957,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -1974,7 +1974,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -1991,7 +1991,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -2008,7 +2008,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '4.20.9870.0',
             UNINSTALL_STRING => undef,
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -2025,7 +2025,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft',
@@ -2042,7 +2042,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -2059,7 +2059,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -2076,7 +2076,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => 'C:\\\\windows\\\\system32\\\\msiexec.exe /package {CE2CDD62-0124-36CA-84D3-9F4DCF5C5BD9} /uninstall {F6F5AC31-9833-3E77-AC8E-8E910CAB39AE} /qb+ REBOOTPROMPT=\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -2093,7 +2093,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft',
@@ -2110,7 +2110,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -2127,7 +2127,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => 'C:\\\\windows\\\\Microsoft.NET\\\\Framework\\\\v4.0.30319\\\\SetupCache\\\\Client\\\\setup.exe /uninstallpatch {DB31DEDD-BF95-31E7-A9B7-5480561CEFF3} /parameterfolder Client',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -2144,7 +2144,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -2161,7 +2161,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '14.0.6029.1000',
             UNINSTALL_STRING => undef,
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -2178,7 +2178,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Hummingbird Ltd.',
@@ -2195,7 +2195,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '11.0.28.0',
             UNINSTALL_STRING => undef,
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -2212,7 +2212,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '2.1.0.2',
             UNINSTALL_STRING => undef,
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -2229,7 +2229,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -2246,7 +2246,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -2263,7 +2263,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => undef,
@@ -2280,7 +2280,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft',
@@ -2297,7 +2297,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1.2.1.0',
             UNINSTALL_STRING => undef,
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -2314,7 +2314,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -2331,7 +2331,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1.5.0554.0',
             UNINSTALL_STRING => undef,
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -2348,7 +2348,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -2365,7 +2365,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -2382,7 +2382,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -2399,7 +2399,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -2416,7 +2416,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Oracle',
@@ -2433,7 +2433,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '6.0.310',
             UNINSTALL_STRING => undef,
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -2450,7 +2450,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '2',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => undef,
@@ -2467,7 +2467,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft',
@@ -2484,7 +2484,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -2501,7 +2501,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -2518,7 +2518,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -2535,7 +2535,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '6.10.1200.0',
             UNINSTALL_STRING => undef,
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Symantec Corporation',
@@ -2552,7 +2552,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '11.0.6235',
             UNINSTALL_STRING => undef,
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft',
@@ -2569,7 +2569,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'O&O Software GmbH',
@@ -2586,7 +2586,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '4.1.119',
             UNINSTALL_STRING => undef,
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -2603,7 +2603,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -2620,7 +2620,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '14.0.6029.1000',
             UNINSTALL_STRING => undef,
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => undef,
@@ -2637,7 +2637,7 @@ my %tests = (
             VERSION_MAJOR    => 7,
             VERSION          => '7.1.0',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -2654,7 +2654,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '14.0.6029.1000',
             UNINSTALL_STRING => undef,
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft',
@@ -2671,7 +2671,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -2688,7 +2688,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -2705,7 +2705,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -2722,7 +2722,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -2739,7 +2739,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -2756,7 +2756,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -2773,7 +2773,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => 'C:\\\\windows\\\\Microsoft.NET\\\\Framework\\\\v4.0.30319\\\\SetupCache\\\\Client\\\\setup.exe /uninstallpatch {8DDEFC7E-0C61-3D11-AFC6-5414F2DAFD01} /parameterfolder Client',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -2790,7 +2790,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -2807,7 +2807,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft',
@@ -2824,7 +2824,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft',
@@ -2841,7 +2841,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -2858,7 +2858,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -2875,7 +2875,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -2892,7 +2892,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'LogMeIn Inc.',
@@ -2909,7 +2909,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '9.00.175',
             UNINSTALL_STRING => 'C:\\\\Program Files\\\\Network Console\\\\NetworkConsole.exe uninstall /I{5B21BB9A-E23E-472b-AD2A-FB9B06A4727C}',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'FusionInventory Team',
@@ -2926,7 +2926,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '2.2.0-2',
             UNINSTALL_STRING => 'C:\\\\Program Files\\\\FusionInventory-Agent\\\\uninstFI.exe',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -2943,7 +2943,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft',
@@ -2960,7 +2960,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -2977,7 +2977,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -2994,7 +2994,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '14.0.6029.1000',
             UNINSTALL_STRING => undef,
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -3011,7 +3011,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -3028,7 +3028,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -3045,7 +3045,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '8.0.61001',
             UNINSTALL_STRING => undef,
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -3062,7 +3062,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft',
@@ -3079,7 +3079,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1.1.4322',
             UNINSTALL_STRING => undef,
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -3096,7 +3096,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '14.0.6029.1000',
             UNINSTALL_STRING => undef,
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -3113,7 +3113,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft',
@@ -3130,7 +3130,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -3147,7 +3147,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -3164,7 +3164,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => 'C:\\\\windows\\\\system32\\\\msiexec.exe /package {CE2CDD62-0124-36CA-84D3-9F4DCF5C5BD9} /uninstall {A7EEA2F2-BFCD-4A54-A575-7B81A786E658} /qb+ REBOOTPROMPT=\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -3181,7 +3181,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft',
@@ -3198,7 +3198,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -3215,7 +3215,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -3232,7 +3232,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '4.0.30319',
             UNINSTALL_STRING => 'C:\\\\windows\\\\Microsoft.NET\\\\Framework\\\\v4.0.30319\\\\SetupCache\\\\Extended\\\\Setup.exe /repair /x86 /parameterfolder Extended',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -3249,7 +3249,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -3266,7 +3266,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -3283,7 +3283,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -3300,7 +3300,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -3317,7 +3317,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -3334,7 +3334,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -3351,7 +3351,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -3368,7 +3368,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft',
@@ -3385,7 +3385,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft',
@@ -3402,7 +3402,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -3419,7 +3419,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -3436,7 +3436,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -3453,7 +3453,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -3470,7 +3470,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => undef,
@@ -3487,7 +3487,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -3504,7 +3504,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '14.0.6029.1000',
             UNINSTALL_STRING => undef,
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -3521,7 +3521,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => undef,
@@ -3538,7 +3538,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -3555,7 +3555,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -3572,7 +3572,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -3589,7 +3589,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -3606,7 +3606,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft',
@@ -3623,7 +3623,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -3640,7 +3640,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -3657,7 +3657,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'O&O Software GmbH',
@@ -3674,7 +3674,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '6.0.440',
             UNINSTALL_STRING => undef,
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft',
@@ -3691,7 +3691,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft',
@@ -3708,7 +3708,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -3725,7 +3725,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -3742,7 +3742,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -3759,7 +3759,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -3776,7 +3776,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft',
@@ -3793,7 +3793,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -3810,7 +3810,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -3827,7 +3827,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -3844,7 +3844,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => 'c:\\\\windows\\\\Microsoft.NET\\\\Framework\\\\v4.0.30319\\\\SetupCache\\\\Extended\\\\setup.exe /uninstallpatch {5E9CF3A4-ADB3-3080-A8BF-976A28340758} /parameterfolder Extended',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -3861,7 +3861,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => 'C:\\\\WINDOWS\\\\Microsoft.NET\\\\Framework\\\\v3.5\\\\Microsoft .NET Framework 3.5 SP1\\\\setup.exe',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'O&O Software GmbH',
@@ -3878,7 +3878,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1.0.270',
             UNINSTALL_STRING => undef,
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -3895,7 +3895,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -3912,7 +3912,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '14.0.6029.1000',
             UNINSTALL_STRING => undef,
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -3929,7 +3929,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -3946,7 +3946,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => undef,
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -3963,7 +3963,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -3980,7 +3980,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -3997,7 +3997,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '3',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'VS Revo Group',
@@ -4014,7 +4014,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1.93',
             UNINSTALL_STRING => 'C:\\\\Program Files\\\\VS Revo Group\\\\Revo Uninstaller\\\\uninst.exe',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -4031,7 +4031,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -4048,7 +4048,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '14.0.6029.1000',
             UNINSTALL_STRING => undef,
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft',
@@ -4065,7 +4065,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -4082,7 +4082,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -4099,7 +4099,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -4116,7 +4116,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => 'C:\\\\windows\\\\Microsoft.NET\\\\Framework\\\\v4.0.30319\\\\SetupCache\\\\Client\\\\setup.exe /uninstallpatch {9EC88EA8-4ABE-393C-87BD-90EABB1C4C9B} /parameterfolder Client',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -4133,7 +4133,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -4150,7 +4150,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -4167,7 +4167,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -4184,7 +4184,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -4201,7 +4201,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -4218,7 +4218,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1.6.30',
             UNINSTALL_STRING => undef,
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -4235,7 +4235,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -4252,7 +4252,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -4269,7 +4269,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft',
@@ -4286,7 +4286,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1.5.2316.0',
             UNINSTALL_STRING => undef,
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -4303,7 +4303,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => 'c:\\\\windows\\\\Microsoft.NET\\\\Framework\\\\v4.0.30319\\\\SetupCache\\\\Extended\\\\setup.exe /uninstallpatch {42A3562E-8B4E-39A4-B82D-CC12F82889E3} /parameterfolder Extended',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -4320,7 +4320,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => undef,
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -4337,7 +4337,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -4354,7 +4354,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -4371,7 +4371,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -4388,7 +4388,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -4405,7 +4405,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Adobe Systems Inc.',
@@ -4422,7 +4422,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1.0.8.4990',
             UNINSTALL_STRING => undef,
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -4439,7 +4439,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '4.20.9876.0',
             UNINSTALL_STRING => undef,
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -4456,7 +4456,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -4473,7 +4473,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -4490,7 +4490,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -4507,7 +4507,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Symantec Corporation',
@@ -4524,7 +4524,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '11.0.6235',
             UNINSTALL_STRING => undef,
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -4541,7 +4541,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -4558,7 +4558,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -4575,7 +4575,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft',
@@ -4592,7 +4592,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -4609,7 +4609,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -4626,7 +4626,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => undef,
@@ -4643,7 +4643,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -4660,7 +4660,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1.7.0069.2',
             UNINSTALL_STRING => undef,
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -4677,7 +4677,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -4694,7 +4694,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -4711,7 +4711,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Adobe Systems, Inc.',
@@ -4728,7 +4728,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '11',
             UNINSTALL_STRING => 'C:\\\\WINDOWS\\\\system32\\\\adobe\\\\SHOCKW~1\\\\UNWISE.EXE C:\\\\WINDOWS\\\\system32\\\\Adobe\\\\SHOCKW~1\\\\Install.log',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -4745,7 +4745,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -4762,7 +4762,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -4779,7 +4779,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -4796,7 +4796,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -4813,7 +4813,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -4830,7 +4830,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Proxy Networks, Inc.',
@@ -4847,7 +4847,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '6.10.1374',
             UNINSTALL_STRING => undef,
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Simon Tatham',
@@ -4864,7 +4864,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '0.58',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -4881,7 +4881,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -4898,7 +4898,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Hummingbird Ltd.',
@@ -4915,7 +4915,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '11.0.6.0',
             UNINSTALL_STRING => undef,
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -4932,7 +4932,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Adobe Systems Incorporated',
@@ -4949,7 +4949,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '11.1.102.62',
             UNINSTALL_STRING => undef,
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -4966,7 +4966,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'OCS Inventory NG Team',
@@ -4983,7 +4983,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '4.0.4.8',
             UNINSTALL_STRING => 'C:\\\\Program Files\\\\OCS Inventory Agent\\\\uninst.exe',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -5000,7 +5000,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '14.0.6029.1000',
             UNINSTALL_STRING => undef,
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -5017,7 +5017,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -5034,7 +5034,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -5051,7 +5051,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -5068,7 +5068,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => 'C:\\\\WINDOWS\\\\system32\\\\MacroMed\\\\Flash\\\\genuinst.exe C:\\\\WINDOWS\\\\system32\\\\MacroMed\\\\Flash\\\\KB923789.inf',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft',
@@ -5085,7 +5085,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -5102,7 +5102,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft',
@@ -5119,7 +5119,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft',
@@ -5136,7 +5136,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -5153,7 +5153,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -5170,7 +5170,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -5187,7 +5187,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '3',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft',
@@ -5204,7 +5204,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -5221,7 +5221,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -5238,7 +5238,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -5255,7 +5255,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Colin Harrison',
@@ -5272,7 +5272,7 @@ my %tests = (
             VERSION_MAJOR    => 7,
             VERSION          => '7.5.0.15',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft',
@@ -5289,7 +5289,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -5306,7 +5306,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '14.0.6029.1000',
             UNINSTALL_STRING => undef,
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -5323,7 +5323,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -5340,7 +5340,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '20090308.140743',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -5357,7 +5357,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft',
@@ -5374,7 +5374,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -5391,7 +5391,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '3.2.30729',
             UNINSTALL_STRING => undef,
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -5408,7 +5408,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -5425,7 +5425,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -5442,7 +5442,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => 'C:\\\\WINDOWS\\\\system32\\\\msiexec.exe /package {CE2CDD62-0124-36CA-84D3-9F4DCF5C5BD9} /uninstall  /qb+ REBOOTPROMPT=\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -5459,7 +5459,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1.1.1905.1',
             UNINSTALL_STRING => undef,
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -5476,7 +5476,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '2',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft',
@@ -5493,7 +5493,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -5510,7 +5510,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -5527,7 +5527,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -5544,7 +5544,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '14.0.6029.1000',
             UNINSTALL_STRING => undef,
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -5561,7 +5561,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => 'C:\\\\windows\\\\Microsoft.NET\\\\Framework\\\\v4.0.30319\\\\SetupCache\\\\Client\\\\setup.exe /uninstallpatch {728D9A6A-2206-31E8-9F65-C3EABEFCF53E} /parameterfolder Client',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -5578,7 +5578,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -5595,7 +5595,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft',
@@ -5612,7 +5612,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Adobe Systems Incorporated',
@@ -5629,7 +5629,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '9.0.0',
             UNINSTALL_STRING => undef,
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -5646,7 +5646,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Oracle',
@@ -5663,7 +5663,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '10.1.2.3.0',
             UNINSTALL_STRING => undef,
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Opera Software ASA',
@@ -5680,7 +5680,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '11.52.1100',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -5697,7 +5697,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft',
@@ -5714,7 +5714,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -5731,7 +5731,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -5748,7 +5748,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft',
@@ -5765,7 +5765,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -5782,7 +5782,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -5799,7 +5799,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => 'c:\\\\windows\\\\Microsoft.NET\\\\Framework\\\\v4.0.30319\\\\SetupCache\\\\Extended\\\\setup.exe /uninstallpatch {7A2C18A1-D2A2-3177-82F1-5FE9CC08ECB0} /parameterfolder Extended',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => undef,
@@ -5816,7 +5816,7 @@ my %tests = (
             VERSION_MAJOR    => 2,
             VERSION          => '2.0.2',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Frank Heindörfer, Philip Chinery',
@@ -5833,7 +5833,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1.2.1',
             UNINSTALL_STRING => 'C:\\\\Program Files\\\\PDFCreator\\\\unins000.exe',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -5850,7 +5850,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft',
@@ -5867,7 +5867,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -5884,7 +5884,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -5901,7 +5901,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -5918,7 +5918,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => 'C:\\\\windows\\\\Microsoft.NET\\\\Framework\\\\v4.0.30319\\\\SetupCache\\\\Client\\\\setup.exe /uninstallpatch {4952F442-5C1A-38EB-8C23-B18EFE77E20C} /parameterfolder Client',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -5935,7 +5935,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '2.1.0.2',
             UNINSTALL_STRING => 'MsiExec.exe /X{0EFDF2F9-836D-4EB7-A32D-038BD3F1FB2A}',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -5952,7 +5952,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -5969,7 +5969,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -5986,7 +5986,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -6003,7 +6003,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -6020,7 +6020,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Piriform',
@@ -6037,7 +6037,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft',
@@ -6054,7 +6054,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -6071,7 +6071,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Mozilla',
@@ -6088,7 +6088,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '10.0.2',
             UNINSTALL_STRING => 'C:\\\\Program Files\\\\Mozilla Firefox\\\\uninstall\\\\helper.exe',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -6105,7 +6105,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -6122,7 +6122,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => 'C:\\\\WINDOWS\\\\system32\\\\msiexec.exe /promptrestart /uninstall {ECD292A0-0347-4244-8C24-5DBCE990FB40} /package {BAF78226-3200-4DB4-BE33-4D922A799840}',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -6139,7 +6139,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '20050502.101010',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Colin Harrison',
@@ -6156,7 +6156,7 @@ my %tests = (
             VERSION_MAJOR    => 7,
             VERSION          => '7.5.0.25',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -6173,7 +6173,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -6190,7 +6190,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '14.0.6029.1000',
             UNINSTALL_STRING => undef,
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Cornell University',
@@ -6207,7 +6207,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '4.0.2',
             UNINSTALL_STRING => undef,
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft',
@@ -6224,7 +6224,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -6241,7 +6241,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '14.0.6029.1000',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => undef,
@@ -6258,7 +6258,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => undef,
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -6275,7 +6275,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -6292,7 +6292,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -6309,7 +6309,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -6326,7 +6326,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '20080414.031525',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -6343,7 +6343,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -6360,7 +6360,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -6377,7 +6377,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -6394,7 +6394,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -6411,7 +6411,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -6428,7 +6428,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => undef,
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -6445,7 +6445,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -6462,7 +6462,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -6479,7 +6479,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft',
@@ -6496,7 +6496,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -6513,7 +6513,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -6530,7 +6530,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -6547,7 +6547,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft',
@@ -6564,7 +6564,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -6581,7 +6581,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -6598,7 +6598,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -6615,7 +6615,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -6632,7 +6632,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -6649,7 +6649,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '4.0.30319',
             UNINSTALL_STRING => undef,
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -6666,7 +6666,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '2',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -6683,7 +6683,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Identity Finder, LLC',
@@ -6700,7 +6700,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '4.6.1.0',
             UNINSTALL_STRING => undef,
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -6717,7 +6717,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -6734,7 +6734,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => 'C:\\\\windows\\\\Microsoft.NET\\\\Framework\\\\v4.0.30319\\\\SetupCache\\\\Client\\\\setup.exe /uninstallpatch {5E9CF3A4-ADB3-3080-A8BF-976A28340758} /parameterfolder Client',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -6751,7 +6751,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -6768,7 +6768,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '14.0.6029.1000',
             UNINSTALL_STRING => undef,
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -6785,7 +6785,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -6802,7 +6802,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '3.0.0.0',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -6819,7 +6819,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -6836,7 +6836,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft',
@@ -6853,7 +6853,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -6870,7 +6870,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -6887,7 +6887,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -6904,7 +6904,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -6921,7 +6921,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -6938,7 +6938,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -6955,7 +6955,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Martin Prikryl',
@@ -6972,7 +6972,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '4.0.7',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -6989,7 +6989,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -7006,7 +7006,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -7023,7 +7023,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '4.0.30319',
             UNINSTALL_STRING => 'C:\\\\windows\\\\Microsoft.NET\\\\Framework\\\\v4.0.30319\\\\SetupCache\\\\Client\\\\Setup.exe /repair /x86 /parameterfolder Client',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft',
@@ -7040,7 +7040,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => undef,
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Microsoft Corporation',
@@ -7057,7 +7057,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '1',
             UNINSTALL_STRING => '\\',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         },
         {
             PUBLISHER        => 'Mozilla',
@@ -7074,7 +7074,7 @@ my %tests = (
             VERSION_MAJOR    => undef,
             VERSION          => '2.0.0.23 (en-US)',
             UNINSTALL_STRING => 'C:\\\\Program Files\\\\Mozilla Thunderbird\\\\uninstall\\\\helper.exe',
-            IS64BIT          => undef
+            ARCH             => 'i586'
         }
     ]
 );


================================================================
  Commit: 25bf8446bb68ab6346b76bb1f73e4aa039a47379
      https://github.com/fusinv/fusioninventory-agent/commit/25bf8446bb68ab6346b76bb1f73e4aa039a47379
  Author: Guillaume Rousse <Guillaume.Rousse at gmail.com>
  Date:   2012-04-23 (Mon, 23 Apr 2012)

  Changed paths:
    M lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Softwares/Deb.pm
    M lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Softwares/RPM.pm
    M resources/linux/packaging/dpkg
    M resources/linux/packaging/rpm
    M t/inventory/linux/softwares.t

  Log Message:
  -----------
  add ARCH property support


diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Softwares/Deb.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Softwares/Deb.pm
index 7e1310b..cdc7b7a 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Softwares/Deb.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Softwares/Deb.pm
@@ -18,6 +18,7 @@ sub doInventory {
     my $command =
         'dpkg-query --show --showformat=\'' .
         '${Package}\t' .
+        '${Architecture}\t' .
         '${Version}\t'.
         '${Installed-Size}\t' .
         '${Description}\n' .
@@ -48,9 +49,10 @@ sub _getPackagesList {
         my @infos = split("\t", $line);
         push @packages, {
             NAME        => $infos[0],
-            VERSION     => $infos[1],
-            FILESIZE    => $infos[2],
-            COMMENTS    => $infos[3],
+            ARCH        => $infos[1],
+            VERSION     => $infos[2],
+            FILESIZE    => $infos[3],
+            COMMENTS    => $infos[4],
             FROM        => 'deb'
         };
     }
diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Softwares/RPM.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Softwares/RPM.pm
index 68434a9..14ef3b9 100644
--- a/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Softwares/RPM.pm
+++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Generic/Softwares/RPM.pm
@@ -18,6 +18,7 @@ sub doInventory {
     my $command =
         'rpm -qa --queryformat \'' .
         '%{NAME}\t' .
+        '%{ARCH}\t' .
         '%{VERSION}-%{RELEASE}\t' .
         '%{INSTALLTIME:date}\t' .
         '%{SIZE}\t' .
@@ -48,11 +49,12 @@ sub _getPackagesList {
         my @infos = split("\t", $line);
         push @packages, {
             NAME        => $infos[0],
-            VERSION     => $infos[1],
-            INSTALLDATE => $infos[2],
-            FILESIZE    => $infos[3],
-            PUBLISHER   => $infos[4],
-            COMMENTS    => $infos[5],
+            ARCH        => $infos[1],
+            VERSION     => $infos[2],
+            INSTALLDATE => $infos[3],
+            FILESIZE    => $infos[4],
+            PUBLISHER   => $infos[5],
+            COMMENTS    => $infos[6],
             FROM        => 'rpm'
         };
     }
diff --git a/resources/linux/packaging/dpkg b/resources/linux/packaging/dpkg
index 8f89329..5dc6c61 100644
--- a/resources/linux/packaging/dpkg
+++ b/resources/linux/packaging/dpkg
@@ -1,19 +1,4 @@
-acpi-support-base	0.109-11	88	scripts for handling base ACPI events such as the power button
- This package contains scripts to react to various base ACPI events
- such as the power button. For more extensive ACPI support, including support
- for suspend-to-RAM and for various laptop features, install the package
- "acpi-support".
-acpid	1.0.8-1lenny2	196	Utilities for using ACPI power management
- Modern computers support the Advanced Configuration and Power Interface (ACPI)
- to allow intelligent power management on your system and to query battery and
- configuration status.
- .
- ACPID is a completely flexible, totally extensible daemon for delivering
- ACPI events. It listens on a file (/proc/acpi/event) and when an event
- occurs, executes programs to handle the event. The programs it executes
- are configured through a set of configuration files, which can be
- dropped into place by packages or by the admin.
-adduser	3.110	944	add and remove users and groups
+adduser	all	3.112+nmu2	1228	add and remove users and groups
  This package includes the 'adduser' and 'deluser' commands for creating
  and removing users.
  .
@@ -34,30 +19,126 @@ adduser	3.110	944	add and remove users and groups
  .
   Development mailing list:
     http://lists.alioth.debian.org/mailman/listinfo/adduser-devel/
-apt	0.7.20.2+lenny2	4652	Advanced front-end for dpkg
+anthy-common	all	9100h-6	13068	input method for Japanese - common files and dictionary
+ Anthy is a Japanese input method working on X11 and Emacs. It converts
+ hiragana text to mixed kana and kanji. It is implemented as a library
+ and stores private information securely in ~/.anthy/.
+ Thus, Anthy is simple and secure (information is protected from
+ spoofing and snooping).
+ .
+ This package provides common files dictonary data for anthy.
+apache2	amd64	2.2.16-6+squeeze6	36	Apache HTTP Server metapackage
+ The Apache Software Foundation's goal is to build a secure, efficient and
+ extensible HTTP server as standards-compliant open source software. The
+ result has long been the number one web server on the Internet.
+ .
+ It features support for HTTPS, virtual hosting, CGI, SSI, IPv6, easy
+ scripting and database integration, request/response filtering, many
+ flexible authentication schemes, and more.
+apache2-mpm-prefork	amd64	2.2.16-6+squeeze6	68	Apache HTTP Server - traditional non-threaded model
+ Each Apache Multi-Processing Module provides a different "flavor" of
+ web server binary, compiled with a different processing model.
+ .
+ The prefork MPM provides a non-threaded, pre-forking implementation
+ that handles requests in a manner similar to Apache 1.3. It is not as
+ fast as threaded models, but is considered to be more stable. It is
+ appropriate for sites that need to maintain compatibility with
+ non-thread-safe libraries, and is the best MPM for isolating each
+ request, so that a problem with a single request will not affect any
+ other.
+apache2-utils	amd64	2.2.16-6+squeeze6	384	utility programs for webservers
+ Provides some add-on programs useful for any webserver.  These include:
+  - ab (Apache benchmark tool)
+  - logresolve (Resolve IP addresses to hostname in logfiles)
+  - htpasswd (Manipulate basic authentication files)
+  - htdigest (Manipulate digest authentication files)
+  - dbmmanage (Manipulate basic authentication files in DBM format, using perl)
+  - htdbm (Manipulate basic authentication files in DBM format, using APR)
+  - rotatelogs (Periodically stop writing to a logfile and open a new one)
+  - split-logfile (Split a single log including multiple vhosts)
+  - checkgid (Checks whether the caller can setgid to the specified group)
+  - check_forensic (Extract mod_log_forensic output from Apache log files)
+apache2.2-bin	amd64	2.2.16-6+squeeze6	3856	Apache HTTP Server common binary files
+ The Apache Software Foundation's goal is to build a secure, efficient and
+ extensible HTTP server as standards-compliant open source software. The
+ result has long been the number one web server on the Internet.
+ .
+ This package contains all binaries but no configuration or support scripts.
+ To get a stand-alone server, you need to install one of the apache2-mpm-*
+ packages, such as worker or prefork. Other packages like gnome-user-share
+ may bring their own Apache configuration, though.
+apache2.2-common	amd64	2.2.16-6+squeeze6	2144	Apache HTTP Server common files
+ The Apache Software Foundation's goal is to build a secure, efficient and
+ extensible HTTP server as standards-compliant open source software. The
+ result has long been the number one web server on the Internet.
+ .
+ This package contains the configuration and support scripts.
+ However, it does *not* include the server itself; for this you need to
+ install one of the apache2-mpm-* packages, such as worker or prefork.
+apt	amd64	0.8.10.3+squeeze1	5644	Advanced front-end for dpkg
  This is Debian's next generation front-end for the dpkg package manager.
  It provides the apt-get utility and APT dselect method that provides a
  simpler, safer way to install and upgrade packages.
  .
  APT features complete installation ordering, multiple source capability
  and several other unique features, see the Users Guide in apt-doc.
-apt-utils	0.7.20.2+lenny2	396	APT utility programs
+apt-utils	amd64	0.8.10.3+squeeze1	540	APT utility programs
  This package contains some APT utility programs such as apt-ftparchive,
  apt-sortpkgs and apt-extracttemplates.
  .
  apt-extracttemplates is used by debconf to prompt for configuration
  questions before installation. apt-ftparchive is used to create Package
  and other index files. apt-sortpkgs is a Package/Source file normalizer.
-aptitude	0.4.11.11-1~lenny1	9808	terminal-based package manager
- aptitude is a terminal-based package manager with a number of useful
- features, including: a mutt-like syntax for matching packages in a
- flexible manner, dselect-like persistence of user actions, the
- ability to retrieve and display the Debian changelog of most
- packages, and a command-line mode similar to that of apt-get.
+apt-xapian-index	all	0.41	376	maintenance and search tools for a Xapian index of Debian packages
+ This package provides update-apt-xapian-index, a tool to maintan a Xapian
+ index of Debian package information in /var/lib/apt-xapian-index, and
+ axi-search, a command line search tool that uses the index.
+ .
+ axi-cache allows to search packages very quickly, and it also interfaces with
+ the shell command line completion in a smart way, providing context-sensitive
+ keyword and tag suggestions even before the search command is actually run.
+ .
+ update-apt-xapian-index allows plugins to be installed in
+ /usr/share/apt-xapian-index to index all sorts of extra information, such as
+ Debtags tags, popcon information, package ratings and anything else that would
+ fit.
+ .
+ The index generated by update-apt-xapian-index is self-documenting, as it
+ contains an autogenerated README file with information on the index layout and
+ all the data that can be found in it.
+aptitude	amd64	0.6.3-3.2+squeeze1	11916	terminal-based package manager (terminal interface only)
+ aptitude is a package manager with a number of useful features,
+ including: a mutt-like syntax for matching packages in a flexible
+ manner, dselect-like persistence of user actions, the ability to
+ retrieve and display the Debian changelog of most packages, and a
+ command-line mode similar to that of apt-get.
  .
  aptitude is also Y2K-compliant, non-fattening, naturally cleansing,
  and housebroken.
-at	3.1.10.2	220	Delayed job execution and batch processing
+ .
+ This package contains a version of aptitude compiled with only the
+ classic terminal-based interface (using curses).  For an experimental
+ graphical interface, see the package aptitude-gtk.
+aspell	amd64	0.60.6-4	1184	GNU Aspell spell-checker
+ GNU Aspell is a spell-checker which can be used either as a standalone
+ application or embedded in other programs.  Its main feature is that it
+ does a much better job of suggesting possible spellings than just about
+ any other spell-checker available for the English language, including
+ Ispell and Microsoft Word.  It also has many other technical
+ enhancements over Ispell such as using shared memory for dictionaries
+ and intelligently handling personal dictionaries when more than one
+ Aspell process is open at once.
+ .
+ Aspell is designed to be a drop-in replacement for Ispell.
+aspell-en	all	6.0-0-6	548	English dictionary for GNU Aspell
+ This package contains all the required files to add support for English
+ language to the GNU Aspell spell checker.
+ .
+ American, British and Canadian spellings are included.
+aspell-fr	all	0.50-3-7	636	French dictionary for aspell
+ This package contains all the required files to add support
+ for French language to aspell spell checker.
+at	amd64	3.1.12-1	220	Delayed job execution and batch processing
  At and batch read shell commands from standard input
  storing them as a job to be scheduled for execution in the
  future.
diff --git a/resources/linux/packaging/rpm b/resources/linux/packaging/rpm
index 418e628..ba77841 100644
--- a/resources/linux/packaging/rpm
+++ b/resources/linux/packaging/rpm
@@ -1,4 +1,10 @@
-specspo	13-1.el5	Wed Dec 22 23:26:02 2010	20486218	Red Hat, Inc.	Fedora package descriptions, summaries, and groups.
-mktemp	1.5-23.2.2	Wed Dec 22 23:26:17 2010	15712	Red Hat, Inc.	A small utility for safely making /tmp files.
-libICE	1.0.1-2.1	Wed Dec 22 23:26:18 2010	111181	Red Hat, Inc.	X.Org X11 libICE runtime library
-nspr	4.7.3-2.el5	Wed Dec 22 23:26:22 2010	253512	Red Hat, Inc.	Netscape Portable Runtime
+libpciaccess0	i586	0.12.1-1.mga1	mar. 19 juil. 2011 15:05:03 CEST	38452	Mageia.Org	Generic PCI access library (from X.org)
+firebird-devel	x86_64	2.5.1.26351.0-3.mga2	lun. 09 janv. 2012 09:24:00 CET	351554	Mageia.Org	Development Libraries for Firebird SQL Database
+gjs	x86_64	1.32.0-1.mga2	mar. 27 mars 2012 19:08:21 CEST	176167	Mageia.Org	JavaScript bindings based on gobject-introspection
+lib64nss3	x86_64	3.13.4-1.mga2	mer. 18 avril 2012 22:21:13 CEST	3346040	Mageia.Org	Network Security Services (NSS)
+ruby-term-ansicolor	noarch	1.0.5-3.mga1	ven. 29 juil. 2011 13:12:10 CEST	7211	Mageia.Org	Ruby library that colors strings using ANSI escape sequences
+lib64tidy-devel	x86_64	20090904-3.mga1	lun. 02 janv. 2012 13:12:46 CET	1930155	Mageia.Org	Headers for developing programs that will use tidy
+xfsprogs	x86_64	3.1.8-1.mga2	dim. 25 mars 2012 00:45:24 CET	3628382	Mageia.Org	Utilities for managing the XFS filesystem
+lib64swresample0	x86_64	0.10.2-2.mga2.tainted	jeu. 12 avril 2012 10:02:14 CEST	35016	Mageia.Org	Shared library part of ffmpeg
+lib64pyglib2.0_0	x86_64	2.28.6-6.mga2	jeu. 23 févr. 2012 10:25:31 CET	18672	Mageia.Org	Python Glib bindings shared library
+perl-Gtk2-ImageView	x86_64	0.50.0-4.mga2	mar. 03 avril 2012 16:38:46 CEST	153539	Mageia	Perl bindings to the GtkImageView image viewer widget
diff --git a/t/inventory/linux/softwares.t b/t/inventory/linux/softwares.t
index 661da0e..d7b836b 100755
--- a/t/inventory/linux/softwares.t
+++ b/t/inventory/linux/softwares.t
@@ -11,90 +11,225 @@ use FusionInventory::Agent::Task::Inventory::Input::Generic::Softwares::Gentoo;
 
 my $rpm_packages = [
     {
+        PUBLISHER   => 'Mageia.Org',
+        NAME        => 'libpciaccess0',
+        COMMENTS    => 'Generic PCI access library (from X.org)',
+        INSTALLDATE => 'mar. 19 juil. 2011 15:05:03 CEST',
+        FILESIZE    => '38452',
         FROM        => 'rpm',
-        PUBLISHER   => 'Red Hat, Inc.',
-        NAME        => 'specspo',
-        COMMENTS    => 'Fedora package descriptions, summaries, and groups.',
-        INSTALLDATE => 'Wed Dec 22 23:26:02 2010',
-        VERSION     => '13-1.el5',
-        FILESIZE    =>  '20486218'
+        ARCH        => 'i586',
+        VERSION     => '0.12.1-1.mga1'
     },
     {
+        PUBLISHER   => 'Mageia.Org',
+        NAME        => 'firebird-devel',
+        COMMENTS    => 'Development Libraries for Firebird SQL Database',
+        INSTALLDATE => 'lun. 09 janv. 2012 09:24:00 CET',
+        FILESIZE    => '351554',
         FROM        => 'rpm',
-        PUBLISHER   => 'Red Hat, Inc.',
-        NAME        => 'mktemp',
-        COMMENTS    => 'A small utility for safely making /tmp files.',
-        INSTALLDATE => 'Wed Dec 22 23:26:17 2010',
-        VERSION     => '1.5-23.2.2',
-        FILESIZE    =>  '15712'
+        ARCH        => 'x86_64',
+        VERSION     => '2.5.1.26351.0-3.mga2'
     },
     {
+        PUBLISHER   => 'Mageia.Org',
+        NAME        => 'gjs',
+        COMMENTS    => 'JavaScript bindings based on gobject-introspection',
+        INSTALLDATE => 'mar. 27 mars 2012 19:08:21 CEST',
+        FILESIZE    => '176167',
         FROM        => 'rpm',
-        PUBLISHER   => 'Red Hat, Inc.',
-        NAME        => 'libICE',
-        COMMENTS    => 'X.Org X11 libICE runtime library',
-        INSTALLDATE => 'Wed Dec 22 23:26:18 2010',
-        VERSION     => '1.0.1-2.1',
-        FILESIZE    =>  '111181'
+        ARCH        => 'x86_64',
+        VERSION     => '1.32.0-1.mga2'
     },
     {
+        PUBLISHER   => 'Mageia.Org',
+        NAME        => 'lib64nss3',
+        COMMENTS    => 'Network Security Services (NSS)',
+        INSTALLDATE => 'mer. 18 avril 2012 22:21:13 CEST',
+        FILESIZE    => '3346040',
         FROM        => 'rpm',
-        PUBLISHER   => 'Red Hat, Inc.',
-        NAME        => 'nspr',
-        COMMENTS    => 'Netscape Portable Runtime',
-        INSTALLDATE => 'Wed Dec 22 23:26:22 2010',
-        VERSION     => '4.7.3-2.el5',
-        FILESIZE    =>  '253512'
+        ARCH        => 'x86_64',
+        VERSION     => '3.13.4-1.mga2'
+    },
+    {
+        PUBLISHER   => 'Mageia.Org',
+        NAME        => 'ruby-term-ansicolor',
+        COMMENTS    => 'Ruby library that colors strings using ANSI escape sequences',
+        INSTALLDATE => 'ven. 29 juil. 2011 13:12:10 CEST',
+        FILESIZE    => '7211',
+        FROM        => 'rpm',
+        ARCH        => 'noarch',
+        VERSION     => '1.0.5-3.mga1'
+    },
+    {
+        PUBLISHER   => 'Mageia.Org',
+        NAME        => 'lib64tidy-devel',
+        COMMENTS    => 'Headers for developing programs that will use tidy',
+        INSTALLDATE => 'lun. 02 janv. 2012 13:12:46 CET',
+        FILESIZE    => '1930155',
+        FROM        => 'rpm',
+        ARCH        => 'x86_64',
+        VERSION     => '20090904-3.mga1'
+    },
+    {
+        PUBLISHER   => 'Mageia.Org',
+        NAME        => 'xfsprogs',
+        COMMENTS    => 'Utilities for managing the XFS filesystem',
+        INSTALLDATE => 'dim. 25 mars 2012 00:45:24 CET',
+        FILESIZE    => '3628382',
+        FROM        => 'rpm',
+        ARCH        => 'x86_64',
+        VERSION     => '3.1.8-1.mga2'
+    },
+    {
+        PUBLISHER   => 'Mageia.Org',
+        NAME        => 'lib64swresample0',
+        COMMENTS    => 'Shared library part of ffmpeg',
+        INSTALLDATE => 'jeu. 12 avril 2012 10:02:14 CEST',
+        FILESIZE    => '35016',
+        FROM        => 'rpm',
+        ARCH        => 'x86_64',
+        VERSION     => '0.10.2-2.mga2.tainted'
+    },
+    {
+        PUBLISHER   => 'Mageia.Org',
+        NAME        => 'lib64pyglib2.0_0',
+        COMMENTS    => 'Python Glib bindings shared library',
+        INSTALLDATE => 'jeu. 23 févr. 2012 10:25:31 CET',
+        FILESIZE    => '18672',
+        FROM        => 'rpm',
+        ARCH        => 'x86_64',
+        VERSION     => '2.28.6-6.mga2'
+    },
+    {
+        PUBLISHER   => 'Mageia',
+        NAME        => 'perl-Gtk2-ImageView',
+        COMMENTS    => 'Perl bindings to the GtkImageView image viewer widget',
+        INSTALLDATE => 'mar. 03 avril 2012 16:38:46 CEST',
+        FILESIZE    => '153539',
+        FROM        => 'rpm',
+        ARCH        => 'x86_64',
+        VERSION     => '0.50.0-4.mga2'
     }
 ];
 my $deb_packages = [
     {
         FROM     => 'deb',
-        NAME     => 'acpi-support-base',
-        COMMENTS => 'scripts for handling base ACPI events such as the power button',
-        VERSION  => '0.109-11',
-        FILESIZE => '88'
+        NAME     => 'adduser',
+        COMMENTS => 'add and remove users and groups',
+        ARCH     => 'all',
+        VERSION  => '3.112+nmu2',
+        FILESIZE => '1228'
     },
     {
         FROM     => 'deb',
-        NAME     => 'acpid',
-        COMMENTS => 'Utilities for using ACPI power management',
-        VERSION  => '1.0.8-1lenny2',
-        FILESIZE => '196'
+        NAME     => 'anthy-common',
+        COMMENTS => 'input method for Japanese - common files and dictionary',
+        ARCH     => 'all',
+        VERSION  => '9100h-6',
+        FILESIZE => '13068'
     },
     {
         FROM     => 'deb',
-        NAME     => 'adduser',
-        COMMENTS => 'add and remove users and groups',
-        VERSION  => '3.110',
-        FILESIZE => '944'
+        NAME     => 'apache2',
+        COMMENTS => 'Apache HTTP Server metapackage',
+        ARCH     => 'amd64',
+        VERSION  => '2.2.16-6+squeeze6',
+        FILESIZE => '36'
+    },
+    {
+        FROM     => 'deb',
+        NAME     => 'apache2-mpm-prefork',
+        COMMENTS => 'Apache HTTP Server - traditional non-threaded model',
+        ARCH     => 'amd64',
+        VERSION  => '2.2.16-6+squeeze6',
+        FILESIZE => '68'
+    },
+    {
+        FROM     => 'deb',
+        NAME     => 'apache2-utils',
+        COMMENTS => 'utility programs for webservers',
+        ARCH     => 'amd64',
+        VERSION  => '2.2.16-6+squeeze6',
+        FILESIZE => '384'
+    },
+    {
+        FROM     => 'deb',
+        NAME     => 'apache2.2-bin',
+        COMMENTS => 'Apache HTTP Server common binary files',
+        ARCH     => 'amd64',
+        VERSION  => '2.2.16-6+squeeze6',
+        FILESIZE => '3856'
+    },
+    {
+        FROM     => 'deb',
+        NAME     => 'apache2.2-common',
+        COMMENTS => 'Apache HTTP Server common files',
+        ARCH     => 'amd64',
+        VERSION  => '2.2.16-6+squeeze6',
+        FILESIZE => '2144'
     },
     {
         FROM     => 'deb',
         NAME     => 'apt',
         COMMENTS => 'Advanced front-end for dpkg',
-        VERSION  => '0.7.20.2+lenny2',
-        FILESIZE => '4652'
+        ARCH     => 'amd64',
+        VERSION  => '0.8.10.3+squeeze1',
+        FILESIZE => '5644'
     },
     {
         FROM     => 'deb',
         NAME     => 'apt-utils',
         COMMENTS => 'APT utility programs',
-        VERSION  => '0.7.20.2+lenny2',
-        FILESIZE => '396'
+        ARCH     => 'amd64',
+        VERSION  => '0.8.10.3+squeeze1',
+        FILESIZE => '540'
+    },
+    {
+        FROM     => 'deb',
+        NAME     => 'apt-xapian-index',
+        COMMENTS => 'maintenance and search tools for a Xapian index of Debian packages',
+        ARCH     => 'all',
+        VERSION  => '0.41',
+        FILESIZE => '376'
     },
     {
         FROM     => 'deb',
         NAME     => 'aptitude',
-        COMMENTS => 'terminal-based package manager',
-        VERSION  => '0.4.11.11-1~lenny1',
-        FILESIZE => '9808'
+        COMMENTS => 'terminal-based package manager (terminal interface only)',
+        ARCH     => 'amd64',
+        VERSION  => '0.6.3-3.2+squeeze1',
+        FILESIZE => '11916'
+    },
+    {
+        FROM     => 'deb',
+        NAME     => 'aspell',
+        COMMENTS => 'GNU Aspell spell-checker',
+        ARCH     => 'amd64',
+        VERSION  => '0.60.6-4',
+        FILESIZE => '1184'
+    },
+    {
+        FROM     => 'deb',
+        NAME     => 'aspell-en',
+        COMMENTS => 'English dictionary for GNU Aspell',
+        ARCH     => 'all',
+        VERSION  => '6.0-0-6',
+        FILESIZE => '548'
+    },
+    {
+        FROM     => 'deb',
+        NAME     => 'aspell-fr',
+        COMMENTS => 'French dictionary for aspell',
+        ARCH     => 'all',
+        VERSION  => '0.50-3-7',
+        FILESIZE => '636'
     },
     {
         FROM     => 'deb',
         NAME     => 'at',
         COMMENTS => 'Delayed job execution and batch processing',
-        VERSION  => '3.1.10.2',
+        ARCH     => 'amd64',
+        VERSION  => '3.1.12-1',
         FILESIZE => '220'
     }
 ];


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

  Changed paths:
    A fusioninventory-inetd

  Log Message:
  -----------
  Merge remote-tracking branch 'forge/2.3.x' into 2.3.x


diff --git a/fusioninventory-inetd b/fusioninventory-inetd
new file mode 100755
index 0000000..9675907
--- /dev/null
+++ b/fusioninventory-inetd
@@ -0,0 +1,45 @@
+#!/usr/bin/perl -w
+
+#service fusioninventory
+#{
+#    type           = UNLISTED
+#    disabled       = no
+#    flag           = REUSE
+#    port           = 62354
+#    socket_type    = stream
+#    protocol       = tcp
+#    wait           = no
+#    user           = root
+#    server         = /home/goneri/fusioninventory/agent/fusioninventory-inetd
+#}
+#
+
+use strict;
+use warnings;
+
+use lib '/home/goneri/fusioninventory/agent/lib';
+
+use Socket;
+use HTTP::Request;
+use FusionInventory::Agent::HTTP::Server;
+
+use Data::Dumper;
+my $request;
+my $server = $ENV{REMOTE_HOST};
+my $port;
+my $client;
+if ( my $hersockaddr = getpeername(STDOUT) ) {
+    my $client_n;
+    ( $port, $client_n ) = sockaddr_in($hersockaddr);
+    $client = inet_ntoa($client_n);
+}
+if ( <STDIN> =~ /^GET\s(\/\S+)\s/ ) {
+    $request = HTTP::Request->new( 'GET', "http://$server:$port$1" );
+}
+
+print "HTTP/1.1 200 OK\n";
+print "Content-type: text/html\n\n";
+print
+
+my $path = $request->uri()->path();
+print "request $path from client $client\n";


================================================================
Compare: https://github.com/fusinv/fusioninventory-agent/compare/e3176e2...dcb3d56


More information about the Fusioninventory-commit mailing list