-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