Add distro detection, confirm helper, remote self-bootstrap

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2026-07-22 00:16:17 +07:00
co-authored by Claude
parent 6fa2891d41
commit e031bd0c6d
+65 -2
View File
@@ -51,6 +51,35 @@ print_banner() {
echo ""
}
# -----------------------------
# Phát hiện distro qua /etc/os-release → debian | arch | unknown
# -----------------------------
detect_distro() {
[ -r /etc/os-release ] || { echo unknown; return; }
local id id_like
. /etc/os-release 2>/dev/null
id="${ID:-}"; id_like="${ID_LIKE:-}"
case "$id $id_like" in
*arch*) echo arch ;;
*debian*) echo debian ;;
*ubuntu*) echo debian ;;
*) echo unknown ;;
esac
}
# -----------------------------
# Hỏi Y/n (Enter = Yes). Trả về 0 = đồng ý, 1 = hủy.
# -----------------------------
confirm_yn() {
local prompt="$1" confirm
read -r -p " ${prompt} (Y/n): " confirm
if [[ -n "$confirm" && ! "$confirm" =~ ^([yY]|[yY][eE][sS])$ ]]; then
echo " Đã hủy."
return 1
fi
return 0
}
# -----------------------------
# Danh sách target fix cứng (alias từ ~/.ssh/config)
# -----------------------------
@@ -98,20 +127,54 @@ select_target() {
done
}
# -----------------------------
# Chạy tuần tự 6 bước (stub — các bước thêm ở Task 4-9)
# -----------------------------
run_all_steps() {
echo " (các bước cleanup sẽ thêm ở Task 4-9)"
}
# -----------------------------
# Chạy trên target đã chọn.
# local → chạy tại chỗ.
# alias → self-bootstrap: base64 script qua argv, giữ stdin=terminal
# để read/màu tương tác hoạt động qua PTY của `ssh -t`.
# -----------------------------
run_on_target() {
local target="$1"
if [ "$target" = "local" ]; then
run_all_steps
return $?
fi
local b64
b64=$(base64 < "$0" | tr -d '\n') || {
echo "${C_DEL} ✗ Không mã hóa được script.${C_RESET}"
return 1
}
# Giải mã ra file tạm trên remote rồi chạy; stdin không bị redirect → read OK.
ssh -t "$target" \
"umask 077; t=\$(mktemp); printf '%s' '$b64' | base64 -d > \"\$t\" && bash \"\$t\" --run-steps; r=\$?; rm -f \"\$t\"; exit \$r" \
|| { echo "${C_DEL} ✗ ssh tới $target thất bại.${C_RESET}"; return 1; }
}
# -----------------------------
# Main (phân nhánh theo argv)
# -----------------------------
main() {
if [ "${1:-}" = "--run-steps" ]; then
echo "${C_TITLE}===== 🧹 Cleanup-server (--run-steps) =====${C_RESET}"
echo " (chưa có bước nào — sẽ thêm ở task sau)"
echo ""
run_all_steps
echo ""
echo "${C_OK}===== ✅ Cleanup-server hoàn tất =====${C_RESET}"
return
fi
print_banner
echo "${C_TITLE}===== 🧹 Cleanup-server =====${C_RESET}"
echo ""
select_target
echo " Đã chọn target: ${C_TITLE}${TARGET}${C_RESET} (chạy sẽ thêm ở Task 3)"
echo ""
run_on_target "$TARGET"
}
main "$@"