This commit is contained in:
Jose Gonzalez 2023-02-13 10:03:09 +01:00
commit d6eedf07aa
53 changed files with 17605 additions and 13934 deletions

View File

@ -0,0 +1,320 @@
#!/bin/bash
#######################################################
# PandoraFMS Community online installation script
#######################################################
## Tested versions ##
# Centos 8.4, 8.5
# Rocky 8.4, 8.5, 8.6, 8.7
# Almalinuz 8.4, 8.5
# RedHat 8.5
#Constants
S_VERSION='202302081'
LOGFILE="/tmp/deploy-ext-db-$(date +%F).log"
# define default variables
[ "$TZ" ] || TZ="Europe/Madrid"
[ "$MYVER" ] || MYVER=57
[ "$DBHOST" ] || DBHOST=127.0.0.1
[ "$DBNAME" ] || DBNAME=pandora
[ "$DBUSER" ] || DBUSER=pandora
[ "$DBPASS" ] || DBPASS=pandora
[ "$DBPORT" ] || DBPORT=3306
[ "$DBROOTUSER" ] || DBROOTUSER=root
[ "$DBROOTPASS" ] || DBROOTPASS=pandora
[ "$SKIP_DATABASE_INSTALL" ] || SKIP_DATABASE_INSTALL=0
[ "$SKIP_KERNEL_OPTIMIZATIONS" ] || SKIP_KERNEL_OPTIMIZATIONS=0
[ "$POOL_SIZE" ] || POOL_SIZE=$(grep -i total /proc/meminfo | head -1 | awk '{printf "%.2f \n", $(NF-1)*0.4/1024}' | sed "s/\\..*$/M/g")
# Ansi color code variables
red="\e[0;91m"
green="\e[0;92m"
cyan="\e[0;36m"
reset="\e[0m"
# Functions
execute_cmd () {
local cmd="$1"
local msg="$2"
echo -e "${cyan}$msg...${reset}"
$cmd &>> "$LOGFILE"
if [ $? -ne 0 ]; then
echo -e "${red}Fail${reset}"
[ "$3" ] && echo "$3"
echo "Error installing Pandora FMS for detailed error please check log: $LOGFILE"
rm -rf "$HOME"/pandora_deploy_tmp &>> "$LOGFILE"
exit 1
else
echo -e "\e[1A\e ${cyan}$msg...${reset} ${green}OK${reset}"
return 0
fi
}
check_cmd_status () {
if [ $? -ne 0 ]; then
echo -e "${red}Fail${reset}"
[ "$1" ] && echo "$1"
echo "Error installing Pandora FMS for detailed error please check log: $LOGFILE"
rm -rf "$HOME"/pandora_deploy_tmp/*.rpm* &>> "$LOGFILE"
exit 1
else
echo -e "${green}OK${reset}"
return 0
fi
}
check_root_permissions () {
echo -en "${cyan}Checking root account... ${reset}"
if [ "$(whoami)" != "root" ]; then
echo -e "${red}Fail${reset}"
echo "Please use a root account or sudo for installing Pandora FMS"
echo "Error installing Pandora FMS for detailed error please check log: $LOGFILE"
exit 1
else
echo -e "${green}OK${reset}"
fi
}
## Main
echo "Starting PandoraFMS External DB deployment EL8 ver. $S_VERSION"
# Centos Version
if [ ! "$(grep -Ei 'centos|rocky|Almalinux|Red Hat Enterprise' /etc/redhat-release)" ]; then
printf "\n ${red}Error this is not a Centos/Rocky/Almalinux Base system, this installer is compatible with RHEL/Almalinux/Centos/Rockylinux systems only${reset}\n"
exit 1
fi
echo -en "${cyan}Check Centos Version...${reset}"
[ $(sed -nr 's/VERSION_ID+=\s*"([0-9]).*"$/\1/p' /etc/os-release) -eq '8' ]
check_cmd_status 'Error OS version, RHEL/Almalinux/Centos/Rockylinux 8+ is expected'
#Detect OS
os_name=$(grep ^PRETTY_NAME= /etc/os-release | cut -d '=' -f2 | tr -d '"')
execute_cmd "echo $os_name" "OS detected: ${os_name}"
# initialice logfile
execute_cmd "echo 'Starting community deployment' > $LOGFILE" "All installer activity is logged on $LOGFILE"
echo "Community installer version: $S_VERSION" >> "$LOGFILE"
# Pre checks
# Root permisions
check_root_permissions
# Systemd
execute_cmd "systemctl status" "Checking SystemD" 'This is not a SystemD enable system, if tryng to use in a docker env please check: https://github.com/pandorafms/pandorafms/tree/develop/extras/docker/centos8'
# Check memomry greather or equal to 2G
execute_cmd "[ $(grep MemTotal /proc/meminfo | awk '{print $2}') -ge 1700000 ]" 'Checking memory (required: 2 GB)'
# Check disk size at least 10 Gb free space
execute_cmd "[ $(df -BM / | tail -1 | awk '{print $4}' | tr -d M) -gt 10000 ]" 'Checking Disk (required: 10 GB free min)'
# Setting timezone
rm -rf /etc/localtime &>> "$LOGFILE"
execute_cmd "timedatectl set-timezone $TZ" "Setting Timezone $TZ"
# Execute tools check
execute_cmd "awk --version" 'Checking needed tools: awk'
execute_cmd "grep --version" 'Checking needed tools: grep'
execute_cmd "sed --version" 'Checking needed tools: sed'
execute_cmd "dnf --version" 'Checking needed tools: dnf'
# Creating working directory
rm -rf "$HOME"/pandora_deploy_tmp/*.rpm* &>> "$LOGFILE"
mkdir "$HOME"/pandora_deploy_tmp &>> "$LOGFILE"
execute_cmd "cd $HOME/pandora_deploy_tmp" "Moving to workspace: $HOME/pandora_deploy_tmp"
## Extra steps on redhat envs
if [ "$(grep -Ei 'Red Hat Enterprise' /etc/redhat-release)" ]; then
## In case REDHAT
# Check susbscription manager status:
echo -en "${cyan}Checking Red Hat Enterprise subscription... ${reset}"
subscription-manager list &>> "$LOGFILE"
subscription-manager status &>> "$LOGFILE"
check_cmd_status 'Error checking subscription status, make sure your server is activated and suscribed to Red Hat Enterprise repositories'
# Ckeck repolist
dnf repolist &>> "$LOGFILE"
echo -en "${cyan}Checking Red Hat Enterprise repolist... ${reset}"
dnf repolist | grep 'rhel-8-for-x86_64-baseos-rpms' &>> "$LOGFILE"
check_cmd_status 'Error checking repositories status, could try a subscription-manager attach command or contact sysadmin'
#install extra repos
extra_repos=" \
tar \
dnf-utils \
https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm \
https://repo.percona.com/yum/percona-release-latest.noarch.rpm"
execute_cmd "dnf install -y $extra_repos" "Installing extra repositories"
execute_cmd "subscription-manager repos --enable codeready-builder-for-rhel-8-x86_64-rpms" "Enabling subscription to codeready-builder"
else
# For alma/rocky/centos
extra_repos=" \
tar \
dnf-utils \
epel-release \
https://repo.percona.com/yum/percona-release-latest.noarch.rpm"
execute_cmd "dnf install -y $extra_repos" "Installing extra repositories"
execute_cmd "dnf config-manager --set-enabled powertools" "Configuring Powertools"
fi
#Installing wget
execute_cmd "dnf install -y wget" "Installing wget"
# Install percona Database
execute_cmd "dnf module disable -y mysql" "Disabiling mysql module"
if [ "$MYVER" -eq '80' ] ; then
execute_cmd "percona-release setup ps80 -y" "Enabling mysql80 module"
execute_cmd "dnf install -y percona-server-server percona-xtrabackup-24" "Installing Percona Server 80"
fi
if [ "$MYVER" -ne '80' ] ; then
execute_cmd "dnf install -y Percona-Server-server-57 percona-xtrabackup-24" "Installing Percona Server 57"
fi
# Disabling SELINUX and firewalld
setenforce 0 &>> "$LOGFILE"
sed -i -e "s/^SELINUX=.*/SELINUX=disabled/g" /etc/selinux/config &>> "$LOGFILE"
systemctl disable firewalld --now &>> "$LOGFILE"
# Adding standar cnf for initial setup.
cat > /etc/my.cnf << EO_CONFIG_TMP
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
EO_CONFIG_TMP
#Configuring Database
if [ "$SKIP_DATABASE_INSTALL" -eq '0' ] ; then
execute_cmd "systemctl start mysqld" "Starting database engine"
export MYSQL_PWD=$(grep "temporary password" /var/log/mysqld.log | rev | cut -d' ' -f1 | rev)
if [ "$MYVER" -eq '80' ] ; then
echo """
SET PASSWORD FOR '$DBROOTUSER'@'localhost' = 'Pandor4!';
UNINSTALL COMPONENT 'file://component_validate_password';
SET PASSWORD FOR '$DBROOTUSER'@'localhost' = '$DBROOTPASS';
""" | mysql --connect-expired-password -u$DBROOTUSER &>> "$LOGFILE"
fi
if [ "$MYVER" -ne '80' ] ; then
echo """
SET PASSWORD FOR '$DBROOTUSER'@'localhost' = PASSWORD('Pandor4!');
UNINSTALL PLUGIN validate_password;
SET PASSWORD FOR '$DBROOTUSER'@'localhost' = PASSWORD('$DBROOTPASS');
""" | mysql --connect-expired-password -u$DBROOTUSER &>> "$LOGFILE"fi
fi
export MYSQL_PWD=$DBROOTPASS
echo -en "${cyan}Creating Pandora FMS database...${reset}"
echo "create database $DBNAME" | mysql -u$DBROOTUSER -P$DBPORT -h$DBHOST
check_cmd_status "Error creating database $DBNAME, is this an empty node? if you have a previus installation please contact with support."
echo "CREATE USER \"$DBUSER\"@'%' IDENTIFIED BY \"$DBPASS\";" | mysql -u$DBROOTUSER -P$DBPORT -h$DBHOST
echo "ALTER USER \"$DBUSER\"@'%' IDENTIFIED WITH mysql_native_password BY \"$DBPASS\"" | mysql -u$DBROOTUSER -P$DBPORT -h$DBHOST
echo "GRANT ALL PRIVILEGES ON $DBNAME.* TO \"$DBUSER\"@'%'" | mysql -u$DBROOTUSER -P$DBPORT -h$DBHOST
#Generating my.cnf
cat > /etc/my.cnf << EO_CONFIG_F
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
character-set-server=utf8
skip-character-set-client-handshake
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Mysql optimizations for Pandora FMS
# Please check the documentation in http://pandorafms.com for better results
max_allowed_packet = 64M
innodb_buffer_pool_size = $POOL_SIZE
innodb_lock_wait_timeout = 90
innodb_file_per_table
innodb_flush_log_at_trx_commit = 0
innodb_flush_method = O_DIRECT
innodb_log_file_size = 64M
innodb_log_buffer_size = 16M
innodb_io_capacity = 100
thread_cache_size = 8
thread_stack = 256K
max_connections = 100
key_buffer_size=4M
read_buffer_size=128K
read_rnd_buffer_size=128K
sort_buffer_size=128K
join_buffer_size=4M
query_cache_type = 1
query_cache_size = 64M
query_cache_min_res_unit = 2k
query_cache_limit = 256K
#skip-log-bin
sql_mode=""
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
EO_CONFIG_F
if [ "$MYVER" -eq '80' ] ; then
sed -i -e "/query_cache.*/ s/^#*/#/g" /etc/my.cnf
sed -i -e "s/#skip-log-bin/skip-log-bin/g" /etc/my.cnf
fi
execute_cmd "systemctl restart mysqld" "Configuring database engine"
execute_cmd "systemctl enable mysqld --now" "Enabling Database service"
fi
export MYSQL_PWD=$DBPASS
# Kernel optimization
if [ "$SKIP_KERNEL_OPTIMIZATIONS" -eq '0' ] ; then
cat >> /etc/sysctl.conf <<EO_KO
# Pandora FMS Optimization
# default=5
net.ipv4.tcp_syn_retries = 3
# default=5
net.ipv4.tcp_synack_retries = 3
# default=1024
net.ipv4.tcp_max_syn_backlog = 65536
# default=124928
net.core.wmem_max = 8388608
# default=131071
net.core.rmem_max = 8388608
# default = 128
net.core.somaxconn = 1024
# default = 20480
net.core.optmem_max = 81920
EO_KO
[ -d /dev/lxd/ ] || execute_cmd "sysctl --system" "Applying Kernel optimization"
fi
execute_cmd "echo done" "Percona server installed"
cd
execute_cmd "rm -rf $HOME/pandora_deploy_tmp" "Removing temporary files"

View File

@ -0,0 +1,257 @@
#!/bin/bash
##############################################################################################################
# PandoraFMS Community online installation script for Ubuntu 22.04
##############################################################################################################
## Tested versions ##
# Ubuntu 22.04.1
#avoid promps
export DEBIAN_FRONTEND=noninteractive
export NEEDRESTART_SUSPEND=1
#Constants
PANDORA_CONSOLE=/var/www/html/pandora_console
PANDORA_SERVER_CONF=/etc/pandora/pandora_server.conf
PANDORA_AGENT_CONF=/etc/pandora/pandora_agent.conf
WORKDIR=/opt/pandora/deploy
S_VERSION='202302081'
LOGFILE="/tmp/deploy-ext-db-$(date +%F).log"
rm -f $LOGFILE &> /dev/null # remove last log before start
# define default variables
[ "$TZ" ] || TZ="Europe/Madrid"
[ "$DBHOST" ] || DBHOST=127.0.0.1
[ "$DBNAME" ] || DBNAME=pandora
[ "$DBUSER" ] || DBUSER=pandora
[ "$DBPASS" ] || DBPASS=pandora
[ "$DBPORT" ] || DBPORT=3306
[ "$DBROOTPASS" ] || DBROOTPASS=pandora
[ "$SKIP_DATABASE_INSTALL" ] || SKIP_DATABASE_INSTALL=0
[ "$SKIP_KERNEL_OPTIMIZATIONS" ] || SKIP_KERNEL_OPTIMIZATIONS=0
[ "$POOL_SIZE" ] || POOL_SIZE=$(grep -i total /proc/meminfo | head -1 | awk '{printf "%.2f \n", $(NF-1)*0.4/1024}' | sed "s/\\..*$/M/g")
# Ansi color code variables
red="\e[0;91m"
green="\e[0;92m"
cyan="\e[0;36m"
reset="\e[0m"
# Functions
execute_cmd () {
local cmd="$1"
local msg="$2"
echo -e "${cyan}$msg...${reset}"
$cmd &>> "$LOGFILE"
if [ $? -ne 0 ]; then
echo -e "${red}Fail${reset}"
[ "$3" ] && echo "$3"
echo "Error installing Pandora FMS for detailed error please check log: $LOGFILE"
rm -rf "$WORKDIR" &>> "$LOGFILE"
exit 1
else
echo -e "\e[1A\e ${cyan}$msg...${reset} ${green}OK${reset}"
return 0
fi
}
check_cmd_status () {
if [ $? -ne 0 ]; then
echo -e "${red}Fail${reset}"
[ "$1" ] && echo "$1"
echo "Error installing Pandora FMS for detailed error please check log: $LOGFILE"
rm -rf "$WORKDIR" &>> "$LOGFILE"
exit 1
else
echo -e "${green}OK${reset}"
return 0
fi
}
check_root_permissions () {
echo -en "${cyan}Checking root account... ${reset}"
if [ "$(whoami)" != "root" ]; then
echo -e "${red}Fail${reset}"
echo "Please use a root account or sudo for installing Pandora FMS"
echo "Error installing Pandora FMS for detailed error please check log: $LOGFILE"
exit 1
else
echo -e "${green}OK${reset}"
fi
}
## Main
echo "Starting PandoraFMS External DB deployment Ubuntu 22.04 ver. $S_VERSION"
# Ubuntu Version
if [ ! "$(grep -Ei 'Ubuntu' /etc/lsb-release)" ]; then
printf "\n ${red}Error this is not a Ubuntu system, this installer is compatible with Ubuntu systems only${reset}\n"
exit 1
fi
echo -en "${cyan}Check Ubuntu Version...${reset}"
[ $(sed -nr 's/VERSION_ID+=\s*"([0-9][0-9].[0-9][0-9])"$/\1/p' /etc/os-release) == "22.04" ]
check_cmd_status 'Error OS version, Ubuntu 22.04 is expected'
#Detect OS
os_name=$(grep ^PRETTY_NAME= /etc/os-release | cut -d '=' -f2 | tr -d '"')
execute_cmd "echo $os_name" "OS detected: ${os_name}"
# initialice logfile
execute_cmd "echo 'Starting community deployment' > $LOGFILE" "All installer activity is logged on $LOGFILE"
echo "Community installer version: $S_VERSION" >> "$LOGFILE"
# Pre checks
# Root permisions
check_root_permissions
#Install awk, sed, grep if not present
execute_cmd "apt install -y gawk sed grep" 'Installing needed tools'
# Systemd
execute_cmd "systemctl --version" "Checking SystemD" 'This is not a SystemD enable system, if tryng to use in a docker env please check: https://github.com/pandorafms/pandorafms/tree/develop/extras/docker/centos8'
# Check memomry greather or equal to 2G
execute_cmd "[ $(grep MemTotal /proc/meminfo | awk '{print $2}') -ge 1700000 ]" 'Checking memory (required: 2 GB)'
# Check disk size at least 10 Gb free space
execute_cmd "[ $(df -BM / | tail -1 | awk '{print $4}' | tr -d M) -gt 10000 ]" 'Checking Disk (required: 10 GB free min)'
# Setting timezone
rm -rf /etc/localtime &>> "$LOGFILE"
execute_cmd "timedatectl set-timezone $TZ" "Setting Timezone $TZ"
# Execute tools check
execute_cmd "awk --version" 'Checking needed tools: awk'
execute_cmd "grep --version" 'Checking needed tools: grep'
execute_cmd "sed --version" 'Checking needed tools: sed'
execute_cmd "apt --version" 'Checking needed tools: apt'
# Creating working directory
rm -rf "$WORKDIR" &>> "$LOGFILE"
mkdir -p "$WORKDIR" &>> "$LOGFILE"
execute_cmd "cd $WORKDIR" "Moving to workdir: $WORKDIR"
## Install utils
execute_cmd "apt update" "Updating repos"
execute_cmd "apt install -y net-tools vim curl wget software-properties-common apt-transport-https" "Installing utils"
# Disabling apparmor and ufw
systemctl stop ufw.service &>> "$LOGFILE"
systemctl disable ufw &>> "$LOGFILE"
systemctl stop apparmor &>> "$LOGFILE"
systemctl disable apparmor &>> "$LOGFILE"
#install mysql
execute_cmd "curl -O https://repo.percona.com/apt/percona-release_latest.generic_all.deb" "Downloading Percona repository for MySQL8"
execute_cmd "apt install -y gnupg2 lsb-release ./percona-release_latest.generic_all.deb" "Installing Percona repository for MySQL8"
execute_cmd "percona-release setup ps80" "Configuring Percona repository for MySQL8"
echo -en "${cyan}Installing Percona Server for MySQL8...${reset}"
env DEBIAN_FRONTEND=noninteractive apt install -y percona-server-server &>> "$LOGFILE"
check_cmd_status "Error Installing MySql Server"
#Configuring Database
if [ "$SKIP_DATABASE_INSTALL" -eq '0' ] ; then
execute_cmd "systemctl start mysql" "Starting database engine"
echo """
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '$DBROOTPASS';
""" | mysql -uroot &>> "$LOGFILE"
export MYSQL_PWD=$DBROOTPASS
echo -en "${cyan}Creating Pandora FMS database...${reset}"
echo "create database $DBNAME" | mysql -uroot -P$DBPORT -h$DBHOST
check_cmd_status "Error creating database $DBNAME, is this an empty node? if you have a previus installation please contact with support."
echo "CREATE USER \"$DBUSER\"@'%' IDENTIFIED BY \"$DBPASS\";" | mysql -uroot -P$DBPORT -h$DBHOST
echo "ALTER USER \"$DBUSER\"@'%' IDENTIFIED WITH mysql_native_password BY \"$DBPASS\"" | mysql -uroot -P$DBPORT -h$DBHOST
echo "GRANT ALL PRIVILEGES ON $DBNAME.* TO \"$DBUSER\"@'%'" | mysql -uroot -P$DBPORT -h$DBHOST
fi
export MYSQL_PWD=$DBPASS
#Generating my.cnf
cat > /etc/mysql/my.cnf << EOF_DB
[mysqld]
datadir=/var/lib/mysql
user=mysql
character-set-server=utf8
skip-character-set-client-handshake
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Mysql optimizations for Pandora FMS
# Please check the documentation in http://pandorafms.com for better results
max_allowed_packet = 64M
innodb_buffer_pool_size = $POOL_SIZE
innodb_lock_wait_timeout = 90
innodb_file_per_table
innodb_flush_log_at_trx_commit = 0
innodb_flush_method = O_DIRECT
innodb_log_file_size = 64M
innodb_log_buffer_size = 16M
innodb_io_capacity = 100
thread_cache_size = 8
thread_stack = 256K
max_connections = 100
key_buffer_size=4M
read_buffer_size=128K
read_rnd_buffer_size=128K
sort_buffer_size=128K
join_buffer_size=4M
skip-log-bin
sql_mode=""
log-error=/var/log/mysql/error.log
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
EOF_DB
execute_cmd "systemctl restart mysql" "Configuring and restarting database engine"
# Kernel optimization
if [ "$SKIP_KERNEL_OPTIMIZATIONS" -eq '0' ] ; then
cat >> /etc/sysctl.conf <<EO_KO
# Pandora FMS Optimization
# default=5
net.ipv4.tcp_syn_retries = 3
# default=5
net.ipv4.tcp_synack_retries = 3
# default=1024
net.ipv4.tcp_max_syn_backlog = 65536
# default=124928
net.core.wmem_max = 8388608
# default=131071
net.core.rmem_max = 8388608
# default = 128
net.core.somaxconn = 1024
# default = 20480
net.core.optmem_max = 81920
EO_KO
[ -d /dev/lxd/ ] || execute_cmd "sysctl --system" "Applying Kernel optimization"
fi
# Remove temporary files
execute_cmd "echo done" "Percona server installed"
cd "$HOME"
execute_cmd "rm -rf $WORKDIR" "Removing temporary files"

View File

@ -1,15 +1,8 @@
#!/usr/bin/perl
##########################################################################
# pandora_agent_exec
################################################################################
# pandora_exec - Execute a command with a time limit.
#
# Executes the given command and prints its output to stdout. If the
# execution times out or the command does not exist nothing is printed
# to stdout. This is part of Pandora FMS Plugin server, do not delete!.
#
# Usage: pandora_agent_exec <timeout in seconds> <command>
##########################################################################
# Copyright (c) 2008-2010 Ramon Novoa, rnovoa@gmail.com
# (c) 2008-2010 Artica Soluciones Tecnologicas S.L
# Copyright (c) 2008-2023 Artica PFMS S.L.
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
@ -22,37 +15,41 @@
# 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.
##########################################################################
################################################################################
use strict;
use warnings;
use POSIX qw(WEXITSTATUS WIFEXITED);
# Check command line parameters
# Check command line arguments.
if ($#ARGV < 1) {
print("Usage: $0 <timeout in seconds> <command>\n");
exit 1;
}
my @opts = @ARGV;
my $timeout = shift(@opts);
my $command = join(' ', @opts);
my $output = '';
my $ReturnCode = 0;
my $command = ($0 =~ m/_agent_exec$/) ? # For backward compatibility with pandora_agent.
join(' ', @opts) :
join(' ', map { quotemeta($_) } @opts);
# Execute the command
eval {
local $SIG{ALRM} = sub { die "alarm\n" };
alarm $timeout;
$output = `$command`;
$ReturnCode = ($? >> 8) & 0xff;
alarm 0;
};
# Timeout
if ($@ eq "alarm\n") {
exit 3;
# Fork:
# * The child will run the command.
# * The parent will timeout if needed
# and exit with the appropriate exit status.
my $pid = fork();
if ($pid == 0) {
setpgrp();
exec($command);
} else {
eval {
local $SIG{ALRM} = sub { kill(9, -$pid); exit 1; };
alarm $timeout;
waitpid($pid, 0);
alarm 0;
if (WIFEXITED(${^CHILD_ERROR_NATIVE})) {
exit WEXITSTATUS(${^CHILD_ERROR_NATIVE});
}
};
}
print $output;
exit $ReturnCode;
exit 1;

View File

@ -1,5 +1,5 @@
package: pandorafms-agent-unix
Version: 7.0NG.768-230203
Version: 7.0NG.768-230210
Architecture: all
Priority: optional
Section: admin

View File

@ -14,7 +14,7 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
pandora_version="7.0NG.768-230203"
pandora_version="7.0NG.768-230210"
echo "Test if you has the tools for to make the packages."
whereis dpkg-deb | cut -d":" -f2 | grep dpkg-deb > /dev/null

View File

@ -1015,7 +1015,7 @@ my $Sem = undef;
my $ThreadSem = undef;
use constant AGENT_VERSION => '7.0NG.768';
use constant AGENT_BUILD => '230203';
use constant AGENT_BUILD => '230210';
# Agent log default file size maximum and instances
use constant DEFAULT_MAX_LOG_SIZE => 600000;

View File

@ -3,7 +3,7 @@
#
%define name pandorafms_agent_linux
%define version 7.0NG.768
%define release 230203
%define release 230210
Summary: Pandora FMS Linux agent, PERL version
Name: %{name}

View File

@ -3,7 +3,7 @@
#
%define name pandorafms_agent_linux
%define version 7.0NG.768
%define release 230203
%define release 230210
Summary: Pandora FMS Linux agent, PERL version
Name: %{name}

View File

@ -1,15 +1,8 @@
#!/usr/bin/perl
##########################################################################
# pandora_agent_exec
################################################################################
# pandora_exec - Execute a command with a time limit.
#
# Executes the given command and prints its output to stdout. If the
# execution times out or the command does not exist nothing is printed
# to stdout. This is part of Pandora FMS Plugin server, do not delete!.
#
# Usage: pandora_agent_exec <timeout in seconds> <command>
##########################################################################
# Copyright (c) 2008-2010 Ramon Novoa, rnovoa@gmail.com
# (c) 2008-2010 Artica Soluciones Tecnologicas S.L
# Copyright (c) 2008-2023 Artica PFMS S.L.
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
@ -22,37 +15,41 @@
# 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.
##########################################################################
################################################################################
use strict;
use warnings;
use POSIX qw(WEXITSTATUS WIFEXITED);
# Check command line parameters
# Check command line arguments.
if ($#ARGV < 1) {
print("Usage: $0 <timeout in seconds> <command>\n");
exit 1;
}
my @opts = @ARGV;
my $timeout = shift(@opts);
my $command = join(' ', @opts);
my $output = '';
my $ReturnCode = 0;
my $command = ($0 =~ m/_agent_exec$/) ? # For backward compatibility with pandora_agent.
join(' ', @opts) :
join(' ', map { quotemeta($_) } @opts);
# Execute the command
eval {
local $SIG{ALRM} = sub { die "alarm\n" };
alarm $timeout;
$output = `$command`;
$ReturnCode = ($? >> 8) & 0xff;
alarm 0;
};
# Timeout
if ($@ eq "alarm\n") {
exit 3;
# Fork:
# * The child will run the command.
# * The parent will timeout if needed
# and exit with the appropriate exit status.
my $pid = fork();
if ($pid == 0) {
setpgrp();
exec($command);
} else {
eval {
local $SIG{ALRM} = sub { kill(9, -$pid); exit 1; };
alarm $timeout;
waitpid($pid, 0);
alarm 0;
if (WIFEXITED(${^CHILD_ERROR_NATIVE})) {
exit WEXITSTATUS(${^CHILD_ERROR_NATIVE});
}
};
}
print $output;
exit $ReturnCode;
exit 1;

View File

@ -10,7 +10,7 @@
# **********************************************************************
PI_VERSION="7.0NG.768"
PI_BUILD="230203"
PI_BUILD="230210"
OS_NAME=`uname -s`
FORCE=0

View File

@ -186,7 +186,7 @@ UpgradeApplicationID
{}
Version
{230203}
{230210}
ViewReadme
{Yes}

View File

@ -30,7 +30,7 @@ using namespace Pandora;
using namespace Pandora_Strutils;
#define PATH_SIZE _MAX_PATH+1
#define PANDORA_VERSION ("7.0NG.768 Build 230203")
#define PANDORA_VERSION ("7.0NG.768 Build 230210")
string pandora_path;
string pandora_dir;

View File

@ -11,7 +11,7 @@ BEGIN
VALUE "LegalCopyright", "Artica ST"
VALUE "OriginalFilename", "PandoraAgent.exe"
VALUE "ProductName", "Pandora FMS Windows Agent"
VALUE "ProductVersion", "(7.0NG.768(Build 230203))"
VALUE "ProductVersion", "(7.0NG.768(Build 230210))"
VALUE "FileVersion", "1.0.0.0"
END
END

View File

@ -1,5 +1,5 @@
package: pandorafms-console
Version: 7.0NG.768-230203
Version: 7.0NG.768-230210
Architecture: all
Priority: optional
Section: admin

View File

@ -14,7 +14,7 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
pandora_version="7.0NG.768-230203"
pandora_version="7.0NG.768-230210"
package_pear=0
package_pandora=1

View File

@ -2,6 +2,26 @@ START TRANSACTION;
ALTER TABLE `tserver` ADD COLUMN `server_keepalive_utimestamp` BIGINT NOT NULL DEFAULT 0;
CREATE TABLE IF NOT EXISTS `tmonitor_filter` (
`id_filter` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`id_name` VARCHAR(600) NOT NULL,
`id_group_filter` INT NOT NULL DEFAULT 0,
`ag_group` INT NOT NULL DEFAULT 0,
`recursion` TEXT,
`status` INT NOT NULL DEFAULT -1,
`ag_modulename` TEXT,
`ag_freestring` TEXT,
`tag_filter` TEXT,
`moduletype` TEXT,
`module_option` INT DEFAULT 1,
`modulegroup` INT NOT NULL DEFAULT -1,
`min_hours_status` TEXT,
`datatype` TEXT,
`not_condition` TEXT,
`ag_custom_fields` TEXT,
PRIMARY KEY (`id_filter`)
) ENGINE=InnoDB DEFAULT CHARSET=UTF8MB4;
CREATE TABLE IF NOT EXISTS `tsesion_filter` (
`id_filter` INT NOT NULL AUTO_INCREMENT,
`id_name` TEXT NULL,

View File

@ -500,8 +500,12 @@ if ($id_agente) {
}
// Collection.
$collectiontab = enterprise_hook('collection_tab');
if ($collectiontab === ENTERPRISE_NOT_HOOK) {
if ((int) $config['license_nms'] !== 1) {
$collectiontab = enterprise_hook('collection_tab');
if ($collectiontab === ENTERPRISE_NOT_HOOK) {
$collectiontab = '';
}
} else {
$collectiontab = '';
}

View File

@ -187,11 +187,13 @@ if (isset($_GET['server']) === true) {
];
$buttons['collections'] = [
'active' => false,
'text' => '<a href="index.php?sec=gservers&sec2=godmode/servers/modificar_server&server_remote='.$id_server.'&ext='.$ext.'&tab=collections&pure='.$pure.'">'.html_print_image('images/collection.png', true, ['title' => __('Collections')]).'</a>',
if ((int) $config['license_nms'] !== 1) {
$buttons['collections'] = [
'active' => false,
'text' => '<a href="index.php?sec=gservers&sec2=godmode/servers/modificar_server&server_remote='.$id_server.'&ext='.$ext.'&tab=collections&pure='.$pure.'">'.html_print_image('images/collection.png', true, ['title' => __('Collections')]).'</a>',
];
];
}
}
$buttons[$tab]['active'] = true;

View File

@ -2424,6 +2424,18 @@ if ($drawConsoleSound === true) {
$output .= '</span>';
$output .= '</div>';
$output .= '<div class="elements-discovered-alerts"><ul></ul></div>';
$output .= html_print_input_hidden(
'ajax_file_sound_console',
ui_get_full_url('ajax.php', false, false, false),
true
);
$output .= html_print_input_hidden(
'meta',
is_metaconsole(),
true
);
$output .= '<div id="sound_event_details_window"></div>';
$output .= '<div id="sound_event_response_window"></div>';
$output .= '</div>';
$output .= '</div>';
@ -2510,6 +2522,37 @@ if ($get_events_fired) {
$filter = events_get_event_filter($filter_id);
}
if (is_metaconsole() === true) {
$servers = metaconsole_get_servers();
if (is_array($servers) === true) {
$servers = array_reduce(
$servers,
function ($carry, $item) {
$carry[$item['id']] = $item['server_name'];
return $carry;
}
);
} else {
$servers = [];
}
if ($filter['server_id'] === '') {
$filter['server_id'] = array_keys($servers);
} else {
if (is_array($filter['server_id']) === false) {
if (is_numeric($filter['server_id']) === true) {
if ($filter['server_id'] !== 0) {
$filter['server_id'] = [$filter['server_id']];
} else {
$filter['server_id'] = array_keys($servers);
}
} else {
$filter['server_id'] = explode(',', $filter['server_id']);
}
}
}
}
// Set time.
$filter['event_view_hr'] = 0;
@ -2528,29 +2571,32 @@ if ($get_events_fired) {
$return = [];
if (empty($data) === false) {
foreach ($data as $event) {
$return[] = [
'fired' => $event['id_evento'],
'message' => ui_print_string_substr(
strip_tags(io_safe_output($event['evento'])),
75,
true,
'9'
),
'priority' => ui_print_event_priority($event['criticity'], true, true),
'type' => events_print_type_img(
$event['event_type'],
true
),
'timestamp' => ui_print_timestamp(
$event['timestamp'],
true,
['style' => 'font-size: 9pt; letter-spacing: 0.3pt;']
),
];
$return[] = array_merge(
$event,
[
'fired' => $event['id_evento'],
'message' => ui_print_string_substr(
strip_tags(io_safe_output($event['evento'])),
75,
true,
'9'
),
'priority' => ui_print_event_priority($event['criticity'], true, true),
'type' => events_print_type_img(
$event['event_type'],
true
),
'timestamp' => ui_print_timestamp(
$event['timestamp'],
true,
['style' => 'font-size: 9pt; letter-spacing: 0.3pt;']
),
]
);
}
}
echo io_json_mb_encode($return);
echo io_safe_output(io_json_mb_encode($return));
return;
}

View File

@ -68,6 +68,12 @@ if (check_login()) {
0
);
$load_filter_modal = get_parameter('load_filter_modal', 0);
$save_filter_modal = get_parameter('save_filter_modal', 0);
$get_monitor_filters = get_parameter('get_monitor_filters', 0);
$save_monitor_filter = get_parameter('save_monitor_filter', 0);
$update_monitor_filter = get_parameter('update_monitor_filter', 0);
if ($get_agent_modules_json_by_name === true) {
$agent_name = get_parameter('agent_name');
@ -1688,6 +1694,534 @@ if (check_login()) {
}
echo json_encode($children_selected);
return;
}
// Saves an event filter.
if ($save_monitor_filter) {
$values = [];
$values['id_name'] = get_parameter('id_name');
$values['id_group_filter'] = get_parameter('id_group_filter');
$values['ag_group'] = get_parameter('ag_group');
$values['modulegroup'] = get_parameter('modulegroup');
$values['recursion'] = get_parameter('recursion');
$values['status'] = get_parameter('status');
$values['ag_modulename'] = get_parameter('ag_modulename');
$values['ag_freestring'] = get_parameter('ag_freestring');
$values['tag_filter'] = json_encode(get_parameter('tag_filter'));
$values['moduletype'] = get_parameter('moduletype');
$values['module_option'] = get_parameter('module_option');
$values['min_hours_status'] = get_parameter('min_hours_status');
$values['datatype'] = get_parameter('datatype');
$values['not_condition'] = get_parameter('not_condition');
$values['ag_custom_fields'] = get_parameter('ag_custom_fields');
$exists = (bool) db_get_value_filter(
'id_filter',
'tmonitor_filter',
$values
);
if ($exists === true) {
echo 'duplicate';
} else {
$result = db_process_sql_insert('tmonitor_filter', $values);
if ($result === false) {
echo 'error';
} else {
echo $result;
}
}
}
if ($update_monitor_filter) {
$values = [];
$id = get_parameter('id');
$values['ag_group'] = get_parameter('ag_group');
$values['modulegroup'] = get_parameter('modulegroup');
$values['recursion'] = get_parameter('recursion');
$values['status'] = get_parameter('status');
$values['ag_modulename'] = get_parameter('ag_modulename');
$values['ag_freestring'] = get_parameter('ag_freestring');
$values['tag_filter'] = json_encode(get_parameter('tag_filter'));
$values['moduletype'] = get_parameter('moduletype');
$values['module_option'] = get_parameter('module_option');
$values['min_hours_status'] = get_parameter('min_hours_status');
$values['datatype'] = get_parameter('datatype');
$values['not_condition'] = get_parameter('not_condition');
$values['ag_custom_fields'] = get_parameter('ag_custom_fields');
$result = db_process_sql_update(
'tmonitor_filter',
$values,
['id_filter' => $id]
);
if ($result === false) {
echo 'error';
} else {
echo 'ok';
}
}
if ($get_monitor_filters) {
$sql = 'SELECT id_filter, id_name FROM tmonitor_filter';
$monitor_filters = db_get_all_rows_sql($sql);
$result = [];
if ($monitor_filters !== false) {
foreach ($monitor_filters as $monitor_filter) {
$result[$monitor_filter['id_filter']] = $monitor_filter['id_name'];
}
}
echo io_json_mb_encode($result);
}
if ((int) $load_filter_modal === 1) {
$user_groups = users_get_groups(
$config['id_user'],
'AR',
users_can_manage_group_all(),
true
);
$sql = 'SELECT id_filter, id_name
FROM tmonitor_filter
WHERE id_group_filter IN ('.implode(',', array_keys($user_groups)).')';
$event_filters = db_get_all_rows_sql($sql);
$filters = [];
foreach ($event_filters as $event_filter) {
$filters[$event_filter['id_filter']] = $event_filter['id_name'];
}
echo '<div id="load-filter-select" class="load-filter-modal">';
echo '<form method="post" id="form_load_filter" action="index.php?sec=view&sec2=operation/agentes/status_monitor&pure=">';
$table = new StdClass;
$table->id = 'load_filter_form';
$table->width = '100%';
$table->cellspacing = 4;
$table->cellpadding = 4;
$table->class = 'databox';
if (is_metaconsole()) {
$table->cellspacing = 0;
$table->cellpadding = 0;
$table->class = 'databox filters';
}
$table->styleTable = 'font-weight: bold; color: #555; text-align:left;';
$filter_id_width = '200px';
if (is_metaconsole()) {
$filter_id_width = '150px';
}
$data = [];
$table->rowid[3] = 'update_filter_row1';
$data[0] = __('Load filter').$jump;
$data[0] .= html_print_select(
$filters,
'filter_id',
$current,
'',
__('None'),
0,
true,
false,
true,
'',
false,
'margin-left:5px; width:'.$filter_id_width.';'
);
$data[1] = html_print_submit_button(
__('Load filter'),
'load_filter',
false,
'class="sub upd"',
true
);
$data[1] .= html_print_input_hidden('load_filter', 1, true);
$table->data[] = $data;
$table->rowclass[] = '';
html_print_table($table);
echo '</form>';
echo '</div>';
?>
<script type="text/javascript">
function show_filter() {
$("#load-filter-select").dialog({
resizable: true,
draggable: true,
modal: false,
closeOnEscape: true,
width: 450
});
}
$(document).ready(function() {
show_filter();
});
</script>
<?php
return;
}
if ($save_filter_modal) {
echo '<div id="save-filter-select">';
if (check_acl($config['id_user'], 0, 'AW')) {
echo '<div id="#info_box"></div>';
$table = new StdClass;
$table->id = 'save_filter_form';
$table->width = '100%';
$table->cellspacing = 4;
$table->cellpadding = 4;
$table->class = 'databox';
if (is_metaconsole()) {
$table->class = 'databox filters';
$table->cellspacing = 0;
$table->cellpadding = 0;
}
$table->styleTable = 'font-weight: bold; text-align:left;';
if (!is_metaconsole()) {
$table->style[0] = 'width: 50%; width:50%;';
}
$data = [];
$table->rowid[0] = 'update_save_selector';
$data[0] = html_print_radio_button(
'filter_mode',
'new',
'',
true,
true
).__('New filter').'';
$data[1] = html_print_radio_button(
'filter_mode',
'update',
'',
false,
true
).__('Update filter').'';
$table->data[] = $data;
$table->rowclass[] = '';
$data = [];
$table->rowid[1] = 'save_filter_row1';
$data[0] = __('Filter name').$jump;
$data[0] .= html_print_input_text('id_name', '', '', 15, 255, true);
if (is_metaconsole()) {
$data[1] = __('Save in Group').$jump;
} else {
$data[1] = __('Filter group').$jump;
}
$user_groups_array = users_get_groups_for_select(
$config['id_user'],
'AW',
users_can_manage_group_all(),
true
);
$data[1] .= html_print_select(
$user_groups_array,
'id_group_filter_dialog',
$id_group_filter,
'',
'',
0,
true,
false,
false,
'w130'
);
$table->data[] = $data;
$table->rowclass[] = '';
$data = [];
$table->rowid[2] = 'save_filter_row2';
$table->data[] = $data;
$table->rowclass[] = '';
$data = [];
$table->rowid[3] = 'update_filter_row1';
$data[0] = __('Overwrite filter').$jump;
$sql = 'SELECT id_filter, id_name FROM tmonitor_filter';
$monitor_filters = db_get_all_rows_sql($sql);
$_filters_update = [];
if ($monitor_filters !== false) {
foreach ($monitor_filters as $monitor_filter) {
$_filters_update[$monitor_filter['id_filter']] = $monitor_filter['id_name'];
}
}
$data[0] .= html_print_select(
$_filters_update,
'overwrite_filter',
'',
'',
'',
0,
true
);
$data[1] = html_print_submit_button(
__('Update filter'),
'update_filter',
false,
'class="sub upd" onclick="save_update_filter();"',
true
);
$table->data[] = $data;
$table->rowclass[] = '';
html_print_table($table);
echo '<div>';
echo html_print_submit_button(
__('Save filter'),
'save_filter',
false,
'class="sub upd float-right" onclick="save_new_filter();"',
true
);
echo '</div>';
} else {
include 'general/noaccess.php';
}
echo '</div>';
?>
<script type="text/javascript">
function show_save_filter() {
$('#save_filter_row1').show();
$('#save_filter_row2').show();
$('#update_filter_row1').hide();
// Filter save mode selector
$("[name='filter_mode']").click(function() {
if ($(this).val() == 'new') {
$('#save_filter_row1').show();
$('#save_filter_row2').show();
$('#submit-save_filter').show();
$('#update_filter_row1').hide();
}
else {
$('#save_filter_row1').hide();
$('#save_filter_row2').hide();
$('#update_filter_row1').show();
$('#submit-save_filter').hide();
}
});
$("#save-filter-select").dialog({
resizable: true,
draggable: true,
modal: false,
closeOnEscape: true
});
}
function save_new_filter() {
// If the filter name is blank show error
if ($('#text-id_name').val() == '') {
$('#show_filter_error').html("<h3 class='error'><?php echo __('Filter name cannot be left blank'); ?></h3>");
// Close dialog
$('.ui-dialog-titlebar-close').trigger('click');
return false;
}
var custom_fields_values = $('input[name^="ag_custom_fields"]').map(function() {
return this.value;
}).get();
var custom_fields_ids = $("input[name^='ag_custom_fields']").map(function() {
var name = $(this).attr("name");
var number = name.match(/\[(.*?)\]/)[1];
return number;
}).get();
var ag_custom_fields = custom_fields_ids.reduce(function(result, custom_fields_id, index) {
result[custom_fields_id] = custom_fields_values[index];
return result;
}, {});
var id_filter_save;
jQuery.post ("<?php echo ui_get_full_url('ajax.php', false, false, false); ?>",
{
"page" : "include/ajax/module",
"save_monitor_filter" : 1,
"id_name": $("#text-id_name").val(),
"id_group_filter": $("#id_group_filter_dialog").val(),
"ag_group" : $("#ag_group").val(),
"modulegroup" : $("#modulegroup").val(),
"recursion" : $("#checkbox-recursion").is(':checked'),
"status" : $("#status").val(),
"severity" : $("#severity").val(),
"ag_modulename" : $("#text-ag_modulename").val(),
"ag_freestring" : $("#text-ag_freestring").val(),
"tag_filter" : $("#tag_filter").val(),
"moduletype" : $("#moduletype").val(),
"module_option" : $('#module_option').val(),
"min_hours_status" : $('#text-min_hours_status').val(),
"datatype" : $("#datatype").val(),
"not_condition" : $("#not_condition_switch").is(':checked'),
"ag_custom_fields": JSON.stringify(ag_custom_fields),
},
function (data) {
$("#info_box").hide();
if (data == 'error') {
$("#info_box").filter(function(i, item) {
if ($(item).data('type_info_box') == "error_create_filter") {
return true;
}
else
return false;
}).show();
}
else if (data == 'duplicate') {
$("#info_box").filter(function(i, item) {
if ($(item).data('type_info_box') == "duplicate_create_filter") {
return true;
}
else
return false;
}).show();
}
else {
id_filter_save = data;
$("#info_box").filter(function(i, item) {
if ($(item).data('type_info_box') == "success_create_filter") {
return true;
}
else
return false;
}).show();
}
// Close dialog.
$("#save-filter-select").dialog('close');
}
);
}
function save_update_filter() {
var id_filter_update = $("#overwrite_filter").val();
var name_filter_update = $("#overwrite_filter option[value='"+id_filter_update+"']").text();
var custom_fields_values = $('input[name^="ag_custom_fields"]').map(function() {
return this.value;
}).get();
var custom_fields_ids = $("input[name^='ag_custom_fields']").map(function() {
var name = $(this).attr("name");
var number = name.match(/\[(.*?)\]/)[1];
return number;
}).get();
var ag_custom_fields = custom_fields_ids.reduce(function(result, custom_fields_id, index) {
result[custom_fields_id] = custom_fields_values[index];
return result;
}, {});
jQuery.post ("<?php echo ui_get_full_url('ajax.php', false, false, false); ?>",
{
"page" : "include/ajax/module",
"update_monitor_filter" : 1,
"id" : $("#overwrite_filter").val(),
"ag_group" : $("#ag_group").val(),
"modulegroup" : $("#modulegroup").val(),
"recursion" : $("#checkbox-recursion").is(':checked'),
"status" : $("#status").val(),
"severity" : $("#severity").val(),
"ag_modulename" : $("#text-ag_modulename").val(),
"ag_freestring" : $("#text-ag_freestring").val(),
"tag_filter" : $("#tag_filter").val(),
"moduletype" : $("#moduletype").val(),
"module_option" : $('#module_option').val(),
"min_hours_status" : $('#text-min_hours_status').val(),
"datatype" : $("#datatype").val(),
"not_condition" : $("#not_condition_switch").is(':checked'),
"ag_custom_fields": JSON.stringify(ag_custom_fields),
},
function (data) {
$(".info_box").hide();
if (data == 'ok') {
$(".info_box").filter(function(i, item) {
if ($(item).data('type_info_box') == "success_update_filter") {
return true;
}
else
return false;
}).show();
}
else {
$(".info_box").filter(function(i, item) {
if ($(item).data('type_info_box') == "error_create_filter") {
return true;
}
else
return false;
}).show();
}
});
// First remove all options of filters select
$('#filter_id').find('option').remove().end();
// Add 'none' option the first
$('#filter_id').append ($('<option></option>').html ( <?php echo "'".__('none')."'"; ?> ).attr ("value", 0));
// Reload filters select
jQuery.post ("<?php echo ui_get_full_url('ajax.php', false, false, false); ?>",
{
"page" : "include/ajax/module",
"get_monitor_filters" : 1
},
function (data) {
jQuery.each (data, function (i, val) {
s = js_html_entity_decode(val);
if (i == id_filter_update) {
$('#filter_id').append ($('<option selected="selected"></option>').html (s).attr ("value", i));
}
else {
$('#filter_id').append ($('<option></option>').html (s).attr ("value", i));
}
});
},
"json"
);
// Close dialog
$('.ui-dialog-titlebar-close').trigger('click');
// Update the info with the loaded filter
$("#hidden-id_name").val($('#text-id_name').val());
$('#filter_loaded_span').html($('#filter_loaded_text').html() + ': ' + name_filter_update);
return false;
}
$(document).ready(function() {
show_save_filter();
});
</script>
<?php
return;
}
}

View File

@ -360,7 +360,7 @@ function process_user_login_remote($login, $pass, $api=false)
}
$user_info = [
'fullname' => $login,
'fullname' => db_escape_string_sql($login),
'comments' => 'Imported from '.$config['auth'],
];
@ -398,7 +398,7 @@ function process_user_login_remote($login, $pass, $api=false)
$config['auth_error'] = __('User not found in database or incorrect password');
return false;
} else {
$user_info['fullname'] = $sr['cn'][0];
$user_info['fullname'] = db_escape_string_sql($sr['cn'][0]);
$user_info['email'] = $sr['mail'][0];
// Create the user.
@ -1565,7 +1565,7 @@ function local_ldap_search(
$filter = '';
if (!empty($access_attr) && !empty($user)) {
$filter = " -s sub '(".$access_attr.'='.$user.")' ";
$filter = ' -s sub '.escapeshellarg('('.$access_attr.'='.$user.')');
}
$tls = '';
@ -1591,7 +1591,7 @@ function local_ldap_search(
$ldap_admin_pass = ' -w '.escapeshellarg($ldap_admin_pass);
}
$dn = " -b '".$dn."'";
$dn = ' -b '.escapeshellarg($dn);
$ldapsearch_command = 'ldapsearch -LLL -o ldif-wrap=no -o nettimeout='.$ldap_search_time.' -x'.$ldap_host.$ldap_version.' -E pr=10000/noprompt '.$ldap_admin_user.$ldap_admin_pass.$dn.$filter.$tls.' | grep -v "^#\|^$" | sed "s/:\+ /=>/g"';
$shell_ldap_search = explode("\n", shell_exec($ldapsearch_command));
foreach ($shell_ldap_search as $line) {

View File

@ -84,6 +84,15 @@ class SatelliteCollection extends HTML
return;
}
if ((int) $config['license_nms'] === 0) {
db_pandora_audit(
AUDIT_LOG_NMS_VIOLATION,
'Trying to access satellite collections'
);
include $config['homedir'].'/general/noaccess.php';
return;
}
// Set the ajax controller.
$this->ajaxController = $ajaxController;
// Capture all parameters before start.

View File

@ -20,7 +20,7 @@
/**
* Pandora build version and version
*/
$build_version = 'PC230203';
$build_version = 'PC230210';
$pandora_version = 'v7.0NG.768';
// Do not overwrite default timezone set if defined.

View File

@ -6397,3 +6397,19 @@ function getBearerToken()
return false;
}
/**
* Check nms license on api.
*
* @return boolean
*/
function nms_check_api()
{
global $config;
if ((int) $config['license_nms'] === 1) {
returnError('license_error');
return true;
}
}

View File

@ -198,6 +198,16 @@ function returnError($typeError, $returnType='string')
);
break;
case 'license_error':
returnData(
$returnType,
[
'type' => 'string',
'data' => __('License not allowed for this operation.'),
]
);
break;
default:
returnData(
$returnType,

View File

@ -4951,7 +4951,6 @@ function events_page_general_acknowledged($event_id)
global $config;
$Acknowledged = '';
$event = db_get_row('tevento', 'id_evento', $event_id);
if ($event !== false && $event['estado'] == 1) {
$user_ack = db_get_value(
'fullname',

View File

@ -2,7 +2,15 @@
// Show the modal window of an event
function show_event_dialog(event, dialog_page) {
var ajax_file = $("#hidden-ajax_file").val();
var ajax_file = getUrlAjax();
var view = ``;
if ($("#event_details_window").length) {
view = "#event_details_window";
} else if ($("#sound_event_details_window").length) {
view = "#sound_event_details_window";
}
if (dialog_page == undefined) {
dialog_page = "general";
@ -39,7 +47,7 @@ function show_event_dialog(event, dialog_page) {
filter: values
},
function(data) {
$("#event_details_window")
$(view)
.hide()
.empty()
.append(data)
@ -122,7 +130,7 @@ function execute_response(event_id, server_id) {
jQuery.ajax({
data: params,
type: "POST",
url: $("#hidden-ajax_file").val(),
url: getUrlAjax(),
dataType: "json",
success: function(response) {
// If cannot get response abort it
@ -153,7 +161,7 @@ function execute_response_massive(events, response_id, response_parameters) {
jQuery.ajax({
data: params,
type: "POST",
url: $("#hidden-ajax_file").val(),
url: getUrlAjax(),
dataType: "json",
success: function(data) {
// If cannot get response abort it
@ -203,7 +211,7 @@ function execute_response_massive(events, response_id, response_parameters) {
jQuery.ajax({
data: params,
type: "POST",
url: $("#hidden-ajax_file").val(),
url: getUrlAjax(),
dataType: "html",
success: function(data) {
$(".container-massive-events-response").append(data);
@ -240,13 +248,21 @@ function show_response_dialog(response_id, response) {
params.push({ name: "server_id", value: response.server_id });
params.push({ name: "response", value: JSON.stringify(response) });
var view = ``;
if ($("#event_response_window").length) {
view = "#event_response_window";
} else if ($("#sound_event_response_window").length) {
view = "#sound_event_response_window";
}
jQuery.ajax({
data: params,
type: "POST",
url: $("#hidden-ajax_file").val(),
url: getUrlAjax(),
dataType: "html",
success: function(data) {
$("#event_response_window")
$(view)
.hide()
.empty()
.append(data)
@ -292,7 +308,7 @@ function perform_response(response, response_id, index) {
jQuery.ajax({
data: params,
type: "POST",
url: $("#hidden-ajax_file").val(),
url: getUrlAjax(),
dataType: "html",
success: function(data) {
var out = data.replace(/[\n|\r]/g, "<br>");
@ -321,7 +337,7 @@ function event_change_status(event_ids, server_id) {
server_id: server_id
},
type: "POST",
url: $("#hidden-ajax_file").val(),
url: getUrlAjax(),
dataType: "json",
success: function(data) {
$("#button-status_button").removeAttr("disabled");
@ -350,9 +366,12 @@ function event_change_status(event_ids, server_id) {
}
});
$("#table_events")
.DataTable()
.draw(false);
if ($("#table_events").length) {
$("#table_events")
.DataTable()
.draw(false);
}
$("#notification_status_success").show();
$("#general_status")
@ -385,7 +404,7 @@ function event_change_owner(event_id, server_id) {
new_owner: new_owner
},
type: "POST",
url: $("#hidden-ajax_file").val(),
url: getUrlAjax(),
async: true,
dataType: "html",
success: function(data) {
@ -404,9 +423,12 @@ function event_change_owner(event_id, server_id) {
// if (typeof dt_events !== "undefined") {
// dt_events.draw(false);
// }
$("#table_events")
.DataTable()
.draw(false);
if ($("#table_events").length) {
$("#table_events")
.DataTable()
.draw(false);
}
$("#notification_owner_success").show();
if (new_owner == -1) {
$("#extended_event_general_page table td.general_owner").html(
@ -460,7 +482,7 @@ function event_comment(current_event) {
jQuery.ajax({
data: params.join("&"),
type: "POST",
url: $("#hidden-ajax_file").val(),
url: getUrlAjax(),
dataType: "html",
success: function() {
$("#button-comment_button").removeAttr("disabled");
@ -485,7 +507,7 @@ function update_event(table, id_evento, type, event_rep, row, server_id) {
$.ajax({
async: true,
type: "POST",
url: $("#hidden-ajax_file").val(),
url: getUrlAjax(),
data: {
page: "include/ajax/events",
validate_event: type.validate_event,
@ -776,7 +798,7 @@ function show_response_dialog_massive(response_id, response_parameters) {
jQuery.ajax({
data: params,
type: "POST",
url: $("#hidden-ajax_file").val(),
url: getUrlAjax(),
dataType: "json",
success: function(response) {
// If cannot get response abort it
@ -914,7 +936,7 @@ function process_buffers(buffers) {
jQuery.ajax({
data: params.join("&"),
type: "POST",
url: $("#hidden-ajax_file").val(),
url: getUrlAjax(),
async: true,
dataType: "html",
success: function(data) {
@ -1030,8 +1052,10 @@ function openSoundEventModal(settings) {
function test_sound_button(test_sound, urlSound) {
if (test_sound === true) {
$("#button-melody_sound").addClass("blink-image");
add_audio(urlSound);
} else {
$("#button-melody_sound").removeClass("blink-image");
remove_audio();
}
}
@ -1147,6 +1171,7 @@ function check_event_sound(settings) {
// Add elements.
data.forEach(function(element) {
var li = document.createElement("li");
var b64 = btoa(JSON.stringify(element));
li.insertAdjacentHTML(
"beforeend",
'<div class="li-priority">' + element.priority + "</div>"
@ -1157,7 +1182,7 @@ function check_event_sound(settings) {
);
li.insertAdjacentHTML(
"beforeend",
'<div class="li-title">' + element.message + "</div>"
`<div class="li-title"><a href="javascript:" onclick="show_event_dialog('${b64}')">${element.message}</a></div>`
);
li.insertAdjacentHTML(
"beforeend",
@ -1185,10 +1210,12 @@ function table_info_response_event(response_id, event_id, server_id, massive) {
params.push({ name: "server_id", value: server_id });
params.push({ name: "event_id", value: event_id });
var url = getUrlAjax();
jQuery.ajax({
data: params,
type: "POST",
url: $("#hidden-ajax_file").val(),
url: url,
dataType: "json",
success: function(response) {
if (response) {
@ -1201,7 +1228,7 @@ function table_info_response_event(response_id, event_id, server_id, massive) {
jQuery.ajax({
data: params,
type: "POST",
url: $("#hidden-ajax_file").val(),
url: url,
dataType: "html",
success: function(output) {
if (massive === true) {
@ -1216,3 +1243,11 @@ function table_info_response_event(response_id, event_id, server_id, massive) {
}
});
}
function getUrlAjax() {
if ($("#hidden-ajax_file").length) {
return $("#hidden-ajax_file").val();
} else if ($("#hidden-ajax_file_sound_console").length) {
return $("#hidden-ajax_file_sound_console").val();
}
}

File diff suppressed because it is too large Load Diff

View File

@ -301,3 +301,59 @@
background: #e63c52;
}
}
/* Firefox old*/
@-moz-keyframes blink {
0% {
opacity: 1;
}
50% {
opacity: 0;
}
100% {
opacity: 1;
}
}
@-webkit-keyframes blink {
0% {
opacity: 1;
}
50% {
opacity: 0;
}
100% {
opacity: 1;
}
}
/* IE */
@-ms-keyframes blink {
0% {
opacity: 1;
}
50% {
opacity: 0.5;
}
100% {
opacity: 1;
}
}
/* Opera and prob css3 final iteration */
@keyframes blink {
0% {
opacity: 1;
}
50% {
opacity: 0.5;
}
100% {
opacity: 1;
}
}
.blink-image {
-moz-animation: blink normal 2s infinite ease-in-out; /* Firefox */
-webkit-animation: blink normal 2s infinite ease-in-out; /* Webkit */
-ms-animation: blink normal 2s infinite ease-in-out; /* IE */
animation: blink normal 2s infinite ease-in-out; /* Opera and prob css3 final iteration */
filter: hue-rotate(120deg);
}

View File

@ -131,7 +131,7 @@
<div style='padding-bottom: 50px'>
<?php
$version = '7.0NG.768';
$build = '230203';
$build = '230210';
$banner = "v$version Build $build";
error_reporting(0);

View File

@ -120,6 +120,7 @@ if (! defined('METACONSOLE')) {
}
$recursion = get_parameter_switch('recursion', false);
if ($recursion === false) {
$recursion = get_parameter('recursion', false);
}
@ -132,7 +133,7 @@ $refr = (int) get_parameter('refr', 0);
$offset = (int) get_parameter('offset', 0);
$status = (int) get_parameter('status', 4);
$modulegroup = (int) get_parameter('modulegroup', -1);
$tag_filter = (int) get_parameter('tag_filter', 0);
$tag_filter = get_parameter('tag_filter', [0]);
$min_hours_status = (string) get_parameter('min_hours_status', '');
// Sort functionality.
$sortField = get_parameter('sort_field');
@ -218,6 +219,72 @@ if (is_numeric($ag_group)) {
$id_ag_group = db_get_value('id_grupo', 'tgrupo', 'nombre', $ag_group);
}
$load_filter_id = (int) get_parameter('filter_id', 0);
if ($load_filter_id > 0) {
$user_groups_fl = users_get_groups(
$config['id_user'],
'AR',
users_can_manage_group_all(),
true
);
$sql = sprintf(
'SELECT id_filter, id_name
FROM tmonitor_filter
WHERE id_filter = %d AND id_group_filter IN (%s)',
$load_filter_id,
implode(',', array_keys($user_groups_fl))
);
$loaded_filter = db_get_row_sql($sql);
}
if ($loaded_filter['id_filter'] > 0) {
$query_filter['id_filter'] = $load_filter_id;
$filter = db_get_row_filter('tmonitor_filter', $query_filter, false);
if ($filter !== false) {
$ag_group = $filter['ag_group'];
$recursion = $filter['recursion'];
$status = $filter['status'];
$modulegroup = $filter['modulegroup'];
$ag_modulename = $filter['ag_modulename'];
$ag_freestring = $filter['ag_freestring'];
$tag_filter = $filter['tag_filter'];
$moduletype = $filter['moduletype'];
$module_option = $filter['module_option'];
$min_hours_status = $filter['min_hours_status'];
$datatype = $filter['datatype'];
$not_condition = $filter['not_condition'];
$ag_custom_fields = $filter['ag_custom_fields'];
if ($not_condition === 'false') {
$not_condition = '';
}
if ($not_condition !== '') {
$is_none = 'None';
$not_condition = 'NOT';
}
if ($not_condition !== '') {
$condition_query = '!=';
}
if (is_array($tag_filter) === false) {
$tag_filter = json_decode($tag_filter, true);
}
if ($tag_filter === '') {
$tag_filter = [0 => 0];
}
if (is_array($ag_custom_fields) === false) {
$ag_custom_fields = json_decode(io_safe_output($ag_custom_fields), true);
}
}
}
// Agent group selector.
if (is_metaconsole() === false) {
if ($ag_group > 0 && check_acl($config['id_user'], $ag_group, 'AR')) {
@ -368,19 +435,21 @@ if (!empty($ag_custom_fields)) {
}
}
$all_tags = in_array(0, $tag_filter);
// Filter by tag.
if ($tag_filter !== 0) {
if (is_metaconsole() === true) {
$sql_conditions .= ' AND tagente_modulo.id_agente_modulo IN (
SELECT ttag_module.id_agente_modulo
FROM ttag_module
WHERE ttag_module.id_tag '.$not_condition.' IN ('.$tag_filter.'))';
} else {
$sql_conditions .= ' AND tagente_modulo.id_agente_modulo IN (
SELECT ttag_module.id_agente_modulo
FROM ttag_module
WHERE ttag_module.id_tag '.$condition_query.' '.$tag_filter.')';
if ($all_tags === false) {
$sql_conditions .= ' AND tagente_modulo.id_agente_modulo IN (
SELECT ttag_module.id_agente_modulo
FROM ttag_module
WHERE 1=1';
if ($all_tags === false) {
$sql_conditions .= ' AND ttag_module.id_tag '.$not_condition.' IN ('.implode(',', $tag_filter).'))';
}
} else if ($not_condition === 'NOT') {
// Match nothing if not condition has been selected along with all tags selected (none).
$sql_conditions .= ' AND 0=0';
}
@ -389,17 +458,17 @@ if ($tag_filter !== 0) {
$sql_conditions_tags = '';
if (!users_is_admin()) {
$sql_conditions_tags = tags_get_acl_tags(
$config['id_user'],
($recursion) ? $all_groups : $ag_group,
'AR',
'module_condition',
'AND',
'tagente_modulo',
true,
[],
false
);
$sql_conditions_tags = tags_get_acl_tags(
$config['id_user'],
($recursion) ? array_flip($all_groups) : $ag_group,
'AR',
'module_condition',
'AND',
'tagente_modulo',
true,
[],
false
);
if (is_numeric($sql_conditions_tags)) {
$sql_conditions_tags = ' AND 1 = 0';
@ -473,13 +542,14 @@ $table->data[0][1] .= html_print_select_groups(
false,
$not_condition
);
$table->data[0][1] .= '</div><div>';
$table->data[0][1] .= html_print_input(
[
'type' => 'checkbox',
'name' => 'recursion',
'return' => true,
'checked' => $recursion,
'checked' => ($recursion === true || $recursion === 'true' || $recursion === '1') ? 'checked' : false,
'value' => 1,
]
);
@ -554,13 +624,13 @@ if (empty($tags)) {
} else {
$table->data[1][5] = html_print_select(
$tags,
'tag_filter',
'tag_filter[]',
$tag_filter,
'',
__($is_none),
'',
__('All'),
0,
true,
true,
false,
true,
'',
false,
@ -664,7 +734,6 @@ $table2->data[1][0] = '<span id="datatypetittle"';
$table2->data[1][0] .= '>'.__('Data type').'</span>';
$table2->data[1][1] .= '<div id="datatypebox">';
switch ($moduletype) {
case 1:
$sql = sprintf(
@ -769,7 +838,7 @@ $table2->data[1][3] = html_print_div(
'type' => 'switch',
'name' => 'not_condition',
'return' => false,
'checked' => $check_not_condition,
'checked' => ($check_not_condition === true || $check_not_condition === 'true' || $check_not_condition === '1') ? 'checked' : false,
'value' => 'NOT',
'id' => 'not_condition_switch',
'onclick' => 'changeNotConditionStatus(this)',
@ -853,22 +922,34 @@ $table->data[3][0] = ui_toggle(
'white_table_graph'
);
$table->colspan[4][0] = 7;
$table->colspan[4][0] = 2;
$table->cellstyle[4][0] = 'padding-top: 0px;';
$table->data[4][0] = html_print_div(
[
'class' => 'action-buttons',
'content' => html_print_submit_button(
__('Show'),
'uptbutton',
false,
[
'icon' => 'search',
'mode' => 'mini',
],
true
),
],
$table->data[4][0] = html_print_button(
__('Load filter'),
'load-filter',
false,
'',
'class="float-left margin-right-2 sub config"',
true
);
$table->cellstyle[4][0] .= 'padding-top: 0px;';
$table->data[4][0] .= html_print_button(
__('Save filter'),
'save-filter',
false,
'',
'class="float-left margin-right-2 sub wand"',
true
);
$table->colspan[4][2] = 5;
$table->cellstyle[4][2] = 'padding-top: 0px;';
$table->data[4][2] = html_print_submit_button(
__('Show'),
'uptbutton',
false,
'class="sub search mgn_tp_0 right"',
true
);
@ -2024,16 +2105,76 @@ if (!empty($result)) {
}
// End Build List Result.
echo "<div id='monitor_details_window'></div>";
// End Build List Result.
echo "<div id='monitor_details_window'></div>";
enterprise_hook('close_meta_frame');
// Load filter div for dialog.
echo '<div id="load-modal-filter" style="display:none"></div>';
echo '<div id="save-modal-filter" style="display:none"></div>';
ui_require_javascript_file('pandora_modules');
enterprise_hook('close_meta_frame');
ui_require_javascript_file('pandora_modules');
?>
<script type="text/javascript">
var loading = 0;
/* Filter management */
$('#button-load-filter').click(function (event) {
// event.preventDefault();
if($('#load-filter-select').length) {
$('#load-filter-select').dialog();
} else {
if (loading == 0) {
loading = 1
$.ajax({
method: 'POST',
url: '<?php echo ui_get_full_url('ajax.php'); ?>',
data: {
page: 'include/ajax/module',
load_filter_modal: 1
},
success: function (data){
$('#load-modal-filter')
.empty()
.html(data);
loading = 0;
}
});
}
}
});
$('#button-save-filter').click(function (){
// event.preventDefault();
if($('#save-filter-select').length) {
$('#save-filter-select').dialog();
} else {
if (loading == 0) {
loading = 1
$.ajax({
method: 'POST',
url: '<?php echo ui_get_full_url('ajax.php'); ?>',
data: {
page: 'include/ajax/module',
save_filter_modal: 1,
current_filter: $('#latest_filter_id').val()
},
success: function (data){
$('#save-modal-filter')
.empty()
.html(data);
loading = 0;
}
});
}
}
});
if(!document.getElementById('not_condition_switch').checked){
document.getElementById("select2-ag_group-container").innerHTML = "None";
@ -2156,12 +2297,10 @@ function changeNotConditionStatus() {
$("#modulegroup").select2().val(["None"]).trigger("change");
$("#tag_filter").select2().val(["None"]).trigger("change");
document.getElementById("select2-status-container").innerHTML = "None";
document.getElementById("select2-moduletype-container").innerHTML = "None";
document.getElementById("select2-ag_group-container").innerHTML = "None";
document.getElementById("select2-modulegroup-container").innerHTML = "None";
document.getElementById("select2-tag_filter-container").innerHTML = "None";
}else {
$('select[name=datatypebox] > option:first-child').val('All');
@ -2183,7 +2322,6 @@ function changeNotConditionStatus() {
document.getElementById("select2-moduletype-container").innerHTML = "All";
document.getElementById("select2-ag_group-container").innerHTML = "All";
document.getElementById("select2-modulegroup-container").innerHTML = "All";
document.getElementById("select2-tag_filter-container").innerHTML = "All";
}
}

View File

@ -1462,8 +1462,12 @@ if ($inventorytab === ENTERPRISE_NOT_HOOK || $inventoryCount === 0) {
}
// Collection.
$collectiontab = enterprise_hook('collection_tab');
if ($collectiontab === ENTERPRISE_NOT_HOOK) {
if ((int) $config['license_nms'] !== 1) {
$collectiontab = enterprise_hook('collection_tab');
if ($collectiontab === ENTERPRISE_NOT_HOOK) {
$collectiontab = '';
}
} else {
$collectiontab = '';
}

View File

@ -3,7 +3,7 @@
#
%define name pandorafms_console
%define version 7.0NG.768
%define release 230203
%define release 230210
# User and Group under which Apache is running
%define httpd_name httpd
@ -26,7 +26,7 @@ BuildRoot: %{_tmppath}/%{name}
BuildArch: noarch
AutoReq: 0
Requires: %{httpd_name} >= 2.0.0
Requires: mod_php >= 7.0
Requires: php >= 8.0
Requires: php-gd, php-ldap, php-snmp, php-session, php-gettext
Requires: php-mysqlnd, php-mbstring, php-zip, php-zlib, php-curl
Requires: xorg-x11-fonts-75dpi, xorg-x11-fonts-misc, php-pecl-zip
@ -77,6 +77,11 @@ echo " /etc/init.d/pandora_websocket_engine start"
#
if [ -f %{prefix}/pandora_console/include/config.php ] ; then
mv %{prefix}/pandora_console/install.php %{prefix}/pandora_console/install.done
# Upgrading MR.
echo "Updating the database schema."
/usr/bin/php %{prefix}/pandora_console/godmode/um_client/updateMR.php 2>/dev/null
else
echo "Please, now, point your browser to http://your_IP_address/pandora_console/install.php and follow all the steps described on it."
fi

View File

@ -3,7 +3,7 @@
#
%define name pandorafms_console
%define version 7.0NG.768
%define release 230203
%define release 230210
# User and Group under which Apache is running
%define httpd_name httpd
@ -57,11 +57,6 @@ install -m 0644 pandora_console_logrotate_centos $RPM_BUILD_ROOT%{_sysconfdir}/l
rm -rf $RPM_BUILD_ROOT
%post
# Upgrading.
if [ "$1" -eq "1" ]; then
echo "Updating the database schema."
/usr/bin/php %{prefix}/pandora_console/godmode/um_client/updateMR.php 2>/dev/null
fi
# Install pandora_websocket_engine service.
cp -pf %{prefix}/pandora_console/pandora_websocket_engine /etc/init.d/
@ -76,6 +71,11 @@ echo " /etc/init.d/pandora_websocket_engine start"
#
if [ -f %{prefix}/pandora_console/include/config.php ] ; then
mv %{prefix}/pandora_console/install.php %{prefix}/pandora_console/install.done
# Upgrading MR.
echo "Updating the database schema."
/usr/bin/php %{prefix}/pandora_console/godmode/um_client/updateMR.php 2>/dev/null
else
echo "Please, now, point your browser to http://your_IP_address/pandora_console/install.php and follow all the steps described on it."
fi

View File

@ -3,7 +3,7 @@
#
%define name pandorafms_console
%define version 7.0NG.768
%define release 230203
%define release 230210
%define httpd_name httpd
# User and Group under which Apache is running
%define httpd_name apache2
@ -29,7 +29,7 @@ BuildArch: noarch
AutoReq: 0
Requires: apache2
Requires: apache2-mod_php7
Requires: php >= 7.0
Requires: php >= 8.0
Requires: php-gd, php-snmp, php-json, php-gettext
Requires: php-mysqlnd, php-ldap, php-mbstring, php
Requires: graphviz, xorg-x11-fonts-core, graphviz-gd
@ -58,11 +58,6 @@ fi
rm -rf $RPM_BUILD_ROOT
%post
# Upgrading.
if [ "$1" -eq "1" ]; then
echo "Updating the database schema."
/usr/bin/php %{prefix}/pandora_console/godmode/um_client/updateMR.php 2>/dev/null
fi
# Install pandora_websocket_engine service.
cp -pf %{prefix}/pandora_console/pandora_websocket_engine /etc/init.d/
@ -77,6 +72,11 @@ echo " /etc/init.d/pandora_websocket_engine start"
#
if [ -f %{prefix}/pandora_console/include/config.php ] ; then
mv %{prefix}/pandora_console/install.php %{prefix}/pandora_console/install.done
# Upgrading MR.
echo "Updating the database schema."
/usr/bin/php %{prefix}/pandora_console/godmode/um_client/updateMR.php 2>/dev/null
else
echo "Please, now, point your browser to http://your_IP_address/pandora_console/install.php and follow all the steps described on it."
fi

View File

@ -4154,3 +4154,26 @@ CREATE TABLE IF NOT EXISTS `tbackup` (
`filepath` VARCHAR(512) DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=UTF8MB4;
-- ---------------------------------------------------------------------
-- Table `tmonitor_filter`
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `tmonitor_filter` (
`id_filter` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`id_name` VARCHAR(600) NOT NULL,
`id_group_filter` INT NOT NULL DEFAULT 0,
`ag_group` INT NOT NULL DEFAULT 0,
`recursion` TEXT,
`status` INT NOT NULL DEFAULT -1,
`ag_modulename` TEXT,
`ag_freestring` TEXT,
`tag_filter` TEXT,
`moduletype` TEXT,
`module_option` INT DEFAULT 1,
`modulegroup` INT NOT NULL DEFAULT -1,
`min_hours_status` TEXT,
`datatype` TEXT,
`not_condition` TEXT,
`ag_custom_fields` TEXT,
PRIMARY KEY (`id_filter`)
) ENGINE=InnoDB DEFAULT CHARSET=UTF8MB4;

View File

@ -1,5 +1,5 @@
package: pandorafms-server
Version: 7.0NG.768-230203
Version: 7.0NG.768-230210
Architecture: all
Priority: optional
Section: admin

View File

@ -14,7 +14,7 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
pandora_version="7.0NG.768-230203"
pandora_version="7.0NG.768-230210"
package_cpan=0
package_pandora=1

View File

@ -1,15 +1,8 @@
#!/usr/bin/perl
##########################################################################
# pandora_exec
################################################################################
# pandora_exec - Execute a command with a time limit.
#
# Executes the given command and prints its output to stdout. If the
# execution times out or the command does not exist nothing is printed
# to stdout. This is part of Pandora FMS Plugin server, do not delete!.
#
# Usage: pandora_exec <timeout in seconds> <command>
##########################################################################
# Copyright (c) 2008 Ramon Novoa, rnovoa@gmail.com
# (c) 2008 Artica Soluciones Tecnologicas S.L
# Copyright (c) 2008-2023 Artica PFMS S.L.
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
@ -22,41 +15,41 @@
# 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.
##########################################################################
################################################################################
use strict;
use warnings;
use POSIX qw(WEXITSTATUS WIFEXITED);
# Check command line parameters
# Check command line arguments.
if ($#ARGV < 1) {
print("Usage: $0 <timeout in seconds> <command>\n");
exit 1;
}
my @opts = @ARGV;
my $timeout = shift(@opts);
my $command;
foreach my $arg (@opts) {
$command .= $^O ne 'MSWin32' ? quotemeta ($arg) . ' ' : '"' . $arg . '" ';
}
chomp ($command);
my $output = '';
my $ReturnCode = 0;
my $command = ($0 =~ m/_agent_exec$/) ? # For backward compatibility with pandora_agent.
join(' ', @opts) :
join(' ', map { quotemeta($_) } @opts);
# Execute the command
eval {
local $SIG{ALRM} = sub { die "alarm\n" };
alarm $timeout;
$output = `$command`;
$ReturnCode = ($? >> 8) & 0xff;
alarm 0;
};
# Timeout
if ($@ eq "alarm\n") {
exit 3;
# Fork:
# * The child will run the command.
# * The parent will timeout if needed
# and exit with the appropriate exit status.
my $pid = fork();
if ($pid == 0) {
setpgrp();
exec($command);
} else {
eval {
local $SIG{ALRM} = sub { kill(9, -$pid); exit 1; };
alarm $timeout;
waitpid($pid, 0);
alarm 0;
if (WIFEXITED(${^CHILD_ERROR_NATIVE})) {
exit WEXITSTATUS(${^CHILD_ERROR_NATIVE});
}
};
}
print $output;
exit $ReturnCode;
exit 1;

View File

@ -387,112 +387,114 @@ sub pandora_server_tasks ($) {
my $counter = 0;
my $first_run = 1;
while ($THRRUN == 1) {
if (pandora_is_master($pa_config) == 1) {
eval {
if (pandora_is_master($pa_config) == 1) {
# TASKS EXECUTED ONCE
# -------------------
if ($first_run == 1) {
$first_run = 0;
# TASKS EXECUTED ONCE
# -------------------
if ($first_run == 1) {
$first_run = 0;
# Update the agent cache.
enterprise_hook('update_agent_cache', [\%Config]);
}
# TASKS EXECUTED EVERY 5 SECONDS (Low latency tasks)
# --------------------------------------------------
if (($counter % 5) == 0) {
# Update forced alerts
pandora_exec_forced_alerts ($pa_config, $dbh);
my @agents = get_db_rows ($dbh, 'SELECT id_agente, update_alert_count FROM tagente WHERE update_alert_count=1');
foreach my $agent (@agents) {
if ($agent->{'update_alert_count'} == 1) {
pandora_update_agent_alert_count ($pa_config, $dbh, $agent->{'id_agente'});
}
# Update the agent cache.
enterprise_hook('update_agent_cache', [\%Config]);
}
}
# TASKS EXECUTED EVERY 30 SECONDS (Mid latency tasks)
# ---------------------------------------------------
if (($counter % 30) == 0) {
# TASKS EXECUTED EVERY 5 SECONDS (Low latency tasks)
# --------------------------------------------------
if (($counter % 5) == 0) {
# Update module status and fired alert counts
my @agents = get_db_rows ($dbh, 'SELECT id_agente, nombre, update_module_count, update_secondary_groups FROM tagente WHERE (update_module_count=1 OR update_secondary_groups=1)');
foreach my $agent (@agents) {
logger ($pa_config, "Updating module status and fired alert counts for agent " . $agent->{'nombre'}, 10);
# Update forced alerts
pandora_exec_forced_alerts ($pa_config, $dbh);
if ($agent->{'update_module_count'} == 1) {
pandora_update_agent_module_count ($pa_config, $dbh, $agent->{'id_agente'});
}
if ($agent->{'update_secondary_groups'} == 1) {
pandora_update_secondary_groups_cache ($pa_config, $dbh, $agent->{'id_agente'});
my @agents = get_db_rows ($dbh, 'SELECT id_agente, update_alert_count FROM tagente WHERE update_alert_count=1');
foreach my $agent (@agents) {
if ($agent->{'update_alert_count'} == 1) {
pandora_update_agent_alert_count ($pa_config, $dbh, $agent->{'id_agente'});
}
}
}
# Keepalive module control.(very DB intensive, not run frecuently
pandora_module_keep_alive_nd ($pa_config, $dbh);
# Set the status of unknown modules
pandora_module_unknown ($pa_config, $dbh);
# Check if an autodisabled agent needs to be autodisable
pandora_disable_autodisable_agents ($pa_config, $dbh);
}
# TASKS EXECUTED EVERY 60 SECONDS (High latency tasks)
# ----------------------------------------------------
if (($counter % 60) == 0) {
# Downtimes are executed only 30 x Server Threshold secs
pandora_planned_downtime ($pa_config, $dbh);
# Realtime stats (Only master server!) - ( VERY HEAVY !)
# Realtimestats == 1, generated by WEB Console, not by server!
if (defined($pa_config->{"realtimestats"}) && $pa_config->{"realtimestats"} == 0){
# TASKS EXECUTED EVERY 30 SECONDS (Mid latency tasks)
# ---------------------------------------------------
if (($counter % 30) == 0) {
# Update module status and fired alert counts
my @agents = get_db_rows ($dbh, 'SELECT id_agente, nombre, update_module_count, update_secondary_groups FROM tagente WHERE (update_module_count=1 OR update_secondary_groups=1)');
foreach my $agent (@agents) {
logger ($pa_config, "Updating module status and fired alert counts for agent " . $agent->{'nombre'}, 10);
if ($agent->{'update_module_count'} == 1) {
pandora_update_agent_module_count ($pa_config, $dbh, $agent->{'id_agente'});
}
if ($agent->{'update_secondary_groups'} == 1) {
pandora_update_secondary_groups_cache ($pa_config, $dbh, $agent->{'id_agente'});
}
}
# Keepalive module control.(very DB intensive, not run frecuently
pandora_module_keep_alive_nd ($pa_config, $dbh);
# Check if I need to refresh stats
my $last_execution_stats = get_db_value ($dbh, "SELECT MAX(utimestamp) FROM tgroup_stat");
if (!defined($last_execution_stats) || $last_execution_stats < (time() - $pa_config->{"stats_interval"})){
pandora_group_statistics ($pa_config, $dbh);
pandora_server_statistics ($pa_config, $dbh);
}
# Set the status of unknown modules
pandora_module_unknown ($pa_config, $dbh);
# Check if an autodisabled agent needs to be autodisable
pandora_disable_autodisable_agents ($pa_config, $dbh);
}
# Check if snmptrapd is freeze.
pandora_snmptrapd_still_working ($pa_config, $dbh);
# TASKS EXECUTED EVERY 60 SECONDS (High latency tasks)
# ----------------------------------------------------
if (($counter % 60) == 0) {
# Downtimes are executed only 30 x Server Threshold secs
pandora_planned_downtime ($pa_config, $dbh);
# Realtime stats (Only master server!) - ( VERY HEAVY !)
# Realtimestats == 1, generated by WEB Console, not by server!
if (defined($pa_config->{"realtimestats"}) && $pa_config->{"realtimestats"} == 0){
# Check if I need to refresh stats
my $last_execution_stats = get_db_value ($dbh, "SELECT MAX(utimestamp) FROM tgroup_stat");
if (!defined($last_execution_stats) || $last_execution_stats < (time() - $pa_config->{"stats_interval"})){
pandora_group_statistics ($pa_config, $dbh);
pandora_server_statistics ($pa_config, $dbh);
}
}
# Check if snmptrapd is freeze.
pandora_snmptrapd_still_working ($pa_config, $dbh);
# Event auto-expiry
my $expiry_time = $pa_config->{"event_expiry_time"};
my $expiry_window = $pa_config->{"event_expiry_window"};
if ($expiry_time > 0 && $expiry_window > 0 && $expiry_window > $expiry_time) {
my $time_ref = time ();
my $expiry_limit = $time_ref - $expiry_time;
my $expiry_window = $time_ref - $expiry_window;
db_do ($dbh, 'UPDATE tevento SET estado=1, ack_utimestamp=? WHERE estado=0 AND utimestamp < ? AND utimestamp > ?', $time_ref, $expiry_limit, $expiry_window);
# Event auto-expiry
my $expiry_time = $pa_config->{"event_expiry_time"};
my $expiry_window = $pa_config->{"event_expiry_window"};
if ($expiry_time > 0 && $expiry_window > 0 && $expiry_window > $expiry_time) {
my $time_ref = time ();
my $expiry_limit = $time_ref - $expiry_time;
my $expiry_window = $time_ref - $expiry_window;
db_do ($dbh, 'UPDATE tevento SET estado=1, ack_utimestamp=? WHERE estado=0 AND utimestamp < ? AND utimestamp > ?', $time_ref, $expiry_limit, $expiry_window);
}
}
}
}
# COMMON TASKS (master and non-master)
# ---------------------------------------------------------------
if (($counter % 30) == 0) {
# Update configuration options from the console.
pandora_get_sharedconfig ($pa_config, $dbh);
# COMMON TASKS (master and non-master)
# ---------------------------------------------------------------
if (($counter % 30) == 0) {
# Update configuration options from the console.
pandora_get_sharedconfig ($pa_config, $dbh);
# Rotate the log file.
pandora_rotate_logfile($pa_config);
# Set event storm protection
pandora_set_event_storm_protection (pandora_get_tconfig_token ($dbh, 'event_storm_protection', 0));
}
# Pandora self monitoring
if (defined($pa_config->{"self_monitoring"})
&& $pa_config->{"self_monitoring"} == 1
&& !is_metaconsole($pa_config)
&& $counter % $pa_config->{'self_monitoring_interval'} == 0) {
pandora_self_monitoring ($pa_config, $dbh);
}
# Rotate the log file.
pandora_rotate_logfile($pa_config);
# Set event storm protection
pandora_set_event_storm_protection (pandora_get_tconfig_token ($dbh, 'event_storm_protection', 0));
}
# Pandora self monitoring
if (defined($pa_config->{"self_monitoring"})
&& $pa_config->{"self_monitoring"} == 1
&& !is_metaconsole($pa_config)
&& $counter % $pa_config->{'self_monitoring_interval'} == 0) {
pandora_self_monitoring ($pa_config, $dbh);
}
};
# Avoid counter overflow
if ($counter >= ~0){

View File

@ -598,6 +598,9 @@ unknown_events 1
# Time interval (as a multiple of the module interval) before a module becomes unknown. Twice the module's interval by default.
#unknown_interval 2
# Number of unknown modules that will be processed per iteration.
unknown_block_size 1000
# Maximum executing time of an alert (in seconds)
global_alert_timeout 15
@ -732,4 +735,4 @@ tentacle_service_watchdog 1
# Enable (1) or disable (0) the parameter of mysql ssl certification (mysql_ssl_verify_server_cert) (enabled by default).
verify_mysql_ssl_cert 1
verify_mysql_ssl_cert 1

View File

@ -46,7 +46,7 @@ our @EXPORT = qw(
# version: Defines actual version of Pandora Server for this module only
my $pandora_version = "7.0NG.768";
my $pandora_build = "230203";
my $pandora_build = "230210";
our $VERSION = $pandora_version." ".$pandora_build;
# Setup hash
@ -527,33 +527,35 @@ sub pandora_load_config {
$pa_config->{"unknown_updates"} = 0; # 7.0.718
$pa_config->{"provisioningserver"} = 1; # 7.0 720
$pa_config->{"provisioningserver_threads"} = 1; # 7.0 720
$pa_config->{"provisioning_cache_interval"} = 300; # 7.0 720
$pa_config->{"provisioningserver"} = 1; # 7.0.720
$pa_config->{"provisioningserver_threads"} = 1; # 7.0.720
$pa_config->{"provisioning_cache_interval"} = 300; # 7.0.720
$pa_config->{"autoconfigure_agents"} = 1; # 7.0 725
$pa_config->{"autoconfigure_agents_threshold"} = 300; #7.0 764
$pa_config->{"autoconfigure_agents"} = 1; # 7.0.725
$pa_config->{"autoconfigure_agents_threshold"} = 300; #7.0.764
$pa_config->{'snmp_extlog'} = ""; # 7.0 726
$pa_config->{'snmp_extlog'} = ""; # 7.0.726
$pa_config->{"fsnmp"} = "/usr/bin/pandorafsnmp"; # 7.0 732
$pa_config->{"fsnmp"} = "/usr/bin/pandorafsnmp"; # 7.0.732
$pa_config->{"event_inhibit_alerts"} = 0; # 7.0 737
$pa_config->{"event_inhibit_alerts"} = 0; # 7.0.737
$pa_config->{"alertserver"} = 0; # 7.0 756
$pa_config->{"alertserver_threads"} = 1; # 7.0 756
$pa_config->{"alertserver_warn"} = 180; # 7.0 756
$pa_config->{"alertserver_queue"} = 0; # 7.0 764
$pa_config->{"alertserver"} = 0; # 7.0.756
$pa_config->{"alertserver_threads"} = 1; # 7.0.756
$pa_config->{"alertserver_warn"} = 180; # 7.0.756
$pa_config->{"alertserver_queue"} = 0; # 7.0.764
$pa_config->{'ncmserver'} = 0; # 7.0 758
$pa_config->{'ncmserver_threads'} = 1; # 7.0 758
$pa_config->{'ncm_ssh_utility'} = '/usr/share/pandora_server/util/ncm_ssh_extension'; # 7.0 758
$pa_config->{'ncmserver'} = 0; # 7.0.758
$pa_config->{'ncmserver_threads'} = 1; # 7.0.758
$pa_config->{'ncm_ssh_utility'} = '/usr/share/pandora_server/util/ncm_ssh_extension'; # 7.0.758
$pa_config->{"pandora_service_cmd"} = 'service pandora_server'; # 7.0 761
$pa_config->{"tentacle_service_cmd"} = 'service tentacle_serverd'; # 7.0 761
$pa_config->{"tentacle_service_watchdog"} = 1; # 7.0 761
$pa_config->{"pandora_service_cmd"} = 'service pandora_server'; # 7.0.761
$pa_config->{"tentacle_service_cmd"} = 'service tentacle_serverd'; # 7.0.761
$pa_config->{"tentacle_service_watchdog"} = 1; # 7.0.761
$pa_config->{"dataserver_smart_queue"} = 0; # 765.
$pa_config->{"dataserver_smart_queue"} = 0; # 7.0.765
$pa_config->{"unknown_block_size"} = 1000; # 7.0.769
# Check for UID0
if ($pa_config->{"quiet"} != 0){

View File

@ -6009,10 +6009,6 @@ sub pandora_self_monitoring ($$) {
$pandoradb = 1;
}
my $start_performance = time;
get_db_value($dbh, "SELECT COUNT(*) FROM tagente_datos");
my $read_speed = int((time - $start_performance) * 1e6);
my $elasticsearch_perfomance = enterprise_hook("elasticsearch_performance", [$pa_config, $dbh]);
$xml_output .= $elasticsearch_perfomance if defined($elasticsearch_perfomance);
@ -6059,13 +6055,6 @@ sub pandora_self_monitoring ($$) {
$xml_output .=" </module>";
}
$xml_output .=" <module>";
$xml_output .=" <name>Execution_Time</name>";
$xml_output .=" <type>generic_data</type>";
$xml_output .=" <unit>us</unit>";
$xml_output .=" <data>$read_speed</data>";
$xml_output .=" </module>";
$xml_output .= "</agent_data>";
my $filename = $pa_config->{"incomingdir"}."/".$pa_config->{'servername'}.".self.".$utimestamp.".data";
@ -6214,7 +6203,7 @@ sub pandora_module_unknown ($$) {
')
)
AND tagente_estado.utimestamp != 0
AND (tagente_estado.current_interval * ?) + tagente_estado.utimestamp < UNIX_TIMESTAMP()', $pa_config->{'unknown_interval'});
AND (tagente_estado.current_interval * ?) + tagente_estado.utimestamp < UNIX_TIMESTAMP() LIMIT ?', $pa_config->{'unknown_interval'}, $pa_config->{'unknown_block_size'});
foreach my $module (@modules) {

View File

@ -618,8 +618,13 @@ sub get_agent_status ($$$) {
$module_status = 2;
}
elsif ($module_status != 2) {
if ($m_status == 0) {
$module_status = 0;
if ($m_status == 3) {
$module_status = 3;
}
elsif ($module_status != 3) {
if ($m_status == 0) {
$module_status = 0;
}
}
}
}
@ -647,7 +652,7 @@ sub get_agent_status ($$$) {
return 3;
}
}
return $module_status;
}

View File

@ -304,21 +304,22 @@ sub data_consumer ($$) {
agent_unlock($pa_config, $agent_name);
return;
}
unlink ($file_name);
if (defined($xml_data->{'server_name'})) {
process_xml_server ($self->getConfig (), $file_name, $xml_data, $self->getDBH ());
} elsif (defined($xml_data->{'connection_source'})) {
enterprise_hook('process_xml_connections', [$self->getConfig (), $file_name, $xml_data, $self->getDBH ()]);
} elsif (defined($xml_data->{'ipam_source'})) {
enterprise_hook('process_xml_ipam', [$self->getConfig (), $file_name, $xml_data, $self->getDBH ()]);
} elsif (defined($xml_data->{'network_matrix'})){
process_xml_matrix_network(
$self->getConfig(), $xml_data, $self->getDBH()
);
} else {
process_xml_data ($self->getConfig (), $file_name, $xml_data, $self->getServerID (), $self->getDBH ());
}
eval {
if (defined($xml_data->{'server_name'})) {
process_xml_server ($self->getConfig (), $file_name, $xml_data, $self->getDBH ());
} elsif (defined($xml_data->{'connection_source'})) {
enterprise_hook('process_xml_connections', [$self->getConfig (), $file_name, $xml_data, $self->getDBH ()]);
} elsif (defined($xml_data->{'ipam_source'})) {
enterprise_hook('process_xml_ipam', [$self->getConfig (), $file_name, $xml_data, $self->getDBH ()]);
} elsif (defined($xml_data->{'network_matrix'})){
process_xml_matrix_network( $self->getConfig(), $xml_data, $self->getDBH());
} else {
process_xml_data ($self->getConfig (), $file_name, $xml_data, $self->getServerID (), $self->getDBH ());
}
};
agent_unlock($pa_config, $agent_name);
return;
}
@ -1174,15 +1175,6 @@ sub process_xml_matrix_network {
sub agent_lock {
my ($pa_config, $dbh, $agent_name) = @_;
# Do not lock on LIFO mode if the agent already exist.
# get_agent_id will be called again from process_xml_data,
# so the should be no race conditions if the agent does
# not exist.
if ($pa_config->{'dataserver_lifo'} == 1 &&
get_agent_id ($dbh, $agent_name) > 0) {
return 1;
}
$AgentSem->down ();
if (defined ($Agents{$agent_name})) {
$AgentSem->up ();

View File

@ -34,7 +34,7 @@ our @ISA = qw(Exporter);
# version: Defines actual version of Pandora Server for this module only
my $pandora_version = "7.0NG.768";
my $pandora_build = "230203";
my $pandora_build = "230210";
our $VERSION = $pandora_version." ".$pandora_build;
our %EXPORT_TAGS = ( 'all' => [ qw() ] );

View File

@ -3,7 +3,7 @@
#
%define name pandorafms_server
%define version 7.0NG.768
%define release 230203
%define release 230210
Summary: Pandora FMS Server
Name: %{name}

View File

@ -3,7 +3,7 @@
#
%define name pandorafms_server
%define version 7.0NG.768
%define release 230203
%define release 230210
Summary: Pandora FMS Server
Name: %{name}

View File

@ -9,7 +9,7 @@
# **********************************************************************
PI_VERSION="7.0NG.768"
PI_BUILD="230203"
PI_BUILD="230210"
MODE=$1
if [ $# -gt 1 ]; then

View File

@ -35,7 +35,7 @@ use PandoraFMS::Config;
use PandoraFMS::DB;
# version: define current version
my $version = "7.0NG.768 Build 230203";
my $version = "7.0NG.768 Build 230210";
# Pandora server configuration
my %conf;

View File

@ -36,7 +36,7 @@ use Encode::Locale;
Encode::Locale::decode_argv;
# version: define current version
my $version = "7.0NG.768 Build 230203";
my $version = "7.0NG.768 Build 230210";
# save program name for logging
my $progname = basename($0);

View File

@ -188,6 +188,16 @@ install () {
execute_cmd "ps --version" 'Checking dependencies: ps' "Error ps not found, please install procps"
execute_cmd "sudo --version" 'Checking dependencies: sudo' "Error sudo not found, please install sudo"
execute_cmd "perl -MIO::Compress::Zip -le 'pass'" 'Checking dependencies: perl IO::Compress' "Error perl IO::Compress not found, please install perl IO::Compress"
execute_cmd "perl -MGetopt::Std -le 'pass'" 'Checking dependencies: perl Getopt::Std' "Error perl IO::Compress not found, please install perl Getopt::Std"
execute_cmd "perl -MIO::Select -le 'pass'" 'Checking dependencies: perl IO::Select' "Error perl IO::Select not found, please install perl IO::Select"
execute_cmd "perl -MIO::Uncompress::Unzip -le 'pass'" 'Checking dependencies: perl IO::Uncompress::Unzip' "Error perl IO::Uncompress::Unzip not found, please install perl IO::Uncompress::Unzip"
execute_cmd "perl -Mthreads -le 'pass'" 'Checking dependencies: perl threads' "Error perl IO::Compress not found, please install perl threads"
execute_cmd "perl -MThread::Semaphore -le 'pass'" 'Checking dependencies: perl Thread::Semaphore' "Error perl Thread::Semaphore, please install perl Thread::Semaphore"
execute_cmd "perl -MPOSIX -le 'pass'" 'Checking dependencies: perl POSIX' "Error perl POSIX not found, please install perl POSIX"
execute_cmd "perl -MTime::HiRes -le 'pass'" 'Checking dependencies: perl Time::HiRes' "Error perl Time::HiRes not found, please install perl Time::HiRes"
execute_cmd "perl -MScalar::Util -le 'pass'" 'Checking dependencies: perl Scalar::Util' "Error perl Scalar::Util not found, please install perl Scalar::Util"
fi
# install tentacle
@ -351,8 +361,8 @@ uninstall () {
}
help () {
echo " --install To install Pandora FMS Servers on this system (You have to be root)"
echo " --uninstall To uninstall and remove Pandora FMS Servers on this System"
echo " --install To install Tentacle Server on this system (You have to be root)"
echo " --uninstall To uninstall and remove Tentacle Server on this System"
echo " "
echo " Additional second parameter (after --install) "
echo " "
@ -401,4 +411,3 @@ case "$MODE" in
*)
help
esac