diff --git a/attributes/default.rb b/attributes/default.rb index f34862b..bbf24ed 100644 --- a/attributes/default.rb +++ b/attributes/default.rb @@ -2,6 +2,12 @@ default['minecraft']['install_dir'] = '/srv/minecraft' default['minecraft']['base_url'] = 'https://s3.amazonaws.com/MinecraftDownload/launcher' default['minecraft']['jar'] = 'minecraft_server.jar' +default['minecraft']['checksum'] = '7a1abdac5d412b7eebefd84030d40c1591c17325801dba9cbbeb3fdf3c374553' + +default['minecraft']['xms'] = '1024M' +default['minecraft']['xmx'] = '1024M' +default['minecraft']['ipv6'] = false +default['minecraft']['pid'] = '/var/run/minecraft.pid' default['minecraft']['banned-ips'] = [] default['minecraft']['banned-players'] = [] diff --git a/recipes/default.rb b/recipes/default.rb index 0797746..cca96fe 100644 --- a/recipes/default.rb +++ b/recipes/default.rb @@ -24,25 +24,26 @@ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -# Only focusing on Linux and BSD suppport. Patches are welcome for OSX and Windows. - include_recipe 'java::default' +include_recipe 'tmux::default' minecraft_jar = "#{Chef::Config['file_cache_path']}/#{node['minecraft']['jar']}" user node['minecraft']['user'] do system true - shell "/bin/false" + comment "Minecraft Server" home node['minecraft']['install_dir'] + shell "/bin/false" action :create end remote_file minecraft_jar do source "#{node['minecraft']['base_url']}/#{node['minecraft']['jar']}" + checksum node['minecraft']['checksum'] owner node['minecraft']['user'] group node['minecraft']['user'] mode '0644' - not_if { File.exists?(minecraft_jar) } + action :create_if_missing end directory node['minecraft']['install_dir'] do @@ -69,3 +70,15 @@ action :create end end + +template "/etc/init.d/minecraft" do + source "minecraft.init.erb" + owner "root" + group "root" + mode 00755 +end + +service "minecraft" do + supports :restart => true + action [ :enable, :start ] +end diff --git a/templates/default/minecraft.init.erb b/templates/default/minecraft.init.erb new file mode 100644 index 0000000..2c9fe29 --- /dev/null +++ b/templates/default/minecraft.init.erb @@ -0,0 +1,106 @@ +#!/bin/sh +### BEGIN INIT INFO +# Provides: Minecraft server +# Required-Start: $local_fs $remote_fs +# Required-Stop: $local_fs $remote_fs +# Should-Start: $network +# Should-Stop: $network +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: Minecraft server +# Description: Starts the minecraft server +### END INIT INFO + +# Author: Greg Fitzgerald + +# Settings +PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" +USER="<%= node['minecraft']['user'] %>" +SOCKET="/tmp/tmux-minecraft" +MCJAR="<%= node['minecraft']['jar'] %>" +XMS="<%= node['minecraft']['xms'] %>" +XMX="<%= node['minecraft']['xmx'] %>" +PIDFILE="<%= node['minecraft']['pid'] %>" +HOME="<%= node['minecraft']['install_dir'] %>" +NAME="Minecraft Server" +SHUTDOWN_DELAY="30" + +[ -e $HOME/$MCJAR ] || exit 0 + +set -e + +. /lib/lsb/init-functions + +isrunning() { + ps ax | grep -Ev "tmux|sh|grep" | grep $MCJAR > /dev/null + return $? +} + +start() { + if [ !isrunning ]; then + start-stop-daemon \ + --oknodo \ + --start \ + --make-pidfile \ + --pidfile $PIDFILE \ + --chdir $HOME \ + --chuid $USER \ + --exec /usr/bin/tmux -- -S $SOCKET new-session -n minecraft -d "java -server -Xincgc -Xms$XMS -Xmx$XMX -Djava.net.preferIPv4Stack=true -jar $MCJAR nogui" + fi +} + +stop() { + if isrunning; then + tmux -S $SOCKET -q send "say Server going down in $SHUTDOWN_DELAY seconds" C-m > /dev/null + sleep $SHUTDOWN_DELAY + tmux -S $SOCKET -q send "stop" C-m > /dev/null + fi + + sleep 5 + + if isrunning; then + echo "$NAME failed to stop, trying to force a shutdown" + minecraftPID=`ps ax | grep -Ev "grep|tmux|sh" $MCJAR` + kill ${minecraftPID:0:5} + fi + + sleep 2 + + if isrunning; then + echo "Was unable to kill $NAME" + else + echo "Sucessfully killed $NAME" + fi +} + +case "$1" in + start) + echo -n "Starting $NAME: " + start + echo "$NAME." + ;; + stop) + echo -n "Stopping $NAME: " + stop + echo "$NAME." + ;; + restart) + echo -n "Restarting $NAME: " + stop + echo "$NAME." + start + ;; + status) + if isrunning; then + echo "$NAME is running" + exit 0 + else + echo "$NAME is not running" + exit 1 + fi + ;; + *) + echo "Usage: $NAME {start|stop|restart|status}" >&2 + exit 1 + ;; +esac