mirror of
https://github.com/moparisthebest/SickRage
synced 2024-11-17 23:05:11 -05:00
Reworked the backup/restore to properly handle the cache directory
inclusion.
This commit is contained in:
parent
e0204d048e
commit
97ade6ad6c
23
SickBeard.py
23
SickBeard.py
@ -264,10 +264,10 @@ class SickRage(object):
|
|||||||
# Check if we need to perform a restore first
|
# Check if we need to perform a restore first
|
||||||
restoreDir = os.path.join(sickbeard.DATA_DIR, 'restore')
|
restoreDir = os.path.join(sickbeard.DATA_DIR, 'restore')
|
||||||
if self.consoleLogging and os.path.exists(restoreDir):
|
if self.consoleLogging and os.path.exists(restoreDir):
|
||||||
if self.restore(restoreDir, sickbeard.DATA_DIR):
|
if self.restoreDB(restoreDir, sickbeard.DATA_DIR):
|
||||||
sys.stdout.write("Restore successful...\n")
|
sys.stdout.write("Restore: restoring DB and config.ini successful...\n")
|
||||||
else:
|
else:
|
||||||
sys.stdout.write("Restore FAILED!\n")
|
sys.stdout.write("Restore: restoring DB and config.ini FAILED!\n")
|
||||||
|
|
||||||
# Load the config and publish it to the sickbeard package
|
# Load the config and publish it to the sickbeard package
|
||||||
if self.consoleLogging and not os.path.isfile(sickbeard.CONFIG_FILE):
|
if self.consoleLogging and not os.path.isfile(sickbeard.CONFIG_FILE):
|
||||||
@ -447,16 +447,17 @@ class SickRage(object):
|
|||||||
logger.ERROR)
|
logger.ERROR)
|
||||||
logger.log(traceback.format_exc(), logger.DEBUG)
|
logger.log(traceback.format_exc(), logger.DEBUG)
|
||||||
|
|
||||||
def restore(self, srcDir, dstDir):
|
def restoreDB(self, srcDir, dstDir):
|
||||||
try:
|
try:
|
||||||
for file in os.listdir(srcDir):
|
filesList = ['sickbeard.db', 'config.ini']
|
||||||
srcFile = os.path.join(srcDir, file)
|
|
||||||
dstFile = os.path.join(dstDir, file)
|
|
||||||
bakFile = os.path.join(dstDir, file + '.bak')
|
|
||||||
shutil.move(dstFile, bakFile)
|
|
||||||
shutil.move(srcFile, dstFile)
|
|
||||||
|
|
||||||
os.rmdir(srcDir)
|
for filename in filesList:
|
||||||
|
srcFile = os.path.join(srcDir, filename)
|
||||||
|
dstFile = os.path.join(dstDir, filename)
|
||||||
|
bakFile = os.path.join(dstDir, '{0}.bak-{1}'.format(filename, datetime.datetime.strftime(datetime.datetime.now(), '%Y%m%d_%H%M%S')))
|
||||||
|
if os.path.isfile(dstFile):
|
||||||
|
shutil.move(dstFile, bakFile)
|
||||||
|
shutil.move(srcFile, dstFile)
|
||||||
return True
|
return True
|
||||||
except:
|
except:
|
||||||
return False
|
return False
|
||||||
|
@ -631,6 +631,31 @@ def initialize(consoleLogging=True):
|
|||||||
logger.log(u"!!! Creating local cache dir failed, using system default", logger.ERROR)
|
logger.log(u"!!! Creating local cache dir failed, using system default", logger.ERROR)
|
||||||
CACHE_DIR = None
|
CACHE_DIR = None
|
||||||
|
|
||||||
|
# Check if we need to perform a restore of the cache folder
|
||||||
|
restoreDir = os.path.join(DATA_DIR, 'restore')
|
||||||
|
if os.path.exists(restoreDir):
|
||||||
|
def restoreCache(srcDir, dstDir):
|
||||||
|
import ntpath
|
||||||
|
import shutil
|
||||||
|
|
||||||
|
def path_leaf(path):
|
||||||
|
head, tail = ntpath.split(path)
|
||||||
|
return tail or ntpath.basename(head)
|
||||||
|
|
||||||
|
try:
|
||||||
|
if os.path.isdir(dstDir):
|
||||||
|
bakFilename = '{0}-{1}'.format(path_leaf(dstDir), datetime.datetime.strftime(datetime.datetime.now(), '%Y%m%d_%H%M%S'))
|
||||||
|
shutil.move(dstDir, os.path.join(ntpath.dirname(dstDir), bakFilename))
|
||||||
|
|
||||||
|
shutil.move(srcDir, dstDir)
|
||||||
|
logger.log(u"Restore: restoring cache successful", logger.INFO)
|
||||||
|
except Exception as e:
|
||||||
|
logger.log(u"Restore: restoring cache failed", logger.ERROR)
|
||||||
|
finally:
|
||||||
|
os.rmdir(restoreDir)
|
||||||
|
|
||||||
|
restoreCache(os.path.join(restoreDir, 'cache'), CACHE_DIR)
|
||||||
|
|
||||||
# clean cache folders
|
# clean cache folders
|
||||||
if CACHE_DIR:
|
if CACHE_DIR:
|
||||||
helpers.clearCache()
|
helpers.clearCache()
|
||||||
|
@ -1067,6 +1067,34 @@ def extractZip(archive, targetDir):
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def backupConfigZip(fileList, archive, arcname = None):
|
||||||
|
try:
|
||||||
|
a = zipfile.ZipFile(archive, 'w', zipfile.ZIP_DEFLATED)
|
||||||
|
for f in fileList:
|
||||||
|
a.write(f, os.path.relpath(f, arcname))
|
||||||
|
a.close()
|
||||||
|
return True
|
||||||
|
except Exception as e:
|
||||||
|
logger.log(u"Zip creation error: " + str(e), logger.ERROR)
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def restoreConfigZip(archive, targetDir):
|
||||||
|
try:
|
||||||
|
if not os.path.exists(targetDir):
|
||||||
|
os.mkdir(targetDir)
|
||||||
|
|
||||||
|
zip_file = zipfile.ZipFile(archive, 'r')
|
||||||
|
for member in zip_file.namelist():
|
||||||
|
zip_file.extract(member, targetDir)
|
||||||
|
zip_file.close()
|
||||||
|
return True
|
||||||
|
except Exception as e:
|
||||||
|
logger.log(u"Zip extraction error: " + str(e), logger.ERROR)
|
||||||
|
shutil.rmtree(targetDir)
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
def mapIndexersToShow(showObj):
|
def mapIndexersToShow(showObj):
|
||||||
mapped = {}
|
mapped = {}
|
||||||
|
|
||||||
|
@ -3599,11 +3599,14 @@ class ConfigBackupRestore(Config):
|
|||||||
source = [os.path.join(sickbeard.DATA_DIR, 'sickbeard.db'), sickbeard.CONFIG_FILE]
|
source = [os.path.join(sickbeard.DATA_DIR, 'sickbeard.db'), sickbeard.CONFIG_FILE]
|
||||||
target = os.path.join(backupDir, 'sickrage-' + time.strftime('%Y%m%d%H%M%S') + '.zip')
|
target = os.path.join(backupDir, 'sickrage-' + time.strftime('%Y%m%d%H%M%S') + '.zip')
|
||||||
|
|
||||||
for (dir, _, files) in os.walk(sickbeard.CACHE_DIR):
|
for (path, dirs, files) in os.walk(sickbeard.CACHE_DIR, topdown=True):
|
||||||
for f in files:
|
for dirname in dirs:
|
||||||
source.append(os.path.join(dir, f))
|
if path == sickbeard.CACHE_DIR and dirname not in ['images']:
|
||||||
|
dirs.remove(dirname)
|
||||||
|
for filename in files:
|
||||||
|
source.append(os.path.join(path, filename))
|
||||||
|
|
||||||
if helpers.makeZip(source, target):
|
if helpers.backupConfigZip(source, target, sickbeard.DATA_DIR):
|
||||||
finalResult += "Successful backup to " + target
|
finalResult += "Successful backup to " + target
|
||||||
else:
|
else:
|
||||||
finalResult += "Backup FAILED"
|
finalResult += "Backup FAILED"
|
||||||
@ -3623,7 +3626,7 @@ class ConfigBackupRestore(Config):
|
|||||||
source = backupFile
|
source = backupFile
|
||||||
target_dir = os.path.join(sickbeard.DATA_DIR, 'restore')
|
target_dir = os.path.join(sickbeard.DATA_DIR, 'restore')
|
||||||
|
|
||||||
if helpers.extractZip(source, target_dir):
|
if helpers.restoreConfigZip(source, target_dir):
|
||||||
finalResult += "Successfully extracted restore files to " + target_dir
|
finalResult += "Successfully extracted restore files to " + target_dir
|
||||||
finalResult += "<br>Restart sickrage to complete the restore."
|
finalResult += "<br>Restart sickrage to complete the restore."
|
||||||
else:
|
else:
|
||||||
|
Loading…
Reference in New Issue
Block a user