Compare commits
15 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
82d50299c7 | ||
|
|
ec441aefef | ||
|
|
e4ef33a5f6 | ||
|
|
eaefe9fa04 | ||
|
|
71da0e7b1b | ||
|
|
2c518d797e | ||
|
|
5e25c8d3f9 | ||
|
|
3aea499672 | ||
|
|
0ddd9b0986 | ||
|
|
5a4d45ffed | ||
|
|
cb3ed0108d | ||
|
|
8c4c734043 | ||
|
|
160447eda3 | ||
|
|
803c38e1c2 | ||
|
|
76432f5a74 |
31
.circleci/config.yml
Normal file
31
.circleci/config.yml
Normal file
@@ -0,0 +1,31 @@
|
||||
version: 2.1
|
||||
jobs:
|
||||
build:
|
||||
working_directory: ~/project
|
||||
docker:
|
||||
- image: bkuhlmann/alpine-ruby:latest
|
||||
steps:
|
||||
- checkout
|
||||
|
||||
- restore_cache:
|
||||
name: Bundler Restore
|
||||
keys:
|
||||
- gem-cache-{{.Branch}}-{{checksum "Gemfile"}}
|
||||
- gem-cache-
|
||||
|
||||
- run:
|
||||
name: Bundler Install
|
||||
command: |
|
||||
gem update --system
|
||||
bundle config set path "vendor/bundle"
|
||||
bundle install
|
||||
|
||||
- save_cache:
|
||||
name: Bundler Store
|
||||
key: gem-cache-{{.Branch}}-{{checksum "Gemfile"}}
|
||||
paths:
|
||||
- vendor/bundle
|
||||
|
||||
- run:
|
||||
name: Build
|
||||
command: bundle exec rake
|
||||
19
CHANGES.adoc
19
CHANGES.adoc
@@ -1,5 +1,24 @@
|
||||
= Changes
|
||||
|
||||
== 11.2.0 (2021-02-27)
|
||||
|
||||
* Added Apple Silicon instructions - Brooke Kuhlmann
|
||||
* Added CPU utility function - Brooke Kuhlmann
|
||||
* Added Homebrew install function - Brooke Kuhlmann
|
||||
* Added Homebrew utility path functions - Brooke Kuhlmann
|
||||
* Added Rosetta to development tools install script - Brooke Kuhlmann
|
||||
* Added environment configuration for scripts - Brooke Kuhlmann
|
||||
* Updated to Circle CI 2.1.0 - Brooke Kuhlmann
|
||||
* Updated to Docker Alpine Ruby image - Brooke Kuhlmann
|
||||
* Refactored installer functions to be alphabetically sorted - Brooke Kuhlmann
|
||||
* Refactored utility functions to be alphabetically sorted - Brooke Kuhlmann
|
||||
* Refactored verifier functions to be alphabetically sorted - Brooke Kuhlmann
|
||||
|
||||
== 11.1.1 (2021-01-10)
|
||||
|
||||
* Fixed brew formulae list error - Brooke Kuhlmann
|
||||
* Updated boot disk recovery documentation - Brooke Kuhlmann
|
||||
|
||||
== 11.1.0 (2021-01-03)
|
||||
|
||||
* Added caffeination to restore process - Brooke Kuhlmann
|
||||
|
||||
40
README.adoc
40
README.adoc
@@ -16,10 +16,10 @@ Config_ project is an opinionated configuration which meets the needs of my deve
|
||||
but is also meant to serve as an example and guide for building your own personalized setup. Here is
|
||||
how the two projects are meant to be used:
|
||||
|
||||
* *macOS* (this project) - The foundation framework for building customizated macOS machine setups.
|
||||
* *macOS* (this project) - The foundational framework for building custom macOS machine setups.
|
||||
* *link:https://www.alchemists.io/projects/mac_os-config[macOS Configuration]* - The layer on top of
|
||||
this _macOS_ project which defines a custom machine setup and base implementation. The project is
|
||||
meant to be forked for as many custom machine setups as needed.
|
||||
this _macOS_ project which defines a custom machine implementation. The project is meant to be
|
||||
forked for as many custom machine setups as needed.
|
||||
|
||||
toc::[]
|
||||
|
||||
@@ -57,7 +57,7 @@ To install, run:
|
||||
----
|
||||
git clone https://github.com/bkuhlmann/mac_os.git
|
||||
cd mac_os
|
||||
git checkout 11.1.0
|
||||
git checkout 11.2.0
|
||||
----
|
||||
|
||||
== Usage
|
||||
@@ -126,18 +126,17 @@ macOS Boot Disk Tips
|
||||
macOS Boot Disk Usage:
|
||||
1. Insert the USB boot disk into the machine to be upgraded.
|
||||
2. Reboot the machine.
|
||||
3. Hold down the OPTION key before the Apple logo appears.
|
||||
3. Hold the POWER (Silicon) or OPTION (Intel) key before the Apple logo appears.
|
||||
4. Select the USB boot disk from the menu.
|
||||
5. Use Disk Utility to delete and/or erase the hard drive including associated partitions.
|
||||
6. Use Disk Utility to create a single "APFS" drive as a "GUID Partition Table".
|
||||
7. Install the new operating system.
|
||||
|
||||
macOS Reinstall:
|
||||
1. Click the Apple icon from the operating system main menu.
|
||||
2. Select the "Restart..." menu option.
|
||||
3. Hold down the COMMAND+R keys before the Apple logo appears.
|
||||
4. Wait for the macOS installer to load from the recovery partition.
|
||||
5. Use the dialog options to launch Disk Utility, reinstall the system, etc.
|
||||
macOS Boot Disk Recovery:
|
||||
1. Start/restart the machine.
|
||||
2. Hold the POWER (Silicon) or COMMAND+R (Intel) keys before the Apple logo appears.
|
||||
3. Wait for the macOS installer to load from the recovery partition.
|
||||
4. Use the dialog options to launch Disk Utility, reinstall the system, etc.
|
||||
....
|
||||
|
||||
=== Customization
|
||||
@@ -169,19 +168,20 @@ link:https://www.alchemists.io/projects/mac_os-config[macOS Config] project for
|
||||
|
||||
== Troubleshooting
|
||||
|
||||
* When using link:https://pi-hole.net[Pi-hole], make sure to temporarily disable prior to upgrading
|
||||
as you might experience various errors with Apple not able to detect an internet connection which
|
||||
prevents the installer from working.
|
||||
* When using link:https://pi-hole.net[Pi-hole], you might need to temporarily disable prior to
|
||||
upgrading as you might experience various errors with Apple not being able to detect an internet
|
||||
connection which prevents the installer from working.
|
||||
* When using the boot disk and the installer fails in some catestrophic manner, reboot the machine
|
||||
into recovery mode (i.e. `COMMAND + R`) to download and install the last operating system used.
|
||||
You can also use `COMMAND + OPTION + R` to attemp to download the latest operating system.
|
||||
into recovery mode -- `POWER` (Silicon) or `COMMAND + R` (Intel) buttons -- to download and
|
||||
install the last operating system used. Alternatively, you can also use `COMMAND + OPTION + R`
|
||||
(Intel) to attemp to download the latest operating system.
|
||||
* When using the boot disk, you might experience a situation where you see a black screen with a
|
||||
white circle and diagonal line running through it. This means macOS lost or can’t find the boot
|
||||
disk for some reason. To correct this, shut down and boot up the system again while holding down
|
||||
the `OPTION+COMMAND+R+P` keys simultaneously. You might want to wait for the system boot sound to
|
||||
happen a few times before releasing the keys. This will clear the system NVRAM/PRAM. At this point
|
||||
you can shut down and restart the system following the boot disk instructions (the boot disk will
|
||||
be recognized now).
|
||||
the `OPTION + COMMAND + R + P` (Intel) keys simultaneously. You might want to wait for the system
|
||||
boot sound to happen a few times before releasing the keys. This will clear the system NVRAM/PRAM.
|
||||
At this point you can shut down and restart the system following the boot disk instructions (the
|
||||
boot disk will be recognized now).
|
||||
|
||||
== Development
|
||||
|
||||
|
||||
@@ -9,17 +9,16 @@ printf " - Use Disk Utility to label the USB drive as \"Untitled\".\n"
|
||||
printf "\nmacOS Boot Disk Usage:\n"
|
||||
printf " 1. Insert the USB boot disk into the machine to be upgraded.\n"
|
||||
printf " 2. Reboot the machine.\n"
|
||||
printf " 3. Hold down the OPTION key before the Apple logo appears.\n"
|
||||
printf " 3. Hold the POWER (Silicon) or OPTION (Intel) key before the Apple logo appears.\n"
|
||||
printf " 4. Select the USB boot disk from the menu.\n"
|
||||
printf " 5. Use Disk Utility to delete and/or erase the hard drive including associated partitions.\n"
|
||||
printf " 6. Use Disk Utility to create a single \"APFS\" drive as a \"GUID Partition Table\".\n"
|
||||
printf " 7. Install the new operating system.\n"
|
||||
printf "\nmacOS Reinstall:\n"
|
||||
printf " 1. Click the Apple icon from the operating system main menu.\n"
|
||||
printf " 2. Select the \"Restart...\" menu option.\n"
|
||||
printf " 3. Hold down the COMMAND+R keys before the Apple logo appears.\n"
|
||||
printf " 4. Wait for the macOS installer to load from the recovery partition.\n"
|
||||
printf " 5. Use the dialog options to launch Disk Utility, reinstall the system, etc.\n"
|
||||
printf "\nmacOS Boot Disk Recovery:\n"
|
||||
printf " 1. Start/restart the machine.\n"
|
||||
printf " 2. Hold the POWER (Silicon) or COMMAND+R (Intel) keys before the Apple logo appears.\n"
|
||||
printf " 3. Wait for the macOS installer to load from the recovery partition.\n"
|
||||
printf " 4. Use the dialog options to launch Disk Utility, reinstall the system, etc.\n"
|
||||
|
||||
printf "\nCreating macOS boot disk...\n"
|
||||
|
||||
|
||||
@@ -11,3 +11,7 @@ if [[ "$xcode_response" != "y" ]]; then
|
||||
printf "ERROR: Xcode CLI tools must be installed before proceeding.\n"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ -n "$(get_cpu)" ]]; then
|
||||
softwareupdate --install-rosetta
|
||||
fi
|
||||
|
||||
2
bin/run
2
bin/run
@@ -23,6 +23,8 @@ else
|
||||
exit 1
|
||||
fi
|
||||
|
||||
configure_environment
|
||||
|
||||
while true; do
|
||||
if [[ $# == 0 ]]; then
|
||||
printf "\nUsage: run OPTION\n"
|
||||
|
||||
62
circle.yml
62
circle.yml
@@ -1,62 +0,0 @@
|
||||
version: 2
|
||||
jobs:
|
||||
build:
|
||||
working_directory: ~/project
|
||||
docker:
|
||||
- image: circleci/ruby
|
||||
environment:
|
||||
BUNDLE_JOBS: 3
|
||||
BUNDLE_RETRY: 3
|
||||
BUNDLE_PATH: vendor/bundle
|
||||
EDITOR: vim
|
||||
steps:
|
||||
- checkout
|
||||
|
||||
- run:
|
||||
name: Environment Setup
|
||||
command: |
|
||||
printf "%s\n" 'export CI_RUBY_VERSION=$(cat ".ruby-version" | tr -d "\n")' >> $BASH_ENV
|
||||
|
||||
- type: cache-restore
|
||||
name: Ruby Restore
|
||||
key: ruby-{{checksum ".ruby-version"}}
|
||||
|
||||
- run:
|
||||
name: Ruby Install
|
||||
command: |
|
||||
cd ..
|
||||
curl https://cache.ruby-lang.org/pub/ruby/${CI_RUBY_VERSION::-2}/ruby-$CI_RUBY_VERSION.tar.gz > ruby-$CI_RUBY_VERSION.tar.gz
|
||||
tar --extract --gzip --verbose --file ruby-$CI_RUBY_VERSION.tar.gz
|
||||
cd ruby-$CI_RUBY_VERSION
|
||||
./configure
|
||||
make
|
||||
make update-gems
|
||||
make extract-gems
|
||||
sudo make install
|
||||
|
||||
- type: cache-save
|
||||
name: Ruby Store
|
||||
key: ruby-{{checksum ".ruby-version"}}
|
||||
paths:
|
||||
- ../ruby-$CI_RUBY_VERSION
|
||||
|
||||
- type: cache-restore
|
||||
name: Bundler Restore
|
||||
key: bundler-{{checksum "Gemfile"}}
|
||||
|
||||
- run:
|
||||
name: Bundler Install
|
||||
command: |
|
||||
gem update --system
|
||||
bundle config set path "vendor/bundle"
|
||||
bundle install
|
||||
|
||||
- type: cache-save
|
||||
name: Bundler Store
|
||||
key: bundler-{{checksum "Gemfile"}}
|
||||
paths:
|
||||
- vendor/bundle
|
||||
|
||||
- run:
|
||||
name: Build
|
||||
command: bundle exec rake
|
||||
@@ -2,6 +2,43 @@
|
||||
|
||||
# Defines software installer functions.
|
||||
|
||||
# Downloads remote file to local disk.
|
||||
# Parameters: $1 (required) - URL, $2 (required) - File name, $3 (optional) - HTTP header.
|
||||
download_file() {
|
||||
local url="$1"
|
||||
local file_name="$2"
|
||||
local http_header="$3"
|
||||
|
||||
printf "%s\n" "Downloading $1..."
|
||||
clean_work_path
|
||||
mkdir $MAC_OS_WORK_PATH
|
||||
curl --header "$http_header" --location --retry 3 --retry-delay 5 --fail --silent --show-error "$url" >> "$MAC_OS_WORK_PATH/$file_name"
|
||||
}
|
||||
export -f download_file
|
||||
|
||||
# Installs an application.
|
||||
# Parameters: $1 (required) - Application source path, $2 (required) - Application name.
|
||||
install_app() {
|
||||
local install_root=$(get_install_root "$2")
|
||||
local file_extension=$(get_extension "$2")
|
||||
|
||||
printf "Installing: $install_root/$2...\n"
|
||||
|
||||
case $file_extension in
|
||||
'')
|
||||
cp -a "$1/$2" "$install_root";;
|
||||
'app')
|
||||
cp -a "$1/$2" "$install_root";;
|
||||
'prefPane')
|
||||
sudo cp -pR "$1/$2" "$install_root";;
|
||||
'qlgenerator')
|
||||
sudo cp -pR "$1/$2" "$install_root" && qlmanage -r;;
|
||||
*)
|
||||
printf "ERROR: Unknown file extension: $file_extension.\n"
|
||||
esac
|
||||
}
|
||||
export -f install_app
|
||||
|
||||
# Installs an application via a DMG file.
|
||||
# Parameters: $1 (required) - URL, $2 (required) - Mount path, $3 (required) - Application name.
|
||||
install_dmg_app() {
|
||||
@@ -41,6 +78,124 @@ install_dmg_pkg() {
|
||||
}
|
||||
export -f install_dmg_pkg
|
||||
|
||||
# Installs a single file.
|
||||
# Parameters: $1 (required) - URL, $2 (required) - Install path.
|
||||
install_file() {
|
||||
local file_url="$1"
|
||||
local file_name=$(get_basename "$1")
|
||||
local install_path="$2"
|
||||
|
||||
if [[ ! -e "$install_path" ]]; then
|
||||
download_file "$file_url" "$file_name"
|
||||
mkdir -p $(dirname "$install_path")
|
||||
mv "$MAC_OS_WORK_PATH/$file_name" "$install_path"
|
||||
printf "Installed: $file_name.\n"
|
||||
verify_path "$install_path"
|
||||
fi
|
||||
}
|
||||
export -f install_file
|
||||
|
||||
# Installs application code from a Git repository.
|
||||
# Parameters: $1 (required) - Repository URL, $2 (required) - Install path, $3 (optional) - Git clone options.
|
||||
install_git_app() {
|
||||
local repository_url="$1"
|
||||
local app_name=$(get_basename "$2")
|
||||
local install_path="$2"
|
||||
local options="--quiet"
|
||||
|
||||
if [[ -n "$3" ]]; then
|
||||
local options="$options $3"
|
||||
fi
|
||||
|
||||
if [[ ! -e "$install_path" ]]; then
|
||||
printf "Installing: $install_path/$app_name...\n"
|
||||
git clone $options "$repository_url" "$install_path"
|
||||
printf "Installed: $app_name.\n"
|
||||
verify_path "$install_path"
|
||||
fi
|
||||
}
|
||||
export -f install_git_app
|
||||
|
||||
# Installs settings from a Git repository.
|
||||
# Parameters: $1 (required) - Repository URL, $2 (required) - Repository version, $3 (required) - Project directory, $4 (required) - Script to run (including any arguments).
|
||||
install_git_project() {
|
||||
local repo_url="$1"
|
||||
local repo_version="$2"
|
||||
local project_dir="$3"
|
||||
local script="$4"
|
||||
|
||||
git clone "$repo_url"
|
||||
(
|
||||
cd "$project_dir"
|
||||
git -c advice.detachedHead=false checkout "$repo_version"
|
||||
eval "$script"
|
||||
)
|
||||
rm -rf "$project_dir"
|
||||
}
|
||||
export -f install_git_project
|
||||
|
||||
# Installs Homebrew.
|
||||
# Parameters: None.
|
||||
install_homebrew() {
|
||||
if ! command -v brew > /dev/null; then
|
||||
/bin/bash -c "$(curl --location --fail --silent --show-error https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
|
||||
fi
|
||||
}
|
||||
export -f install_homebrew
|
||||
|
||||
# Installs a package.
|
||||
# Parameters: $1 (required) - Package source path, $2 (required) - Application name.
|
||||
install_pkg() {
|
||||
local install_root=$(get_install_root "$2")
|
||||
|
||||
printf "Installing: $install_root/$2...\n"
|
||||
local package=$(sudo find "$1" -maxdepth 1 -type f -name "*.pkg" -o -name "*.mpkg")
|
||||
sudo installer -pkg "$package" -target /
|
||||
}
|
||||
export -f install_pkg
|
||||
|
||||
# Installs program (single file).
|
||||
# Parameters: $1 (required) - URL, $2 (required) - Program name.
|
||||
install_program() {
|
||||
local url="$1"
|
||||
local program_name="$2"
|
||||
local install_path=$(get_install_path "$program_name")
|
||||
|
||||
if [[ ! -e "$install_path" ]]; then
|
||||
download_file "$url" "$program_name"
|
||||
mv "$MAC_OS_WORK_PATH/$program_name" "$install_path"
|
||||
chmod 755 "$install_path"
|
||||
printf "Installed: $program_name.\n"
|
||||
verify_application "$program_name"
|
||||
fi
|
||||
}
|
||||
export -f install_program
|
||||
|
||||
# Installs an application via a tar file.
|
||||
# Parameters: $1 (required) - URL, $2 (required) - Application name, $3 (required) - Decompress options.
|
||||
install_tar_app() {
|
||||
local url="$1"
|
||||
local app_name="$2"
|
||||
local options="$3"
|
||||
local install_path=$(get_install_path "$app_name")
|
||||
local work_file="download.tar"
|
||||
|
||||
if [[ ! -e "$install_path" ]]; then
|
||||
download_file "$url" "$work_file"
|
||||
|
||||
(
|
||||
printf "Preparing...\n"
|
||||
cd "$MAC_OS_WORK_PATH"
|
||||
tar "$options" "$work_file"
|
||||
)
|
||||
|
||||
install_app "$MAC_OS_WORK_PATH" "$app_name"
|
||||
printf "Installed: $app_name.\n"
|
||||
verify_application "$app_name"
|
||||
fi
|
||||
}
|
||||
export -f install_tar_app
|
||||
|
||||
# Installs an application via a zip file.
|
||||
# Parameters: $1 (required) - URL, $2 (required) - Application name.
|
||||
install_zip_app() {
|
||||
@@ -90,152 +245,6 @@ install_zip_pkg() {
|
||||
}
|
||||
export -f install_zip_pkg
|
||||
|
||||
# Installs an application via a tar file.
|
||||
# Parameters: $1 (required) - URL, $2 (required) - Application name, $3 (required) - Decompress options.
|
||||
install_tar_app() {
|
||||
local url="$1"
|
||||
local app_name="$2"
|
||||
local options="$3"
|
||||
local install_path=$(get_install_path "$app_name")
|
||||
local work_file="download.tar"
|
||||
|
||||
if [[ ! -e "$install_path" ]]; then
|
||||
download_file "$url" "$work_file"
|
||||
|
||||
(
|
||||
printf "Preparing...\n"
|
||||
cd "$MAC_OS_WORK_PATH"
|
||||
tar "$options" "$work_file"
|
||||
)
|
||||
|
||||
install_app "$MAC_OS_WORK_PATH" "$app_name"
|
||||
printf "Installed: $app_name.\n"
|
||||
verify_application "$app_name"
|
||||
fi
|
||||
}
|
||||
export -f install_tar_app
|
||||
|
||||
# Installs program (single file).
|
||||
# Parameters: $1 (required) - URL, $2 (required) - Program name.
|
||||
install_program() {
|
||||
local url="$1"
|
||||
local program_name="$2"
|
||||
local install_path=$(get_install_path "$program_name")
|
||||
|
||||
if [[ ! -e "$install_path" ]]; then
|
||||
download_file "$url" "$program_name"
|
||||
mv "$MAC_OS_WORK_PATH/$program_name" "$install_path"
|
||||
chmod 755 "$install_path"
|
||||
printf "Installed: $program_name.\n"
|
||||
verify_application "$program_name"
|
||||
fi
|
||||
}
|
||||
export -f install_program
|
||||
|
||||
# Installs application code from a Git repository.
|
||||
# Parameters: $1 (required) - Repository URL, $2 (required) - Install path, $3 (optional) - Git clone options.
|
||||
install_git_app() {
|
||||
local repository_url="$1"
|
||||
local app_name=$(get_basename "$2")
|
||||
local install_path="$2"
|
||||
local options="--quiet"
|
||||
|
||||
if [[ -n "$3" ]]; then
|
||||
local options="$options $3"
|
||||
fi
|
||||
|
||||
if [[ ! -e "$install_path" ]]; then
|
||||
printf "Installing: $install_path/$app_name...\n"
|
||||
git clone $options "$repository_url" "$install_path"
|
||||
printf "Installed: $app_name.\n"
|
||||
verify_path "$install_path"
|
||||
fi
|
||||
}
|
||||
export -f install_git_app
|
||||
|
||||
# Installs settings from a Git repository.
|
||||
# Parameters: $1 (required) - Repository URL, $2 (required) - Repository version, $3 (required) - Project directory, $4 (required) - Script to run (including any arguments).
|
||||
install_git_project() {
|
||||
local repo_url="$1"
|
||||
local repo_version="$2"
|
||||
local project_dir="$3"
|
||||
local script="$4"
|
||||
|
||||
git clone "$repo_url"
|
||||
(
|
||||
cd "$project_dir"
|
||||
git -c advice.detachedHead=false checkout "$repo_version"
|
||||
eval "$script"
|
||||
)
|
||||
rm -rf "$project_dir"
|
||||
}
|
||||
export -f install_git_project
|
||||
|
||||
# Installs a single file.
|
||||
# Parameters: $1 (required) - URL, $2 (required) - Install path.
|
||||
install_file() {
|
||||
local file_url="$1"
|
||||
local file_name=$(get_basename "$1")
|
||||
local install_path="$2"
|
||||
|
||||
if [[ ! -e "$install_path" ]]; then
|
||||
download_file "$file_url" "$file_name"
|
||||
mkdir -p $(dirname "$install_path")
|
||||
mv "$MAC_OS_WORK_PATH/$file_name" "$install_path"
|
||||
printf "Installed: $file_name.\n"
|
||||
verify_path "$install_path"
|
||||
fi
|
||||
}
|
||||
export -f install_file
|
||||
|
||||
# Downloads remote file to local disk.
|
||||
# Parameters: $1 (required) - URL, $2 (required) - File name, $3 (optional) - HTTP header.
|
||||
download_file() {
|
||||
local url="$1"
|
||||
local file_name="$2"
|
||||
local http_header="$3"
|
||||
|
||||
printf "%s\n" "Downloading $1..."
|
||||
clean_work_path
|
||||
mkdir $MAC_OS_WORK_PATH
|
||||
curl --header "$http_header" --location --retry 3 --retry-delay 5 --fail --silent --show-error "$url" >> "$MAC_OS_WORK_PATH/$file_name"
|
||||
}
|
||||
export -f download_file
|
||||
|
||||
# Installs an application.
|
||||
# Parameters: $1 (required) - Application source path, $2 (required) - Application name.
|
||||
install_app() {
|
||||
local install_root=$(get_install_root "$2")
|
||||
local file_extension=$(get_extension "$2")
|
||||
|
||||
printf "Installing: $install_root/$2...\n"
|
||||
|
||||
case $file_extension in
|
||||
'')
|
||||
cp -a "$1/$2" "$install_root";;
|
||||
'app')
|
||||
cp -a "$1/$2" "$install_root";;
|
||||
'prefPane')
|
||||
sudo cp -pR "$1/$2" "$install_root";;
|
||||
'qlgenerator')
|
||||
sudo cp -pR "$1/$2" "$install_root" && qlmanage -r;;
|
||||
*)
|
||||
printf "ERROR: Unknown file extension: $file_extension.\n"
|
||||
esac
|
||||
}
|
||||
export -f install_app
|
||||
|
||||
# Installs a package.
|
||||
# Parameters: $1 (required) - Package source path, $2 (required) - Application name.
|
||||
install_pkg() {
|
||||
local install_root=$(get_install_root "$2")
|
||||
|
||||
printf "Installing: $install_root/$2...\n"
|
||||
local package=$(sudo find "$1" -maxdepth 1 -type f -name "*.pkg" -o -name "*.mpkg")
|
||||
sudo installer -pkg "$package" -target /
|
||||
}
|
||||
export -f install_pkg
|
||||
|
||||
# Mounts a disk image.
|
||||
# Parameters: $1 (required) - Image path.
|
||||
mount_image() {
|
||||
|
||||
106
lib/utilities.sh
106
lib/utilities.sh
@@ -15,43 +15,12 @@ caffeinate_machine() {
|
||||
}
|
||||
export -f caffeinate_machine
|
||||
|
||||
# Answers the full install path (including file name) for file name.
|
||||
# Parameters: $1 (required) - The file name.
|
||||
get_install_path() {
|
||||
local file_name="$1"
|
||||
local install_path=$(get_install_root "$file_name")
|
||||
printf "$install_path/$file_name"
|
||||
}
|
||||
export -f get_install_path
|
||||
|
||||
# Cleans work path for temporary processing of installs.
|
||||
clean_work_path() {
|
||||
rm -rf "$MAC_OS_WORK_PATH"
|
||||
}
|
||||
export -f clean_work_path
|
||||
|
||||
# Answers the root install path for file name.
|
||||
# Parameters: $1 (required) - The file name.
|
||||
get_install_root() {
|
||||
local file_name="$1"
|
||||
local file_extension=$(get_extension "$file_name")
|
||||
|
||||
# Dynamically build the install path based on file extension.
|
||||
case $file_extension in
|
||||
'')
|
||||
printf "/usr/local/bin";;
|
||||
'app')
|
||||
printf "/Applications";;
|
||||
'prefPane')
|
||||
printf "/Library/PreferencePanes";;
|
||||
'qlgenerator')
|
||||
printf "/Library/QuickLook";;
|
||||
*)
|
||||
printf "/tmp/unknown";;
|
||||
esac
|
||||
}
|
||||
export -f get_install_root
|
||||
|
||||
# Answers the file or directory basename.
|
||||
# Parameters: $1 (required) - The file path.
|
||||
get_basename() {
|
||||
@@ -59,6 +28,13 @@ get_basename() {
|
||||
}
|
||||
export -f get_basename
|
||||
|
||||
# Answers current CPU.
|
||||
# Parameters: None.
|
||||
get_cpu() {
|
||||
printf "%s" "$(system_profiler SPHardwareDataType | awk '/Chip/ {print $3}')"
|
||||
}
|
||||
export -f get_cpu
|
||||
|
||||
# Answers the file extension.
|
||||
# Parameters: $1 (required) - The file name.
|
||||
get_extension() {
|
||||
@@ -72,3 +48,71 @@ get_extension() {
|
||||
fi
|
||||
}
|
||||
export -f get_extension
|
||||
|
||||
# Answers Homebrew root path.
|
||||
# Parameters: None.
|
||||
get_homebrew_root() {
|
||||
if [[ -n "$(get_cpu)" ]]; then
|
||||
printf "%s" "/opt/homebrew"
|
||||
else
|
||||
printf "%s" "/usr/local/Homebrew"
|
||||
fi
|
||||
}
|
||||
export -f get_homebrew_root
|
||||
|
||||
# Answers Homebrew binary root path.
|
||||
# Parameters: None.
|
||||
get_homebrew_bin_root() {
|
||||
if [[ -n "$(get_cpu)" ]]; then
|
||||
printf "%s" "/opt/homebrew/bin"
|
||||
else
|
||||
printf "%s" "/usr/local/bin"
|
||||
fi
|
||||
}
|
||||
export -f get_homebrew_bin_root
|
||||
|
||||
# Answers the full install path (including file name) for file name.
|
||||
# Parameters: $1 (required) - The file name.
|
||||
get_install_path() {
|
||||
local file_name="$1"
|
||||
local install_path=$(get_install_root "$file_name")
|
||||
printf "$install_path/$file_name"
|
||||
}
|
||||
export -f get_install_path
|
||||
|
||||
# Answers the root install path for file name.
|
||||
# Parameters: $1 (required) - The file name.
|
||||
get_install_root() {
|
||||
local file_name="$1"
|
||||
local file_extension=$(get_extension "$file_name")
|
||||
|
||||
# Dynamically build the install path based on file extension.
|
||||
case $file_extension in
|
||||
'')
|
||||
printf "$(get_homebrew_bin_root)";;
|
||||
'app')
|
||||
printf "/Applications";;
|
||||
'prefPane')
|
||||
printf "/Library/PreferencePanes";;
|
||||
'qlgenerator')
|
||||
printf "/Library/QuickLook";;
|
||||
*)
|
||||
printf "/tmp/unknown";;
|
||||
esac
|
||||
}
|
||||
export -f get_install_root
|
||||
|
||||
# Configures shell for new machines and ensures PATH is properly configured for running scripts.
|
||||
# Parameters: None.
|
||||
configure_environment() {
|
||||
if [[ ! -s "$HOME/.bash_profile" ]]; then
|
||||
printf "%s\n" "if [ -f ~/.bashrc ]; then . ~/.bashrc; fi" > "$HOME/.bash_profile"
|
||||
fi
|
||||
|
||||
if [[ ! -s "$HOME/.bashrc" ]]; then
|
||||
printf "%s\n" 'export PATH="/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"' > "$HOME/.bashrc"
|
||||
fi
|
||||
|
||||
export PATH="/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/opt/homebrew/sbin:/usr/local/sbin:/usr/sbin:/sbin:$PATH"
|
||||
}
|
||||
export -f configure_environment
|
||||
|
||||
120
lib/verifiers.sh
120
lib/verifiers.sh
@@ -2,46 +2,6 @@
|
||||
|
||||
# Defines verification/validation functions.
|
||||
|
||||
# Checks for missing Homebrew formulas.
|
||||
verify_homebrew_formulas() {
|
||||
printf "Checking Homebrew formulas...\n"
|
||||
|
||||
local applications="$(brew list)"
|
||||
|
||||
while read line; do
|
||||
if [[ "$line" == "brew install"* ]]; then
|
||||
local application=$(printf "$line" | awk '{print $3}')
|
||||
|
||||
# Exception: "gpg" is the binary but is listed as "gnugp".
|
||||
if [[ "$application" == "gpg" ]]; then
|
||||
application="gnupg"
|
||||
fi
|
||||
|
||||
verify_listed_application "$application" "${applications[*]}"
|
||||
fi
|
||||
done < "$MAC_OS_CONFIG_PATH/bin/install_homebrew_formulas"
|
||||
|
||||
printf "Homebrew formula check complete.\n"
|
||||
}
|
||||
export -f verify_homebrew_formulas
|
||||
|
||||
# Checks for missing Homebrew casks.
|
||||
verify_homebrew_casks() {
|
||||
printf "\nChecking Homebrew casks...\n"
|
||||
|
||||
local applications="$(brew list --cask)"
|
||||
|
||||
while read line; do
|
||||
if [[ "$line" == "brew cask install"* ]]; then
|
||||
local application=$(printf "$line" | awk '{print $4}')
|
||||
verify_listed_application "$application" "${applications[*]}"
|
||||
fi
|
||||
done < "$MAC_OS_CONFIG_PATH/bin/install_homebrew_casks"
|
||||
|
||||
printf "Homebrew cask check complete.\n"
|
||||
}
|
||||
export -f verify_homebrew_casks
|
||||
|
||||
# Checks for missing App Store applications.
|
||||
verify_app_store_applications() {
|
||||
printf "\nChecking App Store applications...\n"
|
||||
@@ -59,17 +19,17 @@ verify_app_store_applications() {
|
||||
}
|
||||
export -f verify_app_store_applications
|
||||
|
||||
# Verifies listed application exists.
|
||||
# Parameters: $1 (required) - The current application, $2 (required) - The application list.
|
||||
verify_listed_application() {
|
||||
local application="$1"
|
||||
local applications="$2"
|
||||
# Verifies application exists.
|
||||
# Parameters: $1 (required) - The file name.
|
||||
verify_application() {
|
||||
local file_name="$1"
|
||||
local install_path=$(get_install_path "$file_name")
|
||||
|
||||
if [[ "${applications[*]}" != *"$application"* ]]; then
|
||||
printf " - Missing: $application\n"
|
||||
if [[ ! -e "$install_path" ]]; then
|
||||
printf " - Missing: $file_name\n"
|
||||
fi
|
||||
}
|
||||
export -f verify_listed_application
|
||||
export -f verify_application
|
||||
|
||||
# Checks for missing applications suffixed by "APP_NAME" as defined in settings.sh.
|
||||
verify_applications() {
|
||||
@@ -87,18 +47,6 @@ verify_applications() {
|
||||
}
|
||||
export -f verify_applications
|
||||
|
||||
# Verifies application exists.
|
||||
# Parameters: $1 (required) - The file name.
|
||||
verify_application() {
|
||||
local file_name="$1"
|
||||
local install_path=$(get_install_path "$file_name")
|
||||
|
||||
if [[ ! -e "$install_path" ]]; then
|
||||
printf " - Missing: $file_name\n"
|
||||
fi
|
||||
}
|
||||
export -f verify_application
|
||||
|
||||
# Checks for missing extensions suffixed by "EXTENSION_PATH" as defined in settings.sh.
|
||||
verify_extensions() {
|
||||
printf "\nChecking application extensions...\n"
|
||||
@@ -116,6 +64,58 @@ verify_extensions() {
|
||||
}
|
||||
export -f verify_extensions
|
||||
|
||||
# Checks for missing Homebrew casks.
|
||||
verify_homebrew_casks() {
|
||||
printf "\nChecking Homebrew casks...\n"
|
||||
|
||||
local applications="$(brew list --casks)"
|
||||
|
||||
while read line; do
|
||||
if [[ "$line" == "brew cask install"* ]]; then
|
||||
local application=$(printf "$line" | awk '{print $4}')
|
||||
verify_listed_application "$application" "${applications[*]}"
|
||||
fi
|
||||
done < "$MAC_OS_CONFIG_PATH/bin/install_homebrew_casks"
|
||||
|
||||
printf "Homebrew cask check complete.\n"
|
||||
}
|
||||
export -f verify_homebrew_casks
|
||||
|
||||
# Checks for missing Homebrew formulas.
|
||||
verify_homebrew_formulas() {
|
||||
printf "Checking Homebrew formulas...\n"
|
||||
|
||||
local applications="$(brew list --formulae)"
|
||||
|
||||
while read line; do
|
||||
if [[ "$line" == "brew install"* ]]; then
|
||||
local application=$(printf "$line" | awk '{print $3}')
|
||||
|
||||
# Exception: "gpg" is the binary but is listed as "gnugp".
|
||||
if [[ "$application" == "gpg" ]]; then
|
||||
application="gnupg"
|
||||
fi
|
||||
|
||||
verify_listed_application "$application" "${applications[*]}"
|
||||
fi
|
||||
done < "$MAC_OS_CONFIG_PATH/bin/install_homebrew_formulas"
|
||||
|
||||
printf "Homebrew formula check complete.\n"
|
||||
}
|
||||
export -f verify_homebrew_formulas
|
||||
|
||||
# Verifies listed application exists.
|
||||
# Parameters: $1 (required) - The current application, $2 (required) - The application list.
|
||||
verify_listed_application() {
|
||||
local application="$1"
|
||||
local applications="$2"
|
||||
|
||||
if [[ "${applications[*]}" != *"$application"* ]]; then
|
||||
printf " - Missing: $application\n"
|
||||
fi
|
||||
}
|
||||
export -f verify_listed_application
|
||||
|
||||
# Verifies path exists.
|
||||
# Parameters: $1 (required) - The path.
|
||||
verify_path() {
|
||||
|
||||
Reference in New Issue
Block a user