wuran commited on
Commit
bc50b77
·
verified ·
1 Parent(s): 943a51c

Update sync_data.sh

Browse files
Files changed (1) hide show
  1. 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
- if [ -d "/mcp-proxy-server/config" ]; then
115
- cp -r /mcp-proxy-server/config "$BACKUP_DIR/"
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
- restore_from_webdav
 
 
 
 
 
 
 
 
 
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 秒后进行..."