Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/bin/bash
- # version x.x.x 2013-07-11 (YYYY-MM-DD)
- # Settings
- WORLDNAME='jomb'
- MCPATH="/path/to/minecraft/servers/${WORLDNAME}"
- BACKUP_PATH="/path/to/minecraft/backups/${WORLDNAME}"
- EVENT_LOG_FILE="/path/to/minecraft/event_logs/${WORLDNAME}_events.log"
- BACKUP_LOG_FILE="/path/to/minecraft/event_logs/${WORLDNAME}_backups.log"
- SCREEN_SESSION="mc_${WORLDNAME}"
- BACKUP_PREFIX="${WORLDNAME}" # file name prefix (<prefix>_YYYY-mm-dd_HH.MM.SS.tar.gz)
- BACKUP_SERVICE='false' # backup the server file (jar)?
- BACKUP_USING_TAR='false'
- BACKUP_USING_GIT='true'
- SERVICE="minecraft_server_${WORLDNAME}.jar" # This is the server JAR file, inside the server instance directory
- SERVICE_UPDATE="minecraft_server_${WORLDNAME}.jar.update"
- OPTIONS='nogui'
- USERNAME='masa'
- INVOCATION="java -server -Xms256M -Xmx1024M -XX:+UseConcMarkSweepGC -jar $SERVICE $OPTIONS"
- ME=`whoami`
- as_user() {
- if [ $ME == $USERNAME ] ; then
- bash -c "$1"
- else
- su - $USERNAME -c "$1"
- fi
- }
- mc_start() {
- L_TIMESTAMP=`date "+%Y-%m-%d %H:%M:%S"`
- L_PREFIX="[${L_TIMESTAMP}]"
- if pgrep -u $USERNAME -f $SERVICE > /dev/null
- then
- echo "${L_PREFIX} [WARNING] mc_start(): ${SERVICE} is already running" | tee -a ${EVENT_LOG_FILE}
- else
- echo "${L_PREFIX} [INFO] mc_start(): Starting ${SERVICE}..." | tee -a ${EVENT_LOG_FILE}
- as_user "cd $MCPATH && screen -dmS ${SCREEN_SESSION} ${INVOCATION}"
- sleep 1
- L_TIMESTAMP=`date "+%Y-%m-%d %H:%M:%S"`
- L_PREFIX="[${L_TIMESTAMP}]"
- if pgrep -u $USERNAME -f $SERVICE > /dev/null
- then
- echo "${L_PREFIX} [INFO] mc_start(): ${SERVICE} is now running" | tee -a ${EVENT_LOG_FILE}
- else
- echo "${L_PREFIX} [ERROR] mc_start(): Could not start ${SERVICE}" | tee -a ${EVENT_LOG_FILE}
- fi
- fi
- }
- mc_stop() {
- L_TIMESTAMP=`date "+%Y-%m-%d %H:%M:%S"`
- L_PREFIX="[${L_TIMESTAMP}]"
- if pgrep -u $USERNAME -f $SERVICE > /dev/null
- then
- echo "${L_PREFIX} [INFO] mc_stop(): Stopping ${SERVICE}" | tee -a ${EVENT_LOG_FILE}
- as_user "screen -p 0 -S $SCREEN_SESSION -X eval 'stuff \"say §dSERVER SHUTTING DOWN IN 5 SECONDS. Saving the map...\"\015'"
- as_user "screen -p 0 -S $SCREEN_SESSION -X eval 'stuff \"save-all\"\015'"
- sleep 5
- as_user "screen -p 0 -S $SCREEN_SESSION -X eval 'stuff \"stop\"\015'"
- sleep 3
- else
- echo "${L_PREFIX} [INFO] mc_stop(): ${SERVICE} was not running" | tee -a ${EVENT_LOG_FILE}
- fi
- L_TIMESTAMP=`date "+%Y-%m-%d %H:%M:%S"`
- L_PREFIX="[${L_TIMESTAMP}]"
- if pgrep -u $USERNAME -f $SERVICE > /dev/null
- then
- echo "${L_PREFIX} [ERROR] mc_stop(): ${SERVICE} could not be stopped" | tee -a ${EVENT_LOG_FILE}
- else
- echo "${L_PREFIX} [INFO] mc_stop(): ${SERVICE} has been stopped" | tee -a ${EVENT_LOG_FILE}
- fi
- }
- mc_saveoff() {
- L_TIMESTAMP=`date "+%Y-%m-%d %H:%M:%S"`
- L_PREFIX="[${L_TIMESTAMP}]"
- if pgrep -u $USERNAME -f $SERVICE > /dev/null
- then
- # echo "${L_PREFIX} [INFO] mc_saveoff(): ${SERVICE} is running, suspending saves" | tee -a ${EVENT_LOG_FILE}
- as_user "screen -p 0 -S $SCREEN_SESSION -X eval 'stuff \"say §dServer going readonly...\"\015'"
- as_user "screen -p 0 -S $SCREEN_SESSION -X eval 'stuff \"save-off\"\015'"
- # else
- # echo "${L_PREFIX} [INFO] mc_saveoff(): ${SERVICE} is not running, not suspending saves" | tee -a ${EVENT_LOG_FILE}
- fi
- }
- mc_saveon() {
- L_TIMESTAMP=`date "+%Y-%m-%d %H:%M:%S"`
- L_PREFIX="[${L_TIMESTAMP}]"
- if pgrep -u $USERNAME -f $SERVICE > /dev/null
- then
- # echo "${L_PREFIX} [INFO] mc_saveon(): ${SERVICE} is running, re-enabling saves" | tee -a ${EVENT_LOG_FILE}
- as_user "screen -p 0 -S $SCREEN_SESSION -X eval 'stuff \"say §dServer going read-write...\"\015'"
- as_user "screen -p 0 -S $SCREEN_SESSION -X eval 'stuff \"save-on\"\015'"
- # else
- # echo "${L_PREFIX} [INFO] mc_saveon(): ${SERVICE} is not running, not re-enabling saves" | tee -a ${EVENT_LOG_FILE}
- fi
- }
- mc_saveall() {
- L_TIMESTAMP=`date "+%Y-%m-%d %H:%M:%S"`
- L_PREFIX="[${L_TIMESTAMP}]"
- if pgrep -u $USERNAME -f $SERVICE > /dev/null
- then
- # echo "${L_PREFIX} [INFO] mc_saveall(): Saving the world '${WORLDNAME}'" | tee -a ${EVENT_LOG_FILE}
- as_user "screen -p 0 -S $SCREEN_SESSION -X eval 'stuff \"say §dSaving the map...\"\015'"
- as_user "screen -p 0 -S $SCREEN_SESSION -X eval 'stuff \"save-all\"\015'"
- sync
- sleep 5
- fi
- }
- mc_backup_saveoff() {
- L_TIMESTAMP=`date "+%Y-%m-%d %H:%M:%S"`
- L_PREFIX="[${L_TIMESTAMP}]"
- if pgrep -u $USERNAME -f $SERVICE > /dev/null
- then
- echo "${L_PREFIX} [INFO] mc_backup_saveoff(): ${SERVICE} is running, suspending saves" | tee -a ${EVENT_LOG_FILE}
- as_user "screen -p 0 -S $SCREEN_SESSION -X eval 'stuff \"say §dServer going readonly...\"\015'"
- as_user "screen -p 0 -S $SCREEN_SESSION -X eval 'stuff \"say §dSERVER BACKUP STARTING. Server going readonly...\"\015'"
- as_user "screen -p 0 -S $SCREEN_SESSION -X eval 'stuff \"save-off\"\015'"
- else
- echo "${L_PREFIX} [INFO] mc_backup_saveoff(): ${SERVICE} is not running, not suspending saves" | tee -a ${EVENT_LOG_FILE}
- fi
- }
- mc_backup_saveon() {
- L_TIMESTAMP=`date "+%Y-%m-%d %H:%M:%S"`
- L_PREFIX="[${L_TIMESTAMP}]"
- if pgrep -u $USERNAME -f $SERVICE > /dev/null
- then
- echo "${L_PREFIX} [INFO] mc_backup_saveon(): ${SERVICE} is running, re-enabling saves" | tee -a ${EVENT_LOG_FILE}
- as_user "screen -p 0 -S $SCREEN_SESSION -X eval 'stuff \"say §dSERVER BACKUP ENDED. Server going read-write...\"\015'"
- as_user "screen -p 0 -S $SCREEN_SESSION -X eval 'stuff \"save-on\"\015'"
- else
- echo "${L_PREFIX} [INFO] mc_backup_saveon(): ${SERVICE} is not running, not re-enabling saves" | tee -a ${EVENT_LOG_FILE}
- fi
- }
- mc_backup() {
- TIMESTAMP_TAR=`date '+%Y-%m-%d_%H.%M.%S'`
- TIMESTAMP_GIT=`date '+%Y-%m-%d %H:%M'`
- if [ "$BACKUP_USING_TAR" = "true" ]
- then
- L_TIMESTAMP=`date "+%Y-%m-%d %H:%M:%S"`
- L_PREFIX="[${L_TIMESTAMP}]"
- echo "${L_PREFIX} [INFO] mc_backup(): Backing up minecraft world '${WORLDNAME}' using tar" | tee -a ${EVENT_LOG_FILE} > /dev/null
- echo "${L_PREFIX} [INFO] mc_backup(): Starting a backup of '${WORLDNAME}' using tar" | tee -a ${BACKUP_LOG_FILE} > /dev/null
- as_user "cd `dirname $MCPATH` && tar --exclude '.git' -czpf ${BACKUP_PATH}/${BACKUP_PREFIX}_${TIMESTAMP_TAR}.tar.gz `basename $MCPATH` | tee -a ${BACKUP_LOG_FILE} > /dev/null 2>&1"
- fi
- if [ "$BACKUP_USING_GIT" = "true" ]
- then
- L_TIMESTAMP=`date "+%Y-%m-%d %H:%M:%S"`
- L_PREFIX="[${L_TIMESTAMP}]"
- echo "${L_PREFIX} [INFO] mc_backup(): Backing up minecraft world '${WORLDNAME}' using git" | tee -a ${EVENT_LOG_FILE} > /dev/null
- echo "${L_PREFIX} [INFO] mc_backup(): Starting a backup of '${WORLDNAME}' using git" | tee -a ${BACKUP_LOG_FILE} > /dev/null
- as_user "cd $MCPATH && git add -A . | tee -a ${BACKUP_LOG_FILE} && git commit -m \"${TIMESTAMP_GIT}\" | tee -a ${BACKUP_LOG_FILE}"
- fi
- if [ "$BACKUP_SERVICE" = "true" ]
- then
- L_TIMESTAMP=`date "+%Y-%m-%d %H:%M:%S"`
- L_PREFIX="[${L_TIMESTAMP}]"
- echo "${L_PREFIX} [INFO] mc_backup(): Backing up ${SERVICE}" | tee -a ${EVENT_LOG_FILE} > /dev/null
- as_user "cd $MCPATH && cp -pn $SERVICE $BACKUP_PATH/${BACKUP_PREFIX}_${TIMESTAMP_TAR}.jar > /dev/null 2>&1"
- fi
- L_TIMESTAMP=`date "+%Y-%m-%d %H:%M:%S"`
- L_PREFIX="[${L_TIMESTAMP}]"
- echo "${L_PREFIX} [INFO] mc_backup(): Backup of '${WORLDNAME}' complete" | tee -a ${EVENT_LOG_FILE} > /dev/null
- echo "${L_PREFIX} [INFO] mc_backup(): Backup of '${WORLDNAME}' complete" | tee -a ${BACKUP_LOG_FILE} > /dev/null
- }
- mc_update() {
- L_TIMESTAMP=`date "+%Y-%m-%d %H:%M:%S"`
- L_PREFIX="[${L_TIMESTAMP}]"
- if pgrep -u $USERNAME -f $SERVICE > /dev/null
- then
- echo "${L_PREFIX} [WARNING] mc_update(): ${SERVICE} is running, will not start update" | tee -a ${EVENT_LOG_FILE}
- else
- MC_SERVER_URL=http://www.minecraft.net/download/minecraft_server.jar?v=`date | sed "s/[^a-zA-Z0-9]/_/g"`
- as_user "cd $MCPATH && wget -q -O $MCPATH/${SERVICE_UPDATE} $MC_SERVER_URL"
- L_TIMESTAMP=`date "+%Y-%m-%d %H:%M:%S"`
- L_PREFIX="[${L_TIMESTAMP}]"
- if [ -f $MCPATH/${SERVICE_UPDATE} ]
- then
- if `diff $MCPATH/$SERVICE $MCPATH/${SERVICE_UPDATE} >/dev/null`
- then
- echo "${L_PREFIX} [INFO] mc_update(): You are already running the latest version of $SERVICE" | tee -a ${EVENT_LOG_FILE}
- as_user "rm $MCPATH/${SERVICE_UPDATE}"
- else
- as_user "mv $MCPATH/${SERVICE_UPDATE} $MCPATH/$SERVICE"
- echo "${L_PREFIX} [INFO] mc_update(): Minecraft server successfully updated" | tee -a ${EVENT_LOG_FILE}
- fi
- else
- echo "${L_PREFIX} [ERROR] mc_update(): Minecraft server update could not be downloaded" | tee -a ${EVENT_LOG_FILE}
- fi
- fi
- }
- mc_command() {
- L_TIMESTAMP=`date "+%Y-%m-%d %H:%M:%S"`
- L_PREFIX="[${L_TIMESTAMP}]"
- if [ "$1" ]
- then
- command="$1";
- if pgrep -u $USERNAME -f $SERVICE > /dev/null
- then
- echo "${L_PREFIX} [INFO] mc_command(): ${SERVICE} is running, executing command '$command'" | tee -a ${EVENT_LOG_FILE} > /dev/null
- as_user "screen -p 0 -S $SCREEN_SESSION -X eval 'stuff \"$command\"\015'"
- fi
- else
- echo "${L_PREFIX} [ERROR] mc_command(): You must specify a server command" | tee -a ${EVENT_LOG_FILE} > /dev/null
- fi
- }
- # Process the commands
- case "$1" in
- start)
- mc_start
- ;;
- stop)
- mc_stop
- ;;
- restart)
- as_user "screen -p 0 -S $SCREEN_SESSION -X eval 'stuff \"say §dSERVER RESTARTING...\"\015'"
- mc_stop
- mc_start
- ;;
- update)
- mc_stop
- mc_backup
- mc_update
- ;;
- backup)
- mc_backup_saveoff
- mc_saveall
- mc_backup
- mc_backup_saveon
- ;;
- saveoff)
- mc_saveoff
- ;;
- saveon)
- mc_saveon
- ;;
- saveall)
- mc_saveall
- ;;
- status)
- L_TIMESTAMP=`date "+%Y-%m-%d %H:%M:%S"`
- L_PREFIX="[${L_TIMESTAMP}]"
- if pgrep -u $USERNAME -f $SERVICE > /dev/null
- then
- echo "${L_PREFIX} [INFO] ${SERVICE} is running"
- else
- echo "${L_PREFIX} [INFO] ${SERVICE} is not running"
- fi
- ;;
- command)
- mc_command "$2"
- ;;
- *)
- echo "Usage: /etc/init.d/minecraft {start|stop|restart|update|backup|saveoff|saveon|status|command \"server command\"}"
- exit 1
- ;;
- esac
- exit 0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement