Feature: Installer-Spinner + verbesserter Smoke-Test
- Spinner (⠋⠙⠹…) läuft während quietly() auf Abschluss wartet - stop_spin() in ok/warn/err integriert, EXIT-Trap sichert Cleanup - Smoke-Test: kein eval, separate Funktionen pro Protokoll (smtp/tls/imap/pop3) - Service-Namen neben Port, Zusammenfassung X/7 Dienste erreichbar Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>main
parent
eb16f7d6ad
commit
f8f30d57f7
102
installer.sh
102
installer.sh
|
|
@ -86,6 +86,27 @@ footer_ok() {
|
||||||
}
|
}
|
||||||
|
|
||||||
_STEP_T=0
|
_STEP_T=0
|
||||||
|
_SPIN_PID=
|
||||||
|
|
||||||
|
_spin_bg() {
|
||||||
|
local chars='⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏'
|
||||||
|
local n=${#chars} i=0
|
||||||
|
while true; do
|
||||||
|
printf "\r \033[0;90m${chars:$i:1}\033[0m"
|
||||||
|
i=$(( (i + 1) % n ))
|
||||||
|
sleep 0.1
|
||||||
|
done
|
||||||
|
}
|
||||||
|
start_spin() { _spin_bg & _SPIN_PID=$!; }
|
||||||
|
stop_spin() {
|
||||||
|
[[ -n "${_SPIN_PID:-}" ]] || return 0
|
||||||
|
kill "$_SPIN_PID" 2>/dev/null || true
|
||||||
|
wait "$_SPIN_PID" 2>/dev/null || true
|
||||||
|
_SPIN_PID=
|
||||||
|
printf "\r\033[K"
|
||||||
|
}
|
||||||
|
trap 'stop_spin' EXIT INT TERM
|
||||||
|
|
||||||
step() {
|
step() {
|
||||||
local msg="$1" dur="${2:-}"
|
local msg="$1" dur="${2:-}"
|
||||||
[ -n "$dur" ] && dur=" ${GREY}(~${dur})${NC}" || dur=""
|
[ -n "$dur" ] && dur=" ${GREY}(~${dur})${NC}" || dur=""
|
||||||
|
|
@ -93,22 +114,26 @@ step() {
|
||||||
_STEP_T=$SECONDS
|
_STEP_T=$SECONDS
|
||||||
}
|
}
|
||||||
ok() {
|
ok() {
|
||||||
|
stop_spin
|
||||||
local t=$(( SECONDS - _STEP_T ))
|
local t=$(( SECONDS - _STEP_T ))
|
||||||
[ $t -gt 1 ] && printf " ${GREEN}✔${NC} ${GREY}%ds${NC}\n" $t || printf " ${GREEN}✔${NC}\n"
|
[ $t -gt 1 ] && printf " ${GREEN}✔${NC} ${GREY}%ds${NC}\n" $t || printf " ${GREEN}✔${NC}\n"
|
||||||
}
|
}
|
||||||
warn() { printf " ${YELLOW}⚠${NC} %s\n" "$*"; }
|
warn() { stop_spin; printf " ${YELLOW}⚠${NC} %s\n" "$*"; }
|
||||||
err() { printf " ${RED}✗${NC} %s\n" "$*"; }
|
err() { stop_spin; printf " ${RED}✗${NC} %s\n" "$*"; }
|
||||||
|
|
||||||
quietly() {
|
quietly() {
|
||||||
|
start_spin
|
||||||
if ! "$@" >> "$LOG_FILE" 2>&1; then
|
if ! "$@" >> "$LOG_FILE" 2>&1; then
|
||||||
printf "\n ${RED}✗${NC} Fehlgeschlagen. Letzte Log-Zeilen:\n\n"
|
stop_spin
|
||||||
|
printf " ${RED}✗${NC} Fehlgeschlagen. Letzte Log-Zeilen:\n\n"
|
||||||
tail -20 "$LOG_FILE" | sed 's/^/ /'
|
tail -20 "$LOG_FILE" | sed 's/^/ /'
|
||||||
printf "\n ${GREY}Vollständiges Log: %s${NC}\n\n" "$LOG_FILE"
|
printf "\n ${GREY}Vollständiges Log: %s${NC}\n\n" "$LOG_FILE"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
stop_spin
|
||||||
}
|
}
|
||||||
try_quiet() { "$@" >> "$LOG_FILE" 2>&1 || true; }
|
try_quiet() { "$@" >> "$LOG_FILE" 2>&1 || true; }
|
||||||
log() { :; } # Kompatibilität — stille Ausgabe
|
log() { :; }
|
||||||
require_root() { [ "$(id -u)" -eq 0 ] || { err "Bitte als root ausführen."; exit 1; }; }
|
require_root() { [ "$(id -u)" -eq 0 ] || { err "Bitte als root ausführen."; exit 1; }; }
|
||||||
|
|
||||||
# ===== IP ermitteln =====
|
# ===== IP ermitteln =====
|
||||||
|
|
@ -869,28 +894,59 @@ chmod 600 /etc/monit/monitrc
|
||||||
try_quiet systemctl enable --now monit
|
try_quiet systemctl enable --now monit
|
||||||
|
|
||||||
# ===== Smoke-Test =====
|
# ===== Smoke-Test =====
|
||||||
step "Port-Check" "30 Sek"
|
step "Dienste prüfen (Port-Check)"
|
||||||
set +e
|
_sok=0; _sfail=0
|
||||||
_smoke_ok=0; _smoke_fail=0
|
|
||||||
smoke_port() {
|
smoke_smtp() {
|
||||||
local port="$1" result
|
local port="$1" label="$2"
|
||||||
result=$(eval "$2" 2>&1)
|
local out
|
||||||
if echo "$result" | grep -qiE '(220|OK|\+OK|CAPABILITY)'; then
|
out=$(printf "EHLO localhost\r\nQUIT\r\n" | timeout 5s nc -w3 127.0.0.1 "$port" 2>/dev/null || true)
|
||||||
printf " ${GREEN}✔${NC} Port %-5s erreichbar\n" "$port"
|
if echo "$out" | grep -q '^220'; then
|
||||||
(( _smoke_ok++ )) || true
|
printf " ${GREEN}✔${NC} %-5s %s\n" "$port" "$label"; (( _sok++ )) || true
|
||||||
else
|
else
|
||||||
printf " ${YELLOW}⚠${NC} Port %-5s nicht erreichbar\n" "$port"
|
printf " ${YELLOW}⚠${NC} %-5s %s — nicht erreichbar\n" "$port" "$label"; (( _sfail++ )) || true
|
||||||
(( _smoke_fail++ )) || true
|
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
smoke_port 25 "timeout 5s bash -c 'printf \"EHLO localhost\r\nQUIT\r\n\" | nc -w3 127.0.0.1 25'"
|
smoke_tls() {
|
||||||
smoke_port 465 "timeout 5s openssl s_client -connect 127.0.0.1:465 -brief -quiet </dev/null"
|
local port="$1" label="$2" extra="${3:-}"
|
||||||
smoke_port 587 "timeout 5s openssl s_client -starttls smtp -connect 127.0.0.1:587 -brief -quiet </dev/null"
|
local out
|
||||||
smoke_port 143 "timeout 5s bash -c 'printf \". CAPABILITY\r\n. LOGOUT\r\n\" | nc -w3 127.0.0.1 143'"
|
out=$(timeout 5s openssl s_client $extra -connect 127.0.0.1:"$port" -brief -quiet </dev/null 2>&1 || true)
|
||||||
smoke_port 993 "timeout 5s openssl s_client -connect 127.0.0.1:993 -brief -quiet </dev/null"
|
if echo "$out" | grep -qiE '(CONNECTED|depth|Verify|^220|\+OK|OK)'; then
|
||||||
smoke_port 110 "timeout 5s bash -c 'printf \"QUIT\r\n\" | nc -w3 127.0.0.1 110'"
|
printf " ${GREEN}✔${NC} %-5s %s\n" "$port" "$label"; (( _sok++ )) || true
|
||||||
smoke_port 995 "timeout 5s openssl s_client -connect 127.0.0.1:995 -brief -quiet </dev/null"
|
else
|
||||||
set -e
|
printf " ${YELLOW}⚠${NC} %-5s %s — nicht erreichbar\n" "$port" "$label"; (( _sfail++ )) || true
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
smoke_imap() {
|
||||||
|
local port="$1" label="$2"
|
||||||
|
local out
|
||||||
|
out=$(printf ". CAPABILITY\r\n. LOGOUT\r\n" | timeout 5s nc -w3 127.0.0.1 "$port" 2>/dev/null || true)
|
||||||
|
if echo "$out" | grep -qi 'CAPABILITY'; then
|
||||||
|
printf " ${GREEN}✔${NC} %-5s %s\n" "$port" "$label"; (( _sok++ )) || true
|
||||||
|
else
|
||||||
|
printf " ${YELLOW}⚠${NC} %-5s %s — nicht erreichbar\n" "$port" "$label"; (( _sfail++ )) || true
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
smoke_pop3() {
|
||||||
|
local port="$1" label="$2"
|
||||||
|
local out
|
||||||
|
out=$(printf "QUIT\r\n" | timeout 5s nc -w3 127.0.0.1 "$port" 2>/dev/null || true)
|
||||||
|
if echo "$out" | grep -qi '^\+OK'; then
|
||||||
|
printf " ${GREEN}✔${NC} %-5s %s\n" "$port" "$label"; (( _sok++ )) || true
|
||||||
|
else
|
||||||
|
printf " ${YELLOW}⚠${NC} %-5s %s — nicht erreichbar\n" "$port" "$label"; (( _sfail++ )) || true
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
smoke_smtp 25 "SMTP"
|
||||||
|
smoke_tls 465 "SMTPS" ""
|
||||||
|
smoke_tls 587 "Submission" "-starttls smtp"
|
||||||
|
smoke_imap 143 "IMAP"
|
||||||
|
smoke_tls 993 "IMAPS" ""
|
||||||
|
smoke_pop3 110 "POP3"
|
||||||
|
smoke_tls 995 "POP3S" ""
|
||||||
|
|
||||||
|
printf "\n ${GREY}%d/%d Dienste erreichbar${NC}\n" "$_sok" "$(( _sok + _sfail ))"
|
||||||
|
|
||||||
echo
|
echo
|
||||||
echo -e " ${GREY}Bootstrap-Login (nur für ERSTEN Login & Wizard):${NC}"
|
echo -e " ${GREY}Bootstrap-Login (nur für ERSTEN Login & Wizard):${NC}"
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue