summaryrefslogtreecommitdiffstats
path: root/update-payload-extractor/extract.py
diff options
context:
space:
mode:
authorKevin F. Haggerty <haggertk@lineageos.org>2020-03-15 15:06:30 -0600
committerKevin F. Haggerty <haggertk@lineageos.org>2020-03-15 15:16:33 -0600
commit32a0b66b1427ba2c4dd7fb359bbfde2f3068fff1 (patch)
treecebe4f8a943cd6d915361dfa0f960e6d59ba01df /update-payload-extractor/extract.py
parent9a231bd70ba799ed36648bab1c32c16f8334dbce (diff)
parent4632cf0a0a6db27cce20c25cb40fc469a2c8e9aa (diff)
downloadscripts-32a0b66b1427ba2c4dd7fb359bbfde2f3068fff1.tar.gz
scripts-32a0b66b1427ba2c4dd7fb359bbfde2f3068fff1.tar.bz2
scripts-32a0b66b1427ba2c4dd7fb359bbfde2f3068fff1.zip
Add 'update-payload-extractor/' from commit '4632cf0a0a6db27cce20c25cb40fc469a2c8e9aa'
https://github.com/gmrt/update_payload_extractor git-subtree-dir: update-payload-extractor git-subtree-mainline: 9a231bd70ba799ed36648bab1c32c16f8334dbce git-subtree-split: 4632cf0a0a6db27cce20c25cb40fc469a2c8e9aa Change-Id: I9ae25d32a7e9aa6664309e8b916811844d0cac50
Diffstat (limited to 'update-payload-extractor/extract.py')
-rwxr-xr-xupdate-payload-extractor/extract.py63
1 files changed, 63 insertions, 0 deletions
diff --git a/update-payload-extractor/extract.py b/update-payload-extractor/extract.py
new file mode 100755
index 0000000..266ef0a
--- /dev/null
+++ b/update-payload-extractor/extract.py
@@ -0,0 +1,63 @@
+#!/usr/bin/env python2
+
+import argparse
+import errno
+import os
+
+import update_payload
+from update_payload import applier
+
+
+def list_content(payload_file_name):
+ with open(payload_file_name, 'rb') as payload_file:
+ payload = update_payload.Payload(payload_file)
+ payload.Init()
+
+ for part in payload.manifest.partitions:
+ print("{} ({} bytes)".format(part.partition_name,
+ part.new_partition_info.size))
+
+
+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)
+ helper._ApplyToPartition(
+ part.operations, part.partition_name,
+ 'install_operations', output_file,
+ part.new_partition_info)
+
+
+if __name__ == '__main__':
+ parser = argparse.ArgumentParser()
+ parser.add_argument("payload", metavar="payload.bin",
+ help="Path to the payload.bin")
+ parser.add_argument("--output_dir", default="output",
+ help="Output directory")
+ parser.add_argument("--partitions", type=str, nargs='+',
+ help="Name of the partitions to extract")
+ parser.add_argument("--list_partitions", action="store_true",
+ help="List the partitions included in the payload.bin")
+
+ args = parser.parse_args()
+ if args.list_partitions:
+ list_content(args.payload)
+ else:
+ extract(args.payload, args.output_dir, args.partitions)