Compare commits

...

39 Commits
4.1.0 ... 7.1.0

Author SHA1 Message Date
Brooke Kuhlmann
a77af9c21f Added version release notes. 2019-04-01 10:38:23 -06:00
Brooke Kuhlmann
4b7c940850 Updated to Ruby 2.6.2.
Addresses serveral bug and security fixes.

[Details](https://is.gd/lIVAFn)
2019-03-13 12:43:28 -06:00
Brooke Kuhlmann
295578875f Added XCode installer fix to troubleshooting section.
I've not experienced this yet but others have so adding to the
troubleshooting section in case it is of help.

[ci skip]
2019-03-13 07:07:24 -06:00
Brooke Kuhlmann
1ae3ae1134 Updated to Ruby 2.6.1.
Fixed major issue with `Net::Protocol::BufferedIO#write` raising
`NoMethodError` when sending large multi-byte strings.

[Details](https://is.gd/cQ8wcl).
2019-01-30 06:50:09 -07:00
Brooke Kuhlmann
d78eb3063d Added version release notes. 2019-01-01 12:16:07 -07:00
Brooke Kuhlmann
a547d061b2 Updated to Git Cop 3.0.0.
Includes enhanced support for XDG environment variables which don't
require support of additional tools like [direnv](https://direnv.net).

[Changes](https://github.com/bkuhlmann/git-cop/releases/tag/3.0.0).
2019-01-01 10:21:29 -07:00
Brooke Kuhlmann
f58f146074 Added Circle CI Bundler cache.
Speeds up the builds by pulling from the Bundler cache (when Gemfile
has not changed).
2018-12-30 10:45:52 -07:00
Brooke Kuhlmann
6c2de5a5bb Fixed Circle CI cache for Ruby version.
Was missing the checksum which would cause Ruby to be downloaded and
rebuilt each time.

The Docker image has been updated to use an unspecified version to
reduce version maintenance.

The `CI_RUBY_VERSION` environment variable was introduced to be
dynamically set based on value in the `.ruby-version` for improved
maintainability.
2018-12-30 10:01:44 -07:00
Brooke Kuhlmann
4d9ad7315d Removed download file function.
No longer used or recommended now that the `install_*` functions
consistently install applications in the correct location based on
application name.
2018-12-29 15:13:36 -07:00
Brooke Kuhlmann
a895090ca9 Fixed program installs.
Modifies and renames the original `install_file` function so it
calculates install path based on application name. This ensures
`install_program` has the same behavior as found with similar install
functions:
  - `install_dmg_app`
  - `install_dmg_pkg`
  - `install_zip_app`
  - `install_zip_pkg`
  - `install_tar_app`
2018-12-29 15:13:36 -07:00
Brooke Kuhlmann
0c7ae2ba4e Added README boot disk documentation.
Provides an additional reference for convenience when the scripts for
creating the boot disk are no longer available.
2018-12-29 14:06:03 -07:00
Brooke Kuhlmann
caa2adb45c Removed Java development tools from setup.
These tools were originally necessary for some of the Homebrew
applications to install successfully (especially Elasticsearch) but
those requirements are no longer necessary. This also reduces the setup
friction by requiring less manual work on behalf of the installer.
2018-12-29 14:06:03 -07:00
Brooke Kuhlmann
cc75094d5f Added README troubleshooting section.
Discovered this situation while wanting to rebuild a recently rebuilt
machine of the same operation system version. At first, thought the
original bootdisk was corrupted but turns out the system NVRAM/PRAM was
causing the issue.
2018-12-29 14:06:03 -07:00
Brooke Kuhlmann
d03762425a Fixed installation of apps with no extension.
Some apps are binaries packaged within a DMG, zip, etc. that have no
extension but are executable. These are meant to go in the
`/usr/local/bin` folder.

This corresponds with the code found in the `installers.sh` file (see
the `install_app` function).
2018-12-29 14:06:03 -07:00
Brooke Kuhlmann
2d58c953e1 Updated to Ruby 2.6.0.
[Changes](https://is.gd/MuTHWG).
2018-12-25 11:29:03 -07:00
Brooke Kuhlmann
bb329535c7 Added version release changes. 2018-11-01 20:01:55 -06:00
Brooke Kuhlmann
72f5fcb03e Removed unnecessary source code comments.
Reduced stating the obvious (in many cases) in order to improve
readability and reduce lines of code.
2018-10-28 13:35:51 -06:00
Brooke Kuhlmann
7da69e543f Updated to Java SE Development Kit 11.
Links to latest release of Java SE SDK.
2018-10-27 11:59:21 -06:00
Brooke Kuhlmann
0b5c5a6cd8 Updated to Ruby 2.5.3.
Fixes development packaging issues absent in Ruby 2.5.2.

[Details](https://is.gd/tYAZvF).
2018-10-21 09:47:23 -06:00
Brooke Kuhlmann
450c04e126 Updated to Ruby 2.5.2.
Includes important security patches. [Details](https://is.gd/60JxWj).
2018-10-17 12:54:37 -06:00
Brooke Kuhlmann
8305d07ffb Added version release changes. 2018-10-01 19:56:56 -06:00
Brooke Kuhlmann
ff09e25ea5 Added XCode install tip.
Helpful for first-time installers not familar with XCode. Also reduces
confusion with license window which always seems to appear behind
current window.
2018-09-30 10:34:17 -06:00
Brooke Kuhlmann
be396b9581 Updated to Java SE Development Kit 10.
Provides a link to the latest JDK.
2018-09-25 17:35:28 -06:00
Brooke Kuhlmann
6dd6d93bb8 Updated boot disk creation to macOS Mojave.
Provides support for the latest
[macOS](https://www.apple.com/macos/mojave) release.
2018-09-25 17:35:28 -06:00
Brooke Kuhlmann
98d921527c Updated to Contributor Covenant Code of Conduct 1.4.1.
The biggest change is the links all use HTTPS now. Formatting was
corrected to wrap at the 100th column as well.

[ci skip]
2018-08-12 07:10:08 -06:00
Brooke Kuhlmann
c01bdeb393 Added version release changes. 2018-08-01 19:51:36 -06:00
Brooke Kuhlmann
f6610849eb Updated Git checkout to silence detached head warnings.
Avoids displaying the following warning in the logs when checking out a
specific version of a project for install purposes:

    You are in 'detached HEAD' state. You can look around, make
    experimental changes and commit them, and you can discard any
    commits you make in this state without impacting any branches by
    performing another checkout.

    If you want to create a new branch to retain commits you create,
    you may do so (now or later) by using -b with the checkout command
    again. Example:

      git checkout -b <new-branch-name>

    HEAD is now at f836f876a178 Added version release changes.
2018-08-01 19:31:23 -06:00
Brooke Kuhlmann
d0c2335f35 Removed restorer functions.
No longer needed as these have been eclipsed by the restore from backup
functionality that uses rsync.
2018-08-01 19:31:23 -06:00
Brooke Kuhlmann
cc9fc3a2f9 Removed Java install support.
No longer used as the installer is prompted for instead.
2018-07-29 17:41:30 -06:00
Brooke Kuhlmann
023c8bbae2 Refactored function parameter documentation.
Cleaned up function documentation to be consistent with rest of
project.
2018-07-29 16:05:09 -06:00
Brooke Kuhlmann
5c12a47f11 Added App Store application verification.
Ensures all listed App Store applications are installed. Otherwise, it
lists those which are not.
2018-07-29 15:48:01 -06:00
Brooke Kuhlmann
cc1b7527fe Added Homebrew cask application verifier.
Verifies installation of Homebrew casks by ensuring installed
applications cross check against defined list.
2018-07-29 15:02:59 -06:00
Brooke Kuhlmann
2f6b385f2f Refactored library function order.
Moved primary functions above secondary functions for easier
readability.
2018-07-29 13:56:00 -06:00
Brooke Kuhlmann
6c06f7107b Fixed verification of Homebrew formulas.
The `verify_homebrew_formulas` function will no longer error when
checking Homebrew formulas due to invalid function name.
2018-07-29 13:37:36 -06:00
Brooke Kuhlmann
da81619140 Updated boot disk format documentation.
Added emphasis for using *Mac OS Extended (Journaled)* format for the
USB drive and *APFS (Encrypted)* for the main drive.
2018-07-28 18:15:39 -06:00
Brooke Kuhlmann
6c4fc52511 Updated README documentation.
Minor edits and clarifications.
2018-07-28 18:15:39 -06:00
Brooke Kuhlmann
ccb9aa8c1d Fixed Markdown ordered list numbering.
Ensures ordered lists start at one instead of zero.

[ci skip]
2018-07-20 10:30:20 -06:00
Brooke Kuhlmann
940ad7e622 Updated Semantic Versioning links to be HTTPS.
It's best to be secure by default.

[ci skip]
2018-06-30 17:10:03 -06:00
Brooke Kuhlmann
f7fb380233 Updated project changes to use semantic versions.
Keeps project changes/history labeled with consistent version labels.

[ci skip]
2018-04-01 12:43:14 -06:00
27 changed files with 465 additions and 463 deletions

View File

@@ -1 +1 @@
2.5.1
2.6.2

View File

@@ -1,4 +1,53 @@
# v4.1.0 (2018-04-01)
# 7.1.0 (2019-04-01)
- Added XCode installer fix to troubleshooting section.
- Updated to Ruby 2.6.1.
- Updated to Ruby 2.6.2.
# 7.0.0 (2019-01-01)
- Fixed Circle CI cache for Ruby version.
- Fixed installation of apps with no extension.
- Fixed program installs.
- Added Circle CI Bundler cache.
- Added README boot disk documentation.
- Added README troubleshooting section.
- Updated to Git Cop 3.0.0.
- Updated to Ruby 2.6.0.
- Removed Java development tools from setup.
- Removed download file function.
# 6.1.0 (2018-11-01)
- Updated to Java SE Development Kit 11.
- Updated to Ruby 2.5.2.
- Updated to Ruby 2.5.3.
- Removed unnecessary source code comments.
# 6.0.0 (2018-10-01)
- Added XCode install tip.
- Updated boot disk creation to macOS Mojave.
- Updated to Contributor Covenant Code of Conduct 1.4.1.
- Updated to Java SE Development Kit 10.
# 5.0.0 (2018-08-01)
- Fixed Markdown ordered list numbering.
- Fixed verification of Homebrew formulas.
- Added App Store application verification.
- Added Homebrew cask application verifier.
- Updated Git checkout to silence detached head warnings.
- Updated README documentation.
- Updated Semantic Versioning links to be HTTPS.
- Updated boot disk format documentation.
- Updated project changes to use semantic versions.
- Removed Java install support.
- Removed restorer functions.
- Refactored function parameter documentation.
- Refactored library function order.
# 4.1.0 (2018-04-01)
- Updated README license information.
- Updated README screencast tutorial.
@@ -7,14 +56,14 @@
- Updated to Ruby 2.5.1.
- Removed Patreon badge from README.
# v4.0.0 (2018-01-01)
# 4.0.0 (2018-01-01)
- Added Gemfile.lock to .gitignore.
- Updated to Apache 2.0 license.
- Updated to Ruby 2.4.3.
- Updated to Ruby 2.5.0.
# v3.1.0 (2017-11-26)
# 3.1.0 (2017-11-26)
- Updated Gemfile.lock file.
- Updated boot disk documenation to mention APFS.
@@ -23,7 +72,7 @@
- Updated to Rake 12.3.0.
- Updated to Rubocop 0.51.0.
# v3.0.0 (2017-10-01)
# 3.0.0 (2017-10-01)
- Fixed table of contents.
- Updated boot disk creation to use macOS High Sierra.
@@ -31,7 +80,7 @@
- Updated to Git Cop 1.6.0.
- Updated to Ruby 2.4.2.
# v2.2.0 (2017-07-16)
# 2.2.0 (2017-07-16)
- Added Git Cop support.
- Updated CONTRIBUTING documentation.
@@ -39,33 +88,33 @@
- Updated README headers.
- Updated gem dependencies.
# v2.1.0 (2017-04-29)
# 2.1.0 (2017-04-29)
- Fixed Java SE Development Kit install.
- Fixed install-all command
# v2.0.0 (2017-04-09)
# 2.0.0 (2017-04-09)
- Added Homebrew Casks install script.
- Updated README semantic versioning order.
- Updated contributing documentation.
- Refactored Homebrew software as Homebrew Formulas.
# v1.3.1 (2017-01-08)
# 1.3.1 (2017-01-08)
- Fixed install of zip app downloads with sub-directories.
# v1.3.0 (2017-01-01)
# 1.3.0 (2017-01-01)
- Updated README versioning documentation.
- Removed CHANGELOG.md (use CHANGES.md instead).
# v1.2.0 (2016-10-12)
# 1.2.0 (2016-10-12)
- Fixed reinstaller path issues with application and extension scripts.
- Added screencast to README.
# v1.1.0 (2016-10-11)
# 1.1.0 (2016-10-11)
- Fixed Bash script header to dynamically load correct environment.
- Fixed verification of Homebrew application installs.
@@ -73,6 +122,6 @@
- Added script hooks for unfinished custom configurations.
- Updated and clarified README documentation.
# v1.0.0 (2016-10-05)
# 1.0.0 (2016-10-05)
- Initial version.

View File

@@ -2,10 +2,11 @@
## Our Pledge
In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making
participation in our project and our community a harassment-free experience for everyone, regardless of age, body size,
disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race,
religion, or sexual identity and orientation.
In the interest of fostering an open and welcoming environment, we as contributors and maintainers
pledge to making participation in our project and our community a harassment-free experience for
everyone, regardless of age, body size, disability, ethnicity, sex characteristics, gender identity
and expression, level of experience, education, socio-economic status, nationality, personal
appearance, race, religion, or sexual identity and orientation.
## Our Standards
@@ -22,40 +23,43 @@ Examples of unacceptable behavior by participants include:
* The use of sexualized language or imagery and unwelcome sexual attention or advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic address, without explicit permission
* Publishing others' private information, such as a physical or electronic address, without explicit
permission
* Other conduct which could reasonably be considered inappropriate in a professional setting
## Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take
appropriate and fair corrective action in response to any instances of unacceptable behavior.
Project maintainers are responsible for clarifying the standards of acceptable behavior and are
expected to take appropriate and fair corrective action in response to any instances of unacceptable
behavior.
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits,
issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any
contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits,
code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or
to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate,
threatening, offensive, or harmful.
## Scope
This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the
project or its community. Examples of representing a project or community include using an official project e-mail
address, posting via an official social media account, or acting as an appointed representative at an online or offline
event. Representation of a project may be further defined and clarified by project maintainers.
This Code of Conduct applies both within project spaces and in public spaces when an individual is
representing the project or its community. Examples of representing a project or community include
using an official project e-mail address, posting via an official social media account, or acting as
an appointed representative at an online or offline event. Representation of a project may be
further defined and clarified by project maintainers.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at
[brooke@alchemists.io](mailto:brooke@alchemists.io). All complaints will be reviewed and investigated and will result in
a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain
confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be
posted separately.
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting
the project team at [Brooke Kuhlmann](mailto:brooke@alchemists.io). All complaints will be reviewed
and investigated and will result in a response that is deemed necessary and appropriate to the
circumstances. The project team is obligated to maintain confidentiality with regard to the reporter
of an incident. Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent
repercussions as determined by other members of the project's leadership.
Project maintainers who do not follow or enforce the Code of Conduct in good faith may face
temporary or permanent repercussions as determined by other members of the project's leadership.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
available at [http://contributor-covenant.org/version/1/4][version]
available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
[homepage]: http://contributor-covenant.org
[version]: http://contributor-covenant.org/version/1/4/
[homepage]: https://www.contributor-covenant.org

View File

@@ -5,15 +5,15 @@ appreciated. The following sections detail what you need to know in order to con
## Code
0. Read the project README before starting.
0. Fork the `master` branch of this repository and clone the fork locally.
0. Ensure there are no setup, usage, and/or test issues.
0. Add tests for new functionality and ensure they pass.
0. Submit a pull request, follow the instructions it provides, and ensure the build passes.
1. Read the project README before starting.
1. Fork the `master` branch of this repository and clone the fork locally.
1. Ensure there are no setup, usage, and/or test issues.
1. Add tests for new functionality and ensure they pass.
1. Submit a pull request, follow the instructions it provides, and ensure the build passes.
## Issues
0. Submit an issue via the GitHub Issues tab (assuming one does not
- Submit an issue via the GitHub Issues tab (assuming one does not
already exist) and follow the instructions it provides.
## Feedback

View File

@@ -3,4 +3,4 @@
source "https://rubygems.org"
gem "rake", "~> 12.0"
gem "git-cop", "~> 2.2"
gem "git-cop", "~> 3.0"

View File

@@ -11,7 +11,7 @@ project is an opinionated configuration which meets the needs of my development
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) - Foundation and framework for building customizated macOS machine
- **macOS** (this project) - The foundation framework for building customizated macOS machine
setups.
- **[macOS Configuration](https://github.com/bkuhlmann/mac_os-config)** - The layer on top of this
*macOS* project which defines a custom machine setup and base implementation. The project is meant
@@ -26,7 +26,9 @@ the two projects are meant to be used:
- [Requirements](#requirements)
- [Setup](#setup)
- [Usage](#usage)
- [Boot Disk](#boot-disk)
- [Customization](#customization)
- [Troubleshooting](#troubleshooting)
- [Versioning](#versioning)
- [Code of Conduct](#code-of-conduct)
- [Contributions](#contributions)
@@ -38,13 +40,10 @@ the two projects are meant to be used:
## Features
- 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.
- Supports macOS boot disk creation for setting up a machine with a fresh install of the operation
system.
- Downloads and installs development tools (required by Homebrew):
- [Xcode Command Line Tools](https://developer.apple.com/xcode)
- [Java SE Development Kit](http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html)
- Supports macOS boot disk creation for fresh install of operating system.
- Downloads and installs [Xcode Command Line Tools](https://developer.apple.com/xcode).
- Downloads, installs, and configures [Homebrew Formulas](http://brew.sh).
- Downloads, installs, and configures [Homebrew Casks](https://caskroom.github.io).
- Downloads, installs, and configures
@@ -61,8 +60,8 @@ the two projects are meant to be used:
## Requirements
0. [macOS High Sierra](https://www.apple.com/macos) (with latest software updates applied)
0. [Xcode](https://developer.apple.com/xcode) (with accepted license agreement)
1. [macOS Mojave](https://www.apple.com/macos) (with latest software updates applied)
1. [Xcode](https://developer.apple.com/xcode) (with accepted license agreement)
## Setup
@@ -73,7 +72,7 @@ Current Version (stable):
git clone https://github.com/bkuhlmann/mac_os.git
cd mac_os
git checkout 4.1.0
git checkout 7.1.0
Master Version (unstable):
@@ -82,11 +81,11 @@ Master Version (unstable):
## Usage
Run the following script:
Run the following:
bin/run
You will be presented with the following options:
You will be presented with the following options (listed in order of use):
Boot:
B: Create boot disk.
@@ -113,12 +112,12 @@ You will be presented with the following options:
w: Clean work (temp) directory.
q: Quit/Exit.
Choose option `i` to run all install options or select a specific option to run a single option.
Each option is designed to be re-run if necessary. This can also be handy for performing upgrades,
Choose option `i` to run a full install or select a specific option to run a single action. Each
option is designed to be re-run if necessary. This can also be handy for performing upgrades,
re-running a missing/failed install, etc.
The option prompt can be skipped by passing the desired option directly to the `bin/run` script. For
example, executing `bin/run i` will execute the complete software install process.
example, executing `bin/run i` will execute the full install process.
The machine should be rebooted after all install tasks have completed to ensure all settings have
been loaded.
@@ -126,29 +125,50 @@ been loaded.
It is recommended that the `mac_os` project directory not be deleted and kept on the local machine
in order to manage installed software and benefit from future upgrades.
### Boot Disk
When attempting to create a boot disk via `bin/run B`, you'll be presented with the following
documentation (provided here for reference):
macOS Boot Disk Tips
- Use a USB drive (8GB or higher).
- Use Disk Utility to format the USB drive as "Mac OS Extended (Journaled)".
- Use Disk Utility to label the USB drive as "Untitled".
macOS Boot Disk Usage:
1. Insert the USB boot disk into the machine to be upgraded.
2. Reboot the machine.
3. Hold down the OPTION key before the Apple logo appears.
4. Select the USB boot disk from the menu.
5. Use Disk Utility to format the machine's drive as "APFS (Encrypted)".
6. Install the new operating system.
macOS Reinstall:
1. Click the Apple icon from the operating system main menu.
2. Select the "Restart..." menu option.
3. Hold down the COMMAND+R keys before the Apple logo appears.
4. Wait for the macOS installer to load from the recovery partition.
5. Use the dialog options to launch Disk Utility, reinstall the system, etc.
### Customization
All executable scripts can be found in the `bin` folder:
- `bin/apply_basic_settings`: Applies basic, initial, settings for setting up a machine. *This is
meant to be customized.*
- `bin/apply_default_settings`: Applies useful system and application defaults. *This is meant to be
- `bin/apply_basic_settings`: Applies basic, initial, settings for setting up a machine. *Can be
customized.*
- `bin/apply_default_settings`: Applies useful system and application defaults. *Can be customized.*
- `bin/create_boot_disk`: Creates macOS boot disk.
- `bin/install_app_store`: Installs macOS, GUI-based, App Store applications. *This is meant to be
- `bin/install_app_store`: Installs macOS, GUI-based, App Store applications. *Can be customized.*
- `bin/install_applications`: Installs macOS, GUI-based, non-App Store applications. *Can be
customized.*
- `bin/install_applications`: Installs macOS, GUI-based, non-App Store applications. *This is meant
to be customized.*
- `bin/install_dev_tools`: Installs macOS development tools required by Homebrew.
- `bin/install_extensions`: Installs macOS application extensions and add-ons. *This is meant to be
customized.*
- `bin/install_homebrew_casks`: Installs Homebrew Formulas. *This is meant to be customized.*
- `bin/install_homebrew_formulas`: Installs Homebrew Casks. *This is meant to be customized.*
- `bin/restore_backup`: Restores system/application settings from backup image. *This is meant to be
customized.*
- `bin/install_extensions`: Installs macOS application extensions and add-ons. *Can be customized.*
- `bin/install_homebrew_casks`: Installs Homebrew Formulas. *Can be customized.*
- `bin/install_homebrew_formulas`: Installs Homebrew Casks. *Can be customized.*
- `bin/restore_backup`: Restores system/application settings from backup image. *Can be customized.*
- `bin/run`: The main script and interface for macOS setup.
- `bin/setup_software`: Configures and launches (if necessary) installed software. *This is meant to
be customized.*
- `bin/setup_software`: Configures and launches (if necessary) installed software. *Can be
customized.*
The `lib` folder provides the base framework for installing, re-installing, and uninstalling
software. Everything provided via the [macOS Config](https://github.com/bkuhlmann/mac_os-config)
@@ -157,9 +177,26 @@ project is built upon the functions found in the `lib` folder. See the
- `lib/settings.sh`: Defines global settings for software applications, extensions, etc.
## Troubleshooting
- When using the boot disk, you might experience a situation where you see a black screen with a
white circle and diagonal line running through it. This means macOS lost or can't find the boot
disk for some reason. To correct this, shut down and boot up the system again while holding down
the `OPTION+COMMAND+R+P` keys simultaneously. You might want to wait for the system boot sound to
happen a few times before releasing the keys. This will clear the system NVRAM/PRAM. At this point
you can shut down and restart the system following the boot disk instructions (the boot disk will
be recognized now).
- 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
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:
`/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
`/Library/Developer/CommandLineTools/Packages` folder.
## Versioning
Read [Semantic Versioning](http://semver.org) for details. Briefly, it means:
Read [Semantic Versioning](https://semver.org) for details. Briefly, it means:
- Major (X.y.z) - Incremented for any backwards incompatible public API changes.
- Minor (x.Y.z) - Incremented for new, backwards compatible, public API enhancements/fixes.

View File

@@ -1,16 +1,13 @@
#! /usr/bin/env bash
# DESCRIPTION
# Applies basic system settings.
# SETTINGS
set -o nounset
set -o errexit
set -o pipefail
IFS=$'\n\t'
SCRIPT_PATH="$MAC_OS_CONFIG_PATH/bin/apply_basic_settings"
# EXECUTION
if [[ -x "$SCRIPT_PATH" ]]; then
"$SCRIPT_PATH"
else

View File

@@ -1,16 +1,13 @@
#! /usr/bin/env bash
# DESCRIPTION
# Applies default settings.
# SETTINGS
set -o nounset
set -o errexit
set -o pipefail
IFS=$'\n\t'
SCRIPT_PATH="$MAC_OS_CONFIG_PATH/bin/apply_default_settings"
# EXECUTION
if [[ -x "$SCRIPT_PATH" ]]; then
"$SCRIPT_PATH"
else

View File

@@ -1,18 +1,17 @@
#! /usr/bin/env bash
# DESCRIPTION
# Creates macOS boot disk.
# EXECUTION
printf "macOS Boot Disk Tips\n"
printf " - Use a USB drive (8GB or higher is best).\n"
printf " - Use Disk Utility to format the USB drive (Use \"Untitled\" for the label).\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 down the OPTION key before the Apple logo appears.\n"
printf " 4. Select the USB boot disk from the menu.\n"
printf " 5. Format the machine's internal drive using Disk Utility (choose APFS).\n"
printf " 5. Use Disk Utility to format the machine's drive as \"APFS (Encrypted)\".\n"
printf " 6. Install the new operating system.\n"
printf "\nmacOS Reinstall:\n"
printf " 1. Click the Apple icon from the operating system main menu.\n"
@@ -23,8 +22,8 @@ printf " 5. Use the dialog options to launch Disk Utility, reinstall the system
printf "\nCreating macOS boot disk...\n"
if [[ ! -d "$MAC_OS_INSTALLER_PATH" ]]; then
printf "ERROR: macOS installer does not exist: $MAC_OS_INSTALLER_PATH. Use the App Store to download.\n"
if [[ ! -e "$MAC_OS_BOOT_DISK_CREATOR" ]]; then
printf "ERROR: macOS installer does not exist: $MAC_OS_BOOT_DISK_CREATOR. Use App Store to download.\n"
exit 1
fi
@@ -33,4 +32,4 @@ if [[ ! -d "$MAC_OS_BOOT_DISK_PATH" ]]; then
exit 1
fi
sudo "$MAC_OS_BOOT_DISK_CREATOR" --volume "$MAC_OS_BOOT_DISK_PATH" --applicationpath "$MAC_OS_INSTALLER_PATH" --nointeraction
sudo "$MAC_OS_BOOT_DISK_CREATOR" --volume "$MAC_OS_BOOT_DISK_PATH" --downloadassets --nointeraction

View File

@@ -1,16 +1,13 @@
#! /usr/bin/env bash
# DESCRIPTION
# Installs App Store software.
# SETTINGS
set -o nounset
set -o errexit
set -o pipefail
IFS=$'\n\t'
SCRIPT_PATH="$MAC_OS_CONFIG_PATH/bin/install_app_store"
# EXECUTION
if [[ -x "$SCRIPT_PATH" ]]; then
"$SCRIPT_PATH"
else

View File

@@ -1,16 +1,13 @@
#! /usr/bin/env bash
# DESCRIPTION
# Installs applications.
# SETTINGS
set -o nounset
set -o errexit
set -o pipefail
IFS=$'\n\t'
SCRIPT_PATH="$MAC_OS_CONFIG_PATH/bin/install_applications"
# EXECUTION
if [[ -x "$SCRIPT_PATH" ]]; then
"$SCRIPT_PATH"
else

View File

@@ -1,23 +1,13 @@
#! /usr/bin/env bash
# DESCRIPTION
# Installs development tooling requirements.
printf "Installing Xcode CLI tools...\n"
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"
exit 1
fi
printf "Installing $JAVA_LABEL...\n"
printf "%s\n" "You must manually accept the license and download the $JAVA_LABEL: $JAVA_DOWNLOAD_URL."
open $JAVA_DOWNLOAD_URL
read -p "Have you completed the $JAVA_LABEL install (y/n)? " java_response
if [[ "$java_response" != "y" ]]; then
printf "ERROR: $JAVA_LABEL must be installed before proceeding.\n"
exit 1
fi

View File

@@ -1,16 +1,13 @@
#! /usr/bin/env bash
# DESCRIPTION
# Installs application extensions.
# SETTINGS
set -o nounset
set -o errexit
set -o pipefail
IFS=$'\n\t'
SCRIPT_PATH="$MAC_OS_CONFIG_PATH/bin/install_extensions"
# EXECUTION
if [[ -x "$SCRIPT_PATH" ]]; then
"$SCRIPT_PATH"
else

View File

@@ -1,16 +1,13 @@
#! /usr/bin/env bash
# DESCRIPTION
# Installs Homebrew Cask software.
# SETTINGS
set -o nounset
set -o errexit
set -o pipefail
IFS=$'\n\t'
SCRIPT_PATH="$MAC_OS_CONFIG_PATH/bin/install_homebrew_casks"
# EXECUTION
if [[ -x "$SCRIPT_PATH" ]]; then
"$SCRIPT_PATH"
else

View File

@@ -1,16 +1,13 @@
#! /usr/bin/env bash
# DESCRIPTION
# Installs Homebrew Formula software.
# SETTINGS
set -o nounset
set -o errexit
set -o pipefail
IFS=$'\n\t'
SCRIPT_PATH="$MAC_OS_CONFIG_PATH/bin/install_homebrew_formulas"
# EXECUTION
if [[ -x "$SCRIPT_PATH" ]]; then
"$SCRIPT_PATH"
else

View File

@@ -1,16 +1,13 @@
#! /usr/bin/env bash
# DESCRIPTION
# Performs restoration of backup data.
# SETTINGS
set -o nounset
set -o errexit
set -o pipefail
IFS=$'\n\t'
SCRIPT_PATH="$MAC_OS_CONFIG_PATH/bin/restore_backup"
# EXECUTION
if [[ -x "$SCRIPT_PATH" ]]; then
"$SCRIPT_PATH"
else

View File

@@ -1,16 +1,10 @@
#! /usr/bin/env bash
# DESCRIPTION
# Executes the command line interface.
# USAGE
# ./run.sh OPTION
# LIBRARY
source lib/installers.sh
source lib/options.sh
source lib/reinstallers.sh
source lib/restorers.sh
source lib/settings.sh
source lib/uninstallers.sh
source lib/utilities.sh
@@ -29,7 +23,6 @@ else
exit 1
fi
# EXECUTION
while true; do
if [[ $# == 0 ]]; then
printf "\nUsage: run OPTION\n"

View File

@@ -1,16 +1,13 @@
#! /usr/bin/env bash
# DESCRIPTION
# Sets up and launches (if necessary) installed software.
# SETTINGS
set -o nounset
set -o errexit
set -o pipefail
IFS=$'\n\t'
SCRIPT_PATH="$MAC_OS_CONFIG_PATH/bin/setup_software"
# EXECUTION
if [[ -x "$SCRIPT_PATH" ]]; then
"$SCRIPT_PATH"
else

View File

@@ -3,7 +3,7 @@ jobs:
build:
working_directory: ~/project
docker:
- image: circleci/ruby:2.5
- image: circleci/ruby
environment:
BUNDLE_JOBS: 3
BUNDLE_RETRY: 3
@@ -12,19 +12,47 @@ jobs:
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: Bundler Cache Restore
key: bundle-{{ checksum "Gemfile" }}
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 check || bundle install
bundle install --path vendor/bundle
- type: cache-save
name: Bundler Cache Store
key: bundle-{{ checksum "Gemfile" }}
name: Bundler Store
key: bundler-{{checksum "Gemfile"}}
paths:
- vendor/bundle

View File

@@ -1,149 +1,19 @@
#! /usr/bin/env bash
# DESCRIPTION
# Defines software installer functions.
# Mounts a disk image.
# Parameters:
# $1 = The image path.
mount_image() {
printf "Mounting image...\n"
hdiutil attach -quiet -nobrowse -noautoopen "$1"
}
export -f mount_image
# Unmounts a disk image.
# Parameters:
# $1 = The mount path.
unmount_image() {
printf "Unmounting image...\n"
hdiutil detach -force "$1"
}
export -f unmount_image
# Downloads an installer to local disk.
# Parameters:
# $1 = The URL.
# $2 = The file name.
# $3 = The HTTP header.
download_installer() {
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_installer
# Downloads an installer to the $HOME/Downloads folder for manual use.
# Parameters:
# $1 = The URL.
# $2 = The file name.
download_only() {
if [[ -e "$HOME/Downloads/$2" ]]; then
printf "Downloaded: $2.\n"
else
printf "Downloading $1...\n"
download_installer "$1" "$2"
mv "$MAC_OS_WORK_PATH/$2" "$HOME/Downloads"
fi
}
export -f download_only
# Installs a single file.
# Parameters:
# $1 = The URL.
# $2 = The install path.
install_file() {
local file_url="$1"
local file_name=$(get_file_name "$1")
local install_path="$2"
if [[ ! -e "$install_path" ]]; then
printf "Installing: $install_path...\n"
download_installer "$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 an application.
# Parameters:
# $1 = The application source path.
# $2 = The 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
'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 = The package source path.
# $2 = The 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 Java.
# Parameters:
# $1 = The URL.
# $2 = The volume name.
install_java() {
local url="$1"
local volume_path="/Volumes/$2"
local app_name="java"
local install_path="/usr/bin/$app_name"
local download_file="download.dmg"
download_installer "$url" "$download_file" "Cookie: oraclelicense=accept-securebackup-cookie"
mount_image "$MAC_OS_WORK_PATH/$download_file"
local package=$(sudo find "$volume_path" -maxdepth 1 -type f -name "*.pkg")
sudo installer -pkg "$package" -target /
unmount_image "$volume_path"
printf "Installed: $app_name.\n"
}
export -f install_java
# Installs an application via a DMG file.
# Parameters:
# $1 = The URL.
# $2 = The mount path.
# $3 = The application name.
# 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 download_file="download.dmg"
local work_file="download.dmg"
if [[ ! -e "$install_path" ]]; then
download_installer "$url" "$download_file"
mount_image "$MAC_OS_WORK_PATH/$download_file"
download_file "$url" "$work_file"
mount_image "$MAC_OS_WORK_PATH/$work_file"
install_app "$mount_point" "$app_name"
unmount_image "$mount_point"
verify_application "$app_name"
@@ -152,20 +22,17 @@ install_dmg_app() {
export -f install_dmg_app
# Installs a package via a DMG file.
# Parameters:
# $1 = The URL.
# $2 = The mount path.
# $3 = The application name.
# 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 download_file="download.dmg"
local work_file="download.dmg"
if [[ ! -e "$install_path" ]]; then
download_installer "$url" "$download_file"
mount_image "$MAC_OS_WORK_PATH/$download_file"
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"
@@ -175,22 +42,20 @@ install_dmg_pkg() {
export -f install_dmg_pkg
# Installs an application via a zip file.
# Parameters:
# $1 = The URL.
# $2 = The application name.
# Parameters: $1 (required) - URL, $2 (required) - Application name.
install_zip_app() {
local url="$1"
local app_name="$2"
local install_path=$(get_install_path "$app_name")
local download_file="download.zip"
local work_file="download.zip"
if [[ ! -e "$install_path" ]]; then
download_installer "$url" "$download_file"
download_file "$url" "$work_file"
(
printf "Preparing...\n"
cd "$MAC_OS_WORK_PATH"
unzip -q "$download_file"
unzip -q "$work_file"
find . -type d -name "$app_name" -print -exec cp -pR {} . > /dev/null 2>&1 \;
)
@@ -201,51 +66,21 @@ install_zip_app() {
}
export -f install_zip_app
# Installs an application via a tar file.
# Parameters:
# $1 = The URL.
# $2 = The application name.
# $3 = The decompress options.
install_tar_app() {
local url="$1"
local app_name="$2"
local options="$3"
local install_path=$(get_install_path "$app_name")
local download_file="download.tar"
if [[ ! -e "$install_path" ]]; then
download_installer "$url" "$download_file"
(
printf "Preparing...\n"
cd "$MAC_OS_WORK_PATH"
tar "$options" "$download_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 a package via a zip file.
# Parameters:
# $1 = The URL.
# $2 = The application name.
# 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 download_file="download.zip"
local work_file="download.zip"
if [[ ! -e "$install_path" ]]; then
download_installer "$url" "$download_file"
download_file "$url" "$work_file"
(
printf "Preparing...\n"
cd "$MAC_OS_WORK_PATH"
unzip -q "$download_file"
unzip -q "$work_file"
)
install_pkg "$MAC_OS_WORK_PATH" "$app_name"
@@ -255,11 +90,51 @@ 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
printf "Installing: $install_path...\n"
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 = Repository URL.
# $2 = Install path.
# $3 = Git clone options (if any).
# 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")
@@ -280,11 +155,7 @@ install_git_app() {
export -f install_git_app
# Installs settings from a Git repository.
# Parameters:
# $1 = The repository URL.
# $2 = The repository version.
# $3 = The project directory.
# $4 = The script to run (including any arguments).
# 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"
@@ -294,9 +165,73 @@ install_git_project() {
git clone "$repo_url"
(
cd "$project_dir"
git checkout "$repo_version"
git -c advice.detachedHead=false checkout "$repo_version"
eval "$script"
)
rm -rf "$project_dir"
}
export -f install_git_project
# 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.
# Parameters: $1 (required) - Image path.
mount_image() {
printf "Mounting image...\n"
hdiutil attach -quiet -nobrowse -noautoopen "$1"
}
export -f mount_image
# Unmounts a disk image.
# Parameters: $1 (required) - Mount path.
unmount_image() {
printf "Unmounting image...\n"
hdiutil detach -force "$1"
}
export -f unmount_image

View File

@@ -1,11 +1,9 @@
#! /usr/bin/env bash
# DESCRIPTION
# Defines command line prompt options.
# Process option selection.
# Parameters:
# $1 = The option to process.
# Parameters: $1 (required) - The option to process.
process_option() {
case $1 in
'B')
@@ -43,7 +41,9 @@ process_option() {
'R')
bin/restore_backup;;
'c')
verify_homebrews
verify_homebrew_formulas
verify_homebrew_casks
verify_app_store_applications
verify_applications
verify_extensions;;
'C')

View File

@@ -1,6 +1,5 @@
#! /usr/bin/env bash
# DESCRIPTION
# Defines reinstall functions.
# Reinstall application.

View File

@@ -1,31 +0,0 @@
#! /usr/bin/env bash
# DESCRIPTION
# Defines software restore functions.
# Label: Restore Preference
# Description: Restores an application preference.
# Parameters: $1 (required) - The backup volume root path, $2 (required) - The preference file.
restore_preference() {
local backup_root="$1"
local preference_file="$2"
local backup_path="$backup_root/Users/$USER/Library/Preferences/$preference_file"
local restore_root="$HOME/Library/Preferences"
cp -p "$backup_path" "$restore_root"
}
export -f restore_preference
# Label: Restore Application Support
# Description: Restores application support files.
# Parameters: $1 (required) - The backup volume root path, $2 required - The application name.
restore_app_support() {
local backup_root="$1"
local app_name="$2"
local backup_path="$backup_root/Users/$USER/Library/Application Support/$app_name"
local restore_path="$HOME/Library/Application Support"
mkdir -p "$restore_path"
cp -pR "$backup_path" "$restore_path"
}
export -f restore_app_support

View File

@@ -1,22 +1,11 @@
#! /usr/bin/env bash
# DESCRIPTION
# Defines global settings.
# SETTINGS
# General
set -o nounset
set -o errexit
set -o pipefail
IFS=$'\n\t'
# Globals
export MAC_OS_BOOT_DISK_CREATOR="/Applications/Install macOS High Sierra.app/Contents/Resources/createinstallmedia"
export MAC_OS_BOOT_DISK_CREATOR="/Applications/Install macOS Mojave.app/Contents/Resources/createinstallmedia"
export MAC_OS_BOOT_DISK_PATH="/Volumes/Untitled"
export MAC_OS_INSTALLER_PATH="/Applications/Install macOS High Sierra.app"
export MAC_OS_WORK_PATH=/tmp/downloads
export MAC_OS_CONFIG_PATH="../mac_os-config"
# Java
export JAVA_LABEL="Java SE Development Kit"
export JAVA_DOWNLOAD_URL="http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html"

View File

@@ -1,6 +1,5 @@
#! /usr/bin/env bash
# DESCRIPTION
# Defines uninstall functions.
# Uninstalls selected application.

View File

@@ -1,57 +1,9 @@
#! /usr/bin/env bash
# DESCRIPTION
# Defines general utility functions.
# Answers the file name.
# Parameters:
# $1 = The file path.
get_file_name() {
printf "${1##*/}" # Answers file or directory name.
}
export -f get_file_name
# Answers the file extension.
# Parameters:
# $1 = The file name.
get_file_extension() {
local name=$(get_file_name "$1")
local extension="${1##*.}" # Excludes dot.
if [[ "$name" == "$extension" ]]; then
printf ''
else
printf "$extension"
fi
}
export -f get_file_extension
# Answers the root install path for file name.
# Parameters:
# $1 = The file name.
get_install_root() {
local file_name="$1"
local file_extension=$(get_file_extension "$file_name")
# Dynamically build the install path based on file extension.
case $file_extension in
'')
printf "/usr/local/bin";;
'app')
printf "/Applications";;
'prefPane')
printf "/Library/PreferencePanes";;
'qlgenerator')
printf "/Library/QuickLook";;
*)
printf "/tmp/unknown";;
esac
}
export -f get_install_root
# Answers the full install path (including file name) for file name.
# Parameters:
# $1 = The file name.
# Parameters: $1 (required) - The file name.
get_install_path() {
local file_name="$1"
local install_path=$(get_install_root "$file_name")
@@ -77,3 +29,46 @@ caffeinate_machine() {
fi
}
export -f caffeinate_machine
# Answers the root install path for file name.
# Parameters: $1 (required) - The file name.
get_install_root() {
local file_name="$1"
local file_extension=$(get_file_extension "$file_name")
# Dynamically build the install path based on file extension.
case $file_extension in
'')
printf "/usr/local/bin";;
'app')
printf "/Applications";;
'prefPane')
printf "/Library/PreferencePanes";;
'qlgenerator')
printf "/Library/QuickLook";;
*)
printf "/tmp/unknown";;
esac
}
export -f get_install_root
# Answers the file extension.
# Parameters: $1 (required) - The file name.
get_file_extension() {
local name=$(get_file_name "$1")
local extension="${1##*.}" # Excludes dot.
if [[ "$name" == "$extension" ]]; then
printf ''
else
printf "$extension"
fi
}
export -f get_file_extension
# Answers the file name.
# Parameters: $1 (required) - The file path.
get_file_name() {
printf "${1##*/}" # Answers file or directory name.
}
export -f get_file_name

View File

@@ -1,24 +1,10 @@
#! /usr/bin/env bash
# DESCRIPTION
# Defines verification/validation functions.
# Verifies Homebrew software exists.
# Parameters:
# $1 = The file name.
verify_homebrew() {
local application="$1"
local applications="$2"
if [[ "${applications[*]}" != *"$application"* ]]; then
printf " - Missing: $application\n"
fi
}
export -f verify_homebrew
# Checks for missing Homebrew software.
verify_homebrews() {
printf "Checking Homebrew software...\n"
# Checks for missing Homebrew formulas.
verify_homebrew_formulas() {
printf "Checking Homebrew formulas...\n"
local applications="$(brew list)"
@@ -37,28 +23,72 @@ verify_homebrews() {
application="mercurial"
fi
verify_homebrew "$application" "${applications[*]}"
verify_listed_application "$application" "${applications[*]}"
fi
done < "$MAC_OS_CONFIG_PATH/bin/install_homebrew"
done < "$MAC_OS_CONFIG_PATH/bin/install_homebrew_formulas"
printf "Homebrew check complete.\n"
printf "Homebrew formula check complete.\n"
}
export -f verify_homebrews
export -f verify_homebrew_formulas
# Verifies application exists.
# Parameters:
# $1 = The file name.
verify_application() {
local file_name="$1"
# Checks for missing Homebrew casks.
verify_homebrew_casks() {
printf "\nChecking Homebrew casks...\n"
# Display the missing install if not found.
local install_path=$(get_install_path "$file_name")
local applications="$(brew cask list)"
if [[ ! -e "$install_path" ]]; then
printf " - Missing: $file_name\n"
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.
verify_app_store_applications() {
printf "\nChecking App Store applications...\n"
local applications="$(mas list)"
while read line; do
# Skip blank or comment lines.
if [[ "$line" == "mas install"* ]]; then
local 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"
}
export -f verify_app_store_applications
# Verifies listed application exists.
# Parameters: $1 (required) - The current application, $2 (required) - The application list.
verify_listed_application() {
local application="$1"
local applications="$2"
if [[ "${applications[*]}" != *"$application"* ]]; then
printf " - Missing: $application\n"
fi
}
export -f verify_application
export -f verify_listed_application
# Checks for missing applications suffixed by "APP_NAME" as defined in settings.sh.
verify_applications() {
@@ -77,18 +107,19 @@ verify_applications() {
}
export -f verify_applications
# Verifies path exists.
# Parameters:
# $1 = The path.
verify_path() {
local path="$1"
# Verifies application exists.
# Parameters: $1 (required) - The file name.
verify_application() {
local file_name="$1"
# Display the missing path if not found.
if [[ ! -e "$path" ]]; then
printf " - Missing: $path\n"
# 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_path
export -f verify_application
# Checks for missing extensions suffixed by "EXTENSION_PATH" as defined in settings.sh.
verify_extensions() {
@@ -106,3 +137,15 @@ verify_extensions() {
printf "Application extension check complete.\n"
}
export -f verify_extensions
# Verifies path exists.
# Parameters: $1 (required) - The path.
verify_path() {
local path="$1"
# Display the missing path if not found.
if [[ ! -e "$path" ]]; then
printf " - Missing: $path\n"
fi
}
export -f verify_path