Add distro detection, confirm helper, remote self-bootstrap
Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
+65
-2
@@ -51,6 +51,35 @@ print_banner() {
|
|||||||
echo ""
|
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)
|
# Danh sách target fix cứng (alias từ ~/.ssh/config)
|
||||||
# -----------------------------
|
# -----------------------------
|
||||||
@@ -98,20 +127,54 @@ select_target() {
|
|||||||
done
|
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 (phân nhánh theo argv)
|
||||||
# -----------------------------
|
# -----------------------------
|
||||||
main() {
|
main() {
|
||||||
if [ "${1:-}" = "--run-steps" ]; then
|
if [ "${1:-}" = "--run-steps" ]; then
|
||||||
echo "${C_TITLE}===== 🧹 Cleanup-server (--run-steps) =====${C_RESET}"
|
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
|
return
|
||||||
fi
|
fi
|
||||||
print_banner
|
print_banner
|
||||||
echo "${C_TITLE}===== 🧹 Cleanup-server =====${C_RESET}"
|
echo "${C_TITLE}===== 🧹 Cleanup-server =====${C_RESET}"
|
||||||
echo ""
|
echo ""
|
||||||
select_target
|
select_target
|
||||||
echo " Đã chọn target: ${C_TITLE}${TARGET}${C_RESET} (chạy sẽ thêm ở Task 3)"
|
echo ""
|
||||||
|
run_on_target "$TARGET"
|
||||||
}
|
}
|
||||||
|
|
||||||
main "$@"
|
main "$@"
|
||||||
|
|||||||
Reference in New Issue
Block a user