#!/usr/bin/python import os, sys, shutil, filecmp, time #convert the standard time to pacific local time, not important but makes it easier for me to test def getPacificTime(): timeStruct = time.gmtime() hour = None if timeStruct[3] < 8: hour = 24-(8-timeStruct[3]) else: hour = timeStruct[3]-8 timeTuple = hour, timeStruct[4], timeStruct[5] return timeTuple def backup_files(folderPath, destPath="/usr/backups"): MAXBACKUPS = 20 #if the folderPath is a file, just copy it over. no need for fancy stuff if os.path.isfile(folderPath): shutil.copy2(folderPath, destPath) return true fufilled = False #if folderPath is written with a "\" at the end, remove it folderPath = folderPath.rstrip(os.sep) #acquire the destFolder, the function takes the folder name of folderPath and creates a folder in the destPath with a number attached to it for i in range(MAXBACKUPS): destPathTest = os.path.join(destPath,(os.path.basename(folderPath) + str(i))) if not os.path.exists(destPathTest): fufilled = True destPath = destPathTest break #if there are MAXBACKUPS number of folders than it cycles through again until it gets to the folder that is the oldest, it then deletes the folder contents and makes the destPath the empty folder if not fufilled: for i in range(MAXBACKUPS): destPathTest = os.path.join(destPath,(os.path.basename(folderPath) + str(i))) fmTime = os.path.getmtime(destPathTest) destPathTest = os.path.join(destPath,(os.path.basename(folderPath) + str(i+1))) if not os.path.exists(destPathTest): destPathTest = os.path.join(destPath,(os.path.basename(folderPath) + str(0))) ldTime = os.path.getmtime(destPathTest) if ldTime < fmTime: destPath = destPathTest shutil.rmtree(destPath) break os.mkdir(destPath) #walks through the entire directory tree of the folderPath and copies it over to destPath for root,dirs,files in os.walk(folderPath): curDestPath = os.path.join(destPath, root[len(folderPath)+1:]) if not os.path.exists(curDestPath): os.mkdir(curDestPath) for s in dirs: os.mkdir(os.path.join(curDestPath, s)) for s in files: tempSrc = os.path.join(root, s) tempDest = os.path.join(curDestPath, s) if os.path.exists(tempSrc): shutil.copy2(tempSrc, tempDest) else: msg = "error: " + tempSrc + " doesnt exist" print msg SERVERPATH ="/home/theman515/SigmaServer/world" SCREEN = "625.minecraft" #main loop checks to see if the time to backup the world file is now and to see if the server crashed (we were running plus+ modpack, it happened a lot) #this assumes you're running your minecraft server through a gnu screen using a launch script named "launch" without the quotes while(1): timeStruct = getPacificTime() if (timeStruct[0] == 4 and timeStruct[1] == 0 and timeStruct[2] == 0) or (timeStruct[0] == 16 and timeStruct[1] == 0 and timeStruct[2] == 0): print "alerting the server, 60 seconds" curTime = time.time() os.system("screen -S " + SCREEN + " -p 0 -X stuff \"/say server is shutting down in 60 seconds\015\"") while time.time()-curTime<=30: pass os.system("screen -S " + SCREEN + " -p 0 -X stuff \"/say server is shutting down in 30 seconds\015\"") while time.time()-curTime <= 50: pass os.system("screen -S " + SCREEN + " -p 0 -X stuff \"/say server is shutting down in 10 seconds\015\"") while time.time()-curTime <= 60: pass print "shutting down the server" os.system("screen -S " + SCREEN + " -p 0 -X stuff \"stop\015\"") print "backing up the server" backup_files(SERVERPATH) curTime = time.time() while time.time()-curTime < 10: pass print "relaunching the server" os.system("screen -S " + SCREEN + " -p 0 -X stuff \"./launch\015\"") print "done" fil = os.popen("ps -e") output = "" #gets all the output from os.popen while True: stri = fil.readline() output += stri if stri == "": break if output.find("launch") == -1: msg = "server crashed, restarting" print msg os.system("screen -S " + SCREEN + " -p 0 -X stuff \"./launch\015\"") curTime = time.time() while time.time() -curTime < 1: pass