Compare commits
52 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
029fce45b4 | ||
|
|
e9d1928b90 | ||
|
|
14394e5c51 | ||
|
|
566b9d871e | ||
|
|
f640e37089 | ||
|
|
c3c3036c88 | ||
|
|
6990b9d2c6 | ||
|
|
b8d96b3479 | ||
|
|
be9edafe52 | ||
|
|
c62ef77ce2 | ||
|
|
e9cd22bb36 | ||
|
|
e9476d6a6a | ||
|
|
35663cf8b3 | ||
|
|
eec175e232 | ||
|
|
dd62dad160 | ||
|
|
c65f06d5b8 | ||
|
|
6567969919 | ||
|
|
82d50299c7 | ||
|
|
ec441aefef | ||
|
|
e4ef33a5f6 | ||
|
|
eaefe9fa04 | ||
|
|
71da0e7b1b | ||
|
|
2c518d797e | ||
|
|
5e25c8d3f9 | ||
|
|
3aea499672 | ||
|
|
0ddd9b0986 | ||
|
|
5a4d45ffed | ||
|
|
cb3ed0108d | ||
|
|
8c4c734043 | ||
|
|
160447eda3 | ||
|
|
803c38e1c2 | ||
|
|
76432f5a74 | ||
|
|
85c85a5e80 | ||
|
|
b83ecf6516 | ||
|
|
3889930672 | ||
|
|
856f51422a | ||
|
|
433ad04028 | ||
|
|
605190577f | ||
|
|
c9c7f46e4a | ||
|
|
f8a779e926 | ||
|
|
e6f991baca | ||
|
|
ae6ab46fa7 | ||
|
|
45a6c5d1b0 | ||
|
|
1bb6ef39a5 | ||
|
|
1416aa2f0a | ||
|
|
b6cddae599 | ||
|
|
e533bf04be | ||
|
|
5455a76d14 | ||
|
|
5569fdb345 | ||
|
|
8f2173c938 | ||
|
|
4f1ed26934 | ||
|
|
b7c89266f6 |
31
.circleci/config.yml
Normal file
31
.circleci/config.yml
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
version: 2.1
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
working_directory: ~/project
|
||||||
|
docker:
|
||||||
|
- image: bkuhlmann/alpine-ruby:latest
|
||||||
|
steps:
|
||||||
|
- checkout
|
||||||
|
|
||||||
|
- restore_cache:
|
||||||
|
name: Bundler Restore
|
||||||
|
keys:
|
||||||
|
- gem-cache-{{.Branch}}-{{checksum "Gemfile"}}
|
||||||
|
- gem-cache-
|
||||||
|
|
||||||
|
- run:
|
||||||
|
name: Bundler Install
|
||||||
|
command: |
|
||||||
|
gem update --system
|
||||||
|
bundle config set path "vendor/bundle"
|
||||||
|
bundle install
|
||||||
|
|
||||||
|
- save_cache:
|
||||||
|
name: Bundler Store
|
||||||
|
key: gem-cache-{{.Branch}}-{{checksum "Gemfile"}}
|
||||||
|
paths:
|
||||||
|
- vendor/bundle
|
||||||
|
|
||||||
|
- run:
|
||||||
|
name: Build
|
||||||
|
command: bundle exec rake
|
||||||
@@ -1 +1 @@
|
|||||||
2.7.1
|
3.0.2
|
||||||
|
|||||||
69
CHANGES.adoc
69
CHANGES.adoc
@@ -1,5 +1,74 @@
|
|||||||
= Changes
|
= Changes
|
||||||
|
|
||||||
|
== 12.0.1 (2021-07-17)
|
||||||
|
|
||||||
|
* Updated to Ruby 3.0.1 - Brooke Kuhlmann
|
||||||
|
* Updated to Ruby 3.0.2 - Brooke Kuhlmann
|
||||||
|
|
||||||
|
== 12.0.0 (2021-03-16)
|
||||||
|
|
||||||
|
* Fixed environment configuration to source Bash resource - Brooke Kuhlmann
|
||||||
|
* Added Homebrew installation to Homebrew sripts - Brooke Kuhlmann
|
||||||
|
* Added Node packages script - Brooke Kuhlmann
|
||||||
|
* Added Ruby gems script - Brooke Kuhlmann
|
||||||
|
* Added Rust crates script - Brooke Kuhlmann
|
||||||
|
* Added bare package installer - Brooke Kuhlmann
|
||||||
|
* Added dotfiles script - Brooke Kuhlmann
|
||||||
|
* Added mas check to App Store install script - Brooke Kuhlmann
|
||||||
|
* Added version release notes - Brooke Kuhlmann
|
||||||
|
* Updated dev tools installer to agree to Rosetta license - Brooke Kuhlmann
|
||||||
|
* Updated install root detection to support Elm - Brooke Kuhlmann
|
||||||
|
* Updated setup software as configure software script - Brooke Kuhlmann
|
||||||
|
* Removed CPU detection in favor of architecture detection - Brooke Kuhlmann
|
||||||
|
* Refactored install scripts to separate script paths - Brooke Kuhlmann
|
||||||
|
|
||||||
|
== 11.2.0 (2021-02-27)
|
||||||
|
|
||||||
|
* Added Apple Silicon instructions - Brooke Kuhlmann
|
||||||
|
* Added CPU utility function - Brooke Kuhlmann
|
||||||
|
* Added Homebrew install function - Brooke Kuhlmann
|
||||||
|
* Added Homebrew utility path functions - Brooke Kuhlmann
|
||||||
|
* Added Rosetta to development tools install script - Brooke Kuhlmann
|
||||||
|
* Added environment configuration for scripts - Brooke Kuhlmann
|
||||||
|
* Updated to Circle CI 2.1.0 - Brooke Kuhlmann
|
||||||
|
* Updated to Docker Alpine Ruby image - Brooke Kuhlmann
|
||||||
|
* Refactored installer functions to be alphabetically sorted - Brooke Kuhlmann
|
||||||
|
* Refactored utility functions to be alphabetically sorted - Brooke Kuhlmann
|
||||||
|
* Refactored verifier functions to be alphabetically sorted - Brooke Kuhlmann
|
||||||
|
|
||||||
|
== 11.1.1 (2021-01-10)
|
||||||
|
|
||||||
|
* Fixed brew formulae list error - Brooke Kuhlmann
|
||||||
|
* Updated boot disk recovery documentation - Brooke Kuhlmann
|
||||||
|
|
||||||
|
== 11.1.0 (2021-01-03)
|
||||||
|
|
||||||
|
* Added caffeination to restore process - Brooke Kuhlmann
|
||||||
|
* Updated boot disk instructions for main disk format - Brooke Kuhlmann
|
||||||
|
* Updated troubleshooting documentation - Brooke Kuhlmann
|
||||||
|
* Removed README Startup Security Utility documentation - Brooke Kuhlmann
|
||||||
|
|
||||||
|
== 11.0.0 (2020-12-30)
|
||||||
|
|
||||||
|
* Fixed Circle CI configuration for Bundler config path - Brooke Kuhlmann
|
||||||
|
* Added Circle CI explicit Bundle install configuration - Brooke Kuhlmann
|
||||||
|
* Updated to Git Lint 2.0.0 - Brooke Kuhlmann
|
||||||
|
* Updated to Ruby 3.0.0 - Brooke Kuhlmann
|
||||||
|
|
||||||
|
== 10.0.0 (2020-11-15)
|
||||||
|
|
||||||
|
* Added macOS Big Sur support
|
||||||
|
* Updated project documentation to conform to Rubysmith template
|
||||||
|
* Updated to Git Lint 1.3.0
|
||||||
|
* Updated to Ruby 2.7.2
|
||||||
|
|
||||||
|
== 9.0.0 (2020-09-12)
|
||||||
|
|
||||||
|
* Fixed Homebrew cask verifier deprecation warning
|
||||||
|
* Removed Homebrew Mecurial formula verification check
|
||||||
|
* Removed unnecessary verifier code comments
|
||||||
|
* Refactored utility basename and extension utilities
|
||||||
|
|
||||||
== 8.2.0 (2020-07-22)
|
== 8.2.0 (2020-07-22)
|
||||||
|
|
||||||
* Fixed project requirements
|
* Fixed project requirements
|
||||||
|
|||||||
@@ -51,7 +51,8 @@ an appointed representative at an online or offline event.
|
|||||||
== Enforcement
|
== Enforcement
|
||||||
|
|
||||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community
|
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community
|
||||||
leaders responsible for enforcement at link:mailto:brooke@alchemists.io?subject=Conduct[Alchemists].
|
leaders responsible for enforcement at link:mailto:brooke@alchemists.io?subject=Conduct[Brooke Kuhlmann].
|
||||||
|
|
||||||
All complaints will be reviewed and investigated promptly and fairly.
|
All complaints will be reviewed and investigated promptly and fairly.
|
||||||
|
|
||||||
All community leaders are obligated to respect the privacy and security of the reporter of any
|
All community leaders are obligated to respect the privacy and security of the reporter of any
|
||||||
@@ -102,7 +103,7 @@ disparagement of classes of individuals.
|
|||||||
|
|
||||||
This Code of Conduct is adapted from the
|
This Code of Conduct is adapted from the
|
||||||
link:https://www.contributor-covenant.org/version/2/0/code_of_conduct.html[Contributor Covenant,
|
link:https://www.contributor-covenant.org/version/2/0/code_of_conduct.html[Contributor Covenant,
|
||||||
version 2.0].
|
Version 2.0].
|
||||||
|
|
||||||
Community Impact Guidelines were inspired by link:https://github.com/mozilla/diversity[Mozilla's
|
Community Impact Guidelines were inspired by link:https://github.com/mozilla/diversity[Mozilla's
|
||||||
code of conduct enforcement ladder].
|
code of conduct enforcement ladder].
|
||||||
|
|||||||
2
Gemfile
2
Gemfile
@@ -3,4 +3,4 @@
|
|||||||
source "https://rubygems.org"
|
source "https://rubygems.org"
|
||||||
|
|
||||||
gem "rake", "~> 13.0"
|
gem "rake", "~> 13.0"
|
||||||
gem "git-lint", "~> 1.0"
|
gem "git-lint", "~> 2.0"
|
||||||
|
|||||||
@@ -150,7 +150,7 @@ additional liability.
|
|||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
Copyright link:https://www.alchemists.io[Alchemists].
|
Copyright 2016 link:https://www.alchemists.io/team/brooke_kuhlmann[Brooke Kuhlmann].
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in
|
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in
|
||||||
compliance with the License. You may obtain a link:https://www.apache.org/licenses/LICENSE-2.0[copy]
|
compliance with the License. You may obtain a link:https://www.apache.org/licenses/LICENSE-2.0[copy]
|
||||||
|
|||||||
165
README.adoc
165
README.adoc
@@ -16,10 +16,10 @@ Config_ project is an opinionated configuration which meets the needs of my deve
|
|||||||
but is also meant to serve as an example and guide for building your own personalized setup. Here is
|
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 foundation framework for building customizated macOS machine setups.
|
* *macOS* (this project) - The foundational framework for building custom macOS machine setups.
|
||||||
* *link:https://www.alchemists.io/projects/mac_os-config[macOS Configuration]* - The layer on top of
|
* *link:https://www.alchemists.io/projects/mac_os-config[macOS Configuration]* - The layer on top of
|
||||||
this _macOS_ project which defines a custom machine setup and base implementation. The project is
|
this _macOS_ project which defines a custom machine implementation. The project is meant to be
|
||||||
meant to be forked for as many custom machine setups as needed.
|
forked for as many custom machine setups as needed.
|
||||||
|
|
||||||
toc::[]
|
toc::[]
|
||||||
|
|
||||||
@@ -28,15 +28,17 @@ toc::[]
|
|||||||
* Provides a command line interface, written in Bash, with no additional dependencies for
|
* Provides a command line interface, written in Bash, with no additional dependencies for
|
||||||
installation and management of a macOS machine.
|
installation and management of a macOS machine.
|
||||||
* Supports macOS boot disk creation for fresh install of operating system.
|
* Supports macOS boot disk creation for fresh install of operating system.
|
||||||
* Downloads and installs link:https://developer.apple.com/xcode[Xcode Command Line Tools].
|
* Installs link:https://developer.apple.com/xcode[Xcode Command Line Tools].
|
||||||
* Downloads, installs, and configures link:http://brew.sh[Homebrew Formulas].
|
* Installs link:http://brew.sh[Homebrew] formulas and casks.
|
||||||
* Downloads, installs, and configures link:https://caskroom.github.io[Homebrew Casks].
|
* Installs link:http://www.apple.com/macosx/whats-new/app-store.html[App Store] software.
|
||||||
* Downloads, installs, and configures link:http://www.apple.com/macosx/whats-new/app-store.html[App
|
* Installs non-App Store software applications.
|
||||||
Store] software.
|
* Installs software application extensions.
|
||||||
* Downloads, installs, and configures non-App Store software applications.
|
* Installs dotfiles.
|
||||||
* Downloads, installs, and configures software application extensions.
|
* Installs link:https://nodejs.org[Node] link:https://www.npmjs.com[packages].
|
||||||
* Applies basic and default software settings.
|
* Installs link:https://www.ruby-lang.org[Ruby] link:https://rubygems.org[gems].
|
||||||
* Sets up and configures installed software for use.
|
* Installs link:https://www.rust-lang.org[Rust] link:https://crates.io[crates].
|
||||||
|
* Applies basic default software settings.
|
||||||
|
* Configures installed software.
|
||||||
* Supports restoration of machine backups.
|
* Supports restoration of machine backups.
|
||||||
|
|
||||||
== Screencast
|
== Screencast
|
||||||
@@ -46,30 +48,18 @@ image::https://www.alchemists.io/images/screencasts/mac_os/cover.svg[Screencast,
|
|||||||
|
|
||||||
== Requirements
|
== Requirements
|
||||||
|
|
||||||
. link:https://www.apple.com/macos/catalina[macOS]
|
. link:https://www.apple.com/macos/big-sur[macOS Big Sur]
|
||||||
. link:https://developer.apple.com/xcode[Xcode]
|
. link:https://developer.apple.com/xcode[Xcode]
|
||||||
|
|
||||||
== Setup
|
== Setup
|
||||||
|
|
||||||
=== Production
|
|
||||||
|
|
||||||
To install, run:
|
To install, run:
|
||||||
|
|
||||||
[source,bash]
|
[source,bash]
|
||||||
----
|
----
|
||||||
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 8.2.0
|
git checkout 12.0.1
|
||||||
----
|
|
||||||
|
|
||||||
=== Development
|
|
||||||
|
|
||||||
To contribute, run:
|
|
||||||
|
|
||||||
[source,bash]
|
|
||||||
----
|
|
||||||
git clone https://github.com/bkuhlmann/mac_os.git
|
|
||||||
cd mac_os
|
|
||||||
----
|
----
|
||||||
|
|
||||||
== Usage
|
== Usage
|
||||||
@@ -95,9 +85,13 @@ Install:
|
|||||||
m: Install Mac App Store software.
|
m: Install Mac App Store software.
|
||||||
a: Install application software.
|
a: Install application software.
|
||||||
x: Install application software extensions.
|
x: Install application software extensions.
|
||||||
|
df: Install dotfiles.
|
||||||
|
np: Install Node packages.
|
||||||
|
rg: Install Ruby gems.
|
||||||
|
rc: Install Rust crates.
|
||||||
d: Apply default settings.
|
d: Apply default settings.
|
||||||
s: Setup installed software.
|
cs: Configure installed software.
|
||||||
i: Install everything (i.e. executes all install options).
|
i: Install everything (i.e. executes all install options in order listed).
|
||||||
Restore:
|
Restore:
|
||||||
R: Restore settings from backup.
|
R: Restore settings from backup.
|
||||||
Manage:
|
Manage:
|
||||||
@@ -138,64 +132,47 @@ macOS Boot Disk Tips
|
|||||||
macOS Boot Disk Usage:
|
macOS Boot Disk Usage:
|
||||||
1. Insert the USB boot disk into the machine to be upgraded.
|
1. Insert the USB boot disk into the machine to be upgraded.
|
||||||
2. Reboot the machine.
|
2. Reboot the machine.
|
||||||
3. Hold down the OPTION key before the Apple logo appears.
|
3. Hold the POWER (Silicon) or OPTION (Intel) key before the Apple logo appears.
|
||||||
4. Select the USB boot disk from the menu.
|
4. Select the USB boot disk from the menu.
|
||||||
5. Use Disk Utility to format the machine's drive as "APFS (Encrypted)".
|
5. Use Disk Utility to delete and/or erase the hard drive including associated partitions.
|
||||||
6. Install the new operating system.
|
6. Use Disk Utility to create a single "APFS" drive as a "GUID Partition Table".
|
||||||
|
7. Install the new operating system.
|
||||||
|
|
||||||
macOS Reinstall:
|
macOS Boot Disk Recovery:
|
||||||
1. Click the Apple icon from the operating system main menu.
|
1. Start/restart the machine.
|
||||||
2. Select the "Restart..." menu option.
|
2. Hold the POWER (Silicon) or COMMAND+R (Intel) keys before the Apple logo appears.
|
||||||
3. Hold down the COMMAND+R keys before the Apple logo appears.
|
3. Wait for the macOS installer to load from the recovery partition.
|
||||||
4. Wait for the macOS installer to load from the recovery partition.
|
4. Use the dialog options to launch Disk Utility, reinstall the system, etc.
|
||||||
5. Use the dialog options to launch Disk Utility, reinstall the system, etc.
|
|
||||||
....
|
....
|
||||||
|
|
||||||
Depending on your security settings, you might need to use the Startup
|
|
||||||
Security Utility before using the Boot Disk (see below).
|
|
||||||
|
|
||||||
=== https://support.apple.com/en-us/HT208198[Startup Security Utility]
|
|
||||||
|
|
||||||
With newer hardware, you should be running with the Apple T2 Security Chip (found via → About This
|
|
||||||
Mac → Overview → System Report → Controller). In order to boot your machine using the Boot Disk,
|
|
||||||
you’ll need to _temporarily_ disable the default security settings as follows:
|
|
||||||
|
|
||||||
* Turn on or restart your Mac, then press and hold `COMMAND + R` immediately after seeing the Apple
|
|
||||||
logo.
|
|
||||||
* Select Utilities → Startup Security Utility from the main menu.
|
|
||||||
* Click _Turn Off Firmware Password_.
|
|
||||||
* Select _Secure Boot: No Security_.
|
|
||||||
* Select _External Boot: Allow booting from external media_.
|
|
||||||
* Quit the utility and restart the machine.
|
|
||||||
|
|
||||||
You’ll now be able to boot your system with the Boot Disk (see above).
|
|
||||||
|
|
||||||
After the new operating system has been installed via the Boot Disk, _ensure you return to the
|
|
||||||
Startup Security Utility and re-enable the following settings_:
|
|
||||||
|
|
||||||
* Click _Turn On Firmware Password_.
|
|
||||||
* Select _Secure Boot: Full Security_.
|
|
||||||
* Select _External Boot: Disallow booting from external or removable media_.
|
|
||||||
|
|
||||||
=== Customization
|
=== Customization
|
||||||
|
|
||||||
All executable scripts can be found in the `bin` folder:
|
All executable scripts can be found in the `bin` folder:
|
||||||
|
|
||||||
* `bin/apply_basic_settings`: Applies basic, initial, settings for setting up a machine. _Can be
|
* `bin/apply_basic_settings` (optional, customizable): Applies basic and initial settings for
|
||||||
customized._
|
setting up a machine.
|
||||||
* `bin/apply_default_settings`: Applies useful system and application defaults. _Can be customized._
|
* `bin/apply_default_settings` (optional, customizable): Applies bare minimum system and application
|
||||||
* `bin/create_boot_disk`: Creates macOS boot disk.
|
defaults.
|
||||||
* `bin/install_app_store`: Installs macOS, GUI-based, App Store applications. _Can be customized._
|
* `bin/configure_software` (optional, customizable): Configures installed software as part of the
|
||||||
* `bin/install_applications`: Installs macOS, GUI-based, non-App Store applications. _Can be
|
post install process.
|
||||||
customized._
|
* `bin/create_boot_disk` (optional): Creates a macOS boot disk.
|
||||||
* `bin/install_dev_tools`: Installs macOS development tools required by Homebrew.
|
* `bin/install_app_store` (optional, customizable): Installs macOS, GUI-based, App Store
|
||||||
* `bin/install_extensions`: Installs macOS application extensions and add-ons. _Can be customized._
|
applications.
|
||||||
* `bin/install_homebrew_casks`: Installs Homebrew Formulas. _Can be customized._
|
* `bin/install_applications` (optional, customizable): Installs macOS, GUI-based, non-App Store
|
||||||
* `bin/install_homebrew_formulas`: Installs Homebrew Casks. _Can be customized._
|
applications.
|
||||||
* `bin/restore_backup`: Restores system/application settings from backup image. _Can be customized._
|
* `bin/install_dev_tools` (required): Installs macOS development tools required by Homebrew.
|
||||||
* `bin/run`: The main script and interface for macOS setup.
|
* `bin/install_dotfiles` (optional, customizable): Installs personal dotfiles so the system is
|
||||||
* `bin/setup_software`: Configures and launches (if necessary) installed software. _Can be
|
tailored to your workflow.
|
||||||
customized._
|
* `bin/install_extensions` (optional, customizable): Installs macOS application extensions and
|
||||||
|
add-ons.
|
||||||
|
* `bin/install_homebrew_casks` (optional, customizable): Installs Homebrew Formulas.
|
||||||
|
* `bin/install_homebrew_formulas` (optional, customizable): Installs Homebrew Casks.
|
||||||
|
* `bin/install_node_packages` (optional, customizable): Installs Node packages.
|
||||||
|
* `bin/install_ruby_gems` (optional, customizable): Installs Ruby gems.
|
||||||
|
* `bin/install_rust_crates` (optional, customizable): Installs Rust crates.
|
||||||
|
* `bin/restore_backup` (optional, customizable): Restores system/application settings from backup
|
||||||
|
image.
|
||||||
|
* `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://www.alchemists.io/projects/mac_os-config[macOS
|
||||||
@@ -206,20 +183,30 @@ link:https://www.alchemists.io/projects/mac_os-config[macOS Config] project for
|
|||||||
|
|
||||||
== Troubleshooting
|
== Troubleshooting
|
||||||
|
|
||||||
|
* When using link:https://pi-hole.net[Pi-hole], you might need to temporarily disable prior to
|
||||||
|
upgrading as you might experience various errors with Apple not being able to detect an internet
|
||||||
|
connection which prevents the installer from working.
|
||||||
|
* When using the boot disk and the installer fails in some catestrophic manner, reboot the machine
|
||||||
|
into recovery mode -- `POWER` (Silicon) or `COMMAND + R` (Intel) buttons -- to download and
|
||||||
|
install the last operating system used. Alternatively, you can also use `COMMAND + OPTION + R`
|
||||||
|
(Intel) to attemp to download the latest operating system.
|
||||||
* When using the boot disk, you might experience a situation where you see a black screen with a
|
* When using the boot disk, you might experience a situation where you see a black screen with a
|
||||||
white circle and diagonal line running through it. This means macOS lost or can’t find the boot
|
white circle and diagonal line running through it. This means macOS lost or can’t find the boot
|
||||||
disk for some reason. To correct this, shut down and boot up the system again while holding down
|
disk for some reason. To correct this, shut down and boot up the system again while holding down
|
||||||
the `OPTION+COMMAND+R+P` keys simultaneously. You might want to wait for the system boot sound to
|
the `OPTION + COMMAND + R + P` (Intel) keys simultaneously. You might want to wait for the system
|
||||||
happen a few times before releasing the keys. This will clear the system NVRAM/PRAM. At this point
|
boot sound to happen a few times before releasing the keys. This will clear the system NVRAM/PRAM.
|
||||||
you can shut down and restart the system following the boot disk instructions (the boot disk will
|
At this point you can shut down and restart the system following the boot disk instructions (the
|
||||||
be recognized now).
|
boot disk will be recognized now).
|
||||||
* Sometimes, when installing XCode development tools (i.e. the `t` option), not all of the macOS
|
|
||||||
headers will be installed. This can cause issues with compiling and building native packages. For
|
== Development
|
||||||
example: `fatal error: 'stdio.h' file not found`. This can happen due to an intermittent bug with
|
|
||||||
the XCode installer. To fix this, you’ll need to install this package:
|
To contribute, run:
|
||||||
`/Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg`. Depending on
|
|
||||||
your system, the version might differ, so look for a `*.pkg` in the
|
[source,bash]
|
||||||
`/Library/Developer/CommandLineTools/Packages` folder.
|
----
|
||||||
|
git clone https://github.com/bkuhlmann/mac_os.git
|
||||||
|
cd mac_os
|
||||||
|
----
|
||||||
|
|
||||||
== Versioning
|
== Versioning
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ set -o nounset
|
|||||||
set -o errexit
|
set -o errexit
|
||||||
set -o pipefail
|
set -o pipefail
|
||||||
IFS=$'\n\t'
|
IFS=$'\n\t'
|
||||||
|
|
||||||
SCRIPT_PATH="$MAC_OS_CONFIG_PATH/bin/apply_basic_settings"
|
SCRIPT_PATH="$MAC_OS_CONFIG_PATH/bin/apply_basic_settings"
|
||||||
|
|
||||||
if [[ -x "$SCRIPT_PATH" ]]; then
|
if [[ -x "$SCRIPT_PATH" ]]; then
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ set -o nounset
|
|||||||
set -o errexit
|
set -o errexit
|
||||||
set -o pipefail
|
set -o pipefail
|
||||||
IFS=$'\n\t'
|
IFS=$'\n\t'
|
||||||
|
|
||||||
SCRIPT_PATH="$MAC_OS_CONFIG_PATH/bin/apply_default_settings"
|
SCRIPT_PATH="$MAC_OS_CONFIG_PATH/bin/apply_default_settings"
|
||||||
|
|
||||||
if [[ -x "$SCRIPT_PATH" ]]; then
|
if [[ -x "$SCRIPT_PATH" ]]; then
|
||||||
|
|||||||
16
bin/configure_software
Executable file
16
bin/configure_software
Executable file
@@ -0,0 +1,16 @@
|
|||||||
|
#! /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
|
||||||
@@ -9,16 +9,16 @@ printf " - Use Disk Utility to label the USB drive as \"Untitled\".\n"
|
|||||||
printf "\nmacOS Boot Disk Usage:\n"
|
printf "\nmacOS Boot Disk Usage:\n"
|
||||||
printf " 1. Insert the USB boot disk into the machine to be upgraded.\n"
|
printf " 1. Insert the USB boot disk into the machine to be upgraded.\n"
|
||||||
printf " 2. Reboot the machine.\n"
|
printf " 2. Reboot the machine.\n"
|
||||||
printf " 3. Hold down the OPTION key before the Apple logo appears.\n"
|
printf " 3. Hold the POWER (Silicon) or OPTION (Intel) key before the Apple logo appears.\n"
|
||||||
printf " 4. Select the USB boot disk from the menu.\n"
|
printf " 4. Select the USB boot disk from the menu.\n"
|
||||||
printf " 5. Use Disk Utility to format the machine's drive as \"APFS (Encrypted)\".\n"
|
printf " 5. Use Disk Utility to delete and/or erase the hard drive including associated partitions.\n"
|
||||||
printf " 6. Install the new operating system.\n"
|
printf " 6. Use Disk Utility to create a single \"APFS\" drive as a \"GUID Partition Table\".\n"
|
||||||
printf "\nmacOS Reinstall:\n"
|
printf " 7. Install the new operating system.\n"
|
||||||
printf " 1. Click the Apple icon from the operating system main menu.\n"
|
printf "\nmacOS Boot Disk Recovery:\n"
|
||||||
printf " 2. Select the \"Restart...\" menu option.\n"
|
printf " 1. Start/restart the machine.\n"
|
||||||
printf " 3. Hold down the COMMAND+R keys before the Apple logo appears.\n"
|
printf " 2. Hold the POWER (Silicon) or COMMAND+R (Intel) keys before the Apple logo appears.\n"
|
||||||
printf " 4. Wait for the macOS installer to load from the recovery partition.\n"
|
printf " 3. Wait for the macOS installer to load from the recovery partition.\n"
|
||||||
printf " 5. Use the dialog options to launch Disk Utility, reinstall the system, etc.\n"
|
printf " 4. Use the dialog options to launch Disk Utility, reinstall the system, etc.\n"
|
||||||
|
|
||||||
printf "\nCreating macOS boot disk...\n"
|
printf "\nCreating macOS boot disk...\n"
|
||||||
|
|
||||||
|
|||||||
@@ -6,9 +6,11 @@ set -o nounset
|
|||||||
set -o errexit
|
set -o errexit
|
||||||
set -o pipefail
|
set -o pipefail
|
||||||
IFS=$'\n\t'
|
IFS=$'\n\t'
|
||||||
|
|
||||||
SCRIPT_PATH="$MAC_OS_CONFIG_PATH/bin/install_app_store"
|
SCRIPT_PATH="$MAC_OS_CONFIG_PATH/bin/install_app_store"
|
||||||
|
|
||||||
if [[ -x "$SCRIPT_PATH" ]]; then
|
if [[ -x "$SCRIPT_PATH" ]]; then
|
||||||
|
check_mas_install
|
||||||
"$SCRIPT_PATH"
|
"$SCRIPT_PATH"
|
||||||
else
|
else
|
||||||
printf "WARNING: App Store install script does not exist or is not executable.\n"
|
printf "WARNING: App Store install script does not exist or is not executable.\n"
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ set -o nounset
|
|||||||
set -o errexit
|
set -o errexit
|
||||||
set -o pipefail
|
set -o pipefail
|
||||||
IFS=$'\n\t'
|
IFS=$'\n\t'
|
||||||
|
|
||||||
SCRIPT_PATH="$MAC_OS_CONFIG_PATH/bin/install_applications"
|
SCRIPT_PATH="$MAC_OS_CONFIG_PATH/bin/install_applications"
|
||||||
|
|
||||||
if [[ -x "$SCRIPT_PATH" ]]; then
|
if [[ -x "$SCRIPT_PATH" ]]; then
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#! /usr/bin/env bash
|
#! /usr/bin/env bash
|
||||||
|
|
||||||
# Installs development tooling requirements.
|
Installs development tooling requirements.
|
||||||
|
|
||||||
printf "Installing Xcode CLI tools...\n"
|
printf "Installing Xcode CLI tools...\n"
|
||||||
xcode-select --install
|
xcode-select --install
|
||||||
@@ -11,3 +11,7 @@ if [[ "$xcode_response" != "y" ]]; then
|
|||||||
printf "ERROR: Xcode CLI tools must be installed before proceeding.\n"
|
printf "ERROR: Xcode CLI tools must be installed before proceeding.\n"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if [[ "$(/usr/bin/arch)" == "arm64" ]]; then
|
||||||
|
softwareupdate --install-rosetta --agree-to-license
|
||||||
|
fi
|
||||||
|
|||||||
16
bin/install_dotfiles
Executable file
16
bin/install_dotfiles
Executable file
@@ -0,0 +1,16 @@
|
|||||||
|
#! /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
|
||||||
@@ -6,6 +6,7 @@ set -o nounset
|
|||||||
set -o errexit
|
set -o errexit
|
||||||
set -o pipefail
|
set -o pipefail
|
||||||
IFS=$'\n\t'
|
IFS=$'\n\t'
|
||||||
|
|
||||||
SCRIPT_PATH="$MAC_OS_CONFIG_PATH/bin/install_extensions"
|
SCRIPT_PATH="$MAC_OS_CONFIG_PATH/bin/install_extensions"
|
||||||
|
|
||||||
if [[ -x "$SCRIPT_PATH" ]]; then
|
if [[ -x "$SCRIPT_PATH" ]]; then
|
||||||
|
|||||||
@@ -6,9 +6,11 @@ set -o nounset
|
|||||||
set -o errexit
|
set -o errexit
|
||||||
set -o pipefail
|
set -o pipefail
|
||||||
IFS=$'\n\t'
|
IFS=$'\n\t'
|
||||||
|
|
||||||
SCRIPT_PATH="$MAC_OS_CONFIG_PATH/bin/install_homebrew_casks"
|
SCRIPT_PATH="$MAC_OS_CONFIG_PATH/bin/install_homebrew_casks"
|
||||||
|
|
||||||
if [[ -x "$SCRIPT_PATH" ]]; then
|
if [[ -x "$SCRIPT_PATH" ]]; then
|
||||||
|
install_homebrew
|
||||||
"$SCRIPT_PATH"
|
"$SCRIPT_PATH"
|
||||||
else
|
else
|
||||||
printf "WARNING: Homebrew Casks install script does not exist or is not executable.\n"
|
printf "WARNING: Homebrew Casks install script does not exist or is not executable.\n"
|
||||||
|
|||||||
@@ -6,9 +6,11 @@ set -o nounset
|
|||||||
set -o errexit
|
set -o errexit
|
||||||
set -o pipefail
|
set -o pipefail
|
||||||
IFS=$'\n\t'
|
IFS=$'\n\t'
|
||||||
|
|
||||||
SCRIPT_PATH="$MAC_OS_CONFIG_PATH/bin/install_homebrew_formulas"
|
SCRIPT_PATH="$MAC_OS_CONFIG_PATH/bin/install_homebrew_formulas"
|
||||||
|
|
||||||
if [[ -x "$SCRIPT_PATH" ]]; then
|
if [[ -x "$SCRIPT_PATH" ]]; then
|
||||||
|
install_homebrew
|
||||||
"$SCRIPT_PATH"
|
"$SCRIPT_PATH"
|
||||||
else
|
else
|
||||||
printf "WARNING: Homebrew Formulas install script does not exist or is not executable.\n"
|
printf "WARNING: Homebrew Formulas install script does not exist or is not executable.\n"
|
||||||
|
|||||||
17
bin/install_node_packages
Executable file
17
bin/install_node_packages
Executable file
@@ -0,0 +1,17 @@
|
|||||||
|
#! /usr/bin/env bash
|
||||||
|
|
||||||
|
# Installs Node packages.
|
||||||
|
|
||||||
|
set -o nounset
|
||||||
|
set -o errexit
|
||||||
|
set -o pipefail
|
||||||
|
IFS=$'\n\t'
|
||||||
|
|
||||||
|
SCRIPT_PATH="$MAC_OS_CONFIG_PATH/bin/install_node_packages"
|
||||||
|
|
||||||
|
if [[ -x "$SCRIPT_PATH" ]]; then
|
||||||
|
check_yarn_install
|
||||||
|
"$SCRIPT_PATH"
|
||||||
|
else
|
||||||
|
printf "WARNING: Node packages install script does not exist or is not executable.\n"
|
||||||
|
fi
|
||||||
17
bin/install_ruby_gems
Executable file
17
bin/install_ruby_gems
Executable file
@@ -0,0 +1,17 @@
|
|||||||
|
#! /usr/bin/env bash
|
||||||
|
|
||||||
|
# Installs Ruby gems.
|
||||||
|
|
||||||
|
set -o nounset
|
||||||
|
set -o errexit
|
||||||
|
set -o pipefail
|
||||||
|
IFS=$'\n\t'
|
||||||
|
|
||||||
|
SCRIPT_PATH="$MAC_OS_CONFIG_PATH/bin/install_ruby_gems"
|
||||||
|
|
||||||
|
if [[ -x "$SCRIPT_PATH" ]]; then
|
||||||
|
install_ruby
|
||||||
|
"$SCRIPT_PATH"
|
||||||
|
else
|
||||||
|
printf "WARNING: Ruby gems install script does not exist or is not executable.\n"
|
||||||
|
fi
|
||||||
17
bin/install_rust_crates
Executable file
17
bin/install_rust_crates
Executable file
@@ -0,0 +1,17 @@
|
|||||||
|
#! /usr/bin/env bash
|
||||||
|
|
||||||
|
# Installs Rust crates.
|
||||||
|
|
||||||
|
set -o nounset
|
||||||
|
set -o errexit
|
||||||
|
set -o pipefail
|
||||||
|
IFS=$'\n\t'
|
||||||
|
|
||||||
|
SCRIPT_PATH="$MAC_OS_CONFIG_PATH/bin/install_rust_crates"
|
||||||
|
|
||||||
|
if [[ -x "$SCRIPT_PATH" ]]; then
|
||||||
|
install_rust
|
||||||
|
"$SCRIPT_PATH"
|
||||||
|
else
|
||||||
|
printf "WARNING: Rust crates install script does not exist or is not executable.\n"
|
||||||
|
fi
|
||||||
@@ -6,6 +6,7 @@ set -o nounset
|
|||||||
set -o errexit
|
set -o errexit
|
||||||
set -o pipefail
|
set -o pipefail
|
||||||
IFS=$'\n\t'
|
IFS=$'\n\t'
|
||||||
|
|
||||||
SCRIPT_PATH="$MAC_OS_CONFIG_PATH/bin/restore_backup"
|
SCRIPT_PATH="$MAC_OS_CONFIG_PATH/bin/restore_backup"
|
||||||
|
|
||||||
if [[ -x "$SCRIPT_PATH" ]]; then
|
if [[ -x "$SCRIPT_PATH" ]]; then
|
||||||
|
|||||||
10
bin/run
10
bin/run
@@ -23,6 +23,8 @@ else
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
configure_environment
|
||||||
|
|
||||||
while true; do
|
while true; do
|
||||||
if [[ $# == 0 ]]; then
|
if [[ $# == 0 ]]; then
|
||||||
printf "\nUsage: run OPTION\n"
|
printf "\nUsage: run OPTION\n"
|
||||||
@@ -37,9 +39,13 @@ while true; do
|
|||||||
printf " m: Install Mac App Store software.\n"
|
printf " m: Install Mac App Store software.\n"
|
||||||
printf " a: Install application software.\n"
|
printf " a: Install application software.\n"
|
||||||
printf " x: Install application software extensions.\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 " d: Apply default settings.\n"
|
||||||
printf " s: Setup installed software.\n"
|
printf " cs: Configure installed software.\n"
|
||||||
printf " i: Install everything (i.e. executes all install options).\n"
|
printf " i: Install everything (i.e. executes all install options in order listed).\n"
|
||||||
printf " Restore:\n"
|
printf " Restore:\n"
|
||||||
printf " R: Restore settings from backup.\n"
|
printf " R: Restore settings from backup.\n"
|
||||||
printf " Manage:\n"
|
printf " Manage:\n"
|
||||||
|
|||||||
@@ -1,15 +0,0 @@
|
|||||||
#! /usr/bin/env bash
|
|
||||||
|
|
||||||
# Sets up and launches (if necessary) installed software.
|
|
||||||
|
|
||||||
set -o nounset
|
|
||||||
set -o errexit
|
|
||||||
set -o pipefail
|
|
||||||
IFS=$'\n\t'
|
|
||||||
SCRIPT_PATH="$MAC_OS_CONFIG_PATH/bin/setup_software"
|
|
||||||
|
|
||||||
if [[ -x "$SCRIPT_PATH" ]]; then
|
|
||||||
"$SCRIPT_PATH"
|
|
||||||
else
|
|
||||||
printf "WARNING: Software setup script does not exist or is not executable.\n"
|
|
||||||
fi
|
|
||||||
61
circle.yml
61
circle.yml
@@ -1,61 +0,0 @@
|
|||||||
version: 2
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
working_directory: ~/project
|
|
||||||
docker:
|
|
||||||
- image: circleci/ruby
|
|
||||||
environment:
|
|
||||||
BUNDLE_JOBS: 3
|
|
||||||
BUNDLE_RETRY: 3
|
|
||||||
BUNDLE_PATH: vendor/bundle
|
|
||||||
EDITOR: vim
|
|
||||||
steps:
|
|
||||||
- checkout
|
|
||||||
|
|
||||||
- run:
|
|
||||||
name: Environment Setup
|
|
||||||
command: |
|
|
||||||
printf "%s\n" 'export CI_RUBY_VERSION=$(cat ".ruby-version" | tr -d "\n")' >> $BASH_ENV
|
|
||||||
|
|
||||||
- type: cache-restore
|
|
||||||
name: Ruby Restore
|
|
||||||
key: ruby-{{checksum ".ruby-version"}}
|
|
||||||
|
|
||||||
- run:
|
|
||||||
name: Ruby Install
|
|
||||||
command: |
|
|
||||||
curl https://cache.ruby-lang.org/pub/ruby/${CI_RUBY_VERSION::-2}/ruby-$CI_RUBY_VERSION.tar.bz2 > ../ruby-$CI_RUBY_VERSION.tar.gz
|
|
||||||
cd ..
|
|
||||||
tar --extract --bzip2 --verbose --file ruby-$CI_RUBY_VERSION.tar.gz
|
|
||||||
cd ruby-$CI_RUBY_VERSION
|
|
||||||
./configure
|
|
||||||
make
|
|
||||||
make update-gems
|
|
||||||
make extract-gems
|
|
||||||
sudo make install
|
|
||||||
|
|
||||||
- type: cache-save
|
|
||||||
name: Ruby Store
|
|
||||||
key: ruby-{{checksum ".ruby-version"}}
|
|
||||||
paths:
|
|
||||||
- ../ruby-$CI_RUBY_VERSION
|
|
||||||
|
|
||||||
- type: cache-restore
|
|
||||||
name: Bundler Restore
|
|
||||||
key: bundler-{{checksum "Gemfile"}}
|
|
||||||
|
|
||||||
- run:
|
|
||||||
name: Bundler Install
|
|
||||||
command: |
|
|
||||||
gem update --system
|
|
||||||
bundle install --path vendor/bundle
|
|
||||||
|
|
||||||
- type: cache-save
|
|
||||||
name: Bundler Store
|
|
||||||
key: bundler-{{checksum "Gemfile"}}
|
|
||||||
paths:
|
|
||||||
- vendor/bundle
|
|
||||||
|
|
||||||
- run:
|
|
||||||
name: Build
|
|
||||||
command: bundle exec rake
|
|
||||||
@@ -2,6 +2,43 @@
|
|||||||
|
|
||||||
# Defines software installer functions.
|
# Defines software installer functions.
|
||||||
|
|
||||||
|
# Downloads remote file to local disk.
|
||||||
|
# Parameters: $1 (required) - URL, $2 (required) - File name, $3 (optional) - HTTP header.
|
||||||
|
download_file() {
|
||||||
|
local url="$1"
|
||||||
|
local file_name="$2"
|
||||||
|
local http_header="$3"
|
||||||
|
|
||||||
|
printf "%s\n" "Downloading $1..."
|
||||||
|
clean_work_path
|
||||||
|
mkdir $MAC_OS_WORK_PATH
|
||||||
|
curl --header "$http_header" --location --retry 3 --retry-delay 5 --fail --silent --show-error "$url" >> "$MAC_OS_WORK_PATH/$file_name"
|
||||||
|
}
|
||||||
|
export -f download_file
|
||||||
|
|
||||||
|
# Installs an application.
|
||||||
|
# Parameters: $1 (required) - Application source path, $2 (required) - Application name.
|
||||||
|
install_app() {
|
||||||
|
local install_root=$(get_install_root "$2")
|
||||||
|
local file_extension=$(get_extension "$2")
|
||||||
|
|
||||||
|
printf "Installing: $install_root/$2...\n"
|
||||||
|
|
||||||
|
case $file_extension in
|
||||||
|
'')
|
||||||
|
cp -a "$1/$2" "$install_root";;
|
||||||
|
'app')
|
||||||
|
cp -a "$1/$2" "$install_root";;
|
||||||
|
'prefPane')
|
||||||
|
sudo cp -pR "$1/$2" "$install_root";;
|
||||||
|
'qlgenerator')
|
||||||
|
sudo cp -pR "$1/$2" "$install_root" && qlmanage -r;;
|
||||||
|
*)
|
||||||
|
printf "ERROR: Unknown file extension: $file_extension.\n"
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
export -f install_app
|
||||||
|
|
||||||
# Installs an application via a DMG file.
|
# Installs an application via a DMG file.
|
||||||
# Parameters: $1 (required) - URL, $2 (required) - Mount path, $3 (required) - Application name.
|
# Parameters: $1 (required) - URL, $2 (required) - Mount path, $3 (required) - Application name.
|
||||||
install_dmg_app() {
|
install_dmg_app() {
|
||||||
@@ -41,6 +78,163 @@ install_dmg_pkg() {
|
|||||||
}
|
}
|
||||||
export -f install_dmg_pkg
|
export -f install_dmg_pkg
|
||||||
|
|
||||||
|
# Installs a single file.
|
||||||
|
# Parameters: $1 (required) - URL, $2 (required) - Install path.
|
||||||
|
install_file() {
|
||||||
|
local file_url="$1"
|
||||||
|
local file_name=$(get_basename "$1")
|
||||||
|
local install_path="$2"
|
||||||
|
|
||||||
|
if [[ ! -e "$install_path" ]]; then
|
||||||
|
download_file "$file_url" "$file_name"
|
||||||
|
mkdir -p $(dirname "$install_path")
|
||||||
|
mv "$MAC_OS_WORK_PATH/$file_name" "$install_path"
|
||||||
|
printf "Installed: $file_name.\n"
|
||||||
|
verify_path "$install_path"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
export -f install_file
|
||||||
|
|
||||||
|
# Installs application code from a Git repository.
|
||||||
|
# Parameters: $1 (required) - Repository URL, $2 (required) - Install path, $3 (optional) - Git clone options.
|
||||||
|
install_git_app() {
|
||||||
|
local repository_url="$1"
|
||||||
|
local app_name=$(get_basename "$2")
|
||||||
|
local install_path="$2"
|
||||||
|
local options="--quiet"
|
||||||
|
|
||||||
|
if [[ -n "$3" ]]; then
|
||||||
|
local options="$options $3"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ ! -e "$install_path" ]]; then
|
||||||
|
printf "Installing: $install_path/$app_name...\n"
|
||||||
|
git clone $options "$repository_url" "$install_path"
|
||||||
|
printf "Installed: $app_name.\n"
|
||||||
|
verify_path "$install_path"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
export -f install_git_app
|
||||||
|
|
||||||
|
# Installs settings from a Git repository.
|
||||||
|
# Parameters: $1 (required) - Repository URL, $2 (required) - Repository version, $3 (required) - Project directory, $4 (required) - Script to run (including any arguments).
|
||||||
|
install_git_project() {
|
||||||
|
local repo_url="$1"
|
||||||
|
local repo_version="$2"
|
||||||
|
local project_dir="$3"
|
||||||
|
local script="$4"
|
||||||
|
|
||||||
|
git clone "$repo_url"
|
||||||
|
(
|
||||||
|
cd "$project_dir"
|
||||||
|
git -c advice.detachedHead=false checkout "$repo_version"
|
||||||
|
eval "$script"
|
||||||
|
)
|
||||||
|
rm -rf "$project_dir"
|
||||||
|
}
|
||||||
|
export -f install_git_project
|
||||||
|
|
||||||
|
# Installs Homebrew.
|
||||||
|
# Parameters: None.
|
||||||
|
install_homebrew() {
|
||||||
|
if ! command -v brew > /dev/null; then
|
||||||
|
/bin/bash -c "$(curl --location --fail --silent --show-error https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
export -f install_homebrew
|
||||||
|
|
||||||
|
# Installs a package via a zip file.
|
||||||
|
# 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 work_file="$app_name.pkg"
|
||||||
|
|
||||||
|
if [[ ! -e "$install_path" ]]; then
|
||||||
|
download_file "$url" "$work_file"
|
||||||
|
install_pkg "$MAC_OS_WORK_PATH" "$app_name"
|
||||||
|
printf "Installed: $app_name.\n"
|
||||||
|
verify_application "$app_name"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
export -f install_bare_pkg
|
||||||
|
|
||||||
|
# Installs a package.
|
||||||
|
# Parameters: $1 (required) - Package source path, $2 (required) - Application name.
|
||||||
|
install_pkg() {
|
||||||
|
local install_root=$(get_install_root "$2")
|
||||||
|
|
||||||
|
printf "Installing: $install_root/$2...\n"
|
||||||
|
local package=$(sudo find "$1" -maxdepth 1 -type f -name "*.pkg" -o -name "*.mpkg")
|
||||||
|
sudo installer -pkg "$package" -target /
|
||||||
|
}
|
||||||
|
export -f install_pkg
|
||||||
|
|
||||||
|
# Installs program (single file).
|
||||||
|
# Parameters: $1 (required) - URL, $2 (required) - Program name.
|
||||||
|
install_program() {
|
||||||
|
local url="$1"
|
||||||
|
local program_name="$2"
|
||||||
|
local install_path=$(get_install_path "$program_name")
|
||||||
|
|
||||||
|
if [[ ! -e "$install_path" ]]; then
|
||||||
|
download_file "$url" "$program_name"
|
||||||
|
mv "$MAC_OS_WORK_PATH/$program_name" "$install_path"
|
||||||
|
chmod 755 "$install_path"
|
||||||
|
printf "Installed: $program_name.\n"
|
||||||
|
verify_application "$program_name"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
export -f install_program
|
||||||
|
|
||||||
|
# Installs Ruby.
|
||||||
|
# Parameters: None.
|
||||||
|
install_ruby() {
|
||||||
|
local version="$(cat $HOME/.ruby-version | tr -d '\n')"
|
||||||
|
|
||||||
|
if [[ ! -x "$(command -v ruby)" && -n $(ruby --version | grep --quiet "$version") ]]; then
|
||||||
|
$(get_homebrew_bin_root)/ruby-install "ruby-$version"
|
||||||
|
chruby "$version"
|
||||||
|
gem update --system && gem update
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
export -f install_ruby
|
||||||
|
|
||||||
|
# Installs Rust.
|
||||||
|
# Parameters: None.
|
||||||
|
install_rust() {
|
||||||
|
if ! command -v cargo > /dev/null; then
|
||||||
|
curl --proto "=https" --tlsv1.2 --fail --silent --show-error https://sh.rustup.rs | sh
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
export -f install_rust
|
||||||
|
|
||||||
|
# Installs an application via a tar file.
|
||||||
|
# Parameters: $1 (required) - URL, $2 (required) - Application name, $3 (required) - Decompress options.
|
||||||
|
install_tar_app() {
|
||||||
|
local url="$1"
|
||||||
|
local app_name="$2"
|
||||||
|
local options="$3"
|
||||||
|
local install_path=$(get_install_path "$app_name")
|
||||||
|
local work_file="download.tar"
|
||||||
|
|
||||||
|
if [[ ! -e "$install_path" ]]; then
|
||||||
|
download_file "$url" "$work_file"
|
||||||
|
|
||||||
|
(
|
||||||
|
printf "Preparing...\n"
|
||||||
|
cd "$MAC_OS_WORK_PATH"
|
||||||
|
tar "$options" "$work_file"
|
||||||
|
)
|
||||||
|
|
||||||
|
install_app "$MAC_OS_WORK_PATH" "$app_name"
|
||||||
|
printf "Installed: $app_name.\n"
|
||||||
|
verify_application "$app_name"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
export -f install_tar_app
|
||||||
|
|
||||||
# Installs an application via a zip file.
|
# Installs an application via a zip file.
|
||||||
# Parameters: $1 (required) - URL, $2 (required) - Application name.
|
# Parameters: $1 (required) - URL, $2 (required) - Application name.
|
||||||
install_zip_app() {
|
install_zip_app() {
|
||||||
@@ -90,152 +284,6 @@ install_zip_pkg() {
|
|||||||
}
|
}
|
||||||
export -f install_zip_pkg
|
export -f install_zip_pkg
|
||||||
|
|
||||||
# Installs an application via a tar file.
|
|
||||||
# Parameters: $1 (required) - URL, $2 (required) - Application name, $3 (required) - Decompress options.
|
|
||||||
install_tar_app() {
|
|
||||||
local url="$1"
|
|
||||||
local app_name="$2"
|
|
||||||
local options="$3"
|
|
||||||
local install_path=$(get_install_path "$app_name")
|
|
||||||
local work_file="download.tar"
|
|
||||||
|
|
||||||
if [[ ! -e "$install_path" ]]; then
|
|
||||||
download_file "$url" "$work_file"
|
|
||||||
|
|
||||||
(
|
|
||||||
printf "Preparing...\n"
|
|
||||||
cd "$MAC_OS_WORK_PATH"
|
|
||||||
tar "$options" "$work_file"
|
|
||||||
)
|
|
||||||
|
|
||||||
install_app "$MAC_OS_WORK_PATH" "$app_name"
|
|
||||||
printf "Installed: $app_name.\n"
|
|
||||||
verify_application "$app_name"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
export -f install_tar_app
|
|
||||||
|
|
||||||
# Installs program (single file).
|
|
||||||
# Parameters: $1 (required) - URL, $2 (required) - Program name.
|
|
||||||
install_program() {
|
|
||||||
local url="$1"
|
|
||||||
local program_name="$2"
|
|
||||||
local install_path=$(get_install_path "$program_name")
|
|
||||||
|
|
||||||
if [[ ! -e "$install_path" ]]; then
|
|
||||||
download_file "$url" "$program_name"
|
|
||||||
mv "$MAC_OS_WORK_PATH/$program_name" "$install_path"
|
|
||||||
chmod 755 "$install_path"
|
|
||||||
printf "Installed: $program_name.\n"
|
|
||||||
verify_application "$program_name"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
export -f install_program
|
|
||||||
|
|
||||||
# Installs application code from a Git repository.
|
|
||||||
# Parameters: $1 (required) - Repository URL, $2 (required) - Install path, $3 (optional) - Git clone options.
|
|
||||||
install_git_app() {
|
|
||||||
local repository_url="$1"
|
|
||||||
local app_name=$(get_file_name "$2")
|
|
||||||
local install_path="$2"
|
|
||||||
local options="--quiet"
|
|
||||||
|
|
||||||
if [[ -n "$3" ]]; then
|
|
||||||
local options="$options $3"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ ! -e "$install_path" ]]; then
|
|
||||||
printf "Installing: $install_path/$app_name...\n"
|
|
||||||
git clone $options "$repository_url" "$install_path"
|
|
||||||
printf "Installed: $app_name.\n"
|
|
||||||
verify_path "$install_path"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
export -f install_git_app
|
|
||||||
|
|
||||||
# Installs settings from a Git repository.
|
|
||||||
# Parameters: $1 (required) - Repository URL, $2 (required) - Repository version, $3 (required) - Project directory, $4 (required) - Script to run (including any arguments).
|
|
||||||
install_git_project() {
|
|
||||||
local repo_url="$1"
|
|
||||||
local repo_version="$2"
|
|
||||||
local project_dir="$3"
|
|
||||||
local script="$4"
|
|
||||||
|
|
||||||
git clone "$repo_url"
|
|
||||||
(
|
|
||||||
cd "$project_dir"
|
|
||||||
git -c advice.detachedHead=false checkout "$repo_version"
|
|
||||||
eval "$script"
|
|
||||||
)
|
|
||||||
rm -rf "$project_dir"
|
|
||||||
}
|
|
||||||
export -f install_git_project
|
|
||||||
|
|
||||||
# Installs a single file.
|
|
||||||
# Parameters: $1 (required) - URL, $2 (required) - Install path.
|
|
||||||
install_file() {
|
|
||||||
local file_url="$1"
|
|
||||||
local file_name=$(get_file_name "$1")
|
|
||||||
local install_path="$2"
|
|
||||||
|
|
||||||
if [[ ! -e "$install_path" ]]; then
|
|
||||||
download_file "$file_url" "$file_name"
|
|
||||||
mkdir -p $(dirname "$install_path")
|
|
||||||
mv "$MAC_OS_WORK_PATH/$file_name" "$install_path"
|
|
||||||
printf "Installed: $file_name.\n"
|
|
||||||
verify_path "$install_path"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
export -f install_file
|
|
||||||
|
|
||||||
# Downloads remote file to local disk.
|
|
||||||
# Parameters: $1 (required) - URL, $2 (required) - File name, $3 (optional) - HTTP header.
|
|
||||||
download_file() {
|
|
||||||
local url="$1"
|
|
||||||
local file_name="$2"
|
|
||||||
local http_header="$3"
|
|
||||||
|
|
||||||
printf "%s\n" "Downloading $1..."
|
|
||||||
clean_work_path
|
|
||||||
mkdir $MAC_OS_WORK_PATH
|
|
||||||
curl --header "$http_header" --location --retry 3 --retry-delay 5 --fail --silent --show-error "$url" >> "$MAC_OS_WORK_PATH/$file_name"
|
|
||||||
}
|
|
||||||
export -f download_file
|
|
||||||
|
|
||||||
# Installs an application.
|
|
||||||
# Parameters: $1 (required) - Application source path, $2 (required) - Application name.
|
|
||||||
install_app() {
|
|
||||||
local install_root=$(get_install_root "$2")
|
|
||||||
local file_extension=$(get_file_extension "$2")
|
|
||||||
|
|
||||||
printf "Installing: $install_root/$2...\n"
|
|
||||||
|
|
||||||
case $file_extension in
|
|
||||||
'')
|
|
||||||
cp -a "$1/$2" "$install_root";;
|
|
||||||
'app')
|
|
||||||
cp -a "$1/$2" "$install_root";;
|
|
||||||
'prefPane')
|
|
||||||
sudo cp -pR "$1/$2" "$install_root";;
|
|
||||||
'qlgenerator')
|
|
||||||
sudo cp -pR "$1/$2" "$install_root" && qlmanage -r;;
|
|
||||||
*)
|
|
||||||
printf "ERROR: Unknown file extension: $file_extension.\n"
|
|
||||||
esac
|
|
||||||
}
|
|
||||||
export -f install_app
|
|
||||||
|
|
||||||
# Installs a package.
|
|
||||||
# Parameters: $1 (required) - Package source path, $2 (required) - Application name.
|
|
||||||
install_pkg() {
|
|
||||||
local install_root=$(get_install_root "$2")
|
|
||||||
|
|
||||||
printf "Installing: $install_root/$2...\n"
|
|
||||||
local package=$(sudo find "$1" -maxdepth 1 -type f -name "*.pkg" -o -name "*.mpkg")
|
|
||||||
sudo installer -pkg "$package" -target /
|
|
||||||
}
|
|
||||||
export -f install_pkg
|
|
||||||
|
|
||||||
# Mounts a disk image.
|
# Mounts a disk image.
|
||||||
# Parameters: $1 (required) - Image path.
|
# Parameters: $1 (required) - Image path.
|
||||||
mount_image() {
|
mount_image() {
|
||||||
|
|||||||
@@ -22,10 +22,18 @@ process_option() {
|
|||||||
bin/install_applications;;
|
bin/install_applications;;
|
||||||
'x')
|
'x')
|
||||||
bin/install_extensions;;
|
bin/install_extensions;;
|
||||||
|
'df')
|
||||||
|
bin/install_dotfiles;;
|
||||||
|
'np')
|
||||||
|
bin/install_node_packages;;
|
||||||
|
'rg')
|
||||||
|
bin/install_ruby_gems;;
|
||||||
|
'rc')
|
||||||
|
bin/install_rust_crates;;
|
||||||
'd')
|
'd')
|
||||||
bin/apply_default_settings;;
|
bin/apply_default_settings;;
|
||||||
's')
|
'cs')
|
||||||
bin/setup_software;;
|
bin/configure_software;;
|
||||||
'i')
|
'i')
|
||||||
caffeinate_machine
|
caffeinate_machine
|
||||||
bin/apply_basic_settings
|
bin/apply_basic_settings
|
||||||
@@ -35,17 +43,25 @@ process_option() {
|
|||||||
bin/install_app_store
|
bin/install_app_store
|
||||||
bin/install_applications
|
bin/install_applications
|
||||||
bin/install_extensions
|
bin/install_extensions
|
||||||
|
bin/install_dotfiles
|
||||||
|
bin/install_node_packages
|
||||||
|
bin/install_ruby_gems
|
||||||
|
bin/install_rust_crates
|
||||||
bin/apply_default_settings
|
bin/apply_default_settings
|
||||||
bin/setup_software
|
bin/configure_software
|
||||||
clean_work_path;;
|
clean_work_path;;
|
||||||
'R')
|
'R')
|
||||||
|
caffeinate_machine
|
||||||
bin/restore_backup;;
|
bin/restore_backup;;
|
||||||
'c')
|
'c')
|
||||||
verify_homebrew_formulas
|
verify_homebrew_formulas
|
||||||
verify_homebrew_casks
|
verify_homebrew_casks
|
||||||
verify_app_store_applications
|
verify_app_store_applications
|
||||||
verify_applications
|
verify_applications
|
||||||
verify_extensions;;
|
verify_extensions
|
||||||
|
verify_node_packages
|
||||||
|
verify_ruby_gems
|
||||||
|
verify_rust_crates;;
|
||||||
'C')
|
'C')
|
||||||
caffeinate_machine;;
|
caffeinate_machine;;
|
||||||
'ua')
|
'ua')
|
||||||
|
|||||||
@@ -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 Catalina.app/Contents/Resources/createinstallmedia"
|
export MAC_OS_BOOT_DISK_CREATOR="/Applications/Install macOS Big Sur.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"
|
||||||
|
|||||||
137
lib/utilities.sh
137
lib/utilities.sh
@@ -2,6 +2,68 @@
|
|||||||
|
|
||||||
# Defines general utility functions.
|
# Defines general utility functions.
|
||||||
|
|
||||||
|
# Caffeinate machine.
|
||||||
|
caffeinate_machine() {
|
||||||
|
local pid=$(pgrep -x caffeinate)
|
||||||
|
|
||||||
|
if [[ -n "$pid" ]]; then
|
||||||
|
printf "Machine is already caffeinated!\n"
|
||||||
|
else
|
||||||
|
caffeinate -s -u -d -i -t 3153600000 > /dev/null &
|
||||||
|
printf "Machine caffeinated.\n"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
export -f caffeinate_machine
|
||||||
|
|
||||||
|
# Cleans work path for temporary processing of installs.
|
||||||
|
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.
|
||||||
|
get_basename() {
|
||||||
|
printf "${1##*/}" # Answers file or directory name.
|
||||||
|
}
|
||||||
|
export -f get_basename
|
||||||
|
|
||||||
|
# Answers the file extension.
|
||||||
|
# Parameters: $1 (required) - The file name.
|
||||||
|
get_extension() {
|
||||||
|
local name=$(get_basename "$1")
|
||||||
|
local extension="${1##*.}" # Excludes dot.
|
||||||
|
|
||||||
|
if [[ "$name" == "$extension" ]]; then
|
||||||
|
printf ''
|
||||||
|
else
|
||||||
|
printf "$extension"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
export -f get_extension
|
||||||
|
|
||||||
|
# Answers Homebrew root path.
|
||||||
|
# Parameters: None.
|
||||||
|
get_homebrew_root() {
|
||||||
|
if [[ "$(/usr/bin/arch)" == "arm64" ]]; then
|
||||||
|
printf "%s" "/opt/homebrew"
|
||||||
|
else
|
||||||
|
printf "%s" "/usr/local/Homebrew"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
export -f get_homebrew_root
|
||||||
|
|
||||||
|
# Answers Homebrew binary root path.
|
||||||
|
# Parameters: None.
|
||||||
|
get_homebrew_bin_root() {
|
||||||
|
if [[ "$(/usr/bin/arch)" == "arm64" ]]; then
|
||||||
|
printf "%s" "/opt/homebrew/bin"
|
||||||
|
else
|
||||||
|
printf "%s" "/usr/local/bin"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
export -f get_homebrew_bin_root
|
||||||
|
|
||||||
# Answers the full install path (including file name) for file name.
|
# Answers the full install path (including file name) for file name.
|
||||||
# Parameters: $1 (required) - The file name.
|
# Parameters: $1 (required) - The file name.
|
||||||
get_install_path() {
|
get_install_path() {
|
||||||
@@ -11,35 +73,22 @@ get_install_path() {
|
|||||||
}
|
}
|
||||||
export -f get_install_path
|
export -f get_install_path
|
||||||
|
|
||||||
# Cleans work path for temporary processing of installs.
|
|
||||||
clean_work_path() {
|
|
||||||
rm -rf "$MAC_OS_WORK_PATH"
|
|
||||||
}
|
|
||||||
export -f clean_work_path
|
|
||||||
|
|
||||||
# Caffeinate machine.
|
|
||||||
caffeinate_machine() {
|
|
||||||
local pid=$(pgrep -x caffeinate)
|
|
||||||
|
|
||||||
if [[ -n "$pid" ]]; then
|
|
||||||
printf "Whoa, tweaker, machine is already caffeinated!\n"
|
|
||||||
else
|
|
||||||
caffeinate -s -u -d -i -t 3153600000 > /dev/null &
|
|
||||||
printf "Machine caffeinated.\n"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
export -f caffeinate_machine
|
|
||||||
|
|
||||||
# Answers the root install path for file name.
|
# Answers the root install path for file name.
|
||||||
# Parameters: $1 (required) - The file name.
|
# Parameters: $1 (required) - The file name.
|
||||||
get_install_root() {
|
get_install_root() {
|
||||||
local file_name="$1"
|
local file_name="$1"
|
||||||
local file_extension=$(get_file_extension "$file_name")
|
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.
|
# Dynamically build the install path based on file extension.
|
||||||
case $file_extension in
|
case $file_extension in
|
||||||
'')
|
'')
|
||||||
printf "/usr/local/bin";;
|
printf "$(get_homebrew_bin_root)";;
|
||||||
'app')
|
'app')
|
||||||
printf "/Applications";;
|
printf "/Applications";;
|
||||||
'prefPane')
|
'prefPane')
|
||||||
@@ -52,23 +101,37 @@ get_install_root() {
|
|||||||
}
|
}
|
||||||
export -f get_install_root
|
export -f get_install_root
|
||||||
|
|
||||||
# Answers the file extension.
|
# Checks Yarn has been installed and exits if otherwise.
|
||||||
# Parameters: $1 (required) - The file name.
|
# Parameters: None.
|
||||||
get_file_extension() {
|
check_yarn_install() {
|
||||||
local name=$(get_file_name "$1")
|
if ! command -v yarn > /dev/null; then
|
||||||
local extension="${1##*.}" # Excludes dot.
|
printf "%s\n" "ERROR: Yarn can't be found. Please ensure Homebrew and Yarn have been installed."
|
||||||
|
exit 1
|
||||||
if [[ "$name" == "$extension" ]]; then
|
|
||||||
printf ''
|
|
||||||
else
|
|
||||||
printf "$extension"
|
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
export -f get_file_extension
|
export -f check_yarn_install
|
||||||
|
|
||||||
# Answers the file name.
|
# Checks Mac App Store (mas) CLI has been installed and exits if otherwise.
|
||||||
# Parameters: $1 (required) - The file path.
|
# Parameters: None.
|
||||||
get_file_name() {
|
check_mas_install() {
|
||||||
printf "${1##*/}" # Answers file or directory name.
|
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."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
export -f get_file_name
|
export -f check_mas_install
|
||||||
|
|
||||||
|
# Configures shell for new machines and ensures PATH is properly configured for running scripts.
|
||||||
|
# Parameters: None.
|
||||||
|
configure_environment() {
|
||||||
|
if [[ ! -s "$HOME/.bash_profile" ]]; then
|
||||||
|
printf "%s\n" "if [ -f ~/.bashrc ]; then . ~/.bashrc; fi" > "$HOME/.bash_profile"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ ! -s "$HOME/.bashrc" ]]; then
|
||||||
|
printf "%s\n" 'export PATH="/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"' > "$HOME/.bashrc"
|
||||||
|
source "$HOME/.bashrc"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
export -f configure_environment
|
||||||
|
|||||||
194
lib/verifiers.sh
194
lib/verifiers.sh
@@ -2,64 +2,6 @@
|
|||||||
|
|
||||||
# Defines verification/validation functions.
|
# Defines verification/validation functions.
|
||||||
|
|
||||||
# Checks for missing Homebrew formulas.
|
|
||||||
verify_homebrew_formulas() {
|
|
||||||
printf "Checking Homebrew formulas...\n"
|
|
||||||
|
|
||||||
local applications="$(brew list)"
|
|
||||||
|
|
||||||
while read line; do
|
|
||||||
# Skip blank or comment lines.
|
|
||||||
if [[ "$line" == "brew install"* ]]; then
|
|
||||||
local application=$(printf "$line" | awk '{print $3}')
|
|
||||||
|
|
||||||
# Exception: "gpg" is the binary but is listed as "gnugp".
|
|
||||||
if [[ "$application" == "gpg" ]]; then
|
|
||||||
application="gnupg"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Exception: "hg" is the binary but is listed as "mercurial".
|
|
||||||
if [[ "$application" == "hg" ]]; then
|
|
||||||
application="mercurial"
|
|
||||||
fi
|
|
||||||
|
|
||||||
verify_listed_application "$application" "${applications[*]}"
|
|
||||||
fi
|
|
||||||
done < "$MAC_OS_CONFIG_PATH/bin/install_homebrew_formulas"
|
|
||||||
|
|
||||||
printf "Homebrew formula check complete.\n"
|
|
||||||
}
|
|
||||||
export -f verify_homebrew_formulas
|
|
||||||
|
|
||||||
# Checks for missing Homebrew casks.
|
|
||||||
verify_homebrew_casks() {
|
|
||||||
printf "\nChecking Homebrew casks...\n"
|
|
||||||
|
|
||||||
local applications="$(brew cask list)"
|
|
||||||
|
|
||||||
while read line; do
|
|
||||||
# Skip blank or comment lines.
|
|
||||||
if [[ "$line" == "brew cask install"* ]]; then
|
|
||||||
local application=$(printf "$line" | awk '{print $4}')
|
|
||||||
|
|
||||||
# Skip: Only necessary for the purpose of licensing system preference.
|
|
||||||
if [[ "$application" == "witch" ]]; then
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Skip: Bug with Homebrew Cask as these apps never show up as installed.
|
|
||||||
if [[ "$application" == "skitch" || "$application" == "openemu" ]]; then
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
|
|
||||||
verify_listed_application "$application" "${applications[*]}"
|
|
||||||
fi
|
|
||||||
done < "$MAC_OS_CONFIG_PATH/bin/install_homebrew_casks"
|
|
||||||
|
|
||||||
printf "Homebrew cask check complete.\n"
|
|
||||||
}
|
|
||||||
export -f verify_homebrew_casks
|
|
||||||
|
|
||||||
# Checks for missing App Store applications.
|
# Checks for missing App Store applications.
|
||||||
verify_app_store_applications() {
|
verify_app_store_applications() {
|
||||||
printf "\nChecking App Store applications...\n"
|
printf "\nChecking App Store applications...\n"
|
||||||
@@ -67,7 +9,6 @@ verify_app_store_applications() {
|
|||||||
local applications="$(mas list)"
|
local applications="$(mas list)"
|
||||||
|
|
||||||
while read line; do
|
while read line; do
|
||||||
# Skip blank or comment lines.
|
|
||||||
if [[ "$line" == "mas install"* ]]; then
|
if [[ "$line" == "mas install"* ]]; then
|
||||||
local application=$(printf "$line" | awk '{print $3}')
|
local application=$(printf "$line" | awk '{print $3}')
|
||||||
verify_listed_application "$application" "${applications[*]}"
|
verify_listed_application "$application" "${applications[*]}"
|
||||||
@@ -78,17 +19,17 @@ verify_app_store_applications() {
|
|||||||
}
|
}
|
||||||
export -f verify_app_store_applications
|
export -f verify_app_store_applications
|
||||||
|
|
||||||
# Verifies listed application exists.
|
# Verifies application exists.
|
||||||
# Parameters: $1 (required) - The current application, $2 (required) - The application list.
|
# Parameters: $1 (required) - The file name.
|
||||||
verify_listed_application() {
|
verify_application() {
|
||||||
local application="$1"
|
local file_name="$1"
|
||||||
local applications="$2"
|
local install_path=$(get_install_path "$file_name")
|
||||||
|
|
||||||
if [[ "${applications[*]}" != *"$application"* ]]; then
|
if [[ ! -e "$install_path" ]]; then
|
||||||
printf " - Missing: $application\n"
|
printf " - Missing: $file_name\n"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
export -f verify_listed_application
|
export -f verify_application
|
||||||
|
|
||||||
# Checks for missing applications suffixed by "APP_NAME" as defined in settings.sh.
|
# Checks for missing applications suffixed by "APP_NAME" as defined in settings.sh.
|
||||||
verify_applications() {
|
verify_applications() {
|
||||||
@@ -99,7 +40,6 @@ verify_applications() {
|
|||||||
|
|
||||||
# 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
|
||||||
# Pass the key value to verfication.
|
|
||||||
verify_application "${!name}"
|
verify_application "${!name}"
|
||||||
done
|
done
|
||||||
|
|
||||||
@@ -107,20 +47,6 @@ verify_applications() {
|
|||||||
}
|
}
|
||||||
export -f verify_applications
|
export -f verify_applications
|
||||||
|
|
||||||
# Verifies application exists.
|
|
||||||
# Parameters: $1 (required) - The file name.
|
|
||||||
verify_application() {
|
|
||||||
local file_name="$1"
|
|
||||||
|
|
||||||
# Display the missing install if not found.
|
|
||||||
local install_path=$(get_install_path "$file_name")
|
|
||||||
|
|
||||||
if [[ ! -e "$install_path" ]]; then
|
|
||||||
printf " - Missing: $file_name\n"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
export -f verify_application
|
|
||||||
|
|
||||||
# Checks for missing extensions suffixed by "EXTENSION_PATH" as defined in settings.sh.
|
# Checks for missing extensions suffixed by "EXTENSION_PATH" as defined in settings.sh.
|
||||||
verify_extensions() {
|
verify_extensions() {
|
||||||
printf "\nChecking application extensions...\n"
|
printf "\nChecking application extensions...\n"
|
||||||
@@ -138,14 +64,116 @@ verify_extensions() {
|
|||||||
}
|
}
|
||||||
export -f verify_extensions
|
export -f verify_extensions
|
||||||
|
|
||||||
|
# Checks for missing Homebrew casks.
|
||||||
|
verify_homebrew_casks() {
|
||||||
|
printf "\nChecking Homebrew casks...\n"
|
||||||
|
|
||||||
|
local applications="$(brew list --casks)"
|
||||||
|
|
||||||
|
while read line; do
|
||||||
|
if [[ "$line" == "brew cask install"* ]]; then
|
||||||
|
local application=$(printf "$line" | awk '{print $4}')
|
||||||
|
verify_listed_application "$application" "${applications[*]}"
|
||||||
|
fi
|
||||||
|
done < "$MAC_OS_CONFIG_PATH/bin/install_homebrew_casks"
|
||||||
|
|
||||||
|
printf "Homebrew cask check complete.\n"
|
||||||
|
}
|
||||||
|
export -f verify_homebrew_casks
|
||||||
|
|
||||||
|
# Checks for missing Homebrew formulas.
|
||||||
|
verify_homebrew_formulas() {
|
||||||
|
printf "Checking Homebrew formulas...\n"
|
||||||
|
|
||||||
|
local applications="$(brew list --formulae)"
|
||||||
|
|
||||||
|
while read line; do
|
||||||
|
if [[ "$line" == "brew install"* ]]; then
|
||||||
|
local application=$(printf "$line" | awk '{print $3}')
|
||||||
|
|
||||||
|
# Exception: "gpg" is the binary but is listed as "gnugp".
|
||||||
|
if [[ "$application" == "gpg" ]]; then
|
||||||
|
application="gnupg"
|
||||||
|
fi
|
||||||
|
|
||||||
|
verify_listed_application "$application" "${applications[*]}"
|
||||||
|
fi
|
||||||
|
done < "$MAC_OS_CONFIG_PATH/bin/install_homebrew_formulas"
|
||||||
|
|
||||||
|
printf "Homebrew formula check complete.\n"
|
||||||
|
}
|
||||||
|
export -f verify_homebrew_formulas
|
||||||
|
|
||||||
|
# Verifies listed application exists.
|
||||||
|
# Parameters: $1 (required) - The current application, $2 (required) - The application list.
|
||||||
|
verify_listed_application() {
|
||||||
|
local application="$1"
|
||||||
|
local applications="$2"
|
||||||
|
|
||||||
|
if [[ "${applications[*]}" != *"$application"* ]]; then
|
||||||
|
printf " - Missing: $application\n"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
export -f verify_listed_application
|
||||||
|
|
||||||
# Verifies path exists.
|
# Verifies path exists.
|
||||||
# Parameters: $1 (required) - The path.
|
# Parameters: $1 (required) - The path.
|
||||||
verify_path() {
|
verify_path() {
|
||||||
local path="$1"
|
local path="$1"
|
||||||
|
|
||||||
# Display the missing path if not found.
|
|
||||||
if [[ ! -e "$path" ]]; then
|
if [[ ! -e "$path" ]]; then
|
||||||
printf " - Missing: $path\n"
|
printf " - Missing: $path\n"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
export -f verify_path
|
export -f verify_path
|
||||||
|
|
||||||
|
# Checks for missing Node packages.
|
||||||
|
verify_node_packages() {
|
||||||
|
local packages=$(yarn global list --json | grep '"type":"info"')
|
||||||
|
|
||||||
|
printf "\nChecking Node packages...\n"
|
||||||
|
|
||||||
|
while read line; do
|
||||||
|
if [[ "$line" == "yarn global add"* ]]; then
|
||||||
|
local package=$(printf "$line" | awk '{print $4}')
|
||||||
|
verify_listed_application "$package" "${packages[*]}"
|
||||||
|
fi
|
||||||
|
done < "$MAC_OS_CONFIG_PATH/bin/install_node_packages"
|
||||||
|
|
||||||
|
printf "Node packages check complete.\n"
|
||||||
|
}
|
||||||
|
export -f verify_node_packages
|
||||||
|
|
||||||
|
# Checks for missing Ruby gems.
|
||||||
|
verify_ruby_gems() {
|
||||||
|
local gems="$(gem list --no-versions)"
|
||||||
|
|
||||||
|
printf "\nChecking Ruby gems...\n"
|
||||||
|
|
||||||
|
while read line; do
|
||||||
|
if [[ "$line" == "gem install"* ]]; then
|
||||||
|
local gem=$(printf "$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"
|
||||||
|
}
|
||||||
|
export -f verify_ruby_gems
|
||||||
|
|
||||||
|
# Checks for missing Rust crates.
|
||||||
|
verify_rust_crates() {
|
||||||
|
printf "\nChecking Rust crates...\n"
|
||||||
|
|
||||||
|
local crates="$(ls -A1 $HOME/.cargo/bin)"
|
||||||
|
|
||||||
|
while read line; do
|
||||||
|
if [[ "$line" == "cargo install"* ]]; then
|
||||||
|
local crate=$(printf "$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"
|
||||||
|
}
|
||||||
|
export -f verify_rust_crates
|
||||||
|
|||||||
Reference in New Issue
Block a user