diff options
author | BuildTools | 2015-09-15 00:39:13 -0700 |
---|---|---|
committer | BuildTools | 2015-09-15 00:39:13 -0700 |
commit | 7b656331c3508775649ff02b90557fedb1aa113f (patch) | |
tree | 9d3b1ebfddb2aeff93cdcd8b30a2e9bcac280570 /spigot.sh | |
parent | fd1247993ea596c524bd127258ff708593b50826 (diff) | |
download | aur-7b656331c3508775649ff02b90557fedb1aa113f.tar.gz |
merging contributed changes from edh
Diffstat (limited to 'spigot.sh')
-rwxr-xr-x | spigot.sh | 235 |
1 files changed, 188 insertions, 47 deletions
diff --git a/spigot.sh b/spigot.sh index 87eeb9e3083d..b866774d4f6e 100755 --- a/spigot.sh +++ b/spigot.sh @@ -1,61 +1,202 @@ #!/bin/bash -BACKUPPATH="/srv/craftbukkit/backup/" -WORLDPATH="/srv/craftbukkit/world/" +# You may use this script for any minecraft server of your choice, just alter those variables +SERVER_ROOT="/srv/spigot" +BACKUPPATH="/srv/spigot/backup" +LOGPATH="/srv/spigot/logs" +WORLDPATHS="/srv/spigot/world /srv/spigot/world_nether /srv/spigot/world_the_end" +KEEP_BACKUPS="10" +MC_USER="craftbukkit" +MAIN_JAR="spigot.jar" +SESSION_NAME="spigot" -USER="$2" +# Specify system parameters for the minecraft server +MINHEAP="512M" +MAXHEAP="1024M" +THREADS="1" -if [ -z $2 ]; then - USER="craftbukkit" +# Check for sudo rigths +if [ $(sudo whoami) != "root" ]; then + echo "You must have sudo access in order to use this script." + exit 1 fi -save_stop() { - su -s /bin/bash -c "tmux send-keys 'save-off' C-m" ${USER} - su -s /bin/bash -c "tmux send-keys 'save-all' C-m" ${USER} +# Pipe any given argument to the minecraft server console +mc_command() { + sudo -u ${MC_USER} screen -S ${SESSION_NAME} -X stuff "`printf \"$*\r\"`" } -save_start() { - su -s /bin/bash -c "tmux send-keys 'save-on' C-m" ${USER} +# Start the server if it is not already running +server_start() { + sudo -u ${MC_USER} screen -S ${SESSION_NAME} -Q select . > /dev/null + if [ $? -eq 0 ]; then + echo "A screen ${SESSION_NAME} session is already running. Please close it first." + else + echo -en "Starting server... " + sudo -u ${MC_USER} screen -dmS ${SESSION_NAME} /bin/bash -c "cd ${SERVER_ROOT}; java -Xmx${MAXHEAP} -Xms${MINHEAP} -XX:ParallelGCThreads=${THREADS} -jar ${SERVER_ROOT}/${MAIN_JAR} nogui" + echo -e "\e[39;1m done\e[0m" + fi } -case "$1" in - start) - if [ -z "`pgrep -f -n 'spigot.jar'`" ]; then - sudo -u ${USER} tmux new-session -d -s spigot-console -d 'cd /srv/craftbukkit; java -Xmx1024M -Xms1024M -jar /srv/craftbukkit/spigot.jar nogui' - if [ $? -gt 0 ]; then +# Stop the server gracefully by saving everything prior and warning the users +server_stop() { + sudo -u ${MC_USER} screen -S ${SESSION_NAME} -Q select . > /dev/null + if [ $? -eq 0 ]; then + mc_command save-all + mc_command say "Server is going down in 10 seconds! HURRY UP WITH WATHEVER YOU ARE DOING!" # Warning the users + echo -en "Server is going down in... " + for i in $(seq 1 10); + do + mc_command say "down in... $(expr 10 - $i)" + echo -n " $(expr 10 - $i)" + sleep 1 + done + mc_command stop + echo -e "\e[39;1m done\e[0m" + else + echo "The corresponding screen session for ${SESSION_NAME} was already dead." + fi +} + +# Print whether the server is running and if so give some information about memory usage and threads +server_status() { + sudo -u ${MC_USER} screen -S ${SESSION_NAME} -Q select . > /dev/null + if [ $? -eq 0 ]; then + echo -e "Status:\e[39;1m running\e[0m" + + # Calculating memory usage + for p in $(sudo -u ${MC_USER} pgrep -f ${MAIN_JAR}); do + ps -p$p -O rss | tail -n1; + done | gawk '{ count ++; sum += $2 }; END {count --; print "Number of processes =", count, "(screen, bash,", count-2, "x java)"; print "Total memory usage =", sum/1024, "MB" ;};' + else + echo -e "Status:\e[39;1m stopped\e[0m" + fi +} + +# Restart the complete server by shutting it down and starting it again +server_restart() { + sudo -u ${MC_USER} screen -S ${SESSION_NAME} -Q select . > /dev/null + if [ $? -eq 0 ]; then + server_stop + sleep 0.1 + server_start + else + server_start + fi +} + +# Backup the directories specified in $WORLDPATHS +backup_files() { + which tar &> /dev/null + if [ $? -ne 0 ]; then + echo "The tar binaries are needed for a backup." + exit 2 + fi + + echo "Starting backup..." + FILE="`date +%Y%m%d%H%M%S`.tar.gz" + sudo -u ${MC_USER} mkdir -p ${BACKUPPATH} + sudo -u ${MC_USER} screen -S ${SESSION_NAME} -Q select . > /dev/null + if [ $? -eq 0 ]; then + mc_command save-off + mc_command save-all + sync && wait + sudo -u ${MC_USER} tar -czf ${BACKUPPATH}/${FILE} --totals ${WORLDPATHS} 2>&1 | grep -v "tar: Removing leading " + mc_command save-on + else + sudo -u ${MC_USER} tar -czf ${BACKUPPATH}/${FILE} --totals ${WORLDPATHS} 2>&1 | grep -v "tar: Removing leading " + fi + echo -e "\e[39;1mbackup completed\e[0m\n" + + echo -n "Only keeping the last ${KEEP_BACKUPS} backups and removing the other ones..." + BACKUP_COUNT=$(for f in ${BACKUPPATH}/[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]*; do echo $f; done | wc -l) + if [ $(expr ${BACKUP_COUNT} - ${KEEP_BACKUPS}) -gt 0 ]; then + sudo -u ${MC_USER} rm $(for f in ${BACKUPPATH}/[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]*; do echo $f; done | head -n$(expr ${BACKUP_COUNT} - ${KEEP_BACKUPS})) + echo -e "\e[39;1m done\e[0m ($(expr ${BACKUP_COUNT} - ${KEEP_BACKUPS}) backup(s) pruned)" + else + echo -e "\e[39;1m done\e[0m (no backups pruned)" + fi +} + +# Run the given comman at the minecraft server console +server_command() { + if [ $# -lt 1 ]; then + echo "No server command specified. Try 'help' for a list of commands." exit 1 - fi - else - echo "Spigot already started" - exit 1 - fi - ;; - - stop) - sudo -u ${USER} tmux send-keys -t spigot-console 'broadcast NOTICE: Server shutting down in 5 seconds!' C-m - sleep 5 - sudo -u ${USER} tmux send-keys -t spigot-console 'stop' C-m - sleep 10 - ;; - - console) - sudo -u ${USER} tmux attach -t spigot-console - ;; - - backup) - stat_busy "Starting backup" - FILE="`date +%Y%m%d%H%M`.tar.gz" - path="$BACKUPPATH/$FILE" - su -s /bin/bash -c "mkdir -p $BACKUPPATH" ${USER} - save_stop - su -s /bin/bash -c "tar -czf $path $WORLDPATH" ${USER} - save_start - stat_done "Backup finished" - ;; - - *) - echo "usage: $0 {start|backup|console} user" + fi + + sudo -u ${MC_USER} screen -S ${SESSION_NAME} -Q select . > /dev/null + if [ $? -eq 0 ]; then + mc_command "$@" + tailf -n 0 ${LOGPATH}/latest.log & + TAILFPID=$! # Process id of tailf command + sleep 0.1 + kill ${TAILFPID} + else + echo "There is no ${SESSION_NAME} session to connect to." + fi +} + +# Enter the screen minecraft session +server_console() { + sudo -u ${MC_USER} screen -S ${SESSION_NAME} -Q select . > /dev/null + if [ $? -eq 0 ]; then + sudo -u ${MC_USER} screen -S ${SESSION_NAME} -rx + else + echo "There is no ${SESSION_NAME} session to connect to." + fi +} + +# Help function, no arguments required +help() { + cat << 'EOF' +This script was design to easily control any minecraft server. Quite every parameter for a given +minecraft server derivative can be altered by editing the variables at the top of this bash script. + +Usage: spigot {start|stop|status|backup|command <command>|console} + start Start the minecraft server + stop Stop the minecraft server + restart Restart the minecraft server + status Print some status information + backup Backup the world data + command <command> Run the given comman at the minecraft server console + console Enter the server console through a screen session + +Copyright (c) Gordian Edenhofer <gordian.edenhofer@gmail.com> +EOF +} + +case "$1" in + start) + server_start + ;; + + stop) + server_stop + ;; + + status) + server_status + ;; + + restart) + server_restart + ;; + + console) + server_console + ;; + + command) + server_command "${@:2}" + ;; + + backup) + backup_files + ;; + + *|-h|--help) + help esac exit 0 - |