commit 2c972cc0990cbd02218c6ad916b503b8c707f72a Author: Philip Abernethy Date: Fri Jul 3 19:16:00 2015 +0200 Initial commit diff --git a/.SRCINFO b/.SRCINFO new file mode 100644 index 0000000..1b0a2d8 --- /dev/null +++ b/.SRCINFO @@ -0,0 +1,33 @@ +pkgbase = minecraft-server + pkgdesc = Minecraft server unit files, script, and jar + pkgver = 1.8.6 + pkgrel = 1 + url = http://minecraft.net/ + install = minecraft-server.install + arch = any + license = custom + depends = java-runtime-headless + depends = systemd + depends = screen + depends = expect + conflicts = minecraft-server-systemd + conflicts = minecraft-canary + noextract = minecraft_server.1.8.6.jar + options = !strip + options = emptydirs + backup = etc/conf.d/minecraft + source = https://s3.amazonaws.com/Minecraft.Download/versions/1.8.6/minecraft_server.1.8.6.jar + source = minecraftd + source = minecraftd-diag + source = minecraftd.service + source = minecraftctl + source = conf.minecraft + sha256sums = 7fc66b2b54f0f4d65fdd6d6484a50f432c144ef02072d3435d5660f120f58e0d + sha256sums = 043101c29d4b4f9092cb93ef52168cfe3d16d49ff573136f4fbb45071a38a5d1 + sha256sums = de03317d02668bb71ec160fff497c7fbfe8b03ffff2950c6a0bcfb39f69cd214 + sha256sums = 6eb4c085b8377712671445b891a3a2cf2a17cf7a7bea66be456a980c2b620e23 + sha256sums = 472e06e1bd63838e88ace0bd2f971f72f2efd9e541cc0956599a44c324fd49ac + sha256sums = 738e10185df160d190a5f4f0226de110d67ba023877e4999a6d3ef41c9918ed6 + +pkgname = minecraft-server + diff --git a/PKGBUILD b/PKGBUILD new file mode 100644 index 0000000..d6ac423 --- /dev/null +++ b/PKGBUILD @@ -0,0 +1,40 @@ +# Maintainer: Philip Abernethy + +pkgname=minecraft-server +pkgver=1.8.6 +pkgrel=1 +pkgdesc="Minecraft server unit files, script, and jar" +arch=(any) +url="http://minecraft.net/" +license=('custom') +depends=('java-runtime-headless' 'systemd' 'screen' 'expect') +conflicts=('minecraft-server-systemd' 'minecraft-canary') +options=(!strip emptydirs) +install=minecraft-server.install +backup=('etc/conf.d/minecraft') +source=(https://s3.amazonaws.com/Minecraft.Download/versions/${pkgver}/minecraft_server.${pkgver}.jar + minecraftd + minecraftd-diag + minecraftd.service + minecraftctl + conf.minecraft) +noextract=("minecraft_server.${pkgver}.jar") +sha256sums=('7fc66b2b54f0f4d65fdd6d6484a50f432c144ef02072d3435d5660f120f58e0d' + '043101c29d4b4f9092cb93ef52168cfe3d16d49ff573136f4fbb45071a38a5d1' + 'de03317d02668bb71ec160fff497c7fbfe8b03ffff2950c6a0bcfb39f69cd214' + '6eb4c085b8377712671445b891a3a2cf2a17cf7a7bea66be456a980c2b620e23' + '472e06e1bd63838e88ace0bd2f971f72f2efd9e541cc0956599a44c324fd49ac' + '738e10185df160d190a5f4f0226de110d67ba023877e4999a6d3ef41c9918ed6') + +package() { + install -Dm755 "${srcdir}/minecraftd" "${pkgdir}/usr/bin/minecraftd" + install -Dm755 "${srcdir}/minecraftd-diag" "${pkgdir}/usr/bin/minecraftd-diag" + install -Dm755 "${srcdir}/minecraftctl" "${pkgdir}/usr/bin/minecraftctl" + + install -Dm644 "${srcdir}/minecraft_server.${pkgver}".jar "${pkgdir}/srv/minecraft/minecraft_server.${pkgver}".jar + ln -s "minecraft_server.${pkgver}.jar" "${pkgdir}/srv/minecraft/minecraft_server.jar" + install -Dm644 "${srcdir}/minecraftd.service" "${pkgdir}/usr/lib/systemd/system/minecraftd.service" + install -Dm644 "${srcdir}/conf.minecraft" "${pkgdir}/etc/conf.d/minecraft" + + install -d "${pkgdir}/srv/minecraft/backup" +} diff --git a/conf.minecraft b/conf.minecraft new file mode 100644 index 0000000..a78e2a1 --- /dev/null +++ b/conf.minecraft @@ -0,0 +1,37 @@ +# MINECRAFT SERVER LAUNCH CONFIGS +# not to be confused with server.properties. + +# Server root directory +_SRVDIR=/srv/minecraft + +# World directory (relative to SRVDIR) +# Ensure that this matches what is in your server.properties, +# or else the wrong folder will be backed up! +WORLD=world + +# Maximum RAM usage (change to suit your needs) +MAXHEAP=1024M + +# Minimum RAM usage (change to suit your needs) +MINHEAP=512M + +# Number of concurrent threads (no more than the number of logical processors in your system) +THREADS=1 + +# Where to store backup files +BACKUPPATH=/srv/minecraft/backup + +# What to say to the server when backup starts +BACKUPSTARTMSG="WORLD BACKUP STARTING. Server going read-only..." + +# What to say when to the server when backup ends +BACKUPENDMSG="WORLD BACKUP ENDED. Server going read-write..." + +## Only change these if you know what you're doing + +# Server JAR file +SERVERJAR=minecraft_server.jar +SERVICE=${SERVERJAR} + +# User to run server under +MCUSER=minecraft diff --git a/minecraft-server.install b/minecraft-server.install new file mode 100644 index 0000000..3031324 --- /dev/null +++ b/minecraft-server.install @@ -0,0 +1,33 @@ +post_install() { + post_upgrade +} + +post_upgrade() { + getent group "minecraft" &>/dev/null || groupadd -r minecraft 1>/dev/null + getent passwd "minecraft" &>/dev/null && usermod -s "/usr/bin/nologin" minecraft &>/dev/null || useradd -r -g minecraft -d "/srv/minecraft" -s "/usr/bin/nologin" minecraft 1>/dev/null + touch /srv/minecraft/server.log + chown -R minecraft:minecraft "/srv/minecraft" 1>/dev/null + ln -s /srv/minecraft/server.log /var/log/minecraft.log &>/dev/null + # Removes old data from previous version + cat << EOF +==> World data is stored under /srv/minecraft +==> The server runs as "minecraft", not root +==> You can access the server's console as root with: + $ screen -r minecraft +==> The systemd service is called "minecraftd.service" +==> Calling "stop" or "restart" with systemctl will gracefully exit the server, saving world data +==> Modify /etc/conf.d/minecraft to change the invocation of the server if you wish +==> A script at /usr/bin/minecraftctl is also provided. See the wiki for details on its usage. +==> For the server to start you have to accept the EULA in /srv/minecraft/eula.txt + +EOF +} + +post_remove() { + if getent passwd "minecraft" >/dev/null; then + userdel minecraft >/dev/null + fi + if getent group "minecraft" >/dev/null; then + groupdel minecraft >/dev/null + fi +} diff --git a/minecraftctl b/minecraftctl new file mode 100644 index 0000000..55ed49c --- /dev/null +++ b/minecraftctl @@ -0,0 +1,124 @@ +#!/bin/bash + + +# Adapted from generic minecraft init script +# http://www.minecraftwiki.net/wiki/Tutorials/Server_startup_script +# +# Main Differences: +# - Start stop and reload is handled by systemd, removed +# - update handled by pacman, removed +# - changed from init script to "minecraftctl" command. +# - uses /etc/conf.d/minecraftd for variables +# +# Changes: +# +# Changed running screen to work as root, broke it out into mc_docommand +# Commented echo commands for successful execution to not spam the log. + + +. /etc/conf.d/minecraft || echo "can't source /etc/conf.d/minecraft" + + +ME=`whoami` +as_user() { + if [ $ME == $MCUSER ] ; then + bash -c "$1" + else + su - $MCUSER -c "$1" + fi +} + +mc_saveoff() { + if pgrep -u $MCUSER -f $SERVICE > /dev/null + then + #echo "$SERVICE is running... suspending saves" + mc_docommand "say $BACKUPSTARTMSG" + mc_docommand save-off + mc_docommand save-all + sync + sleep 10 + else + echo "$SERVICE is not running. Not suspending saves." + fi +} + +mc_saveon() { + if pgrep -u $MCUSER -f $SERVICE > /dev/null + then + #echo "$SERVICE is running... re-enabling saves" + mc_docommand save-on + mc_docommand "say $BACKUPENDMSG" + else + echo "$SERVICE is not running. Not resuming saves." + fi +} + +mc_backup() { + mc_saveoff + + NOW=`date "+%Y-%m-%d_%Hh%M"` + BACKUP_FILE="$BACKUPPATH/${WORLD}_${NOW}.tar" + #echo "Backing up minecraft world..." + #as_user "cd $_SRVDIR && cp -r $WORLD $BACKUPPATH/${WORLD}_`date "+%Y.%m.%d_%H.%M"`" + as_user "tar -h -C \"$_SRVDIR\" -cf \"$BACKUP_FILE\" \"$WORLD\"" + + #echo "Backing up $SERVICE" + as_user "tar -h -C \"$_SRVDIR\" -rf \"$BACKUP_FILE\" \"$SERVICE\"" + #as_user "cp \"$_SRVDIR/$SERVICE\" \"$BACKUPPATH/minecraft_server_${NOW}.jar\"" + + mc_saveon + + #echo "Compressing backup..." + as_user "gzip -f \"$BACKUP_FILE\"" + #echo "Done." +} + +mc_command() { + command="$1"; + if pgrep -u $MCUSER -f $SERVICE > /dev/null + then + pre_log_len=`wc -l "$_SRVDIR/server.log" | awk '{print $1}'` + #echo "$SERVICE is running... executing command" + mc_docommand "$command" + sleep .1 # assumes that the command will run and print to the log file in less than .1 seconds + # print output + tail -n $[`wc -l "$_SRVDIR/server.log" | awk '{print $1}'`-$pre_log_len] "$_SRVDIR/server.log" + else + echo "$SERVICE is not running. Couldn't executed command." + fi +} + +mc_docommand() { + screen -p 0 -S minecraft -X stuff "`printf \"$1\r\"`" +} + + +#Start-Stop here +case "$1" in + backup) + mc_backup + ;; + status) + if pgrep -u $MCUSER -f $SERVICE > /dev/null + then + echo "$SERVICE is running." + else + echo "$SERVICE is not running." + fi + ;; + command) + if [ $# -gt 1 ]; then + shift + mc_command "$*" + else + echo "Must specify server command (try 'help'?)" + fi + ;; + + *) + echo "Usage: $0 {backup|status|command \"server command\"}" + exit 1 + ;; +esac + +exit 0 diff --git a/minecraftd b/minecraftd new file mode 100644 index 0000000..997f928 --- /dev/null +++ b/minecraftd @@ -0,0 +1,6 @@ +#!/bin/bash + +. /etc/conf.d/minecraft || echo "can't source /etc/conf.d/minecraft" + +cd $_SRVDIR +screen -dmS minecraft java -Xmx${MAXHEAP} -Xms${MINHEAP} -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalPacing -XX:ParallelGCThreads=${THREADS} -XX:+AggressiveOpts -jar ${_SRVDIR}/${SERVERJAR} nogui diff --git a/minecraftd-diag b/minecraftd-diag new file mode 100644 index 0000000..a0bd045 --- /dev/null +++ b/minecraftd-diag @@ -0,0 +1,7 @@ +#!/bin/bash + +. /etc/conf.d/minecraft || echo "can't source /etc/conf.d/minecraft" + +cd $_SRVDIR +echo "If the next command executes correctly, then something is wrong with screen." +su minecraft -c "PATH=/opt/java/bin/:/usr/bin/:$PATH java -Xmx${MAXHEAP} -Xms${MINHEAP} -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalPacing -XX:ParallelGCThreads=${THREADS} -XX:+AggressiveOpts -jar ${_SRVDIR}/${SERVERJAR} nogui" diff --git a/minecraftd.service b/minecraftd.service new file mode 100644 index 0000000..d649d63 --- /dev/null +++ b/minecraftd.service @@ -0,0 +1,14 @@ +[Unit] +Description=Minecraft server daemon +After=network.target + +[Service] +User=minecraft +Group=minecraft +ExecStart=/usr/bin/minecraftd +Type=oneshot +RemainAfterExit=yes +ExecStop=/usr/bin/screen -S minecraft -X stuff 'say Server Shutting Down in 5 Seconds\n' ; /usr/bin/sleep 5 ; /usr/bin/screen -S minecraft -X stuff 'stop\n' ; /usr/bin/expect -c "exec screen -x minecraft ; wait ; exit" + +[Install] +WantedBy=multi-user.target