#!/bin/bash

scriptversion=2020-04-30
export PG_VERSION=11
export PG_SETEST_CLUSTER=setest
export PG_SEFOREIGN_CLUSTER=seforeign
export PG_FILES_CLUSTER=pg_test
export PG_SETEST_PORT=6000
export PG_SEFOREIGN_PORT=6001
export PG_FILES_PORT=6002

ulimit -c unlimited

usage="Использование: $0 {-all|-acl|-mac|-misc|-f ТЕСТ|-g ФАЙЛ_СО_СПИСКОМ_ТЕСТОВ|--help|--version}

Опции:
-all		Весь набор тестов
-acl		Набор тестов дискреционного разграничения доступа.
-mac		Набор тестов мандатного разграничения доступа.
-misc		Набор дополнительных тестов.
-f		Указанный файл теста.
-g 		Файл со списком тестов.
--help  	Показать эту справку и выйти.
--version	Показать версию и выйти.
"

case "$1" in
	--version)
		echo "$scriptversion"
		exit $?
	;;
	--help)
		echo "$usage"
		exit $?
	;;
	-all|-acl|-mac|-misc)
	;;
	-f|-g)
		if [ "x$2" == "x" ]
		then
			echo "$usage"
			exit $?
		fi
	;;
	*)
		echo "$usage"
		exit $?
esac

# Проверка на наличие прав суперпользователя
if [ "$UID" -ne "0" ]
then
	echo "Требуются права суперпользователя для запуска тестов"
	exit
fi

echo "Подготовка к выполнению тестов СУБД PostgreSQL"
cd /usr/share/postgresql/$PG_VERSION/test/pgacext/

echo "Создание тестовых пользователей..."
./support/create-users

echo "Проверка существования и создание кластеров ..."
cluster=`pg_lsclusters | grep "$PG_VERSION $PG_SETEST_CLUSTER"`
foreign=`pg_lsclusters | grep "$PG_VERSION $PG_SEFOREIGN_CLUSTER"`

if [ "x$cluster" == "x" ]
then
	echo "Кластеры не созданы"
else
	echo $cluster
	echo $foreign
fi

if [ "x$cluster" == "x" ]
then
	pg_createcluster $PG_VERSION $PG_SETEST_CLUSTER --port $PG_SETEST_PORT
fi

if [ "x$foreign" == "x" ]
then
	pg_createcluster $PG_VERSION $PG_SEFOREIGN_CLUSTER --port $PG_SEFOREIGN_PORT
fi

echo "Создание тестового табличного пространства в ФС ..."
spc_tst=/var/lib/postgresql/$PG_VERSION/testspace
if [ ! -e $spc_tst ]
then
	mkdir $spc_tst
	chown postgres:postgres $spc_tst
fi

spc_tst_2=/pg_test_tablespace
if [ ! -e $spc_tst_2 ]
then
	mkdir $spc_tst_2
	chown postgres:postgres $spc_tst_2
	sudo chmod 770 $spc_tst_2
	sudo pdpl-file 3:0:3:ccnr $spc_tst_2
fi

echo "Настройка кластеров ..."
# Настройка конфигурации основного сервера
hba=/etc/postgresql/$PG_VERSION/$PG_SETEST_CLUSTER/pg_hba.conf
audit=/var/lib/postgresql/$PG_VERSION/$PG_SETEST_CLUSTER/pg_audit.conf
hba_tst=/usr/share/postgresql/$PG_VERSION/test/pgacext/support/pg_hba.conf.tst
audit_tst=/usr/share/postgresql/$PG_VERSION/test/pgacext/support/pg_audit.conf.tst
setest_old_cfg=/etc/postgresql/$PG_VERSION/$PG_SETEST_CLUSTER/postgresql.conf
setest_new_cfg=/etc/postgresql/$PG_VERSION/$PG_SETEST_CLUSTER/postgresql.conf.new
# pg_hint_plan
sed -e "s/shared_preload_libraries.*/shared_preload_libraries = 'online_analyze, plantuner, pg_hint_plan'/g" $setest_old_cfg > $setest_new_cfg
mv $setest_new_cfg $setest_old_cfg
cp $hba_tst $hba
cp $audit_tst $audit
chown postgres.postgres /etc/postgresql/$PG_VERSION/$PG_SETEST_CLUSTER/*

# Настройка конфигурации внешнего сервера
old_cfg=/etc/postgresql/$PG_VERSION/$PG_SEFOREIGN_CLUSTER/postgresql.conf
new_cfg=/etc/postgresql/$PG_VERSION/$PG_SEFOREIGN_CLUSTER/postgresql.conf.new
sed -e 's/ac_ignore_socket_maclabel.*/ac_ignore_socket_maclabel = false/g' $old_cfg > $new_cfg
mv $new_cfg $old_cfg
foreign_hba=/etc/postgresql/$PG_VERSION/$PG_SEFOREIGN_CLUSTER/pg_hba.conf
foreign_hba_tst=/usr/share/postgresql/$PG_VERSION/test/pgacext/support/pg_hba_foreign.conf.tst
cp $foreign_hba_tst $foreign_hba
chown postgres.postgres /etc/postgresql/$PG_VERSION/$PG_SEFOREIGN_CLUSTER/*

# Настройка конфигурации дополнительного сервера с метками на файлах
pg_createcluster $PG_VERSION $PG_FILES_CLUSTER -D /$PG_FILES_CLUSTER --port $PG_FILES_PORT
cp $hba_tst /etc/postgresql/$PG_VERSION/$PG_FILES_CLUSTER/pg_hba.conf
sed -i 's/ac_enable_maclabels_on_files.*/ac_enable_maclabels_on_files = true/g' /etc/postgresql/$PG_VERSION/$PG_FILES_CLUSTER/postgresql.conf

echo "Перезапуск кластеров ..."
pg_ctlcluster $PG_VERSION $PG_SETEST_CLUSTER restart
pg_ctlcluster $PG_VERSION $PG_SEFOREIGN_CLUSTER restart
pg_ctlcluster $PG_VERSION $PG_FILES_CLUSTER restart

echo "Настройка необходимых прав пользователю postgres ..."
setfacl -m u:postgres:rx /etc/parsec/macdb
setfacl -m u:postgres:rx /etc/parsec/capdb
setfacl -d -m u:postgres:r /etc/parsec/macdb
setfacl -d -m u:postgres:r /etc/parsec/capdb
setfacl -R -m u:postgres:r /etc/parsec/macdb/*
setfacl -R -m u:postgres:r /etc/parsec/capdb/*

echo "Подготовка к проведению тестирования завершена"

echo "Тестирование дополнительных функциональных возможностей PostgreSQL ..."

# Передан второй параметр скрипту?
if [ "x$2" != "x" ]
then
	./runsetests $1 $2
else
	./runsetests $1
fi

echo "Остановка кластеров ..."
pg_ctlcluster $PG_VERSION $PG_SETEST_CLUSTER stop
pg_ctlcluster $PG_VERSION $PG_SEFOREIGN_CLUSTER stop
pg_ctlcluster $PG_VERSION $PG_FILES_CLUSTER stop

echo "Удаление тестовых пользователей ..."
./support/remove-users

echo "Удаление тестового табличного пространства в ФС ..."
rm -fr $spc_tst
rm -fr $spc_tst_2

echo "Удаление кластеров ..."
pg_dropcluster $PG_VERSION $PG_SETEST_CLUSTER --stop
pg_dropcluster $PG_VERSION $PG_SEFOREIGN_CLUSTER --stop
pg_dropcluster $PG_VERSION $PG_FILES_CLUSTER --stop

rm -fr /etc/postgresql/$PG_VERSION/$PG_SETEST_CLUSTER/
rm -fr /etc/postgresql/$PG_VERSION/$PG_SEFOREIGN_CLUSTER/
rm -fr /etc/postgresql/$PG_VERSION/$PG_FILES_CLUSTER
