| #!/bin/bash␊ |
| ␊ |
| ␊ |
| diskloader="boot0hfs"␊ |
| partitionloader="boot1h"␊ |
| filesystemloader="boot"␊ |
| ␊ |
| diskmicrocodetype[1]="GRUB,47525542"␊ |
| diskmicrocodetype[2]="LILO,4c494c4f"␊ |
| ␊ |
| start ()␊ |
| {␊ |
| # 1 volume␊ |
| ␊ |
| bootvolume="${@}"␊ |
| echo "Volume is $bootvolume"␊ |
| bootresources="${0%/*}"␊ |
| echo "$bootresources"␊ |
| ␊ |
| if [ -z "${bootvolume}" ]; then␊ |
| ␉echo␊ |
| ␉echo "Cannot find the volume. Exiting."␊ |
| ␉echo␊ |
| ␉exit␊ |
| fi␊ |
| ␊ |
| bootdev=$( df "${bootvolume}" | sed -n '2p' | awk '{print $1}' )␊ |
| 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}␊ |
| ␊ |
| echo "Volume is ${bootvolume}"␊ |
| echo "Volume device is ${bootdev}"␊ |
| echo "Volume raw device is ${bootrdev}"␊ |
| echo "Volume slice is ${bootslice}"␊ |
| echo "Disk device is ${bootdisk}"␊ |
| echo "Disk raw device is ${bootrdisk}"␊ |
| echo "Disk loader is ${diskloader}"␊ |
| echo "Partition loader is ${partitionloader}"␊ |
| echo "Filesystem loader is ${filesystemloader}"␊ |
| echo "Boot Resources is ${bootresources}"␊ |
| ␊ |
| }␊ |
| ␊ |
| checkdiskmicrocodetype ()␊ |
| {␊ |
| diskmicrocode=$( dd 2>/dev/null if=${bootdisk} count=1 | dd 2>/dev/null count=1 bs=437 | perl -ne '@a=split"";for(@a){printf"%02x",ord}' )␊ |
| ␊ |
| diskmicrocodetypecounter=0␊ |
| while [ ${diskmicrocodetypecounter} -lt ${#diskmicrocodetype[@]} ]; do␊ |
| diskmicrocodetypecounter=$(( ${diskmicrocodetypecounter} + 1 ))␊ |
| diskmicrocodetypeid=${diskmicrocodetype[${diskmicrocodetypecounter}]#*,}␊ |
| if [ ! "${diskmicrocode}" = "${diskmicrocode/${diskmicrocodetypeid}/}" ]; then␊ |
| echo "${diskmicrocodetype[${diskmicrocodetypecounter}]%,*} found."␊ |
| fi␊ |
| done␊ |
| }␊ |
| ␊ |
| checkdiskmicrocode ()␊ |
| {␊ |
| # 1 action ( check or set )␊ |
| ␊ |
| diskmicrocode=$( dd 2>/dev/null if=${bootdisk} count=1 | dd 2>/dev/null count=1 bs=437 | perl -ne '@a=split"";for(@a){printf"%02x",ord}' )␊ |
| diskmicrocodemd5=$( dd 2>/dev/null if=${bootdisk} count=1 | dd 2>/dev/null count=1 bs=437 | md5 )␊ |
| ␊ |
| if [ $( echo "${diskmicrocode}" | awk -F0 '{print NF-1}' ) = 874 ]; then␊ |
| ␉if [ "${1}" = "set" ]; then␊ |
| ␉␉echo "No disk microcode found. Updating."␊ |
| ␉␉diskupdate=true␊ |
| ␉else␊ |
| ␉␉echo "No disk microcode found."␊ |
| ␉fi␊ |
| else␊ |
| ␉if [ ${1} = set ]; then␊ |
| ␉␉echo "Disk microcode found. Preserving."␊ |
| ␉else␊ |
| ␉␉echo "Disk microcode found."␊ |
| ␉fi␊ |
| ␉echo "Disk microcode MD5 is ${diskmicrocodemd5}"␊ |
| fi␊ |
| }␊ |
| ␊ |
| checkdisksignature ()␊ |
| {␊ |
| disksignature=$( dd 2>/dev/null if=${bootdisk} count=1 | dd 2>/dev/null count=4 bs=1 skip=440 | perl -ne '@a=split"";for(@a){printf"%02x",ord}' )␊ |
| ␊ |
| if [ $( echo "${disksignature}" | awk -F0 '{print NF-1}' ) = 8 ]; then␊ |
| ␉echo "No disk signature found."␊ |
| else␊ |
| ␉echo "Disk signature found."␊ |
| ␉echo "Disk signature is 0x${disksignature}"␊ |
| fi␊ |
| }␊ |
| ␊ |
| checkpartitionbootcode ()␊ |
| {␊ |
| # 1 action ( check or set )␊ |
| ␊ |
| partitionbootcode=$( dd if=${bootrdev} count=1 2>/dev/null | perl -ne '@a=split"";for(@a){printf"%02x",ord}' )␊ |
| partitionbootcodeextended=$( dd if=${bootrdev} count=1 skip=1 2>/dev/null | perl -ne '@a=split"";for(@a){printf"%02x",ord}' )␊ |
| ␊ |
| if [ $( echo "${partitionbootcode}" | awk -F0 '{print NF-1}' ) = 1024 ]; then␊ |
| ␉if [ "${1}" = "set" ]; then␊ |
| ␉␉echo "No partition bootcode found. Updating."␊ |
| ␉else␊ |
| ␉␉echo "No partition bootcode found."␊ |
| ␉fi␊ |
| else␊ |
| ␉if [ "${1}" = "set" ]; then␊ |
| ␉␉echo "Partition bootcode found. Overwriting."␊ |
| ␉else␊ |
| ␉␉echo "Partition bootcode found."␊ |
| ␉fi␊ |
| ␉if [ $( echo "${partitionbootcodeextended}" | awk -F0 '{print NF-1}' ) = 1024 ]; then␊ |
| ␉␉partitionbootcodemd5=$( dd 2>/dev/null if=${bootrdev} count=1 | md5 )␊ |
| ␉else␊ |
| ␉␉partitionbootcodemd5=$( dd 2>/dev/null if=${bootrdev} count=2 | md5 )␊ |
| ␉␉echo "Partition bootcode is dual sector."␊ |
| ␉fi␊ |
| ␉echo "Partition bootcode MD5 is ${partitionbootcodemd5}"␊ |
| fi␊ |
| }␊ |
| ␊ |
| checkpartitionactive ()␊ |
| {␊ |
| partitionactive=$( fdisk440 -d ${bootrdisk} | grep -n "*" | awk -F: '{print $1}')␊ |
| ␊ |
| if [ -n "${partitionactive}" ]; then ␊ |
| ␉echo "Partition flagged active is ${partitionactive}"␊ |
| else␊ |
| ␉echo "No partition flagged active."␊ |
| fi␊ |
| ␊ |
| }␊ |
| ␊ |
| start ${3}␊ |
| ␊ |
| #partitiontable=$( diskutil list ${bootdisk} | sed -n '3p' | awk '{print $2}' )␊ |
| #[ "${partitiontable}" = "GUID_partition_scheme" ] && echo "GPT found."␊ |
| #[ "${partitiontable}" = "FDisk_partition_scheme" ] && echo "MBR found."␊ |
| #[ "${partitiontable}" = "Apple_partition_scheme" ] && echo "APT found." && exit␊ |
| ␊ |
| partitiontable=$( dd 2>/dev/null if=${bootdisk} count=1 skip=1 | dd 2>/dev/null count=8 bs=1 | perl -ne '@a=split"";for(@a){printf"%02x",ord}' )␊ |
| if [ "${partitiontable:0:16}" == "4546492050415254" ]; then␉␊ |
| ␉partitiontable=$( dd 2>/dev/null if=${bootdisk} count=1 | dd 2>/dev/null count=64 bs=1 skip=446 | perl -ne '@a=split"";for(@a){printf"%02x",ord}' )␊ |
| ␉if [ "${partitiontable:8:2}" == "ee" ]; then␊ |
| ␉␉if [ "${partitiontable:40:2}" == "00" ] && [ "${partitiontable:72:2}" == "00" ] && [ "${partitiontable:104:2}" == "00" ]; then␊ |
| ␉␉␉partitiontable="GPT"␊ |
| ␉ ␉else␊ |
| ␉␉␉partitiontable="GPT/MBR"␊ |
| ␉␉fi␊ |
| ␉fi␊ |
| else␊ |
| ␉partitiontable="MBR"␊ |
| fi␊ |
| ␊ |
| echo "${partitiontable} found."␊ |
| ␊ |
| diskupdate=false␊ |
| ␊ |
| checkdiskmicrocodetype␊ |
| checkdiskmicrocode set␊ |
| checkdisksignature␊ |
| checkpartitionbootcode set␊ |
| checkpartitionactive␊ |
| ␊ |
| if ${diskupdate}; then␊ |
| ␉echo "Executing command: fdisk -u -f /usr/standalone/i386/${diskloader} -y ${bootdisk}"␊ |
| ␉fdisk -u -f "${bootvolume}/usr/standalone/i386/${diskloader}" -y ${bootdisk}␊ |
| fi␊ |
| ␊ |
| echo "Executing command: dd if=/usr/standalone/i386/${partitionloader} of=${bootrdev}"␊ |
| dd if="${bootvolume}/usr/standalone/i386/${partitionloader}" of=${bootrdev}␊ |
| ␊ |
| echo "Executing command: cp /usr/standalone/i386/${filesystemloader} ${bootvolume}"␊ |
| cp "${bootvolume}/usr/standalone/i386/${filesystemloader}" "${bootvolume}"␊ |
| ␊ |
| echo "Executing command: ${bootresources}/Tools/SetFile -a V ${bootvolume}/${filesystemloader}"␊ |
| "${bootresources}/Tools/SetFile" -a V "${bootvolume}/${filesystemloader}"␊ |
| ␊ |
| # If table is GPT make the first partition active (BadAxe compatibility).␊ |
| [ "${partitiontable}" = "GPT" ] && bootslice=1␊ |
| fdisk440 -e ${bootdisk} <<-MAKEACTIVE␊ |
| print␊ |
| flag ${bootslice}␊ |
| write␊ |
| y␊ |
| quit␊ |
| MAKEACTIVE␊ |
| ␊ |
| checkdiskmicrocode check␊ |
| checkdisksignature␊ |
| checkpartitionbootcode check␊ |
| checkpartitionactive␊ |
| ␊ |
| # Check efi partition␊ |
| if [ -d /Volumes/EFI ]; then␊ |
| ␉umount -f /Volumes/EFI␊ |
| ␉rm -R -f /Volumes/EFI␊ |
| fi␊ |
| ␊ |
| if ! [ -d "${bootvolume}/Extra/Extensions" ]; then␊ |
| #␉echo "Executing command: mkdir -p ${bootvolume}/Extra/Extensions"␊ |
| ␉mkdir -p "${bootvolume}/ExtraBackup"␊ |
| ␉cp -f -R "${bootvolume}/Extra" "${bootvolume}/ExtraBackup"␊ |
| ␉rm -f -R "${bootvolume}/Extra"␊ |
| fi␊ |
| # unpack any existing Extensions.mkext already on the booter volume␊ |
| if [ -f "${2}/ExtraBackup/Extensions.mkext" ]; then␊ |
| ␉echo "Executing command: mkextunpack -d ${2}/Extra/Extensions ${2}/ExtraBackup/Extensions.mkext"␊ |
| ␉mkextunpack -d "${2}/.Chameleon/Extra/Extensions" "${2}/.Chameleon/ExtraBackup/Extensions.mkext"␊ |
| ␉echo "Executing command: rm -R -f ${2}/ExtraBackup/Extensions.mkext"␊ |
| ␉rm -R -f "${2}/ExtraBackup/Extensions.mkext"␊ |
| fi␉␊ |
| ␊ |
| # setup link for extras␊ |
| #[ -h "${2}/.Chameleon" ] && unlink "${2}/.Chameleon"␊ |
| #echo "Executing command: ln -s . ${2}/.Chameleon"␊ |
| #ln -s "${2}" "${2}/.Chameleon"␊ |
| ␊ |
| exit |