diff options
author | BuildTools | 2015-09-15 00:39:13 -0700 |
---|---|---|
committer | BuildTools | 2015-09-15 00:39:13 -0700 |
commit | 7b656331c3508775649ff02b90557fedb1aa113f (patch) | |
tree | 9d3b1ebfddb2aeff93cdcd8b30a2e9bcac280570 | |
parent | fd1247993ea596c524bd127258ff708593b50826 (diff) | |
download | aur-7b656331c3508775649ff02b90557fedb1aa113f.tar.gz |
merging contributed changes from edh
-rw-r--r-- | .SRCINFO | 15 | ||||
-rw-r--r-- | .gitignore | 1 | ||||
-rwxr-xr-x | PKGBUILD | 33 | ||||
-rw-r--r-- | spigot-backup.service | 10 | ||||
-rw-r--r-- | spigot-backup.timer | 11 | ||||
-rwxr-xr-x | spigot.install | 47 | ||||
-rwxr-xr-x | spigot.service | 4 | ||||
-rwxr-xr-x | spigot.sh | 235 |
8 files changed, 280 insertions, 76 deletions
@@ -1,7 +1,7 @@ pkgbase = spigot pkgdesc = High performance Minecraft server implementation pkgver = 1.8.8 - pkgrel = 1 + pkgrel = 2 url = http://www.spigotmc.org/ install = spigot.install arch = any @@ -9,21 +9,28 @@ pkgbase = spigot makedepends = java-environment makedepends = git depends = java-runtime-headless - depends = tmux + depends = screen depends = sudo depends = fontconfig + depends = bash + optdepends = tar: needed in order to create world backups provides = bukkit provides = craftbukkit=1.8.8 + provides = minecraft-server conflicts = bukkit conflicts = craftbukkit conflicts = spigot-patcher noextract = BuildTools.jar source = https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar + source = spigot-backup.service + source = spigot-backup.timer source = spigot.service source = spigot.sh md5sums = SKIP - md5sums = 55eb03d443e1aa1a013aa01798e056d4 - md5sums = 8933d1710304dfdf99632f53551672ef + md5sums = fd17202ba0bb7796439f0b2f6bc53be4 + md5sums = 774cd44ed90f6be51d368533cf74d7c2 + md5sums = 580c470c92d88ae2362250d59bd33b10 + md5sums = 17fede1d02736e0ee87d0b667cdf1525 pkgname = spigot diff --git a/.gitignore b/.gitignore index 438090a23e6d..ecb6293f20f6 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,3 @@ pkg/ src/ *.jar *.xz - @@ -1,30 +1,39 @@ +# Maintainer: Gordian Edenhofer <gordian.edenhofer[at]yahoo[dot]de> pkgname=spigot pkgver=1.8.8 -pkgrel=1 +pkgrel=2 pkgdesc="High performance Minecraft server implementation" arch=(any) url="http://www.spigotmc.org/" license=("LGPL") -depends=(java-runtime-headless tmux sudo fontconfig) +depends=(java-runtime-headless screen sudo fontconfig bash) makedepends=(java-environment git) +optdepends=("tar: needed in order to create world backups") conflicts=(bukkit craftbukkit spigot-patcher) -provides=(bukkit "craftbukkit=${pkgver%_*}") -install=spigot.install +provides=(bukkit "craftbukkit=${pkgver%_*}" minecraft-server) +install=${pkgname}.install source=("https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar" -"spigot.service" -"spigot.sh") -noextract=("BuildTools.jar") + "spigot-backup.service" + "spigot-backup.timer" + "spigot.service" + "spigot.sh") md5sums=('SKIP' - '55eb03d443e1aa1a013aa01798e056d4' - '8933d1710304dfdf99632f53551672ef') + 'fd17202ba0bb7796439f0b2f6bc53be4' + '774cd44ed90f6be51d368533cf74d7c2' + '580c470c92d88ae2362250d59bd33b10' + '17fede1d02736e0ee87d0b667cdf1525') +noextract=("BuildTools.jar") + build() { export MAVEN_OPTS="-Xmx2g -XX:MaxPermSize=1g" java -jar BuildTools.jar --rev $pkgver } package() { - install -Dm644 spigot-$pkgver.jar "$pkgdir/srv/craftbukkit/spigot.jar" - install -m755 spigot.sh "$pkgdir/srv/craftbukkit/spigot.sh" - install -Dm644 spigot.service "$pkgdir/usr/lib/systemd/system/spigot.service" + install -Dm755 spigot.sh "${pkgdir}/usr/bin/spigot" + install -Dm644 spigot-${pkgver}.jar "${pkgdir}/srv/spigot/spigot.jar" + install -Dm644 spigot.service "${pkgdir}/usr/lib/systemd/system/spigot.service" + install -Dm644 spigot-backup.service "${pkgdir}/usr/lib/systemd/system/spigot-backup.service" + install -Dm644 spigot-backup.timer "${pkgdir}/usr/lib/systemd/system/spigot-backup.timer" } # vim:set ts=2 sw=2 et: diff --git a/spigot-backup.service b/spigot-backup.service new file mode 100644 index 000000000000..4eda131909d7 --- /dev/null +++ b/spigot-backup.service @@ -0,0 +1,10 @@ +[Unit] +Description=Spigot World Backup +After=local-fs.target + +[Service] +Type=forking +ExecStart=/usr/bin/spigot backup + +[Install] +WantedBy=multi-user.target diff --git a/spigot-backup.timer b/spigot-backup.timer new file mode 100644 index 000000000000..ba2911de9a2f --- /dev/null +++ b/spigot-backup.timer @@ -0,0 +1,11 @@ +[Unit] +Description=Daily Spigot Backup + +[Timer] +Type=forking +OnCalendar=daily +AccuracySec=5min +Persistent=true + +[Install] +WantedBy=multi-user.target diff --git a/spigot.install b/spigot.install index 68524cf55999..cfa904e5b1b6 100755 --- a/spigot.install +++ b/spigot.install @@ -1,18 +1,45 @@ +USER="craftbukkit" +SERVER_ROOT="/srv/spigot" + +_update() { + getent group "${USER}" &>/dev/null + if [ $? -ne 0 ]; then + echo -e "\e[34;1m==>\e[39;1m Adding ${USER} system group... \e[0m" + groupadd -r ${USER} 1>/dev/null + fi + + getent passwd "${USER}" &>/dev/null + if [ $? -ne 0 ]; then + echo -e "\e[34;1m==>\e[39;1m Adding ${USER} system user... \e[0m" + useradd -r -g ${USER} -d "${SERVER_ROOT}" ${USER} 1>/dev/null + fi + + chown -R ${USER}:${USER} "${SERVER_ROOT}" + + echo -e "\e[34;1m==>\e[39;1m NOTE: The world data is stored under ${SERVER_ROOT} and the server runs \e[0m" + echo -e "\e[34;1m==>\e[39;1m as ${USER} user to increase security. \e[0m" + echo -e "\e[34;1m==>\e[39;1m NOTE: Use the spigot script under /usr/bin/spigot to start, stop or backup the server. \e[0m" +} + post_install() { - getent group craftbukkit >/dev/null 2>&1 || groupadd craftbukkit - getent passwd craftbukkit >/dev/null 2>&1 || useradd -g craftbukkit -d /srv/craftbukkit -s /bin/bash craftbukkit - chown -R craftbukkit:craftbukkit /srv/craftbukkit/ + _update } post_upgrade() { - post_install $1 + _update } post_remove() { - if getent passwd craftbukkit >/dev/null 2>&1; then - userdel craftbukkit - fi - if getent group craftbukkit >/dev/null 2>&1; then - groupdel craftbukkit - fi + systemctl stop spigot.service + systemctl disable spigot.service + + if getent passwd ${USER} >/dev/null 2>&1; then + userdel ${USER} + fi + if getent group ${USER} >/dev/null 2>&1; then + groupdel ${USER} + fi + + # Notifying the user of kept dirs + [ -d ${SERVER_ROOT} ] && chown root:root ${SERVER_ROOT} && echo -e "\e[34;1m==>\e[39;1m NOTE: Game saves in ${SERVER_ROOT} were kept on your system.\e[0m" } diff --git a/spigot.service b/spigot.service index 5849fc6e11e2..7178066f2f6b 100755 --- a/spigot.service +++ b/spigot.service @@ -3,8 +3,8 @@ Description=Spigot After=local-fs.target network.target [Service] -ExecStart=/srv/craftbukkit/spigot.sh start -ExecStop=/srv/craftbukkit/spigot.sh stop +ExecStart=/usr/bin/spigot start +ExecStop=/usr/bin/spigot stop Type=forking [Install] diff --git a/spigot.sh b/spigot.sh index 87eeb9e3083d..b866774d4f6e 100755 --- a/spigot.sh +++ b/spigot.sh @@ -1,61 +1,202 @@ #!/bin/bash -BACKUPPATH="/srv/craftbukkit/backup/" -WORLDPATH="/srv/craftbukkit/world/" +# You may use this script for any minecraft server of your choice, just alter those variables +SERVER_ROOT="/srv/spigot" +BACKUPPATH="/srv/spigot/backup" +LOGPATH="/srv/spigot/logs" +WORLDPATHS="/srv/spigot/world /srv/spigot/world_nether /srv/spigot/world_the_end" +KEEP_BACKUPS="10" +MC_USER="craftbukkit" +MAIN_JAR="spigot.jar" +SESSION_NAME="spigot" -USER="$2" +# Specify system parameters for the minecraft server +MINHEAP="512M" +MAXHEAP="1024M" +THREADS="1" -if [ -z $2 ]; then - USER="craftbukkit" +# Check for sudo rigths +if [ $(sudo whoami) != "root" ]; then + echo "You must have sudo access in order to use this script." + exit 1 fi -save_stop() { - su -s /bin/bash -c "tmux send-keys 'save-off' C-m" ${USER} - su -s /bin/bash -c "tmux send-keys 'save-all' C-m" ${USER} +# Pipe any given argument to the minecraft server console +mc_command() { + sudo -u ${MC_USER} screen -S ${SESSION_NAME} -X stuff "`printf \"$*\r\"`" } -save_start() { - su -s /bin/bash -c "tmux send-keys 'save-on' C-m" ${USER} +# Start the server if it is not already running +server_start() { + sudo -u ${MC_USER} screen -S ${SESSION_NAME} -Q select . > /dev/null + if [ $? -eq 0 ]; then + echo "A screen ${SESSION_NAME} session is already running. Please close it first." + else + echo -en "Starting server... " + sudo -u ${MC_USER} screen -dmS ${SESSION_NAME} /bin/bash -c "cd ${SERVER_ROOT}; java -Xmx${MAXHEAP} -Xms${MINHEAP} -XX:ParallelGCThreads=${THREADS} -jar ${SERVER_ROOT}/${MAIN_JAR} nogui" + echo -e "\e[39;1m done\e[0m" + fi } -case "$1" in - start) - if [ -z "`pgrep -f -n 'spigot.jar'`" ]; then - sudo -u ${USER} tmux new-session -d -s spigot-console -d 'cd /srv/craftbukkit; java -Xmx1024M -Xms1024M -jar /srv/craftbukkit/spigot.jar nogui' - if [ $? -gt 0 ]; then +# Stop the server gracefully by saving everything prior and warning the users +server_stop() { + sudo -u ${MC_USER} screen -S ${SESSION_NAME} -Q select . > /dev/null + if [ $? -eq 0 ]; then + mc_command save-all + mc_command say "Server is going down in 10 seconds! HURRY UP WITH WATHEVER YOU ARE DOING!" # Warning the users + echo -en "Server is going down in... " + for i in $(seq 1 10); + do + mc_command say "down in... $(expr 10 - $i)" + echo -n " $(expr 10 - $i)" + sleep 1 + done + mc_command stop + echo -e "\e[39;1m done\e[0m" + else + echo "The corresponding screen session for ${SESSION_NAME} was already dead." + fi +} + +# Print whether the server is running and if so give some information about memory usage and threads +server_status() { + sudo -u ${MC_USER} screen -S ${SESSION_NAME} -Q select . > /dev/null + if [ $? -eq 0 ]; then + echo -e "Status:\e[39;1m running\e[0m" + + # Calculating memory usage + for p in $(sudo -u ${MC_USER} pgrep -f ${MAIN_JAR}); do + ps -p$p -O rss | tail -n1; + done | gawk '{ count ++; sum += $2 }; END {count --; print "Number of processes =", count, "(screen, bash,", count-2, "x java)"; print "Total memory usage =", sum/1024, "MB" ;};' + else + echo -e "Status:\e[39;1m stopped\e[0m" + fi +} + +# Restart the complete server by shutting it down and starting it again +server_restart() { + sudo -u ${MC_USER} screen -S ${SESSION_NAME} -Q select . > /dev/null + if [ $? -eq 0 ]; then + server_stop + sleep 0.1 + server_start + else + server_start + fi +} + +# Backup the directories specified in $WORLDPATHS +backup_files() { + which tar &> /dev/null + if [ $? -ne 0 ]; then + echo "The tar binaries are needed for a backup." + exit 2 + fi + + echo "Starting backup..." + FILE="`date +%Y%m%d%H%M%S`.tar.gz" + sudo -u ${MC_USER} mkdir -p ${BACKUPPATH} + sudo -u ${MC_USER} screen -S ${SESSION_NAME} -Q select . > /dev/null + if [ $? -eq 0 ]; then + mc_command save-off + mc_command save-all + sync && wait + sudo -u ${MC_USER} tar -czf ${BACKUPPATH}/${FILE} --totals ${WORLDPATHS} 2>&1 | grep -v "tar: Removing leading " + mc_command save-on + else + sudo -u ${MC_USER} tar -czf ${BACKUPPATH}/${FILE} --totals ${WORLDPATHS} 2>&1 | grep -v "tar: Removing leading " + fi + echo -e "\e[39;1mbackup completed\e[0m\n" + + echo -n "Only keeping the last ${KEEP_BACKUPS} backups and removing the other ones..." + BACKUP_COUNT=$(for f in ${BACKUPPATH}/[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]*; do echo $f; done | wc -l) + if [ $(expr ${BACKUP_COUNT} - ${KEEP_BACKUPS}) -gt 0 ]; then + sudo -u ${MC_USER} rm $(for f in ${BACKUPPATH}/[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]*; do echo $f; done | head -n$(expr ${BACKUP_COUNT} - ${KEEP_BACKUPS})) + echo -e "\e[39;1m done\e[0m ($(expr ${BACKUP_COUNT} - ${KEEP_BACKUPS}) backup(s) pruned)" + else + echo -e "\e[39;1m done\e[0m (no backups pruned)" + fi +} + +# Run the given comman at the minecraft server console +server_command() { + if [ $# -lt 1 ]; then + echo "No server command specified. Try 'help' for a list of commands." exit 1 - fi - else - echo "Spigot already started" - exit 1 - fi - ;; - - stop) - sudo -u ${USER} tmux send-keys -t spigot-console 'broadcast NOTICE: Server shutting down in 5 seconds!' C-m - sleep 5 - sudo -u ${USER} tmux send-keys -t spigot-console 'stop' C-m - sleep 10 - ;; - - console) - sudo -u ${USER} tmux attach -t spigot-console - ;; - - backup) - stat_busy "Starting backup" - FILE="`date +%Y%m%d%H%M`.tar.gz" - path="$BACKUPPATH/$FILE" - su -s /bin/bash -c "mkdir -p $BACKUPPATH" ${USER} - save_stop - su -s /bin/bash -c "tar -czf $path $WORLDPATH" ${USER} - save_start - stat_done "Backup finished" - ;; - - *) - echo "usage: $0 {start|backup|console} user" + fi + + sudo -u ${MC_USER} screen -S ${SESSION_NAME} -Q select . > /dev/null + if [ $? -eq 0 ]; then + mc_command "$@" + tailf -n 0 ${LOGPATH}/latest.log & + TAILFPID=$! # Process id of tailf command + sleep 0.1 + kill ${TAILFPID} + else + echo "There is no ${SESSION_NAME} session to connect to." + fi +} + +# Enter the screen minecraft session +server_console() { + sudo -u ${MC_USER} screen -S ${SESSION_NAME} -Q select . > /dev/null + if [ $? -eq 0 ]; then + sudo -u ${MC_USER} screen -S ${SESSION_NAME} -rx + else + echo "There is no ${SESSION_NAME} session to connect to." + fi +} + +# Help function, no arguments required +help() { + cat << 'EOF' +This script was design to easily control any minecraft server. Quite every parameter for a given +minecraft server derivative can be altered by editing the variables at the top of this bash script. + +Usage: spigot {start|stop|status|backup|command <command>|console} + start Start the minecraft server + stop Stop the minecraft server + restart Restart the minecraft server + status Print some status information + backup Backup the world data + command <command> Run the given comman at the minecraft server console + console Enter the server console through a screen session + +Copyright (c) Gordian Edenhofer <gordian.edenhofer@gmail.com> +EOF +} + +case "$1" in + start) + server_start + ;; + + stop) + server_stop + ;; + + status) + server_status + ;; + + restart) + server_restart + ;; + + console) + server_console + ;; + + command) + server_command "${@:2}" + ;; + + backup) + backup_files + ;; + + *|-h|--help) + help esac exit 0 - |