Browse Source

improvements to stop command

improvements to graceful shutdown
using functions more for easy reading
pull/743/head
Daniel Gibbs 9 years ago
parent
commit
54895153bc
  1. 235
      functions/command_stop.sh

235
functions/command_stop.sh

@ -9,7 +9,50 @@ lgsm_version="271215"
local modulename="Stopping" local modulename="Stopping"
function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))" function_selfname="$(basename $(readlink -f "${BASH_SOURCE[0]}"))"
sdtd_telnet(){ # Attempts Graceful of source using rcon 'quit' command.
fn_stop_graceful_source(){
fn_print_dots "Graceful: rcon quit"
fn_scriptlog "Graceful: rcon quit"
# sends quit
tmux send -t "${servicename}" quit ENTER > /dev/null 2>&1
# waits up to 30 seconds giving the server time to shutdown gracefuly
for seconds in {1..30}; do
pid=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -Ec "^${servicename}:")
if [ "${pid}" == "0" ]; then
fn_print_ok_nl "Graceful: rcon quit: ${seconds}"
fn_scriptlog "Graceful: rcon quit: OK: ${seconds} seconds"
break
fi
sleep 1
fn_print_dots "Graceful: rcon quit: ${seconds}"
done
if [ "${pid}" != "0" ]; then
fn_print_fail_nl "Graceful: rcon quit"
fn_scriptlog "Graceful: rcon quit: FAIL"
fi
sleep 1
}
# Attempts Graceful of goldsource using rcon 'quit' command.
# Goldsource 'quit' command restarts rather than shutsdown
# this function will only wait 3 seconds then force a tmux shutdown.
# preventing the server from coming back online.
fn_stop_graceful_goldsource(){
fn_print_dots "Graceful: rcon quit"
fn_scriptlog "Graceful: rcon quit"
# sends quit
tmux send -t "${servicename}" quit ENTER > /dev/null 2>&1
# waits 3 seconds as goldsource servers restart with the quit command
for seconds in {1..3}; do
sleep 1
fn_print_dots "Graceful: rcon quit: ${seconds}"
done
fn_print_ok_nl "Graceful: rcon quit: ${seconds}"
sleep 1
}
# Attempts Graceful of 7 Days To Die using telnet.
fn_stop_telnet_sdtd(){
sdtdshutdown=$( expect -c ' sdtdshutdown=$( expect -c '
proc abort {} { proc abort {} {
puts "Timeout or EOF\n" puts "Timeout or EOF\n"
@ -29,131 +72,131 @@ sdtd_telnet(){
') ')
} }
fn_stop_teamspeak3(){ fn_stop_graceful_sdtd(){
check.sh # Gets server IP.
fn_print_dots "${servername}"
fn_scriptlog "${servername}"
sleep 1
info_ts3status.sh
if [ "${ts3status}" = "No server running (ts3server.pid is missing)" ]; then
fn_print_fail "${servername} is already stopped"
fn_scriptlog "${servername} is already stopped"
else
${filesdir}/ts3server_startscript.sh stop > /dev/null 2>&1
fn_print_ok "${servername}"
fn_scriptlog "Stopped ${servername}"
fi
# Remove lock file
rm -f "${rootdir}/${lockselfname}"
sleep 1
echo -en "\n"
}
fn_stop_tmux(){
check.sh
info_config.sh info_config.sh
fn_print_dots "${servername}"
fn_scriptlog "${servername}"
sleep 1
if [ "${gamename}" == "7 Days To Die" ] ; then fn_print_dots "Graceful: telnet"
# if game is 7 Days To Die, we need special, graceful shutdown via telnet connection. fn_scriptlog "Graceful: telnet"
# Set below variable to be called for expect to operate correctly..
fn_print_dots "Attempting graceful shutdown via telnet"
fn_scriptlog "Attempting graceful shutdown via telnet"
sleep 1 sleep 1
# uses localhost on first attempt.
telnetip=127.0.0.1 telnetip=127.0.0.1
sdtd_telnet fn_print_dots "Graceful: telnet: ${telnetip}"
fn_scriptlog "Graceful: telnet: ${telnetip}"
fn_stop_telnet_sdtd
sleep 1
# If failed using localhost will use servers ip # falls back to the server ip if localhost fails.
refused=$(echo -en "\n ${sdtdshutdown}"| grep "Timeout or EOF") refused=$(echo -en "\n ${sdtdshutdown}"| grep "Timeout or EOF")
if [ -n "${refused}" ]; then if [ -n "${refused}" ]; then
fn_print_warn_nl "Graceful: telnet: localhost: "
fn_print_fail_eol
fn_scriptlog "Graceful: telnet: localhost: FAIL"
sleep 1
telnetip=${ip} telnetip=${ip}
fn_print_warn "Attempting graceful shutdown via telnet: localhost failed" fn_print_dots "Graceful: telnet: ${telnetip}"
fn_scriptlog "Warning! Attempting graceful shutdown failed using localhost" fn_scriptlog "Graceful: telnet: ${telnetip}"
sleep 5 fn_stop_telnet_sdtd
echo -en "\n" refused=$(echo -en "\n ${sdtdshutdown}"| grep "Timeout or EOF")
fn_print_dots "Attempting graceful shutdown via telnet: using ${telnetip}"
fn_scriptlog "Attempting graceful shutdown via telnet using ${telnetip}" fn_print_warnnl "Graceful: telnet: ${telnetip}: "
sdtd_telnet fn_print_fail_eol
fn_scriptlog "Graceful: telnet: ${telnetip}: FAIL"
sleep 1 sleep 1
fi fi
refused=$(echo -en "\n ${sdtdshutdown}"| grep "Timeout or EOF") # Checks if attempts have worked.
completed=$(echo -en "\n ${sdtdshutdown}"| grep "Completed.") completed=$(echo -en "\n ${sdtdshutdown}"| grep "Completed.")
if [ -n "${refused}" ]; then if [ -n "${completed}" ]; then
fn_print_fail "Attempting graceful shutdown via telnet" fn_print_ok_nl "Graceful: telnet: "
fn_scriptlog "Attempting graceful shutdown failed" fn_print_ok_eol
fn_scriptlog "${refused}" fn_scriptlog "Graceful: telnet: OK"
elif [ -n "${completed}" ]; then elif [ -n "${refused}" ]; then
fn_print_ok "Attempting graceful shutdown via telnet" fn_print_fail_nl "Graceful: telnet: "
fn_scriptlog "Attempting graceful shutdown succeeded" fn_print_fail_eol
fn_scriptlog "Graceful: telnet: ${telnetip}: FAIL"
echo -en "\n\n" | tee -a "${scriptlog}"
echo -en "Telnet output:" | tee -a "${scriptlog}"
echo -en "\n ${sdtdshutdown}" | tee -a "${scriptlog}"
echo -en "\n\n" | tee -a "${scriptlog}"
else else
fn_print_fail "Attempting graceful shutdown via telnet: Unknown error" fn_print_fail_nl "Graceful: telnet: Unknown error"
fn_scriptlog "Attempting graceful shutdown failed" fn_scriptlog "Graceful: telnet: Unknown error"
fn_scriptlog "Unknown error" echo -en "\n\n" | tee -a "${scriptlog}"
echo -en "Telnet output:" | tee -a "${scriptlog}"
echo -en "\n ${sdtdshutdown}" | tee -a "${scriptlog}"
echo -en "\n\n" | tee -a "${scriptlog}"
fi fi
}
fn_stop_graceful_select(){
if [ "${gamename}" == "7 Days to Die" ]; then
fn_stop_graceful_sdtd
elif [ "${engine}" == "source" ]; then
fn_stop_graceful_source
elif [ "${engine}" == "goldsource" ]; then
fn_stop_graceful_goldsource
else
fn_stop_tmux
}
fn_stop_teamspeak3(){
fn_print_dots "${servername}"
fn_scriptlog "${servername}"
sleep 1 sleep 1
echo -en "\n\n" ${filesdir}/ts3server_startscript.sh stop > /dev/null 2>&1
echo -en "Telnet output:" fn_print_ok "${servername}"
echo -en "\n ${sdtdshutdown}" fn_scriptlog "Stopped ${servername}"
echo -en "\n\n" # Remove lock file
rm -f "${rootdir}/${lockselfname}"
sleep 1 sleep 1
echo -en "\n"
}
fn_stop_tmux(){
fn_print_dots "${servername}" fn_print_dots "${servername}"
fn_scriptlog "${servername}" fn_scriptlog "${servername}"
sleep 5 sleep 1
# Kill tmux session
tmux kill-session -t "${servicename}" > /dev/null 2>&1
pid=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -Ec "^${servicename}:") pid=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -Ec "^${servicename}:")
if [ "${pid}" == "0" ]; then if [ "${pid}" == "0" ]; then
fn_print_ok "${servername} is already stopped using graceful shutdown" fn_print_ok_nl "${servername}"
fn_scriptlog "${servername} is already stopped using graceful shutdown"
else
tmux kill-session -t "${servicename}"
fn_print_ok "${servername}"
fn_scriptlog "Stopped ${servername}" fn_scriptlog "Stopped ${servername}"
sleep 1
# Remove lock file
rm -f "${rootdir}/${lockselfname}"
else
fn_print_fail_nl "Unable to stop${servername}"
fn_scriptlog "Unable to stop${servername}"
fi fi
else }
pid=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -Ec "^${servicename}:")
if [ "${pid}" == "0" ]; then # checks if the server is already stopped before trying to stop.
fn_print_fail "${servername} is already stopped" fn_stop_pre_check(){
if [ "${gamename}" == "Teamspeak 3" ]; then
info_ts3status.sh
if [ "${ts3status}" = "No server running (ts3server.pid is missing)" ]; then
fn_print_ok_nl "${servername} is already stopped"
fn_scriptlog "${servername} is already stopped" fn_scriptlog "${servername} is already stopped"
else else
fn_stop_teamspeak3
if [ "${engine}" == "source" ]||[ "${engine}" == "goldsource" ]; then
sleep 1
fn_print_dots "Attempting graceful shutdown"
fn_scriptlog "Attempting graceful shutdown"
tmux send -t "${servicename}" quit ENTER > /dev/null 2>&1
counter=0
while [ "${pid}" != "0" -a $counter -lt 30 ]; do
pid=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -Ec "^${servicename}:")
sleep 1
let counter=counter+1
if [ "${counter}" -gt "1" ]; then
fn_print_dots "Attempting graceful shutdown: ${counter}"
fi fi
done else
pid=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -Ec "^${servicename}:") pid=$(tmux list-sessions 2>&1|awk '{print $1}'|grep -Ec "^${servicename}:")
if [ "${pid}" == "0" ]; then if [ "${pid}" == "0" ]; then
fn_print_ok "Attempting graceful shutdown" fn_print_ok_nl "${servername} is already stopped"
fn_scriptlog "${servername} is already stopped"
else else
fn_print_fail "Attempting graceful shutdown" fn_stop_graceful_select
fi fi
fi fi
tmux kill-session -t "${servicename}" > /dev/null 2>&1
fn_print_ok "${servername}"
fn_scriptlog "Stopped ${servername}"
fi
fi
# Remove lock file
rm -f "${rootdir}/${lockselfname}"
sleep 1
echo -en "\n"
} }
if [ "${gamename}" == "Teamspeak 3" ]; then
fn_stop_teamspeak3
else check.sh
fn_stop_tmux fn_stop_pre_check
fi
Loading…
Cancel
Save