2023-02-08 14:59:24 +01:00
#!/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
2023-02-21 12:34:11 +01:00
S_VERSION = '202302201'
2023-02-08 14:59:24 +01:00
LOGFILE = " /tmp/deploy-ext-db- $( date +%F) .log "
# define default variables
[ " $TZ " ] || TZ = "Europe/Madrid"
2023-04-17 09:40:22 +02:00
[ " $MYVER " ] || MYVER = 80
2023-02-08 14:59:24 +01:00
[ " $DBHOST " ] || DBHOST = 127.0.0.1
[ " $DBNAME " ] || DBNAME = pandora
[ " $DBUSER " ] || DBUSER = pandora
2023-07-25 09:34:17 +02:00
[ " $DBPASS " ] || DBPASS = 'Pandor4!'
2023-02-08 14:59:24 +01:00
[ " $DBPORT " ] || DBPORT = 3306
[ " $DBROOTUSER " ] || DBROOTUSER = root
2023-07-25 09:34:17 +02:00
[ " $DBROOTPASS " ] || DBROOTPASS = 'Pandor4!'
2023-02-08 14:59:24 +01:00
[ " $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 " )
2023-04-17 09:40:22 +02:00
2023-02-08 14:59:24 +01:00
# 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
}
2023-07-25 09:34:17 +02:00
# Function to check if a password meets the MySQL secure password requirements
is_mysql_secure_password( ) {
local password = $1
# Check password length (at least 8 characters)
if [ [ ${# password } -lt 8 ] ] ; then
echo "Password length should be at least 8 characters."
return 1
fi
# Check if password contains at least one uppercase letter
if [ [ $password = = ${ password ,, } ] ] ; then
echo "Password should contain at least one uppercase letter."
return 1
fi
# Check if password contains at least one lowercase letter
if [ [ $password = = ${ password ^^ } ] ] ; then
echo "Password should contain at least one lowercase letter."
return 1
fi
# Check if password contains at least one digit
if ! [ [ $password = ~ [ 0-9] ] ] ; then
echo "Password should contain at least one digit."
return 1
fi
# Check if password contains at least one special character
if ! [ [ $password = ~ [ [ :punct:] ] ] ] ; then
echo "Password should contain at least one special character."
return 1
fi
# Check if password is not a common pattern (e.g., "password", "123456")
local common_patterns = ( "password" "123456" "qwerty" )
for pattern in " ${ common_patterns [@] } " ; do
if [ [ $password = = *" $pattern " * ] ] ; then
echo "Password should not contain common patterns."
return 1
fi
done
# If all checks pass, the password is MySQL secure compliant
return 0
}
2023-02-08 14:59:24 +01:00
## Main
echo " Starting PandoraFMS External DB deployment EL8 ver. $S_VERSION "
2023-05-09 10:32:01 +02:00
if ! grep --version & >> $LOGFILE ; then echo 'Error grep is not detected on the system, grep tool is needed for installation.' ; exit -1 ; fi
if ! sed --version & >> $LOGFILE ; then echo 'Error grep is not detected on the system, grep tool is needed for installation.' ; exit -1 ; fi
2023-02-08 14:59:24 +01:00
# 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'
2023-07-25 09:34:17 +02:00
#Check mysql pass
execute_cmd " is_mysql_secure_password $DBROOTPASS " "Checking DBROOTPASS password match policy" 'This password do not match minimum MySQL policy requirements, more info in: https://dev.mysql.com/doc/refman/8.0/en/validate-password.html'
execute_cmd " is_mysql_secure_password $DBPASS " "Checking DBPASS password match policy" 'This password do not match minimum MySQL policy requirements, more info in: https://dev.mysql.com/doc/refman/8.0/en/validate-password.html'
2023-02-08 14:59:24 +01:00
# 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"
2023-03-21 15:41:15 +01:00
execute_cmd "dnf install -y percona-server-server percona-xtrabackup-80" "Installing Percona Server 80"
2023-02-08 14:59:24 +01:00
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' = '$DBROOTPASS' ;
"" " | mysql --connect-expired-password -u $DBROOTUSER &>> " $LOGFILE "
fi
if [ " $MYVER " -ne '80' ] ; then
echo "" "
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
2023-02-20 18:52:35 +01:00
sed -i -e "s/character-set-server=utf8/character-set-server=utf8mb4/g" /etc/my.cnf
2023-02-08 14:59:24 +01:00
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"