#!/usr/bin/env bash # This script can be used to setup a macos machine based on Vijay's configurations. As of now, this script is idempotent and will restore your local setup to the same state if run multiple times. # If you have the same files already present, it will prompt you whether to override or not # file location: (just need to invoke it from that location) # You can run this script using this command: # curl -L https://gist.github.com/vraravam/04fc2296b25090ea848642afbce4d168/raw -o fresh-install.sh; chmod +x ./fresh-install.sh; ./fresh-install.sh USERNAME=${USERNAME:-$(whoami)} ################################## # Install command line dev tools # ################################## xcode-select -p > /dev/null if [ $? != 0 ]; then # install using the non-gui cmd-line alone touch /tmp/.com.apple.dt.CommandLineTools.installondemand.in-progress softwareupdate -ia rm /tmp/.com.apple.dt.CommandLineTools.installondemand.in-progress sudo xcodebuild -license accept || true fi ############################### # Do not allow rootless login # ############################### # Note: Commented out since I am not sure if we need to do this on the office MBP or not # ROOTLESS_STATUS=$(/usr/bin/csrutil status | awk '/status/ {print $5}' | sed 's/\.$//') # if [[ ${ROOTLESS_STATUS} == "enabled" ]]; then # echo "csrutil (\"rootless\") is enabled. please disable in boot screen and run again!" # exit 1 # fi ##################### # Turn on FileVault # ##################### FILEVAULT_STATUS=$(fdesetup status) if [[ ${FILEVAULT_STATUS} != "FileVault is On." ]]; then echo "FileVault is not turned on. Please encrypt your hard disk!" exit 1 fi ################################# # Setup ssh scripts/directories # ################################# mkdir -p "${HOME}/.ssh" sudo chmod -R 600 "${HOME}"/.ssh/* ############################ # Disable macos gatekeeper # ############################ # sudo spectl --master-disable # utility functions green() { printf "\033[1;32m$1\033[0m" } red() { printf "\033[31m$1\033[0m" } yellow() { printf "\033[33m$1\033[0m" } override_prompt() { printf "$(green 'Downloading') "$2" : " if [ ! -f "$2" ]; then echo "" # Dummy echo for new line curl -L "$1" -o "$2" else printf "$(red 'already present'). Should I override [yn]? " read yn case $yn in [Yy]*) curl -L "$1" -o "$2" ;; [Nn]*) echo "$(yellow 'skipping')";; esac fi } command_exists() { type $1 &> /dev/null 2>&1 } ###################### # vim configurations # ###################### override_prompt https://gist.github.com/vraravam/2d8654cb21bfe506a64a05a49268d9de/raw "${HOME}/.vimrc" ###################################################################################### # Setup any sudo access password from cmd-line to also invoke the gui touchId prompt # ###################################################################################### curl -L https://gist.github.com/vraravam/0579373b2028e9b5b08ae87fb39c09d8/raw | sh ##################### # Install oh-my-zsh # ##################### export ZSH= [ ! -d "${HOME}/.oh-my-zsh" ] && curl -L http://install.ohmyz.sh | sh override_prompt https://gist.github.com/vraravam/a64d51fff250271aa7669438db5bd6a5/raw "${HOME}/.zshenv" override_prompt https://gist.github.com/vraravam/51e0516f5d7c6beec67668d1a31b7da8/raw "${HOME}/.zlogin" override_prompt https://gist.github.com/vraravam/ce8654afd65def117dc17e2b0a30156c/raw "${HOME}/.zprofile" override_prompt https://gist.github.com/vraravam/657c3b94d1b04bacd2b6a38c22d6ec56/raw "${HOME}/.zshrc" override_prompt https://gist.github.com/vraravam/9c8d9f335159f90c3fff890bcf3856d6/raw "${HOME}/.zshrc.custom" override_prompt https://gist.github.com/vraravam/ce0dda29bb07f0504df8686cfd2755ca/raw "${HOME}/.aliases" override_prompt https://gist.github.com/vraravam/93077cb859cdb64793cc500791da6dce/raw "${HOME}/.p10k.zsh" override_prompt https://gist.github.com/vraravam/d8c0a88d0046225e5700f6ba7258da65/raw "${HOME}/.gitignore" override_prompt https://gist.github.com/vraravam/eab090e70a545934f409/raw "${HOME}/.gitconfig" override_prompt https://gist.github.com/vraravam/e9676759db46950e1fd817e49e513394/raw "${HOME}/.gitconfig-template.inc" ################################## # Install custom plugins for zsh # ################################## ZSH_CUSTOM=${ZSH_CUSTOM:-${HOME}/.oh-my-zsh/custom} [ ! -d "${ZSH_CUSTOM}/plugins/evalcache" ] && git clone --depth=1 https://github.com/mroth/evalcache "${ZSH_CUSTOM}/plugins/evalcache" # Note: Do not move these into 'Brewfile' - since that breaks the linking for omz plugins location [ ! -d "${ZSH_CUSTOM}/plugins/zsh-syntax-highlighting" ] && git clone --depth=1 https://github.com/zsh-users/zsh-syntax-highlighting "${ZSH_CUSTOM}/plugins/zsh-syntax-highlighting" [ ! -d "${ZSH_CUSTOM}/plugins/zsh-autosuggestions" ] && git clone --depth=1 https://github.com/zsh-users/zsh-autosuggestions "${ZSH_CUSTOM}/plugins/zsh-autosuggestions" ################################ # Prep for installing homebrew # ################################ source "${HOME}/.zshenv" source "${HOME}/.zprofile" # TODO: Don't run this here - it fails (need to figure out how to fix it) # exec zsh sudo mkdir -p "${HOMEBREW_PREFIX}/tmp" "${HOMEBREW_PREFIX}/repository" "${HOMEBREW_PREFIX}/plugins" "${HOMEBREW_PREFIX}/bin" sudo chown -fR "${USERNAME}":admin "${HOMEBREW_PREFIX}" # sudo rm -rf ${HOME}/.gnupg # to delete gpg keys that might have been generated from an older version of gpg ####################################### # Install homebrew (on empty machine) # ####################################### command_exists brew || /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)" override_prompt https://gist.github.com/vraravam/8c9eae91a3750bed86b81e3a4711f842/raw "${HOME}/Brewfile" brew bundle check || brew bundle --all || true ########################################### # Link programs to open from the cmd-line # ########################################### replace_executable_if_exists_and_is_not_symlinked() { test -e "$1" && rm -fv "$2"; ln -sf "$1" "$2" } # if we are using 'code-insiders' only, symlink it to 'code' for ease of typing # replace_executable_if_exists_and_is_not_symlinked "${HOMEBREW_PREFIX}/bin/code-insiders" "${HOMEBREW_PREFIX}/bin/code" # Manual: Open VS Code and turn on syncing of the preferences data # if we are using 'vscodium-insiders' only, symlink it to 'codium' for ease of typing replace_executable_if_exists_and_is_not_symlinked "${HOMEBREW_PREFIX}/bin/codium-insiders" "${HOMEBREW_PREFIX}/bin/codium" # extra: also symlink for 'code' ln -sf "${HOMEBREW_PREFIX}/bin/codium-insiders" "${HOMEBREW_PREFIX}/bin/code" # Setup rider for use from the cmd-line # replace_executable_if_exists_and_is_not_symlinked "/Applications/Rider.app/Contents/MacOS/rider" "${HOMEBREW_PREFIX}/bin/rider" # Setup idea for use from the cmd-line # replace_executable_if_exists_and_is_not_symlinked "/Applications/IntelliJ IDEA CE.app/Contents/MacOS/idea" "${HOMEBREW_PREFIX}/bin/idea" # defaults write -g NSFileViewer -string org.yanex.marta # To revert back to use Finder as default file manager you can enter # defaults delete -g NSFileViewer # ln -sf /Applications/Marta.app/Contents/Resources/launcher ${HOMEBREW_PREFIX}/bin/marta # Setup login items setup_login_item() { test -d "/Applications/$1" && echo "Setting up $1 as a login item" && osascript -e "tell application \"System Events\" to make login item at end with properties {path:\"/Applications/$1\", hidden:false}" 2>&1 > /dev/null } setup_login_item "AlDente.app" setup_login_item "Clocker.app" setup_login_item "Cloudflare WARP.app" setup_login_item "Command X.app" setup_login_item "Flycut.app" setup_login_item "iBar.app" setup_login_item "Itsycal.app" setup_login_item "KeepingYouAwake.app" setup_login_item "Keybase.app" setup_login_item "Rectangle.app" setup_login_item "Stats.app" echo "********** Finished auto installation process: MANUALLY QUIT AND RESTART iTerm2 and Terminal apps **********" echo "1. Please ensure to edit the ${HOME}/.gitconfig* files to have your name and email configured instead of mine" echo "2. Use ${HOME}/.gitconfig-template.inc as a template to create equivalent configuration files with your logins" echo "3. Go to Terminal > Preferences > Profiles > Basic > Text > Change Font to 'MesloLGS Nerd Font'" echo "4. Go to iTerm2 > Preferences > Profiles > Default > Text > Change Font to 'MesloLGS Nerd Font'" echo "5. Go to iTerm2 > Preferences > Profiles > Default > Keys > Key Mappings > Presets (and choose 'Natural Text Editing')"