Created
December 9, 2018 00:18
-
-
Save ictrobot/9b67c7eb0182c9b9ab29b24872120c58 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#! /bin/bash | |
#Starts MC Servers | |
# server.conf format: | |
# mem | |
# ramdisk | |
# parm | |
# prelaunch | |
cd "/home/minecraft" || exit | |
list=$(ls -d */ | grep -v "Backups" | grep -v "Old" | grep -v "logs" | grep -v "bbackup" | grep -v "mount" | sed -e's/[/]//') | |
readarray -t servers <<<"$list" | |
files=( "world-disk/" "config/" "server.properties" "server.jar" "scripts/" "resources/" "mods/" "libraries/" ) | |
time="$(date +'%d-%m-%y %H-%M-%S')" | |
export BORG_PASSPHRASE="Minecraft" | |
function mc_ramsync() { | |
echo "$server: Copying files to disk" | |
if [ -f "/home/minecraft/$server/.server-running" ]; then | |
rsync -avh --delete "/mnt/minecraft/$server/" "/home/minecraft/$server/world-disk" | |
else | |
echo "Server not running, not ram syncing" | |
fi | |
} | |
function mc_ramdisk() { | |
ramdisk=$(sed -n '2p' "$(pwd)/$server/server.conf") | |
rm -rf "$server/world" | |
if [ $ramdisk == "true" ]; then | |
echo "Mounting $server world in ramdisk" | |
rsync -ah --info=progress2 "$server/world-disk/" "/mnt/minecraft/$server/" | |
chmod -R 744 "/mnt/minecraft/$server" | |
ln -sT "/mnt/minecraft/$server/" "$(realpath $server/world)" | |
else | |
echo "Not mounting $server world in ramdisk" | |
ln -sT "$(realpath $server/world-disk/)" "$(realpath $server/world)" | |
rm -rf "/mnt/minecraft/$server/" > /dev/null 2>&1 #Remove world from ramdisk (if its there), to stop syncing | |
fi | |
echo "" | |
} | |
function mc_backup() { | |
echo "$server: Backing up..." | |
server_files="" | |
for f in "${files[@]}" | |
do | |
if [ -d "$server/$f" ] || [ -f "$server/$f" ]; then | |
server_files="$server_files \"$(pwd)/$server/$f\"" | |
fi | |
done | |
command_backup="borg create -v --stats \"$(pwd)/bbackup/::$server|$time\" $server_files" | |
echo "$command_backup" | |
eval "$command_backup" | |
} | |
function prune_backups() { | |
command_prune="borg prune \"$(pwd)/bbackup/\" -v --list --prefix \"$server|\" --keep-last=192 --keep-hourly=48 --keep-daily=30 --keep-monthly=12 --keep-yearly=3" | |
echo "$command_prune" | |
eval "$command_prune" | |
} | |
function mc_start() { | |
server_dir=$"$(pwd)/$server" | |
server_screen=`echo MC$server | sed -e's/[ ]//g'` | |
ram=$(sed -n '1p' "$(pwd)/$server/server.conf") | |
parm=$(sed -n '3p' "$(pwd)/$server/server.conf") | |
prelaunch=$(sed -n '5p' "$(pwd)/$server/server.conf") | |
echo "Starting $server ($server_screen) server, with $ram ram" | |
echo "Name: $server" >> Servers.txt | |
echo "Ram: $ram" >> Servers.txt | |
echo "Parameters: $parm" >> Servers.txt | |
echo "Pre-Launch: $prelaunch" >> Servers.txt | |
echo "Screen: $server_screen" >> Servers.txt | |
echo "Dir: $server_dir" >> Servers.txt | |
echo " " >> Servers.txt | |
screen -S "$server_screen" -X quit >/dev/null 2>&1 | |
screen -S "$server_screen" -d -m | |
mc_command "cd \"$server_dir\"" | |
if [ ! -z "$prelaunch" ]; then | |
mc_command "$prelaunch" | |
fi | |
mc_command "touch .server-running; java -Xmx$ram -Xms$ram $parm -jar server.jar nogui; rm .server-running; date" | |
} | |
function mc_stop() { | |
mc_command "stop" | |
sleep 5 | |
server_screen=`echo MC$server | sed -e's/[ ]//g'` | |
screen -S "$server_screen" -X quit >/dev/null 2>&1 | |
rm -rf "/mnt/minecraft/$server" > /dev/null 2>&1 | |
rm -rf "$server/world" > /dev/null 2>&1 | |
} | |
function mc_before() { | |
echo "$server: Saving the world" | |
#mc_command "say Saving the world for backup" | |
mc_command "save-off" | |
mc_command "save-all" | |
sleep 5 | |
} | |
function mc_after() { | |
echo "$server: Resuming world saving" | |
mc_command "save-on" | |
#mc_command "say Backup finished" | |
} | |
function mc_command() { | |
server_screen=$(echo MC$server | sed -e's/[ ]//g') | |
eval "screen -S \"$server_screen\" -X stuff '$1^M'" | |
sleep 0.05 | |
} | |
function cmd_start() { | |
for server in "${servers[@]}" | |
do | |
mc_backup | |
mc_ramdisk | |
mc_start | |
done | |
} | |
function cmd_stop() { | |
cmd_sync | |
for server in "${servers[@]}" | |
do | |
mc_stop | |
done | |
rm Servers.txt > /dev/null 2>&1 | |
} | |
function cmd_backup() { | |
for server in "${servers[@]}" | |
do | |
ramdisk=$(sed -n '2p' "$(pwd)/$server/server.conf") | |
if [ $ramdisk == "true" ]; then | |
mc_before | |
mc_ramsync | |
mc_backup | |
mc_after | |
else | |
mc_before | |
mc_backup | |
mc_after | |
fi | |
echo "" | |
done | |
} | |
function cmd_prune_backups() { | |
readarray -t backups <<< $(borg list "$(pwd)/bbackup" --short | cut -d"|" -f1 | sort -u ) | |
for server in "${backups[@]}" | |
do | |
printf "\nPruning $server\n\n" | |
prune_backups | |
done | |
} | |
function cmd_sync() { | |
for server in "${servers[@]}" | |
do | |
ramdisk=$(sed -n '2p' "$(pwd)/$server/server.conf") | |
if [[ $ramdisk == "true" ]]; then | |
mc_before | |
mc_ramsync | |
mc_after | |
else | |
echo "Skipping $server server as ramdisk is disabled" | |
fi | |
echo "" | |
done | |
} | |
case $1 in | |
start) | |
cmd_start | |
;; | |
stop) | |
cmd_stop | |
;; | |
restart) | |
cmd_stop | |
cmd_start | |
;; | |
backup) | |
cmd_backup | |
;; | |
prune_backups) | |
cmd_prune_backups | |
;; | |
sync) | |
cmd_sync | |
;; | |
*) | |
echo "Usage $0 {start|stop|restart|backup|prune_backups|sync}" | |
exit 1 | |
;; | |
esac | |
exit 0 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment