File size: 2,877 Bytes
38a13c1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#!/bin/bash

# ================= 配置区域 =================
# 1. WebDAV URL 处理
WEBDAV_URL=${WEBDAV_URL%/}
WEBDAV_BACKUP_PATH=${WEBDAV_BACKUP_PATH:-""}
WEBDAV_BACKUP_PATH=${WEBDAV_BACKUP_PATH#/}
WEBDAV_BACKUP_PATH=${WEBDAV_BACKUP_PATH%/}

if [ -n "$WEBDAV_BACKUP_PATH" ]; then
    FULL_WEBDAV_URL="${WEBDAV_URL}/${WEBDAV_BACKUP_PATH}"
else
    FULL_WEBDAV_URL="${WEBDAV_URL}"
fi

# 2. 同步间隔 (默认 10 分钟 = 600 秒)
SYNC_INTERVAL=${SYNC_INTERVAL:-600}

# 3. 文件名配置
BACKUP_NAME="gcli2api_creds.tar.gz"
TEMP_FILE="/tmp/$BACKUP_NAME"
TARGET_DIR="creds"

# ===========================================

log() { echo "[Backup] [$(date '+%H:%M:%S')] $1"; }

# 检查环境
if [[ -z "$WEBDAV_URL" ]]; then
    log "未设置 WEBDAV_URL,跳过备份功能"
    exit 0
fi

# 确保目标目录存在
mkdir -p "$TARGET_DIR"

# === 功能1: 恢复备份 ===
restore() {
    log "正在检查远程备份..."
    REMOTE_FILE="$FULL_WEBDAV_URL/$BACKUP_NAME"
    
    # 下载到临时文件
    HTTP_CODE=$(curl -s -o "$TEMP_FILE" -w "%{http_code}" -u "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$REMOTE_FILE")
    
    if [[ "$HTTP_CODE" == "200" ]]; then
        if [ -s "$TEMP_FILE" ]; then
            log "发现备份,正在恢复到 $TARGET_DIR..."
            # 解压覆盖
            tar -xzf "$TEMP_FILE"
            log "✅ 恢复完成"
        else
            log "❌ 下载文件为空,跳过"
        fi
    else
        log "📭 未找到远程备份 (HTTP $HTTP_CODE),使用新环境启动"
    fi
}

# === 功能2: 循环备份 ===
loop() {
    log "启动定时备份 (间隔: ${SYNC_INTERVAL}秒)"
    
    # 尝试创建远程子目录
    if [ -n "$WEBDAV_BACKUP_PATH" ]; then
        curl -s -o /dev/null -u "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" -X MKCOL "$FULL_WEBDAV_URL/"
    fi
    
    while true; do
        sleep $SYNC_INTERVAL
        
        # 检查 creds 目录是否有文件
        if [ "$(ls -A $TARGET_DIR)" ]; then
            # 打包 creds 目录
            # 排除 config.toml 如果你不想备份它,但通常需要备份
            tar -czf "$TEMP_FILE" "$TARGET_DIR"
            
            FILE_SIZE=$(wc -c < "$TEMP_FILE")
            log "正在上传备份 (大小: $FILE_SIZE bytes)..."
            
            HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" -u "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" -T "$TEMP_FILE" "$FULL_WEBDAV_URL/$BACKUP_NAME")
            
            if [[ "$HTTP_CODE" == "201" ]] || [[ "$HTTP_CODE" == "204" ]] || [[ "$HTTP_CODE" == "200" ]]; then
                log "备份成功"
            else
                log "备份失败 (HTTP $HTTP_CODE)"
            fi
        else
            log "⚠️ $TARGET_DIR 目录为空,跳过备份"
        fi
    done
}

# === 入口 ===
case "$1" in
    "restore") restore ;;
    "loop") loop ;;
    *) restore; loop ;;
esac