#!/bin/bash # ================= 配置区域 ================= # 1. WebDAV URL 处理 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 # 2. 同步间隔 (默认 10 分钟 = 600 秒) SYNC_INTERVAL=${SYNC_INTERVAL:-600} # 3. 文件名配置 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" # === 功能1: 恢复备份 === 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 } # === 功能2: 循环备份 === 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 # 检查 creds 目录是否有文件 if [ "$(ls -A $TARGET_DIR)" ]; then # 打包 creds 目录 # 排除 config.toml 如果你不想备份它,但通常需要备份 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