From e031bd0c6da39795a52a8023426e52e15f409be6 Mon Sep 17 00:00:00 2001 From: thuanle Date: Wed, 22 Jul 2026 00:16:17 +0700 Subject: [PATCH] Add distro detection, confirm helper, remote self-bootstrap Co-Authored-By: Claude --- cleanup-server | 67 ++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 65 insertions(+), 2 deletions(-) diff --git a/cleanup-server b/cleanup-server index c21e854..fe72f15 100755 --- a/cleanup-server +++ b/cleanup-server @@ -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 "$@"