Advertisement
Guest User

DNI Minecraft

a guest
Mar 22nd, 2012
49
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 6.31 KB | None | 0 0
  1. #!/bin/bash
  2.  
  3. # Script: /etc/init.d/dni
  4. # Description: Manage multiple minecraft servers.
  5. # Requires: bash, java, netcat, rsync, nohup
  6. # Author: Tom Arnold <tom9729@gmail.com>
  7. # Version: 2012.03.22
  8.  
  9. ### BEGIN INIT INFO
  10. # Provides:   dni
  11. # Required-Start: $local_fs $remote_fs
  12. # Required-Stop:  $local_fs $remote_fs
  13. # Should-Start:   $network
  14. # Should-Stop:    $network
  15. # Default-Start:  2 3 4 5
  16. # Default-Stop:   0 1 6
  17. # Short-Description:    Minecraft server
  18. # Description:    Starts the minecraft server
  19. ### END INIT INFO
  20.  
  21. ## Install:
  22. ##
  23. ## - Install reqs:
  24. ##   'sudo apt-get install openjdk-6-jre netcat rsync'
  25. ##
  26. ## - Make a minecraft user.
  27. ##
  28. ## - Make these directories (owned by minecraft)
  29. ##   /opt/dni
  30. ##   /opt/dni/backup
  31. ##   /opt/dni/server
  32. ##
  33. ## - Save script to /etc/init.d/dni, make owned by root
  34. ##   and give it execute perms.
  35. ##
  36. ## - Install as a system service: 'update-rc.d dni defaults'
  37. ##
  38. ## - Make a directory per-server in /opt/dni/server. This is a
  39. ##   normal minecraft server directory. Make sure it's owned by
  40. ##   minecraft user. ***NAME OF SERVER = NAME OF DIR***
  41. ##
  42. ##   Eg. 'creative' server is /opt/dni/server/creative
  43. ##
  44. ## - Enable automatic backups by adding a line to root's crontab.
  45. ##   'sudo EDITOR=nano crontab -e'
  46. ##
  47. ##   Eg. for backups every 15 minutes: '*/15 * * * * service dni backup'
  48. ##
  49. ## - Get a nice overview of all backups using 'tree'
  50. ##   Eg. 'tree -L 7 /opt/dni/backup'
  51.  
  52. ## Usage:
  53. ## 'sudo service dni <cmd> [server]'
  54. ##
  55. ## - To start a 'creative' server: 'sudo service dni start creative'
  56. ##
  57. ## - To backup all servers: 'sudo service dni backup'
  58. ##
  59. ## - To execute a MC console cmd: 'echo "give Tom9729 92" | sudo service dni cmd survival'
  60. ##   ***MUST SPECIFY SERVER FOR CMD, DESIGN FLAW, SORRY***
  61. ##
  62. ## - 'sudo service dni' to see list of commands, or just look below.
  63.  
  64. ## Backups:
  65. ## - Shadow backups are made using rsync. The entire server folder is backed up
  66. ##   and stored in: /opt/dni/backup/<server>/<year>/<month>/<day>/<hr>/<min>/<sec>
  67. ##   The first backup will take a long time because it must make a baseline copy.
  68. ##   The baseline will be the full size of your world (in my case, ~700mb). Every
  69. ##   backup after the initial baseline is made will be quick and small. The benefits
  70. ##   to doing shadow backups are that backups are fast, small, and that a working
  71. ##   snapshot of the server from any point of time can be quickly put into production.
  72. ##   The general idea is that only changes are ever written to disk.
  73. ##
  74. ## - Latest backup link: '/opt/dni/backup/<server>/latest'
  75.  
  76. DNI_USER="minecraft"
  77. DNI_DIR="/opt/dni"
  78. DNI_JAVA="java -Xincgc -server"
  79. DNI_MINECRAFT="minecraft_server.jar nogui"
  80.  
  81. dni_start() {
  82.     if [ $# -lt 1 ]; then exit 1; fi
  83.     local server="$1"
  84.     if [ `dni_status $server` ]; then return; fi
  85.     local minecraft="nohup ${DNI_JAVA} -jar ${DNI_MINECRAFT} server_${server}"
  86.    
  87.     cd "${DNI_DIR}/server/${server}"
  88.    
  89.     ## Make sure we have a clean env.
  90.     dni_clean $server
  91.    
  92.     ## Exec minecraft,
  93.     ## pipe input to it from UNIX socket.
  94.     echo "Starting $server" 1>&2
  95.     nc -lUk dni-in.sock | $minecraft > /dev/null 2>&1 &
  96. }
  97.  
  98. dni_cmd() {
  99.     if [ $# -lt 1 ]; then exit 1; fi
  100.     local server="$1"
  101.     if [ ! `dni_status $server` ]; then return; fi
  102.     local prefix="${DNI_DIR}/server/${server}"
  103.  
  104.     read stdin
  105.     echo "$stdin" | nc -U "$prefix/dni-in.sock"
  106. }
  107.  
  108. dni_clean() {
  109.     if [ $# -lt 1 ]; then exit 1; fi
  110.     local server="$1"
  111.     local prefix="${DNI_DIR}/server/${server}"
  112.     rm -f "$prefix/dni-in.sock" "$prefix/dni-out.sock"
  113. }
  114.  
  115. dni_stop() {
  116.     if [ $# -lt 1 ]; then exit 1; fi
  117.     local server="$1"
  118.  
  119.     if [ `dni_status $server` ]
  120.     then
  121.     echo "Stopping $server" 1>&2
  122.     fi
  123.  
  124.     echo "stop" | dni_cmd $server
  125.     dni_clean $server
  126. }
  127.  
  128. dni_status() {
  129.     if [ $# -lt 1 ]; then exit 1; fi
  130.     local server="$1"
  131.     local pid=`ps aux |
  132.          grep -v grep | grep "${DNI_MINECRAFT} server_${server}" |
  133.      sed -e 's/^[0-9]*\s*\([0-9]*\).*/\1/g'`
  134.     if [ "$pid" ]; then echo "$pid "; fi
  135. }
  136.  
  137. dni_server_list() {
  138.     for f in `ls -B "${DNI_DIR}/server"`
  139.     do
  140.     echo $f
  141.     done
  142. }
  143.  
  144. dni_restart() {
  145.     local server="$1"
  146.     dni_stop $server
  147.     while [ `dni_status $server` ]; do sleep 0.01; done
  148.     dni_start $server
  149. }
  150.  
  151. dni_backup() {
  152.     if [ $# -lt 1 ]; then exit 1; fi
  153.     local server="$1"
  154.     if [ ! `dni_status $server` ]; then return; fi
  155.     local prefix="$DNI_DIR"
  156.  
  157.     ## Force level save, then disable saving so
  158.     ## that we can make a backup safeishley.
  159.     echo "save-all" | dni_cmd $server
  160.     echo "save-off" | dni_cmd $server
  161.     sleep 0.1
  162.  
  163.     ## Construct backup dir as
  164.     ## <dni_path>/<server>/<year>/<month>/<day>/<hour>/<min>/<sec>
  165.     local now="`date +%Y/%m/%d/%H/%M/%S`"
  166.     local bk_root="$prefix/backup/$server"
  167.     local bk_dir="$bk_root/$now"
  168.     if [ ! -d "$bk_dir" ]; then mkdir -p "$bk_dir"; fi
  169.        
  170.     local bk_src="$prefix/server/$server"
  171.     local bk_latest="$bk_root/latest"    
  172.     if [ -h "$bk_latest" ]
  173.     then
  174.     ## We have a baseline to diff from.
  175.     local bk_prev=`readlink -f "$bk_latest"`
  176.     rsync -a --delete --link-dest="$bk_prev" "$bk_src" "$bk_dir/"
  177.     else
  178.     ## Make a baseline.
  179.     cp -a "$bk_src" "$bk_dir/" 
  180.     fi
  181.    
  182.     ## Relink to latest backup.
  183.     rm -f "$bk_latest"
  184.     ln -s "$bk_dir" "$bk_latest"
  185.    
  186.     ## Reenable saving.
  187.     echo "save-on" | dni_cmd $server
  188. }
  189.  
  190. main() {
  191.     ## Make sure that this script is run as DNI_USER.
  192.     case `whoami` in
  193.         ## Escape if we are DNI_USER.
  194.     ${DNI_USER});;
  195.         ## Relaunch as appropriate user.
  196.     root)
  197.         su ${DNI_USER} $0 $@
  198.         exit $?
  199.         ;;
  200.         ## Not DNI_USER and can't su, so die.
  201.     *)
  202.         echo "fatal: must be run as (root, ${DNI_USER})" 1>&2
  203.         exit 1
  204.         ;;
  205.     esac
  206.    
  207.     ## Pop off command (arg 1).
  208.     local cmd="$1"
  209.     shift
  210.  
  211.     case "$cmd" in
  212.     ## Valid commands.
  213.     start|stop|cmd|restart|status|backup)
  214.         ;;
  215.     ## Otherwise die.
  216.     *)
  217.         echo "Usage: $0 {start|stop|restart|cmd|status|backup}" 1>&2
  218.         exit 1
  219.         ;;
  220.     esac
  221.    
  222.     for server in ${@:-`dni_server_list`}
  223.     do     
  224.     ## Make sure server actually exists.
  225.     if [ ! -d "$DNI_DIR/server/$server" ]; then continue; fi
  226.  
  227.     ## Execute command.
  228.     dni_$cmd $server
  229.     done
  230.    
  231.     exit 0
  232. }
  233.  
  234. main $@
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement