Add possibility to export Odin flashable tar (#297)
Add possibility to export Odin flashable tar for devices where the flasher method is heimdall-isorec or heimdall-bootimg
This commit is contained in:
parent
c0a70cce3f
commit
6cb663eb6e
|
@ -24,13 +24,20 @@ import pmb.build
|
||||||
import pmb.chroot.apk
|
import pmb.chroot.apk
|
||||||
import pmb.config
|
import pmb.config
|
||||||
import pmb.flasher
|
import pmb.flasher
|
||||||
|
import pmb.helpers.file
|
||||||
|
|
||||||
|
|
||||||
def export(args, flavor, folder):
|
def export(args, flavor, folder):
|
||||||
|
logging.info("Export symlinks to: " + folder)
|
||||||
|
if args.odin_flashable_tar:
|
||||||
|
odin_flashable_tar(args, flavor, folder)
|
||||||
|
symlinks(args, flavor, folder)
|
||||||
|
|
||||||
|
|
||||||
|
def symlinks(args, flavor, folder):
|
||||||
"""
|
"""
|
||||||
Create convenience symlinks to the system image and boot files.
|
Create convenience symlinks to the system image and boot files.
|
||||||
"""
|
"""
|
||||||
logging.info("Export symlinks to: " + folder)
|
|
||||||
|
|
||||||
# File descriptions
|
# File descriptions
|
||||||
info = {
|
info = {
|
||||||
|
@ -65,13 +72,87 @@ def export(args, flavor, folder):
|
||||||
msg += " (" + info[basename] + ")"
|
msg += " (" + info[basename] + ")"
|
||||||
logging.info(msg)
|
logging.info(msg)
|
||||||
|
|
||||||
if os.path.exists(link):
|
pmb.helpers.file.symlink(args, file, link)
|
||||||
if (os.path.islink(link) and
|
|
||||||
os.path.abspath(os.readlink(link)) == os.path.abspath(file)):
|
|
||||||
continue
|
def odin_flashable_tar(args, flavor, folder):
|
||||||
raise RuntimeError("File exists: " + link)
|
"""
|
||||||
elif os.path.islink(link):
|
Create Odin flashable tar file with kernel and initramfs for devices configured with
|
||||||
os.unlink(link)
|
the flasher method 'heimdall-isorec' and with boot.img for devices with 'heimdall-bootimg'
|
||||||
|
"""
|
||||||
|
pmb.flasher.init(args)
|
||||||
|
suffix = "rootfs_" + args.device
|
||||||
|
|
||||||
|
# Validate method
|
||||||
|
method = args.deviceinfo["flash_methods"]
|
||||||
|
if not method.startswith("heimdall-"):
|
||||||
|
raise RuntimeError("An odin flashable tar is not supported for the flash"
|
||||||
|
" method '" + method + "' specified in the current configuration."
|
||||||
|
" Only 'heimdall' methods are supported.")
|
||||||
|
|
||||||
|
# Partitions
|
||||||
|
partition_kernel = args.deviceinfo["flash_heimdall_partition_kernel"]
|
||||||
|
partition_initfs = args.deviceinfo["flash_heimdall_partition_initfs"]
|
||||||
|
|
||||||
|
# Temporary folder
|
||||||
|
temp_folder = "/tmp/odin-flashable-tar"
|
||||||
|
|
||||||
|
# Odin flashable tar generation script (because redirecting stdin/stdout is not allowed
|
||||||
|
# in pmbootstrap's chroot/shell functions for security reasons)
|
||||||
|
with open(args.work + "/chroot_rootfs_" + args.device + "/tmp/_odin.sh", "w") as handle:
|
||||||
|
odin_kernel_md5 = partition_kernel + ".bin.md5"
|
||||||
|
odin_initfs_md5 = partition_initfs + ".bin.md5"
|
||||||
|
odin_device_tar = args.device + ".tar"
|
||||||
|
odin_device_tar_md5 = args.device + ".tar.md5"
|
||||||
|
|
||||||
|
handle.write(
|
||||||
|
"#!/bin/sh\n"
|
||||||
|
"cd " + temp_folder + "\n")
|
||||||
|
if method == "heimdall-isorec":
|
||||||
|
handle.write(
|
||||||
|
# Kernel: copy and append md5
|
||||||
|
"cp /boot/vmlinuz-" + flavor + " " + odin_kernel_md5 + "\n"
|
||||||
|
"md5sum -t " + odin_kernel_md5 + " >> " + odin_kernel_md5 + "\n"
|
||||||
|
# Initramfs: recompress with lzop, append md5
|
||||||
|
"gunzip -c /boot/initramfs-" + flavor + " | lzop > " + odin_initfs_md5 + "\n"
|
||||||
|
"md5sum -t " + odin_initfs_md5 + " >> " + odin_initfs_md5 + "\n")
|
||||||
|
elif method == "heimdall-bootimg":
|
||||||
|
handle.write(
|
||||||
|
# boot.img: copy and append md5
|
||||||
|
"cp /boot/boot.img-" + flavor + " " + odin_kernel_md5 + "\n"
|
||||||
|
"md5sum -t " + odin_kernel_md5 + " >> " + odin_kernel_md5 + "\n")
|
||||||
|
handle.write(
|
||||||
|
# Create tar, remove included files and append md5
|
||||||
|
"tar -c -f " + odin_device_tar + " *.bin.md5\n"
|
||||||
|
"rm *.bin.md5\n"
|
||||||
|
"md5sum -t " + odin_device_tar + " >> " + odin_device_tar + "\n"
|
||||||
|
"mv " + odin_device_tar + " " + odin_device_tar_md5 + "\n")
|
||||||
|
|
||||||
|
commands = [["mkdir", "-p", temp_folder],
|
||||||
|
["cat", "/tmp/_odin.sh"], # for the log
|
||||||
|
["sh", "/tmp/_odin.sh"],
|
||||||
|
["rm", "/tmp/_odin.sh"]
|
||||||
|
]
|
||||||
|
for command in commands:
|
||||||
|
pmb.chroot.root(args, command, suffix)
|
||||||
|
|
||||||
|
# Move Odin flashable tar to native chroot and cleanup temp folder
|
||||||
|
pmb.chroot.user(args, ["mkdir", "-p", "/home/user/rootfs"])
|
||||||
|
pmb.chroot.root(args, ["mv", "/mnt/rootfs_" + args.device + temp_folder +
|
||||||
|
"/" + odin_device_tar_md5, "/home/user/rootfs/"]),
|
||||||
|
pmb.chroot.root(args, ["chown", "user:user",
|
||||||
|
"/home/user/rootfs/" + odin_device_tar_md5])
|
||||||
|
pmb.chroot.root(args, ["rmdir", temp_folder], suffix)
|
||||||
|
|
||||||
# Create the symlink
|
# Create the symlink
|
||||||
pmb.helpers.run.user(args, ["ln", "-s", file, link])
|
file = args.work + "/chroot_native/home/user/rootfs/" + odin_device_tar_md5
|
||||||
|
link = folder + "/" + odin_device_tar_md5
|
||||||
|
pmb.helpers.file.symlink(args, file, link)
|
||||||
|
|
||||||
|
# Display a readable message
|
||||||
|
msg = " * " + odin_device_tar_md5
|
||||||
|
if method == "heimdall-isorec":
|
||||||
|
msg += " (Odin flashable file, contains initramfs and kernel)"
|
||||||
|
elif method == "heimdall-bootimg":
|
||||||
|
msg += " (Odin flashable file, contains boot.img)"
|
||||||
|
logging.info(msg)
|
||||||
|
|
|
@ -56,7 +56,6 @@ def kernel(args):
|
||||||
pmb.chroot.initfs.build(args, flavor, "rootfs_" + args.device)
|
pmb.chroot.initfs.build(args, flavor, "rootfs_" + args.device)
|
||||||
|
|
||||||
# Generate the paths and run the flasher
|
# Generate the paths and run the flasher
|
||||||
pmb.flasher.init(args)
|
|
||||||
if args.action_flasher == "boot":
|
if args.action_flasher == "boot":
|
||||||
logging.info("(native) boot " + flavor + " kernel")
|
logging.info("(native) boot " + flavor + " kernel")
|
||||||
pmb.flasher.run(args, "boot", flavor)
|
pmb.flasher.run(args, "boot", flavor)
|
||||||
|
@ -86,7 +85,6 @@ def system(args):
|
||||||
if not os.path.exists(args.work + "/chroot_native" + img_path):
|
if not os.path.exists(args.work + "/chroot_native" + img_path):
|
||||||
raise RuntimeError("The system image has not been generated yet,"
|
raise RuntimeError("The system image has not been generated yet,"
|
||||||
" please run 'pmbootstrap install' first.")
|
" please run 'pmbootstrap install' first.")
|
||||||
pmb.flasher.init(args)
|
|
||||||
|
|
||||||
# Run the flasher
|
# Run the flasher
|
||||||
logging.info("(native) flash system image")
|
logging.info("(native) flash system image")
|
||||||
|
|
|
@ -19,6 +19,8 @@ along with pmbootstrap. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
import os
|
import os
|
||||||
|
|
||||||
|
import pmb.helpers.run
|
||||||
|
|
||||||
|
|
||||||
def replace(path, old, new):
|
def replace(path, old, new):
|
||||||
text = ""
|
text = ""
|
||||||
|
@ -56,3 +58,19 @@ def is_up_to_date(path_sources, path_target=None, lastmod_target=None):
|
||||||
lastmod_target = os.path.getmtime(path_target)
|
lastmod_target = os.path.getmtime(path_target)
|
||||||
|
|
||||||
return lastmod_target >= lastmod_source
|
return lastmod_target >= lastmod_source
|
||||||
|
|
||||||
|
|
||||||
|
def symlink(args, file, link):
|
||||||
|
"""
|
||||||
|
Checks if the symlink is already present, otherwise create it.
|
||||||
|
"""
|
||||||
|
if os.path.exists(link):
|
||||||
|
if (os.path.islink(link) and
|
||||||
|
os.path.abspath(os.readlink(link)) == os.path.abspath(file)):
|
||||||
|
return
|
||||||
|
raise RuntimeError("File exists: " + link)
|
||||||
|
elif os.path.islink(link):
|
||||||
|
os.unlink(link)
|
||||||
|
|
||||||
|
# Create the symlink
|
||||||
|
pmb.helpers.run.user(args, ["ln", "-s", file, link])
|
||||||
|
|
|
@ -46,6 +46,8 @@ def arguments_flasher(subparser):
|
||||||
export.add_argument("export_folder", help="export folder, defaults to"
|
export.add_argument("export_folder", help="export folder, defaults to"
|
||||||
" /tmp/postmarketOS-export",
|
" /tmp/postmarketOS-export",
|
||||||
default="/tmp/postmarketOS-export", nargs="?")
|
default="/tmp/postmarketOS-export", nargs="?")
|
||||||
|
export.add_argument("--odin", help="odin flashable tar (boot.img/kernel+initramfs only)",
|
||||||
|
action="store_true", dest="odin_flashable_tar")
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue