#!/bin/bash
# @author: Gia Tuấn
# @website: https://wptangtoc.com
# @email: giatuan@wptangtoc.com
# @since: 2026
# Bộ cài đặt wptangtoc ols đièu kiện check các tình huống xem có đủ điều kiện đáp ứng để install wptangtoc ols hay không?
OUTPUT=$(cat /etc/*release)
if echo "$OUTPUT" | grep -q "AlmaLinux 8\|Rocky Linux 8\|Red Hat Enterprise Linux 8\|Oracle Linux Server 8"; then
  SERVER_OS='almalinux'
elif echo "$OUTPUT" | grep -q "AlmaLinux 9\|Rocky Linux 9\|Red Hat Enterprise Linux 9\|Oracle Linux Server 9"; then
  SERVER_OS='almalinux-9'
elif echo "$OUTPUT" | grep -q "AlmaLinux 10\|Rocky Linux 10\|Red Hat Enterprise Linux 10\|Oracle Linux Server 10"; then
  SERVER_OS='almalinux-10'
elif echo "$OUTPUT" | grep -q "Ubuntu 22.04\|Ubuntu 24.04"; then
  SERVER_OS='ubuntu'
else
  echo "Hiện tại WPTangToc OLS không hỗ trợ với hệ điều hành $(hostnamectl | grep System | cut -f2 -d':' | sed 's/^ //g') của bạn"
  echo "Muốn sử dụng WPTangToc OLS vui lòng sử dụng hệ điều hành (AlmaLinux 8 && 9 && 10 | Rocky linux 8 && 9 && 10| Red Hat Enterprise Linux 8 && 9 && 10|Oracle Linux Server 8 && 9 && 10 | Ubuntu 22.04 && 24.04), rồi cài đặt WPTangToc OLS"
  echo "Trong các OS WPTangToc OLS hỗ trợ, OS mà mình yêu thích nhất mình khuyến nghị là AlmaLinux 8"
  rm -f wptangtoc-ols
  exit
fi

if [[ $SERVER_OS = 'almalinux-10' ]];then
	echo "Tạm ngừng hoạt động, hãy chuyển qua AlmaLinux 9"
	echo "thời gian tới khi một số thư viện đuợc fix xong sẽ quay trở almalinux10 sẽ quay trở lại với mọi người"
	echo "Mình rất xin lỗi về sự cố này"
	rm -f wptangtoc-ols
	exit
fi

# HÀM THÔNG BÁO LỖI
function canh_bao_panel_cu() {
    local ten_panel="$1"
    clear
    echo -e "CẢNH BÁO: Máy chủ của bạn đã được cài đặt \e[33m${ten_panel}\e[0m!"
    echo "Để WPTangToc OLS hoạt động hoàn hảo nhất, máy chủ yêu cầu phải là một hệ điều hành mới tinh (Fresh OS)."
    echo -e "\n➜ Hướng xử lý: Hãy Rebuild/Reinstall lại hệ điều hành của VPS."
    echo "Hệ điều hành hỗ trợ: AlmaLinux 8-9-10 | Rocky Linux 8-9-10 | RHEL 8-9-10 | Oracle 8-9-10 | Ubuntu 22.04 & 24.04."
    echo -e "\e[32mKhuyến nghị từ Gia Tuấn: AlmaLinux 9 là hệ điều hành yêu thích nhất và mình đang tập trung tối ưu.\e[0m\n"
    rm -f wptangtoc-ols
    exit 1
}

# KIỂM TRA ĐÃ CÀI WPTANGTOC OLS
if [ -d /etc/wptt ]; then
    clear
    echo "Máy chủ của bạn đã được cài đặt WPTangToc OLS từ trước!"
    echo "Cảm ơn bạn đã lựa chọn sử dụng WPTangToc OLS."
    echo "Yêu cầu hỗ trợ: Gia Tuấn - Email: giatuan@wptangtoc.com"
    rm -f wptangtoc-ols
    exit 0
fi

#MẢNG NHẬN DIỆN CÁC CONTROL PANEL / SCRIPT KHÁC, array mảng key value
declare -A cac_panel_khac=(
    ["/var/cpanel/cpanel.config"]="WHM/cPanel"
    ["/usr/local/lscp"]="CyberPanel"
    ["/etc/psa/.psa.shadow"]="Plesk"
    ["/etc/init.d/directadmin"]="DirectAdmin"
    ["/etc/init.d/webmin"]="Webmin"
    ["/www/server/panel"]="aaPanel"
    ["/root/passwords.txt"]="Sentora"
    ["/etc/hocvps/scripts.conf"]="HocVPS"
    ["/usr/local/bin/ee"]="EasyEngine v3"
    ["/opt/easyengine"]="EasyEngine v4"
    ["/usr/local/bin/wo"]="WordOps"
    ["/home/kusanagi"]="Kusanagi"
    ["/usr/local/cwpsrv"]="CentOS Web Panel (CWP)"
    ["/usr/local/vesta/"]="VestaCP"
    ["/usr/local/hestia/"]="HestiaCP"
    ["/usr/local/fastpanel2/"]="FastPanel"
    ["/etc/runcloud/"]="RunCloud"
    ["/usr/local/cloudpanel/"]="CloudPanel"
    ["/root/vpssim.conf"]="VPSSIM"
    ["/etc/larvps/.larvps.conf"]="LarVPS"
    ["/opt/tinopanel"]="TinoPanel"
    ["/var/hostvn/hostvn.conf"]="HostVN"
    ["/usr/local/lsws"]="LiteSpeed Webserver"
    ["/home/lsws"]="LiteSpeed Webserver"
)

# quét danh sách
#thêm dấu ! vào thành "${!cac_panel_khac[@]}", Bash sẽ thông minh lôi toàn bộ các Key (Đường dẫn file: /var/cpanel..., /usr/local/lscp...) ra để kiểm tra.
#nếu không có ! thì thay  nó sẽ lấy value ra kiểm tra, mà mình muốn dùng key để kiểm tra thì thêm !
for path in "${!cac_panel_khac[@]}"; do
    if [[ -e "$path" ]]; then
        canh_bao_panel_cu "${cac_panel_khac[$path]}" #đổi từ $path key chuyển sang giá trị value để thông báo
    fi
done

#KIỂM TRA KIẾN TRÚC CPU ARM (CHỈ DÀNH CHO ALMALINUX 8)
if uname -m | grep -q 'aarch64'; then
	if [[ $SERVER_OS == 'almalinux' ]]; then
		clear
		echo "Hiện tại WPTangToc OLS không hỗ trợ CPU ARM với hệ điều hành $(hostnamectl | grep System | cut -f2 -d':' | sed 's/^ //g') của bạn."
		echo "Muốn sử dụng WPTangToc OLS trên kiến trúc ARM, vui lòng sử dụng AlmaLinux 9, Rocky 9 hoặc Ubuntu."
		rm -f wptangtoc-ols
		exit 1
	fi
fi



#yêu cầu bắt buộc dùng trực tiếp tài khoản root để install bộ cài đặt
check_root=$(who | awk -F ' ' '{print $1}' | head -1)
if [[ "$check_root" != "root" ]]; then
  if [[ -f /home/$check_root/.bashrc ]]; then
    check_root_2=$(whoami)
    if [[ $check_root_2 != 'root' ]]; then
      echo "Vui lòng sử dụng tài khoản root để cài đặt chương trình WPTangToc OLS"
      echo "Vui lòng chuyển sang user Root. Vui lòng chạy lại lệnh cài đặt."
      echo "Hướng dẫn login tài khoản root: https://wptangtoc.com/wptangtoc-ols-cau-hoi-thuong-gap/#Yeu_cau_tai_khoan_root_moi_cai_duoc_wptangtoc_ols"
      echo "Khi hoàn tất thì hãy chạy lại lệnh:"
      echo "curl -sO https://wptangtoc.com/share/wptangtoc-ols && bash wptangtoc-ols"
      rm -f wptangtoc-ols
      exit
    fi
  fi
fi


# ==============================================================================
# TỰ ĐỘNG XỬ LÝ LỖI PHÂN VÙNG /home DUNG LƯỢNG LỚN (LVM AUTO-MERGE AN TOÀN 100%)
# ==============================================================================

HOME_DEV=$(df -P /home 2>/dev/null | awk 'NR==2 {print $1}')
ROOT_DEV=$(df -P / 2>/dev/null | awk 'NR==2 {print $1}')
FS_TYPE=$(df -Th | awk '$NF=="/" {print $2}')

if [[ -n "$HOME_DEV" && -n "$ROOT_DEV" && "$HOME_DEV" != "$ROOT_DEV" ]]; then

    if [[ "$PWD" == /home* ]]; then
        clear
        echo -e "\e[31m❌ LỖI NGHIÊM TRỌNG: Script đang chạy từ bên trong ổ /home!\e[0m"
        echo "Hệ thống không thể tự gộp phân vùng ổ cứng khi bạn đang đứng trên chính nó."
        echo -e "\e[33m➜ Hướng xử lý: Hãy di chuyển file cài đặt ra thư mục /root và chạy lại:\e[0m"
        echo "mv wptangtoc-ols /root/ && cd /root && bash wptangtoc-ols"
        exit 1
    fi

    HOME_TYPE=$(lsblk -no TYPE "$HOME_DEV" 2>/dev/null | grep -ow "lvm")
    ROOT_TYPE=$(lsblk -no TYPE "$ROOT_DEV" 2>/dev/null | grep -ow "lvm")

    if [[ "$HOME_TYPE" == "lvm" && "$ROOT_TYPE" == "lvm" ]]; then
        echo -e "\nPhát hiện máy chủ bị chia sai cấu trúc ổ cứng (Dung lượng dồn vào /home)."
        echo "➜ Đang tự động phẫu thuật gộp phân vùng /home vào nhánh gốc (/) để tối ưu..."
        
        # 1. Sao lưu dữ liệu cực chuẩn
        mkdir -p /tmp/home_backup
        cp -a /home/. /tmp/home_backup/ 2>/dev/null
        
        # =========================================================
        # 2. CHIẾN DỊCH "ĐUỔI KHÁCH" (AGGRESSIVE KILL)
        # =========================================================
        
        # A. Tuyệt chiêu của sếp: Pkill toàn bộ user có nhà ở /home
        for user_dir in /home/*; do
            if [[ -d "$user_dir" ]]; then
                username=$(basename "$user_dir")
                if [[ "$username" != "root" ]]; then
                    pkill -9 -u "$username" >/dev/null 2>&1
                fi
            fi
        done

        # B. Cài gói psmisc nếu VPS bị thiếu lệnh fuser
        if ! command -v fuser >/dev/null 2>&1; then
            dnf install psmisc -y >/dev/null 2>&1
        fi
        
        # C. Trảm thêm nhát chót bằng fuser cho chắc cốp
        if command -v fuser >/dev/null 2>&1; then
            fuser -k -m -9 /home >/dev/null 2>&1
        fi
        
        sync
        sleep 4
        
        # =========================================================
        # 3. NGẮT KẾT NỐI (CỐ GẮNG 3 LẦN)
        # =========================================================
        umount_success=0
        for i in {1..3}; do
            if umount -f /home >/dev/null 2>&1; then
                umount_success=1
                break
            fi
            sleep 2
        done
        
        if [[ $umount_success -eq 0 ]]; then
            clear
            echo -e "\e[31mTHẤT BẠI: Không thể ngắt kết nối ổ /home.\e[0m"
            echo "Đang có một tiến trình cấp hệ thống chiếm dụng phân vùng này."
            echo "Vui lòng khởi động lại (reboot) máy chủ và chạy lại kịch bản cài đặt từ thư mục /root."
            exit 1
        fi
        
        # =========================================================
        # 4. TIẾN HÀNH GỘP Ổ LVM
        # =========================================================
        if ! lvremove -y "$HOME_DEV" >/dev/null 2>&1; then
            mount "$HOME_DEV" /home 2>/dev/null
            echo -e "\e[31mTHẤT BẠI: Lỗi hệ thống khi xóa phân vùng ảo Logical Volume.\e[0m"
            exit 1
        fi
        
        lvextend -l +100%FREE "$ROOT_DEV" >/dev/null 2>&1
        
        if [[ "$FS_TYPE" == "xfs" ]]; then
            xfs_growfs / >/dev/null 2>&1
        else
            resize2fs "$ROOT_DEV" >/dev/null 2>&1
        fi
        
        sed -i '/[[:space:]]\/home[[:space:]]/d' /etc/fstab
        
        # Trả lại thư mục /home
        mkdir -p /home
        shopt -s dotglob
        mv /tmp/home_backup/* /home/ 2>/dev/null
        shopt -u dotglob
        rm -rf /tmp/home_backup
        
        echo "Phẫu thuật ổ cứng thành công! Máy chủ đã sẵn sàng cài đặt WPTangToc OLS."
        sleep 2
    else
        clear
        echo -e "\e[31mLỖI PHÂN VÙNG Ổ CỨNG: Máy chủ của bạn được chia phân vùng /home riêng biệt.\e[0m"
        echo "Do không sử dụng kiến trúc ảo hóa LVM, hệ thống không thể tự động gộp phân vùng."
        echo "Vui lòng liên hệ với nhà cung cấp VPS, máy chủ của bạn cài hệ điều hành linux theo dạng nhánh gốc /"
        echo "Hiện tại hệ điều hành của bạn đang được phân quyền theo dạng home dung lượng lớn và nhánh gốc / dung lượng nhỏ"
        echo "Không phù hợp với cấu trúc WPTangTocOLS"
        echo -e "\e[33m➜ Hướng xử lý: Hãy Reinstall lại VPS và chọn tùy chọn cấp 100% dung lượng cho nhánh gốc (/).\e[0m"
        rm -f wptangtoc-ols
        exit 1
    fi
fi


rm -f "wptangtoc-ols" "wptangtoc-ols-$SERVER_OS"

echo "Đang tải và kiểm chứng mã nguồn..."

# Hàm tải và check SHA256
function download_and_verify() {
    local url_script="$1"
    local url_checksum="$2"
    
    # Tải script (Thêm -L)
    if ! curl -sfLO --connect-timeout 30 "$url_script"; then
        return 1 
    fi
    
    # Tải mã băm (Thêm -L) -> Xóa ký tự \r -> Lọc đúng OS -> Kiểm tra
	#SHA256SUMS.txt sẽ xử lý trực tiếp ở trên ram kỹ thuật Stream qua RAM
    if curl -sfL --connect-timeout 30 -A "checksum wptangtoc ols" "$url_checksum" | tr -d '\r' | grep -E "[[:space:]]wptangtoc-ols-$SERVER_OS$" | sha256sum -c - >/dev/null 2>&1; then
        return 0 
    else
        rm -f "wptangtoc-ols-$SERVER_OS"
        return 1 
    fi
}

DOWNLOAD_SUCCESS=0

# 1. Thử nghiệm Nguồn chính (Máy chủ WPTangToc & Hub)
if download_and_verify "https://wptangtoc.com/share/wptangtoc-ols-$SERVER_OS" "https://hub.wptangtoc.com/SHA256SUMS.txt"; then
    DOWNLOAD_SUCCESS=1
else
    # 2. Thử nghiệm Nguồn dự phòng (Kéo từ bản Release ổn định mới nhất)
    if download_and_verify "https://github.com/wptangtoc/wptangtoc-ols/releases/latest/download/wptangtoc-ols-$SERVER_OS" "https://github.com/wptangtoc/wptangtoc-ols/releases/latest/download/SHA256SUMS.txt"; then
        echo -e "\e[32m[Nguồn: GitHub Releases] Xác thực an toàn thành công!\e[0m"
        DOWNLOAD_SUCCESS=1
    fi
fi

# CHỐT CHẶN BẢO MẬT
if [[ $DOWNLOAD_SUCCESS -eq 0 ]]; then
    clear
    echo -e "\e[31mLỖI NGHIÊM TRỌNG: Tệp cài đặt không an toàn!\e[0m"
    echo "Hệ thống không thể tải hoặc xác thực tính toàn vẹn của mã nguồn từ bất kỳ đâu."
    echo "Tiến trình đã bị hủy tự động để bảo vệ máy chủ của bạn khỏi mã độc."
    echo "Vui lòng kiểm tra lại cấu hình DNS mạng hoặc liên hệ Gia Tuấn."
    exit 1
fi
echo -e "\e[32mkiểm chứng mã nguồn an toàn [thành công]\e[0m"
sleep 1
echo -en "\033[1A\033[2K\r"
echo -en "\033[1A\033[2K\r"
# THỰC THI
bash "wptangtoc-ols-$SERVER_OS" "$@"

