-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathinstall.sh
More file actions
346 lines (291 loc) · 11.3 KB
/
install.sh
File metadata and controls
346 lines (291 loc) · 11.3 KB
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
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
#!/bin/bash
# install.sh - Script principal de instalação do AtlasStack
# Oferece menu de múltipla escolha para instalação de soluções específicas
# Comportamento não-interativo por padrão, com opções para modo interativo
set -euo pipefail
# ============================================================================
# CONFIGURAÇÕES GLOBAIS
# ============================================================================
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
COMMON_SCRIPT="${SCRIPT_DIR}/scripts/common.sh"
# Modo de operação (default: não-interativo)
INTERACTIVE_MODE=false
AUTO_YES=true
# ============================================================================
# ESTRUTURA ASSOCIATIVA DE SOLUÇÕES
# ============================================================================
# Declarar array associativo para registrar soluções disponíveis
declare -A SOLUTIONS
declare -A SOLUTION_DESCRIPTIONS
declare -A SOLUTION_SCRIPTS
# Registrar soluções disponíveis
SOLUTIONS["atlas"]="AtlasStack Core"
SOLUTION_DESCRIPTIONS["atlas"]="Instalação base do AtlasStack com dependências essenciais"
SOLUTION_SCRIPTS["atlas"]="${SCRIPT_DIR}/scripts/install_atlas.sh"
SOLUTIONS["monitoring"]="Monitoramento"
SOLUTION_DESCRIPTIONS["monitoring"]="Stack de monitoramento (Prometheus, Grafana)"
SOLUTION_SCRIPTS["monitoring"]="${SCRIPT_DIR}/scripts/install_monitoring.sh"
SOLUTIONS["logging"]="Logging"
SOLUTION_DESCRIPTIONS["logging"]="Stack de logs (ELK/Loki)"
SOLUTION_SCRIPTS["logging"]="${SCRIPT_DIR}/scripts/install_logging.sh"
SOLUTIONS["cicd"]="CI/CD"
SOLUTION_DESCRIPTIONS["cicd"]="Pipeline CI/CD (Jenkins/GitLab Runner)"
SOLUTION_SCRIPTS["cicd"]="${SCRIPT_DIR}/scripts/install_cicd.sh"
SOLUTIONS["security"]="Security Audit"
SOLUTION_DESCRIPTIONS["security"]="Ferramentas de auditoria de segurança"
SOLUTION_SCRIPTS["security"]="${SCRIPT_DIR}/scripts/install_security.sh"
SOLUTIONS["cmdb"]="CMDB"
SOLUTION_DESCRIPTIONS["cmdb"]="Sistema de gestão de configuração"
SOLUTION_SCRIPTS["cmdb"]="${SCRIPT_DIR}/scripts/install_cmdb.sh"
# ============================================================================
# CARREGAR FUNÇÕES COMUNS
# ============================================================================
if [[ -f "${COMMON_SCRIPT}" ]]; then
# shellcheck source=scripts/common.sh
source "${COMMON_SCRIPT}"
else
# Fallback: definir funções básicas se common.sh não existir
log_info() { echo -e "\033[0;32m[INFO]\033[0m $1"; }
log_warn() { echo -e "\033[1;33m[WARN]\033[0m $1"; }
log_error() { echo -e "\033[0;31m[ERROR]\033[0m $1" >&2; }
log_success() { echo -e "\033[0;32m[SUCCESS]\033[0m $1"; }
fi
# ============================================================================
# FUNÇÕES AUXILIARES
# ============================================================================
# Exibir banner
show_banner() {
cat << "EOF"
╔══════════════════════════════════════════════════════════════════════╗
║ ║
║ 🗺️ AtlasStack Installer ║
║ ║
║ logs decifrados, falhas diagnosticadas, ║
║ servidores configurados ║
║ ║
╚══════════════════════════════════════════════════════════════════════╝
EOF
}
# Exibir uso do script
show_usage() {
cat << EOF
Uso: $0 [OPÇÕES] [SOLUÇÕES...]
OPÇÕES:
-i, --interactive Modo interativo com menu de seleção
-a, --all Instalar todas as soluções disponíveis
-y, --yes Responder 'sim' automaticamente (não-interativo)
-h, --help Exibir esta mensagem de ajuda
-l, --list Listar soluções disponíveis
SOLUÇÕES:
$(list_solutions_short)
EXEMPLOS:
# Instalação não-interativa da solução base
$0 atlas
# Instalação não-interativa de múltiplas soluções
$0 atlas monitoring logging
# Modo interativo com menu
$0 --interactive
# Instalação de todas as soluções (não-interativo)
$0 --all --yes
EOF
}
# Listar soluções disponíveis (formato curto)
list_solutions_short() {
for key in "${!SOLUTIONS[@]}"; do
echo " $key - ${SOLUTIONS[$key]}"
done | sort
}
# Listar soluções disponíveis (formato detalhado)
list_solutions_detailed() {
echo ""
log_info "Soluções disponíveis:"
echo ""
local i=1
for key in $(echo "${!SOLUTIONS[@]}" | tr ' ' '\n' | sort); do
printf " %d) %-15s - %s\n" "$i" "${SOLUTIONS[$key]}" "${SOLUTION_DESCRIPTIONS[$key]}"
printf " Script: %s\n\n" "${SOLUTION_SCRIPTS[$key]}"
((i++))
done
}
# Verificar se solução existe
solution_exists() {
local solution="$1"
[[ -n "${SOLUTIONS[$solution]:-}" ]]
}
# Verificar se script de solução existe
script_exists() {
local solution="$1"
local script="${SOLUTION_SCRIPTS[$solution]:-}"
[[ -n "$script" ]] && [[ -f "$script" ]]
}
# Instalar solução específica
install_solution() {
local solution="$1"
if ! solution_exists "$solution"; then
log_error "Solução '$solution' não encontrada."
return 1
fi
local script="${SOLUTION_SCRIPTS[$solution]}"
if ! script_exists "$solution"; then
log_warn "Script de instalação não encontrado: $script"
log_warn "Criando placeholder para desenvolvimento futuro..."
return 1
fi
log_info "Instalando: ${SOLUTIONS[$solution]}"
log_info "Script: $script"
echo ""
# Executar script de instalação
# Passar flag --yes se em modo não-interativo
if [[ "$AUTO_YES" == true ]]; then
bash "$script" --yes
else
bash "$script"
fi
local exit_code=$?
if [[ $exit_code -eq 0 ]]; then
log_success "${SOLUTIONS[$solution]} instalado com sucesso!"
return 0
else
log_error "Falha ao instalar ${SOLUTIONS[$solution]} (código: $exit_code)"
return 1
fi
}
# Menu interativo de seleção
show_interactive_menu() {
echo ""
log_info "Selecione as soluções para instalar:"
echo ""
local i=1
local -a solution_keys=()
# Criar array ordenado de chaves
for key in $(echo "${!SOLUTIONS[@]}" | tr ' ' '\n' | sort); do
solution_keys+=( "$key" )
printf " %d) %s\n" "$i" "${SOLUTIONS[$key]}"
printf " %s\n\n" "${SOLUTION_DESCRIPTIONS[$key]}"
((i++))
done
printf " 0) Instalar TODAS as soluções\n"
printf " q) Sair\n\n"
# Ler seleção do usuário
read -rp "Digite os números das soluções (separados por espaço) ou 0 para todas: " selection
# Processar seleção
if [[ "$selection" =~ ^[qQ]$ ]]; then
log_info "Instalação cancelada pelo usuário."
exit 0
elif [[ "$selection" == "0" ]]; then
# Instalar todas
for key in "${solution_keys[@]}"; do
install_solution "$key" || log_warn "Continuando após falha..."
done
else
# Instalar soluções selecionadas
for num in $selection; do
if [[ "$num" =~ ^[0-9]+$ ]] && [[ $num -gt 0 ]] && [[ $num -le ${#solution_keys[@]} ]]; then
local idx=$((num - 1))
install_solution "${solution_keys[$idx]}" || log_warn "Continuando após falha..."
else
log_warn "Seleção inválida ignorada: $num"
fi
done
fi
}
# ============================================================================
# PROCESSAMENTO DE ARGUMENTOS
# ============================================================================
parse_arguments() {
local -a solutions_to_install=()
while [[ $# -gt 0 ]]; do
case $1 in
-i|--interactive)
INTERACTIVE_MODE=true
AUTO_YES=false
shift
;;
-a|--all)
for key in "${!SOLUTIONS[@]}"; do
solutions_to_install+=("$key")
done
shift
;;
-y|--yes)
AUTO_YES=true
shift
;;
-l|--list)
list_solutions_detailed
exit 0
;;
-h|--help)
show_usage
exit 0
;;
-*)
log_error "Opção desconhecida: $1"
show_usage
exit 1
;;
*)
# Assumir que é nome de solução
if solution_exists "$1"; then
solutions_to_install+=("$1")
else
log_error "Solução desconhecida: $1"
echo ""
list_solutions_short
exit 1
fi
shift
;;
esac
done
# Retornar array via echo (workaround para Bash)
echo "${solutions_to_install[@]}"
}
# ============================================================================
# FUNÇÃO PRINCIPAL
# ============================================================================
main() {
show_banner
# Parse argumentos
local -a solutions_to_install
if [[ $# -eq 0 ]]; then
# Sem argumentos: modo interativo por padrão
INTERACTIVE_MODE=true
AUTO_YES=false
else
# Processar argumentos
read -ra solutions_to_install <<< "$(parse_arguments "$@")"
fi
# Modo interativo
if [[ "$INTERACTIVE_MODE" == true ]]; then
show_interactive_menu
elif [[ ${#solutions_to_install[@]} -eq 0 ]]; then
log_warn "Nenhuma solução especificada."
show_usage
exit 1
else
# Modo não-interativo: instalar soluções especificadas
echo ""
log_info "Instalando ${#solutions_to_install[@]} solução(ões)..."
echo ""
local failed=0
for solution in "${solutions_to_install[@]}"; do
install_solution "$solution" || ((failed++))
echo ""
done
# Resumo final
echo "═══════════════════════════════════════════════════════════════"
if [[ $failed -eq 0 ]]; then
log_success "Todas as soluções foram instaladas com sucesso!"
else
log_warn "Instalação concluída com $failed falha(s)."
fi
echo "═══════════════════════════════════════════════════════════════"
fi
}
# ============================================================================
# PONTO DE ENTRADA
# ============================================================================
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
main "$@"
fi