#!/bin/bash

# ==============================
# 配置部分
# ==============================
SOURCE_DIR="/home/hadoop/fastdfs/storage/data/"       # 源目录，注意尾部的 `/`
DEST_USER="root"                                      # 主机B的SSH用户
DEST_HOST="192.168.30.18"                             # 主机B的IP地址
DEST_DIR="/home/hadoop/fastdfs/storage/data"          # 目标目录，无需尾部的 `/`

SSH_PORT=22                                           # SSH端口
FEISHU_WEBHOOK="https://open.feishu.cn/open-apis/bot/v2/hook/youkey"  # 飞书 Webhook URL

# 日志文件根据日期动态生成
LOG_DIR="/var/log/rsync_logs"        # 日志目录
DATE_FORMAT=$(date '+%Y-%m-%d_%H-%M') # 当前日期和时间，精确到小时和分钟
LOG_FILE="$LOG_DIR/rsync_fastdfs_$DATE_FORMAT.log" # 日志文件路径
PID_FILE="/var/run/rsync_fastdfs.pid" # PID 文件路径
RSYNC_OPTIONS="-az --partial --compress --compress-level=9 --delete --progress --stats" 
# 高效传输选项，包含详细信息

# 确保日志目录存在
mkdir -p "$LOG_DIR"

# ==============================
# 日志记录函数
# ==============================
log_message() {
    local level="$1"
    local message="$2"
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] [$level] $message" | tee -a "$LOG_FILE"
}

# ==============================
# 飞书消息推送函数
# ==============================
send_feishu_message() {
    local status="$1"
    local detail="$2"

    local payload=$(cat <<EOF
{
    "msg_type": "text",
    "content": {
        "text": "FastDFS 文件同步通知：\n状态：$status\n详情：$detail\n时间：$(date '+%Y-%m-%d %H:%M:%S')"
    }
}
EOF
    )
    curl -s -X POST -H "Content-Type: application/json" -d "$payload" "$FEISHU_WEBHOOK" > /dev/null
}

# ==============================
# 目录重复检测函数
# ==============================
check_and_clean_duplicate_dirs() {
    local dest_path="$DEST_DIR"

    log_message "INFO" "开始检查目标目录中的重复路径"
    local duplicate_dir
    duplicate_dir=$(ssh -p "$SSH_PORT" "$DEST_USER@$DEST_HOST" "find $dest_path -mindepth 2 -type d -name '$(basename ${SOURCE_DIR%/})'")
    
    if [[ -n "$duplicate_dir" ]]; then
        log_message "INFO" "检测到重复目录：$duplicate_dir"
        ssh -p "$SSH_PORT" "$DEST_USER@$DEST_HOST" "rm -rf $duplicate_dir"
        log_message "INFO" "重复目录清理完成"
    else
        log_message "INFO" "未检测到重复目录"
    fi
}

# ==============================
# 同步函数
# ==============================
perform_sync() {
    log_message "INFO" "开始同步 FastDFS 文件"

    # 检查源目录是否存在
    if [ ! -d "$SOURCE_DIR" ]; then
        log_message "ERROR" "源目录 $SOURCE_DIR 不存在"
        send_feishu_message "ERROR" "源目录不存在：$SOURCE_DIR"
        exit 1
    fi

    # 清理目标目录中的重复路径
    check_and_clean_duplicate_dirs

    # 执行同步并记录详细信息
    rsync $RSYNC_OPTIONS -e "ssh -p $SSH_PORT" "$SOURCE_DIR" "$DEST_USER@$DEST_HOST:$DEST_DIR" \
        | tee -a "$LOG_FILE" | while read -r line; do
            log_message "DEBUG" "$line"
        done

    # 检查 rsync 返回状态
    local rsync_exit_code=$?
    if [ $rsync_exit_code -eq 0 ]; then
        log_message "INFO" "同步完成"
        send_feishu_message "SUCCESS" "FastDFS 文件同步成功：$SOURCE_DIR -> $DEST_USER@$DEST_HOST:$DEST_DIR"
    else
        log_message "ERROR" "同步失败 (返回码: $rsync_exit_code)"
        send_feishu_message "ERROR" "FastDFS 文件同步失败，请检查日志：$LOG_FILE"
        exit $rsync_exit_code
    fi
}

# ==============================
# 主程序
# ==============================
case "$1" in
    start)
        # 启动守护进程
        start_daemon
        ;;
    stop)
        # 停止守护进程
        stop_daemon
        ;;
    restart)
        # 重启守护进程
        stop_daemon
        sleep 2
        start_daemon
        ;;
    sync)
        # 确保后台运行时能够识别函数
        nohup bash -c "$(declare -f perform_sync; perform_sync)" > "$LOG_FILE" 2>&1 &
        log_message "INFO" "同步任务已放到后台运行"
        send_feishu_message "SUCCESS" "FastDFS 文件同步任务已开始，正在后台运行。"
        ;;
    *)
        echo "用法: $0 {start|stop|restart|sync}"
        exit 2
        ;;
esac
