#!/bin/bash
# 基础环境安装脚本 (install_basic.sh)
# 包含：unzip、JDK、Nginx、lsof 的安装
# 并且检查并打开 80、443、4577 端口，及授予 /www/wwwroot/messages 访问权限

echo "===== 开始安装基础环境 ====="

# 错误处理
set -e
sudo timedatectl set-timezone Asia/Shanghai
# 添加到 ~/.bashrc 或 ~/.bash_profile
alias date='date +"%Y-%m-%d %H:%M:%S %Z"'

# 然后生效
source ~/.bashrc
# 安装unzip
echo "===== 安装unzip ====="
if ! command -v unzip &> /dev/null; then
    echo "未安装unzip工具，开始安装..."
    if command -v apt-get &> /dev/null; then
        apt-get update && apt-get install -y unzip
    elif command -v yum &> /dev/null; then
        yum install -y unzip
    else
        echo "× 错误: 无法自动安装unzip，请手动安装"; exit 1
    fi
    echo "✓ unzip安装成功"
else
    echo "✓ unzip工具已安装"
fi

# 安装tar
echo "===== 安装tar ====="
if ! command -v tar &> /dev/null; then
    echo "未安装tar，开始安装..."
    if command -v apt-get &> /dev/null; then
        apt-get update && apt-get install -y tar
    elif command -v yum &> /dev/null; then
        yum install -y tar
    else
        echo "× 错误: 无法自动安装tar，请手动安装"; exit 1
    fi
    echo "✓ tar安装成功"
else
    echo "✓ tar工具已安装"
fi

# 安装lsof
echo "===== 安装lsof ====="
if ! command -v lsof &> /dev/null; then
    echo "未安装lsof，开始安装..."
    if command -v apt-get &> /dev/null; then
        apt-get update && apt-get install -y lsof
    elif command -v yum &> /dev/null; then
        yum install -y lsof
    else
        echo "× 错误: 无法自动安装lsof，请手动安装"; exit 1
    fi
    echo "✓ lsof安装成功"
else
    echo "✓ lsof工具已安装"
fi

# 安装Java
echo "===== 安装JDK ====="
if ! command -v java &> /dev/null; then
    echo "未检测到Java，正在安装JDK 1.8..."
    if command -v apt-get &> /dev/null; then
        apt-get update && apt-get install -y openjdk-8-jdk
    elif command -v yum &> /dev/null; then
        yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel
    else
        echo "× 错误: 无法自动安装Java，请手动安装JDK 1.8或更高版本"; exit 1
    fi
    if command -v java &> /dev/null; then
        java_version=$(java -version 2>&1 | awk -F '"' '/version/ {print $2}')
        echo "✓ Java安装成功，版本: $java_version"
    else
        echo "× 错误: Java安装失败，请手动安装"; exit 1
    fi
else
    java_version=$(java -version 2>&1 | awk -F '"' '/version/ {print $2}')
    echo "✓ 检测到Java版本: $java_version"
fi

# 安装Nginx
echo "===== 安装Nginx ====="
if ! command -v nginx &> /dev/null; then
    echo "未检测到Nginx，正在安装..."
    if command -v apt-get &> /dev/null; then
        apt-get update && apt-get install -y nginx
    elif command -v yum &> /dev/null; then
        yum install -y epel-release
        yum install -y nginx
    else
        echo "× 错误: 无法自动安装Nginx，请手动安装"; exit 1
    fi
    systemctl start nginx
    systemctl enable nginx
    if command -v nginx &> /dev/null; then
        nginx_version=$(nginx -v 2>&1 | awk -F/ '{print $2}')
        echo "✓ Nginx安装成功，版本: $nginx_version"
    else
        echo "× 错误: Nginx安装失败，请手动安装"; exit 1
    fi
else
    nginx_version=$(nginx -v 2>&1 | awk -F/ '{print $2}')
    echo "✓ 检测到Nginx版本: $nginx_version"
fi

echo "✓ Nginx 配置已重载"

# --------------------------
# 开放 80 / 443 端口
# --------------------------
echo "===== 检查并开启 80、443端口 ====="
if command -v firewall-cmd &> /dev/null; then
    echo "使用 firewalld 管理防火墙"
    firewall-cmd --zone=public --add-port=80/tcp --permanent
    firewall-cmd --zone=public --add-port=443/tcp --permanent
    firewall-cmd --reload
    echo "✓ 80 / 443 端口已开启 (firewalld)"
elif command -v ufw &> /dev/null; then
    echo "使用 ufw 管理防火墙"
    ufw allow 80/tcp
    ufw allow 443/tcp
    ufw reload
    echo "✓ 80 / 443 端口已开启 (ufw)"
elif command -v iptables &> /dev/null; then
    echo "使用 iptables 管理防火墙"
    iptables -C INPUT -p tcp --dport 80   -j ACCEPT 2>/dev/null || iptables -A INPUT -p tcp --dport 80   -j ACCEPT
    iptables -C INPUT -p tcp --dport 443  -j ACCEPT 2>/dev/null || iptables -A INPUT -p tcp --dport 443  -j ACCEPT
    command -v service &>/dev/null && service iptables save || true
    echo "✓ 80 / 443 端口已开启 (iptables)"
else
    echo "× 错误: 未找到支持的防火墙管理工具 (firewalld, ufw, iptables)"; exit 1
fi

# --------------------------
# 授予 /www/wwwroot/messages 访问权限
# --------------------------
echo "===== 配置 /www/wwwroot/messages 访问权限 ====="
MSG_DIR="/www/wwwroot/messages"
mkdir -p "$MSG_DIR"

# 自动选择 Web 服务用户（优先 nginx，其次 www-data，最后 root）
if id -u nginx >/dev/null 2>&1; then
  WEB_USER="nginx"
elif id -u www-data >/dev/null 2>&1; then
  WEB_USER="www-data"
else
  WEB_USER="root"
fi
# 允许 Nginx 出网连接后端（SELinux）
if command -v getenforce >/dev/null 2>&1 && [ "$(getenforce)" != "Disabled" ]; then
  setsebool -P httpd_can_network_connect 1
  echo "✓ SELinux 已允许 Nginx 连接后端端口"
fi

# 所有者与基本权限（仅需读取时 755；若需写入，改成 775 并配合组）
chown -R "$WEB_USER":"$WEB_USER" "$MSG_DIR"
chmod -R 755 "$MSG_DIR"
echo "✓ 目录所有者: $WEB_USER，权限: 755"

# SELinux 场景（CentOS/RHEL 可能开启）
if command -v getenforce >/dev/null 2>&1 && [ "$(getenforce)" != "Disabled" ]; then
  # 只读内容用 httpd_sys_content_t；若 Nginx/应用需要写该目录，改用 httpd_sys_rw_content_t
  chcon -R -t httpd_sys_content_t "$MSG_DIR" || true
  echo "✓ 已为 SELinux 标注 httpd_sys_content_t"
fi

echo "===== 基础环境安装完成 ====="
