#!/bin/bash

### BEGIN INIT INFO
# Provides:          css1
# Required-Start:    $syslog $local_fs $network
# Required-Stop:     $syslog $local_fs $network
# Should-Start:      $remote_fs $named
# Should-Stop:       $remote_fs $named
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start SRCDS Server
# Description:       SRCDS Start Script
### END INIT INFO

# Source function library.
. /lib/lsb/init-functions

#####################################################
# Конфигурирование
#####################################################

SERVER_NAME="CSS Server 1"
screen_name=css1
path="/home/css/1/css"
srcds_ip=91.210.250.5
srcds_port=27015
srcds_gametype=cstrike
srcds_players=26
srcds_map=de_dust2
srcds_pid=server.pid
screen_pid=$screen_name-screen.pid
srcds_options=""
use_user=css
checker_command="quakestat"
restarttime=10

#################	ВНИМАНИЕ	###################
#
# Строчки ниже, если не знаете, лучше не трогать!
#
#################	ВНИМАНИЕ	###################
RETVAL=0

succes="[\033[1;32m ОК \033[0m]"
failed="[\033[1;31m FAIL \033[0m]"
status_on="[\033[1;32m ONLINE \033[0m]"
status_off="[\033[1;31m OFFLINE \033[0m]"
title="\033[1;34m [>>]\033[0m"

# Команда screen
INTR="/usr/bin/screen -A -m -d -S $screen_name"

if [ ! -x $path/srcds_run ]; then
	printf "\033[22;31m Проверьте права на исполнение srcds_run \033[0m\n"
	exit 1
fi

prestart_check() {
	if [ -f $path/$srcds_pid ] && [ -f $path/$screen_pid ]; then
		ch=`ps -ef | grep SCREEN | grep $screen_name`
		if [ -n "$ch" ]; then
			printf "$title\033[1;34m Сервер $SERVER_NAME\033[0m \033[32m(!!) на данный момент УЖЕ работает (!!)\033[0m\n"
			exit 1
		else 
			rm -rf $path/$screen_pid
			rm -rf $path/$srcds_pid
		fi
	fi
}

start() {
	# Проверка престартовая
	prestart_check
	cd $path
	# Запускаем сервер
	$INTR sudo -u $use_user ./srcds_run -game $srcds_gametype +maxplayers $srcds_players +map $srcds_map +ip $srcds_ip -port $srcds_port $srcds_options -pidfile $path/$srcds_pid
	# Поиск и запись пидов процессов сервера и скрина в системе
	ps -ef | grep SCREEN | grep "$screen_name" | grep -v grep | awk '{ print $2}' > $path/$screen_pid
	printf "$title\033[1;34m Запуск сервера $SERVER_NAME \033[0m\n"
	printf "\t\033[1;35m Порт севрера:\033[0m \033[1;36m$srcds_port\033[0m\n"
	printf "\t\033[1;35m Запуск от юзера:\033[0m \033[1;36m$use_user\033[0m\n"
	printf "\t\033[1;33m Статус: \033[0m"
	sleep 10
	if [ -f $path/$srcds_pid ] && [ -f $path/$screen_pid ]; then
		ch=`ps -ef | grep SCREEN | grep $screen_name`
		if [ -n "$ch" ]; then
			printf "$succes\n"
		else
			printf "$failed\n"
		fi
	fi
}

stop() {
	if [ -f $path/$srcds_pid ] && [ -f $path/$screen_pid ]; then
		# Завершаем КОРРЕКТНО сервер!! 
		printf "$title\033[1;31m Остановка $SERVER_NAME \033[0m"
		/usr/bin/screen -R $screen_name -p 0 -X register . quit
		/usr/bin/screen -R $screen_name -p 0 -X paste .
		/usr/bin/screen -R $screen_name -p 0 -X stuff $'\n'
		sleep 1
		/usr/bin/screen -R $screen_name -X quit > /dev/null
		sleep 1
		rm -rf $path/$screen_pid
		rm -rf $path/$srcds_pid
		printf "$succes\n"

	else
		printf "\033[1;34m Невозможно остановить $SERVER_NAME, сервер НЕ запущен \033[0m"
		printf "$failed\n"
	fi
} 

status() {
	printf "$title\033[1;34m Статус сервера $SERVER_NAME \033[0m\n"
	printf "\t\033[1;35m Порт севрера:\033[0m \033[1;36m$srcds_port\033[0m\n"
	printf "\t\033[1;35m Запущен от юзера:\033[0m \033[1;36m$use_user\033[0m\n"
	printf "\t\033[1;33m Статус: \033[0m"
	sleep 1
	ch=`ps -ef | grep SCREEN | grep $screen_name`
	if [ -n "$ch" ]; then
		printf "$status_on\n"
	else
		printf "$status_off\n"
	fi
}

console() {
	if [ -f $path/$srcds_pid ] && [ -f $path/$screen_pid ]; then
		printf "$title\033[1;34m Подключение к консоли $SERVER_NAME сервера \033[0m\n"
		printf "\t\033[36m Для выхода из консоли поочерёдно нажать \033[1;36mCtrl+A, D \033[0m\n"
		printf "\t\033[36m Для листинга консоли поочерёдно нажать \033[1;36mCtrl+A, Esc \033[0m\n"
		printf "\t\033[36m Для выхода из режима листинга нажать \033[1;36mEsc \033[0m\n"
		printf "\t\033[1;31m Внимание!!! По неаккуратности можно положить сервер :D \033[0m\n"
		concnt=1
		while [ $concnt -gt 0 ]; do
			echo -en "\r\t Консоль включится через $concnt сек "
			let concnt=concnt-1
               		sleep 1
		done
		/usr/bin/screen -R $screen_name
		printf "\t$succes\n"
	else
		printf "\033[1;31m Невозможно подключиться к $SERVER_NAME, сервер не запущен \033[0m\n"
	fi
}

check_logsize() {
	printf "$title\033[1;34m Проверка размера .log файлов \033[0m\n"
	maxlogsize=10485760
	if [ -f $path/checker.log ]; then
		sizeCheckUP=`stat -c%s $path/checker.log`
		printf "\t\033[1;36m Размер checker.log:\033[0m \033[1;35m $sizeCheckUP байт\033[0m\n"
		if [ "$sizeCheckUP" -ge "$maxlogsize" ]; then
			printf "\t\033[1;31m Очищаю файл checker.log\033[0m\n"
			tail -n 50 $path/checker.log > $path/checker.temp
			mv $path/checker.temp $path/checker.log  
			sleep 1
		fi
	else
		printf "\t\033[1;31m Файл checker.log отсутствует\033[0m\n"
	fi
	if [ -f $path/$srcds_gametype/qconsole.log ]; then
		sizeQconsole=`stat -c%s $path/cstrike/qconsole.log`
		printf "\t\033[1;36m Размер qconsole.log:\033[0m \033[1;35m $sizeQconsole байт\033[0m\n"
		if [ "$sizeQconsole" -ge "$maxlogsize" ]; then
			printf "\033[1;31m Очищаю файл qconsole.log\033[0m\n"
			tail -n 50 $path/$srcds_gametype/qconsole.log >  $path/$srcds_gametype/qconsole.temp
			mv  $path/$srcds_gametype/qconsole.temp  $path/$srcds_gametype/qconsole.log
			sleep 1
		fi
	else 
		printf "\t\033[1;31m Файл qconsole.log отсутствует\033[0m\n"
	fi
}

checker() {
	checktag="[HLDS-CheckUP]"
	checkresponse=`$checker_command -P -a2s $srcds_ip:$srcds_port | grep response`
	if [ -n "$checkresponse" ]; then
		printf "\033[1;37m$checktag\033[0m $SERVER_NAME \033[31m*[No response]*\033[0m\n"
		# echo Отсылаем почту
		cd $path
		time=`date +%X`
		date=`date +%D`
		inlog=`$checker_command -P -a2s $srcds_ip:$srcds_port | grep response`
		printf "[$time - $date] *[No response]* $inlog\n" >> checker.log
		stop
		sleep 2
		start
		sleep 1
		echo ----------------ATTANTION---------------- >> checker.log
		printf "StartUP $SERVER_NAME:" >> checker.log
		ch=`ps -ef | grep SCREEN | grep $screen_name`
		if [ -n "$ch" ]; then
			printf " *[OK]* \n" >> checker.log
		else
			printf " *[FAILED]* \n" >> checker.log
		fi
		echo ----------------------------------------- >> checker.log
		exit 1
	fi
	checkdown=`$checker_command -P -a2s $srcds_ip:$srcds_port | grep DOWN`
	if [ -n "$checkdown" ]; then
		printf "\033[1;37m$checktag\033[0m $SERVER_NAME \033[31m*[DOWN]*\033[0m\n"
		# echo Отсылаем почту
		cd $path
		time=`date +%X`
		date=`date +%D`
		inlog=`$checker_command -P -a2s $srcds_ip:$srcds_port | grep DOWN`
		printf "[$time - $date] *[DOWN]* $inlog\n" >> checker.log
		stop
		sleep 2
		start
		sleep 1
		echo ----------------ATTANTION---------------- >> checker.log
		printf "StartUP $SERVER_NAME:" >> checker.log
		ch=`ps -ef | grep SCREEN | grep $screen_name`
		if [ -n "$ch" ]; then
			printf " *[OK]* \n" >> checker.log
		else
			printf " *[FAILED]* \n" >> checker.log
		fi
		echo ----------------------------------------- >> checker.log
		exit 1
	fi
	checkup=`$checker_command -P -a2s $srcds_ip:$srcds_port | grep cstrike`
	if [ -n "$checkup" ]; then
		printf "\033[1;37m$checktag\033[0m $SERVER_NAME \033[32m*[OK]*\033[0m\n"
		cd $path
		time=`date +%X`
		date=`date +%D`
		inlog=`quakestat -P -a2s $srcds_ip:$srcds_port | grep cstrike`
		printf "[$time - $date] *[OK]* $inlog\n" >> checker.log
		exit 1
	fi
}

prerestart() {
	if [ -f $path/$srcds_pid ] && [ -f $path/$screen_pid ]; then
		printf "$title\033[1;31m Начинается отчет до рестарта $SERVER_NAME \033[0m\n\t"
		cnt=$restarttime
		while [ $cnt -gt 0 ]; do
                	/usr/bin/screen -R $screen_name -p 0 -X register . "say Server has been restart after $cnt seconds!"
                	/usr/bin/screen -R $screen_name -p 0 -X paste .
                	/usr/bin/screen -R $screen_name -p 0 -X stuff $'\n'
			echo -en "\r\t Рестарт через $cnt сек"
			let cnt=cnt-1
               		sleep 1
		done

                /usr/bin/screen -R $screen_name -p 0 -X register . "say ============================================="
                /usr/bin/screen -R $screen_name -p 0 -X paste .
                /usr/bin/screen -R $screen_name -p 0 -X stuff $'\n'

                /usr/bin/screen -R $screen_name -p 0 -X register . "say [ SERVER SHUTTING DOWN ]"
                /usr/bin/screen -R $screen_name -p 0 -X paste .
               	/usr/bin/screen -R $screen_name -p 0 -X stuff $'\n'

                /usr/bin/screen -R $screen_name -p 0 -X register . "say ============================================="
                /usr/bin/screen -R $screen_name -p 0 -X paste .
                /usr/bin/screen -R $screen_name -p 0 -X stuff $'\n'

		printf "$succes\n"
        fi
       
}

case "$1" in
	start)
		check_logsize
		start
	;;
	stop)
		stop
	;;
	restart)
                prerestart
                sleep 2
                stop
                sleep 2
                start
	;;
	status)
		status
	;;
	console)
		console
	;;
	checker)
		checker
	;;
	logsize)
		check_logsize
	;;
	*)
	echo "Usage: $0 {start|stop|restart|status|console|checker|logsize}"
	exit 1
esac
exit 0
