Compare commits
42 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b45af77b5c | ||
|
|
41f6fae742 | ||
|
|
3ee1d855bf | ||
|
|
a77af9c21f | ||
|
|
4b7c940850 | ||
|
|
295578875f | ||
|
|
1ae3ae1134 | ||
|
|
d78eb3063d | ||
|
|
a547d061b2 | ||
|
|
f58f146074 | ||
|
|
6c2de5a5bb | ||
|
|
4d9ad7315d | ||
|
|
a895090ca9 | ||
|
|
0c7ae2ba4e | ||
|
|
caa2adb45c | ||
|
|
cc75094d5f | ||
|
|
d03762425a | ||
|
|
2d58c953e1 | ||
|
|
bb329535c7 | ||
|
|
72f5fcb03e | ||
|
|
7da69e543f | ||
|
|
0b5c5a6cd8 | ||
|
|
450c04e126 | ||
|
|
8305d07ffb | ||
|
|
ff09e25ea5 | ||
|
|
be396b9581 | ||
|
|
6dd6d93bb8 | ||
|
|
98d921527c | ||
|
|
c01bdeb393 | ||
|
|
f6610849eb | ||
|
|
d0c2335f35 | ||
|
|
cc9fc3a2f9 | ||
|
|
023c8bbae2 | ||
|
|
5c12a47f11 | ||
|
|
cc1b7527fe | ||
|
|
2f6b385f2f | ||
|
|
6c06f7107b | ||
|
|
da81619140 | ||
|
|
6c4fc52511 | ||
|
|
ccb9aa8c1d | ||
|
|
940ad7e622 | ||
|
|
f7fb380233 |
@@ -1 +1 @@
|
||||
2.5.1
|
||||
2.6.3
|
||||
|
||||
78
CHANGES.md
78
CHANGES.md
@@ -1,4 +1,58 @@
|
||||
# v4.1.0 (2018-04-01)
|
||||
# 7.1.1 (2019-05-01)
|
||||
|
||||
- Added project icon to README.
|
||||
- Updated to Ruby 2.6.3.
|
||||
|
||||
# 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 +61,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 +77,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 +85,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 +93,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 +127,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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
2
Gemfile
2
Gemfile
@@ -3,4 +3,4 @@
|
||||
source "https://rubygems.org"
|
||||
|
||||
gem "rake", "~> 12.0"
|
||||
gem "git-cop", "~> 2.2"
|
||||
gem "git-cop", "~> 3.0"
|
||||
|
||||
101
README.md
101
README.md
@@ -1,3 +1,7 @@
|
||||
<p align="center">
|
||||
<img src="mac_os.png" alt="MacOS Icon"/>
|
||||
</p>
|
||||
|
||||
# macOS
|
||||
|
||||
[](https://circleci.com/gh/bkuhlmann/mac_os)
|
||||
@@ -11,7 +15,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 +30,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 +44,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 +64,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 +76,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.1
|
||||
|
||||
Master Version (unstable):
|
||||
|
||||
@@ -82,11 +85,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 +116,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 +129,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 +181,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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
7
bin/run
7
bin/run
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
40
circle.yml
40
circle.yml
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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')
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
#! /usr/bin/env bash
|
||||
|
||||
# DESCRIPTION
|
||||
# Defines reinstall functions.
|
||||
|
||||
# Reinstall application.
|
||||
|
||||
@@ -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
|
||||
@@ -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"
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
#! /usr/bin/env bash
|
||||
|
||||
# DESCRIPTION
|
||||
# Defines uninstall functions.
|
||||
|
||||
# Uninstalls selected application.
|
||||
|
||||
@@ -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
|
||||
|
||||
123
lib/verifiers.sh
123
lib/verifiers.sh
@@ -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
|
||||
|
||||
BIN
mac_os.png
Normal file
BIN
mac_os.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.8 KiB |
Reference in New Issue
Block a user