Spaces:
Running
Running
Update sync_data.sh
Browse files- sync_data.sh +26 -67
sync_data.sh
CHANGED
@@ -20,7 +20,6 @@ restore_from_webdav() {
|
|
20 |
|
21 |
# 获取WebDAV上所有备份文件列表
|
22 |
echo "获取 WebDAV 备份文件列表..."
|
23 |
-
|
24 |
# 尝试使用PROPFIND方法获取目录列表(WebDAV标准方法)
|
25 |
RAW_RESPONSE=$(curl -s -X PROPFIND \
|
26 |
--user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" \
|
@@ -28,27 +27,17 @@ restore_from_webdav() {
|
|
28 |
-H "Content-Type: text/xml" \
|
29 |
-d '<?xml version="1.0" encoding="utf-8"?><propfind xmlns="DAV:"><prop><displayname/></prop></propfind>' \
|
30 |
"$WEBDAV_URL/")
|
31 |
-
|
32 |
# 如果PROPFIND失败,尝试简单的GET请求
|
33 |
if [ -z "$RAW_RESPONSE" ] || echo "$RAW_RESPONSE" | grep -q "Method Not Allowed"; then
|
34 |
RAW_RESPONSE=$(curl -s --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$WEBDAV_URL/")
|
35 |
fi
|
36 |
-
|
37 |
-
|
38 |
-
# 方式1: 从XML响应中提取文件名
|
39 |
-
BACKUP_LIST1=$(echo "$RAW_RESPONSE" | grep -oE '<D:displayname[^>]*>[^<]*mcp_backup_[0-9]+_[0-9]+\.tar\.gz[^<]*</D:displayname>' | sed 's/<[^>]*>//g')
|
40 |
-
# 方式2: 从href属性中提取
|
41 |
-
BACKUP_LIST2=$(echo "$RAW_RESPONSE" | grep -oE 'href="[^"]*mcp_backup_[0-9]+_[0-9]+\.tar\.gz[^"]*"' | sed 's/.*href="[^"]*\///g' | sed 's/".*//g')
|
42 |
-
# 方式3: 简单文本匹配
|
43 |
-
BACKUP_LIST3=$(echo "$RAW_RESPONSE" | grep -oE 'mcp_backup_[0-9]+_[0-9]+\.tar\.gz')
|
44 |
-
|
45 |
-
# 合并所有结果并排序
|
46 |
-
BACKUP_LIST=$(printf "%s\n%s\n%s\n" "$BACKUP_LIST1" "$BACKUP_LIST2" "$BACKUP_LIST3" | grep -v '^$' | sort -u | sort -r)
|
47 |
|
48 |
if [ -z "$BACKUP_LIST" ]; then
|
49 |
-
echo "
|
50 |
rm -rf "$RESTORE_DIR"
|
51 |
-
return 1
|
52 |
fi
|
53 |
|
54 |
echo "找到以下备份文件:"
|
@@ -57,37 +46,16 @@ restore_from_webdav() {
|
|
57 |
echo " ... 等共 $(echo "$BACKUP_LIST" | wc -l) 个文件"
|
58 |
fi
|
59 |
|
60 |
-
# 尝试下载最新的备份文件
|
61 |
LATEST_BACKUP=$(echo "$BACKUP_LIST" | head -1)
|
62 |
echo "尝试下载最新备份: $LATEST_BACKUP"
|
63 |
|
64 |
if curl -f --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$WEBDAV_URL/$LATEST_BACKUP" -o "$RESTORE_DIR/$LATEST_BACKUP" 2>/dev/null; then
|
65 |
echo "下载备份成功: $LATEST_BACKUP"
|
66 |
-
|
67 |
-
# 解压缩备份文件
|
68 |
cd "$RESTORE_DIR"
|
69 |
tar -xzf "$LATEST_BACKUP" && {
|
70 |
echo "解压缩备份文件成功"
|
71 |
-
|
72 |
-
|
73 |
-
if [ -d "config" ] && [ "$(ls -A config 2>/dev/null)" ]; then
|
74 |
-
echo "恢复 config 目录..."
|
75 |
-
mkdir -p /mcp-proxy-server/config
|
76 |
-
cp -r config/* /mcp-proxy-server/config/
|
77 |
-
echo "config 目录恢复成功"
|
78 |
-
else
|
79 |
-
echo "备份中没有 config 目录或目录为空"
|
80 |
-
fi
|
81 |
-
|
82 |
-
if [ -d "tools" ] && [ "$(ls -A tools 2>/dev/null)" ]; then
|
83 |
-
echo "恢复 tools 目录..."
|
84 |
-
mkdir -p /tools
|
85 |
-
cp -r tools/* /tools/
|
86 |
-
echo "tools 目录恢复成功"
|
87 |
-
else
|
88 |
-
echo "备份中没有 tools 目录或目录为空"
|
89 |
-
fi
|
90 |
-
|
91 |
echo "从 WebDAV 恢复配置文件完成"
|
92 |
} || {
|
93 |
echo "解压缩备份文件失败"
|
@@ -97,9 +65,8 @@ restore_from_webdav() {
|
|
97 |
echo "下载最新备份失败,将跳过恢复。"
|
98 |
fi
|
99 |
|
100 |
-
# 清理临时目录
|
101 |
rm -rf "$RESTORE_DIR"
|
102 |
-
return 0
|
103 |
}
|
104 |
|
105 |
# 定义备份到 WebDAV 的函数
|
@@ -111,32 +78,23 @@ backup_to_webdav() {
|
|
111 |
mkdir -p "$BACKUP_DIR"
|
112 |
|
113 |
# 准备要备份的目录
|
114 |
-
|
115 |
-
|
116 |
-
fi
|
117 |
-
if [ -d "/tools" ]; then
|
118 |
-
cp -r /tools "$BACKUP_DIR/"
|
119 |
-
fi
|
120 |
|
121 |
-
# 如果备份目录为空,则不执行备份
|
122 |
if [ -z "$(ls -A $BACKUP_DIR 2>/dev/null)" ]; then
|
123 |
echo "没有需要备份的文件,跳过此次备份。"
|
124 |
rm -rf "$BACKUP_DIR"
|
125 |
return
|
126 |
fi
|
127 |
|
128 |
-
# 创建备份压缩包
|
129 |
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
|
130 |
BACKUP_FILE="mcp_backup_${TIMESTAMP}.tar.gz"
|
131 |
|
132 |
cd "$BACKUP_DIR"
|
133 |
tar -czf "$BACKUP_FILE" *
|
134 |
|
135 |
-
# 上传到 WebDAV
|
136 |
echo "正在上传备份文件: $BACKUP_FILE"
|
137 |
-
curl -T "$BACKUP_FILE" --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$WEBDAV_URL/$BACKUP_FILE"
|
138 |
-
|
139 |
-
if [ $? -eq 0 ]; then
|
140 |
echo "备份成功上传到 WebDAV。"
|
141 |
else
|
142 |
echo "备份上传失败。"
|
@@ -148,40 +106,41 @@ backup_to_webdav() {
|
|
148 |
# 清理旧的备份 (可选, 保留最近的10个)
|
149 |
MAX_BACKUPS=${MAX_BACKUPS:-10}
|
150 |
echo "清理 WebDAV 上的旧备份,保留最新的 $MAX_BACKUPS 个..."
|
151 |
-
|
152 |
-
# 重新获取备份列表
|
153 |
-
# 尝试使用PROPFIND方法获取目录列表
|
154 |
-
RAW_RESPONSE=$(curl -s -X PROPFIND --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" -H "Depth: 1" -H "Content-Type: text/xml" -d '<?xml version="1.0" encoding="utf-8"?><propfind xmlns="DAV:"><prop><displayname/></prop></propfind>' "$WEBDAV_URL/")
|
155 |
-
# 如果PROPFIND失败,尝试简单的GET请求
|
156 |
-
if [ -z "$RAW_RESPONSE" ] || echo "$RAW_RESPONSE" | grep -q "Method Not Allowed"; then
|
157 |
-
RAW_RESPONSE=$(curl -s --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$WEBDAV_URL/")
|
158 |
-
fi
|
159 |
BACKUP_LIST=$(echo "$RAW_RESPONSE" | grep -oE 'mcp_backup_[0-9]+_[0-9]+\.tar\.gz' | sort -r)
|
160 |
-
|
161 |
OLD_BACKUPS=$(echo "$BACKUP_LIST" | tail -n +$((MAX_BACKUPS + 1)))
|
162 |
|
163 |
for old_backup in $OLD_BACKUPS; do
|
164 |
echo "删除旧备份: $old_backup"
|
165 |
-
curl -X DELETE --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$WEBDAV_URL/$old_backup"
|
166 |
done
|
167 |
}
|
168 |
|
169 |
|
170 |
-
# 脚本主逻辑
|
171 |
|
172 |
-
#
|
173 |
if [ "$1" = "--restore-only" ]; then
|
174 |
restore_from_webdav
|
175 |
exit 0
|
176 |
fi
|
177 |
|
178 |
-
#
|
179 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
180 |
|
181 |
# 定义同步(备份)间隔
|
182 |
SYNC_INTERVAL=${SYNC_INTERVAL:-3600} # 默认1小时
|
183 |
|
184 |
-
#
|
185 |
while true; do
|
186 |
echo "----------------------------------------"
|
187 |
echo "下一次 WebDAV 备份将在 $SYNC_INTERVAL 秒后进行..."
|
|
|
20 |
|
21 |
# 获取WebDAV上所有备份文件列表
|
22 |
echo "获取 WebDAV 备份文件列表..."
|
|
|
23 |
# 尝试使用PROPFIND方法获取目录列表(WebDAV标准方法)
|
24 |
RAW_RESPONSE=$(curl -s -X PROPFIND \
|
25 |
--user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" \
|
|
|
27 |
-H "Content-Type: text/xml" \
|
28 |
-d '<?xml version="1.0" encoding="utf-8"?><propfind xmlns="DAV:"><prop><displayname/></prop></propfind>' \
|
29 |
"$WEBDAV_URL/")
|
|
|
30 |
# 如果PROPFIND失败,尝试简单的GET请求
|
31 |
if [ -z "$RAW_RESPONSE" ] || echo "$RAW_RESPONSE" | grep -q "Method Not Allowed"; then
|
32 |
RAW_RESPONSE=$(curl -s --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$WEBDAV_URL/")
|
33 |
fi
|
34 |
+
# 多种匹配方式提取文件名
|
35 |
+
BACKUP_LIST=$(echo "$RAW_RESPONSE" | grep -oE 'mcp_backup_[0-9]+_[0-9]+\.tar\.gz' | sort -u | sort -r)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
36 |
|
37 |
if [ -z "$BACKUP_LIST" ]; then
|
38 |
+
echo "未找到任何备份文件。"
|
39 |
rm -rf "$RESTORE_DIR"
|
40 |
+
return 1 # 返回1表示失败,这是关键
|
41 |
fi
|
42 |
|
43 |
echo "找到以下备份文件:"
|
|
|
46 |
echo " ... 等共 $(echo "$BACKUP_LIST" | wc -l) 个文件"
|
47 |
fi
|
48 |
|
|
|
49 |
LATEST_BACKUP=$(echo "$BACKUP_LIST" | head -1)
|
50 |
echo "尝试下载最新备份: $LATEST_BACKUP"
|
51 |
|
52 |
if curl -f --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$WEBDAV_URL/$LATEST_BACKUP" -o "$RESTORE_DIR/$LATEST_BACKUP" 2>/dev/null; then
|
53 |
echo "下载备份成功: $LATEST_BACKUP"
|
|
|
|
|
54 |
cd "$RESTORE_DIR"
|
55 |
tar -xzf "$LATEST_BACKUP" && {
|
56 |
echo "解压缩备份文件成功"
|
57 |
+
[ -d "config" ] && [ "$(ls -A config 2>/dev/null)" ] && echo "恢复 config 目录..." && mkdir -p /mcp-proxy-server/config && cp -r config/* /mcp-proxy-server/config/
|
58 |
+
[ -d "tools" ] && [ "$(ls -A tools 2>/dev/null)" ] && echo "恢复 tools 目录..." && mkdir -p /tools && cp -r tools/* /tools/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
59 |
echo "从 WebDAV 恢复配置文件完成"
|
60 |
} || {
|
61 |
echo "解压缩备份文件失败"
|
|
|
65 |
echo "下载最新备份失败,将跳过恢复。"
|
66 |
fi
|
67 |
|
|
|
68 |
rm -rf "$RESTORE_DIR"
|
69 |
+
return 0 # 返回0表示成功
|
70 |
}
|
71 |
|
72 |
# 定义备份到 WebDAV 的函数
|
|
|
78 |
mkdir -p "$BACKUP_DIR"
|
79 |
|
80 |
# 准备要备份的目录
|
81 |
+
[ -d "/mcp-proxy-server/config" ] && cp -r /mcp-proxy-server/config "$BACKUP_DIR/"
|
82 |
+
[ -d "/tools" ] && cp -r /tools "$BACKUP_DIR/"
|
|
|
|
|
|
|
|
|
83 |
|
|
|
84 |
if [ -z "$(ls -A $BACKUP_DIR 2>/dev/null)" ]; then
|
85 |
echo "没有需要备份的文件,跳过此次备份。"
|
86 |
rm -rf "$BACKUP_DIR"
|
87 |
return
|
88 |
fi
|
89 |
|
|
|
90 |
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
|
91 |
BACKUP_FILE="mcp_backup_${TIMESTAMP}.tar.gz"
|
92 |
|
93 |
cd "$BACKUP_DIR"
|
94 |
tar -czf "$BACKUP_FILE" *
|
95 |
|
|
|
96 |
echo "正在上传备份文件: $BACKUP_FILE"
|
97 |
+
if curl -T "$BACKUP_FILE" --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$WEBDAV_URL/$BACKUP_FILE"; then
|
|
|
|
|
98 |
echo "备份成功上传到 WebDAV。"
|
99 |
else
|
100 |
echo "备份上传失败。"
|
|
|
106 |
# 清理旧的备份 (可选, 保留最近的10个)
|
107 |
MAX_BACKUPS=${MAX_BACKUPS:-10}
|
108 |
echo "清理 WebDAV 上的旧备份,保留最新的 $MAX_BACKUPS 个..."
|
109 |
+
RAW_RESPONSE=$(curl -s --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$WEBDAV_URL/")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
110 |
BACKUP_LIST=$(echo "$RAW_RESPONSE" | grep -oE 'mcp_backup_[0-9]+_[0-9]+\.tar\.gz' | sort -r)
|
|
|
111 |
OLD_BACKUPS=$(echo "$BACKUP_LIST" | tail -n +$((MAX_BACKUPS + 1)))
|
112 |
|
113 |
for old_backup in $OLD_BACKUPS; do
|
114 |
echo "删除旧备份: $old_backup"
|
115 |
+
curl -s -X DELETE --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$WEBDAV_URL/$old_backup"
|
116 |
done
|
117 |
}
|
118 |
|
119 |
|
120 |
+
# --- 脚本主逻辑 ---
|
121 |
|
122 |
+
# 处理 --restore-only 参数
|
123 |
if [ "$1" = "--restore-only" ]; then
|
124 |
restore_from_webdav
|
125 |
exit 0
|
126 |
fi
|
127 |
|
128 |
+
# 启动时先尝试恢复
|
129 |
+
echo "脚本启动,首先尝试从 WebDAV 恢复..."
|
130 |
+
if ! restore_from_webdav; then
|
131 |
+
# 如果恢复函数返回非0值 (即失败,通常是因为没找到备份)
|
132 |
+
echo "恢复失败或未找到备份文件。这可能是首次启动。"
|
133 |
+
# 等待一小段时间,给主程序生成初始配置的机会
|
134 |
+
INITIAL_BACKUP_DELAY=${INITIAL_BACKUP_DELAY:-30}
|
135 |
+
echo "将在 ${INITIAL_BACKUP_DELAY} 秒后执行首次备份,以捕获初始配置文件..."
|
136 |
+
sleep $INITIAL_BACKUP_DELAY
|
137 |
+
backup_to_webdav
|
138 |
+
fi
|
139 |
|
140 |
# 定义同步(备份)间隔
|
141 |
SYNC_INTERVAL=${SYNC_INTERVAL:-3600} # 默认1小时
|
142 |
|
143 |
+
# 进入正常的循环备份流程
|
144 |
while true; do
|
145 |
echo "----------------------------------------"
|
146 |
echo "下一次 WebDAV 备份将在 $SYNC_INTERVAL 秒后进行..."
|