From af11c1a9901c89c480e1b43f1632e9227b00d430 Mon Sep 17 00:00:00 2001 From: Rob Weber Date: Thu, 9 May 2013 14:24:10 -0500 Subject: [PATCH] check for advanced settings and restart xbmc to continue (#30) --- resources/lib/backup.py | 58 ++++++++++++++++++++++++++++++----------- scheduler.py | 28 +++++++++++++++++++- 2 files changed, 70 insertions(+), 16 deletions(-) diff --git a/resources/lib/backup.py b/resources/lib/backup.py index 2c918bc..2edf38b 100644 --- a/resources/lib/backup.py +++ b/resources/lib/backup.py @@ -24,7 +24,8 @@ class XbmcBackup: fileManager = None restore_point = None - + skip_advanced = False #if we should check for the existance of advancedsettings in the restore + def __init__(self): self.xbmc_vfs = XBMCFileSystem(xbmc.translatePath('special://home')) @@ -58,6 +59,9 @@ class XbmcBackup: def selectRestore(self,restore_point): self.restore_point = restore_point + def skipAdvanced(self): + self.skip_advanced = True + def run(self,mode=-1,runSilent=False): #append backup folder name progressBarTitle = utils.getString(30010) + " - " @@ -184,6 +188,38 @@ class XbmcBackup: fileManager = FileManager(self.remote_vfs) #go through each of the user selected items and write them to the backup store + + if(utils.getSetting("backup_config") == "true"): + #check for the existance of an advancedsettings file + if(self.remote_vfs.exists(self.remote_vfs.root_path + "userdata/advancedsettings.xml") and not self.skip_advanced): + #let the user know there is an advanced settings file present + restartXbmc = xbmcgui.Dialog().yesno("Advanced Settings Detected","The advancedsettings file should be restored first","Select Yes to restore this file and restart XBMC", "Select No to continue") + + if(restartXbmc): + #add only this file to the file list + fileManager.addFile(self.remote_vfs.root_path + "userdata/advancedsettings.xml") + self.backupFiles(fileManager.getFiles(),self.remote_vfs,self.xbmc_vfs) + + #let the service know to resume this backup on startup + self._createResumeBackupFile() + + #do not continue running + xbmcgui.Dialog().ok("Restart XBMC","You should restart XBMC to continue") + + return + + self.xbmc_vfs.mkdir(xbmc.translatePath('special://home/userdata/keymaps')) + fileManager.walkTree(self.remote_vfs.root_path + "userdata/keymaps") + + self.xbmc_vfs.mkdir(xbmc.translatePath('special://home/userdata/peripheral_data')) + fileManager.walkTree(self.remote_vfs.root_path + "userdata/peripheral_data") + + #this part is an oddity + dirs,configFiles = self.remote_vfs.listdir(self.remote_vfs.root_path + "userdata/") + for aFile in configFiles: + if(aFile.endswith(".xml")): + fileManager.addFile(self.remote_vfs.root_path + "userdata/" + aFile) + if(utils.getSetting('backup_addons') == 'true'): self.xbmc_vfs.mkdir(xbmc.translatePath('special://home/addons')) fileManager.walkTree(self.remote_vfs.root_path + "addons") @@ -206,19 +242,6 @@ class XbmcBackup: self.xbmc_vfs.mkdir(xbmc.translatePath('special://home/userdata/Thumbnails')) fileManager.walkTree(self.remote_vfs.root_path + "userdata/Thumbnails") - if(utils.getSetting("backup_config") == "true"): - self.xbmc_vfs.mkdir(xbmc.translatePath('special://home/userdata/keymaps')) - fileManager.walkTree(self.remote_vfs.root_path + "userdata/keymaps") - - self.xbmc_vfs.mkdir(xbmc.translatePath('special://home/userdata/peripheral_data')) - fileManager.walkTree(self.remote_vfs.root_path + "userdata/peripheral_data") - - #this part is an oddity - dirs,configFiles = self.remote_vfs.listdir(self.remote_vfs.root_path + "userdata/") - for aFile in configFiles: - if(aFile.endswith(".xml")): - fileManager.addFile(self.remote_vfs.root_path + "userdata/" + aFile) - #add to array self.filesTotal = fileManager.size() allFiles.append({"source":self.remote_vfs.root_path,"dest":self.xbmc_vfs.root_path,"files":fileManager.getFiles()}) @@ -329,11 +352,16 @@ class XbmcBackup: def _createValidationFile(self): vFile = xbmcvfs.File(xbmc.translatePath(utils.data_dir() + "xbmcbackup.val"),'w') - vFile.write("XBMC Backup Validation File"); + vFile.write("XBMC Backup Validation File") vFile.close() self.remote_vfs.put(xbmc.translatePath(utils.data_dir() + "xbmcbackup.val"),self.remote_vfs.root_path + "xbmcbackup.val") + def _createResumeBackupFile(self): + rFile = xbmcvfs.File(xbmc.translatePath(utils.data_dir() + "resume.txt"),'w') + rFile.write(self.restore_point) + rFile.close() + class FileManager: fileArray = [] not_dir = ['.zip','.xsp','.rar'] diff --git a/scheduler.py b/scheduler.py index 882bc81..3d45c33 100644 --- a/scheduler.py +++ b/scheduler.py @@ -1,4 +1,6 @@ import xbmc +import xbmcvfs +import xbmcgui import datetime import time import os @@ -10,6 +12,7 @@ class BackupScheduler: monitor = None enabled = "false" next_run = 0 + restore_point = None def __init__(self): self.monitor = UpdateMonitor(update_method = self.settingsChanged) @@ -25,6 +28,17 @@ class BackupScheduler: utils.log("scheduler will run again on " + datetime.datetime.fromtimestamp(self.next_run).strftime('%m-%d-%Y %H:%M')) def start(self): + + #check if a backup should be resumed + resumeRestore = self._resumeCheck() + + if(resumeRestore): + restore = XbmcBackup() + restore.selectRestore(self.restore_point) + #skip the advanced settings check + restore.skipAdvanced() + restore.run(XbmcBackup.Restore) + while(not xbmc.abortRequested): if(self.enabled == "true"): @@ -92,7 +106,19 @@ class BackupScheduler: #first day of month cron_exp = "0 " + str(hour_of_day) + " 1 * *" - return cron_exp + return cron_exp + + def _resumeCheck(self): + shouldContinue = False + if(xbmcvfs.exists(xbmc.translatePath(utils.data_dir() + "resume.txt"))): + rFile = xbmcvfs.File(xbmc.translatePath(utils.data_dir() + "resume.txt"),'r') + self.restore_point = rFile.read() + rFile.close() + xbmcvfs.delete(xbmc.translatePath(utils.data_dir() + "resume.txt")) + shouldContinue = xbmcgui.Dialog().yesno("Resume Restore","XBMC Backup has detected an unfinished restore","Would you like to continue?") + + return shouldContinue + class UpdateMonitor(xbmc.Monitor): update_method = None