Compare commits

...

66 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
Brooke Kuhlmann
24bf3a7e62 Added version release notes 2022-12-25 19:37:00 -07:00
Brooke Kuhlmann
4159fbce71 Updated run script to distinquish between applications and libraries
Necessary to improve the install reliability of software and
associated libraries (extensions). There is now a split between core
installation of applications and associated libraries. This is a loose
split since everything in the *Install* category is mostly
applications but also contains related setup while the *Libraries*
category requires a machine reboot so the fully configured environment
is loaded to ensure all libraries install properly.

The specifics of these changes will be handled in the corresponding
macOS Configuration project.
2022-12-25 08:42:43 -07:00
Brooke Kuhlmann
1ef42c9040 Updated installs for basic, default, and shell scripts
Improves name consistency by using the same `install_` prefix for all
install scripts.

The dotfiles script was renamed as a shell script since this is now a
dedicated shell configuration script so people can configure their
default shell as they like. Use of this new shell script will be
configured in a future commit.
2022-12-25 08:42:43 -07:00
Brooke Kuhlmann
a6e170cead Removed system update from Ruby install
Necessary to reduce duplicated effort found in the macOS Configuration
project plus this allows people to customize their Ruby gem install
further in case they don't want this stipulation.
2022-12-25 08:42:42 -07:00
Brooke Kuhlmann
691d87d0f1 Removed mention of Intel CPUs from boot disk instructions
Only Silicon machines are supported now.
2022-12-25 08:42:42 -07:00
Brooke Kuhlmann
5e5ad4100e Removed configure software script
No longer necessary as this was originally meant to be a catch all for
any final software setup which has proven to not be all that useful.
2022-12-25 08:42:42 -07:00
Brooke Kuhlmann
93151ac7d2 Removed uninstallers and reinstallers
These are seldom used and native support via Homebrew, for example, is
better than what these scripts can do. This also reduces additional
maintenance burden on this project.
2022-12-25 08:42:42 -07:00
Brooke Kuhlmann
966b1596be Fixed Node installer to detect Node and version
Ensures the latest version of Node is installed as managed by Fast
Node Manager (FNM). Behavior is similar to using Frum to manage Ruby
versions except FNM has the additional feature of computing latest
version instead.
2022-12-25 08:42:42 -07:00
Brooke Kuhlmann
5991bd6da6 Refactored download file function to use multi-line curl command
Improves readability so the command isn't word wrapped.
2022-12-25 08:42:42 -07:00
Brooke Kuhlmann
b3f799acfc Fixed Ruby installer to pass configuration options
Necessary to ensure Ruby installs with the correct version of OpenSSL
with a few other options that helps with the successful install of
Ruby.
2022-12-25 08:42:42 -07:00
Brooke Kuhlmann
ea4027714a Updated to Ruby 3.2.0
Necessary to pick up latest version with new features, bug fixes, new
Data primitive, Web Assembly support, and much more.

https: //www.ruby-lang.org/en/news/2022/12/06/ruby-3-2-0-rc1-released
2022-12-25 08:42:42 -07:00
Brooke Kuhlmann
4f599099a1 Updated to Ruby 3.1.3
Necessary to address the following security issue:

    CVE-2021-33621: HTTP response splitting in CGI

This also fixes a build failure with Xcode 14 and macOS 13 (Ventura).
2022-11-24 08:07:44 -07:00
Brooke Kuhlmann
c161493c32 Updated to macOS Ventura
Necessary to be compatible with the latest version of the macOS
operating system.
2022-10-24 18:43:09 -06:00
Brooke Kuhlmann
387241227a Updated to Caliber 0.16.0
Necessary to pick up latest RuboCop changes.
2022-10-22 08:11:36 -06:00
Brooke Kuhlmann
ecf85b4526 Updated README sections
Necessary to clean up wording and be more consistent with other
projects.
2022-09-16 11:32:51 -06:00
Brooke Kuhlmann
06f6302b9a Updated to Caliber 0.11.0
[Details](https://www.alchemists.io/projects/caliber).
2022-07-14 19:46:13 -06:00
Brooke Kuhlmann
7a9bb00877 Added version release notes 2022-05-07 10:19:46 -06:00
Brooke Kuhlmann
2a01bac2b0 Updated to Caliber 0.8.0
Necessary to pick up latest RuboCop changes.
2022-05-07 09:01:36 -06:00
Brooke Kuhlmann
b2b4d49c52 Updated to Caliber 0.7.0
Necessary to pick up RuboCop 1.28.0 changes.
2022-04-21 16:43:02 -06:00
Brooke Kuhlmann
0945809dc4 Updated to Caliber 0.6.0
Necessary to pick up latest RuboCop RSpec enhancements and fixes.
2022-04-19 09:24:54 -06:00
Brooke Kuhlmann
b270852fb5 Added version release notes 2022-04-17 11:32:19 -06:00
Brooke Kuhlmann
4dc5f3d363 Updated to Ruby 3.1.2
[Details](https://www.ruby-lang.org).
2022-04-12 16:20:55 -06:00
Brooke Kuhlmann
6169e0566e Added GitHub sponsorship configuration
Necessary to promote the sponsorship of this project in hopes that
others might want to support and promote my work too. 🎉
2022-04-11 20:03:04 -06:00
Brooke Kuhlmann
1686b0c98f Updated to Git Lint 4.0.0
Necessary to pick up auto-inject implementation changes.
2022-04-10 07:58:31 -06:00
Brooke Kuhlmann
3aa3ea59e7 Updated to Caliber 0.5.0
Necessary to pick up RuboCop 1.27.0 changes -- which, unfortunately,
introduces a warning bug -- and reduce duplicate configurations which
are enabled by RuboCop now.
2022-04-09 11:04:55 -06:00
Brooke Kuhlmann
ae40574cd7 Updated to Caliber 0.4.0
[Details](https://www.alchemists.io/projects/caliber/versions).
2022-04-07 20:21:36 -06:00
37 changed files with 521 additions and 448 deletions

View File

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

1
.github/FUNDING.yml vendored Normal file
View File

@@ -0,0 +1 @@
github: [bkuhlmann]

View File

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

View File

@@ -1 +1 @@
3.1.1
3.3.1

View File

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

View File

@@ -1,9 +1,10 @@
# frozen_string_literal: true
ruby File.read(".ruby-version").strip
ruby file: ".ruby-version"
source "https://rubygems.org"
gem "caliber", "~> 0.2"
gem "git-lint", "~> 3.2"
gem "rake", "~> 13.0"
gem "caliber", "~> 0.51"
gem "debug", "~> 1.9"
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
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
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 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
forked for as many custom machine setups as needed.
@@ -38,14 +38,9 @@ toc::[]
* Configures installed software.
* 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
. link:https://www.apple.com/macos/monterey[macOS Monterey]
. link:https://www.apple.com/macos/sonoma[macOS Sonoma]
. link:https://developer.apple.com/xcode[Xcode]
== Setup
@@ -56,7 +51,7 @@ To install, run:
----
git clone https://github.com/bkuhlmann/mac_os.git
cd mac_os
git checkout 15.0.3
git checkout 18.2.0
----
== Usage
@@ -172,13 +167,13 @@ All executable scripts can be found in the `bin` folder:
* `bin/run` (required): The main script and interface for macOS setup.
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
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.
== Troubleshooting
=== Troubleshooting
* *Pi-hole*: 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
@@ -216,18 +211,18 @@ git clone https://github.com/bkuhlmann/mac_os.git
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
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,8 +1,12 @@
# frozen_string_literal: true
require "git/lint/rake/setup"
require "git/lint/rake/register"
require "rubocop/rake_task"
Git::Lint::Rake::Register.call
RuboCop::RakeTask.new
task default: %i[git_lint rubocop]
desc "Run code quality checks"
task quality: %i[git_lint rubocop]
task default: :quality

View File

@@ -1,5 +1,94 @@
= 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)
* Fixed Node installer to detect Node and version - Brooke Kuhlmann
* Fixed Ruby installer to pass configuration options - Brooke Kuhlmann
* Updated README sections - Brooke Kuhlmann
* Updated installs for basic, default, and shell scripts - Brooke Kuhlmann
* Updated run script to distinquish between applications and libraries - Brooke Kuhlmann
* Updated to Caliber 0.11.0 - Brooke Kuhlmann
* Updated to Caliber 0.16.0 - Brooke Kuhlmann
* Updated to Ruby 3.1.3 - Brooke Kuhlmann
* Updated to Ruby 3.2.0 - Brooke Kuhlmann
* Updated to macOS Ventura - Brooke Kuhlmann
* Removed configure software script - Brooke Kuhlmann
* Removed mention of Intel CPUs from boot disk instructions - Brooke Kuhlmann
* Removed system update from Ruby install - Brooke Kuhlmann
* Removed uninstallers and reinstallers - Brooke Kuhlmann
* Refactored download file function to use multi-line curl command - Brooke Kuhlmann
== 15.0.5 (2022-05-07)
* Updated to Caliber 0.6.0 - Brooke Kuhlmann
* Updated to Caliber 0.7.0 - Brooke Kuhlmann
* Updated to Caliber 0.8.0 - Brooke Kuhlmann
== 15.0.4 (2022-04-17)
* Added GitHub sponsorship configuration - Brooke Kuhlmann
* Updated to Caliber 0.4.0 - Brooke Kuhlmann
* Updated to Caliber 0.5.0 - Brooke Kuhlmann
* Updated to Git Lint 4.0.0 - Brooke Kuhlmann
* Updated to Ruby 3.1.2 - Brooke Kuhlmann
== 15.0.3 (2022-03-16)
* Fixed Homebrew install to initially default to ZSH - Brooke Kuhlmann

View File

@@ -1,16 +0,0 @@
#! /usr/bin/env bash
# Applies basic system settings.
set -o nounset
set -o errexit
set -o pipefail
IFS=$'\n\t'
SCRIPT_PATH="$MAC_OS_CONFIG_PATH/bin/apply_basic_settings"
if [[ -x "$SCRIPT_PATH" ]]; then
"$SCRIPT_PATH"
else
printf "WARNING: Basic settings script does not exist or is not executable.\n"
fi

View File

@@ -1,16 +0,0 @@
#! /usr/bin/env bash
# Applies default settings.
set -o nounset
set -o errexit
set -o pipefail
IFS=$'\n\t'
SCRIPT_PATH="$MAC_OS_CONFIG_PATH/bin/apply_default_settings"
if [[ -x "$SCRIPT_PATH" ]]; then
"$SCRIPT_PATH"
else
printf "WARNING: Default settings script does not exist or is not executable.\n"
fi

View File

@@ -1,16 +0,0 @@
#! /usr/bin/env bash
# Configures installed software.
set -o nounset
set -o errexit
set -o pipefail
IFS=$'\n\t'
SCRIPT_PATH="$MAC_OS_CONFIG_PATH/bin/configure_software"
if [[ -x "$SCRIPT_PATH" ]]; then
"$SCRIPT_PATH"
else
printf "WARNING: Configure software script does not exist or is not executable.\n"
fi

View File

@@ -2,33 +2,33 @@
# Creates macOS boot disk.
printf "macOS Boot Disk Tips\n"
printf " - Use a USB drive (8GB or higher).\n"
printf " - Use Disk Utility to format the USB drive as \"Mac OS Extended (Journaled)\".\n"
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 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 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 "%s\n" "macOS Boot Disk Tips"
printf "%s\n" " - Use a USB drive (8GB or higher)."
printf "%s\n" " - Use Disk Utility to format the USB drive as \"APSF\"."
printf "%s\n" " - Use Disk Utility to label the USB drive as \"Untitled\"."
printf "\n%s\n" "macOS Boot Disk Usage:"
printf "%s\n" " 1. Insert the USB boot disk into the machine to be upgraded."
printf "%s\n" " 2. Reboot the machine."
printf "%s\n" " 3. Press and hold the POWER key before the Apple logssssso appears."
printf "%s\n" " 4. Select the USB boot disk from the menu."
printf "%s\n" " 5. Use Disk Utility to delete and/or erase the hard drive including associated partitions."
printf "%s\n" " 6. Use Disk Utility to create a single \"APFS\" drive."
printf "%s\n" " 7. Install the new operating system."
printf "\n%s\n" "macOS Boot Disk Recovery:"
printf "%s\n" " 1. Start/restart the machine."
printf "%s\n" " 2. Press and hold the POWER key before the Apple logo appears."
printf "%s\n" " 3. Wait for the macOS installer to load from the recovery partition."
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
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
fi
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
fi

View File

@@ -13,5 +13,5 @@ if [[ -x "$SCRIPT_PATH" ]]; then
check_mas_install
"$SCRIPT_PATH"
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

View File

@@ -12,5 +12,5 @@ SCRIPT_PATH="$MAC_OS_CONFIG_PATH/bin/install_applications"
if [[ -x "$SCRIPT_PATH" ]]; then
"$SCRIPT_PATH"
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

16
bin/install_basics Executable file
View File

@@ -0,0 +1,16 @@
#! /usr/bin/env bash
# Installs basic system settings.
set -o nounset
set -o errexit
set -o pipefail
IFS=$'\n\t'
SCRIPT_PATH="$MAC_OS_CONFIG_PATH/bin/install_basics"
if [[ -x "$SCRIPT_PATH" ]]; then
"$SCRIPT_PATH"
else
printf "%s\n" "WARNING: Basic settings script does not exist or is not executable."
fi

16
bin/install_defaults Executable file
View File

@@ -0,0 +1,16 @@
#! /usr/bin/env bash
# Installs system and application default settings.
set -o nounset
set -o errexit
set -o pipefail
IFS=$'\n\t'
SCRIPT_PATH="$MAC_OS_CONFIG_PATH/bin/install_defaults"
if [[ -x "$SCRIPT_PATH" ]]; then
"$SCRIPT_PATH"
else
printf "%s\n" "WARNING: Default settings script does not exist or is not executable."
fi

View File

@@ -1,14 +1,14 @@
#! /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
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
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
fi

View File

@@ -1,16 +0,0 @@
#! /usr/bin/env bash
# Installs dotfiles.
set -o nounset
set -o errexit
set -o pipefail
IFS=$'\n\t'
SCRIPT_PATH="$MAC_OS_CONFIG_PATH/bin/install_dotfiles"
if [[ -x "$SCRIPT_PATH" ]]; then
"$SCRIPT_PATH"
else
printf "WARNING: Dotfiles install script does not exist or is not executable.\n"
fi

View File

@@ -12,5 +12,5 @@ SCRIPT_PATH="$MAC_OS_CONFIG_PATH/bin/install_extensions"
if [[ -x "$SCRIPT_PATH" ]]; then
"$SCRIPT_PATH"
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

View File

@@ -13,5 +13,5 @@ if [[ -x "$SCRIPT_PATH" ]]; then
install_homebrew
"$SCRIPT_PATH"
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

View File

@@ -13,5 +13,5 @@ if [[ -x "$SCRIPT_PATH" ]]; then
install_homebrew
"$SCRIPT_PATH"
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

View File

@@ -13,5 +13,5 @@ if [[ -x "$SCRIPT_PATH" ]]; then
install_node
"$SCRIPT_PATH"
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

View File

@@ -13,5 +13,5 @@ if [[ -x "$SCRIPT_PATH" ]]; then
install_ruby
"$SCRIPT_PATH"
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

View File

@@ -13,5 +13,5 @@ if [[ -x "$SCRIPT_PATH" ]]; then
install_rust
"$SCRIPT_PATH"
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

16
bin/install_shell Executable file
View File

@@ -0,0 +1,16 @@
#! /usr/bin/env bash
# Installs shell.
set -o nounset
set -o errexit
set -o pipefail
IFS=$'\n\t'
SCRIPT_PATH="$MAC_OS_CONFIG_PATH/bin/install_shell"
if [[ -x "$SCRIPT_PATH" ]]; then
"$SCRIPT_PATH"
else
printf "%s\n" "WARNING: Shell script does not exist or is not executable."
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
"$SCRIPT_PATH"
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

76
bin/run
View File

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

View File

@@ -2,8 +2,9 @@
# Defines software installer functions.
# Downloads remote file to local disk.
# Parameters: $1 (required) - URL, $2 (required) - File name, $3 (optional) - HTTP header.
# Label: Download File
# Description: Download 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"
@@ -11,43 +12,60 @@ download_file() {
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"
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.
# Label: Install Application
# Description: Install an application.
# Parameters: $1 (required): Install path, $2 (required): Name.
install_app() {
local install_root=$(get_install_root "$2")
local file_extension=$(get_extension "$2")
local install_path="$1"
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
'')
cp -a "$1/$2" "$install_root";;
cp -a "$install_path/$name" "$install_root";;
'app')
cp -a "$1/$2" "$install_root";;
cp -a "$install_path/$name" "$install_root";;
'prefPane')
sudo cp -pR "$1/$2" "$install_root";;
sudo cp -pR "$install_path/$name" "$install_root";;
'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
}
export -f install_app
# Installs an application via a DMG file.
# Parameters: $1 (required) - URL, $2 (required) - Mount path, $3 (required) - Application name.
# Label: Install DMG Application
# Description: Install DMG application.
# Parameters: $1 (required): URL, $2 (required): Mount path, $3 (required): Application name.
install_dmg_app() {
local url="$1"
local mount_point="/Volumes/$2"
local app_name="$3"
local install_path=$(get_install_path "$app_name")
local install_path=""
local work_file="download.dmg"
install_path=$(get_install_path "$app_name")
if [[ ! -e "$install_path" ]]; then
download_file "$url" "$work_file"
mount_image "$MAC_OS_WORK_PATH/$work_file"
@@ -58,66 +76,76 @@ install_dmg_app() {
}
export -f install_dmg_app
# Installs a package via a DMG file.
# Parameters: $1 (required) - URL, $2 (required) - Mount path, $3 (required) - Application name.
# Label: Install DMG Package
# Description: Install DMG application via a package file.
# Parameters: $1 (required): URL, $2 (required): Mount path, $3 (required): Application name.
install_dmg_pkg() {
local url="$1"
local mount_point="/Volumes/$2"
local app_name="$3"
local install_path=$(get_install_path "$app_name")
local install_path=""
local work_file="download.dmg"
install_path=$(get_install_path "$app_name")
if [[ ! -e "$install_path" ]]; then
download_file "$url" "$work_file"
mount_image "$MAC_OS_WORK_PATH/$work_file"
install_pkg "$mount_point" "$app_name"
unmount_image "$mount_point"
printf "Installed: $app_name.\n"
printf "%s\n" "Installed: $app_name."
verify_application "$app_name"
fi
}
export -f install_dmg_pkg
# Installs a single file.
# Parameters: $1 (required) - URL, $2 (required) - Install path.
# Label: Install File
# Description: Install a single file.
# Parameters: $1 (required): URL, $2 (required): Install path.
install_file() {
local file_url="$1"
local file_name=$(get_basename "$1")
local file_name=""
local install_path="$2"
file_name=$(get_basename "$1")
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"
printf "%s\n" "Installed: $file_name."
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.
# Label: Install Git Application
# Description: Install application from a Git repository.
# Parameters: $1 (required): URL, $2 (required): Install path, $3 (optional): Git clone options.
install_git_app() {
local repository_url="$1"
local app_name=$(get_basename "$2")
local url="$1"
local install_path="$2"
local app_name=""
local options="--quiet"
app_name="$(get_basename "$2")"
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"
printf "%s\n" "Installing: $install_path..."
git clone $options "$url" "$install_path"
printf "%s\n" "Installed: $app_name."
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).
# Label: Install Git Project
# 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() {
local repo_url="$1"
local repo_version="$2"
@@ -134,86 +162,102 @@ install_git_project() {
}
export -f install_git_project
# Installs Homebrew.
# Parameters: None.
# Label: Install Homebrew
# Description: Install and setup Homebrew.
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)"
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)"
fi
}
export -f install_homebrew
# Installs a package via a zip file.
# Parameters: $1 (required) - URL, $2 (required) - Application name.
# Label: Install Bare Package
# Description: Install a bare package.
# Parameters: $1 (required): URL, $2 (required): Application name.
install_bare_pkg() {
local url="$1"
local app_name="$2"
local install_path=$(get_install_path "$app_name")
local install_path=""
local work_file="$app_name.pkg"
install_path=$(get_install_path "$app_name")
if [[ ! -e "$install_path" ]]; then
download_file "$url" "$work_file"
install_pkg "$MAC_OS_WORK_PATH" "$app_name"
printf "Installed: $app_name.\n"
printf "%s\n" "Installed: $app_name."
verify_application "$app_name"
fi
}
export -f install_bare_pkg
# Installs a package.
# Parameters: $1 (required) - Package source path, $2 (required) - Application name.
# Label: Install Package
# Description: Install local package.
# Parameters: $1 (required): Package source path, $2 (required): Application name.
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"
local package=$(sudo find "$1" -maxdepth 1 -type f -name "*.pkg" -o -name "*.mpkg")
install_root=$(get_install_root "$name")
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 /
}
export -f install_pkg
# Installs program (single file).
# Parameters: $1 (required) - URL, $2 (required) - Program name.
# Label: Install Program
# Description: Installs program without any packaging.
# Parameters: $1 (required): URL, $2 (required): Name.
install_program() {
local url="$1"
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
download_file "$url" "$program_name"
mv "$MAC_OS_WORK_PATH/$program_name" "$install_path"
chmod 755 "$install_path"
printf "Installed: $program_name.\n"
printf "%s\n" "Installed: $program_name."
verify_application "$program_name"
fi
}
export -f install_program
# Installs Node.
# Parameters: None.
# Label: Install Node
# Description: Install and setup Node for local development.
install_node() {
if ! command -v fnm > /dev/null; then
$(get_homebrew_bin_root)/fnm install --lts
if [[ ! -x "$(command -v node)" ]]; then
"$(get_homebrew_bin_root)/fnm" install --latest
fi
}
export -f install_node
# Installs Ruby.
# Parameters: None.
# Label: Install Ruby
# Description: Install and setup Ruby for local development.
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
$(get_homebrew_bin_root)/frum install "$version"
$(get_homebrew_bin_root)/frum local "$version"
gem update --system && gem update
"$(get_homebrew_bin_root)"/frum install "$version" \
--with-openssl-dir="$(brew --prefix openssl)" \
--enable-shared \
--disable-silent-rules
"$(get_homebrew_bin_root)"/frum local "$version"
fi
}
export -f install_ruby
# Installs Rust.
# Parameters: None.
# Label: Install Rust
# Description: Install and setup Rust for local development.
install_rust() {
if ! command -v cargo > /dev/null; then
curl --proto "=https" --tlsv1.2 --fail --silent --show-error https://sh.rustup.rs | sh
@@ -221,15 +265,18 @@ install_rust() {
}
export -f install_rust
# Installs an application via a tar file.
# Parameters: $1 (required) - URL, $2 (required) - Application name, $3 (required) - Decompress options.
# Label: Install Tar Application
# Description: Install application from tar file.
# Parameters: $1 (required): URL, $2 (required): 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 install_path=""
local work_file="download.tar"
install_path=$(get_install_path "$app_name")
if [[ ! -e "$install_path" ]]; then
download_file "$url" "$work_file"
@@ -240,20 +287,23 @@ install_tar_app() {
)
install_app "$MAC_OS_WORK_PATH" "$app_name"
printf "Installed: $app_name.\n"
printf "%s\n" "Installed: $app_name."
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.
# Label: Install Zip Application
# Description: Install application from zip file.
# Parameters: $1 (required): URL, $2 (required): Name.
install_zip_app() {
local url="$1"
local app_name="$2"
local install_path=$(get_install_path "$app_name")
local install_path=""
local work_file="download.zip"
install_path=$(get_install_path "$app_name")
if [[ ! -e "$install_path" ]]; then
download_file "$url" "$work_file"
@@ -265,20 +315,23 @@ install_zip_app() {
)
install_app "$MAC_OS_WORK_PATH" "$app_name"
printf "Installed: $app_name.\n"
printf "%s\n" "Installed: $app_name."
verify_application "$app_name"
fi
}
export -f install_zip_app
# Installs a package via a zip file.
# Parameters: $1 (required) - URL, $2 (required) - Application name.
# Label: Install Zip Package
# Description: Install application from a package within a zip file.
# Parameters: $1 (required): URL, $2 (required): Application name.
install_zip_pkg() {
local url="$1"
local app_name="$2"
local install_path=$(get_install_path "$app_name")
local install_path=""
local work_file="download.zip"
install_path=$(get_install_path "$app_name")
if [[ ! -e "$install_path" ]]; then
download_file "$url" "$work_file"
@@ -289,24 +342,26 @@ install_zip_pkg() {
)
install_pkg "$MAC_OS_WORK_PATH" "$app_name"
printf "Installed: $app_name.\n"
printf "%s\n" "Installed: $app_name."
verify_application "$app_name"
fi
}
export -f install_zip_pkg
# Mounts a disk image.
# Parameters: $1 (required) - Image path.
# Label: Mount Image
# Description: Mount disk image.
# Parameters: $1 (required): Path.
mount_image() {
printf "Mounting image...\n"
printf "%s\n" "Mounting image..."
hdiutil attach -quiet -nobrowse -noautoopen "$1"
}
export -f mount_image
# Unmounts a disk image.
# Parameters: $1 (required) - Mount path.
# Label: Unmount Image
# Description: Unmount disk image.
# Parameters: $1 (required): Path.
unmount_image() {
printf "Unmounting image...\n"
printf "%s\n" "Unmounting image..."
hdiutil detach -force "$1"
}
export -f unmount_image

View File

@@ -2,14 +2,16 @@
# 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() {
case $1 in
'B')
bin/create_boot_disk;;
'b')
bin/apply_basic_settings;;
bin/install_basics;;
't')
bin/install_dev_tools;;
'hf')
@@ -22,38 +24,36 @@ process_option() {
bin/install_applications;;
'x')
bin/install_extensions;;
'df')
bin/install_dotfiles;;
'np')
bin/install_node_packages;;
'rg')
bin/install_ruby_gems;;
'rc')
bin/install_rust_crates;;
'd')
bin/apply_default_settings;;
'cs')
bin/configure_software;;
bin/install_defaults;;
's')
bin/install_shell;;
'r')
bin/restore_backup;;
'i')
caffeinate_machine
bin/apply_basic_settings
bin/install_basics
bin/install_dev_tools
bin/install_homebrew_formulas
bin/install_homebrew_casks
bin/install_app_store
bin/install_applications
bin/install_extensions
bin/install_dotfiles
bin/install_defaults
bin/install_shell
bin/restore_backup
clean_work_path;;
'np')
bin/install_node_packages;;
'rg')
bin/install_ruby_gems;;
'rc')
bin/install_rust_crates;;
'l')
bin/install_node_packages
bin/install_ruby_gems
bin/install_rust_crates
bin/apply_default_settings
bin/configure_software
clean_work_path;;
'R')
caffeinate_machine
bin/restore_backup;;
'c')
bin/install_rust_crates;;
'c')
verify_homebrew_formulas
verify_homebrew_casks
verify_app_store_applications
@@ -64,14 +64,6 @@ process_option() {
verify_rust_crates;;
'C')
caffeinate_machine;;
'ua')
uninstall_application;;
'ux')
uninstall_extension;;
'ra')
reinstall_application;;
'rx')
reinstall_extension;;
'w')
clean_work_path;;
'q');;

View File

@@ -1,17 +0,0 @@
#! /usr/bin/env bash
# Defines reinstall functions.
# Reinstall application.
reinstall_application() {
uninstall_application
bin/install_applications
}
export -f reinstall_application
# Reinstall extension.
reinstall_extension() {
uninstall_extension
bin/install_extensions
}
export -f reinstall_extension

View File

@@ -5,7 +5,7 @@ set -o errexit
set -o pipefail
IFS=$'\n\t'
export MAC_OS_BOOT_DISK_CREATOR="/Applications/Install macOS Monterey.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_WORK_PATH=/tmp/downloads
export MAC_OS_CONFIG_PATH="../mac_os-config"

View File

@@ -1,52 +0,0 @@
#! /usr/bin/env bash
# Defines uninstall functions.
# Uninstalls selected application.
uninstall_application() {
# Only use environment keys that end with "APP_NAME".
local keys=($(set | awk -F "=" '{print $1}' | grep ".*APP_NAME"))
printf "Select application to uninstall:\n"
for ((index = 0; index < ${#keys[*]}; index++)); do
local app_file="${!keys[$index]}"
printf " $index: ${app_file}\n"
done
printf " q: Quit/Exit\n\n"
read -p "Enter selection: " response
printf "\n"
local regex="^[0-9]+$"
if [[ $response =~ $regex ]]; then
local app_file="${!keys[$response]}"
local app_path=$(get_install_path "${app_file}")
sudo rm -rf "$app_path"
printf "Uninstalled: ${app_path}\n"
fi
}
export -f uninstall_application
# Uninstalls selected extension.
uninstall_extension() {
# Only use environment keys that end with "EXTENSION_PATH".
local keys=($(set | awk -F "=" '{print $1}' | grep ".*EXTENSION_PATH"))
printf "Select extension to uninstall:\n"
for ((index = 0; index < ${#keys[*]}; index++)); do
local extension_path="${!keys[$index]}"
printf " $index: ${extension_path}\n"
done
printf " q: Quit/Exit\n\n"
read -p "Enter selection: " response
printf "\n"
local regex="^[0-9]+$"
if [[ $response =~ $regex ]]; then
local extension_path="${!keys[$response]}"
rm -rf "${extension_path}"
printf "Uninstalled: ${extension_path}\n"
fi
}
export -f uninstall_extension

View File

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

View File

@@ -2,57 +2,65 @@
# 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() {
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
if [[ "$line" == "mas install"* ]]; then
local application=$(printf "$line" | awk '{print $3}')
application=$(printf "$line" | awk '{print $3}')
verify_listed_application "$application" "${applications[*]}"
fi
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
# Verifies application exists.
# Parameters: $1 (required) - The file name.
# Label: Verify Application
# Description: Verify application exists.
# Parameters: $1 (required): 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"
if [[ ! -e "$(get_install_path "$file_name")" ]]; then
printf "%s\n" " - Missing: $file_name"
fi
}
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() {
printf "\nChecking application software...\n"
local file_names=""
printf "\n%s\n" "Checking application software..."
# 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 name in $file_names; do
verify_application "${!name}"
done
printf "Application software check complete.\n"
printf "%s\n" "Application software check complete."
}
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() {
printf "\nChecking application extensions...\n"
local extensions=""
printf "\n%s\n" "Checking application extensions..."
# 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 extension in $extensions; do
@@ -60,36 +68,42 @@ verify_extensions() {
verify_path "${!extension}"
done
printf "Application extension check complete.\n"
printf "%s\n" "Application extension check complete."
}
export -f verify_extensions
# Checks for missing Homebrew casks.
# Label: Verify Homebrew Casks
# Description: Check for missing Homebrew casks.
verify_homebrew_casks() {
local applications=""
printf "\nChecking Homebrew casks...\n"
local applications="$(brew list --casks)"
applications="$(brew list --casks)"
while read line; do
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[*]}"
fi
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
# Checks for missing Homebrew formulas.
# Label: Verify Homebrew Formulas
# Description: Check for missing Homebrew formulas.
verify_homebrew_formulas() {
local applications=""
printf "Checking Homebrew formulas...\n"
local applications="$(brew list --formulae)"
applications="$(brew list --formulae)"
while read line; do
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".
if [[ "$application" == "gpg" ]]; then
@@ -100,80 +114,89 @@ verify_homebrew_formulas() {
fi
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
# Verifies listed application exists.
# Parameters: $1 (required) - The current application, $2 (required) - The application list.
# Label: Verify Listed Application
# Description: Verify listed application exists.
# Parameters: $1 (required): Current application, $2 (required): Application list.
verify_listed_application() {
local application="$1"
local applications="$2"
if [[ "${applications[*]}" != *"$application"* ]]; then
printf " - Missing: $application\n"
printf "%s\n" " - Missing: $application"
fi
}
export -f verify_listed_application
# Verifies path exists.
# Parameters: $1 (required) - The path.
# Label: Verify Path
# Description: Verify path exists.
# Parameters: $1 (required): Path.
verify_path() {
local path="$1"
if [[ ! -e "$path" ]]; then
printf " - Missing: $path\n"
printf "%s\n" " - Missing: $path"
fi
}
export -f verify_path
# Checks for missing Node packages.
# Label: Verify Node Packages
# Description: Check for missing Node packages.
verify_node_packages() {
printf "\nChecking Node packages...\n"
printf "\n%s\n" "Checking Node packages..."
while read line; do
if [[ "$line" == "npm "* ]]; then
local package=$(printf "$line" | awk '{print $4}')
local packages=($(npm list --global --depth=0 | grep "$package"))
package=$(printf "$line" | awk '{print $4}')
packages=($(npm list --global --depth=0 | grep "$package"))
verify_listed_application "$package" "${packages[*]}"
fi
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
# Checks for missing Ruby gems.
# Label: Verify Ruby Gems
# Description: Check for missing 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
if [[ "$line" == "gem install"* ]]; then
local gem=$(printf "$line" | awk '{print $3}')
gem=$(printf "%s" "$line" | awk '{print $3}')
verify_listed_application "$gem" "${gems[*]}"
fi
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
# Checks for missing Rust crates.
# Label: Verify Rust Crates
# Description: Check for missing 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
if [[ "$line" == "cargo install"* ]]; then
local crate=$(printf "$line" | awk '{print $3}')
crate=$(printf "%s" "$line" | awk '{print $3}')
verify_listed_application "$crate" "${crates[*]}"
fi
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