2api / sync.sh
lin7zhi's picture
Rename ai_studio_code.sh to sync.sh
13150c5 verified
#!/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