#!/bin/bash # hibyos_nativepatcher.sh # # NOTE: THIS SCRIPT IS NOT TOLERANT OF WHITESPACE IN FILENAMES OR PATHS usage="hibyos_nativepatcher.sh USAGE: hibyos_nativepatcher.sh [arguments depend on mode, see below] hibyos_nativepatcher.sh mkrbinstall 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 Output file will be path/to/OFupdatefile-rbuninstall.upt." # check OS type and for any needed tools if [[ "$OSTYPE" == "darwin"* ]]; then echo "$OSTYPE DETECTED" elif [[ "$OSTYPE" == "linux-gnu"* ]]; then echo "$OSTYPE DETECTED" if !(which 7z > /dev/null); then echo "PLEASE INSTALL 7z (usually part of p7zip-full package)" exit 1 fi if !(which genisoimage > /dev/null); then echo "PLEASE INSTALL genisoimage" exit 1 fi else echo "SCRIPT NOT IMPLEMENTED ON $OSTYPE YET!" 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 ########################################################################### # MKRBINSTALL ########################################################################### if [[ "$1" == "mkrbinstall" ]]; then echo "Creating installation image from bootloader file..." # make sure all arguments are accounted for... if [[ -z "$5" ]]; then echo "not all parameters included, please see usage:" echo "$usage" exit 1 fi # validate arguments outputdir=$(realpath "$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 # 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 "$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 # make working directory... mkdir "$outputdir"/working_dir workingdir=$(realpath "$outputdir"/working_dir) mkdir "$workingdir"/bootloader # extract bootloader file if [[ "$OSTYPE" == "darwin"* ]]; then # macos 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 "$2") updatefile_path=$(dirname "$updatefile") 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 "$workingdir"/contentsiso/* "$workingdir"/image_contents # unmount iso hdiutil detach "$workingdir"/contentsiso elif [[ "$OSTYPE" == "linux-gnu"* ]]; then # linux-gnu 7z -o"$workingdir"/image_contents x "$workingdir"/"$updatefile_name_noext"-cpy.iso fi chmod 777 "$workingdir"/image_contents/* # modify update.txt md5=($(md5sum "$workingdir"/image_contents/uboot.bin)) if [ -z "$md5" ]; then echo "COULDN'T MD5SUM UBOOT.BIN!" 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 ###################################################################### # Common: make the image ###################################################################### # make the image if [[ "$OSTYPE" == "darwin"* ]]; then # macos hdiutil makehybrid -iso -joliet -o "$outputdir"/output.iso "$workingdir"/image_contents/ elif [[ "$OSTYPE" == "linux-gnu"* ]]; then # linux-gnu genisoimage -o "$outputdir"/output.iso "$workingdir"/image_contents/ fi # rename mv "$outputdir"/output.iso "$outputdir"/"$outputfilename".upt # cleaning up rm -rf "$workingdir" exit 0