#!/usr/bin/env zsh # 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/tomthomasvempala/48aa2d5ddda01818e0a0252e58566c74/raw -o fresh-install.sh; chmod +x ./fresh-install.sh; ./fresh-install.sh # BEFORE STARTING TO RUN THIS SCRIPT (for the first time on a new machine) # 1. Login into Apple App store # 2. Turn on File Vault encryption in System Preferences # 3. Turn off battery from showing in the Control Center # These env vars are defined by (duplicated intentionally) since this script would bootstrap the installation USERNAME=${USERNAME:-$(whoami)} PERSONAL_PROFILES_DIR=${PERSONAL_PROFILES_DIR:-"${HOME}/Personal/${USERNAME}/profiles"} # Set DNS of 8.8.8.8 before proceeding (in some cases, for eg Jio Wifi, gist.github doesn't resolve at all and times out) sudo networksetup -setdnsservers Wi-Fi 8.8.8.8 ################################## # 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 read "yn?$(red 'already present'). Should I override [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/tomthomasvempala/a52abe3e0b0f09dfd76114fabe5dd74c/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/tomthomasvempala/3ba865ebbf633e160e3b4800cc9e84e4/raw "${HOME}/.gitignore" override_prompt https://gist.github.com/tomthomasvempala/5d2fbc5dc0b3688d0fa752853b64ecfe/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} mkdir -p "${ZSH_CUSTOM}/plugins" clone_if_not_present() { [ ! -d "${ZSH_CUSTOM}/plugins/$(basename $1)" ] && git -C "${ZSH_CUSTOM}/plugins" clone --depth=1 $1 } clone_if_not_present https://github.com/mroth/evalcache # Note: Do not move these into 'Brewfile' - since that breaks the linking for omz plugins location clone_if_not_present https://github.com/zsh-users/zsh-syntax-highlighting clone_if_not_present https://github.com/zsh-users/zsh-autosuggestions ################################ # Prep for installing homebrew # ################################ source "${HOME}/.zshenv" source "${HOME}/.zprofile" 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 || bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)" override_prompt https://gist.github.com/tomthomasvempala/63177c840018d09af9437cf59efd389d/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' # test -e "${HOMEBREW_PREFIX}/bin/codium" && ln -sf "${HOMEBREW_PREFIX}/bin/codium" "${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. Use ${HOME}/.gitconfig-template.inc as a template to create equivalent configuration files with your logins and make corresponding changes in ${HOME}/.gitconfig to reflect the same" echo "2. Go to Terminal > Preferences > Profiles > Basic > Text > Change Font to 'MesloLGS Nerd Font'" echo "3. Go to iTerm2 > Preferences > Profiles > Default > Text > Change Font to 'MesloLGS Nerd Font'" echo "4. Go to iTerm2 > Preferences > Profiles > Default > Keys > Key Mappings > Presets (and choose 'Natural Text Editing')"