from pcsbackupinfo import * import zipfile import os import xml.dom.minidom def copyOssoBackupConfigFiles(destination, mountPath): """ Copy all osso-backup .conf files to the given path. The device must be already mounted in the mountPath. Attributes: - String mountPath - Path of the folder where the device is mounted - String destination - Destination folder path where config files should be copied to. """ os.system("cp %s/etc/osso-backup/applications/*.conf %s" % (mountPath, destination)) def mountDevice(user, ip, path): # Mount device file system using sshfs in the given path try: if not os.path.exists(path): createFolder(path) os.system('sshfs %s@%s:/ %s' % (user, ip, path)) except: raise Exception("Error while mounting device file system") def unmountDevice(path): try: os.system('fusermount -uz %s' % path) except: raise Exception("Error while unmounting device file system") def createFolder(complete_path): if not os.path.exists(complete_path): os.makedirs(complete_path) # FIXME return True def removePath(complete_path): for entry in os.listdir(complete_path): if os.path.isdir(entry): removePath(os.path.join(complete_path, entry)) else: os.remove(os.path.join(complete_path, entry)) os.rmdir(complete_path) def getDeviceBackupList(mountPoint): """This function return a list of backupInfo objects for each backup found in the mount point. """ deviceBackups = [] mmc1 = '%s/media/mmc1/backups' % mountPoint mmc2 = '%s/media/mmc2/backups' % mountPoint if os.path.exists(mmc1): deviceBackups += _getDeviceBackupsInfo(mmc1) if os.path.exists(mmc2): deviceBackups += _getDeviceBackupsInfo(mmc2) return deviceBackups def copy(original, destination): original = original.replace(" ", "\ ") destination = destination.replace(" ", "\ ") createFolder(destination) os.system("cp %s %s" % (original, destination)) def getSize(path): if not os.path.exists(path): return False if os.path.isdir(path): files_and_folders = os.listdir(path) sum_size = 0 for entry in files_and_folders: if os.path.isdir(os.path.join(path, entry)): sum_size += getSize(os.path.join(path, entry)) else: try: sum_size += os.stat(os.path.join(path, entry)).st_size except: sum_size += 1 return sum_size else: return os.stat(path).st_size def getBackupFilesPath(backupPath): dic = {} for entry in os.listdir(backupPath): if entry.endswith(".zip"): zip = openZip(os.path.join(backupPath, entry)) dic[entry.replace(".zip", "")] = zip.namelist() return dic def getBackupCategories(backupInfo): backupPath = str(backupInfo.path) if not backupInfo.fromDevice: backupPath = os.path.join(backupPath, str(backupInfo._name)) categoriesList = [] for entry in os.listdir(backupPath): if entry.endswith(".zip"): categoriesList.append(entry.replace(".zip", "")) return categoriesList def writeBackupFilesPath(paths_dictionary, file_path): try: file = open(file_path, "w") except: return False for category in paths_dictionary.keys(): file.write("[" + category + "]\n") for path in paths_dictionary[category]: file.write(path + "\n") file.close() def openZip(zipPath, mode="r"): """ Open a .zip file using python ZipFile library. Attributes: String zipPath - The directory path to the file String mode - "w" to open file for writting. "a" to open file for appending. "r" to open file for reading. """ try: zip = zipfile.ZipFile(zipPath, mode) return zip except zipfile.BadZipfile, msg: raise IOError("Problem while opening %s: %s" % (zipPath, msg)) except: raise def closeZip(zipfile): zipfile.close() def zip(zipfile, path): # Compress the file in the given path to the zipfile try: zipfile.write(path.encode('UTF')) return True except: return False def rebootDevice(deviceIp): return os.system("ssh root@%s reboot" % deviceIp) == 0 def _parseMetadata(metadata_path): document = xml.dom.minidom.parse(metadata_path) node = document.getElementsByTagName("size")[0] size = int(str(node.firstChild.nodeValue)) node = document.getElementsByTagName("timestamp")[0] objDate = datetime.fromtimestamp(float(str(node.firstChild.nodeValue))) return size, str(objDate) def _getDeviceBackupsInfo(memoryCardPath): deviceBackups = [] for backup in os.listdir(memoryCardPath): temporaryFolder = os.path.join(memoryCardPath, backup) if os.path.isdir(temporaryFolder): metadataPath = os.path.join(temporaryFolder,'backup.metadata') if os.path.exists(metadataPath): size, date = _parseMetadata(metadataPath) backupInfo = PcsBackupInfo(backup, temporaryFolder, size) backupInfo.setDate(date) deviceBackups.append(backupInfo) return deviceBackups