Compare commits

..

91 Commits
1.0.0 ... 7.0.0

Author SHA1 Message Date
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
Brooke Kuhlmann
c0b9be502b Added version release changes. 2018-04-01 10:56:35 -06:00
Brooke Kuhlmann
66cd8d988e Updated to Git Cop 2.2.0.
[Changes](https://is.gd/OEDYpE).
2018-04-01 09:07:07 -06:00
Brooke Kuhlmann
955af0fc9e Updated to Ruby 2.5.1.
[Details](https://is.gd/hSEMaL).
2018-03-30 17:32:36 -06:00
Brooke Kuhlmann
9730e0ce45 Updated to Circle CI 2.0.0 configuration.
Uses latest configuration version in order to not be caught off-guard
if/when they drop v1.0.0 support.

[Details](https://circleci.com/docs/2.0).
2018-01-28 07:44:33 -07:00
Brooke Kuhlmann
94373dd5e8 Updated README screencast tutorial.
Updated to use latest version of software (not that the features have
changed much).
2018-01-07 14:14:22 -07:00
Brooke Kuhlmann
87282969de Updated README license information.
Simplified the text by removing the "(c)" as the use of "Copyright" is
good enough.

[ci skip]
2018-01-06 15:00:50 -07:00
Brooke Kuhlmann
6a6286755e Removed Patreon badge from README.
No longer planning to use this service.

[ci skip]
2018-01-02 20:25:45 -07:00
Brooke Kuhlmann
5866049618 Added version release changes. 2018-01-01 14:00:44 -07:00
Brooke Kuhlmann
3cba8eaa48 Updated to Apache 2.0 license.
Out of all permissive licenses, this provides the clearest terms and
conditions.

[Details](https://choosealicense.com/licenses/apache-2.0).

[ci skip]
2017-12-31 10:17:06 -07:00
Brooke Kuhlmann
cd89faac07 Updated to Ruby 2.5.0.
[Changes](http://bit.ly/2C4KviX).
2017-12-25 06:49:05 -07:00
Brooke Kuhlmann
ea8944a1dc Updated to Ruby 2.4.3.
Fixes a `Net::FTP` security issue.

[Details](http://bit.ly/2jU2KzV).
2017-12-14 19:40:00 -07:00
Brooke Kuhlmann
1e6e9a43bd Added Gemfile.lock to .gitignore.
It's not necessary to track exact details of the gems used in this
project as they are used for build purposes only.
2017-12-10 10:18:56 -07:00
Brooke Kuhlmann
68c1ea0515 Added version release changes. 2017-11-26 15:26:28 -07:00
Brooke Kuhlmann
419fceba0c Updated boot disk documenation to mention APFS.
Aids new installs with the correct option to choose from the menu
prompt.
2017-11-26 08:59:06 -07:00
Brooke Kuhlmann
9fba750712 Updated to Rake 12.3.0.
[Changes](http://bit.ly/2AU14wd).
2017-11-18 08:53:59 -07:00
Brooke Kuhlmann
de9e9dc73e Updated Gemfile.lock file.
Was accidentally missed as part of the previous commit.
2017-11-05 17:12:04 -07:00
Brooke Kuhlmann
0f13af9692 Updated to Git Cop 1.7.0.
[Changes](http://bit.ly/2AcYDV4).
2017-11-05 17:04:03 -07:00
Brooke Kuhlmann
7133361277 Updated to Bundler 1.16.0.
[Changes](http://bit.ly/2hFrBX5).
2017-11-04 13:53:22 -06:00
Brooke Kuhlmann
bc01beac6a Updated to Rubocop 0.51.0.
[Changes](http://bit.ly/2hlepWS).

There is a bug with Rubocop 0.51.0 where the `Style/CommentedKeyword`
cop raises false positives but can be ignored until the next release of
Rubocop is issued.
2017-10-29 15:08:27 -06:00
Brooke Kuhlmann
18ff862a4a Added version release changes. 2017-10-01 15:42:33 -06:00
Brooke Kuhlmann
c6ef97a88b Updated boot disk creation to use macOS High Sierra.
Necessary to create a boot disk for the latest macOS version.
2017-10-01 11:40:24 -06:00
Brooke Kuhlmann
67a17a0113 Updated to Ruby 2.4.2.
[Details](http://bit.ly/2yfBm4I).
2017-09-16 17:34:04 -06:00
Brooke Kuhlmann
e5f2051412 Updated to Git Cop 1.6.0.
[Changes](https://github.com/bkuhlmann/git-cop/releases/tag/v1.6.0).
2017-08-27 08:49:41 -06:00
Brooke Kuhlmann
bbdedb1a56 Updated gem dependencies. 2017-08-27 08:07:13 -06:00
Brooke Kuhlmann
cd595f1bd1 Fixed table of contents.
[ci skip]
2017-08-03 20:03:41 -06:00
Brooke Kuhlmann
e89a05fcbf Updated to Git Cop 1.5.0.
[Changes](https://github.com/bkuhlmann/git-cop/releases/tag/v1.5.0).
2017-07-30 16:03:20 -06:00
Brooke Kuhlmann
048908f2ba Updated to Git Cop 1.3.0.
- [Changes](https://github.com/bkuhlmann/git-cop/releases/tag/v1.3.0).
2017-07-17 20:15:58 -06:00
Brooke Kuhlmann
cc23f2d634 Added version release changes. 2017-07-16 16:13:10 -06:00
Brooke Kuhlmann
4d85b3353f Updated gem dependencies. 2017-07-10 20:55:04 -06:00
Brooke Kuhlmann
a757ed1210 Updated GitHub templates.
- Simplified more of the process.
- Reduced what is required/optional.
- Clarified the help comments.

[ci skip]
2017-06-28 20:26:57 -06:00
Brooke Kuhlmann
2994653972 Updated CONTRIBUTING documentation.
- With code quality tools in place to automate most requirements, the
  documentation doesn't need to be as verbose.
- The documentation has been reduced to the core essentials which means
  there is less to read and no more links to follow.

[ci skip]
2017-06-25 06:45:26 -06:00
Brooke Kuhlmann
6716e687d1 Updated gem dependencies. 2017-06-24 11:58:03 -06:00
Brooke Kuhlmann
18dccd7773 Added Git Cop support.
- Ensures Git commits are consistent.
- [Details](https://github.com/bkuhlmann/git-cop).
2017-06-18 16:05:53 -06:00
Brooke Kuhlmann
88494e2ed3 Updated README headers.
- Reserve H1's for project label and H2's for top-levels for the rest
  of the document.

[ci skip]
2017-06-18 14:15:34 -06:00
Brooke Kuhlmann
87e84a658f Added version release changes. 2017-04-29 07:52:54 -06:00
Brooke Kuhlmann
949a6b9d1e Fixed Java SE Development Kit install.
- Oracle makes it difficult to download the Java SE Development Kit as
  an offline download because the license must be accepted first. The
  JDK is important to have installed as several Homebrew apps require
  it to exist first.
- This provides a prompt for checking that the Java SE Development Kit
  has been installed before proceeding as the original way of
  installing it assumed you had visited the Oracle web site and
  accepted the license.
2017-04-29 07:44:50 -06:00
Sam Wolfson
3b6137ec36 Fix install-all command
The install-all command does not reflect that the `bin/install_homebrew` file was split into `bin/install_homebrew_formulas` and `bin/install_homebrew_casks`, and therefore fails to install.
2017-04-29 06:55:32 -06:00
Brooke Kuhlmann
e1bc7e939a Added version release changes. 2017-04-09 15:51:59 -06:00
Brooke Kuhlmann
8bf0ef473d Added Homebrew Casks install script.
- Provides support for installing Homebrew Casks.
2017-02-17 19:27:37 -07:00
Brooke Kuhlmann
79f7103179 Refactored Homebrew software as Homebrew Formulas.
- Allows for expansion of additional Homebrew software in the future
  (i.e. taps, bottles, casks, etc.)
2017-02-17 19:18:02 -07:00
Brooke Kuhlmann
38fa30a028 Updated README semantic versioning order.
- It's easier to think about versions in the order of major, minor,
  and maintenance.

[ci skip]
2017-02-07 07:20:00 -07:00
Brooke Kuhlmann
a2a2820098 Updated contributing documentation.
- Simplified the documentation to be more succinct in what is required
  (especially in terms of the Style Guides and GitHub pull request and
  issue template).

[ci skip]
2017-02-05 11:26:54 -07:00
Brooke Kuhlmann
3a896882c9 Added version release changes. 2017-01-08 10:23:13 -07:00
Brooke Kuhlmann
8af0c44eba Fixed install of zip app downloads with sub-directories.
- Discovered some applications, packaged in zip file format, would
  extract to a sub-directory. This was problematic because all zip app
  installs previously assumed the app would be unzipped in the current
  directory. This fixes that situation where an app might be located in
  a sub-directory or several sub-directory deep.
- The easiest fix for this problem would have been to the `-j` option
  for *junk* paths via unzip: "The archive's directory structure is not
  recreated; all files are deposited in the extraction directory (by
  default, the current one)." ...but some zip files, when unzipped, run
  executable code that creates the sub-directory structure dynamically
  which makes the `-j` option not viable.
- The solution used to fix this problem uses `find` to determine if the
  application to install is in a sub-directory. If so, then the app is
  copied to the root folder (i.e. $MAC_OS_WORK_PATH) so the script can
  install as it has done in the past. Because the file copy is executed
  only if `find` finds something, this makes the copy optional for sub-
  directories and is a no-op for standard zip files with no sub-
  directories.

Discovered that some zip app downloads use executable scripts to
  build for the particular machine when unzipped.

http://earthlingsoft.net/UnicodeChecker/index.html
2017-01-08 10:12:20 -07:00
Brooke Kuhlmann
d9440953ac Added version release changes. 2017-01-01 15:22:20 -07:00
Brooke Kuhlmann
8528e0ff01 Removed CHANGELOG.md (use CHANGES.md instead).
- Simplifies the name since "Log" is implied and is one of the three
  common file names for this type of information: CHANGELOG.md,
  CHANGES.md, and HISTORY.md

[ci skip]
2016-10-18 14:23:38 -06:00
Brooke Kuhlmann
7db6835173 Updated README versioning documentation.
[ci skip]
2016-10-16 11:44:39 -06:00
Brooke Kuhlmann
7fc9304834 Added version release changes. 2016-10-12 11:44:48 -06:00
Brooke Kuhlmann
b6e9f38bac Added screencast to README.
- Provides additional usage via the CLI.
2016-10-12 11:42:11 -06:00
Brooke Kuhlmann
3320a8d027 Fixed reinstaller path issues with application and extension scripts.
- These reinstallers were not making use of the new `bin` scripts.
2016-10-12 11:28:48 -06:00
Brooke Kuhlmann
2b54537acb Added version release changes. 2016-10-11 16:58:15 -06:00
Brooke Kuhlmann
d546d79759 Added script hooks for unfinished custom configurations.
- These scripts default to calling out to scripts of the same name as
  defined by the custom configuration project (i.e.
  `$MAC_OS_CONFIG_PATH`).
- This helps ensure the scripts in this project can be run
  appropriately even if the custom configuration project hasn't fully
  implemented all scripts yet.
- This also helps illustrate what scripts are necessary when creating a
  custom configuration.
2016-10-11 16:31:47 -06:00
Brooke Kuhlmann
57e20929b3 Added script hook for App Store software install.
- Allows for the automation of Mac App Store software via the
  [Mac App Store CLI](https://github.com/mas-cli/mas) app.
- See [macOS Config](https://github.com/bkuhlmann/mac_os-config) for
  usage.
2016-10-11 11:54:20 -06:00
Brooke Kuhlmann
d45be4e61d Fixed verification of Homebrew application installs.
- Was pointing to the incorrect macOS Config path now that
  the base macOS scripts and macOS configuration files have been
  split into two projects.
2016-10-11 10:41:11 -06:00
Brooke Kuhlmann
8fbf63a783 Fixed Bash script header to dynamically load correct environment.
- Improves loading of the correct Bash environment/version, especially
  on systems that might not be using a standard install (i.e.
  Homebrew), by loading a version of Bash as defined by the environment
  rather than a hard coded path.

[ci skip]
2016-10-10 09:37:54 -06:00
Brooke Kuhlmann
d03c461739 Updated and clarified README documentation. 2016-10-06 08:37:42 -06:00
33 changed files with 1010 additions and 553 deletions

View File

@@ -1,16 +1,11 @@
## Expected Behavior ## Overview
<!-- Required. Describe, in detail, the behavior experienced. --> <!-- Required. Describe, in detail, the behavior experienced and what is desired. -->
## Actual Behavior
<!-- Required. Describe, in detail, what should be the correct behavior. -->
## Steps to Recreate ## Steps to Recreate
<!-- Required. List the exact steps to the reproduce errant behavior. --> <!-- Optional. List exact steps (numbered list) to reproduce errant behavior. Delete if unused. -->
0. ## Screenshots/Screencasts
<!-- Optional. Attach screenshot/screencast(s) that demo the behavior. Delete if unused. -->
## Environment ## Environment
<!-- Optional. What is your operating system, software version(s), etc. Delete if unused. --> <!-- Optional. What is your operating system, software version(s), etc. Delete if unused. -->
## Screenshots/Screencasts
<!-- Optional. Attach screenshots/screencasts that demo the behavior. Delete if unused. -->

View File

@@ -2,10 +2,10 @@
<!-- Required. Why is this important/necessary? --> <!-- Required. Why is this important/necessary? -->
## Details ## Details
<!-- Optional. List the key features/highlights as bullet points. --> <!-- Optional. List the key features/highlights as bullet points. Delete if unused. -->
## Notes ## Notes
<!-- Optional. List additional notes/references as bullet points. Delete if unused. --> <!-- Optional. List additional notes/references as bullet points. Delete if unused. -->
## Screenshots/Screencasts ## Screenshots/Screencasts
<!-- Optional. Provide image/video support. Delete if unused. --> <!-- Optional. Provide supporting image/video. Delete if unused. -->

1
.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
Gemfile.lock

1
.ruby-version Normal file
View File

@@ -0,0 +1 @@
2.6.0

View File

@@ -1,3 +0,0 @@
# v1.0.0 (2016-10-05)
- Initial version.

121
CHANGES.md Normal file
View File

@@ -0,0 +1,121 @@
# 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.
- Updated to Circle CI 2.0.0 configuration.
- Updated to Git Cop 2.2.0.
- Updated to Ruby 2.5.1.
- Removed Patreon badge from README.
# 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.
# 3.1.0 (2017-11-26)
- Updated Gemfile.lock file.
- Updated boot disk documenation to mention APFS.
- Updated to Bundler 1.16.0.
- Updated to Git Cop 1.7.0.
- Updated to Rake 12.3.0.
- Updated to Rubocop 0.51.0.
# 3.0.0 (2017-10-01)
- Fixed table of contents.
- Updated boot disk creation to use macOS High Sierra.
- Updated gem dependencies.
- Updated to Git Cop 1.6.0.
- Updated to Ruby 2.4.2.
# 2.2.0 (2017-07-16)
- Added Git Cop support.
- Updated CONTRIBUTING documentation.
- Updated GitHub templates.
- Updated README headers.
- Updated gem dependencies.
# 2.1.0 (2017-04-29)
- Fixed Java SE Development Kit install.
- Fixed install-all command
# 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.
# 1.3.1 (2017-01-08)
- Fixed install of zip app downloads with sub-directories.
# 1.3.0 (2017-01-01)
- Updated README versioning documentation.
- Removed CHANGELOG.md (use CHANGES.md instead).
# 1.2.0 (2016-10-12)
- Fixed reinstaller path issues with application and extension scripts.
- Added screencast to README.
# 1.1.0 (2016-10-11)
- Fixed Bash script header to dynamically load correct environment.
- Fixed verification of Homebrew application installs.
- Added script hook for App Store software install.
- Added script hooks for unfinished custom configurations.
- Updated and clarified README documentation.
# 1.0.0 (2016-10-05)
- Initial version.

View File

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

View File

@@ -1,35 +1,22 @@
# Overview # Contributing
Thanks for taking an interest in this open source project. Your support and involvement is greatly appreciated. The Thanks for taking an interest in this open source project. Your support and involvement is greatly
following details what you need to know in order to contribute. appreciated. The following sections detail what you need to know in order to contribute.
# Requirements ## Code
- Follow these [Basic Programming Styles](https://github.com/bkuhlmann/style_guides/blob/master/programming/basic.md). 1. Read the project README before starting.
- Follow these [Code Review Styles](https://github.com/bkuhlmann/style_guides/blob/master/programming/code_reviews.md). 1. Fork the `master` branch of this repository and clone the fork locally.
- Follow these [Git Styles](https://github.com/bkuhlmann/style_guides/blob/master/programming/git.md). 1. Ensure there are no setup, usage, and/or test issues.
- Follow these [Bash Styles](https://github.com/bkuhlmann/style_guides/blob/master/programming/languages/bash.md). 1. Add tests for new functionality and ensure they pass.
- Follow these [CSS Styles](https://github.com/bkuhlmann/style_guides/blob/master/programming/languages/css.md). 1. Submit a pull request, follow the instructions it provides, and ensure the build passes.
- Follow these [Ruby Styles](https://github.com/bkuhlmann/style_guides/blob/master/programming/languages/ruby/ruby.md).
# Contributing Code ## Issues
0. Read the project README thoroughly before starting. - Submit an issue via the GitHub Issues tab (assuming one does not
0. Fork the master branch of the repository. already exist) and follow the instructions it provides.
0. Ensure there are no setup, usage, and/or test issues (again, follow the README).
0. Add tests for new functionality (refactoring and documentation changes can be excluded).
0. Ensure all tests pass.
0. Push your feature branch and submit a pull request.
# Submitting Issues ## Feedback
0. Submit an issue via the GitHub Issues tab (assuming one does not already exist). - Expect a response within one to three business days.
0. Clearly describe the issue (including steps to reproduce). - Changes, alternatives, and/or improvements might be suggested upon review.
0. Specify your enviroment setup (OS, browser, language, etc. with version info).
0. Provide a stack dump (if possible).
0. Explain any additional details that might help diagnose the problem quickly.
# Feedback
Expect a response within one to three business days.
Changes, alternatives, and/or improvements might be suggested upon review.

6
Gemfile Normal file
View File

@@ -0,0 +1,6 @@
# frozen_string_literal: true
source "https://rubygems.org"
gem "rake", "~> 12.0"
gem "git-cop", "~> 3.0"

View File

@@ -1,20 +1,163 @@
Copyright (c) 2016 [Alchemists](https://www.alchemists.io). # Apache License
Permission is hereby granted, free of charge, to any person obtaining Version 2.0, January 2004
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be http://www.apache.org/licenses
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND ## 1. Definitions
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION Sections 1 through 9 of this document.
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is
granting the License.
"Legal Entity" shall mean the union of the acting entity and all other entities that control, are
controlled by, or are under common control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the direction or management of such
entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this
License.
"Source" form shall mean the preferred form for making modifications, including but not limited to
software source code, documentation source, and configuration files.
"Object" form shall mean any form resulting from mechanical transformation or translation of a
Source form, including but not limited to compiled object code, generated documentation, and
conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or Object form, made available under the
License, as indicated by a copyright notice that is included in or attached to the work (an example
is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or
derived from) the Work and for which the editorial revisions, annotations, elaborations, or other
modifications represent, as a whole, an original work of authorship. For the purposes of this
License, Derivative Works shall not include works that remain separable from, or merely link (or
bind by name) to the interfaces of, the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including the original version of the Work and any
modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted
to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity
authorized to submit on behalf of the copyright owner. For the purposes of this definition,
"submitted" means any form of electronic, verbal, or written communication sent to the Licensor or
its representatives, including but not limited to communication on electronic mailing lists, source
code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor
for the purpose of discussing and improving the Work, but excluding communication that is
conspicuously marked or otherwise designated in writing by the copyright owner as "Not a
Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a
Contribution has been received by Licensor and subsequently incorporated within the Work.
## 2. Grant of Copyright License
Subject to the terms and conditions of this License, each Contributor hereby grants to You a
perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to
reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and
distribute the Work and such Derivative Works in Source or Object form.
## 3. Grant of Patent License
Subject to the terms and conditions of this License, each Contributor hereby grants to You a
perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this
section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer
the Work, where such license applies only to those patent claims licensable by such Contributor that
are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You institute patent litigation
against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or
a Contribution incorporated within the Work constitutes direct or contributory patent infringement,
then any patent licenses granted to You under this License for that Work shall terminate as of the
date such litigation is filed.
## 4. Redistribution
You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with
or without modifications, and in Source or Object form, provided that You meet the following
conditions:
1. You must give any other recipients of the Work or Derivative Works a copy of this License; and
2. You must cause any modified files to carry prominent notices stating that You changed the
files; and
3. You must retain, in the Source form of any Derivative Works that You distribute, all copyright,
patent, trademark, and attribution notices from the Source form of the Work, excluding those
notices that do not pertain to any part of the Derivative Works; and
4. If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative
Works that You distribute must include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not pertain to any part of the
Derivative Works, in at least one of the following places: within a NOTICE text file
distributed as part of the Derivative Works; within the Source form or documentation, if
provided along with the Derivative Works; or, within a display generated by the Derivative
Works, if and wherever such third-party notices normally appear. The contents of the NOTICE
file are for informational purposes only and do not modify the License. You may add Your own
attribution notices within Derivative Works that You distribute, alongside or as an addendum to
the NOTICE text from the Work, provided that such additional attribution notices cannot be
construed as modifying the License.
You may add Your own copyright statement to Your modifications and may provide additional or
different license terms and conditions for use, reproduction, or distribution of Your modifications,
or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of
the Work otherwise complies with the conditions stated in this License.
## 5. Submission of Contributions
Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the
Work by You to the Licensor shall be under the terms and conditions of this License, without any
additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed with Licensor regarding such
Contributions.
## 6. Trademarks
This License does not grant permission to use the trade names, trademarks, service marks, or product
names of the Licensor, except as required for reasonable and customary use in describing the origin
of the Work and reproducing the content of the NOTICE file.
## 7. Disclaimer of Warranty
Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied, including, without limitation, any warranties or conditions of
TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely
responsible for determining the appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
## 8. Limitation of Liability
In no event and under no legal theory, whether in tort (including negligence), contract, or
otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or
agreed to in writing, shall any Contributor be liable to You for damages, including any direct,
indirect, special, incidental, or consequential damages of any character arising as a result of this
License or out of the use or inability to use the Work (including but not limited to damages for
loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial
damages or losses), even if such Contributor has been advised of the possibility of such damages.
## 9. Accepting Warranty or Additional Liability
While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee
for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights
consistent with this License. However, in accepting such obligations, You may act only on Your own
behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You
agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or
claims asserted against, such Contributor by reason of your accepting any such warranty or
additional liability.
END OF TERMS AND CONDITIONS
Copyright 2016 [Alchemists](https://www.alchemists.io).
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 [copy](http://www.apache.org/licenses/LICENSE-2.0) of
the License.
Unless required by applicable law or agreed to in writing, software distributed under the License is
distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied. See the License for the specific language governing permissions and limitations under the
License.

220
README.md
View File

@@ -1,46 +1,69 @@
# macOS # macOS
[![Patreon](https://img.shields.io/badge/patreon-donate-brightgreen.svg)](https://www.patreon.com/bkuhlmann) [![Circle CI Status](https://circleci.com/gh/bkuhlmann/mac_os.svg?style=svg)](https://circleci.com/gh/bkuhlmann/mac_os)
Shell scripts for automated macOS machine setup. This project provides the foundational tooling for Shell scripts for automated macOS machine setup.
automated macOS machine setup. To customize further see the companion
[macOS Config](https://github.com/bkuhlmann/mac_os-config) project for details. This project is a framework for automating the setup of a macOS machine. In order to illustrate the
potential of what this project can do, please see the companion
[macOS Config](https://github.com/bkuhlmann/mac_os-config) project for details. The *macOS Config*
project is an opinionated configuration which meets the needs of my development environment but is
also meant to serve as an example and guide for building your own personalized setup. Here is how
the two projects are meant to be used:
- **macOS** (this project) - The 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
to be forked for as many custom machine setups as needed.
<!-- Tocer[start]: Auto-generated, don't remove. --> <!-- Tocer[start]: Auto-generated, don't remove. -->
# Table of Contents ## Table of Contents
- [Features](#features) - [Features](#features)
- [Requirements](#requirements) - [Screencast](#screencast)
- [Setup](#setup) - [Requirements](#requirements)
- [Usage](#usage) - [Setup](#setup)
- [Customization](#customization) - [Usage](#usage)
- [Versioning](#versioning) - [Boot Disk](#boot-disk)
- [Code of Conduct](#code-of-conduct) - [Customization](#customization)
- [Contributions](#contributions) - [Troubleshooting](#troubleshooting)
- [License](#license) - [Versioning](#versioning)
- [History](#history) - [Code of Conduct](#code-of-conduct)
- [Credits](#credits) - [Contributions](#contributions)
- [License](#license)
- [History](#history)
- [Credits](#credits)
<!-- Tocer[finish]: Auto-generated, don't remove. --> <!-- Tocer[finish]: Auto-generated, don't remove. -->
# Features ## Features
- Provides a command line interface for installation and management of macOS software. - Provides a command line interface, written in Bash, with no additional dependencies for
- Downloads and installs development tooling (required by Homebrew): installation and management of a macOS machine.
- [Xcode Command Line Tools](https://developer.apple.com/xcode) - Supports macOS boot disk creation for fresh install of operating system.
- [Java SE Development Kit](http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html) - Downloads and installs [Xcode Command Line Tools](https://developer.apple.com/xcode).
- Downloads, installs, and configures [Homebrew](http://brew.sh) command line software. - Downloads, installs, and configures [Homebrew Formulas](http://brew.sh).
- Downloads, installs, and configures software applications generally not in the - Downloads, installs, and configures [Homebrew Casks](https://caskroom.github.io).
[App Store](http://www.apple.com/macosx/whats-new/app-store.html). - Downloads, installs, and configures
- Downloads, installs, and configures software extensions. [App Store](http://www.apple.com/macosx/whats-new/app-store.html) software.
- Downloads, installs, and configures non-App Store software applications.
- Downloads, installs, and configures software application extensions.
- Applies basic and default software settings.
- Sets up and configures installed software for use.
- Supports restoration of machine backups.
# Requirements ## Screencast
0. [macOS](https://www.apple.com/macos) (with latest software updates applied) [![asciicast](https://asciinema.org/a/155990.png)](https://asciinema.org/a/155990)
0. [Xcode](https://developer.apple.com/xcode) (with accepted license agreement)
# Setup ## Requirements
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
Open a terminal window and execute one of the following setup sequences depending on your version Open a terminal window and execute one of the following setup sequences depending on your version
preference: preference:
@@ -49,50 +72,52 @@ Current Version (stable):
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 v1.0.0 git checkout 7.0.0
Master Version (unstable): Master Version (unstable):
git clone https://github.com/bkuhlmann/mac_os.git git clone https://github.com/bkuhlmann/mac_os.git
cd mac_os cd mac_os
# Usage ## Usage
Run the following script: Run the following:
bin/run bin/run
You will be presented with the following options: You will be presented with the following options (listed in order of use):
Boot: Boot:
B: Create boot disk. B: Create boot disk.
Install: Install:
b: Apply basic system settings. b: Apply basic settings.
t: Install development tools. t: Install development tools.
h: Install Homebrew software. hf: Install Homebrew Formulas.
a: Install application software. hc: Install Homebrew Casks.
x: Install application software extensions. m: Install Mac App Store software.
d: Apply software defaults. a: Install application software.
s: Setup installed software. x: Install application software extensions.
i: Install everything (i.e. executes all install options). d: Apply default settings.
s: Setup installed software.
i: Install everything (i.e. executes all install options).
Restore: Restore:
R: Restore settings from backup. R: Restore settings from backup.
Manage: Manage:
c: Check status of managed software. c: Check status of managed software.
C: Caffeinate machine. C: Caffeinate machine.
ua: Uninstall application software. ua: Uninstall application software.
ux: Uninstall application software extension. ux: Uninstall application software extension.
ra: Reinstall application software. ra: Reinstall application software.
rx: Reinstall application software extension. rx: Reinstall application software extension.
w: Clean work (temp) directory. w: Clean work (temp) directory.
q: Quit/Exit. q: Quit/Exit.
Choose option `i` to run all install options or select a specific option to run a single option. Choose option `i` to run a full install or select a specific option to run a single action. Each
Each option is designed to be re-run if necessary. This can also be handy for performing upgrades, option is designed to be re-run if necessary. This can also be handy for performing upgrades,
re-running a missing/failed install, etc. re-running a missing/failed install, etc.
The option prompt can be skipped by passing the desired option directly to the run.sh script. For The option prompt can be skipped by passing the desired option directly to the `bin/run` script. For
example, executing `./run.sh 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 The machine should be rebooted after all install tasks have completed to ensure all settings have
been loaded. been loaded.
@@ -100,51 +125,96 @@ been loaded.
It is recommended that the `mac_os` project directory not be deleted and kept on the local machine 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. in order to manage installed software and benefit from future upgrades.
## Customization ### Boot Disk
Global settings can be configured via the following script: When attempting to create a boot disk via `bin/run B`, you'll be presented with the following
documentation (provided here for reference):
- `lib/settings.sh` 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".
All script programs can be found in the `bin` folder: 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.
- `bin/create_boot_disk` = Creates macOS boot disk. macOS Reinstall:
- `bin/install_dev_tools` = Installs macOS development tools required by Homebrew. 1. Click the Apple icon from the operating system main menu.
- `bin/run` - The main script and interface for macOS setup. 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.
The `lib` folder provides foundational functions for installing, re-installing, and uninstalling ### Customization
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
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. *Can be customized.*
- `bin/install_applications`: Installs macOS, GUI-based, non-App Store applications. *Can be
customized.*
- `bin/install_dev_tools`: Installs macOS development tools required by Homebrew.
- `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. *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) software. Everything provided via the [macOS Config](https://github.com/bkuhlmann/mac_os-config)
project is built upon the functions found in the `lib` folder. See the project is built upon the functions found in the `lib` folder. See the
[macOS Config](https://github.com/bkuhlmann/mac_os-config) project for further details. [macOS Config](https://github.com/bkuhlmann/mac_os-config) project for further details.
# Versioning - `lib/settings.sh`: Defines global settings for software applications, extensions, etc.
Read [Semantic Versioning](http://semver.org) for details. Briefly, it means: ## 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).
## Versioning
Read [Semantic Versioning](https://semver.org) for details. Briefly, it means:
- Patch (x.y.Z) - Incremented for small, backwards compatible bug fixes.
- Minor (x.Y.z) - Incremented for new, backwards compatible public API enhancements and/or bug fixes.
- Major (X.y.z) - Incremented for any backwards incompatible public API changes. - 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.
- Patch (x.y.Z) - Incremented for small, backwards compatible, bug fixes.
# Code of Conduct ## Code of Conduct
Please note that this project is released with a [CODE OF CONDUCT](CODE_OF_CONDUCT.md). By Please note that this project is released with a [CODE OF CONDUCT](CODE_OF_CONDUCT.md). By
participating in this project you agree to abide by its terms. participating in this project you agree to abide by its terms.
# Contributions ## Contributions
Read [CONTRIBUTING](CONTRIBUTING.md) for details. Read [CONTRIBUTING](CONTRIBUTING.md) for details.
# License ## License
Copyright (c) 2016 [Alchemists](https://www.alchemists.io). Copyright 2016 [Alchemists](https://www.alchemists.io).
Read the [LICENSE](LICENSE.md) for details. Read [LICENSE](LICENSE.md) for details.
# History ## History
Read the [CHANGELOG](CHANGELOG.md) for details. Read [CHANGES](CHANGES.md) for details.
Built with [Bashsmith](https://github.com/bkuhlmann/bashsmith). Built with [Bashsmith](https://github.com/bkuhlmann/bashsmith).
# Credits ## Credits
Developed by [Brooke Kuhlmann](https://www.alchemists.io) at Developed by [Brooke Kuhlmann](https://www.alchemists.io) at
[Alchemists](https://www.alchemists.io). [Alchemists](https://www.alchemists.io).

9
Rakefile Normal file
View File

@@ -0,0 +1,9 @@
# frozen_string_literal: true
begin
require "git/cop/rake/setup"
rescue LoadError => error
puts error.message
end
task default: :git_cop

15
bin/apply_basic_settings Executable file
View File

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

15
bin/apply_default_settings Executable file
View File

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

View File

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

15
bin/install_app_store Executable file
View File

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

15
bin/install_applications Executable file
View File

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

View File

@@ -1,16 +1,13 @@
#! /bin/bash #! /usr/bin/env bash
# DESCRIPTION
# 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
read -p "Have you completed the Xcode CLI tools install (y/n)? " response printf "%s\n" "💡 ALT+TAB to view and accept Xcode license window."
if [[ "$response" != "y" ]]; then read -p "Have you completed the Xcode CLI tools install (y/n)? " xcode_response
if [[ "$xcode_response" != "y" ]]; then
printf "ERROR: Xcode CLI tools must be installed before proceeding.\n" printf "ERROR: Xcode CLI tools must be installed before proceeding.\n"
exit 1 exit 1
fi fi
printf "Installing Java...\n"
install_java "$JAVA_URL" "$JAVA_VOLUME_NAME"

15
bin/install_extensions Executable file
View File

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

15
bin/install_homebrew_casks Executable file
View File

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

15
bin/install_homebrew_formulas Executable file
View File

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

15
bin/restore_backup Executable file
View File

@@ -0,0 +1,15 @@
#! /usr/bin/env bash
# Performs restoration of backup data.
set -o nounset
set -o errexit
set -o pipefail
IFS=$'\n\t'
SCRIPT_PATH="$MAC_OS_CONFIG_PATH/bin/restore_backup"
if [[ -x "$SCRIPT_PATH" ]]; then
"$SCRIPT_PATH"
else
printf "WARNING: Restore backup script does not exist or is not executable.\n"
fi

47
bin/run
View File

@@ -1,16 +1,10 @@
#! /bin/bash #! /usr/bin/env bash
# DESCRIPTION
# Executes the command line interface. # Executes the command line interface.
# USAGE
# ./run.sh OPTION
# LIBRARY
source lib/installers.sh source lib/installers.sh
source lib/options.sh source lib/options.sh
source lib/reinstallers.sh source lib/reinstallers.sh
source lib/restorers.sh
source lib/settings.sh source lib/settings.sh
source lib/uninstallers.sh source lib/uninstallers.sh
source lib/utilities.sh source lib/utilities.sh
@@ -29,33 +23,34 @@ else
exit 1 exit 1
fi fi
# EXECUTION
while true; do while true; do
if [[ $# == 0 ]]; then if [[ $# == 0 ]]; then
printf "\nUsage: run OPTION\n" printf "\nUsage: run OPTION\n"
printf "\nOSX Options:\n" printf "\nOSX Options:\n"
printf " Boot:\n" printf " Boot:\n"
printf " B: Create boot disk.\n" printf " B: Create boot disk.\n"
printf " Install:\n" printf " Install:\n"
printf " b: Apply basic settings.\n" printf " b: Apply basic settings.\n"
printf " t: Install development tools.\n" printf " t: Install development tools.\n"
printf " h: Install Homebrew software.\n" printf " hf: Install Homebrew Formulas.\n"
printf " a: Install application software.\n" printf " hc: Install Homebrew Casks.\n"
printf " x: Install application software extensions.\n" printf " m: Install Mac App Store software.\n"
printf " d: Apply default settings.\n" printf " a: Install application software.\n"
printf " s: Setup installed software.\n" printf " x: Install application software extensions.\n"
printf " i: Install everything (i.e. executes all install options).\n" printf " d: Apply default settings.\n"
printf " s: Setup installed software.\n"
printf " i: Install everything (i.e. executes all install options).\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"
printf " c: Check status of managed software.\n" printf " c: Check status of managed software.\n"
printf " C: Caffeinate machine.\n" printf " C: Caffeinate machine.\n"
printf " ua: Uninstall application software.\n" printf " ua: Uninstall application software.\n"
printf " ux: Uninstall application software extension.\n" printf " ux: Uninstall application software extension.\n"
printf " ra: Reinstall application software.\n" printf " ra: Reinstall application software.\n"
printf " rx: Reinstall application software extension.\n" printf " rx: Reinstall application software extension.\n"
printf " w: Clean work (temp) directory.\n" printf " w: Clean work (temp) directory.\n"
printf " q: Quit/Exit.\n\n" printf " q: Quit/Exit.\n\n"
read -p "Enter selection: " response read -p "Enter selection: " response
printf "\n" printf "\n"
process_option $response process_option $response

15
bin/setup_software Executable file
View File

@@ -0,0 +1,15 @@
#! /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 Normal file
View File

@@ -0,0 +1,61 @@
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: Rake Run
command: bundle exec rake

View File

@@ -1,149 +1,19 @@
#! /bin/bash #! /usr/bin/env bash
# DESCRIPTION
# Defines software installer functions. # 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. # Installs an application via a DMG file.
# Parameters: # Parameters: $1 (required) - URL, $2 (required) - Mount path, $3 (required) - Application name.
# $1 = The URL.
# $2 = The mount path.
# $3 = The application name.
install_dmg_app() { install_dmg_app() {
local url="$1" local url="$1"
local mount_point="/Volumes/$2" local mount_point="/Volumes/$2"
local app_name="$3" local app_name="$3"
local install_path=$(get_install_path "$app_name") local install_path=$(get_install_path "$app_name")
local download_file="download.dmg" local work_file="download.dmg"
if [[ ! -e "$install_path" ]]; then if [[ ! -e "$install_path" ]]; then
download_installer "$url" "$download_file" download_file "$url" "$work_file"
mount_image "$MAC_OS_WORK_PATH/$download_file" mount_image "$MAC_OS_WORK_PATH/$work_file"
install_app "$mount_point" "$app_name" install_app "$mount_point" "$app_name"
unmount_image "$mount_point" unmount_image "$mount_point"
verify_application "$app_name" verify_application "$app_name"
@@ -152,20 +22,17 @@ install_dmg_app() {
export -f install_dmg_app export -f install_dmg_app
# Installs a package via a DMG file. # Installs a package via a DMG file.
# Parameters: # Parameters: $1 (required) - URL, $2 (required) - Mount path, $3 (required) - Application name.
# $1 = The URL.
# $2 = The mount path.
# $3 = The application name.
install_dmg_pkg() { install_dmg_pkg() {
local url="$1" local url="$1"
local mount_point="/Volumes/$2" local mount_point="/Volumes/$2"
local app_name="$3" local app_name="$3"
local install_path=$(get_install_path "$app_name") local install_path=$(get_install_path "$app_name")
local download_file="download.dmg" local work_file="download.dmg"
if [[ ! -e "$install_path" ]]; then if [[ ! -e "$install_path" ]]; then
download_installer "$url" "$download_file" download_file "$url" "$work_file"
mount_image "$MAC_OS_WORK_PATH/$download_file" mount_image "$MAC_OS_WORK_PATH/$work_file"
install_pkg "$mount_point" "$app_name" install_pkg "$mount_point" "$app_name"
unmount_image "$mount_point" unmount_image "$mount_point"
printf "Installed: $app_name.\n" printf "Installed: $app_name.\n"
@@ -175,22 +42,21 @@ install_dmg_pkg() {
export -f install_dmg_pkg export -f install_dmg_pkg
# Installs an application via a zip file. # Installs an application via a zip file.
# Parameters: # Parameters: $1 (required) - URL, $2 (required) - Application name.
# $1 = The URL.
# $2 = The application name.
install_zip_app() { install_zip_app() {
local url="$1" local url="$1"
local app_name="$2" local app_name="$2"
local install_path=$(get_install_path "$app_name") local install_path=$(get_install_path "$app_name")
local download_file="download.zip" local work_file="download.zip"
if [[ ! -e "$install_path" ]]; then if [[ ! -e "$install_path" ]]; then
download_installer "$url" "$download_file" download_file "$url" "$work_file"
( (
printf "Preparing...\n" printf "Preparing...\n"
cd "$MAC_OS_WORK_PATH" 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 \;
) )
install_app "$MAC_OS_WORK_PATH" "$app_name" install_app "$MAC_OS_WORK_PATH" "$app_name"
@@ -200,51 +66,21 @@ install_zip_app() {
} }
export -f 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. # Installs a package via a zip file.
# Parameters: # Parameters: $1 (required) - URL, $2 (required) - Application name.
# $1 = The URL.
# $2 = The application name.
install_zip_pkg() { install_zip_pkg() {
local url="$1" local url="$1"
local app_name="$2" local app_name="$2"
local install_path=$(get_install_path "$app_name") local install_path=$(get_install_path "$app_name")
local download_file="download.zip" local work_file="download.zip"
if [[ ! -e "$install_path" ]]; then if [[ ! -e "$install_path" ]]; then
download_installer "$url" "$download_file" download_file "$url" "$work_file"
( (
printf "Preparing...\n" printf "Preparing...\n"
cd "$MAC_OS_WORK_PATH" cd "$MAC_OS_WORK_PATH"
unzip -q "$download_file" unzip -q "$work_file"
) )
install_pkg "$MAC_OS_WORK_PATH" "$app_name" install_pkg "$MAC_OS_WORK_PATH" "$app_name"
@@ -254,11 +90,51 @@ 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
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. # Installs application code from a Git repository.
# Parameters: # Parameters: $1 (required) - Repository URL, $2 (required) - Install path, $3 (optional) - Git clone options.
# $1 = Repository URL.
# $2 = Install path.
# $3 = Git clone options (if any).
install_git_app() { install_git_app() {
local repository_url="$1" local repository_url="$1"
local app_name=$(get_file_name "$2") local app_name=$(get_file_name "$2")
@@ -279,11 +155,7 @@ install_git_app() {
export -f install_git_app export -f install_git_app
# Installs settings from a Git repository. # Installs settings from a Git repository.
# Parameters: # Parameters: $1 (required) - Repository URL, $2 (required) - Repository version, $3 (required) - Project directory, $4 (required) - Script to run (including any arguments).
# $1 = The repository URL.
# $2 = The repository version.
# $3 = The project directory.
# $4 = The script to run (including any arguments).
install_git_project() { install_git_project() {
local repo_url="$1" local repo_url="$1"
local repo_version="$2" local repo_version="$2"
@@ -293,9 +165,73 @@ install_git_project() {
git clone "$repo_url" git clone "$repo_url"
( (
cd "$project_dir" cd "$project_dir"
git checkout "$repo_version" git -c advice.detachedHead=false checkout "$repo_version"
eval "$script" eval "$script"
) )
rm -rf "$project_dir" rm -rf "$project_dir"
} }
export -f install_git_project 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,43 +1,49 @@
#! /bin/bash #! /usr/bin/env bash
# DESCRIPTION
# Defines command line prompt options. # Defines command line prompt options.
# Process option selection. # Process option selection.
# Parameters: # Parameters: $1 (required) - The option to process.
# $1 = The option to process.
process_option() { process_option() {
case $1 in case $1 in
'B') 'B')
bin/create_boot_disk;; bin/create_boot_disk;;
'b') 'b')
"$MAC_OS_CONFIG_PATH/bin/apply_basic_settings";; bin/apply_basic_settings;;
't') 't')
bin/install_dev_tools;; bin/install_dev_tools;;
'h') 'hf')
"$MAC_OS_CONFIG_PATH/bin/install_homebrew";; bin/install_homebrew_formulas;;
'hc')
bin/install_homebrew_casks;;
'm')
bin/install_app_store;;
'a') 'a')
"$MAC_OS_CONFIG_PATH/bin/install_applications";; bin/install_applications;;
'x') 'x')
"$MAC_OS_CONFIG_PATH/bin/install_extensions";; bin/install_extensions;;
'd') 'd')
"$MAC_OS_CONFIG_PATH/bin/apply_default_settings";; bin/apply_default_settings;;
's') 's')
"$MAC_OS_CONFIG_PATH/bin/setup_software";; bin/setup_software;;
'i') 'i')
caffeinate_machine caffeinate_machine
"$MAC_OS_CONFIG_PATH/bin/apply_basic_settings" bin/apply_basic_settings
bin/install_dev_tools bin/install_dev_tools
"$MAC_OS_CONFIG_PATH/bin/install_homebrew" bin/install_homebrew_formulas
"$MAC_OS_CONFIG_PATH/bin/install_applications" bin/install_homebrew_casks
"$MAC_OS_CONFIG_PATH/bin/install_extensions" bin/install_app_store
"$MAC_OS_CONFIG_PATH/bin/apply_default_settings" bin/install_applications
"$MAC_OS_CONFIG_PATH/bin/setup_software" bin/install_extensions
bin/apply_default_settings
bin/setup_software
clean_work_path;; clean_work_path;;
'R') 'R')
"$MAC_OS_CONFIG_PATH/bin/restore_backup";; bin/restore_backup;;
'c') 'c')
verify_homebrews verify_homebrew_formulas
verify_homebrew_casks
verify_app_store_applications
verify_applications verify_applications
verify_extensions;; verify_extensions;;
'C') 'C')

View File

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

View File

@@ -1,31 +0,0 @@
#! /bin/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 @@
#! /bin/bash #! /usr/bin/env bash
# DESCRIPTION
# Defines global settings.
# SETTINGS
# General
set -o nounset set -o nounset
set -o errexit set -o errexit
set -o pipefail set -o pipefail
IFS=$'\n\t' IFS=$'\n\t'
# Globals export MAC_OS_BOOT_DISK_CREATOR="/Applications/Install macOS Mojave.app/Contents/Resources/createinstallmedia"
export MAC_OS_BOOT_DISK_CREATOR="/Applications/Install macOS Sierra.app/Contents/Resources/createinstallmedia"
export MAC_OS_BOOT_DISK_PATH="/Volumes/Untitled" export MAC_OS_BOOT_DISK_PATH="/Volumes/Untitled"
export MAC_OS_INSTALLER_PATH="/Applications/Install macOS Sierra.app"
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"
# Java
export JAVA_VOLUME_NAME="JDK 8 Update 101"
export JAVA_URL="http://download.oracle.com/otn-pub/java/jdk/8u101-b13/jdk-8u101-macosx-x64.dmg"

View File

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

View File

@@ -1,57 +1,9 @@
#! /bin/bash #! /usr/bin/env bash
# DESCRIPTION
# Defines general utility functions. # 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. # Answers the full install path (including file name) for file name.
# Parameters: # Parameters: $1 (required) - The file name.
# $1 = The file name.
get_install_path() { get_install_path() {
local file_name="$1" local file_name="$1"
local install_path=$(get_install_root "$file_name") local install_path=$(get_install_root "$file_name")
@@ -77,3 +29,46 @@ caffeinate_machine() {
fi fi
} }
export -f caffeinate_machine 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 @@
#! /bin/bash #! /usr/bin/env bash
# DESCRIPTION
# Defines verification/validation functions. # Defines verification/validation functions.
# Verifies Homebrew software exists. # Checks for missing Homebrew formulas.
# Parameters: verify_homebrew_formulas() {
# $1 = The file name. printf "Checking Homebrew formulas...\n"
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"
local applications="$(brew list)" local applications="$(brew list)"
@@ -37,28 +23,72 @@ verify_homebrews() {
application="mercurial" application="mercurial"
fi fi
verify_homebrew "$application" "${applications[*]}" verify_listed_application "$application" "${applications[*]}"
fi fi
done < "$PWD/scripts/homebrew.sh" 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. # Checks for missing Homebrew casks.
# Parameters: verify_homebrew_casks() {
# $1 = The file name. printf "\nChecking Homebrew casks...\n"
verify_application() {
local file_name="$1"
# Display the missing install if not found. local applications="$(brew cask list)"
local install_path=$(get_install_path "$file_name")
if [[ ! -e "$install_path" ]]; then while read line; do
printf " - Missing: $file_name\n" # 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 fi
} }
export -f verify_application export -f verify_listed_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() {
@@ -77,18 +107,19 @@ verify_applications() {
} }
export -f verify_applications export -f verify_applications
# Verifies path exists. # Verifies application exists.
# Parameters: # Parameters: $1 (required) - The file name.
# $1 = The path. verify_application() {
verify_path() { local file_name="$1"
local path="$1"
# Display the missing path if not found. # Display the missing install if not found.
if [[ ! -e "$path" ]]; then local install_path=$(get_install_path "$file_name")
printf " - Missing: $path\n"
if [[ ! -e "$install_path" ]]; then
printf " - Missing: $file_name\n"
fi fi
} }
export -f verify_path 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() {
@@ -106,3 +137,15 @@ verify_extensions() {
printf "Application extension check complete.\n" printf "Application extension check complete.\n"
} }
export -f verify_extensions 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