2020-06-28 23:43:33 +02:00
#!/bin/bash
#Ramil Valitov ramilvalitov@gmail.com
#https://github.com/rvalitov/zabbix-php-fpm
#This script is used for testing
2020-07-07 22:38:01 +02:00
MAX_POOLS = 3
MAX_PORTS = 3
MIN_PORT = 9000
copyPool( ) {
ORIGINAL_FILE = $1
POOL_NAME = $2
POOL_SOCKET = $3
POOL_TYPE = $4
POOL_DIR = $( dirname " ${ ORIGINAL_FILE } " )
PHP_VERSION = $( echo " $POOL_DIR " | grep -oP "(\d\.\d)" )
NEW_POOL_FILE = " $POOL_DIR / ${ POOL_NAME } .conf "
sudo cp " $ORIGINAL_FILE " " $NEW_POOL_FILE "
#Add status path
sudo sed -i 's#;pm.status_path.*#pm.status_path = /php-fpm-status#' " $NEW_POOL_FILE "
#Set pool manager
sudo sed -i " s#pm = dynamic#pm = $POOL_TYPE # " " $NEW_POOL_FILE "
#Socket
sudo sed -i " s#listen =.*#listen = $POOL_SOCKET # " " $NEW_POOL_FILE "
#Pool name
sudo sed -i " s#\[www\]#[ $POOL_NAME ]# " " $NEW_POOL_FILE "
}
2020-06-28 23:43:33 +02:00
setupPool( ) {
POOL_FILE = $1
POOL_DIR = $( dirname " ${ POOL_FILE } " )
PHP_VERSION = $( echo " $POOL_DIR " | grep -oP "(\d\.\d)" )
2020-07-07 22:38:01 +02:00
#Delete all active pools except www.conf:
find " $POOL_DIR " -name '*.conf' -type f -not -name 'www.conf' -exec rm -rf { } \;
2020-06-28 23:43:33 +02:00
#Add status path
2020-07-07 22:38:01 +02:00
sudo sed -i 's#;pm.status_path.*#pm.status_path = /php-fpm-status#' " $POOL_FILE "
2020-06-28 23:43:33 +02:00
#Set pool manager
sudo sed -i 's#pm = dynamic#pm = static#' " $POOL_FILE "
2020-07-07 22:38:01 +02:00
#Create new socket pools
2020-06-28 23:43:33 +02:00
for ( ( c = 1; c <= MAX_POOLS; c++) ) ; do
POOL_NAME = " socket $c "
2020-07-07 22:38:01 +02:00
POOL_SOCKET = " /run/php/php ${ PHP_VERSION } -fpm- ${ POOL_NAME } .sock "
copyPool " $POOL_FILE " " $POOL_NAME " " $POOL_SOCKET " "static"
2020-06-28 23:43:33 +02:00
done
2020-07-07 22:38:01 +02:00
#Create TCP port based pools
2020-06-28 23:43:33 +02:00
#Division on 1 is required to convert from float to integer
2020-07-07 22:38:01 +02:00
START_PORT = $( echo " ( $MIN_PORT + $PHP_VERSION * 100 + 1)/1 " | bc)
2020-06-28 23:43:33 +02:00
for ( ( c = 1; c <= MAX_PORTS; c++) ) ; do
2020-07-07 22:38:01 +02:00
POOL_NAME = " port $c "
2020-06-28 23:43:33 +02:00
POOL_PORT = $( echo " ( $START_PORT + $c )/1 " | bc)
2020-07-07 22:38:01 +02:00
copyPool " $POOL_FILE " " $POOL_NAME " " $POOL_PORT " "static"
2020-06-28 23:43:33 +02:00
done
2020-07-07 22:38:01 +02:00
#Create TCP IPv4 localhost pool
POOL_NAME = "localhost"
POOL_PORT = $( echo " ( $MIN_PORT + $PHP_VERSION * 100)/1 " | bc)
POOL_SOCKET = " 127.0.0.1: $POOL_PORT "
copyPool " $POOL_FILE " " $POOL_NAME " " $POOL_SOCKET " "static"
2020-06-28 23:43:33 +02:00
sudo service " php ${ PHP_VERSION } -fpm " restart
}
2020-07-07 22:38:01 +02:00
setupPools( ) {
PHP_LIST = $( find /etc/php/ -name 'www.conf' -type f)
while IFS = read -r pool; do
if [ [ -n $pool ] ] ; then
setupPool " $pool "
fi
done <<< " $PHP_LIST "
}
getNumberOfPHPVersions( ) {
PHP_COUNT = $( find /etc/php/ -name 'www.conf' -type f | wc -l)
echo " $PHP_COUNT "
}
2020-06-28 23:43:33 +02:00
getAnySocket( ) {
#Get any socket of PHP-FPM:
PHP_FIRST = $( find /etc/php/ -name 'www.conf' -type f | head -n1)
assertNotNull "Failed to get PHP conf" " $PHP_FIRST "
PHP_VERSION = $( echo " $PHP_FIRST " | grep -oP "(\d\.\d)" )
assertNotNull "Failed to get PHP version" " $PHP_VERSION "
PHP_POOL = $( find /run/php/ -name " php ${ PHP_VERSION } *.sock " -type s | head -n1)
assertNotNull " Failed to get PHP ${ PHP_VERSION } socket " " $PHP_POOL "
echo " $PHP_POOL "
}
getAnyPort( ) {
PHP_PORT = $( sudo netstat -tulpn | grep -F "LISTEN" | grep -F "php-fpm" | head -n1 | awk '{print $4}' | rev | cut -d: -f1 | rev)
assertNotNull "Failed to get PHP port" " $PHP_PORT "
echo " $PHP_PORT "
}
oneTimeSetUp( ) {
2020-07-03 15:48:27 +02:00
echo " Started job $TRAVIS_JOB_NAME "
2020-07-07 22:38:01 +02:00
echo "Host info:"
nslookup localhost
sudo ifconfig
sudo cat /etc/hosts
2020-06-28 23:43:33 +02:00
echo "Copying Zabbix files..."
#Install files:
sudo cp " $TRAVIS_BUILD_DIR /zabbix/zabbix_php_fpm_discovery.sh " "/etc/zabbix"
sudo cp " $TRAVIS_BUILD_DIR /zabbix/zabbix_php_fpm_status.sh " "/etc/zabbix"
sudo cp " $TRAVIS_BUILD_DIR /zabbix/userparameter_php_fpm.conf " " $( find /etc/zabbix/ -name 'zabbix_agentd*.d' -type d | head -n1) "
sudo chmod +x /etc/zabbix/zabbix_php_fpm_discovery.sh
sudo chmod +x /etc/zabbix/zabbix_php_fpm_status.sh
#Configure Zabbix:
echo 'zabbix ALL=NOPASSWD: /etc/zabbix/zabbix_php_fpm_discovery.sh,/etc/zabbix/zabbix_php_fpm_status.sh' | sudo EDITOR = 'tee -a' visudo
sudo service zabbix-agent restart
echo "Setup PHP-FPM..."
#Setup PHP-FPM pools:
2020-07-07 22:38:01 +02:00
setupPools
2020-06-28 23:43:33 +02:00
echo "All done, starting tests..."
}
testZabbixGetInstalled( ) {
ZABBIX_GET = $( type -P zabbix_get)
assertNotNull "Utility zabbix-get not installed" " $ZABBIX_GET "
}
2020-07-03 15:48:27 +02:00
testZabbixAgentVersion( ) {
#Example: 4.4
REQUESTED_VERSION = $( echo " $TRAVIS_JOB_NAME " | grep -i -F "zabbix" | head -n1 | cut -d "@" -f1 | cut -d " " -f2)
INSTALLED_VERSION = $( zabbix_agentd -V | grep -F "zabbix" | head -n1 | rev | cut -d " " -f1 | rev | cut -d "." -f1,2)
assertSame " Requested version $REQUESTED_VERSION and installed version $INSTALLED_VERSION of Zabbix agent do not match " " $REQUESTED_VERSION " " $INSTALLED_VERSION "
}
testZabbixGetVersion( ) {
#Example: 4.4
REQUESTED_VERSION = $( echo " $TRAVIS_JOB_NAME " | grep -i -F "zabbix" | head -n1 | cut -d "@" -f1 | cut -d " " -f2)
INSTALLED_VERSION = $( zabbix_get -V | grep -F "zabbix" | head -n1 | rev | cut -d " " -f1 | rev | cut -d "." -f1,2)
assertSame " Requested version $REQUESTED_VERSION and installed version $INSTALLED_VERSION of zabbix_get do not match " " $REQUESTED_VERSION " " $INSTALLED_VERSION "
}
2020-06-28 23:43:33 +02:00
testPHPIsRunning( ) {
IS_OK = $( sudo ps ax | grep -F "php-fpm: pool " | grep -F -v "grep" | head -n1)
assertNotNull "No running PHP-FPM instances found" " $IS_OK "
}
testStatusScriptSocket( ) {
PHP_POOL = $( getAnySocket)
#Make the test:
DATA = $( sudo bash "/etc/zabbix/zabbix_php_fpm_status.sh" " $PHP_POOL " "/php-fpm-status" )
IS_OK = $( echo " $DATA " | grep -F '{"pool":"' )
assertNotNull " Failed to get status from pool $PHP_POOL : $DATA " " $IS_OK "
2020-07-07 22:38:01 +02:00
echo " Success test of $PHP_POOL "
2020-06-28 23:43:33 +02:00
}
testStatusScriptPort( ) {
PHP_PORT = $( getAnyPort)
PHP_POOL = " 127.0.0.1: $PHP_PORT "
#Make the test:
DATA = $( sudo bash "/etc/zabbix/zabbix_php_fpm_status.sh" " $PHP_POOL " "/php-fpm-status" )
IS_OK = $( echo " $DATA " | grep -F '{"pool":"' )
assertNotNull " Failed to get status from pool $PHP_POOL : $DATA " " $IS_OK "
2020-07-07 22:38:01 +02:00
echo " Success test of $PHP_POOL "
2020-06-28 23:43:33 +02:00
}
testZabbixStatusSocket( ) {
PHP_POOL = $( getAnySocket)
DATA = $( zabbix_get -s 127.0.0.1 -p 10050 -k php-fpm.status[ " $PHP_POOL " ,"/php-fpm-status" ] )
IS_OK = $( echo " $DATA " | grep -F '{"pool":"' )
assertNotNull " Failed to get status from pool $PHP_POOL : $DATA " " $IS_OK "
2020-07-07 22:38:01 +02:00
echo " Success test of $PHP_POOL "
2020-06-28 23:43:33 +02:00
}
testZabbixStatusPort( ) {
PHP_PORT = $( getAnyPort)
PHP_POOL = " 127.0.0.1: $PHP_PORT "
DATA = $( zabbix_get -s 127.0.0.1 -p 10050 -k php-fpm.status[ " $PHP_POOL " ,"/php-fpm-status" ] )
IS_OK = $( echo " $DATA " | grep -F '{"pool":"' )
assertNotNull " Failed to get status from pool $PHP_POOL : $DATA " " $IS_OK "
2020-07-07 22:38:01 +02:00
echo " Success test of $PHP_POOL "
2020-06-28 23:43:33 +02:00
}
testDiscoverScriptReturnsData( ) {
DATA = $( sudo bash "/etc/zabbix/zabbix_php_fpm_discovery.sh" "/php-fpm-status" )
IS_OK = $( echo " $DATA " | grep -F '{"data":[{"{#POOLNAME}"' )
assertNotNull " Discover script failed: $DATA " " $IS_OK "
}
2020-07-07 22:38:01 +02:00
testDiscoverScriptDebug( ) {
DATA = $( sudo bash "/etc/zabbix/zabbix_php_fpm_discovery.sh" "debug" "/php-fpm-status" )
ERRORS_LIST = $( echo " $DATA " | grep -F 'Error:' )
assertNull " Discover script errors: $DATA " " $ERRORS_LIST "
}
testZabbixDiscoverReturnsData( ) {
DATA = $( zabbix_get -s 127.0.0.1 -p 10050 -k php-fpm.discover[ "/php-fpm-status" ] )
IS_OK = $( echo " $DATA " | grep -F '{"data":[{"{#POOLNAME}"' )
assertNotNull " Discover script failed: $DATA " " $IS_OK "
}
testZabbixDiscoverNumberOfSocketPools( ) {
DATA = $( zabbix_get -s 127.0.0.1 -p 10050 -k php-fpm.discover[ "/php-fpm-status" ] )
NUMBER_OF_POOLS = $( echo " $DATA " | grep -o -F '{"{#POOLNAME}":"socket1",' | wc -l)
PHP_COUNT = $( getNumberOfPHPVersions)
assertEquals "Number of pools mismatch" " $PHP_COUNT " " $NUMBER_OF_POOLS "
}
testZabbixDiscoverNumberOfIPPools( ) {
DATA = $( zabbix_get -s 127.0.0.1 -p 10050 -k php-fpm.discover[ "/php-fpm-status" ] )
NUMBER_OF_POOLS = $( echo " $DATA " | grep -o -F '{"{#POOLNAME}":"localhost",' | wc -l)
PHP_COUNT = $( getNumberOfPHPVersions)
assertEquals "Number of pools mismatch" " $PHP_COUNT " " $NUMBER_OF_POOLS "
}
testZabbixDiscoverNumberOfPortPools( ) {
DATA = $( zabbix_get -s 127.0.0.1 -p 10050 -k php-fpm.discover[ "/php-fpm-status" ] )
NUMBER_OF_POOLS = $( echo " $DATA " | grep -o -F '{"{#POOLNAME}":"port1",' | wc -l)
PHP_COUNT = $( getNumberOfPHPVersions)
assertEquals "Number of pools mismatch" " $PHP_COUNT " " $NUMBER_OF_POOLS "
}
2020-06-28 23:43:33 +02:00
# Load shUnit2.
. shunit2