-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbootstrap.sh
executable file
·321 lines (269 loc) · 8.81 KB
/
bootstrap.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
#!/bin/bash
set -o errexit
set -o pipefail
# Define script-level variables
BREWFILE="./Brewfile"
DOTFILES=(".aliases"
".ansible.cfg"
".aws/config:.aws"
".curlrc"
".functions"
".gitattributes"
".gitconfig"
".gitconfig-personal"
".gitconfig-work"
".gitignore-global"
".gnupg/gpg-agent.conf:.gnupg"
".gnupg/gpg.conf:.gnupg"
".pylintrc"
".screenrc"
".ssh/config:.ssh"
".wgetrc")
DOTFILES_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# Helper function to detect if Homebrew is installed
_detect_brew() {
command -v brew &> /dev/null
}
# Helper function to detect the operating system
_detect_os() {
case "$(uname -s)" in
"Darwin") echo "osx" ;;
"Linux") echo "linux" ;;
*) echo "unknown" ;;
esac
}
_display_message() {
local message="$1"
local in_progress="$2"
local success="$3"
local num_tabs="$4"
local color_start="\033[0;37m" # White color
local color_end="\033[0m" # Reset color
local indentation=""
for ((i = 0; i < num_tabs; i++)); do
indentation+="\t" # Add tabs based on the provided number
done
if [ "$in_progress" = true ]; then
indentation+="\t" # Add one additional tab for in-progress messages
elif [ "$success" = true ]; then
indentation+="\t" # Add one additional tab for regular success messages
fi
if [ "$success" = false ]; then
local status="[KO]"
local status_color="\033[0;31m" # Red color for failure
else
local status="[OK]"
local status_color="\033[0;32m" # Green color for success
fi
echo -e "${color_start}${indentation}$message ${status_color}$status${color_end}"
}
_get_sudo_password() {
local password_required=false
local OS
OS="$(_detect_os)"
if [ "$OS" = "osx" ]; then
password_required=true
fi
if [ "$password_required" = true ]; then
echo "Enter your sudo password:"
read -s -r PASSWORD
if [ -z "$PASSWORD" ]; then
echo "Sudo password is empty... Aborting."
exit 1
fi
fi
}
_homebrew_clean_up() {
if brew cleanup > /dev/null 2>&1; then
_display_message "HomeBrew cleanup completed successfully." false true 1
else
_display_message "Error during HomeBrew cleanup." false true 1
fi
}
_homebrew_update() {
if brew update > /dev/null 2>&1; then
_display_message "HomeBrew update completed successfully." false true 1
else
_display_message "Error updating HomeBrew." false true 1
fi
}
_homebrew_upgrade() {
if brew upgrade > /dev/null 2>&1; then
_display_message "HomeBrew upgrade completed successfully." false true 1
else
_display_message "Error upgrading HomeBrew packages." false true 1
fi
}
_homebrew_install() {
if _detect_brew; then
_display_message "HomeBrew is already installed." false true 2
else
local OS
OS="$(_detect_os)"
local install_message
case "$OS" in
"osx")
install_message="Installing HomeBrew for macOS..."
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
;;
"linux")
install_message="Installing HomeBrew for Linux..."
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Linuxbrew/install/master/install.sh)"
;;
*)
_display_message "Unsupported operating system: $OS. HomeBrew installation aborted." false true 2
exit 1
;;
esac
if ! _detect_brew; then
_display_message "Failed to install HomeBrew." false true 2
exit 1
fi
_display_message "$install_message" false true 1
fi
}
_install_oh_my_zsh() {
if command -v omz &> /dev/null; then
_display_message "Oh My Zsh is already installed." false true 2
return
fi
_display_message "Installing Oh My Zsh..." false true 1
local install_script_url="https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh"
sh -c "$(curl -fsSL "$install_script_url")" "" --unattended
if [ $? -eq 0 ]; then
_display_message "Oh My Zsh installation completed successfully." false true 1
else
_display_message "Oh My Zsh installation failed." false true 1
fi
}
_install_packages_from_brewfile() {
local BREWFILE="$1"
local PASSWORD="$2"
if [ -f "$BREWFILE" ]; then
bundle_output=$(echo "$PASSWORD" | brew bundle --file="$BREWFILE" --verbose)
if [ $? -eq 0 ]; then
while IFS= read -r line; do
if [[ "$line" == "Installing"* ]]; then
package_name="${line#Installing }"
_display_message "$package_name installed successfully." false true 1
fi
done <<< "$bundle_output"
_display_message "Brewfile packages installation completed successfully!" false true 2
else
_display_message "Error during Brewfile installation. See the output below for details:" false true 2
echo "$bundle_output"
fi
else
_display_message "Brewfile not found: $BREWFILE" false true 2
fi
}
_install_xcode_command_line_tools() {
if ! (xcode-select -p > /dev/null 2>&1); then
_display_message "Installing Xcode Command Line Tools..." true true 1
if (xcode-select --install > /dev/null 2>&1); then
_display_message "Xcode Command Line Tools installed successfully." false true 1
else
_display_message "Failed to initiate Xcode Command Line Tools installation." false false 1
exit 1
fi
else
_display_message "Xcode Command Line Tools are already installed." false true 1
fi
}
_install_macos_updates() {
local PASSWORD="$1"
local OS
OS="$(_detect_os)"
if [ "$OS" = "osx" ]; then
software_update_output=$(echo "$PASSWORD" | sudo -S softwareupdate -i -a > /dev/null 2>&1)
if [ $? -eq 0 ]; then
_display_message "macOS Software updates completed successfully." false true 1
else
_display_message "Error running macOS software updates." false true 1
fi
else
_display_message "Software updates are only supported on macOS." false true 1
fi
}
_set_up_dot_files() {
errors=()
for dotfile in "${DOTFILES[@]}"; do
IFS=":" read -r NAME SUBDIR <<< "$dotfile"
SUBDIR="${SUBDIR:-}"
mkdir -p "$HOME/$SUBDIR"
if ln -sfn "$DOTFILES_DIR/$NAME" "$HOME/$NAME"; then
_display_message "Symbolic link for $NAME created." false true 1
else
errors+=("Failed to create symbolic link for $NAME.")
fi
done
if [ ${#errors[@]} -ne 0 ]; then
_display_message "Dotfiles installation completed with the following errors:" false true 1
for error in "${errors[@]}"; do
_display_message "- $error" false true 1
done
else
_display_message "Dotfiles installation completed successfully!" false true 0
fi
}
_bootstrap_process() {
local xcode_tools_checked=false
_display_message "Pre-flight checks processes started..." true true 0
if ! (xcode-select -p > /dev/null 2>&1); then
_display_message "Installing Xcode Command Line Tools..." true true 1
if (xcode-select --install > /dev/null 2>&1); then
_display_message "Xcode Command Line Tools installed successfully." false true 1
else
_display_message "Failed to initiate Xcode Command Line Tools installation." false false 1
return 1
fi
xcode_tools_checked=true
else
_display_message "Xcode Command Line Tools are already installed." false true 1
fi
if _detect_brew; then
_display_message "HomeBrew is already installed." false true 1
else
if _homebrew_install; then
_display_message "HomeBrew installed successfully." false true 1
else
_display_message "Error installing HomeBrew." false false 1
return 1
fi
fi
_display_message "HomeBrew maintenance process started..." true true 0
_homebrew_update
_homebrew_upgrade
_homebrew_clean_up
if [ "$xcode_tools_checked" = true ]; then
_display_message "HomeBrew package install process started..." true true 0
_install_packages_from_brewfile "$BREWFILE" "$PASSWORD"
fi
#if ! command -v omz &> /dev/null; then
# _install_oh_my_zsh
#else
# _display_message "Oh My Zsh is already installed." false true 1
#fi
_display_message "Setting up dotfiles process started..." true true 0
_set_up_dot_files
_display_message "Setting up mac OS preferences process started..." true true 0
if [ -f "macos.sh" ]; then
source "macos.sh"
else
_display_message "Warning: macos.sh file not found."
exit 1
fi
_display_message "Setting up mac OS preferences process finished succesfully..." true true 0
_display_message "Setting up aliases.." true true 0
if [ -f "$HOME/.aliases" ]; then
source "$HOME/.aliases"
else
_display_message "Warning: .aliases file not found."
exit 1
fi
_display_message "Setting up aliases process finished succesfully..." true true 0
}
_get_sudo_password
echo -e "--- Bootstrap Process ---"
_bootstrap_process
echo -e "--- Bootstrap Process Completed Successfully ---"