#!/bin/bash
main ()
{
tempDir="${destainationDrive}/.Chameleon/"
echo "DEBUG: tempDir is ${tempDir}"
if [ ! -d "${tempDir}" ]; then
echo "the temporary directory does not exist so no boot options have been selected"
else
# check for see if there are any boot options in the temporary directory
cd "${tempDir}"
Dirlist=$(find . -type d | grep "@")
if [ "${Dirlist}" ]; then
echo "==============================================="
echo "set com.apple.Boot.plist variables"
echo "**********************************"
#bootplist="${destainationDrive}/.Chameleon/Extra/com.apple.Boot.plist"
bootplist="${tempDir}/Extra/com.apple.Boot.plist"
echo "DEBUG: bootplist = ${bootplist}"
systemplist="/Library/Preferences/SystemConfiguration/com.apple.Boot.plist"
echo "DEBUG: systemplist= ${systemplist}"
echo "if no directory exists named ${bootplist%/*} then mkdir ${bootplist%/*}"
[ ! -d "${bootplist%/*}" ] && mkdir -p "${bootplist%/*}"
if [ ! -f "${bootplist}" ]; then
echo "${bootplist} doesn't exist"
if [ -f "${systemplist}" ]; then
echo "${systemplist} doesn't exist"
echo "copy ${systemplist} to ${bootplist}"
cp "${systemplist}" "${bootplist}"
fi
fi
echo "-----------------------------------------------"
echo ""
echo "==============================================="
echo "Build Extra/com.apple.Boot.plist"
echo "********************************"
for directory in $Dirlist ; do
overide=$(echo $directory | sed 's/_/ /g' | tr -d "./@" |cut -d '+' -f1)
string=$(echo $directory | tr -d "./@" |cut -d'+' -f2)
bootoptionshdextra[1]="${overide}"
bootoptionshdextra[2]="${string}"
#echo "DEBUG: bootoptionshdextra 1 = ${bootoptionshdextra[1]}"
#echo "DEBUG: bootoptionshdextra 2= ${bootoptionshdextra[2]}"
xmlvalue=$( getxmlvalue ${overide} "${bootplist}" | tr "[:upper:]" "[:lower:]" )
case "${xmlvalue:0:1}" in
y) echo "${overide}=y already set in ${bootplist} skipping."
echo ""
;;
n) echo "${overide}=n is set in ${bootplist} leaving."
echo ""
;;
*) echo "Adding ${overide}=${string} to ${bootplist}"
array=("${bootoptionshdextra[@]}")
searchfilereplaceline "${bootplist}" "Kernel Flags" "" "" "2"
echo ""
;;
esac
#echo "set owner privileges for ${bootplist}"
chown "${USER}:20" "${bootplist}"
done
echo "-----------------------------------------------"
echo ""
echo "==============================================="
echo "Remove Boot Options Folders"
echo "***************************"
#Note - Can this be somehow included above and delete the directory after reading it?
#cd "${3}/.Chameleon/"
Dirlist=$(find . -type d | grep "@")
for directory in $Dirlist ; do
echo $directory
rm -rf $directory
done
echo "-----------------------------------------------"
echo ""
else
echo "No boot options in the temporary directory."
fi
fi
}
getxmlvalue ()
{
# 1 xml key
# 2 xml file
if [ -f "${2}" ]; then
local value
while read value; do
if [ ! "${value}" = "${value/${1}/}" ]; then
read value
value="${value#*<}" ; value="<${value}" ; value="${value#*>}" ; value="${value# *}" ; value="${value%%<*}"
echo "$value"
break
fi
done < "${2}"
fi
}
searchfilereplaceline ()
{
mv "${1}" "${1}.orig"
prefunctionifs="${IFS}"
unset fileinput
unset fileoutput
unset find
unset replace
unset deletelines
unset deletelinesskip
unset insertlinesskip
fileinput="${1}.orig"
fileoutput="${1}"
find="${2}"
replace="${3}"
deletelines="${4%,*}"
insertlinesskip="${5}"
matchlinefound="0"
if [ "${#4}" = "${4#*,}" ]; then
deletelinesskip="0"
else
deletelinesskip="${4#*,}"
fi
IFS="\n"
while read line
do
{
if [ ! "${line}" = "${line/${find}/}" ]; then
{
# Trim the longest match from the end for <*
xmlelementindent="${line%%<*}"
# Trim the longest match from the start for *<
xmlelementtemp="${line#*<}"
# Add back in stripped <
xmlelement="<${xmlelementtemp}"
# Trim the shortest match from the start for <
xmltagtemp="${xmlelement#<}"
# Trim the longest match from the end for >*
xmltag="${xmltagtemp%%>*}"
# Trim the shortest match from the start for *>
xmltexttemp="${xmlelement#*>}"
# Trim the longest match from the end for <*
xmltext="${xmltexttemp%%<*}"
if [ "${replace}" ]; then
{
echo "${xmlelementindent}<${xmltag}>${replace}${xmltag}>" >>"${fileoutput}"
}
else
{
echo "${line}" >>"${fileoutput}"
}
fi
matchlinefound="1"
}
else
{
if [ "${insertlinesskip}" ] && [ "${matchlinefound}" -gt 0 ] && [ "${matchlinefound}" -le "${insertlinesskip}" ]; then
{
if [ "${matchlinefound}" = "${insertlinesskip}" ]; then
{
arraysize=0
while [ ${arraysize} -lt ${#array[@]} ];
do
echo "${xmlelementindent}${array[${arraysize}]}" >>"${fileoutput}"
let arraysize="${arraysize}+1"
done
}
fi
}
fi
if [ "${deletelines}" ] && [ "${matchlinefound}" -gt 0 ] && [ "${matchlinefound}" -lt $((${deletelines}+${deletelinesskip})) ] && [ "${matchlinefound}" -ge ${deletelinesskip} ]; then
{
:
}
else
{
echo "${line}" >>"${fileoutput}"
}
fi
if [ "${matchlinefound}" -gt 0 ]; then
let matchlinefound="${matchlinefound}+1"
fi
}
fi
}
done < "${fileinput}"
IFS=${prefunctionifs}
rm -f "${fileinput}"
}
echo "==============================================="
echo "Enter Build Boot Options script"
echo "*******************************"
# get the passed destination drive?
if [ "$#" -eq 1 ]; then
destainationDrive="$1"
echo "DEBUG: passed argument for destainationDrive = $destainationDrive"
fi
# Build Boot Options
main "${1}" "${2}" "${3}" "${4}"
exit 0