mirror of
https://github.com/CloverHackyColor/CloverBootloader.git
synced 2024-12-11 14:28:08 +01:00
1148542685
Signed-off-by: Sergey Isakov <isakov-sl@bk.ru>
253 lines
8.7 KiB
Bash
Executable File
253 lines
8.7 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
diskloader="@MBR_SECTOR_FILE@"
|
|
|
|
DEST_VOL="${3}"
|
|
EFI_ROOT_DIR=$(cd "${DEST_VOL}"/Private/tmp/EFIROOTDIR; pwd -P)
|
|
CLOVER_INSTALLER_PLIST_NEW="${DEST_VOL}@CLOVER_INSTALLER_PLIST_NEW@"
|
|
install_log="${DEST_VOL}/Private/tmp/Clover_Install_Log.txt"
|
|
plistbuddy='/usr/libexec/PlistBuddy'
|
|
installer_choice="@INSTALLER_CHOICE@"
|
|
installer_altboot_refid='@INSTALLER_ALTBOOT_REFID@'
|
|
#fdisk440="${DEST_VOL}"/Private/tmp/usr/local/bin/fdisk440
|
|
boot1install="${DEST_VOL}"/Private/tmp/usr/local/bin/boot1-install
|
|
partutil="${DEST_VOL}"/Private/tmp/usr/local/bin/partutil
|
|
|
|
|
|
function finish {
|
|
local exit_code=$?
|
|
if [[ $exit_code -ne 0 ]]; then
|
|
if [[ -e "$install_log" && -d "${EFI_ROOT_DIR}/EFI" ]]; then
|
|
mv -f "$install_log" "${EFI_ROOT_DIR}/EFI/Clover_Install_Log.txt"
|
|
fi
|
|
fi
|
|
echo $exit_code
|
|
}
|
|
trap finish EXIT
|
|
|
|
bootvolume="$EFI_ROOT_DIR"
|
|
echo "Boot Volume is $bootvolume"
|
|
|
|
if [ -z "${bootvolume}" ]; then
|
|
echo
|
|
echo "Cannot find the volume. Exiting."
|
|
echo
|
|
exit
|
|
fi
|
|
|
|
bootdev=$(LC_ALL=C diskutil info "$bootvolume" 2>/dev/null | \
|
|
sed -n 's/.*Device Node: *//p')
|
|
bootrdev=${bootdev/disk/rdisk}
|
|
|
|
if [ "${bootdev}" = "${bootdev#*disk*s}" ]; then
|
|
echo
|
|
echo "ERROR Volume does not use slices."
|
|
echo
|
|
exit
|
|
fi
|
|
|
|
bootdisk=${bootdev%s*}
|
|
bootrdisk=${bootdisk/disk/rdisk}
|
|
bootslice=${bootdev#*disk*s}
|
|
|
|
# Get the options for alternative booting
|
|
altBoot=$($plistbuddy -c "Print $installer_altboot_refid" \
|
|
"$CLOVER_INSTALLER_PLIST_NEW" 2>/dev/null)
|
|
|
|
|
|
|
|
if [[ "$altBoot" == true ]]; then
|
|
partitionloaderhfs="boot1h2"
|
|
partitionloaderfat="boot1f32alt"
|
|
partitionloaderexfat="boot1xalt"
|
|
else
|
|
partitionloaderhfs="boot1h"
|
|
partitionloaderfat="boot1f32"
|
|
partitionloaderexfat="boot1x"
|
|
fi
|
|
|
|
echo "==============================================="
|
|
echo "Installer Variables:"
|
|
echo "********************"
|
|
echo "bootvolume: Volume is ${bootvolume}"
|
|
echo "bootdev: Volume device is ${bootdev}"
|
|
echo "bootrdev: Volume raw device is ${bootrdev}"
|
|
echo "bootslice: Volume slice is ${bootslice}"
|
|
echo "bootdisk: Disk device is ${bootdisk}"
|
|
echo "bootrdisk: Disk raw device is ${bootrdisk}"
|
|
echo "diskloader: Disk loader is ${diskloader}"
|
|
echo "partitionloaderhfs: Partition loader is ${partitionloaderhfs}"
|
|
echo "partitionloaderfat: Partition loader is ${partitionloaderfat}"
|
|
echo "partitionloaderexfat: Partition loader is ${partitionloaderexfat}"
|
|
echo "-----------------------------------------------"
|
|
echo ""
|
|
echo ""
|
|
|
|
echo "==============================================="
|
|
echo "Check partition scheme of $bootdisk"
|
|
echo "==============================================="
|
|
bootdisk_partition_scheme=$("$partutil" --show-partitionscheme "$bootdisk")
|
|
|
|
case "$bootdisk_partition_scheme" in
|
|
FDisk_partition_scheme)
|
|
echo "${bootdisk} use MBR partition scheme"
|
|
bootdisk_partition_scheme="mbr"
|
|
;;
|
|
GUID_partition_scheme)
|
|
echo "${bootdisk} use GPT/Hybrid GPT partition scheme"
|
|
bootdisk_partition_scheme="gpt"
|
|
;;
|
|
*) echo "ERROR: $bootdev use an unsupported partition scheme: $bootdisk_partition_scheme" | tee -a "$install_log"
|
|
exit 1
|
|
;;
|
|
esac
|
|
echo ""
|
|
|
|
echo "==============================================="
|
|
echo "Checking the format of the $bootdev partition"
|
|
echo "==============================================="
|
|
|
|
boot_volume_format=$("$partutil" --show-fstype $bootdev)
|
|
case "$boot_volume_format" in
|
|
hfs) echo "${bootdev} is currently formatted as HFS" ;;
|
|
msdos) echo "${bootdev} is currently formatted as msdos" ;;
|
|
exfat) echo "${bootdev} is currently formatted as ExFAT" ;;
|
|
esac
|
|
echo ""
|
|
|
|
if [[ -z "$boot_volume_format" ]]; then
|
|
# Try to find why we can't find fstype
|
|
echo "Can't detect filesystem type for $bootdev !" | tee -a "$install_log"
|
|
echo "$partutil --dump $bootdev:" | tee -a "$install_log"
|
|
"$partutil" --dump $bootdev 2>&1 | tee -a "$install_log"
|
|
echo "Installation abort !" | tee -a "$install_log"
|
|
exit 33
|
|
else
|
|
echo "${bootdev} is currently formatted as $boot_volume_format"
|
|
fi
|
|
|
|
partitionactive=$( fdisk -d ${bootrdisk} | grep -n "*" | awk -F: '{print $1}')
|
|
if [[ -n "$partitionactive" ]]; then
|
|
echo "Current Active Partition: ${partitionactive}" >> "$install_log"
|
|
else
|
|
echo "No Active Partition" >> "$install_log"
|
|
fi
|
|
echo "" >> "$install_log"
|
|
|
|
### Stage 0 ###
|
|
echo "Stage 0 - Writing ${diskloader} to ${bootrdisk}" >> "$install_log"
|
|
echo dd if=${bootrdisk} count=1 bs=512 of=/tmp/origMBR >> "$install_log"
|
|
dd if=${bootrdisk} count=1 bs=512 of=/tmp/origMBR
|
|
echo cp /tmp/origMBR /tmp/newMBR >> "$install_log"
|
|
cp /tmp/origMBR /tmp/newMBR
|
|
echo dd if="${DEST_VOL}/Private/tmp/usr/standalone/i386/${diskloader}" of=/tmp/newMBR bs=440 count=1 conv=notrunc >> "$install_log"
|
|
dd if="${DEST_VOL}/Private/tmp/usr/standalone/i386/${diskloader}" of=/tmp/newMBR bs=440 count=1 conv=notrunc
|
|
echo fdisk -f /tmp/newMBR -u -y ${bootrdisk} >> "$install_log"
|
|
fdisk -f /tmp/newMBR -u -y ${bootrdisk}
|
|
echo "" >> "$install_log"
|
|
|
|
### Stage 1 ###
|
|
|
|
# Use temporary files because the partition will be unmount
|
|
tmp_log=/tmp/install.log
|
|
partitionloaderfat_copy="/tmp/$partitionloaderfat"
|
|
partitionloaderexfat_copy="/tmp/$partitionloaderexfat"
|
|
partitionloaderhfs_copy="/tmp/$partitionloaderhfs"
|
|
cp -p "${DEST_VOL}/Private/tmp/usr/standalone/i386/${partitionloaderfat}" "$partitionloaderfat_copy"
|
|
cp -p "${DEST_VOL}/Private/tmp/usr/standalone/i386/${partitionloaderexfat}" "$partitionloaderexfat_copy"
|
|
cp -p "${DEST_VOL}/Private/tmp/usr/standalone/i386/${partitionloaderhfs}" "$partitionloaderhfs_copy"
|
|
|
|
# Try to unmount the partition first
|
|
mnt_pt=$(LC_ALL=C mount | egrep "^$bootdev on" | sed 's/^.* on *//;s/ ([^(]*//')
|
|
if [[ -n "$mnt_pt" ]]; then
|
|
# Try to umount the partition with umount
|
|
umount $bootdev 2>/dev/null
|
|
if [[ $? -ne 0 ]]; then
|
|
# If it doesn't work try with diskutil
|
|
diskutil unmount $bootdev 2>/dev/null
|
|
[[ $? -ne 0 ]] && mnt_pt=''
|
|
fi
|
|
fi
|
|
|
|
if [[ ${boot_volume_format} = "hfs" ]]; then
|
|
echo "Stage 1 - Writing ${partitionloaderhfs} to ${bootrdev}" >> "$tmp_log"
|
|
echo "File system is HFS." >> "$tmp_log"
|
|
echo "dd if=${partitionloaderhfs_copy} of=${bootrdev}" >> "$tmp_log"
|
|
dd if="${partitionloaderhfs_copy}" of=${bootrdev}
|
|
|
|
elif [[ ${boot_volume_format} = "msdos" ]]; then
|
|
echo "Stage 1 - Writing ${partitionloaderfat} to ${bootrdev}" >> "$tmp_log"
|
|
|
|
# copy partition boot sector to origbs
|
|
echo "dd if=${bootrdev} count=1 bs=512 of=/tmp/origbs" >> "$tmp_log"
|
|
dd if=${bootrdev} count=1 bs=512 of=/tmp/origbs
|
|
|
|
if [[ -n $(cat /tmp/origbs | grep FAT16) ]]; then
|
|
echo "boot volume format is FAT16" >> "$tmp_log"
|
|
echo "No Stage1 was written" >> "$tmp_log"
|
|
else
|
|
echo "boot volume format is FAT32" >> "$tmp_log"
|
|
# copy boot1f32 to newbs
|
|
echo "cp ${partitionloaderfat_copy} /tmp/newbs" >> "$tmp_log"
|
|
cp -f "${partitionloaderfat_copy}" /tmp/newbs
|
|
|
|
# "merge" origbs into newbs
|
|
echo "dd if=/tmp/origbs of=/tmp/newbs skip=3 seek=3 bs=1 count=87 conv=notrunc" >> "$tmp_log"
|
|
dd if=/tmp/origbs of=/tmp/newbs skip=3 seek=3 bs=1 count=87 conv=notrunc
|
|
|
|
# write newbs to the partition boot sector
|
|
echo "dd if=/tmp/newbs of=${bootrdev}" >> "$tmp_log"
|
|
dd if=/tmp/newbs count=1 bs=512 of=${bootrdev}
|
|
fi
|
|
elif [[ ${boot_volume_format} = "exfat" ]]; then
|
|
echo "Stage 1 - Writing ${partitionloaderexfat} to ${bootrdev}" >> "$tmp_log"
|
|
echo "File system is ExFat." >> "$tmp_log"
|
|
echo "$boot1install -y -f ${partitionloaderexfat_copy} ${bootrdev}" >> "$tmp_log"
|
|
"$boot1install" -y -f "${partitionloaderexfat_copy}" ${bootrdev}
|
|
else
|
|
echo "Unknown boot volume format: $boot_volume_format" >> "$tmp_log"
|
|
echo "No Stage1 was written" >> "$tmp_log"
|
|
fi
|
|
|
|
# Now try to remount the partition
|
|
if [[ -n "$mnt_pt" ]]; then
|
|
[[ ! -d "$mnt_pt" ]] && mkdir -p "$mnt_pt"
|
|
# First try to mount with the mount command
|
|
mount -t "$boot_volume_format" "$bootdev" "$mnt_pt"
|
|
# If failed try with diskutil
|
|
[[ $? -ne 0 ]] && diskutil mount -mountPoint "$mnt_pt" "$bootdev"
|
|
fi
|
|
|
|
# Copy temporary log to install_log
|
|
cat "$tmp_log" >> "$install_log"
|
|
# Remove tempory files
|
|
rm -f "$tmp_log"
|
|
rm -f "$partitionloaderfat_copy"
|
|
rm -f "$partitionloaderexfat_copy"
|
|
rm -f "$partitionloaderhfs_copy"
|
|
|
|
echo "" >> "$install_log"
|
|
|
|
if [[ "$bootdisk_partition_scheme" == mbr && "$diskloader" == boot0af ]]; then
|
|
echo "Setup Active Partition to be: ${bootslice}" >> "$install_log"
|
|
fdisk -e ${bootrdisk} <<-MAKEACTIVE
|
|
print
|
|
flag ${bootslice}
|
|
write
|
|
y
|
|
quit
|
|
MAKEACTIVE
|
|
|
|
partitionactive=$( fdisk -d ${bootrdisk} | grep -n "*" | awk -F: '{print $1}')
|
|
echo "New Active Partition: ${partitionactive}" >> "$install_log"
|
|
echo "" >> "$install_log"
|
|
fi
|
|
|
|
# Mark that the option was selected
|
|
$plistbuddy -c "Add $installer_choice bool true" "$CLOVER_INSTALLER_PLIST_NEW" >/dev/null
|
|
|
|
# Clean Up
|
|
rm -f /tmp/origbs /tmp/newbs
|
|
|
|
exit
|