Files
aws-server/autoshutdown.sh
Jakub Fojt 9e0b04afdc Update for new AWS image style
Support old minecraft versions
2020-12-07 19:50:35 +00:00

96 lines
2.3 KiB
Bash
Executable File

#!/bin/sh
# If exists tmux session
# If Responds to queries
SERVER_DIR='/home/ubuntu/minecraft'
TMUX_NAME='minecraft server'
LIVE_UNTIL="/home/ubuntu/minecraft/live_until.txt"
json_has() {
cat - | python3 -c "import sys, json; sys.exit(0 if '$1' in json.load(sys.stdin) else 1)"
}
json_parse() {
cat - | python3 -c "import sys, json; print(json.load(sys.stdin)['$1'])"
}
silent_exitcode() {
$* > /dev/null 2>&1
}
extend_ttl() {
# Extend time to live 30 minutes at a time
new_ttl="$(date -d '+30 min' +%s)"
old_ttl="$(date -d "$(cat "$LIVE_UNTIL")" +%s)"
if [ ! -f "$LIVE_UNTIL" ] || [ "$new_ttl" -ge "$old_ttl" ]; then
# If LIVE_UNTIL file not existing or new time to live longer
echo "Extending time to live until $(date -d "@$new_ttl")"
date -d "@$new_ttl" > "$LIVE_UNTIL"
fi
exit 0
}
soft_poweroff() {
# Poweroff, if time to live has expired
ttl="0"
if [ -f "$LIVE_UNTIL" ]; then
ttl="$(date -d "$(cat "$LIVE_UNTIL")" +%s)"
fi
echo "Time to live is $(cat "$LIVE_UNTIL")"
if [ "$(date +%s)" -ge "$ttl" ]; then
echo "Server empty longer than grace time, shutting down"
tmux send-keys -t "$TMUX_NAME.0" "stop" ENTER
sleep 5
$(sudo /sbin/shutdown -P +1)
fi
exit 1
}
tmux_running() {
tmux ls -F "#{session_name}" | grep -q "$TMUX_NAME"
}
server_responsive() {
silent_exitcode /usr/local/bin/mcstatus localhost ping
}
get_nplayers() {
json="$(/usr/local/bin/mcstatus localhost json)"
if `echo $json | json_has player_count`; then
echo $json | json_parse player_count
return
fi
status="$(/usr/local/bin/mcstatus localhost status)"
echo "$status" | grep players: | sed 's/.*\([0-9]\+\)\/.*/\1/g'
}
n_logins="$(w -h | wc -l)"
echo "$(date) [$n_logins logins]"
if [ "$n_logins" -gt 0 ]; then
echo "Keep alive as there are active ssh sessions"
extend_ttl
fi
if tmux_running; then
: #echo "Tmux running"
else
echo "Tmux not running"
soft_poweroff
fi
if server_responsive; then
n_players=$(get_nplayers)
echo "Server responsive. $n_players players online"
if [ "$n_players" -gt 0 ]; then
# Keep alive as players are online
extend_ttl
else
soft_poweroff
fi
else
echo "Server unresponsive"
soft_poweroff
fi