File size: 9,115 Bytes
a3f26a0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a27bcd4
a3f26a0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a27bcd4
a3f26a0
 
 
a27bcd4
a3f26a0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a27bcd4
a3f26a0
 
 
 
 
 
a27bcd4
 
a3f26a0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a27bcd4
a3f26a0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a27bcd4
a3f26a0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a27bcd4
a3f26a0
 
 
 
a27bcd4
a3f26a0
 
 
 
 
a27bcd4
a3f26a0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
#!/bin/bash

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

# 从 WebDAV 恢复配置的函数
restore_from_webdav() {
    if [ -z "$WEBDAV_URL" ] || [ -z "$WEBDAV_USERNAME" ] || [ -z "$WEBDAV_PASSWORD" ]; then
        echo "WebDAV 环境变量缺失,无法从 WebDAV 恢复。"
        return 1
    fi
    
    echo "正在从 WebDAV 恢复配置文件..."
    
    # 获取今天的备份文件名
    TODAY_FILENAME="mcp_backup_$(date +'%m_%d').tar.gz"
    YESTERDAY_FILENAME="mcp_backup_$(date -d '1 day ago' +'%m_%d').tar.gz"
    
    # 创建临时恢复目录
    RESTORE_DIR="/mcp-proxy-server/config/webdav_restore"
    mkdir -p "$RESTORE_DIR"
    
    # 尝试下载今天的备份,如果失败则尝试昨天的
    DOWNLOAD_SUCCESS=false
    
    echo "尝试下载今天的备份: $TODAY_FILENAME"
    if curl -f --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$WEBDAV_URL/$TODAY_FILENAME" -o "$RESTORE_DIR/$TODAY_FILENAME" 2>/dev/null; then
        BACKUP_FILE="$TODAY_FILENAME"
        DOWNLOAD_SUCCESS=true
        echo "下载今天的备份成功"
    else
        echo "今天的备份不存在,尝试下载昨天的备份: $YESTERDAY_FILENAME"
        if curl -f --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$WEBDAV_URL/$YESTERDAY_FILENAME" -o "$RESTORE_DIR/$YESTERDAY_FILENAME" 2>/dev/null; then
            BACKUP_FILE="$YESTERDAY_FILENAME"
            DOWNLOAD_SUCCESS=true
            echo "下载昨天的备份成功"
        else
            echo "无法下载 WebDAV 备份文件"
        fi
    fi
    
    if [ "$DOWNLOAD_SUCCESS" = true ]; then
        # 解压缩备份文件
        cd "$RESTORE_DIR"
        tar -xzf "$BACKUP_FILE" && {
            echo "解压缩备份文件成功"
            
            # 恢复配置文件
            if [ -d "config" ]; then
                echo "恢复 config 目录..."
                mkdir -p /mcp-proxy-server/config
                cp -r config/* /mcp-proxy-server/config/
                echo "config 目录恢复成功"
            fi
            
            if [ -d "tools" ]; then
                echo "恢复 tools 目录..."
                mkdir -p /tools
                cp -r tools/* /tools/
                echo "tools 目录恢复成功"
            fi
            
            echo "从 WebDAV 恢复配置文件完成"
        } || {
            echo "解压缩备份文件失败"
        }
        cd ../..
    fi
    
    # 清理临时目录
    rm -rf "$RESTORE_DIR"
    return $DOWNLOAD_SUCCESS
}

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

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

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

# 检查命令行参数,支持选择恢复源
RESTORE_SOURCE="auto"  # 默认自动选择
if [ "$1" = "--restore-webdav" ]; then
    RESTORE_SOURCE="webdav"
elif [ "$1" = "--restore-github" ]; then
    RESTORE_SOURCE="github"
elif [ "$1" = "--restore-only" ]; then
    RESTORE_SOURCE="$2"
    if [ "$RESTORE_SOURCE" = "webdav" ]; then
        restore_from_webdav
        exit 0
    elif [ "$RESTORE_SOURCE" = "github" ]; then
        RESTORE_SOURCE="github"
    else
        echo "用法: $0 --restore-only [github|webdav]"
        exit 1
    fi
fi

# 恢复逻辑
if [ "$RESTORE_SOURCE" = "webdav" ]; then
    # 仅从 WebDAV 恢复
    restore_from_webdav
elif [ "$RESTORE_SOURCE" = "github" ] || [ "$RESTORE_SOURCE" = "auto" ]; then
    # 检查并恢复配置文件(从 GitHub)
    if [ -d /mcp-proxy-server/config/github_data/config ] && [ -d /mcp-proxy-server/config/github_data/tools ]; then
        echo "从 GitHub 仓库中恢复配置文件..."
        # 创建目标目录
        mkdir -p /mcp-proxy-server/config
        mkdir -p /tools
        
        # 复制配置文件
        cp -r /mcp-proxy-server/config/github_data/config/* /mcp-proxy-server/config/ 2>/dev/null || echo "config 目录为空或复制失败"
        cp -r /mcp-proxy-server/config/github_data/tools/* /tools/ 2>/dev/null || echo "tools 目录为空或复制失败"
        
        echo "从 GitHub 仓库中拉取配置文件成功"
    else
        echo "GitHub 仓库中未找到 config 或 tools 目录"
        if [ "$RESTORE_SOURCE" = "auto" ]; then
            echo "尝试从 WebDAV 恢复..."
            restore_from_webdav || echo "WebDAV 恢复也失败,将在同步时推送当前配置"
        fi
    fi
fi

# 如果是仅恢复模式,则退出
if [ "$1" = "--restore-only" ]; then
    exit 0
fi

# 定义同步函数
sync_data() {
    while true; do
        # 1. 同步到 GitHub
        echo "正在开始同步"
        # 进入仓库目录
        cd /mcp-proxy-server/config/github_data
        # 配置 Git 用户信息
        git config user.name "AutoSync Bot"
        git config user.email "autosync@bot.com"

        # 确保在正确的分支
        git checkout main || git checkout master

        # 复制最新的配置文件
        echo "复制配置文件到仓库..."
        
        # 创建仓库中的目录
        mkdir -p ./config
        mkdir -p ./tools
        
        # 复制配置文件(如果存在)
        if [ -d "/mcp-proxy-server/config" ]; then
            cp -r /mcp-proxy-server/config/* ./config/ 2>/dev/null || echo "config 目录为空"
        else
            echo "/mcp-proxy-server/config 目录不存在"
        fi
        
        if [ -d "/tools" ]; then
            cp -r /tools/* ./tools/ 2>/dev/null || echo "tools 目录为空"
        else
            echo "/tools 目录不存在"
        fi
        
        # 检查是否有变化
        if [[ -n $(git status -s) ]]; then
            # 添加所有变更
            git add config/ tools/

            # 提交变更
            git commit -m "Auto sync config and tools $(date '+%Y-%m-%d %H:%M:%S')"

            # 推送到远程仓库
            git push origin HEAD && {
                echo "GitHub推送成功"
            }|| {
                echo "推送失败,等待重试..."
                sleep 10
                git push origin HEAD || {
                    echo "重试失败,放弃推送到Github。"
                }
            }
            # 返回上级目录
            cd ..
            cd ..

            # 2. 同步到 WebDAV
            if [ -z "$WEBDAV_URL" ] || [ -z "$WEBDAV_USERNAME" ] || [ -z "$WEBDAV_PASSWORD" ]; then
                echo "WebDAV 环境变量缺失,跳过 WebDAV 同步。"
            else
                echo "同步到 WebDAV..."
                FILENAME="mcp_backup_$(date +'%m_%d').tar.gz"
                
                # 创建临时备份压缩包
                TEMP_DIR="/mcp-proxy-server/config/temp_backup"
                mkdir -p "$TEMP_DIR"
                
                # 复制要备份的目录到临时目录
                if [ -d "/mcp-proxy-server/config" ]; then
                    cp -r /mcp-proxy-server/config "$TEMP_DIR/"
                fi
                if [ -d "/tools" ]; then
                    cp -r /tools "$TEMP_DIR/"
                fi
                
                # 创建压缩包
                if [ "$(ls -A $TEMP_DIR)" ]; then
                    cd "$TEMP_DIR"
                    tar -czf "../$FILENAME" .
                    cd ../../..
                    
                    # 使用 curl 进行文件上传
                    curl -T "/mcp-proxy-server/config/$FILENAME" --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$WEBDAV_URL/$FILENAME" && {
                        echo "WebDAV 上传成功"
                    } || {
                        echo "WebDAV 上传失败,等待重试..."
                        sleep 10
                        curl -T "/mcp-proxy-server/config/$FILENAME" --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$WEBDAV_URL/$FILENAME" || {
                            echo "重试失败,放弃webdav上传。"
                        }
                    }
                    
                    # 清理临时文件
                    rm -f "/mcp-proxy-server/config/$FILENAME"
                else
                    echo "没有找到要备份的文件,跳过 WebDAV 同步"
                fi
                
                # 清理临时目录
                rm -rf "$TEMP_DIR"
            fi

        else
            # 返回上级目录
            cd ..
            cd ..
            echo "GitHub: 没有检测到配置文件变化"
        fi
        # 3. 等待统一的时间间隔
        SYNC_INTERVAL=${SYNC_INTERVAL:-7200}  # 默认间隔时间为 7200 秒
        echo "当前时间 $(date '+%Y-%m-%d %H:%M:%S')"
        echo "等待 ${SYNC_INTERVAL} 秒后进行下一次同步..."
        sleep $SYNC_INTERVAL

    done
}

# 后台启动同步进程
sync_data &