l4d2server 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896
  1. #!/bin/bash
  2. # Left 4 Dead 2
  3. # Server Management Script
  4. # Author: Daniel Gibbs
  5. # Website: http://danielgibbs.co.uk
  6. <<<<<<< HEAD
  7. # Version: 251214
  8. =======
  9. # Version: 240114
  10. >>>>>>> Major update 240114
  11. #### Variables ####
  12. # Notification Email
  13. # (on|off)
  14. emailnotification="off"
  15. email="email@example.com"
  16. # Steam login
  17. steamuser="anonymous"
  18. steampass=""
  19. # Start Variables
  20. defaultmap="c5m1_waterfront"
  21. port="27015"
  22. sourcetvport="27020"
  23. clientport="27005"
  24. maxplayers="16"
  25. ip="0.0.0.0"
  26. # https://developer.valvesoftware.com/wiki/Command_Line_Options#Source_Dedicated_Server
  27. fn_parms(){
  28. parms="-game left4dead2 +map ${defaultmap} -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +tv_port ${sourcetvport} -maxplayers ${maxplayers}"
  29. }
  30. #### Advanced Variables ####
  31. # Steam
  32. appid="222860"
  33. # Server Details
  34. servicename="l4d2-server"
  35. gamename="Left 4 Dead 2"
  36. engine="source"
  37. # Directorys
  38. rootdir="$(cd "$(dirname "${BASH_SOURCE[0]}" )" && pwd )"
  39. selfname="$0"
  40. filesdir="${rootdir}/serverfiles"
  41. systemdir="${filesdir}/left4dead2"
  42. executabledir="${filesdir}"
  43. executable="./srcds_run"
  44. servercfg="${systemdir}/cfg/${servicename}.cfg"
  45. defaultcfg="${systemdir}/cfg/server.cfg"
  46. backupdir="backups"
  47. steamclient="${filesdir}/bin/steamclient.so"
  48. # Server Details
  49. <<<<<<< HEAD
  50. servername=$(grep -s hostname "${servercfg}" | sed 's/hostname //g'|sed 's/"//g')
  51. rcon=$(grep -s rcon_password "${servercfg}" | sed 's/rcon_password //g'|sed 's/"//g')
  52. =======
  53. servername=$(grep -s hostname "${servercfg}"|sed 's/hostname //g'|sed 's/"//g')
  54. rcon=$(grep -s rcon_password "${servercfg}"|sed 's/rcon_password //g'|sed 's/"//g')
  55. >>>>>>> Major update 240114
  56. # Logging
  57. logdays="7"
  58. gamelogdir="${systemdir}/logs"
  59. scriptlogdir="${rootdir}/log/script"
  60. consolelogdir="${rootdir}/log/console"
  61. scriptlog="${scriptlogdir}/${servicename}-script.log"
  62. consolelog="${consolelogdir}/${servicename}-console.log"
  63. emaillog="${scriptlogdir}/${servicename}-email.log"
  64. scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%d-%m-%Y-%H-%M-%S').log"
  65. consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M-%S').log"
  66. ##### Script #####
  67. # Do not edit
  68. # unless you know
  69. # what you are doing
  70. fn_scriptlog(){
  71. echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: '$1'" >> ${scriptlog}
  72. }
  73. fn_rootcheck(){
  74. if [ `whoami` = "root" ]; then
  75. echo -e "\r\033[K[\e[0;31m FAIL \e[0;39m] Script will not run as root!"
  76. exit
  77. fi
  78. }
  79. fn_syscheck(){
  80. <<<<<<< HEAD
  81. if [ ! -e "${filesdir}" ]; then
  82. echo -e "\r\033[K[\e[0;31m FAIL \e[0;39m] Cannot access ${filesdir}: No such directory"
  83. =======
  84. if [ ! -e "${systemdir}" ]; then
  85. echo -e "\r\033[K[\e[0;31m FAIL \e[0;39m] Cannot access ${systemdir}: No such directory"
  86. >>>>>>> Major update 240114
  87. exit
  88. fi
  89. }
  90. fn_autoip(){
  91. # Identifies the server interface IP
  92. # If multiple interfaces this will need to be set manually
  93. getip=$(ip -o -4 addr|awk '{print $4 }'|grep -oe '\([0-9]\{1,3\}\.\?\)\{4\}'|grep -v 127.0.0.1)
  94. getipwc=$(ip -o -4 addr|awk '{print $4 }'|grep -oe '\([0-9]\{1,3\}\.\?\)\{4\}'|grep -v 127.0.0.1|wc -l)
  95. if [ "${ip}" == "0.0.0.0" ]||[ "${ip}" == "" ]; then
  96. if [ "${getipwc}" -ge "2" ]; then
  97. <<<<<<< HEAD
  98. echo -en "[\e[1;33m WARN \e[0;39m] Multiple active interfaces.\n\n"
  99. echo -en "Manually specify the IP in ${selfname}\n"
  100. =======
  101. echo -en "[\e[1;33m WARN \e[0;39m] Multiple active network interfaces.\n\n"
  102. echo -en "Manually specify the IP you want to use in ${selfname}.\n"
  103. >>>>>>> Major update 240114
  104. echo -en "Set ip=\"0.0.0.0\" to one of the following:\n"
  105. echo -en "${getip}\n"
  106. exit
  107. else
  108. ip=${getip}
  109. fi
  110. fi
  111. }
  112. fn_logmanager(){
  113. if [ ! -e "${consolelog}" ]; then
  114. touch "${consolelog}"
  115. fi
  116. # log manager will active if finds logs older than ${logdays}
  117. <<<<<<< HEAD
  118. if [ `find "${scriptlogdir}"/* -mtime +${logdays} |wc -l` -ne "0" ]; then
  119. =======
  120. if [ `find "${scriptlogdir}"/* -mtime +${logdays}|wc -l` -ne "0" ]; then
  121. >>>>>>> Major update 240114
  122. echo -e "\r\033[K[\e[0;32m OK \e[0;39m] Starting log cleaner"
  123. fn_scriptlog "Starting log cleaner"
  124. sleep 1
  125. echo -e "[\e[0;36m INFO \e[0;39m] Removing logs older than ${logdays} days"
  126. fn_scriptlog "Removing logs older than ${logdays} days"
  127. sleep 1
  128. <<<<<<< HEAD
  129. find "${scriptlogdir}"/* -mtime +${logdays} |tee >> "${scriptlog}"
  130. find "${consolelogdir}"/* -mtime +${logdays} |tee >> "${scriptlog}"
  131. =======
  132. find "${scriptlogdir}"/* -mtime +${logdays}|tee >> "${scriptlog}"
  133. find "${consolelogdir}"/* -mtime +${logdays}|tee >> "${scriptlog}"
  134. >>>>>>> Major update 240114
  135. scriptcount=$(find "${scriptlogdir}/*" -mtime +${logdays}|wc -l)
  136. consolecount=$(find "${consolelogdir}/*" -mtime +${logdays}|wc -l)
  137. count=$((${scriptcount} + ${consolecount}))
  138. find "${scriptlogdir}"/* -mtime +${logdays} -exec rm {} \;
  139. find "${consolelogdir}"/* -mtime +${logdays} -exec rm {} \;
  140. echo -e "[\e[0;36m INFO \e[0;39m] Log cleaner removed ${count} log files"
  141. fn_scriptlog "Log cleaner removed ${count} log files"
  142. fi
  143. }
  144. fn_debugserver(){
  145. fn_rootcheck
  146. fn_syscheck
  147. fn_autoip
  148. fn_parms
  149. echo ""
  150. echo "${gamename} Debug"
  151. echo "============================"
  152. echo ""
  153. echo -e "Use for identifying server issues only!"
  154. echo -e "Press CTRL+c to drop out of debug mode"
  155. echo -e "\e[0;31mWARNING!\e[0;39m If ${servicename} is already running it will be stopped"
  156. echo ""
  157. echo "Start parameters:"
  158. echo ${parms}
  159. echo ""
  160. while true; do
  161. read -p "Continue? [y/N]" yn
  162. case $yn in
  163. [Yy]* ) break;;
  164. [Nn]* ) echo Exiting; return 1;;
  165. * ) echo "Please answer yes or no.";;
  166. esac
  167. done
  168. fn_stopserver
  169. echo -en "\r\033[K[ .... ] Starting debug mode ${servicename}: ${servername}"
  170. sleep 0.5
  171. echo -en "\r\033[K[\e[0;32m OK \e[0;39m] Starting debug mode ${servicename}: ${servername}"
  172. <<<<<<< HEAD
  173. fn_scriptlog "Started debug mode ${servername} "
  174. sleep 0.5
  175. echo -en "\n"
  176. cd "${filesdir}"
  177. ./srcds_run "${parms}" -debug
  178. =======
  179. fn_scriptlog "Started debug mode ${servername}"
  180. sleep 0.5
  181. echo -en "\n"
  182. cd "${executabledir}"
  183. ${executable} ${parms} -debug
  184. >>>>>>> Major update 240114
  185. }
  186. fn_console(){
  187. fn_rootcheck
  188. fn_syscheck
  189. echo ""
  190. echo "${gamename} Console"
  191. echo "============================"
  192. echo ""
  193. echo "Press \"CTRL+b d\" to exit console"
  194. echo -e "\e[0;31mWARNING!\e[0;39m Do NOT press CTRL+c to exit"
  195. echo ""
  196. while true; do
  197. read -p "Continue? [y/N]" yn
  198. case $yn in
  199. [Yy]* ) break;;
  200. [Nn]* ) echo Exiting; return 1;;
  201. * ) echo "Please answer yes or no.";;
  202. esac
  203. done
  204. echo -en "\r\033[K[ .... ] Starting ${servicename} console"
  205. sleep 0.5
  206. tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|grep -E "^${servicename}:"|wc -l)
  207. if [ ${tmuxwc} -eq 1 ]; then
  208. echo -e "\r\033[K[\e[0;32m OK \e[0;39m] Starting ${servicename} console"
  209. fn_scriptlog "Console accessed"
  210. sleep 1
  211. tmux attach-session -t ${servicename}
  212. else
  213. echo -e "\r\033[K[\e[0;31m FAIL \e[0;39m] Starting ${servicename} console: ${servername} not running"
  214. sleep 0.5
  215. while true; do
  216. read -p "Do you want to start the server? [y/N]" yn
  217. case $yn in
  218. [Yy]* ) fn_startserver;break;;
  219. [Nn]* ) break;;
  220. * ) echo "Please answer yes or no.";;
  221. esac
  222. done
  223. fi
  224. }
  225. fn_backupserver(){
  226. fn_rootcheck
  227. fn_syscheck
  228. backupname="${servicename}-$(date '+%Y-%m-%d-%H%M%S')"
  229. echo ""
  230. echo "${gamename} Backup"
  231. echo "============================"
  232. echo ""
  233. echo "The following backup will be created."
  234. echo ""
  235. echo "${backupdir}/${backupname}.tar.gz"
  236. echo ""
  237. while true; do
  238. read -p "Continue? [y/N]" yn
  239. case $yn in
  240. [Yy]* ) break;;
  241. [Nn]* ) echo Exiting; return 1;;
  242. * ) echo "Please answer yes or no.";;
  243. esac
  244. done
  245. tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|grep -E "^${servicename}:"|wc -l)
  246. if [ ${tmuxwc} -eq 1 ]; then
  247. echo -e "\e[0;31mWARNING!\e[0;39m ${servicename} is currently running"
  248. while true; do
  249. read -p "Would you like to stop ${servicename} while running the backup? [y/N]" yn
  250. case $yn in
  251. [Yy]* ) fn_stopserver;break;;
  252. [Nn]* ) break;;
  253. * ) echo "Please answer yes or no.";;
  254. esac
  255. done
  256. fi
  257. echo -en "\r\033[K[ .... ] Starting backup ${servicename}: ${servername}"
  258. sleep 1
  259. echo -en "\r\033[K[\e[0;32m OK \e[0;39m] Starting backup ${servicename}: ${servername}"
  260. fn_scriptlog "Backup started"
  261. sleep 1
  262. echo -en "\n"
  263. cd "${rootdir}"
  264. <<<<<<< HEAD
  265. mkdir -p "${backupdir}" > /dev/null 2>&1
  266. =======
  267. mkdir -pv "${backupdir}" > /dev/null 2>&1
  268. >>>>>>> Major update 240114
  269. tar -cvzf "${backupdir}/${backupname}.tar.gz" --exclude "${backupdir}" *
  270. echo -en "\r\033[K${servicename} Backup complete"
  271. fn_scriptlog "Backup complete"
  272. }
  273. fn_distro(){
  274. arch=$(uname -m)
  275. kernel=$(uname -r)
  276. if [ -f /etc/lsb-release ]; then
  277. os=$(lsb_release -s -d)
  278. elif [ -f /etc/debian_version ]; then
  279. os="Debian $(cat /etc/debian_version)"
  280. elif [ -f /etc/redhat-release ]; then
  281. os=$(cat /etc/redhat-release)
  282. else
  283. os="$(uname -s) $(uname -r)"
  284. fi
  285. }
  286. fn_uptime(){
  287. uptime=$(</proc/uptime)
  288. uptime=${uptime%%.*}
  289. minutes=$(( uptime/60%60 ))
  290. hours=$(( uptime/60/60%24 ))
  291. days=$(( uptime/60/60/24 ))
  292. }
  293. fn_load(){
  294. load=$(uptime|awk -F 'load average' '{ print $2 }')
  295. }
  296. fn_emailnotification(){
  297. fn_distro
  298. fn_uptime
  299. fn_load
  300. {
  301. echo -e "========================================\n${servicename} details\n========================================\n"
  302. echo -e "Service: ${servicename}"
  303. echo -e "Server: ${servername}"
  304. echo -e "Game: ${gamename}"
  305. echo -e "Failure reason: ${failurereason}"
  306. echo -e "Action Taken: ${actiontaken}\n"
  307. echo -e "========================================\nServer details\n========================================\n"
  308. echo -e "Date: $(date)"
  309. echo -e "Distro: ${os}"
  310. echo -e "Arch: ${arch}"
  311. echo -e "Kernel: ${kernel}"
  312. echo -e "Hostname: $HOSTNAME"
  313. echo -e "Uptime: ${days}d, ${hours}h, ${minutes}m"
  314. echo -e "Avg Load${load}\n"
  315. echo -e "========================================\nLogs\n========================================\n"
  316. echo -e "Script log\n===================\n"
  317. }|tee "${scriptlogdir}/${servicename}-email.log" > /dev/null 2>&1
  318. tail -25 "${scriptlog}" >> "${emaillog}"
  319. if [ ! -z "${consolelog}" ]; then
  320. echo -e "\n\nConsole log\n====================\n" >> "${emaillog}"
  321. tail -25 "${consolelog}" >> "${emaillog}"
  322. fi
  323. if [ ! -z "${gamelogdir}" ]; then
  324. echo -e "\n\nServer log\n====================\n" >> "${emaillog}"
  325. <<<<<<< HEAD
  326. tail "${gamelogdir}"/* | grep -v "==>"|sed '/^$/d'|tail -25 >> "${emaillog}"
  327. =======
  328. tail "${gamelogdir}"/*|grep -v "==>"|sed '/^$/d'|tail -25 >> "${emaillog}"
  329. >>>>>>> Major update 240114
  330. fi
  331. mail -s "${subject}" ${email} < "${emaillog}"
  332. echo -en "[\e[0;36m INFO \e[0;39m] Sent email notification to ${email}"
  333. fn_scriptlog "Sent email notification to ${email}"
  334. sleep 1
  335. echo -en "\n"
  336. }
  337. fn_emailtest(){
  338. fn_rootcheck
  339. fn_syscheck
  340. fn_scriptlog "Emailing test notification"
  341. if [ "${emailnotification}" = "on" ]; then
  342. subject="${servicename} Email Test Notification - Testing ${servername}"
  343. failurereason="Testing ${servicename} email notification"
  344. actiontaken="Sent test email...hello is this thing on?"
  345. fn_emailnotification
  346. else
  347. echo -e "\r\033[K[\e[0;31m FAIL \e[0;39m] Email notification not enabled"
  348. fn_scriptlog "Email notification not enabled"
  349. fi
  350. sleep 0.5
  351. echo -en "\n"
  352. }
  353. fn_serverquery(){
  354. # uses gsquery.py to directly query the server
  355. # detects if the server locks up
  356. if [ -f gsquery.py ]; then
  357. if [ "${engine}" == "unreal" ]||[ "${engine}" == "unreal2" ]; then
  358. gameport=$(grep Port= ${systemdir}/${ini}|grep -v Master|grep -v LAN|grep -v Proxy|grep -v Listen|sed 's/\Port=//g')
  359. port=$((${gameport} + 1))
  360. elif [ "${engine}" == "spark" ]; then
  361. port=$((${port} + 1))
  362. fi
  363. echo -en "\r\033[K[\e[0;36m INFO \e[0;39m] Monitoring ${servicename}: Detected gsquery.py"
  364. <<<<<<< HEAD
  365. fn_scriptlog "Detected gsquery.py "
  366. =======
  367. fn_scriptlog "Detected gsquery.py"
  368. >>>>>>> Major update 240114
  369. sleep 1
  370. echo -en "\r\033[K[ .... ] Monitoring ${servicename}: Querying port: ${ip}:${port}: QUERYING"
  371. fn_scriptlog "Querying port: ${ip}:${port}: QUERYING"
  372. serverquery=$(./gsquery.py -a ${ip} -p ${port} -e ${engine} 2>&1)
  373. exitcode=$?
  374. <<<<<<< HEAD
  375. sleep 1
  376. =======
  377. sleep 1
  378. >>>>>>> Major update 240114
  379. if [ "${exitcode}" == "1" ]||[ "${exitcode}" == "2" ]||[ "${exitcode}" == "3" ]||[ "${exitcode}" == "4" ]; then
  380. echo -en "\r\033[K[\e[0;31m FAIL \e[0;39m] Monitoring ${servicename}: Querying port: ${ip}:${port}: ${serverquery}"
  381. fn_scriptlog "Querying port: ${ip}:${port}: ${serverquery}"
  382. sleep 1
  383. echo -en "\n"
  384. if [ "${emailnotification}" = "on" ]; then
  385. subject="${servicename} Monitor - Starting ${servername}"
  386. failurereason="Failed to query ${servicename}: ${serverquery}"
  387. actiontaken="restarted ${servicename}"
  388. fn_emailnotification
  389. fi
  390. fn_restartserver
  391. exit
  392. elif [ "${exitcode}" == "0" ]; then
  393. echo -en "\r\033[K[\e[0;32m OK \e[0;39m] Monitoring ${servicename}: Querying port: ${ip}:${port}: OK"
  394. fn_scriptlog "Querying port: ${ip}:${port}: OK"
  395. sleep 1
  396. echo -en "\n"
  397. exit
  398. elif [ "${exitcode}" == "126" ]; then
  399. echo -en "\r\033[K[\e[0;31m FAIL \e[0;39m] Monitoring ${servicename}: Querying port: ${ip}:${port}: ERROR: ./gsquery.py: Permission denied"
  400. fn_scriptlog "Querying port: ${ip}:${port}: ./gsquery.py: Permission denied"
  401. sleep 1
  402. echo -en "\n"
  403. echo "Attempting to resolve automatically"
  404. chmod +x -v gsquery.py
  405. exitcode=$?
  406. if [ "${exitcode}" == "0" ]; then
  407. fn_serverquery
  408. else
  409. echo -en "\nUnable to resolve automatically. Please manually fix permissions\n"
  410. owner=$(ls -al gsquery.py|awk '{ print $3 }')
  411. echo "As user ${owner} or root run the following command"
  412. whoami=$(whoami)
  413. echo -en "\nchown ${whoami}:${whoami} gsquery.py\n\n"
  414. exit
  415. fi
  416. else
  417. echo -en "\r\033[K[\e[0;31m FAIL \e[0;39m] Monitoring ${servicename}: Querying port: ${ip}:${port}: UNKNOWN ERROR"
  418. fn_scriptlog "Querying port: ${ip}:${port}: UNKNOWN ERROR"
  419. sleep 1
  420. echo -en "\n"
  421. ./gsquery.py -a ${ip} -p ${port} -e ${engine}
  422. exit
  423. fi
  424. fi
  425. }
  426. fn_monitorserver(){
  427. fn_rootcheck
  428. fn_syscheck
  429. fn_autoip
  430. echo -en "\r\033[K[ .... ] Monitoring ${servicename}: ${servername}"
  431. fn_scriptlog "Monitoring ${servername}"
  432. sleep 1
  433. updatecheck=$(ps -ef|grep "${selfname} update"|grep -v grep|wc -l)
  434. if [ "${updatecheck}" = "0" ]; then
  435. echo -en "\r\033[K[ .... ] Monitoring ${servicename}: Checking session: CHECKING"
  436. fn_scriptlog "Checking session: CHECKING"
  437. sleep 1
  438. tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|grep -E "^${servicename}:"|wc -l)
  439. if [ ${tmuxwc} -eq 1 ]; then
  440. echo -en "\r\033[K[\e[0;32m OK \e[0;39m] Monitoring ${servicename}: Checking session: OK"
  441. fn_scriptlog "Checking session: OK"
  442. sleep 1
  443. echo -en "\n"
  444. fn_serverquery
  445. exit
  446. else
  447. echo -en "\r\033[K[\e[0;31m FAIL \e[0;39m] Monitoring ${servicename}: Checking session: FAIL"
  448. fn_scriptlog "Checking session: FAIL"
  449. sleep 1
  450. <<<<<<< HEAD
  451. echo -en "\n"
  452. =======
  453. echo -en "\n"
  454. >>>>>>> Major update 240114
  455. if [ "${emailnotification}" = "on" ]; then
  456. subject="${servicename} Monitor - Starting ${servername}"
  457. failurereason="${servicename} process not running"
  458. actiontaken="${servicename} has been restarted"
  459. fn_emailnotification
  460. fi
  461. fn_scriptlog "Monitor is starting ${servername}"
  462. <<<<<<< HEAD
  463. fn_startserver
  464. =======
  465. fn_startserver
  466. >>>>>>> Major update 240114
  467. fi
  468. else
  469. echo -e "[\e[0;36m INFO \e[0;39m] Monitoring ${servicename}: Detected SteamCMD is checking for updates"
  470. fn_scriptlog "Detected SteamCMD is checking for updates"
  471. sleep 1
  472. echo -e "[\e[0;36m INFO \e[0;39m] Monitoring ${servicename}: When updates complete ${servicename} will start"
  473. fn_scriptlog "When updates complete ${servicename} will start"
  474. fi
  475. }
  476. fn_updateserver(){
  477. fn_rootcheck
  478. fn_syscheck
  479. echo -en "\r\033[K[ .... ] Updating ${servicename}: ${servername}"
  480. sleep 0.5
  481. echo -en "\r\033[K[\e[0;32m OK \e[0;39m] Updating ${servicename}: ${servername}"
  482. fn_scriptlog "Updating ${servername}"
  483. cd "${rootdir}"
  484. <<<<<<< HEAD
  485. cd steamcmd
  486. ./steamcmd.sh +login anonymous +force_install_dir "${filesdir}" +app_update ${appid} validate +quit |tee -a "${scriptlog}"
  487. =======
  488. cd "steamcmd"
  489. ./steamcmd.sh +login ${steamuser} ${steampass} +force_install_dir "${filesdir}" +app_update ${appid} validate +quit|tee -a "${scriptlog}"
  490. >>>>>>> Major update 240114
  491. }
  492. fn_restartserver(){
  493. fn_scriptlog "Restarting ${servername}"
  494. fn_stopserver
  495. fn_startserver
  496. }
  497. fn_stopserver(){
  498. fn_rootcheck
  499. fn_syscheck
  500. pid=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -E "^${servicename}:"|wc -l)
  501. echo -en "\r\033[K[ .... ] Stopping ${servicename}: ${servername}"
  502. fn_scriptlog "Stopping ${servername}"
  503. sleep 0.5
  504. if [ "${pid}" == "0" ]; then
  505. echo -en "\r\033[K[\e[0;31m FAIL \e[0;39m] Stopping ${servicename}: ${servername} is already stopped"
  506. fn_scriptlog "${servername} is already stopped"
  507. else
  508. tmux kill-session -t ${servicename}
  509. echo -en "\r\033[K[\e[0;32m OK \e[0;39m] Stopping ${servicename}: ${servername}"
  510. fn_scriptlog "Stopped ${servername}"
  511. fi
  512. sleep 0.5
  513. echo -en "\n"
  514. }
  515. fn_startserver(){
  516. fn_rootcheck
  517. fn_syscheck
  518. fn_autoip
  519. fn_parms
  520. fn_logmanager
  521. tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|grep -E "^${servicename}:"|wc -l)
  522. if [ ${tmuxwc} -eq 0 ]; then
  523. mv "${scriptlog}" "${scriptlogdate}"
  524. mv "${consolelog}" "${consolelogdate}"
  525. fi
  526. echo -en "\r\033[K[ .... ] Starting ${servicename}: ${servername}"
  527. fn_scriptlog "Starting ${servername}"
  528. sleep 0.5
  529. if [ ${tmuxwc} -eq 1 ]; then
  530. echo -en "\r\033[K[\e[0;36m INFO \e[0;39m] Starting ${servicename}: ${servername} is already running"
  531. fn_scriptlog "${servername} is already running"
  532. sleep 0.5
  533. echo -en "\n"
  534. exit
  535. fi
  536. <<<<<<< HEAD
  537. cd "${filesdir}"
  538. tmux new-session -d -s ${servicename} "./srcds_run ${parms} |tee -a '${consolelog}'"
  539. =======
  540. cd "${executabledir}"
  541. tmux new-session -d -s ${servicename} "${executable} ${parms}|tee -a '${consolelog}'"
  542. >>>>>>> Major update 240114
  543. sleep 1
  544. tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -E "^${servicename}:"|wc -l)
  545. if [ ${tmuxwc} -eq 0 ]; then
  546. echo -en "\r\033[K[\e[0;31m FAIL \e[0;39m] Starting ${servicename}: Failed to start ${servername}"
  547. fn_scriptlog "failed to start ${servername}"
  548. else
  549. echo -en "\r\033[K[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername}"
  550. fn_scriptlog "Started ${servername}"
  551. fi
  552. sleep 0.5
  553. echo -en "\n"
  554. }
  555. fn_details(){
  556. fn_autoip
  557. servername=$(grep -s hostname "${servercfg}"|sed 's/hostname //g'|sed 's/"//g')
  558. rcon=$(grep -s rcon_password "${servercfg}"|sed 's/rcon_password //g'|sed 's/"//g')
  559. pid=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -E "^${servicename}:"|wc -l)
  560. echo ""
  561. echo "${gamename} Server Details"
  562. echo "============================"
  563. echo "Server name: ${servername}"
  564. echo "Server IP: ${ip}:${port}"
  565. echo "RCON password: ${rcon}"
  566. echo "Config file: ${servercfg}"
  567. echo ""
  568. echo "${servername} Ports"
  569. <<<<<<< HEAD
  570. echo "======================="
  571. servername=$(grep -s hostname "${servercfg}" | sed 's/hostname //g'|sed 's/"//g')
  572. rcon=$(grep -s rcon_password "${servercfg}" | sed 's/rcon_password //g'|sed 's/"//g')
  573. echo "Ports the server is currently using"
  574. =======
  575. echo "============================"
  576. echo "Ports the server is currently using."
  577. >>>>>>> Major update 240114
  578. echo ""
  579. echo "DIRECTION DESCRIPTION PORT"
  580. echo "INBOUND Game/RCON port ${port}"
  581. if [ "${engine}" = "source" ]; then
  582. echo "INBOUND SourceTV port ${sourcetvport}"
  583. fi
  584. echo "OUTBOUND Client port ${clientport}"
  585. echo ""
  586. echo "You can change ports by editing the"
  587. echo "start parameters in ${selfname}."
  588. echo ""
  589. if [ "${pid}" == "0" ]; then
  590. echo -e "Status:\e[0;31m OFFLINE\e[0;39m"
  591. else
  592. echo -e "Status:\e[0;32m ONLINE\e[0;39m"
  593. fi
  594. echo ""
  595. }
  596. #
  597. ## Installer
  598. #
  599. fn_header(){
  600. clear
  601. echo "================================="
  602. echo "${gamename}"
  603. echo "Linux Game Server Manager"
  604. echo "by Daniel Gibbs"
  605. echo "http://danielgibbs.co.uk"
  606. echo "================================="
  607. echo ""
  608. }
  609. fn_steamdl(){
  610. echo "Installing SteamCMD"
  611. echo "================================="
  612. cd "${rootdir}"
  613. <<<<<<< HEAD
  614. mkdir -p steamcmd
  615. cd steamcmd
  616. =======
  617. mkdir -pv "steamcmd"
  618. sleep 1
  619. cd "steamcmd"
  620. >>>>>>> Major update 240114
  621. if [ ! -f steamcmd.sh ]; then
  622. wget http://media.steampowered.com/client/steamcmd_linux.tar.gz
  623. tar --verbose -zxf steamcmd_linux.tar.gz
  624. rm -v steamcmd_linux.tar.gz
  625. chmod +x steamcmd.sh
  626. sleep 1
  627. else
  628. echo ""
  629. echo "Steam already installed!"
  630. fi
  631. sleep 1
  632. echo ""
  633. }
  634. fn_steaminstall(){
  635. echo "Installing ${gamename} Server"
  636. echo "================================="
  637. sleep 1
  638. mkdir -pv "${filesdir}"
  639. cd "${rootdir}/steamcmd"
  640. STEAMEXE=steamcmd ./steamcmd.sh +login ${steamuser} ${steampass} +force_install_dir "${filesdir}" +app_update ${appid} validate +quit
  641. echo ""
  642. echo "================================="
  643. while true; do
  644. read -p "Was the install successful? [y/N]" yn
  645. case $yn in
  646. [Yy]* ) break;;
  647. [Nn]* ) fn_retryinstall;;
  648. * ) echo "Please answer yes or no.";;
  649. esac
  650. done
  651. echo ""
  652. }
  653. fn_steamfix(){
  654. echo "Applying steamclient.so fix"
  655. echo "================================="
  656. sleep 1
  657. mkdir -pv ${HOME}/.steam
  658. mkdir -pv ${HOME}/.steam/sdk32
  659. cp -v "${steamclient}" "${HOME}/.steam/sdk32/steamclient.so"
  660. sleep 1
  661. echo ""
  662. }
  663. fn_loginstall(){
  664. echo "Creating log directorys"
  665. echo "================================="
  666. sleep 1
  667. mkdir -pv "${rootdir}/log"
  668. mkdir -pv "${scriptlogdir}"
  669. touch "${scriptlog}"
  670. mkdir -pv "${consolelogdir}"
  671. touch "${consolelog}"
  672. if [ ! -h ${rootdir}/log/server ]; then
  673. ln -sv "${gamelogdir}" "${rootdir}/log/server"
  674. else
  675. echo "Symbolic link ${gamelogdir} => ${rootdir}/log/server already exists!"
  676. fi
  677. sleep 1
  678. echo ""
  679. }
  680. fn_retryinstall(){
  681. while true; do
  682. read -p "Retry install? [y/N]" yn
  683. case $yn in
  684. [Yy]* ) fn_install;;
  685. [Nn]* ) echo Exiting; exit;;
  686. * ) echo "Please answer yes or no.";;
  687. esac
  688. done
  689. }
  690. fn_install(){
  691. fn_rootcheck
  692. fn_header
  693. if [ -d "${filesdir}" ]; then
  694. echo "${gamename} Server is already installed here:"
  695. pwd
  696. echo ""
  697. while true; do
  698. read -p "Continue [y/N]" yn
  699. case $yn in
  700. [Yy]* ) fn_header; break;;
  701. [Nn]* ) echo Exiting; return 1;;
  702. * ) echo "Please answer yes or no.";;
  703. esac
  704. done
  705. fi
  706. echo "Install Directory:"
  707. pwd
  708. echo ""
  709. while true; do
  710. read -p "Continue [y/N]" yn
  711. case $yn in
  712. [Yy]* ) break;;
  713. [Nn]* ) echo Exiting; return 1;;
  714. * ) echo "Please answer yes or no.";;
  715. esac
  716. done
  717. fn_header
  718. fn_steamdl
  719. <<<<<<< HEAD
  720. echo ""
  721. echo "Installing ${gamename} Server"
  722. echo "================================="
  723. cd "${rootdir}/steamcmd"
  724. mkdir -pv "${filesdir}"
  725. # Steam's installscript does not support quotes!!
  726. # That is why the block below is commented out
  727. # touch install.txt
  728. # chmod 0600 install.txt
  729. # echo "login anonymous" > install.txt
  730. # echo "force_install_dir '${filesdir}'" >> install.txt
  731. # echo "app_update ${appid} validate" >> install.txt
  732. # echo "quit" >> install.txt
  733. #STEAMEXE=steamcmd ./steamcmd.sh +runscript install.txt
  734. #rm install.txt
  735. STEAMEXE=steamcmd ./steamcmd.sh +login anonymous +force_install_dir "${filesdir}" +app_update "${appid}" validate +quit
  736. echo ""
  737. echo "================================="
  738. while true; do
  739. read -p "Was the install successful? [y/N]" yn
  740. case $yn in
  741. [Yy]* ) break;;
  742. [Nn]* ) fn_retryinstall;;
  743. * ) echo "Please answer yes or no.";;
  744. esac
  745. done
  746. fn_header
  747. =======
  748. fn_steaminstall
  749. fn_steamfix
  750. fn_loginstall
  751. >>>>>>> Major update 240114
  752. echo "Configuring ${gamename} Server"
  753. echo "================================="
  754. sleep 1
  755. read -p "Enter server name: " servername
  756. read -p "Enter rcon password: " rconpass
  757. sleep 1
  758. <<<<<<< HEAD
  759. echo ""
  760. echo "Creating server.cfg"
  761. touch "${filesdir}/left4dead2/cfg/server.cfg"
  762. echo "exec ${servicename}.cfg" > "${filesdir}/left4dead2/cfg/server.cfg"
  763. sleep 1
  764. echo "Creating default config file:"
  765. sleep 0.5
  766. echo "${servercfg}"
  767. =======
  768. echo "Creating server.cfg."
  769. touch "${defaultcfg}"
  770. echo "exec ${servicename}.cfg" > "${defaultcfg}"
  771. sleep 1
  772. echo "Creating ${servicename}.cfg config file."
  773. >>>>>>> Major update 240114
  774. touch "${servercfg}"
  775. {
  776. echo -e "// server name"
  777. echo -e "hostname \"${servername}\""
  778. echo -e ""
  779. echo -e "// rcon passsword"
  780. echo -e "rcon_password \"${rconpass}\""
  781. echo -e ""
  782. echo -e "// Server password"
  783. echo -e "sv_password \"\""
  784. echo -e ""
  785. echo -e "// server logging"
  786. echo -e "log on"
  787. echo -e "sv_logbans 1"
  788. echo -e "sv_logecho 1"
  789. echo -e "sv_logfile 1"
  790. echo -e "sv_log_onefile 0"
  791. }|tee "${servercfg}" > /dev/null 2>&1
  792. sleep 1
  793. echo ""
  794. <<<<<<< HEAD
  795. echo "Creating log directorys"
  796. mkdir -pv "${rootdir}/log"
  797. mkdir -pv "${scriptlogdir}"
  798. mkdir -pv "${consolelogdir}"
  799. touch "${consolelog}"
  800. if [ ! -h ${rootdir}/log/server ]; then
  801. ln -sv "${gamelogdir}" "${rootdir}/log/server"
  802. else
  803. echo "Symbolic link ${gamelogdir} => ${rootdir}/log/server already exists!"
  804. fi
  805. sleep 1
  806. echo ""
  807. echo "Applying steamclient.so fix"
  808. mkdir -pv ${HOME}/.steam
  809. mkdir -pv ${HOME}/.steam/sdk32
  810. cp -v "${filesdir}/bin/steamclient.so" "${HOME}/.steam/sdk32/steamclient.so"
  811. sleep 1
  812. =======
  813. >>>>>>> Major update 240114
  814. fn_header
  815. sleep 1
  816. fn_details
  817. sleep 1
  818. echo "================================="
  819. echo "Install Complete!"
  820. echo ""
  821. echo "To start server type:"
  822. echo "${selfname} start"
  823. echo ""
  824. }
  825. case "$1" in
  826. start)
  827. fn_startserver;;
  828. stop)
  829. fn_stopserver;;
  830. restart)
  831. fn_restartserver;;
  832. update)
  833. fn_stopserver
  834. fn_updateserver
  835. fn_startserver;;
  836. monitor)
  837. fn_monitorserver;;
  838. email-test)
  839. fn_emailtest;;
  840. details)
  841. fn_details;;
  842. backup)
  843. fn_backupserver;;
  844. console)
  845. fn_console;;
  846. debug)
  847. fn_debugserver;;
  848. install)
  849. fn_install;;
  850. *)
  851. echo "Usage: $0 {start|stop|restart|update|monitor|email-test|details|backup|console|debug|install}"
  852. exit 1;;
  853. esac
  854. exit