Compare commits

..

40 Commits

Author SHA1 Message Date
Brooke Kuhlmann
f393d8181f Added version release notes 2024-05-02 13:30:36 -06:00
Brooke Kuhlmann
a7b479f716 Updated to Ruby 3.3.1
See link:https://www.ruby-lang.org/en/news/2024/04/23/ruby-3-3-1-released[details].

Milestone: patch
2024-04-23 06:55:56 -06:00
Brooke Kuhlmann
4f37a67353 Added version release notes 2024-04-21 09:57:48 -06:00
Brooke Kuhlmann
0c5e66b605 Updated to Git Lint 7.3.0
See link:https://alchemists.io/projects/git-lint/versions[details].

Milestone: minor
2024-04-21 09:09:06 -06:00
Brooke Kuhlmann
fd112d373e Updated to Rake 13.2.0
See link:https://github.com/ruby/rake/releases/tag/v13.2.0[details].

Milestone: minor
2024-04-21 09:02:33 -06:00
Brooke Kuhlmann
1da7437342 Updated to Git Lint 7.1.0
See link:https://alchemists.io/projects/git-lint/versions[details].

Milestone: minor
2024-03-03 10:08:17 -07:00
Brooke Kuhlmann
91df57a36b Updated to Caliber 0.51.0
See link:https://alchemists.io/projects/caliber/versions[version release notes].

Milestone: patch
2024-03-02 10:38:55 -07:00
Brooke Kuhlmann
982663a9ee Updated RuboCop to use XDG local configuration
Necessary to leverage the new XDG local configuration support added in Version 1.61.0.

Milestone: patch
2024-03-02 10:25:17 -07:00
Brooke Kuhlmann
dd8d7f7de5 Added version release notes 2024-02-25 09:19:36 -07:00
Brooke Kuhlmann
76b193dede Refactored bin script printing
Necessary to have consistent use of `printf` especially with formatting strings and new lines.

Milestone: patch
2024-02-25 08:41:48 -07:00
Brooke Kuhlmann
75d2c93e89 Refactored library functions
Minor cleanup to documentation, syntax, and consistency in general.

Milestone: patch
2024-02-25 08:41:40 -07:00
Brooke Kuhlmann
b4faa2e919 Updated to Caliber 0.50.0
See link:https://alchemists.io/projects/caliber/versions[release notes] for details.

Milestone: minor
2024-01-28 07:23:54 -07:00
Brooke Kuhlmann
920b111ef4 Fixed version release notes
Forgot to publish on the first when these updates were first made so am fixing this now with dates updated accordingly.

Milestone: patch
2024-01-06 12:24:03 -07:00
Brooke Kuhlmann
6553f9be6d Added version release notes 2024-01-01 14:09:49 -07:00
Brooke Kuhlmann
24fe1edefd Updated gem dependencies
Necessary to update all dependencies to latest versions now that we are using Ruby 3.3.0. Details:

* link:https://alchemists.io/projects/caliber[Caliber].
* link:https://github.com/ruby/debug[Debug].
* link:https://alchemists.io/projects/git-lint[Git Lint]: Temporarily disabled until next major release.

Milestone: major
2024-01-01 14:08:37 -07:00
Brooke Kuhlmann
9933eee1cd Updated to Ruby 3.3.0
Details [here](https://www.ruby-lang.org/en/news/2023/12/25/ruby-3-3-0-released).

Milestone: major
2023-12-27 16:46:39 -07:00
Brooke Kuhlmann
4fa7380216 Updated Circle CI step names
Necessary to be consistent with link:https://alchemists.io/projects/rubysmith[Rubysmith].

Milestone: patch
2023-12-27 16:46:39 -07:00
Brooke Kuhlmann
179b4f05a3 Added Rakefile quality task
Necessary to be consistent with other projects so it is always possible to run code quality checks.

Milestone: minor
2023-11-24 13:47:31 -07:00
Brooke Kuhlmann
91acff4756 Updated to Caliber 0.42.0
Necessary to update to recent code quality changes. link:https://alchemists.io/projects/caliber/versions[Details].

Milestone: patch
2023-10-15 11:40:21 -06:00
Brooke Kuhlmann
b0b4d51e2c Refactored Gemfile to use ruby file syntax
Necessary to leverage syntax first provided in Bundler 2.4.19 and reduce the need for a custom implementation.

Milestone: patch
2023-10-09 17:34:35 -06:00
Brooke Kuhlmann
c17a132408 Updated GitHub issue template with simplified sections
Necessary to simplify and streamline the process.
2023-09-30 18:58:31 -06:00
Brooke Kuhlmann
33fe1c7003 Added version release notes 2023-09-28 19:49:27 -06:00
Brooke Kuhlmann
605b1e4c3f Updated to macOS Sonoma
Necessary to install and make use of the latest Apple Operating System.

Milestone: major
2023-09-28 19:42:25 -06:00
Brooke Kuhlmann
2170941383 Added Debug gem
Necessary for debugging purposes but also for running global health scripts across all projects (including this one).
2023-06-22 09:49:02 -06:00
Brooke Kuhlmann
63ef52185b Added version release notes 2023-06-19 16:59:56 -06:00
Brooke Kuhlmann
74da03bc07 Updated to Caliber 0.35.0
[Caliber](https://alchemists.io/projects/caliber/versions).
2023-06-16 14:58:38 -06:00
Brooke Kuhlmann
ada1b73c13 Updated to Git Lint 6.0.0
[Details](https://alchemists.io/projects/git-lint/versions).
2023-06-16 13:06:42 -06:00
Brooke Kuhlmann
d196d18641 Updated to Refinements 11.0.0
[Details](https://alchemists.io/projects/refinements/versions).
2023-06-13 10:00:14 -06:00
Brooke Kuhlmann
a360bf535a Added version release notes 2023-05-18 08:22:37 -05:00
Brooke Kuhlmann
f5c6b6d40e Updated to Caliber 0.30.0
[Details](https://alchemists.io/projects/caliber/versions).
2023-04-12 06:40:26 -06:00
Brooke Kuhlmann
bd3caab3fc Added version release notes 2023-04-02 10:50:32 -06:00
Brooke Kuhlmann
2f0fa77831 Fixed programs without extensions to install to user directory
Necessary to ensure the Homebrew directory remains clean and is *only* managed by Homebrew. All other programs are downloaded straight from the provider and placed in the `/usr/local/bin` instead.
2023-03-30 14:50:26 -06:00
Brooke Kuhlmann
017f79442b Updated to Ruby 3.2.2
[Details](https://www.ruby-lang.org/en/news/2023/03/30/ruby-3-2-2-released).
2023-03-30 14:50:20 -06:00
Brooke Kuhlmann
cf648adae7 Updated site URLs to use bare domain
Necessary to point to `https://alchemists.io` instead of `https://www.alchemists.io` for short URL convenience. Both URLs work but use of `https://alchemists.io` is now preferred.
2023-02-19 11:22:36 -07:00
Brooke Kuhlmann
af7aa4d0d0 Updated to Ruby 3.2.1
[Details](https://www.ruby-lang.org/en/news/2023/02/08/ruby-3-2-1-released).
2023-02-08 12:29:22 -07:00
Brooke Kuhlmann
0bafd0ea25 Added version release notes 2023-02-05 10:43:52 -07:00
Brooke Kuhlmann
045a254219 Updated to Caliber 0.25.0
[Details](https://www.alchemists.io/projects/caliber/versions).
2023-02-05 10:28:38 -07:00
Brooke Kuhlmann
113f3b88f5 Added Rake binstub
Necessary to reduce typing and be consistent with existing binstub use.
2023-01-22 09:31:11 -07:00
Brooke Kuhlmann
4b77ecefd5 Updated to Git Lint 5.0.0
[Details](https://www.alchemists.io/projects/git-lint/versions).
2022-12-27 17:50:49 -07:00
Brooke Kuhlmann
fc2cca07cf Updated to Caliber 0.21.0
[Details](https://www.alchemists.io/projects/caliber/versions).
2022-12-27 17:32:46 -07:00
30 changed files with 405 additions and 275 deletions

View File

@@ -8,24 +8,24 @@ jobs:
- checkout - checkout
- restore_cache: - restore_cache:
name: Bundler Restore name: Gems Restore
keys: keys:
- gem-cache-{{.Branch}}-{{checksum "Gemfile"}} - gem-cache-{{.Branch}}-{{checksum "Gemfile"}}
- gem-cache- - gem-cache-
- run: - run:
name: Bundler Install name: Gems Install
command: | command: |
gem update --system gem update --system
bundle config set path "vendor/bundle" bundle config set path "vendor/bundle"
bundle install bundle install
- save_cache: - save_cache:
name: Bundler Store name: Gems Store
key: gem-cache-{{.Branch}}-{{checksum "Gemfile"}} key: gem-cache-{{.Branch}}-{{checksum "Gemfile"}}
paths: paths:
- vendor/bundle - vendor/bundle
- run: - run:
name: Build name: Rake
command: bundle exec rake command: bundle exec rake

View File

@@ -1,11 +1,8 @@
## Overview ## Why
<!-- Required. Describe, briefly, the behavior experienced and desired. --> <!-- Required. Describe, briefly, why this issue is important. -->
## Screenshots/Screencasts ## How
<!-- Optional. Attach screenshot(s) and/or screencast(s) that demo the behavior. --> <!-- Optional. List exact steps (numbered) to implement or reproduce behavior. Screen shots/casts are welcome. -->
## Steps to Recreate ## Notes
<!-- Required. List exact steps (numbered list) to reproduce errant behavior. --> <!-- Optional. Provide additional details (i.e operating system, software version(s), stack dump, etc.) -->
## Environment
<!-- Required. What is your operating system, software version(s), etc. -->

View File

@@ -1 +1 @@
3.2.0 3.3.1

View File

@@ -1,10 +1,10 @@
cff-version: 1.2.0 cff-version: 1.2.0
message: Please use the following metadata when citing this project in your work. message: Please use the following metadata when citing this project in your work.
title: macOS title: macOS
abstract: Provides a shell based framework for automating the setup of a macOS machine. abstract: Shell scripts for automated macOS machine setup.
version: 16.0.0 version: 18.2.1
license: Hippocratic-2.1 license: Hippocratic-2.1
date-released: 2022-12-25 date-released: 2024-05-02
authors: authors:
- family-names: Kuhlmann - family-names: Kuhlmann
given-names: Brooke given-names: Brooke
@@ -17,5 +17,5 @@ keywords:
- automation - automation
- setup - setup
- recovery - recovery
repository-code: https://www.alchemists.io/projects/mac_os repository-code: https://alchemists.io/projects/mac_os
repository-artifact: https://www.alchemists.io/projects/mac_os repository-artifact: https://alchemists.io/projects/mac_os

View File

@@ -1,9 +1,10 @@
# frozen_string_literal: true # frozen_string_literal: true
ruby File.read(".ruby-version").strip ruby file: ".ruby-version"
source "https://rubygems.org" source "https://rubygems.org"
gem "caliber", "~> 0.16" gem "caliber", "~> 0.51"
# gem "git-lint", "~> 4.0" gem "debug", "~> 1.9"
gem "rake", "~> 13.0" gem "git-lint", "~> 7.3"
gem "rake", "~> 13.2"

View File

@@ -8,13 +8,13 @@ Shell scripts for automated macOS machine setup.
This project is a framework for automating the setup of a macOS machine. In order to illustrate the This project is a framework for automating the setup of a macOS machine. In order to illustrate the
potential of what this project can do, please see the companion potential of what this project can do, please see the companion
link:https://www.alchemists.io/projects/mac_os-config[macOS Config] project for details. The _macOS link:https://alchemists.io/projects/mac_os-config[macOS Config] project for details. The _macOS
Config_ project is an opinionated configuration which meets the needs of my development environment Config_ project is an opinionated configuration which meets the needs of my development environment
but is also meant to serve as an example and guide for building your own personalized setup. Here is 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: how the two projects are meant to be used:
* *macOS* (this project) - The foundational framework for building custom 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 * *link:https://alchemists.io/projects/mac_os-config[macOS Configuration]* - The layer on top of
this _macOS_ project which defines a custom machine implementation. The project is meant to be this _macOS_ project which defines a custom machine implementation. The project is meant to be
forked for as many custom machine setups as needed. forked for as many custom machine setups as needed.
@@ -38,14 +38,9 @@ toc::[]
* Configures installed software. * Configures installed software.
* Supports restoration of machine backups. * Supports restoration of machine backups.
== Screencast
[link=https://www.alchemists.io/screencasts/mac_os]
image::https://www.alchemists.io/images/screencasts/mac_os/cover.svg[Screencast,600,240,role=focal_point]
== Requirements == Requirements
. link:https://www.apple.com/macos/ventura[macOS Ventura] . link:https://www.apple.com/macos/sonoma[macOS Sonoma]
. link:https://developer.apple.com/xcode[Xcode] . link:https://developer.apple.com/xcode[Xcode]
== Setup == Setup
@@ -56,7 +51,7 @@ To install, run:
---- ----
git clone https://github.com/bkuhlmann/mac_os.git git clone https://github.com/bkuhlmann/mac_os.git
cd mac_os cd mac_os
git checkout 16.0.0 git checkout 18.2.0
---- ----
== Usage == Usage
@@ -172,9 +167,9 @@ All executable scripts can be found in the `bin` folder:
* `bin/run` (required): The main script and interface for macOS setup. * `bin/run` (required): The main script and interface for macOS setup.
The `lib` folder provides the base framework for installing, re-installing, and uninstalling The `lib` folder provides the base framework for installing, re-installing, and uninstalling
software. Everything provided via the link:https://www.alchemists.io/projects/mac_os-config[macOS software. Everything provided via the link:https://alchemists.io/projects/mac_os-config[macOS
Config] project is built upon the functions found in the `lib` folder. See the Config] project is built upon the functions found in the `lib` folder. See the
link:https://www.alchemists.io/projects/mac_os-config[macOS Config] project for further details. link:https://alchemists.io/projects/mac_os-config[macOS Config] project for further details.
* `lib/settings.sh`: Defines global settings for software applications, extensions, etc. * `lib/settings.sh`: Defines global settings for software applications, extensions, etc.
@@ -216,18 +211,18 @@ git clone https://github.com/bkuhlmann/mac_os.git
cd mac_os cd mac_os
---- ----
== link:https://www.alchemists.io/policies/license[License] == link:https://alchemists.io/policies/license[License]
== link:https://www.alchemists.io/policies/security[Security] == link:https://alchemists.io/policies/security[Security]
== link:https://www.alchemists.io/policies/code_of_conduct[Code of Conduct] == link:https://alchemists.io/policies/code_of_conduct[Code of Conduct]
== link:https://www.alchemists.io/policies/contributions[Contributions] == link:https://alchemists.io/policies/contributions[Contributions]
== link:https://www.alchemists.io/projects/mac_os/versions[Versions] == link:https://alchemists.io/projects/mac_os/versions[Versions]
== link:https://www.alchemists.io/community[Community] == link:https://alchemists.io/community[Community]
== Credits == Credits
Engineered by link:https://www.alchemists.io/team/brooke_kuhlmann[Brooke Kuhlmann]. Engineered by link:https://alchemists.io/team/brooke_kuhlmann[Brooke Kuhlmann].

View File

@@ -1,9 +1,12 @@
# frozen_string_literal: true # frozen_string_literal: true
# require "git/lint/rake/setup" require "git/lint/rake/register"
require "rubocop/rake_task" require "rubocop/rake_task"
Git::Lint::Rake::Register.call
RuboCop::RakeTask.new RuboCop::RakeTask.new
# task default: %i[git_lint rubocop] desc "Run code quality checks"
task default: %i[rubocop] task quality: %i[git_lint rubocop]
task default: :quality

View File

@@ -1,5 +1,62 @@
= Versions = Versions
== 18.2.1 (2024-05-02)
* 🔼 Updated to Ruby 3.3.1 - Brooke Kuhlmann
== 18.2.0 (2024-04-21)
* 🔼 Updated RuboCop to use XDG local configuration - Brooke Kuhlmann
* 🔼 Updated to Caliber 0.51.0 - Brooke Kuhlmann
* 🔼 Updated to Git Lint 7.1.0 - Brooke Kuhlmann
* 🔼 Updated to Git Lint 7.3.0 - Brooke Kuhlmann
* 🔼 Updated to Rake 13.2.0 - Brooke Kuhlmann
== 18.1.0 (2024-02-25)
* 🔼 Updated to Caliber 0.50.0 - Brooke Kuhlmann
* 🔁 Refactored bin script printing - Brooke Kuhlmann
* 🔁 Refactored library functions - Brooke Kuhlmann
== 18.0.0 (2024-01-06)
* Added Rakefile quality task - Brooke Kuhlmann
* Updated Circle CI step names - Brooke Kuhlmann
* Updated GitHub issue template with simplified sections - Brooke Kuhlmann
* Updated gem dependencies - Brooke Kuhlmann
* Updated to Caliber 0.42.0 - Brooke Kuhlmann
* Updated to Ruby 3.3.0 - Brooke Kuhlmann
* Refactored Gemfile to use ruby file syntax - Brooke Kuhlmann
== 17.0.0 (2023-09-28)
* Added Debug gem - Brooke Kuhlmann
* Updated to macOS Sonoma - Brooke Kuhlmann
== 16.0.4 (2023-06-19)
* Updated to Caliber 0.35.0 - Brooke Kuhlmann
* Updated to Git Lint 6.0.0 - Brooke Kuhlmann
* Updated to Refinements 11.0.0 - Brooke Kuhlmann
== 16.0.3 (2023-05-18)
* Updated to Caliber 0.30.0 - Brooke Kuhlmann
== 16.0.2 (2023-04-02)
* Fixed programs without extensions to install to user directory - Brooke Kuhlmann
* Updated site URLs to use bare domain - Brooke Kuhlmann
* Updated to Ruby 3.2.1 - Brooke Kuhlmann
* Updated to Ruby 3.2.2 - Brooke Kuhlmann
== 16.0.1 (2023-02-05)
* Added Rake binstub - Brooke Kuhlmann
* Updated to Caliber 0.21.0 - Brooke Kuhlmann
* Updated to Caliber 0.25.0 - Brooke Kuhlmann
* Updated to Git Lint 5.0.0 - Brooke Kuhlmann
== 16.0.0 (2022-12-25) == 16.0.0 (2022-12-25)
* Fixed Node installer to detect Node and version - Brooke Kuhlmann * Fixed Node installer to detect Node and version - Brooke Kuhlmann

View File

@@ -2,33 +2,33 @@
# Creates macOS boot disk. # Creates macOS boot disk.
printf "macOS Boot Disk Tips\n" printf "%s\n" "macOS Boot Disk Tips"
printf " - Use a USB drive (8GB or higher).\n" printf "%s\n" " - Use a USB drive (8GB or higher)."
printf " - Use Disk Utility to format the USB drive as \"APSF\".\n" printf "%s\n" " - Use Disk Utility to format the USB drive as \"APSF\"."
printf " - Use Disk Utility to label the USB drive as \"Untitled\".\n" printf "%s\n" " - Use Disk Utility to label the USB drive as \"Untitled\"."
printf "\nmacOS Boot Disk Usage:\n" printf "\n%s\n" "macOS Boot Disk Usage:"
printf " 1. Insert the USB boot disk into the machine to be upgraded.\n" printf "%s\n" " 1. Insert the USB boot disk into the machine to be upgraded."
printf " 2. Reboot the machine.\n" printf "%s\n" " 2. Reboot the machine."
printf " 3. Press and hold the POWER key before the Apple logo appears.\n" printf "%s\n" " 3. Press and hold the POWER key before the Apple logssssso appears."
printf " 4. Select the USB boot disk from the menu.\n" printf "%s\n" " 4. Select the USB boot disk from the menu."
printf " 5. Use Disk Utility to delete and/or erase the hard drive including associated partitions.\n" printf "%s\n" " 5. Use Disk Utility to delete and/or erase the hard drive including associated partitions."
printf " 6. Use Disk Utility to create a single \"APFS\" drive.\n" printf "%s\n" " 6. Use Disk Utility to create a single \"APFS\" drive."
printf " 7. Install the new operating system.\n" printf "%s\n" " 7. Install the new operating system."
printf "\nmacOS Boot Disk Recovery:\n" printf "\n%s\n" "macOS Boot Disk Recovery:"
printf " 1. Start/restart the machine.\n" printf "%s\n" " 1. Start/restart the machine."
printf " 2. Press and hold the POWER key before the Apple logo appears.\n" printf "%s\n" " 2. Press and hold the POWER key before the Apple logo appears."
printf " 3. Wait for the macOS installer to load from the recovery partition.\n" printf "%s\n" " 3. Wait for the macOS installer to load from the recovery partition."
printf " 4. Use the dialog options to launch Disk Utility, reinstall the system, etc.\n" printf "%s\n" " 4. Use the dialog options to launch Disk Utility, reinstall the system, etc."
printf "\nCreating macOS boot disk...\n" printf "\n%s\n" "Creating macOS boot disk..."
if [[ ! -e "$MAC_OS_BOOT_DISK_CREATOR" ]]; then if [[ ! -e "$MAC_OS_BOOT_DISK_CREATOR" ]]; then
printf "ERROR: macOS installer does not exist: $MAC_OS_BOOT_DISK_CREATOR. Use System Preferences → Software Update to download.\n" printf "%s\n" "ERROR: macOS installer does not exist: $MAC_OS_BOOT_DISK_CREATOR. Use System Preferences → Software Update to download."
exit 1 exit 1
fi fi
if [[ ! -d "$MAC_OS_BOOT_DISK_PATH" ]]; then if [[ ! -d "$MAC_OS_BOOT_DISK_PATH" ]]; then
printf "ERROR: Boot disk must be mounted at: $MAC_OS_BOOT_DISK_PATH.\n" printf "%s\n" "ERROR: Boot disk must be mounted at: $MAC_OS_BOOT_DISK_PATH."
exit 1 exit 1
fi fi

View File

@@ -13,5 +13,5 @@ if [[ -x "$SCRIPT_PATH" ]]; then
check_mas_install check_mas_install
"$SCRIPT_PATH" "$SCRIPT_PATH"
else else
printf "WARNING: App Store install script does not exist or is not executable.\n" printf "%s\n" "WARNING: App Store install script does not exist or is not executable."
fi fi

View File

@@ -12,5 +12,5 @@ SCRIPT_PATH="$MAC_OS_CONFIG_PATH/bin/install_applications"
if [[ -x "$SCRIPT_PATH" ]]; then if [[ -x "$SCRIPT_PATH" ]]; then
"$SCRIPT_PATH" "$SCRIPT_PATH"
else else
printf "WARNING: Applications install script does not exist or is not executable.\n" printf "%s\n" "WARNING: Applications install script does not exist or is not executable."
fi fi

View File

@@ -12,5 +12,5 @@ SCRIPT_PATH="$MAC_OS_CONFIG_PATH/bin/install_basics"
if [[ -x "$SCRIPT_PATH" ]]; then if [[ -x "$SCRIPT_PATH" ]]; then
"$SCRIPT_PATH" "$SCRIPT_PATH"
else else
printf "WARNING: Basic settings script does not exist or is not executable.\n" printf "%s\n" "WARNING: Basic settings script does not exist or is not executable."
fi fi

View File

@@ -12,5 +12,5 @@ SCRIPT_PATH="$MAC_OS_CONFIG_PATH/bin/install_defaults"
if [[ -x "$SCRIPT_PATH" ]]; then if [[ -x "$SCRIPT_PATH" ]]; then
"$SCRIPT_PATH" "$SCRIPT_PATH"
else else
printf "WARNING: Default settings script does not exist or is not executable.\n" printf "%s\n" "WARNING: Default settings script does not exist or is not executable."
fi fi

View File

@@ -1,14 +1,14 @@
#! /usr/bin/env bash #! /usr/bin/env bash
Installs development tooling requirements. # Installs development tooling requirements.
printf "Installing Xcode CLI tools...\n" printf "%s\n" "Installing Xcode CLI tools..."
xcode-select --install xcode-select --install
printf "%s\n" "💡 ALT+TAB to view and accept Xcode license window." printf "%s\n" "💡 ALT+TAB to view and accept Xcode license window."
read -p "Have you completed the Xcode CLI tools install (y/n)? " xcode_response read -p "Have you completed the Xcode CLI tools install (y/n)? " xcode_response
if [[ "$xcode_response" != "y" ]]; then if [[ "$xcode_response" != "y" ]]; then
printf "ERROR: Xcode CLI tools must be installed before proceeding.\n" printf "%s\n" "ERROR: Xcode CLI tools must be installed before proceeding."
exit 1 exit 1
fi fi

View File

@@ -12,5 +12,5 @@ SCRIPT_PATH="$MAC_OS_CONFIG_PATH/bin/install_extensions"
if [[ -x "$SCRIPT_PATH" ]]; then if [[ -x "$SCRIPT_PATH" ]]; then
"$SCRIPT_PATH" "$SCRIPT_PATH"
else else
printf "WARNING: Application extensions install script does not exist or is not executable.\n" printf "%s\n" "WARNING: Application extensions install script does not exist or is not executable."
fi fi

View File

@@ -13,5 +13,5 @@ if [[ -x "$SCRIPT_PATH" ]]; then
install_homebrew install_homebrew
"$SCRIPT_PATH" "$SCRIPT_PATH"
else else
printf "WARNING: Homebrew Casks install script does not exist or is not executable.\n" printf "%s\n" "WARNING: Homebrew Casks install script does not exist or is not executable."
fi fi

View File

@@ -13,5 +13,5 @@ if [[ -x "$SCRIPT_PATH" ]]; then
install_homebrew install_homebrew
"$SCRIPT_PATH" "$SCRIPT_PATH"
else else
printf "WARNING: Homebrew Formulas install script does not exist or is not executable.\n" printf "%s\n" "WARNING: Homebrew Formulas install script does not exist or is not executable."
fi fi

View File

@@ -13,5 +13,5 @@ if [[ -x "$SCRIPT_PATH" ]]; then
install_node install_node
"$SCRIPT_PATH" "$SCRIPT_PATH"
else else
printf "WARNING: Node packages install script does not exist or is not executable.\n" printf "%s\n" "WARNING: Node packages install script does not exist or is not executable."
fi fi

View File

@@ -13,5 +13,5 @@ if [[ -x "$SCRIPT_PATH" ]]; then
install_ruby install_ruby
"$SCRIPT_PATH" "$SCRIPT_PATH"
else else
printf "WARNING: Ruby gems install script does not exist or is not executable.\n" printf "%s\n" "WARNING: Ruby gems install script does not exist or is not executable."
fi fi

View File

@@ -13,5 +13,5 @@ if [[ -x "$SCRIPT_PATH" ]]; then
install_rust install_rust
"$SCRIPT_PATH" "$SCRIPT_PATH"
else else
printf "WARNING: Rust crates install script does not exist or is not executable.\n" printf "%s\n" "WARNING: Rust crates install script does not exist or is not executable."
fi fi

View File

@@ -12,5 +12,5 @@ SCRIPT_PATH="$MAC_OS_CONFIG_PATH/bin/install_shell"
if [[ -x "$SCRIPT_PATH" ]]; then if [[ -x "$SCRIPT_PATH" ]]; then
"$SCRIPT_PATH" "$SCRIPT_PATH"
else else
printf "WARNING: Shell script does not exist or is not executable.\n" printf "%s\n" "WARNING: Shell script does not exist or is not executable."
fi fi

6
bin/rake Executable file
View File

@@ -0,0 +1,6 @@
#! /usr/bin/env ruby
# frozen_string_literal: true
require "bundler/setup"
load Gem.bin_path "rake", "rake"

View File

@@ -12,5 +12,5 @@ SCRIPT_PATH="$MAC_OS_CONFIG_PATH/bin/restore_backup"
if [[ -x "$SCRIPT_PATH" ]]; then if [[ -x "$SCRIPT_PATH" ]]; then
"$SCRIPT_PATH" "$SCRIPT_PATH"
else else
printf "WARNING: Restore backup script does not exist or is not executable.\n" printf "%s\n" "WARNING: Restore backup script does not exist or is not executable."
fi fi

70
bin/run
View File

@@ -11,13 +11,13 @@ source lib/verifiers.sh
if [[ -e "$MAC_OS_CONFIG_PATH" ]]; then if [[ -e "$MAC_OS_CONFIG_PATH" ]]; then
source "$MAC_OS_CONFIG_PATH/lib/settings.sh" source "$MAC_OS_CONFIG_PATH/lib/settings.sh"
else else
printf "ERROR: Unable to load macOS configuration: $MAC_OS_CONFIG_PATH.\n\n" printf "%s\n\n" "ERROR: Unable to load macOS configuration: $MAC_OS_CONFIG_PATH."
printf "Please check the following before continuing:\n" printf "%s\n" "Please check the following before continuing:"
printf " • Download the default macOS configuration here: https://github.com/bkuhlmann/mac_os-config.\n" printf "%s\n" " • Download the default macOS configuration here: https://github.com/bkuhlmann/mac_os-config."
printf " • Customize as necessary for your setup or fork the project and make your own configuration.\n" printf "%s\n" " • Customize as necessary for your setup or fork the project and make your own configuration."
printf " • When finished, your folder structure should look like this:\n" printf "%s\n" " • When finished, your folder structure should look like this:"
printf " • <root path>/mac_os:\n" printf "%s\n" " • <root path>/mac_os:"
printf " • <root path>/mac_os-config:\n" printf "%s\n" " • <root path>/mac_os-config:"
exit 1 exit 1
fi fi
@@ -25,37 +25,37 @@ configure_environment
while true; do while true; do
if [[ $# == 0 ]]; then if [[ $# == 0 ]]; then
printf "\nUsage: run OPTION\n" printf "\n%s\n" "Usage: run OPTION"
printf "\nOSX Options:\n" printf "\n%s\n" "OSX Options:"
printf " Boot:\n" printf "%s\n" " Boot:"
printf " B: Create boot disk.\n" printf "%s\n" " B: Create boot disk."
printf " Install:\n" printf "%s\n" " Install:"
printf " b: Install basics.\n" printf "%s\n" " b: Install basics."
printf " t: Install development tools.\n" printf "%s\n" " t: Install development tools."
printf " hf: Install Homebrew Formulas.\n" printf "%s\n" " hf: Install Homebrew Formulas."
printf " hc: Install Homebrew Casks.\n" printf "%s\n" " hc: Install Homebrew Casks."
printf " m: Install Mac App Store software.\n" printf "%s\n" " m: Install Mac App Store software."
printf " a: Install application software.\n" printf "%s\n" " a: Install application software."
printf " x: Install application software extensions.\n" printf "%s\n" " x: Install application software extensions."
printf " d: Install defaults.\n" printf "%s\n" " d: Install defaults."
printf " s: Install shell.\n" printf "%s\n" " s: Install shell."
printf " r: Restore backups.\n" printf "%s\n" " r: Restore backups."
printf " i: Install all (i.e. executes all of the above steps in order listed).\n" printf "%s\n" " i: Install all (i.e. executes all of the above steps in order listed)."
printf " Libraries:\n" printf "%s\n" " Libraries:"
printf " np: Install Node packages.\n" printf "%s\n" " np: Install Node packages."
printf " rg: Install Ruby gems.\n" printf "%s\n" " rg: Install Ruby gems."
printf " rc: Install Rust crates.\n" printf "%s\n" " rc: Install Rust crates."
printf " l: Install libraries (i.e. executes all of the above steps in order listed).\n" printf "%s\n" " l: Install libraries (i.e. executes all of the above steps in order listed)."
printf " Manage:\n" printf "%s\n" " Manage:"
printf " c: Check status of managed software.\n" printf "%s\n" " c: Check status of managed software."
printf " C: Caffeinate machine.\n" printf "%s\n" " C: Caffeinate machine."
printf " w: Clean work (temp) directory.\n" printf "%s\n" " w: Clean work (temp) directory."
printf " q: Quit/Exit.\n\n" printf "%s\n\n" " q: Quit/Exit."
read -p "Enter selection: " response read -p "Enter selection: " response
printf "\n" printf "\n"
process_option $response process_option "$response"
else else
process_option $1 process_option "$1"
fi fi
break break

View File

@@ -2,8 +2,9 @@
# Defines software installer functions. # Defines software installer functions.
# Downloads remote file to local disk. # Label: Download File
# Parameters: $1 (required) - URL, $2 (required) - File name, $3 (optional) - HTTP header. # Description: Download remote file to local disk.
# Parameters: $1 (required): URL, $2 (required): File name, $3 (optional): HTTP header.
download_file() { download_file() {
local url="$1" local url="$1"
local file_name="$2" local file_name="$2"
@@ -24,38 +25,47 @@ download_file() {
} }
export -f download_file export -f download_file
# Installs an application. # Label: Install Application
# Parameters: $1 (required) - Application source path, $2 (required) - Application name. # Description: Install an application.
# Parameters: $1 (required): Install path, $2 (required): Name.
install_app() { install_app() {
local install_root=$(get_install_root "$2") local install_path="$1"
local file_extension=$(get_extension "$2") local name="$2"
local install_root=""
local file_extension=""
printf "Installing: $install_root/$2...\n" install_root=$(get_install_root "$name")
file_extension=$(get_extension "$name")
printf "%s\n" "Installing: $install_root/$name..."
case $file_extension in case $file_extension in
'') '')
cp -a "$1/$2" "$install_root";; cp -a "$install_path/$name" "$install_root";;
'app') 'app')
cp -a "$1/$2" "$install_root";; cp -a "$install_path/$name" "$install_root";;
'prefPane') 'prefPane')
sudo cp -pR "$1/$2" "$install_root";; sudo cp -pR "$install_path/$name" "$install_root";;
'qlgenerator') 'qlgenerator')
sudo cp -pR "$1/$2" "$install_root" && qlmanage -r;; sudo cp -pR "$install_path/$name" "$install_root" && qlmanage -r;;
*) *)
printf "ERROR: Unknown file extension: $file_extension.\n" printf "%s\n" "ERROR: Unknown file extension: $file_extension."
esac esac
} }
export -f install_app export -f install_app
# Installs an application via a DMG file. # Label: Install DMG Application
# Parameters: $1 (required) - URL, $2 (required) - Mount path, $3 (required) - Application name. # Description: Install DMG application.
# Parameters: $1 (required): URL, $2 (required): Mount path, $3 (required): Application name.
install_dmg_app() { install_dmg_app() {
local url="$1" local url="$1"
local mount_point="/Volumes/$2" local mount_point="/Volumes/$2"
local app_name="$3" local app_name="$3"
local install_path=$(get_install_path "$app_name") local install_path=""
local work_file="download.dmg" local work_file="download.dmg"
install_path=$(get_install_path "$app_name")
if [[ ! -e "$install_path" ]]; then if [[ ! -e "$install_path" ]]; then
download_file "$url" "$work_file" download_file "$url" "$work_file"
mount_image "$MAC_OS_WORK_PATH/$work_file" mount_image "$MAC_OS_WORK_PATH/$work_file"
@@ -66,66 +76,76 @@ install_dmg_app() {
} }
export -f install_dmg_app export -f install_dmg_app
# Installs a package via a DMG file. # Label: Install DMG Package
# Parameters: $1 (required) - URL, $2 (required) - Mount path, $3 (required) - Application name. # Description: Install DMG application via a package file.
# Parameters: $1 (required): URL, $2 (required): Mount path, $3 (required): Application name.
install_dmg_pkg() { install_dmg_pkg() {
local url="$1" local url="$1"
local mount_point="/Volumes/$2" local mount_point="/Volumes/$2"
local app_name="$3" local app_name="$3"
local install_path=$(get_install_path "$app_name") local install_path=""
local work_file="download.dmg" local work_file="download.dmg"
install_path=$(get_install_path "$app_name")
if [[ ! -e "$install_path" ]]; then if [[ ! -e "$install_path" ]]; then
download_file "$url" "$work_file" download_file "$url" "$work_file"
mount_image "$MAC_OS_WORK_PATH/$work_file" mount_image "$MAC_OS_WORK_PATH/$work_file"
install_pkg "$mount_point" "$app_name" install_pkg "$mount_point" "$app_name"
unmount_image "$mount_point" unmount_image "$mount_point"
printf "Installed: $app_name.\n" printf "%s\n" "Installed: $app_name."
verify_application "$app_name" verify_application "$app_name"
fi fi
} }
export -f install_dmg_pkg export -f install_dmg_pkg
# Installs a single file. # Label: Install File
# Parameters: $1 (required) - URL, $2 (required) - Install path. # Description: Install a single file.
# Parameters: $1 (required): URL, $2 (required): Install path.
install_file() { install_file() {
local file_url="$1" local file_url="$1"
local file_name=$(get_basename "$1") local file_name=""
local install_path="$2" local install_path="$2"
file_name=$(get_basename "$1")
if [[ ! -e "$install_path" ]]; then if [[ ! -e "$install_path" ]]; then
download_file "$file_url" "$file_name" download_file "$file_url" "$file_name"
mkdir -p $(dirname "$install_path") mkdir -p $(dirname "$install_path")
mv "$MAC_OS_WORK_PATH/$file_name" "$install_path" mv "$MAC_OS_WORK_PATH/$file_name" "$install_path"
printf "Installed: $file_name.\n" printf "%s\n" "Installed: $file_name."
verify_path "$install_path" verify_path "$install_path"
fi fi
} }
export -f install_file export -f install_file
# Installs application code from a Git repository. # Label: Install Git Application
# Parameters: $1 (required) - Repository URL, $2 (required) - Install path, $3 (optional) - Git clone options. # Description: Install application from a Git repository.
# Parameters: $1 (required): URL, $2 (required): Install path, $3 (optional): Git clone options.
install_git_app() { install_git_app() {
local repository_url="$1" local url="$1"
local app_name=$(get_basename "$2")
local install_path="$2" local install_path="$2"
local app_name=""
local options="--quiet" local options="--quiet"
app_name="$(get_basename "$2")"
if [[ -n "$3" ]]; then if [[ -n "$3" ]]; then
local options="$options $3" local options="$options $3"
fi fi
if [[ ! -e "$install_path" ]]; then if [[ ! -e "$install_path" ]]; then
printf "Installing: $install_path/$app_name...\n" printf "%s\n" "Installing: $install_path..."
git clone $options "$repository_url" "$install_path" git clone $options "$url" "$install_path"
printf "Installed: $app_name.\n" printf "%s\n" "Installed: $app_name."
verify_path "$install_path" verify_path "$install_path"
fi fi
} }
export -f install_git_app export -f install_git_app
# Installs settings from a Git repository. # Label: Install Git Project
# Parameters: $1 (required) - Repository URL, $2 (required) - Repository version, $3 (required) - Project directory, $4 (required) - Script to run (including any arguments). # Description: Install Git project.
# Parameters: $1 (required): URL, $2 (required): Version, $3 (required): Project directory, $4 (required): Script to run (including any arguments).
install_git_project() { install_git_project() {
local repo_url="$1" local repo_url="$1"
local repo_version="$2" local repo_version="$2"
@@ -142,64 +162,76 @@ install_git_project() {
} }
export -f install_git_project export -f install_git_project
# Installs Homebrew. # Label: Install Homebrew
# Parameters: None. # Description: Install and setup Homebrew.
install_homebrew() { install_homebrew() {
if ! command -v brew > /dev/null; then 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)" /bin/bash -c "$(curl --location --fail --silent --show-error https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
echo "eval \"($(get_homebrew_bin_root)/brew shellenv)\"" > $HOME/.zprofile echo "eval \"($(get_homebrew_bin_root)/brew shellenv)\"" > "$HOME/.zprofile"
eval "$($(get_homebrew_bin_root)/brew shellenv)" eval "$($(get_homebrew_bin_root)/brew shellenv)"
fi fi
} }
export -f install_homebrew export -f install_homebrew
# Installs a package via a zip file. # Label: Install Bare Package
# Parameters: $1 (required) - URL, $2 (required) - Application name. # Description: Install a bare package.
# Parameters: $1 (required): URL, $2 (required): Application name.
install_bare_pkg() { install_bare_pkg() {
local url="$1" local url="$1"
local app_name="$2" local app_name="$2"
local install_path=$(get_install_path "$app_name") local install_path=""
local work_file="$app_name.pkg" local work_file="$app_name.pkg"
install_path=$(get_install_path "$app_name")
if [[ ! -e "$install_path" ]]; then if [[ ! -e "$install_path" ]]; then
download_file "$url" "$work_file" download_file "$url" "$work_file"
install_pkg "$MAC_OS_WORK_PATH" "$app_name" install_pkg "$MAC_OS_WORK_PATH" "$app_name"
printf "Installed: $app_name.\n" printf "%s\n" "Installed: $app_name."
verify_application "$app_name" verify_application "$app_name"
fi fi
} }
export -f install_bare_pkg export -f install_bare_pkg
# Installs a package. # Label: Install Package
# Parameters: $1 (required) - Package source path, $2 (required) - Application name. # Description: Install local package.
# Parameters: $1 (required): Package source path, $2 (required): Application name.
install_pkg() { install_pkg() {
local install_root=$(get_install_root "$2") local source_path="$1"
local name="$2"
local install_root=""
local package=""
printf "Installing: $install_root/$2...\n" install_root=$(get_install_root "$name")
local package=$(sudo find "$1" -maxdepth 1 -type f -name "*.pkg" -o -name "*.mpkg") package=$(sudo find "$source_path" -maxdepth 1 -type f -name "*.pkg" -o -name "*.mpkg")
printf "%s\n" "Installing: $install_root/$name..."
sudo installer -pkg "$package" -target / sudo installer -pkg "$package" -target /
} }
export -f install_pkg export -f install_pkg
# Installs program (single file). # Label: Install Program
# Parameters: $1 (required) - URL, $2 (required) - Program name. # Description: Installs program without any packaging.
# Parameters: $1 (required): URL, $2 (required): Name.
install_program() { install_program() {
local url="$1" local url="$1"
local program_name="$2" local program_name="$2"
local install_path=$(get_install_path "$program_name") local install_path=""
install_path=$(get_install_path "$program_name")
if [[ ! -e "$install_path" ]]; then if [[ ! -e "$install_path" ]]; then
download_file "$url" "$program_name" download_file "$url" "$program_name"
mv "$MAC_OS_WORK_PATH/$program_name" "$install_path" mv "$MAC_OS_WORK_PATH/$program_name" "$install_path"
chmod 755 "$install_path" chmod 755 "$install_path"
printf "Installed: $program_name.\n" printf "%s\n" "Installed: $program_name."
verify_application "$program_name" verify_application "$program_name"
fi fi
} }
export -f install_program export -f install_program
# Installs Node. # Label: Install Node
# Parameters: None. # Description: Install and setup Node for local development.
install_node() { install_node() {
if [[ ! -x "$(command -v node)" ]]; then if [[ ! -x "$(command -v node)" ]]; then
"$(get_homebrew_bin_root)/fnm" install --latest "$(get_homebrew_bin_root)/fnm" install --latest
@@ -207,10 +239,12 @@ install_node() {
} }
export -f install_node export -f install_node
# Installs Ruby. # Label: Install Ruby
# Parameters: None. # Description: Install and setup Ruby for local development.
install_ruby() { install_ruby() {
local version="$(cat $HOME/.ruby-version | tr -d '\n')" local version=""
version="$(cat $HOME/.ruby-version | tr -d '\n')"
if [[ ! -x "$(command -v ruby)" && -n $(ruby --version | grep --quiet "$version") ]]; then if [[ ! -x "$(command -v ruby)" && -n $(ruby --version | grep --quiet "$version") ]]; then
"$(get_homebrew_bin_root)"/frum install "$version" \ "$(get_homebrew_bin_root)"/frum install "$version" \
@@ -222,8 +256,8 @@ install_ruby() {
} }
export -f install_ruby export -f install_ruby
# Installs Rust. # Label: Install Rust
# Parameters: None. # Description: Install and setup Rust for local development.
install_rust() { install_rust() {
if ! command -v cargo > /dev/null; then if ! command -v cargo > /dev/null; then
curl --proto "=https" --tlsv1.2 --fail --silent --show-error https://sh.rustup.rs | sh curl --proto "=https" --tlsv1.2 --fail --silent --show-error https://sh.rustup.rs | sh
@@ -231,15 +265,18 @@ install_rust() {
} }
export -f install_rust export -f install_rust
# Installs an application via a tar file. # Label: Install Tar Application
# Parameters: $1 (required) - URL, $2 (required) - Application name, $3 (required) - Decompress options. # Description: Install application from tar file.
# Parameters: $1 (required): URL, $2 (required): Name, $3 (required): Decompress options.
install_tar_app() { install_tar_app() {
local url="$1" local url="$1"
local app_name="$2" local app_name="$2"
local options="$3" local options="$3"
local install_path=$(get_install_path "$app_name") local install_path=""
local work_file="download.tar" local work_file="download.tar"
install_path=$(get_install_path "$app_name")
if [[ ! -e "$install_path" ]]; then if [[ ! -e "$install_path" ]]; then
download_file "$url" "$work_file" download_file "$url" "$work_file"
@@ -250,20 +287,23 @@ install_tar_app() {
) )
install_app "$MAC_OS_WORK_PATH" "$app_name" install_app "$MAC_OS_WORK_PATH" "$app_name"
printf "Installed: $app_name.\n" printf "%s\n" "Installed: $app_name."
verify_application "$app_name" verify_application "$app_name"
fi fi
} }
export -f install_tar_app export -f install_tar_app
# Installs an application via a zip file. # Label: Install Zip Application
# Parameters: $1 (required) - URL, $2 (required) - Application name. # Description: Install application from zip file.
# Parameters: $1 (required): URL, $2 (required): Name.
install_zip_app() { install_zip_app() {
local url="$1" local url="$1"
local app_name="$2" local app_name="$2"
local install_path=$(get_install_path "$app_name") local install_path=""
local work_file="download.zip" local work_file="download.zip"
install_path=$(get_install_path "$app_name")
if [[ ! -e "$install_path" ]]; then if [[ ! -e "$install_path" ]]; then
download_file "$url" "$work_file" download_file "$url" "$work_file"
@@ -275,20 +315,23 @@ install_zip_app() {
) )
install_app "$MAC_OS_WORK_PATH" "$app_name" install_app "$MAC_OS_WORK_PATH" "$app_name"
printf "Installed: $app_name.\n" printf "%s\n" "Installed: $app_name."
verify_application "$app_name" verify_application "$app_name"
fi fi
} }
export -f install_zip_app export -f install_zip_app
# Installs a package via a zip file. # Label: Install Zip Package
# Parameters: $1 (required) - URL, $2 (required) - Application name. # Description: Install application from a package within a zip file.
# Parameters: $1 (required): URL, $2 (required): Application name.
install_zip_pkg() { install_zip_pkg() {
local url="$1" local url="$1"
local app_name="$2" local app_name="$2"
local install_path=$(get_install_path "$app_name") local install_path=""
local work_file="download.zip" local work_file="download.zip"
install_path=$(get_install_path "$app_name")
if [[ ! -e "$install_path" ]]; then if [[ ! -e "$install_path" ]]; then
download_file "$url" "$work_file" download_file "$url" "$work_file"
@@ -299,24 +342,26 @@ install_zip_pkg() {
) )
install_pkg "$MAC_OS_WORK_PATH" "$app_name" install_pkg "$MAC_OS_WORK_PATH" "$app_name"
printf "Installed: $app_name.\n" printf "%s\n" "Installed: $app_name."
verify_application "$app_name" verify_application "$app_name"
fi fi
} }
export -f install_zip_pkg export -f install_zip_pkg
# Mounts a disk image. # Label: Mount Image
# Parameters: $1 (required) - Image path. # Description: Mount disk image.
# Parameters: $1 (required): Path.
mount_image() { mount_image() {
printf "Mounting image...\n" printf "%s\n" "Mounting image..."
hdiutil attach -quiet -nobrowse -noautoopen "$1" hdiutil attach -quiet -nobrowse -noautoopen "$1"
} }
export -f mount_image export -f mount_image
# Unmounts a disk image. # Label: Unmount Image
# Parameters: $1 (required) - Mount path. # Description: Unmount disk image.
# Parameters: $1 (required): Path.
unmount_image() { unmount_image() {
printf "Unmounting image...\n" printf "%s\n" "Unmounting image..."
hdiutil detach -force "$1" hdiutil detach -force "$1"
} }
export -f unmount_image export -f unmount_image

View File

@@ -2,8 +2,10 @@
# Defines command line prompt options. # Defines command line prompt options.
# Process option selection.
# Parameters: $1 (required) - The option to process. # Label: Process Option
# Description: Run script based on selection.
# Parameters: $1 (required): The option to process.
process_option() { process_option() {
case $1 in case $1 in
'B') 'B')

View File

@@ -5,7 +5,7 @@ set -o errexit
set -o pipefail set -o pipefail
IFS=$'\n\t' IFS=$'\n\t'
export MAC_OS_BOOT_DISK_CREATOR="/Applications/Install macOS Ventura.app/Contents/Resources/createinstallmedia" export MAC_OS_BOOT_DISK_CREATOR="/Applications/Install macOS Sonoma.app/Contents/Resources/createinstallmedia"
export MAC_OS_BOOT_DISK_PATH="/Volumes/Untitled" export MAC_OS_BOOT_DISK_PATH="/Volumes/Untitled"
export MAC_OS_WORK_PATH=/tmp/downloads export MAC_OS_WORK_PATH=/tmp/downloads
export MAC_OS_CONFIG_PATH="../mac_os-config" export MAC_OS_CONFIG_PATH="../mac_os-config"

View File

@@ -2,11 +2,10 @@
# Defines general utility functions. # Defines general utility functions.
# Caffeinate machine. # Label: Caffeinate Machine
# Description: Keep machine running for a very long time.
caffeinate_machine() { caffeinate_machine() {
local pid=$(pgrep -x caffeinate) if [[ -n "$(pgrep -x caffeinate)" ]]; then
if [[ -n "$pid" ]]; then
printf "Machine is already caffeinated!\n" printf "Machine is already caffeinated!\n"
else else
caffeinate -s -u -d -i -t 3153600000 > /dev/null & caffeinate -s -u -d -i -t 3153600000 > /dev/null &
@@ -15,35 +14,40 @@ caffeinate_machine() {
} }
export -f caffeinate_machine export -f caffeinate_machine
# Cleans work path for temporary processing of installs. # Label: Clean Work Path
# Description: Clean work path of artifacts.
clean_work_path() { clean_work_path() {
rm -rf "$MAC_OS_WORK_PATH" rm -rf "$MAC_OS_WORK_PATH"
} }
export -f clean_work_path export -f clean_work_path
# Answers the file or directory basename. # Label: Get Basename
# Parameters: $1 (required) - The file path. # Description: Answer file or directory basename.
# Parameters: $1 (required): Path.
get_basename() { get_basename() {
printf "${1##*/}" # Answers file or directory name. printf "%s" "${1##*/}"
} }
export -f get_basename export -f get_basename
# Answers the file extension. # Label: Get Extension
# Parameters: $1 (required) - The file name. # Description: Answer file extension without dot prefix.
# Parameters: $1 (required): Path.
get_extension() { get_extension() {
local name=$(get_basename "$1") local name=""
local extension="${1##*.}" # Excludes dot. local extension="${1##*.}"
name=$(get_basename "$1")
if [[ "$name" == "$extension" ]]; then if [[ "$name" == "$extension" ]]; then
printf '' printf ''
else else
printf "$extension" printf "%s" "$extension"
fi fi
} }
export -f get_extension export -f get_extension
# Answers Homebrew root path. # Label: Get Homebrew Root
# Parameters: None. # Description: Answer Homebrew root path.
get_homebrew_root() { get_homebrew_root() {
if [[ "$(/usr/bin/arch)" == "arm64" ]]; then if [[ "$(/usr/bin/arch)" == "arm64" ]]; then
printf "%s" "/opt/homebrew" printf "%s" "/opt/homebrew"
@@ -53,8 +57,8 @@ get_homebrew_root() {
} }
export -f get_homebrew_root export -f get_homebrew_root
# Answers Homebrew binary root path. # Label: Get Homebrew Bin Root
# Parameters: None. # Description: Answer Homebrew binary root path.
get_homebrew_bin_root() { get_homebrew_bin_root() {
if [[ "$(/usr/bin/arch)" == "arm64" ]]; then if [[ "$(/usr/bin/arch)" == "arm64" ]]; then
printf "%s" "/opt/homebrew/bin" printf "%s" "/opt/homebrew/bin"
@@ -64,31 +68,28 @@ get_homebrew_bin_root() {
} }
export -f get_homebrew_bin_root export -f get_homebrew_bin_root
# Answers the full install path (including file name) for file name. # Label: Get Install Path
# Parameters: $1 (required) - The file name. # Description: Answer full install path (including file name).
# Parameters: $1 (required): Path.
get_install_path() { get_install_path() {
local file_name="$1" local file_name="$1"
local install_path=$(get_install_root "$file_name") local install_path=""
printf "$install_path/$file_name"
install_path=$(get_install_root "$file_name")
printf "%s" "$install_path/$file_name"
} }
export -f get_install_path export -f get_install_path
# Answers the root install path for file name. # Label: Get Install Root
# Parameters: $1 (required) - The file name. # Description: Answer root install path.
# Parameters: $1 (required): Path.
get_install_root() { get_install_root() {
local file_name="$1" local file_name="$1"
local file_extension=$(get_extension "$file_name")
# Special cases not supported by Homebrew. case $(get_extension "$file_name") in
if [[ "$file_name" == "elm" ]]; then
printf "/usr/local/bin"
return
fi
# Dynamically build the install path based on file extension.
case $file_extension in
'') '')
printf "$(get_homebrew_bin_root)";; printf "/usr/local/bin";;
'app') 'app')
printf "/Applications";; printf "/Applications";;
'prefPane') 'prefPane')
@@ -101,19 +102,19 @@ get_install_root() {
} }
export -f get_install_root export -f get_install_root
# Checks Mac App Store (mas) CLI has been installed and exits if otherwise. # Label: Check Mac App Store Install
# Parameters: None. # Description: Check Mac App Store (mas) CLI has been installed.
check_mas_install() { check_mas_install() {
if ! command -v mas > /dev/null; then if ! command -v mas > /dev/null; then
printf "%s\n" "ERROR: Mac App Store (mas) CLI can't be found." printf "%s\n" "ERROR: Mac App Store (mas) CLI can't be found."
printf "%s\n" " Please ensure Homebrew and mas (i.e. brew install mas) have been installed." printf "%s\n" " Please ensure mas (i.e. brew install mas) is installed."
exit 1 exit 1
fi fi
} }
export -f check_mas_install export -f check_mas_install
# Configures shell for new machines and ensures PATH is properly configured for running scripts. # Label: Configure Environment
# Parameters: None. # Description: Configure shell and ensure PATH is properly configured.
configure_environment() { configure_environment() {
if [[ ! -s "$HOME/.bash_profile" ]]; then if [[ ! -s "$HOME/.bash_profile" ]]; then
printf "%s\n" "if [ -f ~/.bashrc ]; then . ~/.bashrc; fi" > "$HOME/.bash_profile" printf "%s\n" "if [ -f ~/.bashrc ]; then . ~/.bashrc; fi" > "$HOME/.bash_profile"

View File

@@ -2,57 +2,65 @@
# Defines verification/validation functions. # Defines verification/validation functions.
# Checks for missing App Store applications. # Label: Verify App Store Applications
# Description: Check for missing App Store applications.
verify_app_store_applications() { verify_app_store_applications() {
printf "\nChecking App Store applications...\n" local applications=""
local applications="$(mas list)" printf "\n%s\n" "Checking App Store applications..."
applications="$(mas list)"
while read line; do while read line; do
if [[ "$line" == "mas install"* ]]; then if [[ "$line" == "mas install"* ]]; then
local application=$(printf "$line" | awk '{print $3}') application=$(printf "$line" | awk '{print $3}')
verify_listed_application "$application" "${applications[*]}" verify_listed_application "$application" "${applications[*]}"
fi fi
done < "$MAC_OS_CONFIG_PATH/bin/install_app_store" done < "$MAC_OS_CONFIG_PATH/bin/install_app_store"
printf "App Store check complete.\n" printf "%s\n" "App Store check complete."
} }
export -f verify_app_store_applications export -f verify_app_store_applications
# Verifies application exists. # Label: Verify Application
# Parameters: $1 (required) - The file name. # Description: Verify application exists.
# Parameters: $1 (required): File name.
verify_application() { verify_application() {
local file_name="$1" local file_name="$1"
local install_path=$(get_install_path "$file_name")
if [[ ! -e "$install_path" ]]; then if [[ ! -e "$(get_install_path "$file_name")" ]]; then
printf " - Missing: $file_name\n" printf "%s\n" " - Missing: $file_name"
fi fi
} }
export -f verify_application export -f verify_application
# Checks for missing applications suffixed by "APP_NAME" as defined in settings.sh. # Label: Verify Applications
# Description: Check for missing applications suffixed by "APP_NAME" as defined in settings.
verify_applications() { verify_applications() {
printf "\nChecking application software...\n" local file_names=""
printf "\n%s\n" "Checking application software..."
# Only use environment keys that end with "APP_NAME". # Only use environment keys that end with "APP_NAME".
local file_names=$(set | awk -F "=" '{print $1}' | grep ".*APP_NAME") file_names=$(set | awk -F "=" '{print $1}' | grep ".*APP_NAME")
# For each application name, check to see if the application is installed. Otherwise, skip. # For each application name, check to see if the application is installed. Otherwise, skip.
for name in $file_names; do for name in $file_names; do
verify_application "${!name}" verify_application "${!name}"
done done
printf "Application software check complete.\n" printf "%s\n" "Application software check complete."
} }
export -f verify_applications export -f verify_applications
# Checks for missing extensions suffixed by "EXTENSION_PATH" as defined in settings.sh. # Label: Verify Extensions
# Description: Check for missing extensions suffixed by "EXTENSION_PATH" as defined in settings.
verify_extensions() { verify_extensions() {
printf "\nChecking application extensions...\n" local extensions=""
printf "\n%s\n" "Checking application extensions..."
# Only use environment keys that end with "EXTENSION_PATH". # Only use environment keys that end with "EXTENSION_PATH".
local extensions=$(set | awk -F "=" '{print $1}' | grep ".*EXTENSION_PATH") extensions=$(set | awk -F "=" '{print $1}' | grep ".*EXTENSION_PATH")
# For each extension, check to see if the extension is installed. Otherwise, skip. # For each extension, check to see if the extension is installed. Otherwise, skip.
for extension in $extensions; do for extension in $extensions; do
@@ -60,36 +68,42 @@ verify_extensions() {
verify_path "${!extension}" verify_path "${!extension}"
done done
printf "Application extension check complete.\n" printf "%s\n" "Application extension check complete."
} }
export -f verify_extensions export -f verify_extensions
# Checks for missing Homebrew casks. # Label: Verify Homebrew Casks
# Description: Check for missing Homebrew casks.
verify_homebrew_casks() { verify_homebrew_casks() {
local applications=""
printf "\nChecking Homebrew casks...\n" printf "\nChecking Homebrew casks...\n"
local applications="$(brew list --casks)" applications="$(brew list --casks)"
while read line; do while read line; do
if [[ "$line" == "brew cask install"* ]]; then if [[ "$line" == "brew cask install"* ]]; then
local application=$(printf "$line" | awk '{print $4}') application=$(printf "%s" "$line" | awk '{print $4}')
verify_listed_application "$application" "${applications[*]}" verify_listed_application "$application" "${applications[*]}"
fi fi
done < "$MAC_OS_CONFIG_PATH/bin/install_homebrew_casks" done < "$MAC_OS_CONFIG_PATH/bin/install_homebrew_casks"
printf "Homebrew cask check complete.\n" printf "%s\n" "Homebrew cask check complete."
} }
export -f verify_homebrew_casks export -f verify_homebrew_casks
# Checks for missing Homebrew formulas. # Label: Verify Homebrew Formulas
# Description: Check for missing Homebrew formulas.
verify_homebrew_formulas() { verify_homebrew_formulas() {
local applications=""
printf "Checking Homebrew formulas...\n" printf "Checking Homebrew formulas...\n"
local applications="$(brew list --formulae)" applications="$(brew list --formulae)"
while read line; do while read line; do
if [[ "$line" == "brew install"* ]]; then if [[ "$line" == "brew install"* ]]; then
local application=$(printf "$line" | awk '{print $3}') application=$(printf "%s" "$line" | awk '{print $3}')
# Exception: "gpg" is the binary but is listed as "gnugp". # Exception: "gpg" is the binary but is listed as "gnugp".
if [[ "$application" == "gpg" ]]; then if [[ "$application" == "gpg" ]]; then
@@ -100,80 +114,89 @@ verify_homebrew_formulas() {
fi fi
done < "$MAC_OS_CONFIG_PATH/bin/install_homebrew_formulas" done < "$MAC_OS_CONFIG_PATH/bin/install_homebrew_formulas"
printf "Homebrew formula check complete.\n" printf "%s\n" "Homebrew formula check complete."
} }
export -f verify_homebrew_formulas export -f verify_homebrew_formulas
# Verifies listed application exists. # Label: Verify Listed Application
# Parameters: $1 (required) - The current application, $2 (required) - The application list. # Description: Verify listed application exists.
# Parameters: $1 (required): Current application, $2 (required): Application list.
verify_listed_application() { verify_listed_application() {
local application="$1" local application="$1"
local applications="$2" local applications="$2"
if [[ "${applications[*]}" != *"$application"* ]]; then if [[ "${applications[*]}" != *"$application"* ]]; then
printf " - Missing: $application\n" printf "%s\n" " - Missing: $application"
fi fi
} }
export -f verify_listed_application export -f verify_listed_application
# Verifies path exists. # Label: Verify Path
# Parameters: $1 (required) - The path. # Description: Verify path exists.
# Parameters: $1 (required): Path.
verify_path() { verify_path() {
local path="$1" local path="$1"
if [[ ! -e "$path" ]]; then if [[ ! -e "$path" ]]; then
printf " - Missing: $path\n" printf "%s\n" " - Missing: $path"
fi fi
} }
export -f verify_path export -f verify_path
# Checks for missing Node packages. # Label: Verify Node Packages
# Description: Check for missing Node packages.
verify_node_packages() { verify_node_packages() {
printf "\nChecking Node packages...\n" printf "\n%s\n" "Checking Node packages..."
while read line; do while read line; do
if [[ "$line" == "npm "* ]]; then if [[ "$line" == "npm "* ]]; then
local package=$(printf "$line" | awk '{print $4}') package=$(printf "$line" | awk '{print $4}')
local packages=($(npm list --global --depth=0 | grep "$package")) packages=($(npm list --global --depth=0 | grep "$package"))
verify_listed_application "$package" "${packages[*]}" verify_listed_application "$package" "${packages[*]}"
fi fi
done < "$MAC_OS_CONFIG_PATH/bin/install_node_packages" done < "$MAC_OS_CONFIG_PATH/bin/install_node_packages"
printf "Node packages check complete.\n" printf "%s\n" "Node packages check complete."
} }
export -f verify_node_packages export -f verify_node_packages
# Checks for missing Ruby gems. # Label: Verify Ruby Gems
# Description: Check for missing Ruby gems.
verify_ruby_gems() { verify_ruby_gems() {
local gems="$(gem list --no-versions)" local gems=""
printf "\nChecking Ruby gems...\n" printf "\n%s\n" "Checking Ruby gems..."
gems="$(gem list --no-versions)"
while read line; do while read line; do
if [[ "$line" == "gem install"* ]]; then if [[ "$line" == "gem install"* ]]; then
local gem=$(printf "$line" | awk '{print $3}') gem=$(printf "%s" "$line" | awk '{print $3}')
verify_listed_application "$gem" "${gems[*]}" verify_listed_application "$gem" "${gems[*]}"
fi fi
done < "$MAC_OS_CONFIG_PATH/bin/install_ruby_gems" done < "$MAC_OS_CONFIG_PATH/bin/install_ruby_gems"
printf "Ruby gems check complete.\n" printf "%s\n" "Ruby gems check complete."
} }
export -f verify_ruby_gems export -f verify_ruby_gems
# Checks for missing Rust crates. # Label: Verify Rust Crates
# Description: Check for missing Rust crates.
verify_rust_crates() { verify_rust_crates() {
printf "\nChecking Rust crates...\n" local crates=""
local crates="$(ls -A1 $HOME/.cargo/bin)" printf "\n%s\n" "Checking Rust crates..."
crates="$(ls -A1 $HOME/.cargo/bin)"
while read line; do while read line; do
if [[ "$line" == "cargo install"* ]]; then if [[ "$line" == "cargo install"* ]]; then
local crate=$(printf "$line" | awk '{print $3}') crate=$(printf "%s" "$line" | awk '{print $3}')
verify_listed_application "$crate" "${crates[*]}" verify_listed_application "$crate" "${crates[*]}"
fi fi
done < "$MAC_OS_CONFIG_PATH/bin/install_rust_crates" done < "$MAC_OS_CONFIG_PATH/bin/install_rust_crates"
printf "Rust crates check complete.\n" printf "%s\n" "Rust crates check complete."
} }
export -f verify_rust_crates export -f verify_rust_crates