# --
# Copyright (C) 2001-2019 OTRS AG, https://otrs.com/
# --
# This software comes with ABSOLUTELY NO WARRANTY. For details, see
# the enclosed file COPYING for license information (GPL). If you
# did not receive this file, see https://www.gnu.org/licenses/gpl-3.0.txt.
# --
package Kernel::System::Environment;
use strict;
use warnings;
use POSIX;
use ExtUtils::MakeMaker;
use Sys::Hostname::Long;
our @ObjectDependencies = (
'Kernel::Config',
'Kernel::System::DB',
'Kernel::System::Main',
);
=head1 NAME
Kernel::System::Environment - collect environment info
=head1 DESCRIPTION
Functions to collect environment info
=head1 PUBLIC INTERFACE
=head2 new()
create environment object. Do not use it directly, instead use:
my $EnvironmentObject = $Kernel::OM->Get('Kernel::System::Environment');
=cut
sub new {
my ( $Type, %Param ) = @_;
# allocate new hash for object
my $Self = {};
bless( $Self, $Type );
return $Self;
}
=head2 OSInfoGet()
collect operating system information
my %OSInfo = $EnvironmentObject->OSInfoGet();
returns:
%OSInfo = (
Distribution => "debian",
Hostname => "servername.example.com",
OS => "Linux",
OSName => "debian 7.1",
Path => "/home/otrs/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games",
POSIX => [
"Linux",
"servername",
"3.2.0-4-686-pae",
"#1 SMP Debian 3.2.46-1",
"i686",
],
User => "otrs",
);
=cut
sub OSInfoGet {
my ( $Self, %Param ) = @_;
my @Data = POSIX::uname();
# get main object
my $MainObject = $Kernel::OM->Get('Kernel::System::Main');
my %OSMap = (
linux => 'Linux',
freebsd => 'FreeBSD',
openbsd => 'OpenBSD',
darwin => 'MacOSX',
);
# If used OS is a linux system
my $OSName;
my $Distribution;
if ( $^O =~ /(linux|unix|netbsd)/i ) {
if ( $^O eq 'linux' ) {
$MainObject->Require('Linux::Distribution');
my $DistributionName = Linux::Distribution::distribution_name();
$Distribution = $DistributionName || 'unknown';
if ($DistributionName) {
my $DistributionVersion = Linux::Distribution::distribution_version() || '';
$OSName = $DistributionName . ' ' . $DistributionVersion;
}
}
elsif ( -e "/etc/issue" ) {
my $Content = $MainObject->FileRead(
Location => '/etc/issue',
Result => 'ARRAY',
);
if ($Content) {
$OSName = $Content->[0];
}
}
}
elsif ( $^O eq 'darwin' ) {
my $MacVersion = `sw_vers -productVersion` || '';
chomp $MacVersion;
$OSName = 'MacOSX ' . $MacVersion;
}
elsif ( $^O eq 'freebsd' || $^O eq 'openbsd' ) {
my $BSDVersion = `uname -r` || '';
chomp $BSDVersion;
$OSName = "$OSMap{$^O} $BSDVersion";
}
# collect OS data
my %EnvOS = (
Hostname => hostname_long(),
OSName => $OSName || 'Unknown version',
Distribution => $Distribution,
User => $ENV{USER} || $ENV{USERNAME},
Path => $ENV{PATH},
HostType => $ENV{HOSTTYPE},
LcCtype => $ENV{LC_CTYPE},
Cpu => $ENV{CPU},
MachType => $ENV{MACHTYPE},
POSIX => \@Data,
OS => $OSMap{$^O} || $^O,
);
return %EnvOS;
}
=head2 ModuleVersionGet()
Return the version of an installed perl module:
my $Version = $EnvironmentObject->ModuleVersionGet(
Module => 'MIME::Parser',
);
returns
$Version = '5.503';
or undef if the module is not installed.
=cut
sub ModuleVersionGet {
my ( $Self, %Param ) = @_;
my $File = "$Param{Module}.pm";
$File =~ s{::}{/}g;
# traverse @INC to see if the current module is installed in
# one of these locations
my $Path;
PATH:
for my $Dir (@INC) {
my $PossibleLocation = File::Spec->catfile( $Dir, $File );
next PATH if !-r $PossibleLocation;
$Path = $PossibleLocation;
last PATH;
}
# if we have no $Path the module is not installed
return if !$Path;
# determine version number by means of ExtUtils::MakeMaker
return MM->parse_version($Path);
}
=head2 PerlInfoGet()
collect perl information:
my %PerlInfo = $EnvironmentObject->PerlInfoGet();
you can also specify options:
my %PerlInfo = $EnvironmentObject->PerlInfoGet(
BundledModules => 1,
);
returns:
%PerlInfo = (
PerlVersion => "5.14.2",
# if you specified 'BundledModules => 1' you'll also get this:
Modules => {
"Algorithm::Diff" => "1.30",
"Apache::DBI" => 1.62,
......
},
);
=cut
sub PerlInfoGet {
my ( $Self, %Param ) = @_;
# collect perl data
my %EnvPerl = (
PerlVersion => sprintf "%vd",
$^V,
);
my %Modules;
if ( $Param{BundledModules} ) {
for my $Module (
qw(
parent
Algorithm::Diff
Apache::DBI
CGI
Class::Inspector
Crypt::PasswdMD5
CSS::Minifier
Email::Valid
Encode::Locale
IO::Interactive
JavaScript::Minifier
JSON
JSON::PP
Linux::Distribution
Locale::Codes
LWP
Mail::Address
Mail::Internet
MIME::Tools
Module::Refresh
Mozilla::CA
Net::IMAP::Simple
Net::HTTP
Net::SSLGlue
PDF::API2
SOAP::Lite
Sys::Hostname::Long
Text::CSV
Text::Diff
YAML
URI
)
)
{
$Modules{$Module} = $Self->ModuleVersionGet( Module => $Module );
}
}
# add modules list
if (%Modules) {
$EnvPerl{Modules} = \%Modules;
}
return %EnvPerl;
}
=head2 DBInfoGet()
collect database information
my %DBInfo = $EnvironmentObject->DBInfoGet();
returns
%DBInfo = (
Database => "otrsproduction",
Host => "dbserver.example.com",
User => "otrsuser",
Type => "mysql",
Version => "MySQL 5.5.31-0+wheezy1",
)
=cut
sub DBInfoGet {
my ( $Self, %Param ) = @_;
# get needed objects
my $ConfigObject = $Kernel::OM->Get('Kernel::Config');
my $DBObject = $Kernel::OM->Get('Kernel::System::DB');
# collect DB data
my %EnvDB = (
Host => $ConfigObject->Get('DatabaseHost'),
Database => $ConfigObject->Get('Database'),
User => $ConfigObject->Get('DatabaseUser'),
Type => $ConfigObject->Get('Database::Type') || $DBObject->{'DB::Type'},
Version => $DBObject->Version(),
);
return %EnvDB;
}
=head2 OTRSInfoGet()
collect OTRS information
my %OTRSInfo = $EnvironmentObject->OTRSInfoGet();
returns:
%OTRSInfo = (
Product => "OTRS",
Version => "3.3.1",
DefaultLanguage => "en",
Home => "/opt/otrs",
Host => "prod.otrs.com",
SystemID => 70,
);
=cut
sub OTRSInfoGet {
my ( $Self, %Param ) = @_;
# get config object
my $ConfigObject = $Kernel::OM->Get('Kernel::Config');
# collect OTRS data
my %EnvOTRS = (
Version => $ConfigObject->Get('Version'),
Home => $ConfigObject->Get('Home'),
Host => $ConfigObject->Get('FQDN'),
Product => $ConfigObject->Get('Product'),
SystemID => $ConfigObject->Get('SystemID'),
DefaultLanguage => $ConfigObject->Get('DefaultLanguage'),
);
return %EnvOTRS;
}
1;
=head1 TERMS AND CONDITIONS
This software is part of the OTRS project (L).
This software comes with ABSOLUTELY NO WARRANTY. For details, see
the enclosed file COPYING for license information (GPL). If you
did not receive this file, see L.
=cut