Skip to content

Instantly share code, notes, and snippets.

@ictrobot
Created December 9, 2018 00:18
Show Gist options
  • Save ictrobot/9b67c7eb0182c9b9ab29b24872120c58 to your computer and use it in GitHub Desktop.
Save ictrobot/9b67c7eb0182c9b9ab29b24872120c58 to your computer and use it in GitHub Desktop.
#! /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