tf2server 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641
  1. #!/bin/bash
  2. # Team Fortress 2
  3. # Server Management Script
  4. # Author: Daniel Gibbs
  5. # Website: http://danielgibbs.co.uk
  6. # Version: 221113
  7. #### Variables ####
  8. # Notification Email
  9. # (on|off)
  10. emailnotification="off"
  11. email="email@example.com"
  12. # Start Variables
  13. defaultmap="ctf_2fort"
  14. port="27015"
  15. sourcetvport="27020"
  16. clientport="27005"
  17. maxplayers="16"
  18. parms="-game tf +map ${defaultmap} -strictportbind -port ${port} +tv_port ${sourcetvport} +clientport ${clientport} -maxplayers ${maxplayers}"
  19. #### Advanced Variables ####
  20. # Steam
  21. appid="232250"
  22. # Server Details
  23. servicename="tf2-server"
  24. gamename="Team Fortress 2"
  25. engine="source"
  26. # Directorys
  27. rootdir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
  28. selfname="$0"
  29. filesdir="${rootdir}/serverfiles"
  30. servercfg="${filesdir}/tf/cfg/${servicename}.cfg"
  31. backupdir="backups"
  32. # Server Details
  33. servername=$(grep -s hostname ${servercfg} | sed 's/hostname //g'|sed 's/"//g')
  34. rcon=$(grep -s rcon_password ${servercfg} | sed 's/rcon_password //g'|sed 's/"//g')
  35. # Logging
  36. logdays="7"
  37. gamelogdir="${filesdir}/tf/logs"
  38. scriptlogdir="${rootdir}/log/script"
  39. consolelogdir="${rootdir}/log/console"
  40. scriptlog="${scriptlogdir}/${servicename}-script.log"
  41. consolelog="${consolelogdir}/${servicename}-console.log"
  42. emaillog="${scriptlogdir}/${servicename}-email.log"
  43. scriptlogdate="${scriptlogdir}/${servicename}-script-$(date '+%d-%m-%Y-%H-%M-%S').log"
  44. consolelogdate="${consolelogdir}/${servicename}-console-$(date '+%d-%m-%Y-%H-%M-%S').log"
  45. ##### Script #####
  46. # Do not edit
  47. # unless you know
  48. # what you are doing
  49. fn_rootcheck(){
  50. if [ `whoami` = "root" ];then
  51. echo -e "[\e[0;31m FAIL \e[0;39m] Script will not run as root!"
  52. exit
  53. fi
  54. }
  55. fn_syscheck(){
  56. if [ ! -e ${filesdir} ];then
  57. echo -e "[\e[0;31m FAIL \e[0;39m] Cannot access ${filesdir}: No such directory"
  58. exit
  59. fi
  60. }
  61. fn_runcheck(){
  62. tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|grep -E "^${servicename}:"|wc -l)
  63. if [ ${tmuxwc} -eq 1 ];then
  64. fn_serverquery
  65. echo -en "\r[\e[0;36m INFO \e[0;39m] ${servicename}: ${servername} is already running"
  66. echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: ${servername} is already running" >> ${scriptlog}
  67. sleep 0.5
  68. echo -en "\n"
  69. exit
  70. fi
  71. }
  72. fn_logmanager(){
  73. if [ ! -e ${consolelog} ];then
  74. touch ${consolelog}
  75. fi
  76. # log manager will active if finds logs older than ${logdays}
  77. if [ `find ${scriptlogdir}/* -mtime +${logdays} |wc -l` -ne "0" ];then
  78. echo -e "[\e[0;32m OK \e[0;39m] Starting log cleaner"
  79. echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: Starting log cleaner" >> ${scriptlog}
  80. echo -e "[\e[0;36m INFO \e[0;39m] Removing logs older than ${logdays} days"
  81. echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: Removing logs older than ${logdays} days" >> ${scriptlog}
  82. find ${scriptlogdir}/* -mtime +${logdays} |tee >> ${scriptlog}
  83. find ${consolelogdir}/* -mtime +${logdays} |tee >> ${scriptlog}
  84. scriptcount=$(find ${scriptlogdir}/* -mtime +${logdays}|wc -l)
  85. consolecount=$(find ${consolelogdir}/* -mtime +${logdays}|wc -l)
  86. count=$((${scriptcount} + ${consolecount}))
  87. find ${scriptlogdir}/* -mtime +${logdays} -exec rm {} \;
  88. find ${consolelogdir}/* -mtime +${logdays} -exec rm {} \;
  89. echo -e "[\e[0;36m INFO \e[0;39m] Log cleaner removed ${count} log files"
  90. echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: Log cleaner removed ${count} log files" >> ${scriptlog}
  91. fi
  92. }
  93. fn_debugserver(){
  94. fn_rootcheck
  95. fn_syscheck
  96. echo ""
  97. echo "${gamename} Debug"
  98. echo "============================"
  99. echo ""
  100. echo -e "Use for identifying server issues only!"
  101. echo -e "Press CTRL+c to drop out of debug mode"
  102. echo -e "\e[0;31mWARNING!\e[0;39m If ${servicename} is already running it will be stopped"
  103. echo ""
  104. while true; do
  105. read -p "Continue? [y/N]" yn
  106. case $yn in
  107. [Yy]* ) break;;
  108. [Nn]* ) echo Exiting; return 1 ;;
  109. * ) echo "Please answer yes or no.";;
  110. esac
  111. done
  112. fn_stopserver
  113. echo -en "[ .... ] Starting ${servicename}: ${servername} debug mode"
  114. echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: Starting ${servername} debug mode" >> ${scriptlog}
  115. sleep 0.5
  116. echo -en "\r[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername}"
  117. echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: Started ${servername} debug mode" >> ${scriptlog}
  118. sleep 0.5
  119. echo -en "\n"
  120. cd ${filesdir}
  121. ./srcds_run ${parms} -debug
  122. }
  123. fn_console(){
  124. fn_rootcheck
  125. fn_syscheck
  126. echo ""
  127. echo "${gamename} Console"
  128. echo "============================"
  129. echo ""
  130. echo "Press \"CTRL+b d\" to exit console"
  131. echo -e "\e[0;31mWARNING!\e[0;39m Do NOT press CTRL+c to exit"
  132. echo ""
  133. while true; do
  134. read -p "Continue? [y/N]" yn
  135. case $yn in
  136. [Yy]* ) break;;
  137. [Nn]* ) echo Exiting; return 1 ;;
  138. [Nn]* ) echo Exiting; return 1 ;;
  139. * ) echo "Please answer yes or no.";;
  140. esac
  141. done
  142. echo -en "\r[ .... ] Starting ${servicename} console"
  143. sleep 0.5
  144. tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|grep -E "^${servicename}:"|wc -l)
  145. if [ ${tmuxwc} -eq 1 ];then
  146. echo -e "\r[\e[0;32m OK \e[0;39m] Starting ${servicename} console"
  147. echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: ${servername} console accessed" >> ${scriptlog}
  148. sleep 1
  149. tmux attach-session -t ${servicename}
  150. else
  151. echo -e "\r[\e[0;31m FAIL \e[0;39m] Starting ${servicename} console: ${servername} not running"
  152. sleep 0.5
  153. while true; do
  154. read -p "Do you want to start the server? [y/N]" yn
  155. case $yn in
  156. [Yy]* ) fn_startserver;break;;
  157. [Nn]* ) break;;
  158. * ) echo "Please answer yes or no.";;
  159. esac
  160. done
  161. fi
  162. }
  163. fn_backupserver(){
  164. fn_rootcheck
  165. fn_syscheck
  166. backupname="${servicename}-$(date '+%Y-%m-%d-%H%M%S')"
  167. echo ""
  168. echo "${gamename} Backup"
  169. echo "============================"
  170. echo ""
  171. echo "The following backup will be created."
  172. echo ""
  173. echo "${backupdir}/${backupname}.tar.gz"
  174. echo ""
  175. while true; do
  176. read -p "Continue? [y/N]" yn
  177. case $yn in
  178. [Yy]* ) break;;
  179. [Nn]* ) echo Exiting; return 1 ;;
  180. * ) echo "Please answer yes or no.";;
  181. esac
  182. done
  183. tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -v failed|grep -E "^${servicename}:"|wc -l)
  184. if [ ${tmuxwc} -eq 1 ];then
  185. echo -e "\e[0;31mWARNING!\e[0;39m ${servicename} is currently running"
  186. while true; do
  187. read -p "Would you like to stop ${servicename} while running the backup? [y/N]" yn
  188. case $yn in
  189. [Yy]* ) fn_stopserver;break;;
  190. [Nn]* ) break;;
  191. * ) echo "Please answer yes or no.";;
  192. esac
  193. done
  194. fi
  195. echo -en "[ .... ] Starting ${servicename}: ${servername} backup"
  196. echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: Starting ${servername} backup" >> ${scriptlog}
  197. sleep 0.5
  198. echo -en "\r[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername} backup"
  199. echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: Started ${servername} backup" >> ${scriptlog}
  200. sleep 1
  201. echo -en "\n"
  202. cd ${rootdir}
  203. mkdir ${backupdir} > /dev/null 2>&1
  204. tar -cvzf ${backupdir}/${backupname}.tar.gz --exclude ${backupdir} *
  205. echo -en "\r${servicename} backup complete"
  206. echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: backup complete" >> ${scriptlog}
  207. }
  208. fn_details(){
  209. echo ""
  210. echo "${gamename} Server Details"
  211. echo "============================"
  212. echo ""
  213. echo "${servername} Ports"
  214. echo "======================="
  215. servername=$(grep -s hostname ${servercfg} | sed 's/hostname //g'|sed 's/"//g')
  216. rcon=$(grep -s rcon_password ${servercfg} | sed 's/rcon_password //g'|sed 's/"//g')
  217. echo "Ports the server is currently using"
  218. echo ""
  219. echo "DIRECTION DESCRIPTION PORT"
  220. echo "INBOUND Game/Rcon Port ${port}"
  221. if [ "${engine}" = "source" ];then
  222. echo "INBOUND SourceTV Port ${sourcetvport}"
  223. fi
  224. echo "OUTBOUND Client Port ${clientport}"
  225. echo ""
  226. echo "You can change ports by editing the"
  227. echo "start parameters in ${selfname}"
  228. echo ""
  229. echo "${servername} Details"
  230. echo "======================="
  231. echo "Server name: ${servername}"
  232. echo "Rcon Password: ${rcon}"
  233. echo ""
  234. echo "Config file:"
  235. echo "${servercfg}"
  236. echo ""
  237. }
  238. fn_distro(){
  239. arch=$(uname -m)
  240. kernel=$(uname -r)
  241. if [ -f /etc/lsb-release ]; then
  242. os=$(lsb_release -s -d)
  243. elif [ -f /etc/debian_version ]; then
  244. os="Debian $(cat /etc/debian_version)"
  245. elif [ -f /etc/redhat-release ]; then
  246. os=$(cat /etc/redhat-release)
  247. else
  248. os="$(uname -s) $(uname -r)"
  249. fi
  250. }
  251. fn_uptime(){
  252. uptime=$(</proc/uptime)
  253. uptime=${uptime%%.*}
  254. minutes=$(( uptime/60%60 ))
  255. hours=$(( uptime/60/60%24 ))
  256. days=$(( uptime/60/60/24 ))
  257. }
  258. fn_load(){
  259. load=$(uptime | awk -F 'load average' '{ print $2 }')
  260. }
  261. fn_emailnotification(){
  262. fn_distro
  263. fn_uptime
  264. fn_load
  265. {
  266. echo -e "========================================\n${servicename} details\n========================================\n"
  267. echo -e "Service: ${servicename}"
  268. echo -e "Game: ${gamename}"
  269. echo -e "Server: ${servername}"
  270. echo -e "Failure reason: ${failurereason}"
  271. echo -e "Action Taken: ${actiontaken}\n"
  272. echo -e "========================================\nServer details\n========================================\n"
  273. echo -e "Date: $(date)"
  274. echo -e "Distro: ${os}"
  275. echo -e "Arch: ${arch}"
  276. echo -e "Kernel: ${kernel}"
  277. echo -e "Hostname: $HOSTNAME"
  278. echo -e "Uptime: ${days}d, ${hours}h, ${minutes}m"
  279. echo -e "Avg Load${load}\n"
  280. echo -e "========================================\nLogs\n========================================\n"
  281. echo -e "Script log\n===================\n"
  282. }|tee ${scriptlogdir}/${servicename}-email.log > /dev/null 2>&1
  283. tail -25 ${scriptlog} >> ${emaillog}
  284. if [ ! -z ${consolelog} ];then
  285. echo -e "\n\nConsole log\n====================\n" >> ${emaillog}
  286. tail -25 ${consolelog} >> ${emaillog}
  287. fi
  288. if [ ! -z ${gamelogdir} ];then
  289. echo -e "\n\nServer log\n====================\n" >> ${emaillog}
  290. tail ${gamelogdir}/*|grep -v "==>"|sed '/^$/d'|tail -25 >> ${emaillog}
  291. fi
  292. mail -s "${subject}" ${email} < ${emaillog}
  293. echo -en "[\e[0;36m INFO \e[0;39m] Sent email notification to ${email}"
  294. echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: Sent email notification to ${email}" >> ${scriptlog}
  295. }
  296. fn_emailtest(){
  297. fn_rootcheck
  298. fn_syscheck
  299. echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: Emailing test notification" >> ${scriptlog}
  300. if [ "${emailnotification}" = "on" ];then
  301. subject="${servicename} Email Test Notification - Testing ${servername}"
  302. failurereason="Testing ${servicename} email notification"
  303. actiontaken="Sent test email...hello is this thing on?"
  304. fn_emailnotification
  305. else
  306. echo -e "[\e[0;31m FAIL \e[0;39m] Email notification not enabled"
  307. echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: Email notification not enabled" >> ${scriptlog}
  308. fi
  309. sleep 0.5
  310. echo -en "\n"
  311. }
  312. fn_serverquery(){
  313. # uses serverquery.py to directly query the server
  314. # detects if the server locks up
  315. if [ -f serverquery.py ];then
  316. echo -e "[\e[0;36m INFO \e[0;39m] serverquery.py detected"
  317. echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: serverquery.py detected" >> ${scriptlog}
  318. echo -e "[\e[0;32m OK \e[0;39m] Querying ${servicename}: ${servername}: QUERYING"
  319. echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: QUERYING" >> ${scriptlog}
  320. serverquery=$(./serverquery.py 127.0.0.1 ${port} 2>&1)
  321. sleep 1
  322. if [ "${serverquery}" = "ERROR 1" ]||[ "${serverquery}" = "ERROR 2" ]||[ "${serverquery}" = "ERROR 3" ];then
  323. echo -e "[\e[0;31m FAIL \e[0;39m] Querying ${servicename}: ${servername}: ${serverquery}"
  324. echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: ${serverquery}" >> ${scriptlog}
  325. sleep 1
  326. echo -e "[\e[1;33m WARN \e[0;39m] ${servicename}: Monitor detected ${servername} has locked up!"
  327. echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} has locked up!" >> ${scriptlog}
  328. sleep 1
  329. fn_restartserver
  330. else
  331. echo -e "[\e[0;32m OK \e[0;39m] Querying ${servicename}: ${servername}: ${serverquery}"
  332. echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: Querying ${servername}: ${serverquery}" >> ${scriptlog}
  333. sleep 1
  334. fi
  335. fi
  336. }
  337. fn_monitorserver(){
  338. fn_rootcheck
  339. fn_syscheck
  340. fn_logmanager
  341. echo -en "[ .... ] Monitor is checking ${servicename}: ${servername}"
  342. echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: Monitor is checking ${servername}" >> ${scriptlog}
  343. sleep 0.5
  344. updatecheck=$(ps -ef|grep "${selfname} update"|grep -v grep|wc -l)
  345. if [ "${updatecheck}" = "0" ];then
  346. fn_runcheck
  347. echo -en "\r[\e[1;33m WARN \e[0;39m] ${servicename}: Monitor detected ${servername} had stopped!"
  348. echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} had stopped!" >> ${scriptlog}
  349. if [ "${emailnotification}" = "on" ];then
  350. subject="${servicename} Monitor - Starting ${servername}"
  351. failurereason="${servicename} process was not running"
  352. actiontaken="restarted ${servicename}"
  353. sleep 0.5
  354. echo -en "\n"
  355. fn_emailnotification
  356. fi
  357. sleep 0.5
  358. echo -en "\n"
  359. echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: Monitor is starting ${servername}" >> ${scriptlog}
  360. fn_startserver
  361. else
  362. echo -e "[\e[0;36m INFO \e[0;39m] ${servicename}: Monitor detected ${servername} is currently checking for updates!"
  363. echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: Monitor detected ${servername} is currently checking for updates!" >> ${scriptlog}
  364. echo -e "[\e[0;36m INFO \e[0;39m] ${servicename}: ${servername} will start when updating is complete"
  365. echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: ${servername} will start when updating is complete" >> ${scriptlog}
  366. fi
  367. }
  368. fn_updateserver(){
  369. fn_rootcheck
  370. fn_syscheck
  371. echo -e "[\e[0;32m OK \e[0;39m] Updating ${servicename}: ${servername}"
  372. echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: Updating ${servername}" >> ${scriptlog}
  373. cd ${rootdir}
  374. cd steamcmd
  375. ./steamcmd.sh +login anonymous +force_install_dir ${filesdir} +app_update ${appid} validate +quit |tee -a ${scriptlog}
  376. }
  377. fn_restartserver(){
  378. echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: Restarting ${servername}" >> ${scriptlog}
  379. fn_stopserver
  380. fn_startserver
  381. }
  382. fn_stopserver(){
  383. fn_rootcheck
  384. fn_syscheck
  385. pid=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -E "^${servicename}:"|wc -l)
  386. echo -en "[ .... ] Stopping ${servicename}: ${servername}"
  387. echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: Stopping ${servername}" >> ${scriptlog}
  388. sleep 0.5
  389. if [ "${pid}" == "0" ];then
  390. echo -en "\r[\e[0;31m FAIL \e[0;39m] Stopping ${servicename}: ${servername} is already stopped"
  391. echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: ${servername} is already stopped" >> ${scriptlog}
  392. else
  393. tmux kill-session -t ${servicename}
  394. echo -en "\r[\e[0;32m OK \e[0;39m] Stopping ${servicename}: ${servername}"
  395. echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: Stopped ${servername}" >> ${scriptlog}
  396. fi
  397. sleep 0.5
  398. echo -en "\n"
  399. }
  400. fn_startserver(){
  401. fn_rootcheck
  402. fn_syscheck
  403. echo -en "[ .... ] Starting ${servicename}: ${servername}"
  404. echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: Starting ${servername}" >> ${scriptlog}
  405. sleep 0.5
  406. fn_runcheck
  407. fn_logmanager
  408. mv ${scriptlog} ${scriptlogdate}
  409. mv ${consolelog} ${consolelogdate}
  410. cd ${filesdir}
  411. tmux new-session -d -s ${servicename} "./srcds_run ${parms} |tee -a ${consolelog}"
  412. sleep 1
  413. tmuxwc=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -E "^${servicename}:"|wc -l)
  414. if [ ${tmuxwc} -eq 0 ];then
  415. echo -en "\r[\e[0;31m FAIL \e[0;39m] Starting ${servicename}: Failed to start ${servername}"
  416. echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: failed to start ${servername}" >> ${scriptlog}
  417. else
  418. echo -en "\r[\e[0;32m OK \e[0;39m] Starting ${servicename}: ${servername}"
  419. echo -e "$(date '+%b %d %H:%M:%S') ${servicename}: Started ${servername}" >> ${scriptlog}
  420. fi
  421. sleep 0.5
  422. echo -en "\n"
  423. }
  424. #
  425. ## Installer
  426. #
  427. fn_header(){
  428. clear
  429. echo "================================="
  430. echo "${gamename}"
  431. echo "Server Linux Installer"
  432. echo "by Daniel Gibbs"
  433. echo "http://danielgibbs.co.uk"
  434. echo "================================="
  435. echo ""
  436. }
  437. fn_steamdl(){
  438. echo "Installing Steam"
  439. echo "================================="
  440. cd ${rootdir}
  441. mkdir steamcmd
  442. cd steamcmd
  443. if [ ! -f steam.sh ];then
  444. wget http://media.steampowered.com/client/steamcmd_linux.tar.gz
  445. tar --verbose -zxf steamcmd_linux.tar.gz
  446. rm -v steamcmd_linux.tar.gz
  447. chmod +x steam.sh
  448. else
  449. echo "Steam already installed!"
  450. fi
  451. }
  452. fn_retryinstall(){
  453. while true; do
  454. read -p "Retry install? [y/N]" yn
  455. case $yn in
  456. [Yy]* ) fn_install;;
  457. [Nn]* ) echo Exiting; exit ;;
  458. * ) echo "Please answer yes or no.";;
  459. esac
  460. done
  461. }
  462. fn_install(){
  463. fn_rootcheck
  464. fn_header
  465. if [ -d ${filesdir} ];then
  466. echo "${gamename} Server is already installed here:"
  467. pwd
  468. echo ""
  469. while true; do
  470. read -p "Continue [y/N]" yn
  471. case $yn in
  472. [Yy]* ) break;;
  473. [Nn]* ) echo Exiting; return 1 ;;
  474. * ) echo "Please answer yes or no.";;
  475. esac
  476. done
  477. fi
  478. fn_header
  479. echo "Install Directory:"
  480. pwd
  481. echo ""
  482. while true; do
  483. read -p "Continue [y/N]" yn
  484. case $yn in
  485. [Yy]* ) break;;
  486. [Nn]* ) echo Exiting; return 1 ;;
  487. * ) echo "Please answer yes or no.";;
  488. esac
  489. done
  490. fn_header
  491. fn_steamdl
  492. echo ""
  493. echo "Installing ${gamename} Server"
  494. echo "================================="
  495. cd ${rootdir}/steamcmd
  496. mkdir -v ${filesdir}
  497. touch install.txt
  498. chmod 0600 install.txt
  499. echo "login anonymous" > install.txt
  500. echo "force_install_dir ${filesdir}" >> install.txt
  501. echo "app_update ${appid} validate" >> install.txt
  502. echo "quit" >> install.txt
  503. STEAMEXE=steamcmd ./steam.sh +runscript install.txt
  504. rm install.txt
  505. echo ""
  506. echo "================================="
  507. while true; do
  508. read -p "Was the install successful? [y/N]" yn
  509. case $yn in
  510. [Yy]* ) break;;
  511. [Nn]* ) fn_retryinstall ;;
  512. * ) echo "Please answer yes or no.";;
  513. esac
  514. done
  515. fn_header
  516. echo "Configuring ${gamename} Server"
  517. echo "================================="
  518. read -p "Enter server name: " servername
  519. read -p "Enter rcon password: " rconpass
  520. sleep 1
  521. echo ""
  522. echo "Creating server.cfg"
  523. touch ${filesdir}/tf/cfg/server.cfg
  524. echo "exec ${servercfg}" > ${filesdir}/tf/cfg/server.cfg
  525. sleep 1
  526. echo "Creating default config file:"
  527. sleep 0.5
  528. echo "${servercfg}"
  529. touch ${servercfg}
  530. {
  531. echo -e "// server name"
  532. echo -e "hostname \"${servername}\""
  533. echo -e ""
  534. echo -e "// rcon passsword"
  535. echo -e "rcon_password \"${rconpass}\""
  536. echo -e ""
  537. echo -e "// Server password"
  538. echo -e "sv_password \"\""
  539. echo -e ""
  540. echo -e "// server logging"
  541. echo -e "log on"
  542. echo -e "sv_logbans 1"
  543. echo -e "sv_logecho 1"
  544. echo -e "sv_logfile 1"
  545. echo -e "sv_log_onefile 0"
  546. }|tee ${servercfg} > /dev/null 2>&1
  547. sleep 1
  548. echo ""
  549. echo "Creating log directorys"
  550. mkdir -v ${rootdir}/log
  551. mkdir -v ${scriptlogdir}
  552. mkdir -v ${consolelogdir}
  553. touch ${consolelog}
  554. if [ ! -h ${rootdir}/log/server ]; then
  555. ln -sv ${gamelogdir} ${rootdir}/log/server
  556. else
  557. echo "Symbolic link ${gamelogdir} => ${rootdir}/log/server already exists!"
  558. fi
  559. sleep 1
  560. echo ""
  561. echo "Applying steamclient.so fix"
  562. mkdir -v ${rootdir}/.steam
  563. mkdir -v ${rootdir}/.steam/sdk32
  564. cp -v ${filesdir}/bin/steamclient.so ${rootdir}/.steam/sdk32/steamclient.so
  565. sleep 1
  566. fn_header
  567. fn_details
  568. echo "================================="
  569. echo "Install Complete!"
  570. echo ""
  571. echo "To start server type:"
  572. echo "${selfname} start"
  573. echo ""
  574. }
  575. case "$1" in
  576. start)
  577. fn_startserver;;
  578. stop)
  579. fn_stopserver;;
  580. restart)
  581. fn_restartserver;;
  582. update)
  583. fn_stopserver
  584. fn_updateserver
  585. fn_startserver;;
  586. monitor)
  587. fn_monitorserver;;
  588. email-test)
  589. fn_emailtest;;
  590. details)
  591. fn_details;;
  592. backup)
  593. fn_backupserver;;
  594. console)
  595. fn_console;;
  596. debug)
  597. fn_debugserver;;
  598. install)
  599. fn_install;;
  600. *)
  601. echo "Usage: $0 {start|stop|restart|update|monitor|email-test|details|backup|console|debug|install}"
  602. exit 1;;
  603. esac
  604. exit