def extract(payload_file_name, output_dir="output", partition_names=None): try: os.makedirs(output_dir) except OSError as e: if e.errno != errno.EEXIST: raise with open(payload_file_name, 'rb') as payload_file: payload = update_payload.Payload(payload_file) payload.Init() if payload.IsDelta(): print("Delta payloads are not supported") exit(1) helper = applier.PayloadApplier(payload) for part in payload.manifest.partitions: if partition_names and part.partition_name not in partition_names: continue print("Extracting {}".format(part.partition_name)) output_file = os.path.join(output_dir, part.partition_name + '.img') helper._ApplyToPartition(part.operations, part.partition_name, 'install_operations', output_file, part.new_partition_info)
def Apply(self, new_parts, old_parts=None, bsdiff_in_place=True, bspatch_path=None, puffpatch_path=None, truncate_to_expected_size=True): """Applies the update payload. Args: new_parts: map of partition name to dest partition file old_parts: map of partition name to partition file (optional) bsdiff_in_place: whether to perform BSDIFF operations in-place (optional) bspatch_path: path to the bspatch binary (optional) puffpatch_path: path to the puffpatch binary (optional) truncate_to_expected_size: whether to truncate the resulting partitions to their expected sizes, as specified in the payload (optional) Raises: PayloadError if payload application failed. """ self._AssertInit() # Create a short-lived payload applier object and run it. helper = applier.PayloadApplier( self, bsdiff_in_place=bsdiff_in_place, bspatch_path=bspatch_path, puffpatch_path=puffpatch_path, truncate_to_expected_size=truncate_to_expected_size) helper.Run(new_parts, old_parts=old_parts)
def extract(payload_file_name, output_dir="output", old_dir="old", partition_names=None, skip_hash=None): try: os.makedirs(output_dir) except OSError as e: if e.errno != errno.EEXIST: raise for i in glob.glob(old_dir + '/*.img'): os.rename(i, i[:-4]) with open(payload_file_name, 'rb') as payload_file: payload = update_payload.Payload(payload_file) payload.Init() helper = applier.PayloadApplier(payload) for part in payload.manifest.partitions: if partition_names and part.partition_name not in partition_names: continue print("Extracting {}".format(part.partition_name)) output_file = os.path.join(output_dir, part.partition_name) if payload.IsDelta(): old_file = os.path.join(old_dir, part.partition_name) helper._ApplyToPartition(part.operations, part.partition_name, 'install_operations', output_file, part.new_partition_info, old_file, part.old_partition_info, skip_hash) else: helper._ApplyToPartition(part.operations, part.partition_name, 'install_operations', output_file, part.new_partition_info, skip_hash=skip_hash) for i in glob.glob(old_dir + '/*'): os.rename(i, i + '.img') for i in glob.glob(output_dir + '/*'): os.rename(i, i + '.img')
def extract(payload_file_name, output_dir="output", source_dir="source", partition_names=None): try: os.makedirs(output_dir) except OSError as e: if e.errno != errno.EEXIST: raise with open(payload_file_name, 'rb') as payload_file: payload = update_payload.Payload(payload_file) payload.Init() helper = applier.PayloadApplier(payload) if payload.IsDelta(): print("Delta payload Detected") if not os.path.isdir(source_dir): raise SystemExit("Source directory not found") for part in payload.manifest.partitions: if partition_names and part.partition_name not in partition_names: continue source_file = os.path.join(source_dir, part.partition_name + ".img") if not os.path.isfile(source_file): print("Source for partition " + part.partition_name + " not found, skipping...") continue print("Patching {}".format(part.partition_name)) output_file = os.path.join(output_dir, part.partition_name + ".img") helper._ApplyToPartition( part.operations, part.partition_name, 'install_operations', output_file, part.new_partition_info, source_file) else: for part in payload.manifest.partitions: if partition_names and part.partition_name not in partition_names: continue print("Extracting {}".format(part.partition_name)) output_file = os.path.join(output_dir, part.partition_name + ".img") helper._ApplyToPartition( part.operations, part.partition_name, 'install_operations', output_file, part.new_partition_info)
def extract_ota(payload_path, list_partitions, output_dir, partitions): """Extract OTA payload""" payload = update_payload.Payload(payload_path) payload.Init() new_parts = {} new_part_info = {} install_operations = [] for part in payload.manifest.partitions: name = part.partition_name if list_partitions: print(name) if partitions and name not in partitions: continue new_image = os.path.join(output_dir, name + ".img") new_parts[name] = new_image new_part_info[name] = part.new_partition_info install_operations.append((name, part.operations)) if not list_partitions: for name, operations in install_operations: applier.PayloadApplier(payload)._ApplyToPartition( operations, name, '%s_install_operations' % name, new_parts[name], new_part_info[name])