#!/bin/bash
#
# authors: Puma http://c-s.net.ua
# version: 1.10
# Source function library.
#. /lib/lsb/init-functions
VERSION="1.10"
#####################################################
# Configuration
#####################################################
server_name="Test" #Название сервера
screen_name="test" #Название screen-сессии
use_user="root" #Имя юзера от которого запускается сервер
path="/home/hlds_test" #Путь до ROOT-директории сервера (без /в конце)
hlds_ip="127.0.0.1" #IP сервера ,не ставить 0.0.0.0
hlds_port="27015" #Порт сервера
hlds_players="32" #Максимальное количество игроков на сервере
hlds_map="de_dust2" #Имя первоначальной карты при запуске
hlds_options1="-debug -pingboost 3" #Дополнительные параметры запуска
condebug="0" #Включить логи в файле qconsole.log из папки cstrike
priority="-10" #Приоритет для сервера (-20 - Высокий ;20 - Низкий)
usecore="0,1,2,3" #Привязка к процессору (0, 1, 2, 3)
hlds_pid="$screen_name.pid" #Имя pid файла сервера
screen_pid="$screen_name-screen.pid" #Имя pid файла screen-a
clear_logs="0" # очишать лог файлы при запуске сервера через скрипт?
clear_cache="0" # очишать кэши системы перед запуском сервера? # работает только под рутом
#####################################################
# End of configuration
#####################################################
screen_cmd="/usr/bin/screen -AmdS $screen_name"
checker_cmd="$path/qstat" #Команда пакета qStat отвечающего за проверку сервера
if [ ! -x $path/hlds_run ]; then
printf "$title$txtred Check run privileges of hlds_run"
exit 1
fi
if [ ! -x $path/hlds_amd ]; then
printf "$title$txtred Check run privileges of hlds_amd"
exit 1
fi
if [ ! -x $path/hlds_i486 ]; then
printf "$title$txtred Check run privileges of hlds_i686"
exit 1
fi
if [ ! -x $path/hlds_i686 ]; then
printf "$title$txtred Check run privileges of hlds_i686"
exit 1
fi
if [ $use_user == "root" ];then
start1=""
else
start1="sudo -u $use_user"
fi
if [ $condebug = 1 ]; then
hlds_options2="-condebug"
fi
txtwht='\e[0;37m' # White
txtgrn='\e[0;32m' # Green
txtylw='\e[0;33m' # Yellow
txtred='\e[0;31m' # Red
txtblu='\e[0;34m' # Blue
title="$txtwht[$txtgrn$hlds_ip:$hlds_port$txtwht]"
prestart_check() {
if [ -f $path/$hlds_pid ] && [ -f $path/$screen_pid ]; then
ps -ef | grep SCREEN | grep -v grep | grep $screen_name | grep $hlds_ip | grep $hlds_port > /dev/null
if [ $? -eq 0 ]; then
printf "$title Screen of $server_name already its working (!!)\n"
exit 1
elif [ $? -eq 1 ]; then
cd $path
rm -rf $path/$screen_pid
printf "$title$txtylw Pid of old screen removed (!!)\n"
fi
ps -ef | grep hlds_ | grep -v grep | grep -v sh | grep -v SCREEN | grep $hlds_ip | grep $hlds_port > /dev/null
if [ $? -eq 0 ]; then
printf "$title$txtylw HLDS Process of $server_name already its working (!!)\n"
exit 1
elif [ $? -eq 1 ]; then
cd $path
rm -rf $path/$hlds_pid
printf "$title$txtylw Pid of old hlds process removed (!!)\n"
fi
fi
}
start() {
prestart_check
cd $path
if [ $clear_logs == 1 ]; then
$start1 rm -f $path/debug.log
$start1 rm -f $path/cstrike/qconsole.log
$start1 rm -fr $path/cstrike/logs/*.log
$start1 rm -fr $path/cstrike/addons/amxmodx/logs/*.log
printf "$title Logs cleared\n"
fi
if [ $clear_cache == 1 ] && [ $use_user == "root" ]; then
echo 3 > /proc/sys/vm/drop_caches
printf "$title Caches&Buffers cleared\n"
fi
printf "$title Starting $server_name\n"
$screen_cmd $start1 ./hlds_run -game cstrike +ip $hlds_ip +port $hlds_port +map $hlds_map +maxplayers $hlds_players $hlds_options1 $hlds_options2 -pidfile $hlds_pid
ps -ef | grep SCREEN | grep -v grep | grep $screen_name | grep $hlds_ip | grep $hlds_port | awk '{ print $2}' > $path/$screen_pid
sleep 1
$start1 taskset -pc $usecore `cat $path/$hlds_pid` > /dev/null
$start1 renice -n $priority -p `cat $path/$hlds_pid` > /dev/null
printf "$title Server"
if [ "`ps -ef | grep hlds_ | grep -v SCREEN | grep -v grep | grep -v sh | grep $screen_name | grep $hlds_ip | grep $hlds_port | awk '{ print $2}'`" = "`cat $path/$hlds_pid`" ]; then
printf " started! :)\n"
else
printf "$txtred crashed on start :(\n"
fi
}
stop() {
if [ -f $path/$hlds_pid ] && [ -f $path/$screen_pid ]; then
if [ "`ps -ef | grep SCREEN | grep -v grep | grep $screen_name | grep $hlds_ip | grep $hlds_port | awk '{ print $2}'`" = "`cat $path/$screen_pid`" ]; then
/usr/bin/screen -wipe > /dev/null
/usr/bin/screen -R `cat $path/$screen_pid` -X stuff $'quit\n' > /dev/null
sleep 1
$start1 rm -rf $path/$screen_pid
$start1 rm -rf $path/$hlds_pid
printf "$title Stopping server $server_name\n"
else
$start1 rm -rf $path/$screen_pid
$start1 rm -rf $path/$hlds_pid
printf "$title$txtylw Problem, server screen process not started and pid file exists!\n"
printf "$title$txtylw Pid file of inexistent screen removed!\n"
fi
else
printf "$title$txtylw Cannot stop server $server_name, because hlds process not started\n"
fi
}
kill_process() {
if [ -f $path/$hlds_pid ]; then
if [ "`ps -ef | grep hlds_ | grep -v SCREEN | grep -v grep | grep -v sh | grep $hlds_ip | grep $hlds_port | awk '{ print $2}'`" = "`cat $path/$hlds_pid`" ]; then
printf "$title Stopping hlds of server $server_name\n"
$start1 kill -9 `cat $path/$hlds_pid`
sleep 1
$start1 rm -rf $path/$hlds_pid
fi
else
printf "$title$txtylw Cannot kill server $server_name, because hlds pidfile removed\n"
fi
if [ -f $path/$screen_pid ]; then
if [ "`ps -ef | grep SCREEN | grep -v grep | grep $screen_name | grep $hlds_ip | grep $hlds_port | awk '{ print $2}'`" = "`cat $path/$screen_pid`" ]; then
printf "$title Stopping screen of server $server_name\n"
$start1 kill -9 `cat $path/$screen_pid`
sleep 1
$start1 rm -rf $path/$screen_pid
fi
else
printf "$title$txtylw Cannot kill server $server_name, because screen pidfile removed\n"
fi
}
status() {
printf "$title Get status of server $server_name\n"
$start1 $checker_cmd -retry 3 -interval 2 -a2s $hlds_ip:$hlds_port | grep $hlds_ip
exit 1
}
console() {
if [ -f $path/$screen_pid ]; then
if [ "`ps -ef | grep SCREEN | grep -v grep | grep $screen_name | grep $hlds_ip | grep $hlds_port | awk '{ print $2}'`" = "`cat $path/$screen_pid`" ]; then
printf "$title Connecting to $server_name\n"
printf "$title$txtylw For exit from console press Ctrl+A,D\n"
printf "$title$txtylw Don't press Ctrl+C\n"
sleep 1
/usr/bin/screen -wipe > /dev/null
/usr/bin/screen -d `cat $path/$screen_pid` > /dev/null
/usr/bin/screen -R `cat $path/$screen_pid`
else
printf "$title$txtylw Problem, server screen process not started and pid file exists!\n"
printf "$title$txtylw Check if server started!\n"
fi
else
printf "$title$txtred Cannot connect to $server_name, server not running\n"
fi
}
checker() {
time=`date +%X`
date=`date +%D`
if [ ! -x $checker_cmd ]; then
printf "$title$txtred Check run privileges of $checker_cmd\n"
exit 1
fi
checknoresp=`$checker_cmd -retry 5 -interval 2 -a2s $hlds_ip:$hlds_port | grep response`
if [ -n "$checknoresp" ]; then
printf "$title $server_name server is: $txtred[NO RESPONSE]\n"
printf "[$time - $date] *[NO RESPONSE]* $checknoresp\n" >> $path/checker.log
kill_process
sleep 1
start
sleep 1
printf "StartUP $title:" >> $path/checker.log
if [ "`ps -ef | grep hlds_ | grep -v SCREEN | grep -v grep | grep -v sh | grep $hlds_ip | grep $hlds_port | awk '{ print $2}'`" = "`cat $path/$hlds_pid`" ]; then
printf " *[OK]* \n" >> $path/checker.log
else
printf " *[FAILED]* \n" >> $path/checker.log
fi
exit 1
fi
checkdown=`$checker_cmd -retry 5 -interval 2 -a2s $hlds_ip:$hlds_port | grep DOWN`
if [ -n "$checkdown" ]; then
printf "$title $server_name server is: $txtred[DOWN]\n"
printf "[$time - $date] *[DOWN]* $checkdown\n" >> $path/checker.log
start
sleep 1
printf "StartUP $title:" >> $path/checker.log
if [ "`ps -ef | grep hlds_ | grep -v SCREEN | grep -v grep | grep -v sh | grep $hlds_ip | grep $hlds_port | awk '{ print $2}'`" = "`cat $path/$hlds_pid`" ]; then
printf " *[OK]* \n" >> $path/checker.log
else
printf " *[FAILED]* \n" >> $path/checker.log
fi
exit 1
fi
checkup=`$checker_cmd -retry 5 -interval 2 -a2s $hlds_ip:$hlds_port | grep cstrike`
if [ -n "$checkup" ]; then
printf "$title $server_name server is: $txtgrn[OK]\n"
printf "[$time - $date] *[OK]* $checkup\n" >> $path/checker.log
fi
if [ "`ps -e -o pid,cpuid,nice,cmd | grep hlds_ | grep -v SCREEN | grep -v grep | grep -v sh | grep $hlds_ip | grep $hlds_port | awk '{ print $3}'`" != $priority ]; then
if [ -f $path/$hlds_pid ]; then
printf "$title $txtylw$server_name server priority is changed because server is crashed\n"
$start1 taskset -pc $usecore "`cat $path/$hlds_pid`" > /dev/null
$start1 renice -n $priority -p "`cat $path/$hlds_pid`" > /dev/null
else
printf "$title $txtylw$server_name server priority cant be restore because not found pidfile!\n"
fi
else
printf "$title $server_name server priority is good!\n"
fi
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
kill_process
sleep 2
start
;;
status)
status
;;
console)
console
;;
checker)
checker
;;
*)
printf "How to use: $0 {start|stop|restart|status|console|checker}\n"
exit 1
esac