#!/bin/bash
# ==============================================
# 🔄 每日备份脚本 v3
# 每天 05:00 由 crontab 触发
# 策略：本地压缩 → smbclient 推送到 Windows 共享
# 备份 /home/liangzi + /root/.openclaw/openclaw.json
# ==============================================

SMB_SERVER="//100.70.76.54"
SMB_SHARE="0000sharebak"
SMB_USER="share"
SMB_PASS="share123"
SMB_PATH="system-backup"
TEMP_DIR="/tmp/system-backup"
DATE_TAG=$(date +%Y-%m-%d)
LOG_FILE="/var/log/system-backup.log"
LOCK_FILE="/tmp/system-backup.lock"

# 防止重复执行
exec 200>"$LOCK_FILE"
flock -n 200 || { echo "[$(date '+%Y-%m-%d %H:%M:%S')] ⚠️ 备份脚本已在运行，跳过"; exit 0; }

log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}

log "========================"
log "开始备份 ($DATE_TAG)"

# 1. 本地压缩
mkdir -p "$TEMP_DIR"
rm -f "$TEMP_DIR"/*.tar.gz

log "本地压缩 /home/liangzi ..."
tar czf "$TEMP_DIR/home-liangzi-$DATE_TAG.tar.gz" \
  --exclude="node_modules" \
  --exclude=".npm" \
  --exclude=".cache" \
  --exclude=".nvm" \
  --exclude="chat-backups" \
  --exclude="tools/*.exe" \
  --exclude="tools/*.jar" \
  --exclude="tools/mihomo" \
  --exclude="tools/mihomo.gz" \
  --exclude="tools/clash.gz" \
  -C / home/liangzi 2>> "$LOG_FILE"

if [ $? -eq 0 ] && [ -f "$TEMP_DIR/home-liangzi-$DATE_TAG.tar.gz" ]; then
    HOME_SIZE=$(du -h "$TEMP_DIR/home-liangzi-$DATE_TAG.tar.gz" | cut -f1)
    log "✅ 本地压缩完成 ($HOME_SIZE)"
else
    log "⚠️ 本地压缩可能不完整"
fi

# 备份 openclaw.json
if [ -f /root/.openclaw/openclaw.json ]; then
    cp /root/.openclaw/openclaw.json "$TEMP_DIR/openclaw.json.$DATE_TAG"
    log "✅ openclaw.json 已备份到本地临时目录"
fi

# 2. 推送到 Windows 共享（带重试）
RETRY=0
MAX_RETRY=3
SENT=1

while [ $RETRY -lt $MAX_RETRY ]; do
    RETRY=$((RETRY + 1))
    log "尝试推送（第 $RETRY 次）..."
    
    smbclient $SMB_SERVER/$SMB_SHARE -U $SMB_USER%$SMB_PASS -m SMB3 -t 300 <<SMBCMDS 2>> "$LOG_FILE" | tee -a "$LOG_FILE" | tail -5
mkdir $SMB_PATH
cd $SMB_PATH
lcd $TEMP_DIR
put home-liangzi-$DATE_TAG.tar.gz
put openclaw.json.$DATE_TAG
ls
SMBCMDS
    
    SMB_EXIT=${PIPESTATUS[0]}
    if [ $SMB_EXIT -eq 0 ]; then
        log "✅ 推送成功"
        SENT=0
        break
    else
        log "⚠️ 推送失败 (exit=$SMB_EXIT)，等待 30 秒后重试..."
        sleep 30
    fi
done

# 永久保留，不清理旧备份
if [ $SENT -eq 1 ]; then
    log "⚠️ 3 次推送均失败，本地备份保留在 $TEMP_DIR"
fi

# 清理本地临时文件（保留最新两份以防推送失败）
ls -t "$TEMP_DIR"/home-liangzi-*.tar.gz 2>/dev/null | tail -n +3 | xargs -r rm -f
log "ℹ️ 本地临时文件已清理"

log "✅ 备份完成"
log "========================"

flock -u 200
