From 0ca387e6e2722656dc558863c5187515bc56d593 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gon=C3=A9ri=20Le=20Bouder?= Date: Tue, 29 May 2012 10:26:36 +0200 Subject: [PATCH 1/5] initial support of BOOT_TIME --- .../Agent/Task/Inventory/Input/BSD.pm | 5 ++++- .../Agent/Task/Inventory/Input/Linux.pm | 5 ++++- .../Agent/Task/Inventory/Input/MacOS.pm | 4 +++- .../Agent/Task/Inventory/Input/Win32/OS.pm | 12 ++++++++++-- .../Agent/Task/Inventory/Inventory.pm | 4 ++-- 5 files changed, 23 insertions(+), 7 deletions(-) diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD.pm index bf9c5439e5..cfdfa9b4d1 100644 --- a/lib/FusionInventory/Agent/Task/Inventory/Input/BSD.pm +++ b/lib/FusionInventory/Agent/Task/Inventory/Input/BSD.pm @@ -40,6 +40,8 @@ sub doInventory { } close $handle; + my $boottime = getFirstMatch(command => "sysctl -n kern.boottime", pattern => qr/sec = (\d+)/); + my $OSName = $OSNAME; if (canRun('lsb_release')) { $OSName = getFirstMatch( @@ -58,7 +60,8 @@ sub doInventory { NAME => $OSName, VERSION => $OSVersion, KERNEL_VERSION => $OSVersion, - FULL_NAME => $OSNAME + FULL_NAME => $OSNAME, + BOOT_TIME => getFormatedLocalTime($boottime) }); } diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux.pm index 32a772b66d..8f3bebf2a4 100644 --- a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux.pm +++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux.pm @@ -24,6 +24,8 @@ sub doInventory { my $oscomment = getFirstLine(command => 'uname -v'); my $systemId = _getRHNSystemId('/etc/sysconfig/rhn/systemid'); + my $boottime = time - getFirstMatch(file => '/proc/uptime', pattern => qr/^(\d+)/); + $inventory->setHardware({ OSVERSION => $osversion, OSCOMMENTS => $oscomment, @@ -31,7 +33,8 @@ sub doInventory { }); $inventory->setOperatingSystem({ - KERNEL_VERSION => $osversion + KERNEL_VERSION => $osversion, + BOOT_TIME => getFormatedLocalTime($boottime) }); } diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS.pm index 504a5a689d..18e5890f74 100644 --- a/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS.pm +++ b/lib/FusionInventory/Agent/Task/Inventory/Input/MacOS.pm @@ -34,6 +34,7 @@ sub doInventory { # never hurt my $OSComment = getFirstLine(command => 'uname -v'); my $KernelVersion = getFirstLine(command => 'uname -r'); + my $boottime = getFirstMatch(command => "sysctl -n kern.boottime", pattern => qr/sec = (\d+)/); $inventory->setHardware({ OSNAME => $OSName, @@ -45,7 +46,8 @@ sub doInventory { NAME => "MacOSX", VERSION => $OSVersion, KERNEL_VERSION => $KernelVersion, - FULL_NAME => $OSName + FULL_NAME => $OSName, + BOOT_TIME => getFormatedLocalTime($boottime) }); } diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/OS.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/OS.pm index b933da4ec7..575e96a573 100644 --- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/OS.pm +++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/OS.pm @@ -23,8 +23,9 @@ sub doInventory { foreach my $object (getWMIObjects( class => 'Win32_OperatingSystem', properties => [ qw/ - OSLanguage Caption Version SerialNumber Organization \ - RegisteredUser CSDVersion TotalSwapSpaceSize OSArchitecture + OSLanguage Caption Version SerialNumber Organization + RegisteredUser CSDVersion TotalSwapSpaceSize + OSArchitecture LastBootUpTime / ] )) { @@ -62,6 +63,12 @@ sub doInventory { my $osArchitecture = $object->{OSArchitecture} || '32-bit'; $osArchitecture =~ s/ /-/; # "64 bit" => "64-bit" + my $boottime; + if ($object->{LastBootUpTime} =~ + /^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/) { + $boottime = getFormatedDate($1, $2, $3, $4, $5, 6); + } + $inventory->setOperatingSystem({ NAME => "Windows", INSTALL_DATE => $installDate, @@ -70,6 +77,7 @@ sub doInventory { FULL_NAME => $object->{Caption}, SERVICE_PACK => $object->{CSDVersion}, ARCH => $osArchitecture, + BOOT_TIME => $boottime, }); } diff --git a/lib/FusionInventory/Agent/Task/Inventory/Inventory.pm b/lib/FusionInventory/Agent/Task/Inventory/Inventory.pm index 925b58a251..66822db237 100644 --- a/lib/FusionInventory/Agent/Task/Inventory/Inventory.pm +++ b/lib/FusionInventory/Agent/Task/Inventory/Inventory.pm @@ -68,8 +68,8 @@ my %fields = ( DEFAULTGATEWAY VMSYSTEM WINOWNER WINPRODID WINPRODKEY WINCOMPANY WINLANG CHASSIS_TYPE/ ], OPERATINGSYSTEM => [ qw/KERNEL_NAME KERNEL_VERSION NAME VERSION FULL_NAME - SERVICE_PACK INSTALL_DATE FQDN DNS_DOMAIN SSH_KEY - ARCH/ ], + SERVICE_PACK INSTALL_DATE FQDN DNS_DOMAIN + SSH_KEY ARCH BOOT_TIME/ ], ACCESSLOG => [ qw/USERID LOGDATE/ ], VIRTUALMACHINES => [ qw/MEMORY NAME UUID STATUS SUBSYSTEM VMTYPE VCPU VMID MAC COMMENT OWNER/ ], From d275f2fab31378498e5482bfb9f23254e2d9ccd3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gon=C3=A9ri=20Le=20Bouder?= Date: Sun, 9 Dec 2012 16:04:29 +0100 Subject: [PATCH 2/5] add OPERATINGSYSTEM/BOOTTIME for Linux --- .../Agent/Task/Inventory/Input/Linux/Uptime.pm | 7 +++---- lib/FusionInventory/Agent/Task/Inventory/Inventory.pm | 4 ++++ 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Uptime.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Uptime.pm index 4841ef5220..12707af294 100644 --- a/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Uptime.pm +++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Linux/Uptime.pm @@ -16,10 +16,9 @@ sub doInventory { my $inventory = $params{inventory}; - my $arch = getFirstLine(command => 'uname -m'); my $uptime = _getUptime(file => '/proc/uptime'); - $inventory->setHardware({ - DESCRIPTION => "$arch/$uptime" + $inventory->setOperatingSystem({ + BOOT_TIME => "$uptime" }); } @@ -30,7 +29,7 @@ sub _getUptime { ); return unless $uptime; - return getFormatedGmTime($uptime); + return getFormatedLocalTime(int(time - $uptime)); } 1; diff --git a/lib/FusionInventory/Agent/Task/Inventory/Inventory.pm b/lib/FusionInventory/Agent/Task/Inventory/Inventory.pm index 66822db237..ba961900f6 100644 --- a/lib/FusionInventory/Agent/Task/Inventory/Inventory.pm +++ b/lib/FusionInventory/Agent/Task/Inventory/Inventory.pm @@ -942,6 +942,10 @@ The operating system installation date. Operating system architecture. +=item BOOT_TIME + +The date of the boot of the computer, e.g: 2012-12-09 15:58:20 + =back =head2 MONITORS From 6e675abc4de4907c0f3057172f1e1d2bb95770fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gon=C3=A9ri=20Le=20Bouder?= Date: Sun, 9 Dec 2012 16:06:07 +0100 Subject: [PATCH 3/5] fix: use real hash instead of hash ref --- .../Agent/Task/Inventory/Input/Win32/License.pm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/License.pm b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/License.pm index 95120036d0..a163e1e9f1 100644 --- a/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/License.pm +++ b/lib/FusionInventory/Agent/Task/Inventory/Input/Win32/License.pm @@ -42,7 +42,7 @@ sub doInventory { sub _scanOffice { my ($key) = @_; - my %license = { + my %license = ( PRODUCTID => $key->{ProductID}, UPDATE => $key->{SPLevel}, OEM => $key->{OEM}, @@ -50,7 +50,7 @@ sub _scanOffice { encodeFromRegistry($key->{ConvertToEdition}), NAME => encodeFromRegistry($key->{ProductNameNonQualified}) || encodeFromRegistry($key->{ProductNameVersion}) - }; + ); if ($key->{DigitalProductID}) { $license{KEY} = parseProductKey($key->{DigitalProductID}); From 738ba5a0f032f0e47bebc7f4fb72c266547230ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gon=C3=A9ri=20Le=20Bouder?= Date: Sun, 9 Dec 2012 17:13:57 +0100 Subject: [PATCH 4/5] refresh the Changes (BOOT_TIME) --- Changes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Changes b/Changes index 9e7506bdce..6b380c1aba 100644 --- a/Changes +++ b/Changes @@ -3,7 +3,7 @@ Revision history for FusionInventory agent 2.3.0 General: * various UTF8 encoding fixes -* Add DNS_DOMAIN and FQDN in OPERATINGSYSTEM section +* Add DNS_DOMAIN, BOOT_TIME and FQDN in OPERATINGSYSTEM section * Collect public SSH keys Windows: From b8658ec92613fb149ce80bdc4ad277f34793b546 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gon=C3=A9ri=20Le=20Bouder?= Date: Thu, 13 Dec 2012 20:51:21 +0100 Subject: [PATCH 5/5] avoid localtime() exception if param is undef if localtime() parameter is undef, it will generate an exception. To avoid that, we check first if $time is true. Jairo and Mario, you deserve a big thanks for this bug. closes: #1813 Reported-by: Mario Jorge De Sousa Freire Reported-by: Jairo C de Oliveira --- lib/FusionInventory/Agent/Tools.pm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/FusionInventory/Agent/Tools.pm b/lib/FusionInventory/Agent/Tools.pm index 97e19e64a3..39a206bd04 100644 --- a/lib/FusionInventory/Agent/Tools.pm +++ b/lib/FusionInventory/Agent/Tools.pm @@ -57,6 +57,8 @@ if ($OSNAME ne 'MSWin32') { sub getFormatedLocalTime { my ($time) = @_; + return unless $time; + my ($year, $month , $day, $hour, $min, $sec) = (localtime ($time))[5, 4, 3, 2, 1, 0];