1
0
Fork 0
forked from len0rd/rockbox

hibyos_nativepatcher: rewrite for either fresh install or uninstall

Since we can easily create our own install files for erosqnative,
modify script to create fresh install image from bootloader.erosq
or add bootloader to installation manifest of stock update file
to uninstall rockbox.

USAGE:

    hibyos_nativepatcher.sh <mkrbinstall/mkstockuboot> [arguments depend on mode, see below]

    hibyos_nativepatcher.sh mkrbinstall <OFVERNAME (erosq or eros_h2)>
        <path/to/output> <path/to/bootloader.erosq> <HWVER (hw1hw2 or hw3)>
        Output file will be path/to/output/erosqnative_RBVER-HWVER-OFVERNAME.upt.
        Only the Hifiwalker H2 v1.3 uses "eros_h2", everything else uses "erosq".

    hibyos_nativepatcher.sh mkstockuboot <path/to/OFupdatefile.upt>
        Output file will be path/to/OFupdatefile-rbuninstall.upt.

Change-Id: I16bc6e43c42f99475ebdd5ec1ac1bae047129745
This commit is contained in:
Dana Conrad 2024-09-11 02:24:22 +00:00 committed by Solomon Peachy
parent 85652e6bd1
commit 2a0f3c8276

View file

@ -1,7 +1,25 @@
#!/bin/bash
# USAGE: ./hibyos_nativepatcher.sh <path/to/updatefile.upt> <path/to/bootloader.erosq>
# hibyos_nativepatcher.sh
#
# NOTE: THIS SCRIPT IS NOT TOLERANT OF WHITESPACE IN FILENAMES OR PATHS
usage="hibyos_nativepatcher.sh
USAGE:
hibyos_nativepatcher.sh <mkrbinstall/mkstockuboot> [arguments depend on mode, see below]
hibyos_nativepatcher.sh mkrbinstall <OFVERNAME (erosq or eros_h2)>
<path/to/output> <path/to/bootloader.erosq> <HWVER (hw1hw2 or hw3)>
Output file will be path/to/output/erosqnative_RBVER-HWVER-OFVERNAME.upt.
Only the Hifiwalker H2 v1.3 uses "eros_h2", everything else uses "erosq".
hibyos_nativepatcher.sh mkstockuboot <path/to/OFupdatefile.upt>
Output file will be path/to/OFupdatefile-rbuninstall.upt.
NOTE: THIS SCRIPT IS NOT TOLERANT OF WHITESPACE IN FILENAMES OR PATHS!"
# check OS type and for any needed tools
if [[ "$OSTYPE" == "darwin"* ]]; then
echo "$OSTYPE DETECTED"
elif [[ "$OSTYPE" == "linux-gnu"* ]]; then
@ -19,99 +37,185 @@ else
exit 1
fi
# make sure we can find patch_manifest
SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
if !(which $SCRIPT_DIR/patch_manifest.pl > /dev/null); then
echo "couldn't find patch_manifest.pl!"
exit 1
fi
updatefile=$(realpath --relative-base=$(pwd) $1)
updatefile_path=$(echo "$updatefile" | perl -ne "s/\/[\w\.\_\-]*$// && print")
updatefile_name=$(basename $updatefile)
updatefile_name_noext=$(echo "$updatefile_name" | perl -ne "s/\.\w*$// && print")
bootfile=$(realpath --relative-base=$(pwd) $2)
echo "This will patch $updatefile with $bootfile..."
###########################################################################
# MKRBINSTALL
###########################################################################
if [[ "$1" == "mkrbinstall" ]]; then
echo "Creating installation image from bootloader file..."
echo "MAKE WORKING DIR..."
mkdir $updatefile_path/working_dir
working_dir=$(realpath $updatefile_path/working_dir)
# make sure all arguments are accounted for...
if [[ -z "$5" ]]; then
echo "not all parameters included, please see usage:"
echo "$usage"
exit 1
fi
# copy update.upt to update.iso
cp $updatefile $working_dir/$updatefile_name_noext\_cpy.iso
# validate arguments
outputdir=$(realpath --relative-base=$(pwd) $3)
if !(ls $outputdir >& /dev/null); then
echo "directory $outputdir doesn't seem to exist. Please make sure it exists, then re-run hibyos_nativepatcher.sh."
exit 1
fi
mkdir $working_dir/image_contents
# note, bootloaderfile might still be a valid path, but not a valid bootloader file... check to make sure tar can extract it okay.
bootloaderfile=$(realpath --relative-base=$(pwd) $4)
if !(ls $bootloaderfile >& /dev/null); then
echo "bootloader file $bootloaderfile doesn't seem to exist. Please make sure it exists, then re-run hibyos_nativepatcher.sh."
exit 1
fi
# attach/mount iso
echo "mount/extract/unmount original iso..."
if [[ "$OSTYPE" == "darwin"* ]]; then
# make working directory...
mkdir $outputdir/working_dir
workingdir=$(realpath $outputdir/working_dir)
mkdir $workingdir/bootloader
# extract bootloader file
if [[ "$OSTYPE" == "darwin"* ]]; then
# macos
hdiutil attach $working_dir/$updatefile_name_noext\_cpy.iso -mountpoint $working_dir/contentsiso
tar -xvf $bootloaderfile --cd $workingdir/bootloader
elif [[ "$OSTYPE" == "linux-gnu"* ]]; then
# linux-gnu
tar -xvf $bootloaderfile -C $workingdir/bootloader
fi
# make sure we got what we wanted
if !(ls $workingdir/bootloader/bootloader.ucl >& /dev/null); then
echo "can't find bootloader.ucl! help!"
rm -rf $workingdir
exit 1
elif !(ls $workingdir/bootloader/spl.erosq >& /dev/null); then
echo "can't find spl.erosq! help!"
rm -rf $workingdir
exit 1
fi
bootver=$(cat $workingdir/bootloader/bootloader-info.txt)
if [ -z "$bootver" ]; then
echo "COULDN'T FIND BOOTLOADER-INFO!"
rm -rf $workingdir
exit 1
fi
# if uboot.bin already exists, something is weird.
if (ls $workingdir/image_contents/uboot.bin >& /dev/null); then
echo "$workingdir/image_contents/uboot.bin already exists, something went weird."
rm -rf $workingdir
exit 1
fi
# everything exists, make the bin
mkdir $workingdir/image_contents/
touch $workingdir/image_contents/uboot.bin
echo "PATCHING!"
dd if=$workingdir/bootloader/spl.erosq of=$workingdir/image_contents/uboot.bin obs=1 seek=0 conv=notrunc
dd if=$workingdir/bootloader/bootloader.ucl of=$workingdir/image_contents/uboot.bin obs=1 seek=26624 conv=notrunc
# create update.txt
md5=($(md5sum $workingdir/image_contents/uboot.bin))
if [ -z "$md5" ]; then
echo "COULDN'T MD5SUM UBOOT.BIN!"
rm -rf $workingdir
exit 1
fi
echo "Create update manifest with md5sum $md5"
echo "" > $workingdir/image_contents/update.txt
$SCRIPT_DIR/patch_manifest.pl $md5 $workingdir/image_contents/update.txt
# create version.txt
echo "version={
name=$2
ver=2024-09-10T14:42:18+08:00
}" > $workingdir/image_contents/version.txt
outputfilename="erosqnative_$bootver-$5-$2"
###########################################################################
# MKSTOCKUBOOT
###########################################################################
elif [[ "$1" == "mkstockuboot" ]]; then
echo "Creating uninstallation image from stock update image..."
# make sure all arguments are accounted for...
if [[ -z "$2" ]]; then
echo "not all parameters included, please see usage:"
echo "$usage"
exit 1
fi
updatefile=$(realpath --relative-base=$(pwd) $2)
updatefile_path=$(echo "$updatefile" | perl -ne "s/\/[\w\.\_\-]*$// && print")
updatefile_name=$(basename $updatefile)
updatefile_name_noext=$(echo "$updatefile_name" | perl -ne "s/\.\w*$// && print")
outputdir=$updatefile_path
outputfilename="$updatefile_name_noext-rbuninstall"
mkdir $updatefile_path/working_dir
workingdir=$(realpath $updatefile_path/working_dir)
# copy update.upt to update.iso
cp $updatefile $workingdir/$updatefile_name_noext-cpy.iso
mkdir $workingdir/image_contents
# extract iso
if [[ "$OSTYPE" == "darwin"* ]]; then
# macos
hdiutil attach $workingdir/$updatefile_name_noext-cpy.iso -mountpoint $workingdir/contentsiso
# copy out iso contents
cp $working_dir/contentsiso/* $working_dir/image_contents
cp $workingdir/contentsiso/* $workingdir/image_contents
# unmount iso
hdiutil detach $working_dir/contentsiso
elif [[ "$OSTYPE" == "linux-gnu"* ]]; then
hdiutil detach $workingdir/contentsiso
elif [[ "$OSTYPE" == "linux-gnu"* ]]; then
# linux-gnu
7z -o$working_dir/image_contents x $working_dir/$updatefile_name_noext\_cpy.iso
fi
7z -o$workingdir/image_contents x $workingdir/$updatefile_name_noext-cpy.iso
fi
chmod 777 $working_dir/image_contents/*
chmod 777 $workingdir/image_contents/*
# extract spl, bootloader
echo "extract bootloader..."
mkdir $working_dir/bootloader
if [[ "$OSTYPE" == "darwin"* ]]; then
# macos
tar -xvf $bootfile --cd $working_dir/bootloader
elif [[ "$OSTYPE" == "linux-gnu"* ]]; then
# linux-gnu
tar -xvf $bootfile -C $working_dir/bootloader
fi
bootver=$(cat $working_dir/bootloader/bootloader-info.txt)
if [ -z "$bootver" ]; then
echo "COULDN'T FIND BOOTLOADER-INFO!"
echo "cleaning up..."
rm -rf $working_dir
exit 1
fi
echo "FOUND VERSION $bootver"
# patch uboot.bin
echo "PATCH!"
dd if=$working_dir/bootloader/spl.erosq of=$working_dir/image_contents/uboot.bin obs=1 seek=0 conv=notrunc
dd if=$working_dir/bootloader/bootloader.ucl of=$working_dir/image_contents/uboot.bin obs=1 seek=26624 conv=notrunc
# modify update.txt
md5=($(md5sum $working_dir/image_contents/uboot.bin))
if [ -z "$md5" ]; then
# modify update.txt
md5=($(md5sum $workingdir/image_contents/uboot.bin))
if [ -z "$md5" ]; then
echo "COULDN'T MD5SUM UBOOT.BIN!"
echo "cleaning up..."
rm -rf $working_dir
exit 1
fi
echo "add to update manifest with md5sum $md5"
$SCRIPT_DIR/patch_manifest.pl $md5 $workingdir/image_contents/update.txt
######################################################################
# PRINT USAGE
######################################################################
else
echo "$usage"
exit 1
fi
echo "add to update manifest with md5sum $md5"
$SCRIPT_DIR/patch_manifest.pl $md5 $working_dir/image_contents/update.txt
# modify version.txt?
# create iso
echo "make new iso..."
######################################################################
# Common: make the image
######################################################################
# make the image
if [[ "$OSTYPE" == "darwin"* ]]; then
# macos
hdiutil makehybrid -iso -joliet -o $working_dir/$updatefile_name_noext\_patched_$bootver.iso $working_dir/image_contents/
hdiutil makehybrid -iso -joliet -o $outputdir/output.iso $workingdir/image_contents/
elif [[ "$OSTYPE" == "linux-gnu"* ]]; then
# linux-gnu
genisoimage -o $working_dir/$updatefile_name_noext\_patched_$bootver.iso $working_dir/image_contents/
genisoimage -o $outputdir/output.iso $workingdir/image_contents/
fi
# rename to something.upt and put in original directory
echo "final output file $updatefile_name_noext\_patched_$bootver.upt"
mv $working_dir/$updatefile_name_noext\_patched_$bootver.iso $updatefile_path/$updatefile_name_noext\_patched_$bootver.upt
# rename
mv $outputdir/output.iso $outputdir/$outputfilename.upt
# clean up
echo "cleaning up..."
rm -rf $working_dir
# cleaning up
rm -rf $workingdir
exit 0