From 0aefdf3f1a0c9abb9fc456d8cb3ec91a199a9f65 Mon Sep 17 00:00:00 2001 From: 2Shirt <2xShirt@gmail.com> Date: Thu, 1 Apr 2021 22:54:36 -0600 Subject: [PATCH] Add support to build live macOS Catalina images * Had to drop iTerm due to a library incompatibilty --- setup/macos/Catalina/Utilities.plist | 56 +++++++++++++++ setup/macos/{ => High Sierra}/Utilities.plist | 0 setup/macos/com.apple.Terminal.plist | Bin 0 -> 24418 bytes setup/macos/live-macos-startup | 29 ++++---- setup/macos/update-base-image | 64 +++++++++--------- setup/macos/{zshrc => zshenv} | 0 6 files changed, 104 insertions(+), 45 deletions(-) create mode 100644 setup/macos/Catalina/Utilities.plist rename setup/macos/{ => High Sierra}/Utilities.plist (100%) create mode 100644 setup/macos/com.apple.Terminal.plist rename setup/macos/{zshrc => zshenv} (100%) diff --git a/setup/macos/Catalina/Utilities.plist b/setup/macos/Catalina/Utilities.plist new file mode 100644 index 00000000..b66d8ea1 --- /dev/null +++ b/setup/macos/Catalina/Utilities.plist @@ -0,0 +1,56 @@ + + + + + Buttons + + + BundlePath + /System/Applications/Utilities/Terminal.app + DescriptionKey + Hardware Diagnostics + Path + /System/Applications/Utilities/Terminal.app/Contents/MacOS/Terminal + TitleKey + WizardKit: Hardware Diagnostics + + + BundlePath + /System/Applications/Utilities/Disk Utility.app + DescriptionKey + Repair or erase a volume. + Path + /System/Applications/Utilities/Disk Utility.app/Contents/MacOS/Disk Utility + TitleKey + Disk Utility + + + Menu + + + BundlePath + /System/Applications/Utilities/Startup Security Utility.app + Path + /System/Applications/Utilities/Startup Security Utility.app/Contents/MacOS/Startup Security Utility + TitleKey + Startup Security Utility + + + BundlePath + /System/Library/CoreServices/Applications/Network Utility.app + Path + /System/Library/CoreServices/Applications/Network Utility.app/Contents/MacOS/Network Utility + TitleKey + Network Utility + + + BundlePath + /System/Applications/Utilities/Terminal.app + Path + /System/Applications/Utilities/Terminal.app/Contents/MacOS/Terminal + TitleKey + Terminal + + + + diff --git a/setup/macos/Utilities.plist b/setup/macos/High Sierra/Utilities.plist similarity index 100% rename from setup/macos/Utilities.plist rename to setup/macos/High Sierra/Utilities.plist diff --git a/setup/macos/com.apple.Terminal.plist b/setup/macos/com.apple.Terminal.plist new file mode 100644 index 0000000000000000000000000000000000000000..f5150110f87a6876c82e1bbe12db1f0addeeef4d GIT binary patch literal 24418 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 literal 0 HcmV?d00001 diff --git a/setup/macos/live-macos-startup b/setup/macos/live-macos-startup index ac0f2b93..7a5d5ff5 100755 --- a/setup/macos/live-macos-startup +++ b/setup/macos/live-macos-startup @@ -2,21 +2,19 @@ # ## Init macOS env -# Set Locale -LC_ALL=en_US.UTF-8; export LC_ALL -LANG=en_US.UTF-8; export LANG - -# Set PATH -echo "Updating PATH..." -for p in /usr{/local/opt/{e2fsprogs,ruby,util-linux},/local,}/{bin,sbin}; do +# Update PATH +for p in /usr/local/{,opt/{e2fsprogs,ruby,util-linux}/}{bin,sbin}; do PATH="${p}:${PATH}" done -export PATH # Create and mount RAMDisk -if ! [ -d /Volumes/RAM_Disk ]; then +if ! [[ -d /Volumes/RAM_Disk ]]; then echo "Creating RAM Disk..." - diskutil erasevolume HFS+ RAM_Disk $(hdiutil attach -nomount ram://524288) + RAM_DEV="$(hdiutil attach -nomount ram://524288)" + diskutil quiet erasevolume HFS+ RAM_Disk ${RAM_DEV} + diskutil unmount ${RAM_DEV} + mkdir /Volumes/RAM_Disk + mount -t hfs -o owners ${RAM_DEV} /Volumes/RAM_Disk fi cd /Volumes/RAM_Disk @@ -25,10 +23,13 @@ echo "Getting caffeinated..." caffeinate -id & # Set time -echo "Updating clock..." -if ! sntp -Ss us.pool.ntp.org 2>/dev/null; then - # Assuming we're running under an older version of macOS - sntp -s us.pool.ntp.org 2>/dev/null +if ! [[ -e /Volumes/RAM_Disk/.time_set ]]; then + echo "Updating clock..." + if ! sntp -Ss us.pool.ntp.org >/dev/null 2>&1; then + # Assuming we're running under an older version of macOS + sntp -s us.pool.ntp.org >/dev/null 2>&1 + fi + touch /Volumes/RAM_Disk/.time_set fi # Run cmd diff --git a/setup/macos/update-base-image b/setup/macos/update-base-image index 59015015..f0cc50dd 100755 --- a/setup/macos/update-base-image +++ b/setup/macos/update-base-image @@ -10,18 +10,21 @@ set -o pipefail # Prep echo "Initializing..." BASE_IMAGE="$1" -IMAGE_DEV="$(hdiutil attach "${BASE_IMAGE}" | grep -Eo '(/dev/disk[0-9]+)\b')" -OS_VERSION="$(ls /Volumes/*Base\ System | grep -E 'OS X|macOS' | sed -E 's/Install (OS X|macOS) (.*)\.app/\2/')" -OUT_NAME="${HOME}/Desktop/WK ${OS_VERSION} ($(date +"%Y-%m-%d"))" -WK_PATH="/Volumes/WK_UFD" +IMAGE_DEV="$(hdiutil attach -mountpoint /Volumes/BaseSystem "${BASE_IMAGE}" -nobrowse | grep -Eo '(/dev/disk[0-9]+)\b')" +OS_NAME="$(ls /Volumes/BaseSystem | grep -E 'OS X|macOS' | sed -E 's/Install (OS X|macOS) (.*)\.app/\2/')" +OS_VERSION="$(defaults read /Volumes/BaseSystem/System/Library/CoreServices/SystemVersion ProductVersion)" +OUT_NAME="${HOME}/Desktop/WK ${OS_NAME} ($(date +"%Y-%m-%d"))" +WK_PATH="/Volumes/1201_UFD" # Convert to a 4 GB R/W image -echo "Creating read-write copy of the ${OS_VERSION} Base System image..." +echo "Creating read-write copy of the ${OS_NAME} Base System image..." hdiutil create -srcdevice "${IMAGE_DEV}s1" -format UDSB "${OUT_NAME}.sparsebundle" hdiutil detach "${IMAGE_DEV}" hdiutil resize -size 4g "${OUT_NAME}.sparsebundle" -hdiutil attach "${OUT_NAME}.sparsebundle" -diskutil rename "OS X Base System" "WK_UFD" +WK_IMAGE_DEV="$(hdiutil attach "${OUT_NAME}.sparsebundle" -nobrowse | grep -Eo '(/dev/disk[0-9]+)\b')" +if ! diskutil rename "OS X Base System" "1201_UFD"; then + diskutil rename "macOS Base System" "1201_UFD" +fi # Remove Install app echo "Removing Install app..." @@ -29,10 +32,12 @@ rm -R "${WK_PATH}"/Install*.app # Update Utilities menu echo "Updating Utilities menu..." -if [[ "${OS_VERSION}" == "El Capitan" ]]; then +if [[ "${OS_VERSION:0:5}" == "10.11" ]]; then cp -a "El Capitan/Utilities.plist" "${WK_PATH}/System/Installation/CDIS/OS X Utilities.app/Contents/Resources/Utilities.plist" -else - cp -a Utilities.plist "${WK_PATH}/System/Installation/CDIS/macOS Utilities.app/Contents/Resources/Utilities.plist" +elif [[ "${OS_VERSION:0:5}" == "10.13" ]]; then + cp -a "High Sierra/Utilities.plist" "${WK_PATH}/System/Installation/CDIS/macOS Utilities.app/Contents/Resources/Utilities.plist" +elif [[ "${OS_VERSION:0:5}" == "10.15" ]]; then + cp -a "Catalina/Utilities.plist" "${WK_PATH}/System/Installation/CDIS/macOS Utilities.app/Contents/Resources/Utilities.plist" fi # Homebrew @@ -40,61 +45,58 @@ echo "Installing Hombrew..." mkdir -p "${WK_PATH}/usr/local/bin" ln -s python3 "${WK_PATH}/usr/local/bin/python" rsync -aS /opt/ "${WK_PATH}/opt"/ -rsync -aS --exclude='.git*' /usr/local/{Cellar,Frameworks,Homebrew,bin,etc,include,lib,libexec,opt,sbin,share,var} "${WK_PATH}/usr/local"/ +rsync -aS --exclude='.git*' /usr/local/{Cellar,Frameworks,Homebrew,bin,etc,include,lib,opt,sbin,share,var} "${WK_PATH}/usr/local"/ +if [[ "${OS_VERSION:3:2}" -lt "15" ]]; then + rsync -aS --exclude='*.git' /usr/local/libexec "${WK_PATH}/usr/local"/ +fi # Fonts echo "Installing Fonts..." cp -a /Library/Fonts/Inconsolata*ttf "${WK_PATH}/System/Library/Fonts"/ -# iTerm2 -echo "Installing iTerm2..." -if [[ "${OS_VERSION}" == "El Capitan" ]]; then - rsync -aS /Applications/iTerm.app "${WK_PATH}/Applications"/ - rsync -aS "El Capitan/com.googlecode.iterm2.plist" "${WK_PATH}/var/root/Library/Preferences"/ -else - rsync -aS /Applications/iTerm-2.app "${WK_PATH}/Applications"/ - rsync -aS com.googlecode.iterm2.plist "${WK_PATH}/var/root/Library/Preferences"/ - rsync -aS /usr/lib/lib{apr,expat,ffi}* /Volumes/WK_UFD/usr/lib/ - rsync -aS /System/Library/Frameworks/{MetalKit,Quartz*}.framework "${WK_PATH}/System/Library/Frameworks"/ -fi -cp -a ../linux/include/airootfs/etc/skel/.tmux.conf "${WK_PATH}/etc/tmux.conf" -rsync -aS /System/Library/Colors/System.clr "${WK_PATH}/System/Library/Colors"/ -rsync -aS /System/Library/Frameworks/{Scripting,ScriptingBridge,LocalAuthentication}.framework "${WK_PATH}/System/Library/Frameworks"/ -rsync -aS /usr/bin/locale "${WK_PATH}/usr/bin"/ -rsync -aLS /usr/share/locale/en_US.UTF-8 "${WK_PATH}/usr/share/locale"/ - # pipes-sh echo "Installing pipes.sh..." cp -a /usr/bin/tput "${WK_PATH}/usr/bin"/ +# Terminal +echo "Installing Terminal Preferences..." +rsync -aS com.apple.Terminal.plist "${WK_PATH}/var/root/Library/Preferences"/ + # Timezones -if [[ ! -d "/var/db/timezone" ]]; then +if [[ ! -d "${WK_PATH}/var/db/timezone" ]]; then echo "Installing timezones..." rsync -aS /var/db/timezone "${WK_PATH}/var/db"/ fi +ln -sf /var/db/timezone/zoneinfo/US/Pacific "${WK_PATH}/etc/localtime" # zsh echo "Installing zsh..." cp -a /bin/zsh "${WK_PATH}/bin"/ +cp -a zshenv "${WK_PATH}/etc"/ rsync -aS /usr/lib/zsh "${WK_PATH}/usr/lib"/ rsync -aS /usr/share/zsh "${WK_PATH}/usr/share"/ rsync -aS /usr/local/share/zsh "${WK_PATH}/usr/local/share"/ +sed -Ei '' 's!^(root.*)/bin/sh!\1/bin/zsh!' "${WK_PATH}/etc/passwd" # Misc +cp -a /bin/rsync "${WK_PATH}/bin"/ cp -a aliases "${WK_PATH}/.aliases" cp -a bashrc "${WK_PATH}/etc/profile" cp -a vimrc "${WK_PATH}/.vimrc" -cp -a zshrc "${WK_PATH}/etc/zshenv" # WizardKit echo "Installing WizardKit env..." touch "${WK_PATH}/.wk-live-macos" ln -s /Volumes/RAM_Disk/Logs "${WK_PATH}/var/root/Logs" +cp -a ../linux/profile_base/airootfs/etc/skel/.tmux.conf "${WK_PATH}/etc/tmux.conf" cp -a ../../images/macOS.png "${WK_PATH}/usr/local/wallpaper.png" rsync -aS /usr/bin/{env,killall} "${WK_PATH}/usr/bin"/ rsync -aS live-macos-startup ../../scripts/ "${WK_PATH}/usr/local/bin"/ +# Unmount sparsebundle +hdiutil detach "${WK_IMAGE_DEV}" + # Convert to compressed read-only image +# TODO #echo "Converting to read-only image..." #hdiutil convert -format UDZO -o "${OUT_NAME}.sparsebundle" "${OUT_NAME}.dmg" -# TODO diff --git a/setup/macos/zshrc b/setup/macos/zshenv similarity index 100% rename from setup/macos/zshrc rename to setup/macos/zshenv