ansible/roles/minecraft/templates/recover.sh
2020-06-25 08:51:17 -05:00

49 lines
1.4 KiB
Bash

#! /bin/sh
#
# recover.sh
# Recover a Minecraft world save from our S3 bucket
# Copyright (C) 2020 Vintage Salt <rehashedsalt@cock.li>
#
# Distributed under terms of the MIT license.
#
set -e
# Get to our magic dir
export MINECRAFT_DIR="/var/minecraft/{{ mcname }}"
cd "$MINECRAFT_DIR" || exit 50
# If the world directory exists, we need to ensure that we don't clobber it
if [ -d "world" ]; then
echo "Backing up current world"
tar --force-local czf "recover-world-$(date -Iseconds).tar.gz" world --remove-files
fi
# If it STILL exists, then we have a problem
if [ -d "world" ]; then
echo "World was found to exist after tarring; bailing"
exit 51
fi
# Get our latest good backup
backup="$(aws s3 ls "s3://{{ aws_backup_bucket }}/{{ mcname }}/" | tail -n 1 | awk '{print $4}')"
echo "Restoring backup: $backup"
aws s3 cp "s3://{{ aws_backup_bucket }}/{{ mcname }}/$backup" world.tgz
# Decompress it
tar xzf world.tgz
# Find the world
worlddir="$(find . -type d -name "world" | head -n 1)"
# Move it in place
mv "$worlddir" .
# Verify our work
if [ -f "world/level.dat" ]; then
echo "Recovered from backup: $backup"
else
echo "Failed to recover from backup: $backup"
fi
# Remove the var dir, if it exists, because that's what it ends up being named
if [ -d "var" ]; then
# Never use relative paths with rm in a script
# That's heresy
rm -rf "/var/minecraft/{{ mcname }}/var"
fi