コード例 #1
0
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)
コード例 #2
0
    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)
コード例 #3
0
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')
コード例 #4
0
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)
コード例 #5
0
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])