hzruo commited on
Commit
420e4bb
·
verified ·
1 Parent(s): 79958d2

Create sync_data.sh

Browse files
Files changed (1) hide show
  1. sync_data.sh +275 -0
sync_data.sh ADDED
@@ -0,0 +1,275 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+
3
+ # 设置颜色
4
+ GREEN='\033[0;32m'
5
+ YELLOW='\033[1;33m'
6
+ RED='\033[0;31m'
7
+ NC='\033[0m' # No Color
8
+
9
+ mkdir -p /app/logs
10
+ touch /app/logs/app.log
11
+ chmod -R 755 /app/logs
12
+
13
+ # 使用 TMPDIR 环境变量
14
+ TEMP_DIR=${TMPDIR:-"/tmp"}
15
+ DB_DOWNLOAD_PATH="${TEMP_DIR}/samba_pool.db.download"
16
+ BACKUP_DIR="${TEMP_DIR}/backup"
17
+
18
+ # 检查环境变量
19
+ if [[ -z "$WEBDAV_URL" ]] || [[ -z "$WEBDAV_USERNAME" ]] || [[ -z "$WEBDAV_PASSWORD" ]]; then
20
+ echo -e "${YELLOW}未配置 WebDAV,跳过同步功能${NC}"
21
+ echo -e "${YELLOW}如需启用同步,请设置 WEBDAV_URL, WEBDAV_USERNAME, WEBDAV_PASSWORD 环境变量${NC}"
22
+ # 直接执行主程序
23
+ exec python main.py
24
+ exit 0
25
+ fi
26
+
27
+ # 设置备份路径
28
+ WEBDAV_BACKUP_PATH=${WEBDAV_BACKUP_PATH:-"sambanova-pool"}
29
+ FULL_WEBDAV_URL="${WEBDAV_URL}"
30
+ if [ -n "$WEBDAV_BACKUP_PATH" ]; then
31
+ FULL_WEBDAV_URL="${WEBDAV_URL}/${WEBDAV_BACKUP_PATH}"
32
+ fi
33
+
34
+ # 设置同步间隔(默认10分钟)
35
+ SYNC_INTERVAL=${SYNC_INTERVAL:-600}
36
+
37
+ echo -e "${GREEN}WebDAV 同步已配置:${NC}"
38
+ echo -e " URL: ${FULL_WEBDAV_URL}"
39
+ echo -e " 同步间隔: ${SYNC_INTERVAL}秒"
40
+
41
+ # 检查 WebDAV 连接和权限
42
+ check_webdav_connection() {
43
+ echo -e "${GREEN}检查 WebDAV 连接和权限...${NC}"
44
+
45
+ # 尝试列出根目录
46
+ HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" \
47
+ -u "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" \
48
+ -X PROPFIND -H "Depth: 1" \
49
+ "${FULL_WEBDAV_URL}/")
50
+
51
+ if [ "$HTTP_CODE" = "207" ] || [ "$HTTP_CODE" = "200" ]; then
52
+ echo -e "${GREEN}WebDAV 连接成功${NC}"
53
+ return 0
54
+ elif [ "$HTTP_CODE" = "404" ]; then
55
+ echo -e "${YELLOW}WebDAV 路径不存在,尝试创建...${NC}"
56
+
57
+ # 尝试创建主目录
58
+ create_main_dir
59
+ return $?
60
+ elif [ "$HTTP_CODE" = "401" ]; then
61
+ echo -e "${RED}WebDAV 认证失败,请检查用户名和密码${NC}"
62
+ return 1
63
+ elif [ "$HTTP_CODE" = "403" ]; then
64
+ echo -e "${RED}WebDAV 权限不足,无法访问${NC}"
65
+ return 1
66
+ else
67
+ echo -e "${RED}WebDAV 连接失败: HTTP 状态码 ${HTTP_CODE}${NC}"
68
+ return 1
69
+ fi
70
+ }
71
+
72
+ # 创建主目录
73
+ create_main_dir() {
74
+ # 如果路径包含多级目录,需要逐级创建
75
+ IFS='/' read -ra DIRS <<< "$WEBDAV_BACKUP_PATH"
76
+ CURRENT_PATH=""
77
+
78
+ for DIR in "${DIRS[@]}"; do
79
+ if [ -z "$DIR" ]; then
80
+ continue
81
+ fi
82
+
83
+ if [ -z "$CURRENT_PATH" ]; then
84
+ CURRENT_PATH="$DIR"
85
+ else
86
+ CURRENT_PATH="$CURRENT_PATH/$DIR"
87
+ fi
88
+
89
+ HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" \
90
+ -u "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" \
91
+ -X MKCOL "${WEBDAV_URL}/${CURRENT_PATH}/")
92
+
93
+ if [ "$HTTP_CODE" = "201" ]; then
94
+ echo -e "${GREEN}创建目录成功: ${CURRENT_PATH}${NC}"
95
+ elif [ "$HTTP_CODE" = "405" ]; then
96
+ echo -e "${YELLOW}目录已存在: ${CURRENT_PATH}${NC}"
97
+ elif [ "$HTTP_CODE" = "409" ]; then
98
+ echo -e "${YELLOW}父目录不存在: ${CURRENT_PATH}${NC}"
99
+ return 1
100
+ elif [ "$HTTP_CODE" = "403" ]; then
101
+ echo -e "${RED}无权限创建目录: ${CURRENT_PATH}${NC}"
102
+ return 1
103
+ else
104
+ echo -e "${RED}创建目录失败: ${CURRENT_PATH}, HTTP 状态码 ${HTTP_CODE}${NC}"
105
+ return 1
106
+ fi
107
+ done
108
+
109
+ # 创建备份子目录
110
+ HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" \
111
+ -u "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" \
112
+ -X MKCOL "${FULL_WEBDAV_URL}/backups/")
113
+
114
+ if [ "$HTTP_CODE" = "201" ]; then
115
+ echo -e "${GREEN}创建备份目录成功${NC}"
116
+ return 0
117
+ elif [ "$HTTP_CODE" = "405" ]; then
118
+ echo -e "${YELLOW}备份目录已存在${NC}"
119
+ return 0
120
+ elif [ "$HTTP_CODE" = "403" ]; then
121
+ echo -e "${RED}无权限创建备份目录${NC}"
122
+ return 1
123
+ else
124
+ echo -e "${RED}创建备份目录失败: HTTP 状态码 ${HTTP_CODE}${NC}"
125
+ return 1
126
+ fi
127
+ }
128
+
129
+ # 从 WebDAV 下载数据库
130
+ download_db() {
131
+ echo -e "${GREEN}从 WebDAV 下载数据库...${NC}"
132
+
133
+ # 使用 curl 下载数据库文件
134
+ HTTP_CODE=$(curl -s -o "${DB_DOWNLOAD_PATH}" -w "%{http_code}" \
135
+ -u "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" \
136
+ "${FULL_WEBDAV_URL}/samba_pool.db")
137
+
138
+ if [ "$HTTP_CODE" = "200" ]; then
139
+ # 检查文件是否为有效的 SQLite 数据库
140
+ if sqlite3 "${DB_DOWNLOAD_PATH}" "PRAGMA integrity_check;" > /dev/null 2>&1; then
141
+ echo -e "${GREEN}成功下载数据库文件并验证完整性${NC}"
142
+
143
+ # 如果当前没有数据库或下载的数据库更新,则使用下载的数据库
144
+ if [ ! -f /app/samba_pool.db ] || [ $(stat -c %Y "${DB_DOWNLOAD_PATH}") -gt $(stat -c %Y /app/samba_pool.db 2>/dev/null || echo 0) ]; then
145
+ cp "${DB_DOWNLOAD_PATH}" /app/samba_pool.db
146
+ echo -e "${GREEN}已更新本地数据库${NC}"
147
+ else
148
+ echo -e "${YELLOW}本地数据库已是最新版本${NC}"
149
+ rm "${DB_DOWNLOAD_PATH}"
150
+ fi
151
+ else
152
+ echo -e "${RED}下载的文件不是有效的 SQLite 数据库${NC}"
153
+ rm "${DB_DOWNLOAD_PATH}"
154
+ fi
155
+ elif [ "$HTTP_CODE" = "404" ]; then
156
+ echo -e "${YELLOW}WebDAV 上不存在数据库文件,将使用本地数据库${NC}"
157
+ rm -f "${DB_DOWNLOAD_PATH}"
158
+ else
159
+ echo -e "${RED}下载数据库失败: HTTP 状态码 ${HTTP_CODE}${NC}"
160
+ rm -f "${DB_DOWNLOAD_PATH}"
161
+ fi
162
+ }
163
+
164
+ # 上传数据库到 WebDAV
165
+ upload_db() {
166
+ echo -e "${GREEN}上传数据库到 WebDAV...${NC}"
167
+
168
+ # 确保数据库文件存在
169
+ if [ ! -f /app/samba_pool.db ]; then
170
+ echo -e "${YELLOW}本地数据库文件不存在,跳过上传${NC}"
171
+ return
172
+ fi
173
+
174
+ # 创建备份目录(如果不存在)
175
+ mkdir -p "${BACKUP_DIR}"
176
+
177
+ # 创建带时间戳的备份
178
+ TIMESTAMP=$(date +%Y%m%d_%H%M%S)
179
+ cp /app/samba_pool.db "${BACKUP_DIR}/pool_${TIMESTAMP}.db"
180
+
181
+ # 上传当前数据库
182
+ HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" \
183
+ -u "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" \
184
+ -T /app/samba_pool.db "${FULL_WEBDAV_URL}/samba_pool.db")
185
+
186
+ if [ "$HTTP_CODE" = "201" ] || [ "$HTTP_CODE" = "204" ]; then
187
+ echo -e "${GREEN}成功上传数据库${NC}"
188
+
189
+ # 上传备份
190
+ HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" \
191
+ -u "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" \
192
+ -T "${BACKUP_DIR}/pool_${TIMESTAMP}.db" "${FULL_WEBDAV_URL}/backups/pool_${TIMESTAMP}.db")
193
+
194
+ if [ "$HTTP_CODE" = "201" ] || [ "$HTTP_CODE" = "204" ]; then
195
+ echo -e "${GREEN}成功上传数据库备份 pool_${TIMESTAMP}.db${NC}"
196
+ else
197
+ echo -e "${YELLOW}上传数据库备份失败: HTTP 状态码 ${HTTP_CODE}${NC}"
198
+ fi
199
+ else
200
+ echo -e "${RED}上传数据库失败: HTTP 状态码 ${HTTP_CODE}${NC}"
201
+ fi
202
+
203
+ # 清理临时文件
204
+ rm -rf "${BACKUP_DIR}"
205
+ }
206
+
207
+ # 清理旧备份
208
+ cleanup_old_backups() {
209
+ echo -e "${GREEN}清理旧备份...${NC}"
210
+
211
+ # 使用 curl 列出目录内容
212
+ BACKUPS=$(curl -s -X PROPFIND -H "Depth: 1" \
213
+ -u "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" \
214
+ "${FULL_WEBDAV_URL}/backups/" | grep -o "backups/pool_[0-9]\{8\}_[0-9]\{6\}.db" | sort)
215
+
216
+ # 计算要删除的备份数量(保留最新的5个)
217
+ BACKUP_COUNT=$(echo "$BACKUPS" | wc -l)
218
+ DELETE_COUNT=$((BACKUP_COUNT - 5))
219
+
220
+ if [ $DELETE_COUNT -gt 0 ]; then
221
+ echo -e "${GREEN}找到 ${BACKUP_COUNT} 个备份,将删除最旧的 ${DELETE_COUNT} 个${NC}"
222
+
223
+ # 获取要删除的备份列表
224
+ TO_DELETE=$(echo "$BACKUPS" | head -n $DELETE_COUNT)
225
+
226
+ # 删除旧备份
227
+ for BACKUP in $TO_DELETE; do
228
+ HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" \
229
+ -u "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" \
230
+ -X DELETE "${FULL_WEBDAV_URL}/${BACKUP}")
231
+
232
+ if [ "$HTTP_CODE" = "204" ] || [ "$HTTP_CODE" = "200" ]; then
233
+ echo -e "${GREEN}已删除旧备份: ${BACKUP}${NC}"
234
+ else
235
+ echo -e "${YELLOW}删除旧备份失败: ${BACKUP}, HTTP 状态码 ${HTTP_CODE}${NC}"
236
+ fi
237
+ done
238
+ else
239
+ echo -e "${GREEN}备份数量不超过5个,无需清理${NC}"
240
+ fi
241
+ }
242
+
243
+ # 同步函数
244
+ sync_data() {
245
+ while true; do
246
+ echo -e "${GREEN}开始同步过程: $(date)${NC}"
247
+
248
+ # 检查 WebDAV 连接
249
+ if check_webdav_connection; then
250
+ # 上传数据库
251
+ upload_db
252
+
253
+ # 清理旧备份
254
+ cleanup_old_backups
255
+ else
256
+ echo -e "${RED}WebDAV 连接或权限问题,跳过本次同步${NC}"
257
+ fi
258
+
259
+ echo -e "${GREEN}同步完成,下次同步将在 ${SYNC_INTERVAL} 秒后进行...${NC}"
260
+ sleep $SYNC_INTERVAL
261
+ done
262
+ }
263
+
264
+ # 首次启动时检查 WebDAV 连接并下载数据库
265
+ if check_webdav_connection; then
266
+ download_db
267
+ else
268
+ echo -e "${YELLOW}WebDAV 连接或权限问题,将使用本地数据库${NC}"
269
+ fi
270
+
271
+ # 启动同步进程
272
+ sync_data &
273
+
274
+ # 启动主应用
275
+ exec python main.py