File size: 4,766 Bytes
f883aff
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
#!/bin/bash

# 检查必要的WebDAV环境变量
if [ -z "$WEBDAV_URL" ] || [ -z "$WEBDAV_USERNAME" ] || [ -z "$WEBDAV_PASSWORD" ]; then
    echo "缺少必要的WebDAV环境变量: WEBDAV_URL, WEBDAV_USERNAME 或 WEBDAV_PASSWORD"
    exit 1
fi

# 去除WEBDAV_URL末尾的斜杠(如果有的话)
WEBDAV_URL=$(echo "$WEBDAV_URL" | sed 's/\/$//')

# 创建数据目录
mkdir -p ./data/webdav

check_webdav_webui_latest_exists() {
    http_code=$(curl --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" --head --silent --write-out "%{http_code}" "$WEBDAV_URL/OpenWebUI/webui_latest.db" -o /dev/null)
    if [ "$http_code" -eq 200 ]; then
        return 0  # 文件存在
    else
        return 1  # 文件不存在
    fi
}

# 从WebDAV拉取最新的webui_latest.db文件
download_latest_db() {
    echo "检查云端是否存在webui_latest.db文件..."

    if check_webdav_webui_latest_exists; then
        echo "云端存在webui_latest.db文件,开始拉取..."
        curl -o ./data/webdav/webui_latest.db \
            --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" \
            "$WEBDAV_URL/OpenWebUI/webui_latest.db" && {
            echo "最新的webui_latest.db文件拉取成功"
            cp ./data/webdav/webui_latest.db ./data/webui.db
        } || {
            echo "拉取webui_latest.db文件失败"
        }
    else
        echo "云端不存在webui_latest.db文件,跳过拉取"
    fi
}

# 比较两个文件的hash值
compare_hashes() {
    local file1=$1
    local file2=$2
    local hash1
    local hash2

    # 检查文件是否存在
    if [ ! -f "$file1" ] || [ ! -f "$file2" ]; then
        echo "文件 $file1$file2 不存在,无法比较哈希值"
        return 1
    fi

    # 计算文件的hash值
    hash1=$(sha256sum "$file1" | awk '{print $1}')
    hash2=$(sha256sum "$file2" | awk '{print $1}')

    # 比较hash值
    if [ "$hash1" == "$hash2" ]; then
        return 0 # 哈希值相同
    else
        return 1 # 哈希值不同
    fi
}

# 上传备份文件到WebDAV
upload_to_webdav() {
    echo "检查是否需要上传文件到 WebDAV..."

    # 如果 ./data/webui.db 文件不存在,跳过上传
    if [ ! -f ./data/webui.db ]; then
        echo "数据库未初始化,跳过上传"
        return
    fi

    # 检查云端是否存在webui_latest.db文件
    if check_webdav_webui_latest_exists; then
        # 比较本地和云端的webui.db文件hash值
        if compare_hashes ./data/webui.db ./data/webdav/webui_latest.db; then
            echo "本地和云端的webui.db文件哈希值一致,跳过上传"
            return
        fi
        echo "本地和云端的webui.db文件哈希值不同,准备上传..."
    else
        echo "云端不存在webui_latest.db文件,直接上传文件"
    fi

    # 上传最新的webui_latest.db到 WebDAV
    cp ./data/webui.db ./data/webdav/webui_latest.db
    curl -T ./data/webdav/webui_latest.db --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$WEBDAV_URL/OpenWebUI/webui_latest.db" && {
        echo "最新的webui_latest.db上传成功"
    } || {
        echo "上传webui_latest.db失败"
    }

    # 上传以日期命名的备份文件
    FILENAME="webui_$(date +'%m_%d').db"
    curl -T ./data/webdav/webui_latest.db --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$WEBDAV_URL/OpenWebUI/$FILENAME" && {
        echo "备份文件 $FILENAME 上传成功"
    } || {
        echo "上传备份文件 $FILENAME 失败"
    }

    # 获取当前 WebDAV 目录中的所有备份文件,按时间排序
    echo "检查云端备份文件..."
    backup_files=$(curl -s --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$WEBDAV_URL/OpenWebUI/" | grep -o 'webui_.*\.db' | grep -v 'webui_latest.db' | sort)

    # 如果备份文件超过 5 个,则删除最旧的一个
    backup_count=$(echo "$backup_files" | wc -l)
    if [ "$backup_count" -gt 5 ]; then
        oldest_file=$(echo "$backup_files" | head -n 1)
        echo "云端备份文件超过5个,删除最旧的备份文件: $oldest_file"

        curl -X DELETE --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$WEBDAV_URL/OpenWebUI/$oldest_file" && {
            echo "删除最旧备份文件成功"
        } || {
            echo "删除最旧备份文件失败"
        }
    fi
}

# 定义同步函数
sync_data() {
    while true; do
        echo "正在开始同步"

        # 上传文件到WebDAV
        upload_to_webdav

        # 等待时间间隔
        SYNC_INTERVAL=${SYNC_INTERVAL:-7200}
        echo "当前时间 $(date '+%Y-%m-%d %H:%M:%S')"
        echo "等待 ${SYNC_INTERVAL} 秒后进行下一次同步..."
        sleep $SYNC_INTERVAL
    done
}

# 初始拉取最新的webui_latest.db文件
download_latest_db

# 后台启动同步进程
sync_data &