Created
June 7, 2020 20:48
-
-
Save ColeMundus/9da3ba1cd9e5bd47e6218d1070c7cf07 to your computer and use it in GitHub Desktop.
This file contains 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
import subprocess, argparse, time, os, math | |
from datetime import date, datetime | |
from mcrcon import MCRcon | |
parser = argparse.ArgumentParser() | |
parser.add_argument('--target', help='Path to target backup directory', required=True) | |
parser.add_argument('--server', help='Server IP address', required=True) | |
parser.add_argument('--password', help='Server rcon password', required=True) | |
parser.add_argument('--output', help='Path to backups output directory', required=True) | |
parser.add_argument('--command_logging', help='Flag to control command logging', default=True) | |
args = parser.parse_args() | |
command_logging = args.command_logging | |
if args.output[-1] == '/': | |
output_directory = args.output | |
else: | |
output_directory = args.output + '/' | |
# helper functions | |
def log(*args): | |
if command_logging: | |
print('\u001b[32m'+ args[0], *args[1:]) | |
def convert_size(size_bytes): | |
if size_bytes == 0: | |
return "0B" | |
size_name = ("B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB") | |
i = int(math.floor(math.log(size_bytes, 1024))) | |
p = math.pow(1024, i) | |
s = round(size_bytes / p, 2) | |
return "%s %s" % (s, size_name[i]) | |
log('# Starting minecraft server backup script') | |
log('# Target backup directory:', args.target) | |
log('# Connecting to running server') | |
log('# Starting rcon client') | |
with MCRcon(args.server, args.password) as mcr: | |
log('# Connected') | |
log('# Sending save command') | |
response = mcr.command('say Starting Server Backup') | |
response = mcr.command('save-all') | |
response = mcr.command('save-off') | |
log('# Sleeping to allow save to complete') | |
time.sleep(4) | |
log('# Save complete') | |
log('# Starting directory backup') | |
now = datetime.now() | |
filename = now.strftime("%Y-%m-%d_%H.%M_") + args.server + '_' + args.target.split("/")[-2] + '_server_backup.tar.gz' | |
log('# Archiving to', filename) | |
start_time = time.time() | |
subprocess.run(['tar', '-cvzf', output_directory + filename, args.target]) | |
time_elapsed = time.strftime('%M:%S', time.gmtime(time.time()-start_time)) | |
backup_size = convert_size(os.stat(output_directory + filename).st_size) | |
log('# Backup size:', backup_size) | |
log('# Backup completed in ' + time_elapsed + ', re-enabling autosave') | |
response = mcr.command('save-on') | |
response = mcr.command('say Server Backup Complete, §oTime Elapsed: ' + time_elapsed + ", §oBackup §oSize: §o" + backup_size) | |
log('# Done', '\u001b[0m') |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment