#!/bin/bash

# 定义目录和脚本路径
SCRIPT_DIR="/opt/script/cache_clean"
CLEAN_CACHE_SCRIPT="$SCRIPT_DIR/clean_cache.sh"
LOG_FILE="$SCRIPT_DIR/install.log"

# 定义Crontab条目
CRONTAB_ENTRY="0 3 * * * $CLEAN_CACHE_SCRIPT"

# 函数：记录日志
log() {
  DATE=$(date +'%Y-%m-%d %H:%M:%S')
  echo -e "\033[1;34m[$DATE]\033[0m \033[1;32m$1\033[0m" | tee -a "$LOG_FILE"
}

# 函数：记录错误
error_log() {
  DATE=$(date +'%Y-%m-%d %H:%M:%S')
  echo -e "\033[1;34m[$DATE]\033[0m \033[1;31m错误: $1\033[0m" | tee -a "$LOG_FILE"
}

# 检查是否以root权限运行
if [[ $EUID -ne 0 ]]; then
  error_log "此脚本需要root权限才能运行"
  exit 1
fi

# 1. 创建目录
log "开始创建目录 $SCRIPT_DIR"
mkdir -p "$SCRIPT_DIR"
if [ $? -eq 0 ]; then
  log "目录 $SCRIPT_DIR 创建成功"
else
  error_log "创建目录 $SCRIPT_DIR 失败，退出"
  exit 1
fi

# 2. 写入脚本
log "开始写入脚本 $CLEAN_CACHE_SCRIPT"
cat > "$CLEAN_CACHE_SCRIPT" <<EOL
#!/bin/bash

# 脚本描述
# 清理 Linux 服务器的缓存，包括页面缓存、目录项和 inode。
# 适用于 CentOS, Ubuntu, Debian 等 Linux 发行版。

# 定义变量
SYNC_COMMAND="sync"
DROP_CACHE_COMMAND="/usr/bin/tee /proc/sys/vm/drop_caches"

# 定义清理类型
PAGE_CACHE=1
DENTRIES_AND_INODES=2
ALL_CACHES=3

# 定义日志文件 - 使用绝对路径
SCRIPT_PATH="\$(readlink -f "\$0")"
LOG_DIR="\$(dirname "\$SCRIPT_PATH")"
LOG_FILE="\$LOG_DIR/cache_clean.log"

# 定义日志分隔符
LOG_SEPARATOR="===================================================="

# 获取当前时间
get_time() {
  date +'%Y-%m-%d %H:%M:%S'
}

# 函数：记录日志
log() {
  local TIMESTAMP="\$(get_time)"
  echo "[\$TIMESTAMP] \$1" >> "\$LOG_FILE"
  echo "[\$TIMESTAMP] \$1"  # 同时输出到终端
}

# 函数：获取 buff/cache 使用情况
get_buff_cache() {
  free -h | awk 'NR==2 {print \$6}'
}

# 函数：清理缓存
clean_cache() {
  local cache_type="\$1"
  local CURRENT_TIME="\$(get_time)"

  # 记录日志分隔符
  log "\$LOG_SEPARATOR"

  # 记录开始时间
  log "开始执行缓存清理"

  # 检查参数是否合法
  if [[ ! "\$cache_type" =~ ^[1-3]\$ ]]; then
    log "错误：无效的缓存类型 '\$cache_type'。必须是 1, 2 或 3。"
    exit 1
  fi

  # 同步文件系统，防止数据丢失
  log "开始同步文件系统..."
  \$SYNC_COMMAND
  log "文件系统同步完成"

  # 清理缓存前，记录 buff/cache 使用情况
  local BEFORE_CACHE="\$(get_buff_cache)"
  log "清理前缓存使用: \$BEFORE_CACHE"

  # 清理缓存
  log "开始清理缓存，类型为 '\$cache_type'..."
  echo "\$cache_type" | \$DROP_CACHE_COMMAND > /dev/null 2>&1

  if [ \$? -eq 0 ]; then
    log "缓存清理成功，类型为 '\$cache_type'"
  else
    log "缓存清理失败，类型为 '\$cache_type'"
  fi

  # 清理缓存后，记录 buff/cache 使用情况
  local AFTER_CACHE="\$(get_buff_cache)"
  log "清理后缓存使用: \$AFTER_CACHE"

  # 记录结束时间
  log "缓存清理完成"
  log "\$LOG_SEPARATOR"
}

# 主程序
main() {
  # 检查是否以 root 权限运行
  if [[ \$EUID -ne 0 ]]; then
    echo "错误：此脚本需要 root 权限才能运行"
    exit 1
  fi

  # 检查日志目录是否存在，如果不存在则创建
  if [ ! -d "\$LOG_DIR" ]; then
    mkdir -p "\$LOG_DIR"
    if [ \$? -ne 0 ]; then
      echo "无法创建日志目录 \$LOG_DIR"
      exit 1
    fi
    log "已创建日志目录 \$LOG_DIR"
  fi

  # 默认清理所有缓存
  clean_cache "\$ALL_CACHES"

  log "缓存清理脚本执行完毕"
}

# 执行主程序
main
EOL

if [ $? -eq 0 ]; then
  log "脚本 $CLEAN_CACHE_SCRIPT 写入成功"
else
  error_log "脚本 $CLEAN_CACHE_SCRIPT 写入失败，退出"
  exit 1
fi

# 3. 添加执行权限
log "开始添加执行权限到 $CLEAN_CACHE_SCRIPT"
chmod +x "$CLEAN_CACHE_SCRIPT"
if [ $? -eq 0 ]; then
  log "已成功添加执行权限到 $CLEAN_CACHE_SCRIPT"
else
  error_log "添加执行权限到 $CLEAN_CACHE_SCRIPT 失败，退出"
  exit 1
fi

# 4. 添加 Crontab 条目
log "开始添加 Crontab 条目"

# 检查 Crontab 是否已存在相同的条目
CRONTAB_ESCAPED=$(echo "$CRONTAB_ENTRY" | sed 's/[]\/$*.^[]/\\&/g')
if crontab -l 2>/dev/null | grep -q "^$CRONTAB_ESCAPED\$"; then
  log "Crontab 中已存在相同的条目，跳过添加"
else
  (crontab -l 2>/dev/null || echo "") | grep -v "$CLEAN_CACHE_SCRIPT" | { cat; echo "$CRONTAB_ENTRY"; } | crontab -
  if [ $? -eq 0 ]; then
    log "Crontab 条目添加成功"
    log "缓存清理脚本将在每天凌晨3点执行"

    # 尝试刷新 Crontab 服务，考虑不同系统的服务名称
    if command -v systemctl &> /dev/null; then
      # 检查不同的服务名称
      for SVC in cron crond; do
        if systemctl list-unit-files | grep -q "$SVC.service"; then
          systemctl reload $SVC 2>/dev/null || systemctl restart $SVC
          log "已刷新 Crontab 服务 (systemctl reload/restart $SVC)"
          break
        fi
      done
    elif command -v service &> /dev/null; then
      for SVC in cron crond; do
        if service $SVC status &>/dev/null; then
          service $SVC reload 2>/dev/null || service $SVC restart
          log "已刷新 Crontab 服务 (service $SVC reload/restart)"
          break
        fi
      done
    else
      log "无法找到 systemctl 或 service 命令，请手动刷新 Crontab 服务"
    fi
  else
    error_log "Crontab 条目添加失败，请手动添加"
    log "运行 'crontab -e'，然后添加以下行："
    log "$CRONTAB_ENTRY"
  fi
fi

# 5. 测试脚本是否可以正常运行
log "开始测试缓存清理脚本"
$CLEAN_CACHE_SCRIPT
if [ $? -eq 0 ]; then
  log "缓存清理脚本测试成功"
else
  error_log "缓存清理脚本测试失败，请检查脚本内容"
fi

log "安装过程完成，日志文件位置: $LOG_FILE"
