| #!/bin/bash |
|
|
| |
| |
| WEBDAV_URL=${WEBDAV_URL%/} |
| WEBDAV_BACKUP_PATH=${WEBDAV_BACKUP_PATH:-""} |
| WEBDAV_BACKUP_PATH=${WEBDAV_BACKUP_PATH#/} |
| WEBDAV_BACKUP_PATH=${WEBDAV_BACKUP_PATH%/} |
|
|
| if [ -n "$WEBDAV_BACKUP_PATH" ]; then |
| FULL_WEBDAV_URL="${WEBDAV_URL}/${WEBDAV_BACKUP_PATH}" |
| else |
| FULL_WEBDAV_URL="${WEBDAV_URL}" |
| fi |
|
|
| |
| SYNC_INTERVAL=${SYNC_INTERVAL:-600} |
|
|
| |
| BACKUP_NAME="gcli2api_creds.tar.gz" |
| TEMP_FILE="/tmp/$BACKUP_NAME" |
| TARGET_DIR="creds" |
|
|
| |
|
|
| log() { echo "[Backup] [$(date '+%H:%M:%S')] $1"; } |
|
|
| |
| if [[ -z "$WEBDAV_URL" ]]; then |
| log "未设置 WEBDAV_URL,跳过备份功能" |
| exit 0 |
| fi |
|
|
| |
| mkdir -p "$TARGET_DIR" |
|
|
| |
| restore() { |
| log "正在检查远程备份..." |
| REMOTE_FILE="$FULL_WEBDAV_URL/$BACKUP_NAME" |
| |
| |
| HTTP_CODE=$(curl -s -o "$TEMP_FILE" -w "%{http_code}" -u "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$REMOTE_FILE") |
| |
| if [[ "$HTTP_CODE" == "200" ]]; then |
| if [ -s "$TEMP_FILE" ]; then |
| log "发现备份,正在恢复到 $TARGET_DIR..." |
| |
| tar -xzf "$TEMP_FILE" |
| log "✅ 恢复完成" |
| else |
| log "❌ 下载文件为空,跳过" |
| fi |
| else |
| log "📭 未找到远程备份 (HTTP $HTTP_CODE),使用新环境启动" |
| fi |
| } |
|
|
| |
| loop() { |
| log "启动定时备份 (间隔: ${SYNC_INTERVAL}秒)" |
| |
| |
| if [ -n "$WEBDAV_BACKUP_PATH" ]; then |
| curl -s -o /dev/null -u "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" -X MKCOL "$FULL_WEBDAV_URL/" |
| fi |
| |
| while true; do |
| sleep $SYNC_INTERVAL |
| |
| |
| if [ "$(ls -A $TARGET_DIR)" ]; then |
| |
| |
| tar -czf "$TEMP_FILE" "$TARGET_DIR" |
| |
| FILE_SIZE=$(wc -c < "$TEMP_FILE") |
| log "正在上传备份 (大小: $FILE_SIZE bytes)..." |
| |
| HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" -u "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" -T "$TEMP_FILE" "$FULL_WEBDAV_URL/$BACKUP_NAME") |
| |
| if [[ "$HTTP_CODE" == "201" ]] || [[ "$HTTP_CODE" == "204" ]] || [[ "$HTTP_CODE" == "200" ]]; then |
| log "备份成功" |
| else |
| log "备份失败 (HTTP $HTTP_CODE)" |
| fi |
| else |
| log "⚠️ $TARGET_DIR 目录为空,跳过备份" |
| fi |
| done |
| } |
|
|
| |
| case "$1" in |
| "restore") restore ;; |
| "loop") loop ;; |
| *) restore; loop ;; |
| esac |