Initial commit (Vesion 0.1)
[tablet-suite] / src / backup / .svn / text-base / pcsbackupmanager.py.svn-base
diff --git a/src/backup/.svn/text-base/pcsbackupmanager.py.svn-base b/src/backup/.svn/text-base/pcsbackupmanager.py.svn-base
new file mode 100644 (file)
index 0000000..92a5cc7
--- /dev/null
@@ -0,0 +1,168 @@
+import os
+
+from PyQt4.QtCore import *
+from zipfile import *
+
+import pcsbackuputils as utils
+
+
+HOME = os.path.expanduser("~")
+USER_HOST = "root"
+DEVICES_POINT = "%s/.pcsuite/devices/" % HOME
+
+
+class PcsBackupManager(QObject):
+
+    def __init__(self):
+        QObject.__init__(self)
+        self._backupList = []
+
+    def loadBackups(self):
+        return False
+
+    def saveBackups(self):
+        return False
+
+    def getBackupList(self):
+        return None
+    
+    def createBackup(self, backup_name, path, host_ip, categories, comment=""):
+        return False
+
+    def removeBackup(self, backup_name):
+        return False
+
+    def getBackupInfo(self, backupName):
+        return None
+    
+    def renameBackup(self, backupName, newName):
+        return False
+    
+    def changeBackupComment(self, backupName, new_comment):
+        return False
+    
+    def listBackupContent(self, backupName):
+        content = []
+        backupInfo = self.getBackupInfo(backupName)
+        backupPath = backupInfo.getPath()
+        fullPath = os.path.join(str(backupPath), str(backupName))
+        
+        for entry in os.listdir(fullPath):
+            if entry.endswith(".zip"):
+                zipfile = utils.openZip(os.path.join(fullPath, entry), "r")
+                for member in zipfile.namelist():
+                    folders = member.split("/")
+                    memberName = "../" + "/".join([folders[-2], folders[-1]])
+                    content.append(memberName)
+        return content
+    
+    def restoreBackup(self, backupInfo, host_ip, categories):
+        """ Restore a PC backup to device with given IP address.
+        
+        Attributes:
+        String backupInfo - Object representing the backup
+        String host_ip - IP address of device.
+        Dictionary categories - dictionary with categories as keys and with
+                            value True if that category should be restored.
+                            
+        """
+        self.setRestoreInProgress(True)
+        # Set restore needed paths
+        devicePath = os.path.join(DEVICES_POINT, "%s" % host_ip)
+        mountPath = os.path.join(devicePath, "Root" )
+        tempPath = os.path.join(mountPath, "tmp/paths")
+        restScriptsPath = ("/etc/osso-backup/restore.d/always")
+        try:
+            utils.mountDevice(USER_HOST, host_ip, mountPath)
+            # Get backup location depending from backup source
+            if backupInfo == None:
+                return False
+            if backupInfo.fromDevice:
+                backup_path = backupInfo.getPath()
+            else:
+                backup_path = os.path.join(str(backupInfo.getPath()), 
+                                           str(backupInfo.getName()))
+            # Get backup files list for each category and write it on a file
+            # that will be needed by restore scripts.
+            pathsDictonary = utils.getBackupFilesPath(backup_path)
+            if utils.writeBackupFilesPath(pathsDictonary, tempPath) == False:
+                return False
+            # --- Initialize restore progress ---
+            currentSize = 0
+            # Get total number of files to restore
+            numberOfFiles = 0
+            for categ in pathsDictonary:
+                for file in pathsDictonary[categ]:
+                    numberOfFiles += 1
+            # Get size of all categories being restored
+            totalSize = 0
+            for file in os.listdir(backup_path):
+                if file.endswith(".zip"):
+                    categ = file[:-4]
+                    if categories[categ]:
+                        catPath = os.path.join(backup_path, file)
+                        zip = utils.openZip(catPath)
+                        for member in zip.namelist():
+                            totalSize += zip.getinfo(member).file_size
+            # Extract zip files to device
+            for entry in os.listdir(backup_path):
+                category = entry[:-4]
+                if entry.endswith(".zip") and categories[category]:
+                    zipPath = os.path.join(backup_path, entry)
+                    zip = utils.openZip(zipPath)
+                    # Update restore progress, extract current f print "member %s: %.2f" % (member, zip.getinfo(member).file_size)ile and emit
+                    # progress sinal
+                    for member in zip.namelist():
+                        if not self.restoreInProgress:
+                            return 0
+                        percentage = "%.1f" % self.computePercentage(totalSize,
+                                                                currentSize)
+                        
+                        status = (percentage, category, numberOfFiles, totalSize)
+                        self.emit(SIGNAL("restoreProgress"), status)
+                        zip.extract(member, devicePath)
+                        currentSize += zip.getinfo(member).file_size
+                    percentage = "%.1f" % ((currentSize / float(totalSize)) * 100)
+                    status = (percentage, category, numberOfFiles, totalSize)
+                    self.emit(SIGNAL("restoreProgress"), status)
+                    zip.close()
+            # Execute restore scripts
+            os.system("ssh %s@%s ..%s/*.sh %s" % (USER_HOST, host_ip, 
+                                                  restScriptsPath, tempPath))
+            self.setRestoreInProgress(False)
+            # --- Restore finished ---
+        finally:
+            utils.unmountDevice(mountPath)
+            
+    
+    def computePercentage(self, totalSize, currentSize):
+        if totalSize == 0:
+            percentage = 100
+        else:
+            percentage = (currentSize / float(totalSize)) * 100
+            if percentage > 100:
+                percentage = 100
+        return percentage
+    
+    def copy(self, sourcePath, destinationPath):
+        numberOfFiles = 0
+        for entry in os.listdir(sourcePath):
+            zipPath = os.path.join(sourcePath, entry)
+            if zipPath.endswith(".zip"):
+                zip = utils.openZip(zipPath)
+                numberOfFiles += len(zip.namelist())
+        totalSize = float(utils.getSize(sourcePath))
+        currentSize = 0
+        self.emit(SIGNAL("copyProgress"), ("0.00", numberOfFiles, totalSize))
+        for entry in os.listdir(sourcePath):
+            if not self.copyInProgress:
+                utils.removePath(destinationPath)
+                return 0
+            entryPath = os.path.join(sourcePath, entry)
+            utils.copy(entryPath, destinationPath)
+            currentSize += utils.getSize(entryPath)
+            progress = "%.2f" % ((currentSize / totalSize) * 100)
+            self.emit(SIGNAL("copyProgress"), (progress, numberOfFiles,
+                                                    totalSize))
+            
+    
\ No newline at end of file