Advertisement
masa-

Minecraft server script

Jul 11th, 2013
197
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 9.88 KB | None | 0 0
  1. #!/bin/bash
  2. # version x.x.x 2013-07-11 (YYYY-MM-DD)
  3.  
  4. # Settings
  5. WORLDNAME='jomb'
  6. MCPATH="/path/to/minecraft/servers/${WORLDNAME}"
  7. BACKUP_PATH="/path/to/minecraft/backups/${WORLDNAME}"
  8. EVENT_LOG_FILE="/path/to/minecraft/event_logs/${WORLDNAME}_events.log"
  9. BACKUP_LOG_FILE="/path/to/minecraft/event_logs/${WORLDNAME}_backups.log"
  10. SCREEN_SESSION="mc_${WORLDNAME}"
  11. BACKUP_PREFIX="${WORLDNAME}"        # file name prefix (<prefix>_YYYY-mm-dd_HH.MM.SS.tar.gz)
  12. BACKUP_SERVICE='false'          # backup the server file (jar)?
  13. BACKUP_USING_TAR='false'
  14. BACKUP_USING_GIT='true'
  15. SERVICE="minecraft_server_${WORLDNAME}.jar" # This is the server JAR file, inside the server instance directory
  16. SERVICE_UPDATE="minecraft_server_${WORLDNAME}.jar.update"
  17. OPTIONS='nogui'
  18. USERNAME='masa'
  19. INVOCATION="java -server -Xms256M -Xmx1024M -XX:+UseConcMarkSweepGC -jar $SERVICE $OPTIONS"
  20.  
  21. ME=`whoami`
  22. as_user() {
  23.     if [ $ME == $USERNAME ] ; then
  24.         bash -c "$1"
  25.     else
  26.         su - $USERNAME -c "$1"
  27.     fi
  28. }
  29.  
  30. mc_start() {
  31.     L_TIMESTAMP=`date "+%Y-%m-%d %H:%M:%S"`
  32.     L_PREFIX="[${L_TIMESTAMP}]"
  33.  
  34.     if  pgrep -u $USERNAME -f $SERVICE > /dev/null
  35.     then
  36.         echo "${L_PREFIX} [WARNING] mc_start(): ${SERVICE} is already running" | tee -a ${EVENT_LOG_FILE}
  37.     else
  38.         echo "${L_PREFIX} [INFO] mc_start(): Starting ${SERVICE}..." | tee -a ${EVENT_LOG_FILE}
  39.  
  40.         as_user "cd $MCPATH && screen -dmS ${SCREEN_SESSION} ${INVOCATION}"
  41.         sleep 1
  42.  
  43.         L_TIMESTAMP=`date "+%Y-%m-%d %H:%M:%S"`
  44.         L_PREFIX="[${L_TIMESTAMP}]"
  45.  
  46.         if pgrep -u $USERNAME -f $SERVICE > /dev/null
  47.         then
  48.             echo "${L_PREFIX} [INFO] mc_start(): ${SERVICE} is now running" | tee -a ${EVENT_LOG_FILE}
  49.         else
  50.             echo "${L_PREFIX} [ERROR] mc_start(): Could not start ${SERVICE}" | tee -a ${EVENT_LOG_FILE}
  51.         fi
  52.     fi
  53. }
  54.  
  55. mc_stop() {
  56.     L_TIMESTAMP=`date "+%Y-%m-%d %H:%M:%S"`
  57.     L_PREFIX="[${L_TIMESTAMP}]"
  58.  
  59.     if pgrep -u $USERNAME -f $SERVICE > /dev/null
  60.     then
  61.         echo "${L_PREFIX} [INFO] mc_stop(): Stopping ${SERVICE}" | tee -a ${EVENT_LOG_FILE}
  62.         as_user "screen -p 0 -S $SCREEN_SESSION -X eval 'stuff \"say §dSERVER SHUTTING DOWN IN 5 SECONDS. Saving the map...\"\015'"
  63.         as_user "screen -p 0 -S $SCREEN_SESSION -X eval 'stuff \"save-all\"\015'"
  64.         sleep 5
  65.         as_user "screen -p 0 -S $SCREEN_SESSION -X eval 'stuff \"stop\"\015'"
  66.         sleep 3
  67.     else
  68.         echo "${L_PREFIX} [INFO] mc_stop(): ${SERVICE} was not running" | tee -a ${EVENT_LOG_FILE}
  69.     fi
  70.  
  71.     L_TIMESTAMP=`date "+%Y-%m-%d %H:%M:%S"`
  72.     L_PREFIX="[${L_TIMESTAMP}]"
  73.  
  74.     if pgrep -u $USERNAME -f $SERVICE > /dev/null
  75.     then
  76.         echo "${L_PREFIX} [ERROR] mc_stop(): ${SERVICE} could not be stopped" | tee -a ${EVENT_LOG_FILE}
  77.     else
  78.         echo "${L_PREFIX} [INFO] mc_stop(): ${SERVICE} has been stopped" | tee -a ${EVENT_LOG_FILE}
  79.     fi
  80. }
  81.  
  82. mc_saveoff() {
  83.     L_TIMESTAMP=`date "+%Y-%m-%d %H:%M:%S"`
  84.     L_PREFIX="[${L_TIMESTAMP}]"
  85.  
  86.     if pgrep -u $USERNAME -f $SERVICE > /dev/null
  87.     then
  88. #       echo "${L_PREFIX} [INFO] mc_saveoff(): ${SERVICE} is running, suspending saves" | tee -a ${EVENT_LOG_FILE}
  89.         as_user "screen -p 0 -S $SCREEN_SESSION -X eval 'stuff \"say §dServer going readonly...\"\015'"
  90.         as_user "screen -p 0 -S $SCREEN_SESSION -X eval 'stuff \"save-off\"\015'"
  91. #   else
  92. #       echo "${L_PREFIX} [INFO] mc_saveoff(): ${SERVICE} is not running, not suspending saves" | tee -a ${EVENT_LOG_FILE}
  93.     fi
  94. }
  95.  
  96. mc_saveon() {
  97.     L_TIMESTAMP=`date "+%Y-%m-%d %H:%M:%S"`
  98.     L_PREFIX="[${L_TIMESTAMP}]"
  99.  
  100.     if pgrep -u $USERNAME -f $SERVICE > /dev/null
  101.     then
  102. #       echo "${L_PREFIX} [INFO] mc_saveon(): ${SERVICE} is running, re-enabling saves" | tee -a ${EVENT_LOG_FILE}
  103.         as_user "screen -p 0 -S $SCREEN_SESSION -X eval 'stuff \"say §dServer going read-write...\"\015'"
  104.         as_user "screen -p 0 -S $SCREEN_SESSION -X eval 'stuff \"save-on\"\015'"
  105. #   else
  106. #       echo "${L_PREFIX} [INFO] mc_saveon(): ${SERVICE} is not running, not re-enabling saves" | tee -a ${EVENT_LOG_FILE}
  107.     fi
  108. }
  109.  
  110. mc_saveall() {
  111.     L_TIMESTAMP=`date "+%Y-%m-%d %H:%M:%S"`
  112.     L_PREFIX="[${L_TIMESTAMP}]"
  113.  
  114.     if pgrep -u $USERNAME -f $SERVICE > /dev/null
  115.     then
  116. #       echo "${L_PREFIX} [INFO] mc_saveall(): Saving the world '${WORLDNAME}'" | tee -a ${EVENT_LOG_FILE}
  117.         as_user "screen -p 0 -S $SCREEN_SESSION -X eval 'stuff \"say §dSaving the map...\"\015'"
  118.         as_user "screen -p 0 -S $SCREEN_SESSION -X eval 'stuff \"save-all\"\015'"
  119.         sync
  120.         sleep 5
  121.     fi
  122. }
  123.  
  124. mc_backup_saveoff() {
  125.     L_TIMESTAMP=`date "+%Y-%m-%d %H:%M:%S"`
  126.     L_PREFIX="[${L_TIMESTAMP}]"
  127.  
  128.     if pgrep -u $USERNAME -f $SERVICE > /dev/null
  129.     then
  130.         echo "${L_PREFIX} [INFO] mc_backup_saveoff(): ${SERVICE} is running, suspending saves" | tee -a ${EVENT_LOG_FILE}
  131.         as_user "screen -p 0 -S $SCREEN_SESSION -X eval 'stuff \"say §dServer going readonly...\"\015'"
  132.         as_user "screen -p 0 -S $SCREEN_SESSION -X eval 'stuff \"say §dSERVER BACKUP STARTING. Server going readonly...\"\015'"
  133.         as_user "screen -p 0 -S $SCREEN_SESSION -X eval 'stuff \"save-off\"\015'"
  134.     else
  135.         echo "${L_PREFIX} [INFO] mc_backup_saveoff(): ${SERVICE} is not running, not suspending saves" | tee -a ${EVENT_LOG_FILE}
  136.     fi
  137. }
  138.  
  139. mc_backup_saveon() {
  140.     L_TIMESTAMP=`date "+%Y-%m-%d %H:%M:%S"`
  141.     L_PREFIX="[${L_TIMESTAMP}]"
  142.  
  143.     if pgrep -u $USERNAME -f $SERVICE > /dev/null
  144.     then
  145.         echo "${L_PREFIX} [INFO] mc_backup_saveon(): ${SERVICE} is running, re-enabling saves" | tee -a ${EVENT_LOG_FILE}
  146.         as_user "screen -p 0 -S $SCREEN_SESSION -X eval 'stuff \"say §dSERVER BACKUP ENDED. Server going read-write...\"\015'"
  147.         as_user "screen -p 0 -S $SCREEN_SESSION -X eval 'stuff \"save-on\"\015'"
  148.     else
  149.         echo "${L_PREFIX} [INFO] mc_backup_saveon(): ${SERVICE} is not running, not re-enabling saves" | tee -a ${EVENT_LOG_FILE}
  150.     fi
  151. }
  152.  
  153. mc_backup() {
  154.     TIMESTAMP_TAR=`date '+%Y-%m-%d_%H.%M.%S'`
  155.     TIMESTAMP_GIT=`date '+%Y-%m-%d %H:%M'`
  156.  
  157.     if [ "$BACKUP_USING_TAR" = "true" ]
  158.     then
  159.         L_TIMESTAMP=`date "+%Y-%m-%d %H:%M:%S"`
  160.         L_PREFIX="[${L_TIMESTAMP}]"
  161.  
  162.         echo "${L_PREFIX} [INFO] mc_backup(): Backing up minecraft world '${WORLDNAME}' using tar" | tee -a ${EVENT_LOG_FILE} > /dev/null
  163.         echo "${L_PREFIX} [INFO] mc_backup(): Starting a backup of '${WORLDNAME}' using tar" | tee -a ${BACKUP_LOG_FILE} > /dev/null
  164.         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"
  165.     fi
  166.  
  167.     if [ "$BACKUP_USING_GIT" = "true" ]
  168.     then
  169.         L_TIMESTAMP=`date "+%Y-%m-%d %H:%M:%S"`
  170.         L_PREFIX="[${L_TIMESTAMP}]"
  171.  
  172.         echo "${L_PREFIX} [INFO] mc_backup(): Backing up minecraft world '${WORLDNAME}' using git" | tee -a ${EVENT_LOG_FILE} > /dev/null
  173.         echo "${L_PREFIX} [INFO] mc_backup(): Starting a backup of '${WORLDNAME}' using git" | tee -a ${BACKUP_LOG_FILE} > /dev/null
  174.         as_user "cd $MCPATH && git add -A . | tee -a ${BACKUP_LOG_FILE} && git commit -m \"${TIMESTAMP_GIT}\" | tee -a ${BACKUP_LOG_FILE}"
  175.     fi
  176.  
  177.     if [ "$BACKUP_SERVICE" = "true" ]
  178.     then
  179.         L_TIMESTAMP=`date "+%Y-%m-%d %H:%M:%S"`
  180.         L_PREFIX="[${L_TIMESTAMP}]"
  181.  
  182.         echo "${L_PREFIX} [INFO] mc_backup(): Backing up ${SERVICE}" | tee -a ${EVENT_LOG_FILE} > /dev/null
  183.         as_user "cd $MCPATH && cp -pn $SERVICE $BACKUP_PATH/${BACKUP_PREFIX}_${TIMESTAMP_TAR}.jar > /dev/null 2>&1"
  184.     fi
  185.  
  186.     L_TIMESTAMP=`date "+%Y-%m-%d %H:%M:%S"`
  187.     L_PREFIX="[${L_TIMESTAMP}]"
  188.     echo "${L_PREFIX} [INFO] mc_backup(): Backup of '${WORLDNAME}' complete" | tee -a ${EVENT_LOG_FILE} > /dev/null
  189.     echo "${L_PREFIX} [INFO] mc_backup(): Backup of '${WORLDNAME}' complete" | tee -a ${BACKUP_LOG_FILE} > /dev/null
  190. }
  191.  
  192. mc_update() {
  193.     L_TIMESTAMP=`date "+%Y-%m-%d %H:%M:%S"`
  194.     L_PREFIX="[${L_TIMESTAMP}]"
  195.  
  196.     if pgrep -u $USERNAME -f $SERVICE > /dev/null
  197.     then
  198.         echo "${L_PREFIX} [WARNING] mc_update(): ${SERVICE} is running, will not start update" | tee -a ${EVENT_LOG_FILE}
  199.     else
  200.         MC_SERVER_URL=http://www.minecraft.net/download/minecraft_server.jar?v=`date | sed "s/[^a-zA-Z0-9]/_/g"`
  201.         as_user "cd $MCPATH && wget -q -O $MCPATH/${SERVICE_UPDATE} $MC_SERVER_URL"
  202.  
  203.         L_TIMESTAMP=`date "+%Y-%m-%d %H:%M:%S"`
  204.         L_PREFIX="[${L_TIMESTAMP}]"
  205.  
  206.         if [ -f $MCPATH/${SERVICE_UPDATE} ]
  207.         then
  208.             if `diff $MCPATH/$SERVICE $MCPATH/${SERVICE_UPDATE} >/dev/null`
  209.             then
  210.                 echo "${L_PREFIX} [INFO] mc_update(): You are already running the latest version of $SERVICE" | tee -a ${EVENT_LOG_FILE}
  211.                 as_user "rm $MCPATH/${SERVICE_UPDATE}"
  212.             else
  213.                 as_user "mv $MCPATH/${SERVICE_UPDATE} $MCPATH/$SERVICE"
  214.                 echo "${L_PREFIX} [INFO] mc_update(): Minecraft server successfully updated" | tee -a ${EVENT_LOG_FILE}
  215.             fi
  216.         else
  217.             echo "${L_PREFIX} [ERROR] mc_update(): Minecraft server update could not be downloaded" | tee -a ${EVENT_LOG_FILE}
  218.         fi
  219.     fi
  220. }
  221.  
  222. mc_command() {
  223.     L_TIMESTAMP=`date "+%Y-%m-%d %H:%M:%S"`
  224.     L_PREFIX="[${L_TIMESTAMP}]"
  225.  
  226.     if [ "$1" ]
  227.     then
  228.         command="$1";
  229.  
  230.         if pgrep -u $USERNAME -f $SERVICE > /dev/null
  231.         then
  232.             echo "${L_PREFIX} [INFO] mc_command(): ${SERVICE} is running, executing command '$command'" | tee -a ${EVENT_LOG_FILE} > /dev/null
  233.             as_user "screen -p 0 -S $SCREEN_SESSION -X eval 'stuff \"$command\"\015'"
  234.         fi
  235.     else
  236.         echo "${L_PREFIX} [ERROR] mc_command(): You must specify a server command" | tee -a ${EVENT_LOG_FILE} > /dev/null
  237.     fi
  238. }
  239.  
  240. # Process the commands
  241. case "$1" in
  242.     start)
  243.         mc_start
  244.         ;;
  245.     stop)
  246.         mc_stop
  247.         ;;
  248.     restart)
  249.         as_user "screen -p 0 -S $SCREEN_SESSION -X eval 'stuff \"say §dSERVER RESTARTING...\"\015'"
  250.         mc_stop
  251.         mc_start
  252.         ;;
  253.     update)
  254.         mc_stop
  255.         mc_backup
  256.         mc_update
  257.         ;;
  258.     backup)
  259.         mc_backup_saveoff
  260.         mc_saveall
  261.         mc_backup
  262.         mc_backup_saveon
  263.         ;;
  264.     saveoff)
  265.         mc_saveoff
  266.         ;;
  267.     saveon)
  268.         mc_saveon
  269.         ;;
  270.     saveall)
  271.         mc_saveall
  272.         ;;
  273.     status)
  274.         L_TIMESTAMP=`date "+%Y-%m-%d %H:%M:%S"`
  275.         L_PREFIX="[${L_TIMESTAMP}]"
  276.  
  277.         if pgrep -u $USERNAME -f $SERVICE > /dev/null
  278.         then
  279.             echo "${L_PREFIX} [INFO] ${SERVICE} is running"
  280.         else
  281.             echo "${L_PREFIX} [INFO] ${SERVICE} is not running"
  282.         fi
  283.         ;;
  284.     command)
  285.         mc_command "$2"
  286.         ;;
  287.  
  288.     *)
  289.         echo "Usage: /etc/init.d/minecraft {start|stop|restart|update|backup|saveoff|saveon|status|command \"server command\"}"
  290.         exit 1
  291.         ;;
  292. esac
  293.  
  294. exit 0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement