File size: 5,617 Bytes
93409a3
208e30b
30b021f
54a3e04
 
 
 
 
 
 
 
 
 
 
 
208e30b
54a3e04
 
 
 
 
96645ff
 
54a3e04
 
 
96645ff
54a3e04
96645ff
 
208e30b
96645ff
 
208e30b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d0a963e
93409a3
208e30b
 
 
 
 
d0a963e
 
208e30b
 
 
 
 
 
d0a963e
208e30b
 
d0a963e
 
 
208e30b
d0a963e
 
208e30b
d0a963e
 
 
208e30b
d0a963e
208e30b
d0a963e
 
 
208e30b
d0a963e
 
208e30b
d0a963e
 
 
208e30b
d0a963e
 
 
208e30b
d0a963e
208e30b
 
 
 
d0a963e
 
 
208e30b
 
d0a963e
 
 
 
 
93409a3
d0a963e
 
96645ff
93409a3
 
208e30b
93409a3
96645ff
54a3e04
208e30b
 
96645ff
 
 
54a3e04
96645ff
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
#!/bin/bash
# 注意:确保脚本执行时系统中已安装 date、git、curl 等工具,并设置好 TZ 时区环境(可在每个 date 命令中临时指定时区)

# 检查必要的环境变量
if [ -z "$G_NAME" ] || [ -z "$G_TOKEN" ]; then
    echo "缺少必要的环境变量 G_NAME 或 G_TOKEN"
    exit 1
fi

# 解析仓库名和用户名
IFS='/' read -r GITHUB_USER GITHUB_REPO <<< "$G_NAME"

# 构建 GitHub 仓库的克隆 URL,包含令牌
REPO_URL="https://${G_TOKEN}@github.com/${G_NAME}.git"
mkdir -p  ./data/github_data

# 克隆仓库
echo "正在克隆仓库……"
git clone "$REPO_URL" ./data/github_data || {
    echo "克隆失败,请检查 G_NAME 和 G_TOKEN 是否正确。"
    exit 1
}

if [ -f ./data/github_data/webui.db ]; then
    cp ./data/github_data/webui.db ./data/webui.db
    echo "从 GitHub 仓库中拉取成功"
else
    echo "GitHub 仓库中未找到 webui.db,将在同步时推送"
fi

# 定义同步函数,按照北京时间 08:00~24:00(包含整点同步)的要求
sync_data() {
    while true; do
        # 使用 Asia/Shanghai 时区获取当前时间及其组成部分
        CURRENT_TS=$(TZ=Asia/Shanghai date +%s)
        CURRENT_DATE=$(TZ=Asia/Shanghai date '+%Y-%m-%d')
        CURRENT_HOUR=$(TZ=Asia/Shanghai date +%H)  # 00~23
        CURRENT_MIN=$(TZ=Asia/Shanghai date +%M)
        CURRENT_SEC=$(TZ=Asia/Shanghai date +%S)
        
        # 计算下一次同步的目标时间戳(北京时间)
        # 如果当前时间早于 08:00,则目标为今天 08:00
        if [ "$CURRENT_HOUR" -lt 8 ]; then
            TARGET_TS=$(TZ=Asia/Shanghai date -d "${CURRENT_DATE} 08:00:00" +%s)
        # 如果在 08:00 至 22:59,则下一个整点在当日
        elif [ "$CURRENT_HOUR" -ge 8 ] && [ "$CURRENT_HOUR" -lt 23 ]; then
            # 如果正好在整点(秒与分都为 0)则立刻同步
            if [ "$CURRENT_MIN" -eq 0 ] && [ "$CURRENT_SEC" -eq 0 ]; then
                TARGET_TS=$CURRENT_TS
            else
                NEXT_HOUR=$((10#$CURRENT_HOUR + 1))
                TARGET_TS=$(TZ=Asia/Shanghai date -d "${CURRENT_DATE} ${NEXT_HOUR}:00:00" +%s)
            fi
        # 如果当前时间处于 23:00~23:59,则下次目标为次日 00:00(也就是24:00同步)
        else  # CURRENT_HOUR == 23
            if [ "$CURRENT_MIN" -eq 0 ] && [ "$CURRENT_SEC" -eq 0 ]; then
                TARGET_TS=$CURRENT_TS
            else
                TOMORROW=$(TZ=Asia/Shanghai date -d "tomorrow" '+%Y-%m-%d')
                TARGET_TS=$(TZ=Asia/Shanghai date -d "${TOMORROW} 00:00:00" +%s)
            fi
        fi

        # 计算等待时间(若正好同步时则 sleep_time 为 0)
        SLEEP_TIME=$(( TARGET_TS - CURRENT_TS ))
        if [ "$SLEEP_TIME" -gt 0 ]; then
            echo "距离下一次同步还有 ${SLEEP_TIME} 秒(北京时间下次同步时间为 $(TZ=Asia/Shanghai date -d "@$TARGET_TS" '+%Y-%m-%d %H:%M:%S'))"
            sleep "$SLEEP_TIME"
        fi

        # 同步时输出当前北京时间
        CURRENT_TIME=$(TZ=Asia/Shanghai date '+%Y-%m-%d %H:%M:%S')
        echo "当前时间 $CURRENT_TIME"

        # ---- 开始同步流程 ----

        # 1. 同步到 GitHub
        echo "开始执行 GitHub 同步……"
        cd ./data/github_data || { echo "切换目录失败"; exit 1; }
        git config user.name "AutoSync Bot"
        git config user.email "[email protected]"

        # 确保在 main 分支,如切换失败则尝试 master 分支
        git checkout main 2>/dev/null || git checkout master

        # 将最新数据库文件复制到仓库目录下
        if [ -f "../webui.db" ]; then  
            cp ../webui.db ./webui.db  
        else  
            echo "数据库尚未初始化"
        fi 

        # 检查是否有变化
        if [[ -n $(git status -s) ]]; then
            git add webui.db
            git commit -m "Auto sync webui.db $(TZ=Asia/Shanghai date '+%Y-%m-%d %H:%M:%S')"
            git push origin HEAD && {
                echo "GitHub 推送成功"
            } || {
                echo "推送失败,等待重试..."
                sleep 10
                git push origin HEAD || {
                    echo "重试失败,放弃推送到 GitHub。"
                }
            }
        else
            echo "GitHub:没有检测到数据库变化"
        fi
        # 返回主目录
        cd ../..

        # 2. 同步到 WebDAV(若环境变量配置完整)
        if [ -z "$WEBDAV_URL" ] || [ -z "$WEBDAV_USERNAME" ] || [ -z "$WEBDAV_PASSWORD" ]; then
            echo "WebDAV 环境变量缺失,跳过 WebDAV 同步。"
        else
            echo "开始执行 WebDAV 同步……"
            FILENAME="webui_$(TZ=Asia/Shanghai date +'%m_%d').db"
            if [ -f ./data/webui.db ]; then
                curl -T ./data/webui.db --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$WEBDAV_URL/$FILENAME" && {
                    echo "WebDAV 上传成功"
                } || {
                    echo "WebDAV 上传失败,等待重试..."
                    sleep 10
                    curl -T ./data/webui.db --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$WEBDAV_URL/$FILENAME" || {
                        echo "重试失败,放弃 WebDAV 上传。"
                    }
                }
            else
                echo "未找到 webui.db 文件,跳过 WebDAV 同步。"
            fi
        fi

        # ---- 同步流程结束,下一轮循环会根据当前北京时间自动计算等待时长 ----

    done
}

# 后台启动同步进程
sync_data &