diff --git a/pandora_console/include/class/ConsoleSupervisor.php b/pandora_console/include/class/ConsoleSupervisor.php index 87a6f2dca0..7a16e47a1a 100644 --- a/pandora_console/include/class/ConsoleSupervisor.php +++ b/pandora_console/include/class/ConsoleSupervisor.php @@ -873,18 +873,20 @@ class ConsoleSupervisor { global $config; + $remote_config_dir = io_safe_output($config['remote_config']); + if (enterprise_installed() && isset($config['license_nms']) && $config['license_nms'] != 1 ) { - if (is_readable($config['remote_config']) !== true) { + if (is_readable($remote_config_dir) !== true) { $this->notify( [ 'type' => 'NOTIF.PERMISSIONS.REMOTE_CONFIG', 'title' => __('Remote configuration directory is not readable'), 'message' => __( 'Remote configuration directory %s is not readable. Please, adjust configuration.', - $config['remote_config'] + $remote_config_dir ), 'url' => ui_get_full_url('index.php?sec=general&sec2=godmode/setup/setup§ion=general'), ] @@ -896,14 +898,14 @@ class ConsoleSupervisor ); } - if (is_writable($config['remote_config'].'/conf') !== true) { + if (is_writable($remote_config_dir.'/conf') !== true) { $this->notify( [ 'type' => 'NOTIF.PERMISSIONS.REMOTE_CONFIG.CONF', 'title' => __('Remote configuration directory is not writable'), 'message' => __( 'Remote configuration directory %s is not writable. Please, adjust configuration.', - $config['remote_config'].'/conf' + $remote_config_dir.'/conf' ), 'url' => ui_get_full_url('index.php?sec=general&sec2=godmode/setup/setup§ion=general'), ] @@ -914,14 +916,14 @@ class ConsoleSupervisor ); } - if (is_writable($config['remote_config'].'/collections') !== true) { + if (is_writable($remote_config_dir.'/collections') !== true) { $this->notify( [ 'type' => 'NOTIF.PERMISSIONS.REMOTE_CONFIG.COLLECTIONS', 'title' => __('Remote collections directory is not writable'), 'message' => __( 'Collections directory %s is not writable. Please, adjust configuration.', - $config['remote_config'].'/collections' + $remote_config_dir.'/collections' ), 'url' => ui_get_full_url('index.php?sec=general&sec2=godmode/setup/setup§ion=general'), ] @@ -932,14 +934,14 @@ class ConsoleSupervisor ); } - if (is_writable($config['remote_config'].'/md5') !== true) { + if (is_writable($remote_config_dir.'/md5') !== true) { $this->notify( [ 'type' => 'NOTIF.PERMISSIONS.REMOTE_CONFIG.MD5', 'title' => __('Remote md5 directory is not writable'), 'message' => __( 'MD5 directory %s is not writable. Please, adjust configuration.', - $config['remote_config'].'/md5' + $remote_config_dir.'/md5' ), 'url' => ui_get_full_url('index.php?sec=general&sec2=godmode/setup/setup§ion=general'), ] @@ -957,7 +959,7 @@ class ConsoleSupervisor $MAX_BADXML_FILES_DATA_IN = 150; $filecount = $this->countFiles( - $config['remote_config'], + $remote_config_dir, '', $MAX_FILES_DATA_IN ); @@ -970,7 +972,7 @@ class ConsoleSupervisor 'message' => __( 'There are more than %d files in %s. Consider checking DataServer performance', $MAX_FILES_DATA_IN, - $config['remote_config'] + $remote_config_dir ), 'url' => ui_get_full_url('index.php?sec=general&sec2=godmode/setup/setup§ion=perf'), ] @@ -980,7 +982,7 @@ class ConsoleSupervisor } $filecount = $this->countFiles( - $config['remote_config'], + $remote_config_dir, '/^.*BADXML$/', $MAX_BADXML_FILES_DATA_IN ); @@ -993,7 +995,7 @@ class ConsoleSupervisor 'message' => __( 'There are more than %d files in %s. Consider checking software agents.', $MAX_BADXML_FILES_DATA_IN, - $config['remote_config'] + $remote_config_dir ), 'url' => ui_get_full_url('index.php?sec=general&sec2=godmode/setup/setup§ion=perf'), ] @@ -1266,7 +1268,8 @@ class ConsoleSupervisor $PHPSerialize_precision = ini_get('serialize_precision'); // PhantomJS status. - $result_ejecution = exec($config['phantomjs_bin'].'/phantomjs --version'); + $phantomjs_dir = io_safe_output($config['phantomjs_bin']); + $result_ejecution = exec($phantomjs_dir.'/phantomjs --version'); // PHP version checks. $php_version = phpversion(); @@ -1451,8 +1454,9 @@ class ConsoleSupervisor 'type' => 'NOTIF.PHP.SERIALIZE_PRECISION', 'title' => sprintf( __("Not recommended '%s' value in PHP configuration"), - 'serialze_precision' - ), 'message' => sprintf( + 'serialize_precision' + ), + 'message' => sprintf( __('Recommended value is: %s'), sprintf('-1') ).'

'.__('Please, change it on your PHP configuration file (php.ini) or contact with administrator'), @@ -2061,8 +2065,10 @@ class ConsoleSupervisor { global $config; - if (($config['fontpath'] == '') - || (file_exists($config['fontpath']) === false) + $fontpath = io_safe_output($config['fontpath']); + + if (($fontpath == '') + || (file_exists($fontpath) === false) ) { $this->notify( [ diff --git a/pandora_console/include/functions_config.php b/pandora_console/include/functions_config.php index bc5e64190d..9573e6549d 100644 --- a/pandora_console/include/functions_config.php +++ b/pandora_console/include/functions_config.php @@ -1500,7 +1500,7 @@ function config_process_config() if (!isset($config['remote_config'])) { if ($is_windows) { - $default = 'C:\\PandoraFMS\\Pandora_Server\\data_in'; + $default = 'C:\PandoraFMS\Pandora_Server\data_in'; } else { $default = '/var/spool/pandora/data_in'; } @@ -1510,7 +1510,7 @@ function config_process_config() if (!isset($config['phantomjs_bin'])) { if ($is_windows) { - $default = 'C:\\PandoraFMS\\phantomjs'; + $default = 'C:\PandoraFMS\Pandora_Server\bin'; } else { $default = '/usr/bin'; } @@ -1760,7 +1760,13 @@ function config_process_config() } if (!isset($config['auditdir'])) { - config_update_value('auditdir', '/var/www/html/pandora_console'); + $auditdir = '/var/www/html/pandora_console'; + if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { + // Windows. + $auditdir = $config['homedir']; + } + + config_update_value('auditdir', $auditdir); } if (!isset($config['elasticsearch_ip'])) { @@ -1794,6 +1800,7 @@ function config_process_config() /* * Parse the ACL IP list for access API */ + $temp_list_ACL_IPs_for_API = []; if (isset($config['list_ACL_IPs_for_API'])) { if (!empty($config['list_ACL_IPs_for_API'])) { @@ -1804,13 +1811,16 @@ function config_process_config() $config['list_ACL_IPs_for_API'] = $temp_list_ACL_IPs_for_API; $keysConfig = array_keys($config); - // This is not set here. The first time, when no - // setup is done, update_manager extension manage it - // the first time make a conenction and disable itself - // Not Managed here ! - // if (!isset ($config["autoupdate"])) { - // config_update_value ('autoupdate', true);. - // } + /* + * This is not set here. The first time, when no + * setup is done, update_manager extension manage it + * the first time make a conenction and disable itself + * Not Managed here ! + * if (!isset ($config["autoupdate"])) { + * config_update_value ('autoupdate', true);. + * } + */ + include_once $config['homedir'].'/include/auth/mysql.php'; include_once $config['homedir'].'/include/functions_io.php'; @@ -1819,10 +1829,16 @@ function config_process_config() // user, and should be in pandora root. By default, Pandora adds // /attachment to this, so by default is the pandora console home // dir. + $attachment_store_path = $config['homedir'].'/attachment'; + if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { + // Windows. + $attachment_store_path = $config['homedir'].'\attachment'; + } + if (!isset($config['attachment_store'])) { config_update_value( 'attachment_store', - io_safe_input($config['homedir']).'/attachment' + $attachment_store_path ); } else { // Fixed when the user moves the pandora console to another dir @@ -1830,16 +1846,23 @@ function config_process_config() if (!is_dir($config['attachment_store'])) { config_update_value( 'attachment_store', - $config['homedir'].'/attachment' + $attachment_store_path ); } } if (!isset($config['fontpath'])) { - $home = str_replace('\\', '/', $config['homedir']); + if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { + // Windows. + $fontpath = $config['homedir'].'\include\fonts\smallfont.ttf'; + } else { + $home = str_replace('\\', '/', $config['homedir']); + $fontpath = $home.'/include/fonts/smallfont.ttf'; + } + config_update_value( 'fontpath', - $home.'/include/fonts/smallfont.ttf' + $fontpath ); } @@ -2077,7 +2100,7 @@ function config_process_config() if (!isset($config['netflow_path'])) { if ($is_windows) { - $default = 'C:\\PandoraFMS\\Pandora_Server\\data_in\\netflow'; + $default = 'C:\PandoraFMS\Pandora_Server\data_in\netflow'; } else { $default = '/var/spool/pandora/data_in/netflow'; } diff --git a/pandora_console/include/gettext.php b/pandora_console/include/gettext.php index 152040f327..5d3abd83fe 100644 --- a/pandora_console/include/gettext.php +++ b/pandora_console/include/gettext.php @@ -104,7 +104,7 @@ class gettext_reader { * @param boolean enable_cache Enable or disable caching of strings (default on) */ function gettext_reader($Reader, $enable_cache = true) { - $machine = @shell_exec('uname -m'); + $machine = php_uname("m"); $enabled64Bits = false; if (preg_match('/64/', $machine)) { diff --git a/pandora_server/lib/PandoraFMS/Config.pm b/pandora_server/lib/PandoraFMS/Config.pm index 20934859c7..41c911e325 100644 --- a/pandora_server/lib/PandoraFMS/Config.pm +++ b/pandora_server/lib/PandoraFMS/Config.pm @@ -357,7 +357,15 @@ sub pandora_load_config { # Xprobe2 for recon OS fingerprinting and tcpscan (optional) $pa_config->{"xprobe2"} = "/usr/bin/xprobe2"; + # Winexe allows to exec commands on remote windows systems (optional) + $pa_config->{"winexe"} = "/usr/bin/winexe"; + + # PsExec allows to exec commands on remote windows systems from windows servers (optional) + $pa_config->{"psexec"} = 'C:\PandoraFMS\Pandora_Server\bin\PsExec.exe'; + # plink allows to exec commands on remote linux systems from windows servers (optional) + $pa_config->{"plink"} = 'C:\PandoraFMS\Pandora_Server\bin\plink.exe'; + # Snmpget for snmpget system command (optional) $pa_config->{"snmpget"} = "/usr/bin/snmpget"; @@ -838,6 +846,15 @@ sub pandora_load_config { elsif ($parametro =~ m/^xprobe2\s(.*)/i) { $pa_config->{'xprobe2'}= clean_blank($1); } + elsif ($parametro =~ m/^winexe\s(.*)/i) { + $pa_config->{'winexe'}= clean_blank($1); + } + elsif ($parametro =~ m/^psexec\s(.*)/i) { + $pa_config->{'psexec'}= clean_blank($1); + } + elsif ($parametro =~ m/^plink\s(.*)/i) { + $pa_config->{'plink'}= clean_blank($1); + } elsif ($parametro =~ m/^snmpget\s(.*)/i) { $pa_config->{'snmpget'}= clean_blank($1); } diff --git a/pandora_server/lib/PandoraFMS/DiscoveryServer.pm b/pandora_server/lib/PandoraFMS/DiscoveryServer.pm index 6f7eab4c68..b2d8e71619 100644 --- a/pandora_server/lib/PandoraFMS/DiscoveryServer.pm +++ b/pandora_server/lib/PandoraFMS/DiscoveryServer.pm @@ -343,6 +343,9 @@ sub exec_recon_script ($$$) { sub PandoraFMS::Recon::Base::guess_os($$) { my ($self, $device) = @_; + $DEVNULL = '/dev/null' if (!defined($DEVNULL)); + $DEVNULL = '/NUL' if ($^O =~ /win/i && !defined($DEVNULL)); + # OS detection disabled. Use the device type. if ($self->{'os_detection'} == 0) { my $device_type = $self->get_device_type($device); @@ -354,17 +357,20 @@ sub PandoraFMS::Recon::Base::guess_os($$) { } # Use xprobe2 if available - if (-e $self->{pa_config}->{xprobe2}) { - my $output = `"$self->{pa_config}->{xprobe2}" $device 2>$DEVNULL | grep 'Running OS' | head -1`; + if (-x $self->{'pa_config'}->{'xprobe2'}) { + my $return = `"$self->{pa_config}->{xprobe2}" $device 2>$DEVNULL`; if ($? == 0) { + my ($output) = $a =~ /Running OS:(.*)/; return pandora_get_os($self->{'dbh'}, $output); } } # Use nmap by default - if (-e $self->{pa_config}->{nmap}) { - my $output = `"$self->{pa_config}->{nmap}" -F -O $device 2>$DEVNULL | grep 'Aggressive OS guesses'`; + if (-x $self->{'pa_config'}->{'nmap'}) { + my $return = `"$self->{pa_config}->{nmap}" -F -O $device 2>$DEVNULL`; return OS_OTHER if ($? != 0); + + my ($output) = $return =~ /Aggressive OS guesses:\s*(.*)/; return pandora_get_os($self->{'dbh'}, $output); } @@ -377,7 +383,11 @@ sub PandoraFMS::Recon::Base::guess_os($$) { sub PandoraFMS::Recon::Base::tcp_scan ($$) { my ($self, $host) = @_; - my $open_ports = `"$self->{pa_config}->{nmap}" -p$self->{recon_ports} $host | grep open | wc -l`; + my $r = `"$self->{pa_config}->{nmap}" -p$self->{recon_ports} $host`; + + # Same as ""| grep open | wc -l" but multi-OS; + my $open_ports = () = $r =~ /open/gm; + return $open_ports; } diff --git a/pandora_server/lib/PandoraFMS/Recon/Base.pm b/pandora_server/lib/PandoraFMS/Recon/Base.pm index 223c36f248..335504821e 100644 --- a/pandora_server/lib/PandoraFMS/Recon/Base.pm +++ b/pandora_server/lib/PandoraFMS/Recon/Base.pm @@ -36,7 +36,7 @@ use constant { DISCOVERY_DEPLOY_AGENTS => 9, }; -# /dev/null +# $DEVNULL my $DEVNULL = ($^O eq 'MSWin32') ? '/Nul' : '/dev/null'; # Some useful OIDs. @@ -852,7 +852,7 @@ sub get_routes($) { $self->{'routes'} = []; # Parse route's output. - my @output = `route -n 2>/dev/null`; + my @output = `route -n 2>$DEVNULL`; foreach my $line (@output) { chomp($line); if ($line =~ /^0\.0\.0\.0\s+(\d+\.\d+\.\d+\.\d+).*/) { @@ -1220,7 +1220,7 @@ sub snmp_responds_v3($$) { sub local_arp($) { my ($self) = @_; - my @output = `arp -an 2>/dev/null`; + my @output = `arp -an 2>$DEVNULL`; foreach my $line (@output) { next unless ($line =~ m/\((\S+)\) at ([0-9a-f]+:[0-9a-f]+:[0-9a-f]+:[0-9a-f]+:[0-9a-f]+:[0-9a-f]+)/); $self->add_mac(parse_mac($2), $1); @@ -1286,7 +1286,7 @@ sub ping ($$$) { for (my $i = 0; $i < $retries; $i++) { # Note: There is no timeout option. - `$ping_command -s -n $host 56 $packets >/dev/null 2>&1`; + `$ping_command -s -n $host 56 $packets >$DEVNULL 2>&1`; return 1 if ($? == 0); } @@ -1299,7 +1299,7 @@ sub ping ($$$) { for (my $i = 0; $i < $retries; $i++) { # Note: There is no timeout option for ping6. - `$ping_command -q -n -c $packets $host >/dev/null 2>&1`; + `$ping_command -q -n -c $packets $host >$DEVNULL 2>&1`; return 1 if ($? == 0); } @@ -1312,7 +1312,7 @@ sub ping ($$$) { for (my $i = 0; $i < $retries; $i++) { # Note: There is no timeout option for ping6. - `$ping_command -q -n -c $packets $host >/dev/null 2>&1`; + `$ping_command -q -n -c $packets $host >$DEVNULL 2>&1`; if ($? == 0) { return 1; } @@ -1324,7 +1324,7 @@ sub ping ($$$) { # Assume Linux by default. my $ping_command = $host =~ /\d+:|:\d+/ ? "ping6" : "ping"; for (my $i = 0; $i < $retries; $i++) { - `$ping_command -q -W $timeout -n -c $packets $host >/dev/null 2>&1`; + `$ping_command -q -W $timeout -n -c $packets $host >$DEVNULL 2>&1`; return 1 if ($? == 0); } @@ -1529,99 +1529,101 @@ sub app_scan($) { $self->{'task_data'} ); - if (!$dbObj->is_connected()) { - call('message', 'Cannot connect to target ' . $target, 3); - $global_percent += $global_step; - $self->{'c_network_percent'} = 90; - # Update progress - $self->call('update_progress', $global_percent + (90 / (scalar @targets))); - $self->{'summary'}->{'not_alive'} += 1; - push @modules, { - name => $type . ' connection', - type => 'generic_proc', - data => 0, - description => $type . ' availability' - }; + if (defined($dbObj)) { + if (!$dbObj->is_connected()) { + call('message', 'Cannot connect to target ' . $target, 3); + $global_percent += $global_step; + $self->{'c_network_percent'} = 90; + # Update progress + $self->call('update_progress', $global_percent + (90 / (scalar @targets))); + $self->{'summary'}->{'not_alive'} += 1; + push @modules, { + name => $type . ' connection', + type => 'generic_proc', + data => 0, + description => $type . ' availability' + }; - } else { - my $dbObjCfg = $dbObj->get_config(); + } else { + my $dbObjCfg = $dbObj->get_config(); - $self->{'summary'}->{'discovered'} += 1; - $self->{'summary'}->{'alive'} += 1; + $self->{'summary'}->{'discovered'} += 1; + $self->{'summary'}->{'alive'} += 1; - push @modules, { - name => $type . ' connection', - type => 'generic_proc', - data => 1, - description => $type . ' availability' - }; + push @modules, { + name => $type . ' connection', + type => 'generic_proc', + data => 1, + description => $type . ' availability' + }; - # Analyze. - $self->{'step'} = STEP_STATISTICS; - $self->{'c_network_percent'} = 30; - $self->call('update_progress', $global_percent + (30 / (scalar @targets))); - $self->{'c_network_name'} = $dbObj->get_host(); + # Analyze. + $self->{'step'} = STEP_STATISTICS; + $self->{'c_network_percent'} = 30; + $self->call('update_progress', $global_percent + (30 / (scalar @targets))); + $self->{'c_network_name'} = $dbObj->get_host(); - # Retrieve connection statistics. - # Retrieve uptime statistics - # Retrieve query stats - # Retrieve connections - # Retrieve innodb - # Retrieve cache - $self->{'c_network_percent'} = 50; - $self->call('update_progress', $global_percent + (50 / (scalar @targets))); - push @modules, $dbObj->get_statistics(); + # Retrieve connection statistics. + # Retrieve uptime statistics + # Retrieve query stats + # Retrieve connections + # Retrieve innodb + # Retrieve cache + $self->{'c_network_percent'} = 50; + $self->call('update_progress', $global_percent + (50 / (scalar @targets))); + push @modules, $dbObj->get_statistics(); - # Custom queries. - $self->{'step'} = STEP_CUSTOM_QUERIES; - $self->{'c_network_percent'} = 80; - $self->call('update_progress', $global_percent + (80 / (scalar @targets))); - push @modules, $dbObj->execute_custom_queries(); + # Custom queries. + $self->{'step'} = STEP_CUSTOM_QUERIES; + $self->{'c_network_percent'} = 80; + $self->call('update_progress', $global_percent + (80 / (scalar @targets))); + push @modules, $dbObj->execute_custom_queries(); - if (defined($dbObjCfg->{'scan_databases'}) - && $dbObjCfg->{'scan_databases'} == 1) { - # Skip database scan in Oracle tasks - next if $self->{'type'} == DISCOVERY_APP_ORACLE; + if (defined($dbObjCfg->{'scan_databases'}) + && "$dbObjCfg->{'scan_databases'}" eq "1") { + # Skip database scan in Oracle tasks + next if $self->{'type'} == DISCOVERY_APP_ORACLE; - my $__data = $dbObj->scan_databases(); + my $__data = $dbObj->scan_databases(); - if (ref($__data) eq "ARRAY") { - if (defined($dbObjCfg->{'agent_per_database'}) - && $dbObjCfg->{'agent_per_database'} == 1) { - # Agent per database detected. - push @data, @{$__data}; - } else { - # Merge modules into engine agent. - my @_modules = map { - map { $_ } @{$_->{'module_data'}} - } @{$__data}; + if (ref($__data) eq "ARRAY") { + if (defined($dbObjCfg->{'agent_per_database'}) + && $dbObjCfg->{'agent_per_database'} == 1) { + # Agent per database detected. + push @data, @{$__data}; + } else { + # Merge modules into engine agent. + my @_modules = map { + map { $_ } @{$_->{'module_data'}} + } @{$__data}; - push @modules, @_modules; + push @modules, @_modules; + } } } } + + # Put engine agent at the beginning of the list. + my $version = $dbObj->get_version(); + unshift @data,{ + 'agent_data' => { + 'agent_name' => $dbObj->get_agent_name(), + 'os' => $type, + 'os_version' => (defined($version) ? $version : 'Discovery'), + 'interval' => $self->{'task_data'}->{'interval_sweep'}, + 'id_group' => $self->{'task_data'}->{'id_group'}, + 'address' => $dbObj->get_host(), + 'description' => '', + }, + 'module_data' => \@modules, + }; + + $self->call('create_agents', \@data); + + # Destroy item. + undef($dbObj); } - # Put engine agent at the beginning of the list. - my $version = $dbObj->get_version(); - unshift @data,{ - 'agent_data' => { - 'agent_name' => $dbObj->get_agent_name(), - 'os' => $type, - 'os_version' => (defined($version) ? $version : 'Discovery'), - 'interval' => $self->{'task_data'}->{'interval_sweep'}, - 'id_group' => $self->{'task_data'}->{'id_group'}, - 'address' => $dbObj->get_host(), - 'description' => '', - }, - 'module_data' => \@modules, - }; - - $self->call('create_agents', \@data); - - # Destroy item. - undef($dbObj); - $global_percent += $global_step; $self->{'c_network_percent'} = 100; $self->call('update_progress', $global_percent); @@ -1674,7 +1676,7 @@ sub deploy_scan($) { ########################################################################## sub scan($) { my ($self) = @_; - my ($progress, $step); + my ($progress, $step) = 1, 0; # 1% $self->call('update_progress', 1); @@ -1697,7 +1699,7 @@ sub scan($) { } # Find devices. - $self->call('message', "[1/5] Scanning the network...", 3); + $self->call('message', "[1/4] Scanning the network...", 3); $self->{'step'} = STEP_SCANNING; $self->call('update_progress', $progress); $self->scan_subnet(); @@ -1713,7 +1715,7 @@ sub scan($) { $self->call('delete_connections'); # Connectivity from address forwarding tables. - $self->call('message', "[1/4] Finding address forwarding table connectivity...", 3); + $self->call('message', "[2/4] Finding address forwarding table connectivity...", 3); $self->{'step'} = STEP_AFT; ($progress, $step) = (50, 20.0 / scalar(@hosts)); # From 50% to 70%. for (my $i = 0; defined($hosts[$i]); $i++) { @@ -1831,7 +1833,7 @@ sub snmp_get_command { my ($self, $device, $oid, $community, $vlan) = @_; $vlan = defined($vlan) ? "\@" . $vlan : ''; - my $command = "snmpwalk -M/dev/null -r$self->{'snmp_checks'} -t$self->{'snmp_timeout'} -v$self->{'snmp_version'} -On -Oe "; + my $command = "snmpwalk -M$DEVNULL -r$self->{'snmp_checks'} -t$self->{'snmp_timeout'} -v$self->{'snmp_version'} -On -Oe "; if ($self->{'snmp_version'} eq "3") { if ($self->{'community'}) { # Context $command .= " -N $self->{'community'} "; @@ -1847,7 +1849,7 @@ sub snmp_get_command { $command .= " -c$community$vlan "; } - return "$command $device $oid 2>/dev/null"; + return "$command $device $oid 2>$DEVNULL"; } diff --git a/pandora_server/lib/PandoraFMS/Tools.pm b/pandora_server/lib/PandoraFMS/Tools.pm index 715703b5b6..e07a4e9ae6 100755 --- a/pandora_server/lib/PandoraFMS/Tools.pm +++ b/pandora_server/lib/PandoraFMS/Tools.pm @@ -994,7 +994,8 @@ sub load_average { $load_average = ((split(/\s+/, `/sbin/sysctl -n vm.loadavg`))[1]); } elsif ($OSNAME eq "MSWin32") { # Windows hasn't got load average. - $load_average = undef; + $load_average = `powershell "(Get-WmiObject win32_processor | Measure-Object -property LoadPercentage -Average).average"`; + chop($load_average); } # by default LINUX calls else {