Advertisement
Guest User

Untitled

a guest
Sep 17th, 2011
268
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 12.33 KB | None | 0 0
  1. #!/bin/bash
  2. # /etc/init.d/minecraft
  3.  
  4. ### BEGIN INIT INFO
  5. # Provides:   minecraft
  6. # Required-Start: $local_fs $remote_fs
  7. # Required-Stop:  $local_fs $remote_fs
  8. # Should-Start:   $network
  9. # Should-Stop:    $network
  10. # Default-Start:  2 3 4 5
  11. # Default-Stop:   0 1 6
  12. # Short-Description:    Minecraft server
  13. # Description:    Init script for minecraft/bukkit server wrapped by Remote Toolkit, with rolling logs and use of ramdisk for less lag.
  14. ### END INIT INFO
  15.  
  16. # Created by Ahtenus
  17.  
  18. # Based on http://www.minecraftwiki.net/wiki/Server_startup_script
  19. # Support for multiworld by Benni-chan
  20. # Modified by drdanick for Remote Toolkit support
  21.  
  22.  
  23. #############################
  24. ######### SETTINGS ##########
  25. #############################
  26. # Remote Toolkit username
  27. RTKUSER="USER"
  28.  
  29. # Remote Toolkit password
  30. RTKPASS="PASS"
  31.  
  32. # Name of Remote Toolkit jar
  33. SERVICE="Minecraft_RKit.jar"
  34. # Name to use for the screen instance
  35. SCREEN="minecraft"
  36. # User that should run the server
  37. USERNAME="v"
  38. # Path to minecraft directory
  39. MCPATH="/home/${USERNAME}/minecraft"
  40. # Number of CPUs/cores to use
  41. CPU_COUNT=2
  42. # Initial memory usage - DO NOT MODIFY THIS, SET SERVER MEMORY ALLOCATIONS IN WRAPPER.PROPERTIES
  43. INITMEM="30M"
  44. # Maximum amount of memory to use - DO NOT MODIFY THIS, SET SERVER MEMORY ALLOCATIONS IN WRAPPER.PROPERTIES
  45. MAXMEM="30M"
  46.  
  47. INVOCATION="java -Xmx$MAXMEM -Xms$INITMEM -jar $SERVICE $RTKUSER:$RTKPASS"
  48.  
  49. # Where the world backups should go
  50. BACKUPPATH="/home/${USERNAME}/minebak"
  51. # Where the logs are copied with log-roll
  52. LOGPATH="${MCPATH}/logs"
  53. # Where the whole minecraft directory is copied when whole-backup is executed
  54. WHOLEBACKUP="/home/${USERNAME}/serverbak"
  55. # Where the worlds are located on the disk. Can not be the same as MCPATH.
  56. WORLDSTORAGE="${MCPATH}/worldstorage"
  57. # Path to the the mounted ramdisk default in Ubuntu: /dev/shm
  58. RAMDISK="/dev/shm"
  59. # use tar or zip files for world backup
  60. BACKUPFORMAT="tar"
  61.  
  62. ME=`whoami`
  63. as_user() {
  64.     if [ $ME == $USERNAME ] ; then
  65.         bash -c "$1"
  66.     else
  67.         su - $USERNAME -c "$1"
  68.     fi
  69. }
  70. datepath() {
  71.     # datepath path filending-to-check returned-filending
  72.     if [ -e $1`date +%F`$2 ]
  73.     then
  74.         echo $1`date +%FT%T`$3
  75.     else
  76.         echo $1`date +%F`$3
  77.     fi
  78. }
  79. mc_start() {
  80.     if ps ax | grep -v grep | grep -v -i SCREEN | grep $SERVICE > /dev/null
  81.     then
  82.         echo "Tried to start but $SERVICE was already running!"
  83.     else
  84.         echo "$SERVICE was not running... starting."
  85.         cd $MCPATH
  86.         as_user "cd $MCPATH && screen -dmS $SCREEN $INVOCATION"
  87.         sleep 7
  88.         if ps ax | grep -v grep | grep -v -i SCREEN | grep $SERVICE > /dev/null
  89.         then
  90.             echo "$SERVICE is now running."
  91.         else
  92.             echo "Could not start $SERVICE."
  93.         fi
  94.     fi
  95. }
  96.  
  97. mc_saveoff() {
  98.     if ps ax | grep -v grep | grep -v -i SCREEN | grep $SERVICE > /dev/null
  99.     then
  100.         echo "$SERVICE is running... suspending saves"
  101.         as_user "screen -p 0 -S $SCREEN -X eval 'stuff \"save-off\"\015'"
  102.         as_user "screen -p 0 -S $SCREEN -X eval 'stuff \"save-all\"\015'"
  103.         sync
  104.         sleep 10
  105.     else
  106.         echo "$SERVICE was not running. Not suspending saves."
  107.     fi
  108. }
  109.  
  110. mc_saveon() {
  111.     if ps ax | grep -v grep | grep -v -i SCREEN | grep $SERVICE > /dev/null
  112.     then
  113.         echo "$SERVICE is running... re-enabling saves"
  114.         as_user "screen -p 0 -S $SCREEN -X eval 'stuff \"save-on\"\015'"
  115.     else
  116.         echo "$SERVICE was not running. Not resuming saves."
  117.     fi
  118. }
  119.  
  120. mc_stop() {
  121.     if ps ax | grep -v grep | grep -v -i SCREEN | grep $SERVICE > /dev/null
  122.     then
  123.         echo "$SERVICE is running... stopping."
  124.         as_user "screen -p 0 -S $SCREEN -X eval 'stuff \"save-all\"\015'"
  125.         sleep 10
  126.         as_user "screen -p 0 -S $SCREEN -X eval 'stuff \".stopwrapper\"\015'"
  127.         sleep 7
  128.     else
  129.         echo "$SERVICE was not running."
  130.     fi
  131.     if ps ax | grep -v grep | grep -v -i SCREEN | grep $SERVICE > /dev/null
  132.     then
  133.         echo "$SERVICE could not be shut down... still running."
  134.     else
  135.         echo "$SERVICE is shut down."
  136.     fi
  137. }
  138. mc_hold() {
  139.     if ps ax | grep -v grep | grep -v -i SCREEN | grep $SERVICE > /dev/null
  140.     then
  141.         echo "Holding the server..."
  142.         as_user "screen -p 0 -S $SCREEN -X eval 'stuff \"save-all\"\015'"
  143.         sleep 10
  144.         as_user "screen -p 0 -S $SCREEN -X eval 'stuff \".hold\"\015'"
  145.         sleep 7
  146.     else
  147.         echo "$SERVICE was not running."
  148.     fi
  149. }
  150. mc_unhold() {
  151.     if ps ax | grep -v grep | grep -v -i SCREEN | grep $SERVICE > /dev/null
  152.     then
  153.         echo "Unholding the server..."
  154.         as_user "screen -p 0 -S $SCREEN -X eval 'stuff \".unhold\"\015'"
  155.         sleep 7
  156.     else
  157.         echo "$SERVICE was not running."
  158.     fi
  159. }
  160. log_roll() {
  161.     as_user "mkdir -p $LOGPATH"
  162.     path=`datepath $LOGPATH/server_ .log.gz .log`
  163.     as_user "mv $MCPATH/server.log $path && gzip $path"
  164. }
  165. get_worlds() {
  166.     a=1
  167.     for NAME in $(ls $WORLDSTORAGE)
  168.     do
  169.         if [ -d $WORLDSTORAGE/$NAME ]
  170.         then
  171.             WORLDNAME[$a]=$NAME
  172.             if [ -e $WORLDSTORAGE/$NAME/ramdisk ]
  173.             then
  174.                 WORLDRAM[$a]=true
  175.             else
  176.                 WORLDRAM[$a]=false
  177.             fi
  178.             a=$a+1
  179.         fi
  180.     done
  181. }
  182. mc_whole_backup() {
  183.     as_user "mkdir -p $WHOLEBACKUP"
  184.     path=`datepath $WHOLEBACKUP/mine_`
  185.     as_user "cp -rP $MCPATH $path"
  186. }
  187. mc_world_backup() {
  188.     get_worlds
  189.     for INDEX in ${!WORLDNAME[@]}
  190.     do
  191.         echo "Backing up minecraft ${WORLDNAME[$INDEX]}"
  192.         as_user "mkdir -p $BACKUPPATH"
  193.        
  194.         case "$BACKUPFORMAT" in
  195.             tar)
  196.                 path=`datepath $BACKUPPATH/${WORLDNAME[$INDEX]}_ .tar.bz2 .tar.bz2`
  197.                 as_user "tar -hcjf $path $MCPATH/${WORLDNAME[$INDEX]}"
  198.                 ;;
  199.             zip)
  200.                 path=`datepath $BACKUPPATH/${WORLDNAME[$INDEX]}_ .zip .zip`
  201.                 as_user "zip -rq $path $MCPATH/${WORLDNAME[$INDEX]}"
  202.                 ;;
  203.             *)
  204.                 echo "$BACKUPFORMAT is no supported backup format"
  205.                 ;;
  206.         esac
  207.     done
  208. }
  209. check_links() {
  210.     get_worlds
  211.     for INDEX in ${!WORLDNAME[@]}
  212.     do
  213.         if [[ -L $MCPATH/${WORLDNAME[$INDEX]} || ! -a $MCPATH/${WORLDNAME[$INDEX]} ]]
  214.         then
  215.             link=`ls -l $MCPATH/${WORLDNAME[$INDEX]} | awk '{print $11}'`
  216.             if ${WORLDRAM[$INDEX]}
  217.             then
  218.                 if [ "$link" != "$RAMDISK/${WORLDNAME[$INDEX]}" ]
  219.                 then
  220.                     as_user "rm -f $MCPATH/${WORLDNAME[$INDEX]}"
  221.                     as_user "ln -s $RAMDISK/${WORLDNAME[$INDEX]} $MCPATH/${WORLDNAME[$INDEX]}"
  222.                     echo "created link for ${WORLDNAME[$INDEX]}"
  223.                 fi
  224.             else
  225.                 if [ "$link" != "${WORLDSTORAGE}/${WORLDNAME[$INDEX]}" ]
  226.                 then
  227.                     as_user "rm -f $MCPATH/${WORLDNAME[$INDEX]}"
  228.                     as_user "ln -s ${WORLDSTORAGE}/${WORLDNAME[$INDEX]} $MCPATH/${WORLDNAME[$INDEX]}"
  229.                     echo "created link for ${WORLDNAME[$INDEX]}"
  230.                 fi
  231.             fi
  232.         else
  233.             echo "could not process ${WORLDNAME[$INDEX]}. please move all worlds to ${WORLDSTORAGE}."
  234.             exit 1
  235.         fi
  236.     done
  237.     echo "links checked"
  238. }
  239. to_ram() {
  240.     get_worlds
  241.     for INDEX in ${!WORLDNAME[@]}
  242.     do
  243.         if ${WORLDRAM[$INDEX]}
  244.         then
  245.             if [ -L $MCPATH/${WORLDNAME[$INDEX]} ]
  246.             then
  247.                 as_user "rsync -rt --exclude 'ramdisk' ${WORLDSTORAGE}/${WORLDNAME[$INDEX]}/ $RAMDISK/${WORLDNAME[$INDEX]}"
  248.                 echo "${WORLDNAME[$INDEX]} copied to ram"
  249.             fi
  250.         fi
  251.     done
  252. }
  253. to_disk() {
  254.     get_worlds
  255.     for INDEX in ${!WORLDNAME[@]}
  256.     do
  257.         as_user "rsync -rt --exclude 'ramdisk' $MCPATH/${WORLDNAME[$INDEX]}/ ${WORLDSTORAGE}/${WORLDNAME[$INDEX]}"
  258.         echo "${WORLDNAME[$INDEX]} copied to disk"
  259.     done
  260. }
  261. mc_update() {
  262.     if ps ax | grep -v grep | grep -v -i SCREEN | grep $SERVICE > /dev/null
  263.     then
  264.         echo "$SERVICE is running! Will not start update."
  265.     else
  266.         ### update minecraft_server.jar
  267.         echo "Updating minecraft_server.jar...."
  268.         MC_SERVER_URL=http://minecraft.net/`wget -q -O - http://www.minecraft.net/download.jsp | grep minecraft_server.jar\</a\> | cut -d \" -f 2`
  269.         as_user "cd $MCPATH && wget -q -O $MCPATH/minecraft_server.jar.update $MC_SERVER_URL"
  270.         if [ -f $MCPATH/minecraft_server.jar.update ]
  271.         then
  272.             if `diff $MCPATH/minecraft_server.jar $MCPATH/minecraft_server.jar.update >/dev/null`
  273.             then
  274.                 echo "You are already running the latest version of the Minecraft server."
  275.                 as_user "rm $MCPATH/minecraft_server.jar.update"
  276.             else
  277.                 as_user "mv $MCPATH/minecraft_server.jar.update $MCPATH/minecraft_server.jar"
  278.                 echo "Minecraft successfully updated."
  279.             fi
  280.         else
  281.             echo "Minecraft update could not be downloaded."
  282.         fi
  283.  
  284.         ### update craftbukkit
  285.  
  286.         echo "Updating craftbukkit...."
  287.         as_user "cd $MCPATH && wget -q -O $MCPATH/craftbukkit.jar.update http://ci.bukkit.org/job/dev-CraftBukkit/promotion/latest/Recommended/artifact/target/craftbukkit-0.0.1-SNAPSHOT.jar"
  288.         if [ -f $MCPATH/craftbukkit.jar.update ]
  289.         then
  290.             if `diff $MCPATH/craftbukkit-0.0.1-SNAPSHOT.jar $MCPATH/craftbukkit.jar.update > /dev/null`
  291.             then
  292.                 echo "You are already running the latest version of CraftBukkit."
  293.                 as_user "rm $MCPATH/craftbukkit.jar.update"
  294.             else
  295.                 as_user "mv $MCPATH/craftbukkit.jar.update $MCPATH/craftbukkit-0.0.1-SNAPSHOT.jar"
  296.                 echo "CraftBukkit successfully updated."
  297.             fi
  298.         else
  299.             echo "CraftBukkit update could not be downloaded."
  300.         fi
  301.     fi
  302. }
  303. change_ramdisk_state() {
  304.     if [ ! -e $WORLDSTORAGE/$1 ]
  305.     then
  306.         echo "World \"$1\" not found."
  307.         exit 1
  308.     fi
  309.    
  310.     if [ -e $WORLDSTORAGE/$1/ramdisk ]
  311.     then
  312.         rm $WORLDSTORAGE/$1/ramdisk
  313.         echo "removed ramdisk flag from \"$1\""
  314.     else
  315.         touch $WORLDSTORAGE/$1/ramdisk
  316.         echo "added ramdisk flag to \"$1\""
  317.     fi
  318.     echo "changes will only take effect after server is restarted."
  319. }
  320.  
  321.  
  322. case "$1" in
  323.     start)
  324.         # Starts the server
  325.         check_links
  326.         to_ram
  327.         mc_start
  328.         ;;
  329.     stop)
  330.         # Stops the server
  331.         as_user "screen -p 0 -S $SCREEN -X eval 'stuff \"say SERVER SHUTTING DOWN!\"\015'"
  332.         mc_stop
  333.         to_disk
  334.         ;;
  335.     restart)
  336.         # Restarts the server
  337.         as_user "screen -p 0 -S $SCREEN -X eval 'stuff \"say SERVER REBOOT IN 10 SECONDS.\"\015'"
  338.         mc_hold
  339.         to_disk
  340.         check_links
  341.         to_ram
  342.         mc_unhold
  343.         ;;
  344.     backup)
  345.         # Backups world
  346.         as_user "screen -p 0 -S $SCREEN -X eval 'stuff \"say Backing up world.\"\015'"
  347.         mc_saveoff
  348.         to_disk
  349.         mc_world_backup
  350.         mc_saveon
  351.         as_user "screen -p 0 -S $SCREEN -X eval 'stuff \"say Backup complete.\"\015'"
  352.         ;;
  353.     whole-backup)
  354.         # Backup everything
  355.         mc_whole_backup
  356.         ;;
  357.     update)
  358.         #update minecraft_server.jar and craftbukkit.jar (thanks karrth)
  359.         as_user "screen -p 0 -S $SCREEN -X eval 'stuff \"say SERVER UPDATE IN 10 SECONDS.\"\015'"
  360.         mc_stop
  361.         to_disk
  362.         mc_whole_backup
  363.         mc_update
  364.         check_links
  365.         mc_start
  366.         ;;
  367.     to-disk)
  368.         # Writes from the ramdisk to disk, in case the server crashes.
  369.         # Using ramdisk speeds things up a lot, especially if you allow
  370.         # teleportation on the server.
  371.         mc_saveoff
  372.         to_disk
  373.         mc_saveon
  374.         ;;
  375.     connected)
  376.         # Lists connected users
  377.         as_user "screen -p 0 -S $SCREEN -X eval 'stuff list\015'"
  378.         sleep 3s
  379.         tac $MCPATH/server.log | grep -m 1 "Connected"
  380.         ;;
  381.     log-roll)
  382.         # Moves and Gzips the logfile, a big log file slows down the
  383.         # server A LOT (what was notch thinking?)
  384.         as_user "screen -p 0 -S $SCREEN -X eval 'stuff \"say ROUTINE REBOOT IN 10 SECONDS.\"\015'"
  385.         mc_stop
  386.         log_roll
  387.         mc_start
  388.         ;;
  389.     last)
  390.         # greps for recently logged in users
  391.         echo Recently logged in users:
  392.         cat $MCPATH/server.log | awk '/entity|conn/ {sub(/lost/,"disconnected");print $1,$2,$4,$5}'
  393.         ;;
  394.     status)
  395.         # Shows server status
  396.         if ps ax | grep -v grep | grep -v -i SCREEN | grep $SERVICE > /dev/null
  397.         then
  398.             echo "$SERVICE is running."
  399.         else
  400.             echo "$SERVICE is not running."
  401.         fi
  402.         ;;
  403.     version)
  404.         echo Craftbukkit version `awk '/Craftbukkit/ {sub(/\)/, ""); print $12}' $MCPATH/server.log`
  405.         ;;
  406.     links)
  407.         check_links
  408.         ;;
  409.     ramdisk)
  410.         change_ramdisk_state $2
  411.         ;;
  412.     worlds)
  413.         get_worlds
  414.         for INDEX in ${!WORLDNAME[@]}
  415.         do
  416.             if ${WORLDRAM[$INDEX]}
  417.             then
  418.                 echo "${WORLDNAME[$INDEX]} (ramdisk)"
  419.             else
  420.                 echo ${WORLDNAME[$INDEX]}
  421.             fi
  422.         done
  423.         ;;
  424.     help)
  425.         echo "Usage: /etc/init.d/minecraft command"
  426.         echo
  427.         echo "start - Starts the server"
  428.         echo "stop - stops the server"
  429.         echo "restart - restarts the server"
  430.         echo "backup - backups the worlds defined in the script"
  431.         echo "whole-backup - backups the entire server folder"
  432.         echo "update - fetches the latest version of minecraft.jar server and Bukkit"
  433.         echo "log-roll - Moves and gzips the logfile"
  434.         echo "to-disk - copies the worlds from the ramdisk to worldstorage"
  435.         echo "connected - lists connected users"
  436.         echo "status - Shows server status"
  437.         echo "version - returs Bukkit version"
  438.         echo "links - creates nessesary symlinks"
  439.         echo "last - shows recently connected users"
  440.         echo "worlds - shows a list of available worlds"
  441.         echo "ramdisk WORLD - toggles ramdisk configuration for WORLD"
  442.         ;;
  443.     *)
  444.         echo "No such command see /etc/init.d/minecraft help"
  445.         exit 1
  446.         ;;
  447. esac
  448.  
  449. exit 0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement