def create_image(self): """ """ device = Device(self.device_path) disk = Disk(device) if device.is_disk(): mbr = Mbr(self.target_path) mbr.save_to_file(self.device_path) dlm = DiskLayoutManager(self.target_path) dlm.save_to_file(disk) partition_list = disk.get_valid_partitions() total_bytes = 0 for p in partition_list: total_bytes += p.filesystem.get_used_size() total_blocks = long(math.ceil(total_bytes/float(BLOCK_SIZE))) self._print_informations(total_bytes) information = Information(self.target_path) information.set_image_is_disk(device.is_disk()) information.set_image_name(self.image_name) information.set_image_total_bytes(total_bytes) information.set_image_compressor_level(self.compressor_level) compressor = Compressor(self.compressor_level) progress = Progress(total_blocks) progress.start() for p in partition_list: number = p.get_number() uuid = p.filesystem.uuid() type = p.filesystem.type information.add_partition(number, uuid, type) p.filesystem.open_to_read() file_name = FILE_PATTERN % (self.image_name, number) with open(self.target_path + file_name, 'wb') as f: # TODO: Work with parallelism while True: # Ugly data = p.filesystem.read(BLOCK_SIZE) if not len(data): break cdata = compressor.compact(data) f.write(cdata) progress.increment(1) p.filesystem.close() swap = disk.get_swap_partition() if swap is not None: number = swap.get_number() uuid = swap.filesystem.uuid() type = swap.filesystem.type information.add_partition(number, uuid, type) information.save() progress.stop() print "completed."
def restore_image(self): """ """ information = Information(self.image_path) information.load() image_name = information.get_image_name() compressor_level = information.get_image_compressor_level() total_bytes = information.get_image_total_bytes() total_blocks = long(math.ceil(total_bytes / float(BLOCK_SIZE))) compressor = Compressor(compressor_level) device = Device(self.target_device) if device.is_disk() != \ information.get_image_is_disk(): raise ErrorRestoringImage("Invalid target dispositive") try: disk = Disk(device) except _ped.DiskLabelException: try: device.fix_disk_label() disk = Disk(device) except: raise ErrorRestoringImage("Unrecognized disk label") if information.get_image_is_disk(): mbr = Mbr(self.image_path) mbr.restore_from_file(self.target_device) dlm = DiskLayoutManager(self.image_path) dlm.restore_from_file(disk) self._print_informations(total_bytes, image_name) progress = Progress(total_blocks) progress.start() partitions = information.get_partitions() for p in partitions: if information.get_image_is_disk(): partition = disk.get_partition_by_number(p.number, p.type) else: parent_path = get_parent_path(self.target_device) parent_device = Device(parent_path) parent_disk = Disk(parent_device) partition = parent_disk.get_partition_by_path( self.target_device, p.type) if partition is None: raise ErrorRestoringImage("No valid partitions found") if p.uuid is not None: partition.filesystem.open_to_write(p.uuid) else: partition.filesystem.open_to_write() if partition.filesystem.is_swap(): continue file_name = FILE_PATTERN % (image_name, p.number) with open(self.image_path + file_name, 'rb') as f: # TODO: Work with parallelism while True: # Ugly header = f.read(compressor.get_header_size()) if not len(header): break size = compressor.read_block_header(header) cdata = f.read(size) data = compressor.extract(cdata) partition.filesystem.write(data) progress.increment(1) partition.filesystem.close() progress.stop() print "completed."
def restore_image(self): """ """ information = Information(self.image_path) information.load() image_name = information.get_image_name() compressor_level = information.get_image_compressor_level() total_bytes = information.get_image_total_bytes() total_blocks = long(math.ceil(total_bytes/float(BLOCK_SIZE))) device = Device(self.target_device) if device.is_disk() != \ information.get_image_is_disk(): raise ErrorRestoringImage("Invalid target dispositive") try: disk = Disk(device) except _ped.DiskLabelException: try: device.fix_disk_label() disk = Disk(device) except: raise ErrorRestoringImage("Unrecognized disk label") if information.get_image_is_disk(): mbr = Mbr(self.image_path) mbr.restore_from_file(self.target_device) dlm = DiskLayoutManager(self.image_path) dlm.restore_from_file(disk) self._print_informations(total_bytes, image_name) progress = Progress(total_blocks) progress.start() partitions = information.get_partitions() for part in partitions: if information.get_image_is_disk(): partition = disk.get_partition_by_number(part.number, part.type) else: parent_path = get_parent_path(self.target_device) parent_device = Device(parent_path) parent_disk = Disk(parent_device) partition = parent_disk.get_partition_by_path( self.target_device, part.type) if partition is None: raise ErrorRestoringImage("No valid partitions found") if hasattr(part, "uuid"): partition.filesystem.open_to_write(part.uuid) else: partition.filesystem.open_to_write() if partition.filesystem.is_swap(): continue current_volume = 1 while True: file_name = FILE_PATTERN % (image_name, part.number, current_volume) file_path = self.image_path + file_name reader = ReaderFactory(file_path, compressor_level) for data in reader: partition.filesystem.write(data) progress.increment(1) if hasattr(part, "volumes"): if current_volume < part.volumes: current_volume += 1 continue break partition.filesystem.close() progress.stop() print "completed."
def create_image(self): """ """ device = Device(self.device_path) disk = Disk(device) if device.is_disk(): mbr = Mbr(self.target_path) mbr.save_to_file(self.device_path) dlm = DiskLayoutManager(self.target_path) dlm.save_to_file(disk) partition_list = disk.get_valid_partitions(self.raw) # check partitions filesystem if not self.raw: for part in partition_list: if not part.filesystem.check(): raise ErrorCreatingImage("(%s) Filesystem is not clean" % part.path) # get total size total_bytes = 0 for part in partition_list: total_bytes += part.filesystem.get_used_size() total_blocks = long(math.ceil(total_bytes/float(BLOCK_SIZE))) self._print_informations(total_bytes) information = Information(self.target_path) information.set_image_is_disk(device.is_disk()) information.set_image_name(self.image_name) information.set_image_total_bytes(total_bytes) information.set_image_compressor_level(self.compressor_level) progress = Progress(total_blocks) progress.start() for part in partition_list: number = part.get_number() uuid = part.filesystem.uuid() type = part.filesystem.type part.filesystem.open_to_read() split_volume = 1 while True: file_name = FILE_PATTERN % (self.image_name, number, split_volume) file_path = self.target_path + file_name writer = WriterFactory(file_path, self.compressor_level) writer.open() next_partition = False total_written = 0 while True: data = part.filesystem.read(BLOCK_SIZE) if not len(data): next_partition = True break bytes_written = writer.write(data) total_written += bytes_written progress.increment(1) if self.split_size: if (total_written + bytes_written) / 1024 / 1024 >= self.split_size: break writer.close() if next_partition: break split_volume += 1 part.filesystem.close() information.add_partition(number, uuid, type, split_volume) swap = disk.get_swap_partition() if swap is not None: number = swap.get_number() uuid = swap.filesystem.uuid() type = swap.filesystem.type information.add_partition(number, uuid, type, 0) information.save() progress.stop() print "completed."
def restore_image(self): """ """ information = Information(self.image_path) information.load() image_name = information.get_image_name() compressor_level = information.get_image_compressor_level() total_bytes = information.get_image_total_bytes() total_blocks = long(math.ceil(total_bytes/float(BLOCK_SIZE))) compressor = Compressor(compressor_level) device = Device(self.target_device) if device.is_disk() != \ information.get_image_is_disk(): raise ErrorRestoringImage("Invalid target dispositive") try: disk = Disk(device) except _ped.DiskLabelException: try: device.fix_disk_label() disk = Disk(device) except: raise ErrorRestoringImage("Unrecognized disk label") if information.get_image_is_disk(): mbr = Mbr(self.image_path) mbr.restore_from_file(self.target_device) dlm = DiskLayoutManager(self.image_path) dlm.restore_from_file(disk) self._print_informations(total_bytes, image_name) progress = Progress(total_blocks) progress.start() partitions = information.get_partitions() for p in partitions: if information.get_image_is_disk(): partition = disk.get_partition_by_number(p.number, p.type) else: parent_path = get_parent_path(self.target_device) parent_device = Device(parent_path) parent_disk = Disk(parent_device) partition = parent_disk.get_partition_by_path( self.target_device, p.type) if partition is None: raise ErrorRestoringImage("No valid partitions found") if p.uuid is not None: partition.filesystem.open_to_write(p.uuid) else: partition.filesystem.open_to_write() if partition.filesystem.is_swap(): continue file_name = FILE_PATTERN % (image_name, p.number) with open(self.image_path + file_name, 'rb') as f: # TODO: Work with parallelism while True: # Ugly header = f.read(compressor.get_header_size()) if not len(header): break size = compressor.read_block_header(header) cdata = f.read(size) data = compressor.extract(cdata) partition.filesystem.write(data) progress.increment(1) partition.filesystem.close() progress.stop() print "completed."