#!/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 "$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