CloverBootloader/CloverApp/bootsectors-install
vectorsigma72 97ccb4840a Clover.app v1 Alpha
Agent application (macOS 10.11+).  More info at https://www.insanelymac.com/forum/topic/341047-cloverapp-testing/
2019-11-06 23:58:10 +01:00

184 lines
5.3 KiB
Bash
Executable File

#!/bin/bash
# Created by vector sigma on 04/11/2019.
# Copyright © 2019 CloverHackyColor. All rights reserved.
cd /tmp
journaled=0
disk="${1}"
filesystem="${2}"
partition_scheme="${3}"
boot0="/tmp/${4}"
boot1="/tmp/${5}"
bootdev="/dev/${disk}"
bootrdev=${bootdev/disk/rdisk}
bootdisk="${bootdev%s*}"
bootrdisk="${bootdisk/disk/rdisk}"
bootslice="${bootdev#*disk*s}"
boot1install="/tmp/boot1-install"
echo
echo "Installing boot sectors (version of Wed 6 2019, 12:03)"
echo
echo "disk: ${disk}"
echo "bootdev: ${bootdev}"
echo "bootrdev: ${bootrdev}"
echo "bootdisk: ${bootdisk}"
echo "bootrdisk: ${bootrdisk}"
echo "bootslice: ${bootslice}"
echo "filesystem: ${filesystem}"
echo "partition_scheme: ${partition_scheme}"
echo
if [[ "$disk" != disk* ]]; then
echo "Error: target disk not specified."
exit 1
fi
if [ "${partition_scheme}" != FDisk_partition_scheme ] && \
[ "${partition_scheme}" != GUID_partition_scheme ]; then
echo "Error: unsupported Partition Scheme Map \"${partition_scheme}\"."
exit 1
fi
if [ "${filesystem}" != fat32 ] && \
[ "${filesystem}" != hfs ] && \
[ "${filesystem}" != exfat ]; then
echo "Error: unsupported filesystem \"${filesystem}\""
exit 1
fi
if [[ ! -f "${boot0}" ]] || [[ ! -f "${boot1}" ]]; then
echo "Error: cannot found boot sectors."
exit 1
fi
if [[ ! -f "${boot1install}" ]]; then
echo "Error: cannot found boot1-install."
exit 1
fi
chmod +x "${boot1install}"
echo
diskutil list
echo
# hfs can cause a panic writing boot sectors if journaled
# panic(cpu 0 caller 0xffffff7fa32683ad): "jnl: end_tr: !!!DANGER!!! bp 0xffffff8134a09650 flags (0x101) not LOCKED & DELWRI\n"@/
# code:
# panic("jnl: end_tr: !!!DANGER!!! bp %p flags (0x%x) not LOCKED & DELWRI\n", bp, buf_flags(bp));
# fix? disable the journal (will be reactivated later)
if [[ $(LC_ALL=C diskutil info "${disk}" | grep 'File System Personality:') == *ournaled* ]]; then
diskutil disableJournal "${disk}"
journaled=1
fi
# 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
### Stage 0 ###
echo "Stage 0 - Writing ${boot0} to ${bootrdisk}"
echo "Executing: dd if=${bootrdisk} count=1 bs=512 of=/tmp/CloverOrigMBR"
dd if="${bootrdisk}" count=1 bs=512 of=/tmp/CloverOrigMBR
echo "Executing: cp /tmp/CloverOrigMBR /tmp/CloverNewMBR"
cp /tmp/CloverOrigMBR /tmp/CloverNewMBR
echo "Executing: dd if=${boot0} of=/tmp/CloverNewMBR bs=440 count=1 conv=notrunc"
dd if="${boot0}" of=/tmp/CloverNewMBR bs=440 count=1 conv=notrunc
echo "Executing: fdisk -f /tmp/CloverNewMBR -u -y ${bootrdisk}"
fdisk -f /tmp/CloverNewMBR -u -y "${bootrdisk}"
if [[ ${filesystem} = "hfs" ]]; then
echo "Stage 1 - Writing ${boot1} to ${bootrdev}"
echo "File system is HFS."
echo "Executing: dd if=${boot1} of=${bootrdev}"
dd if="${boot1}" of="${bootrdev}"
elif [[ ${filesystem} = "fat32" ]]; then
echo "Stage 1 - Writing ${boot1} to ${bootrdev}"
# copy partition boot sector to CloverOrigPBR
echo "Executing: dd if=${bootrdev} count=1 bs=512 of=/tmp/CloverOrigPBR"
dd if="${bootrdev}" count=1 bs=512 of=/tmp/CloverOrigPBR
if [[ -n $(cat /tmp/CloverOrigPBR | grep FAT16) ]]; then
echo "boot volume format is FAT16"
echo "No Stage1 was written"
else
echo "boot volume format is FAT32"
# copy boot1f32 to CloverNewPBR
echo "Executing: cp ${boot1} /tmp/CloverNewPBR"
cp -f "${boot1}" /tmp/CloverNewPBR
# "merge" CloverOrigPBR into CloverNewPBR
echo "Executing: dd if=/tmp/CloverOrigPBR of=/tmp/CloverNewPBR skip=3 seek=3 bs=1 count=87 conv=notrunc"
dd if=/tmp/CloverOrigPBR of=/tmp/CloverNewPBR skip=3 seek=3 bs=1 count=87 conv=notrunc
# write CloverNewPBR to the partition boot sector
echo "Executing: dd if=/tmp/CloverNewPBR of=${bootrdev}"
dd if=/tmp/CloverNewPBR count=1 bs=512 of="${bootrdev}"
fi
elif [[ ${filesystem} = "exfat" ]]; then
echo "Stage 1 - Writing ${boot1} to ${bootrdev}"
echo "File system is ExFat."
echo "Executing: $boot1install -y -f ${boot1} ${bootrdev}"
"$boot1install" -y -f "${boot1}" "${bootrdev}"
else
echo "Unknown boot volume format: $filesystem"
echo "No Stage1 was written"
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 "$filesystem" "$bootdev" "$mnt_pt"
# If failed try with diskutil
[[ $? -ne 0 ]] && diskutil mount -mountPoint "$mnt_pt" "$bootdev"
fi
if [[ "${partition_scheme}" == FDisk_partition_scheme && "$boot0" == "/tmp/boot0af" ]]; then
echo "Setup Active Partition to be: ${bootslice}"
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}"
echo ""
fi
if [[ $journaled -ne 0 ]]; then
diskutil enableJournal "${disk}"
fi
rm -rf /tmp/Clover*
rm -rf /tmp/boot1*
rm -rf /tmp/boot2*
rm -rf /tmp/bootsec*
exit 0