Files
osx-iso/osxiso
Buster Collings e7775b8c22 Refactor
Lil cleaner, clearer and easier to use.
2017-12-08 10:52:26 -06:00

195 lines
5.0 KiB
Bash
Executable File

#!/usr/bin/env bash
function osxiso() {
PS3="
Select OS or Quit: "
temp="$PWD/temp"
dist="$PWD/dist"
base_mount="/Volumes/OS X Base System"
build_mount="/Volumes/install_build"
app_mount="/Volumes/install_app"
apps_v1="|macOS Sierra|OS X El Capitan|OS X Yosemite|OS X Mavericks|"
apps_v2="|macOS High Sierra|"
apps=(
"macOS High Sierra"
"macOS Sierra"
"OS X El Capitan"
"OS X Yosemite"
"OS X Mavericks"
)
apps_available=()
function log_warning() {
echo "$(tput setab 3)$(tput setaf 0)>> $* $(tput sgr0)"
}
function log_error() {
>&2 echo "$(tput setab 1)$(tput setaf 7)>> $* $(tput sgr0)"
}
function log_success() {
echo "$(tput setab 2)$(tput setaf 7)$*$(tput sgr0)"
}
function detach_mounts() {
# Unmount OS
[[ ! -d "/Volumes/Install $1" ]] || hdiutil detach "/Volumes/Install $1"
# Unmount the installer image
[[ ! -d "$app_mount" ]] || hdiutil detach "$app_mount"
# Unmount the sparse bundle
[[ ! -d "$base_mount" ]] || hdiutil detach "$base_mount"
# Unmount temporary build path
[[ ! -d "$build_mount" ]] || hdiutil detach "$build_mount"
}
function cleanup() {
detach_mounts "$1"
# Remove temp directory
rm -rf "$temp"
}
function abort() {
echo
log_error "Command returned with error, aborting ..."
echo
exit 2
}
function prep_build() {
# Attempt cleanup of any failed previous attempts
cleanup "$1"
# Prepare to do work
mkdir -p "$temp"
mkdir -p "$dist"
}
function build_v1() {
trap cleanup EXIT
trap abort ERR
local app_file="/Applications/Install $1.app"
prep_build
# Mount the installer image
hdiutil attach "$app_file/Contents/SharedSupport/InstallESD.dmg" -noverify -nobrowse -mountpoint "$app_mount"
# Create a blank ISO of 7316MB with a Single Partition
hdiutil create -o "$temp/$1.cdr" -size 7316m -layout SPUD -fs HFS+J
# Mount the blank ISO
hdiutil attach "$temp/$1.cdr.dmg" -noverify -nobrowse -mountpoint "$build_mount"
# Restore the Base System into the blank ISO
asr restore -source "$app_mount/BaseSystem.dmg" -target "$build_mount" -noprompt -noverify -erase
# Remove Package link and replace with actual files
rm "$base_mount/System/Installation/Packages"
cp -rp "$app_mount/Packages" "$base_mount/System/Installation/"
# Copy "$1" installer dependencies
cp -rp "$app_mount/BaseSystem.chunklist" "$base_mount/BaseSystem.chunklist"
cp -rp "$app_mount/BaseSystem.dmg" "$base_mount/BaseSystem.dmg"
detach_mounts "$1"
# Convert the sparse bundle to ISO/CD master
hdiutil convert "$temp/$1.cdr.dmg" -format UDTO -o "$temp/$1.iso"
# Rename the ISO and move it to the distribution dir
mv "$temp/$1.iso.cdr" "$dist/$1.iso"
cleanup
echo
log_success "========== FINISHED =========="
echo
printf "ISO is located at: '%s'\n\n" "$dist/$1.iso"
}
function build_v2() {
trap cleanup EXIT
trap abort ERR
local app_file="/Applications/Install $1.app"
prep_build "$1"
# Create a blank ISO of 7316MB with a Single Partition
hdiutil create -o "$temp/$1.cdr" -size 7316m -layout SPUD -fs HFS+J
# Mount the blank ISO
hdiutil attach "$temp/$1.cdr.dmg" -noverify -nobrowse -mountpoint "$build_mount"
# Let createinstallmedia populate the blank ISO
printf "$(tput setab 3)$(tput setaf 0)%s$(tput sgr0) " "<sudo>"
sudo "$app_file"/Contents/Resources/createinstallmedia --volume "$build_mount" --nointeraction
detach_mounts "$1"
# Convert the sparse bundle to ISO/CD master
hdiutil convert "$temp/$1.cdr.dmg" -format UDTO -o "$temp/$1.iso"
# Rename the ISO and move it to the distribution dir
mv "$temp/$1.iso.cdr" "$dist/$1.iso"
cleanup
echo
log_success "========== FINISHED =========="
echo
printf "ISO is located at: '%s'\n\n" "$dist/$1.iso"
}
function choose() {
echo
select app in "${apps_available[@]}"; do
case "$app" in
"Quit")
break
;;
*)
if [[ "$apps_v2" == *"|$app|"* ]]; then
log_success "** Building ISO for $app **"
build_v2 "$app"
elif [[ "$apps_v1" == *"|$app|"* ]]; then
log_success "** Building ISO for $app **"
build_v1 "$app"
else
log_error "You must select a valid option *number* from the list."
choose
fi
break
;;
esac
done
}
function main() {
for app in "${apps[@]}"; do
if [[ -d "/Applications/Install $app.app" ]]; then
apps_available+=("$app")
else
log_warning "Missing /Applications/Install $app.app"
fi
done
[[ ${#apps_available[@]} -eq 0 ]] && log_error "You do not have any installer apps available. You can download them from the App Store and try again!" && exit 1
apps_available+=("Quit")
choose
}
main
}
## Export or run
if [[ "${BASH_SOURCE[0]}" != "$0" ]]; then
export -f osxiso
else
osxiso
fi