Spaces:
Running
Running
File size: 5,649 Bytes
8681d05 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 |
#!/bin/bash
# Note: Ensure date, git, curl tools are installed and TZ timezone environment is set (can specify timezone temporarily in each date command)
# Check required environment variables
if [ -z "$G_NAME" ] || [ -z "$G_TOKEN" ]; then
echo "Missing required environment variables G_NAME or G_TOKEN"
exit 1
fi
# Parse repository name and username
IFS='/' read -r GITHUB_USER GITHUB_REPO <<< "$G_NAME"
# Build GitHub repository clone URL with token
REPO_URL="https://${G_TOKEN}@github.com/${G_NAME}.git"
mkdir -p ./data/github_data
# Clone repository
echo "Cloning repository..."
git clone "$REPO_URL" ./data/github_data || {
echo "Clone failed, please check if G_NAME and G_TOKEN are correct."
exit 1
}
if [ -f ./data/github_data/webui.db ]; then
cp ./data/github_data/webui.db ./data/webui.db
echo "Successfully pulled from GitHub repository"
else
echo "webui.db not found in GitHub repository, will push during sync"
fi
# Define sync function according to Beijing time 08:00~24:00 requirements (including hourly sync)
sync_data() {
while true; do
# Get current time and components using Asia/Dhaka timezone
CURRENT_TS=$(TZ=Asia/Dhaka date +%s)
CURRENT_DATE=$(TZ=Asia/Dhaka date '+%Y-%m-%d')
CURRENT_HOUR=$(TZ=Asia/Dhaka date +%H) # 00~23
CURRENT_MIN=$(TZ=Asia/Dhaka date +%M)
CURRENT_SEC=$(TZ=Asia/Dhaka date +%S)
# Calculate next sync target timestamp (Beijing time)
# If current time is before 08:00, target is today 08:00
if [ "$CURRENT_HOUR" -lt 8 ]; then
TARGET_TS=$(TZ=Asia/Dhaka date -d "${CURRENT_DATE} 08:00:00" +%s)
# If between 08:00 and 22:59, next hour is same day
elif [ "$CURRENT_HOUR" -ge 8 ] && [ "$CURRENT_HOUR" -lt 23 ]; then
# If exactly at hour (minutes and seconds both 0), sync immediately
if [ "$CURRENT_MIN" -eq 0 ] && [ "$CURRENT_SEC" -eq 0 ]; then
TARGET_TS=$CURRENT_TS
else
NEXT_HOUR=$((10#$CURRENT_HOUR + 1))
TARGET_TS=$(TZ=Asia/Dhaka date -d "${CURRENT_DATE} ${NEXT_HOUR}:00:00" +%s)
fi
# If current time is 23:00~23:59, next target is next day 00:00 (sync at 24:00)
else # CURRENT_HOUR == 23
if [ "$CURRENT_MIN" -eq 0 ] && [ "$CURRENT_SEC" -eq 0 ]; then
TARGET_TS=$CURRENT_TS
else
TOMORROW=$(TZ=Asia/Dhaka date -d "tomorrow" '+%Y-%m-%d')
TARGET_TS=$(TZ=Asia/Dhaka date -d "${TOMORROW} 00:00:00" +%s)
fi
fi
# Calculate wait time (if exactly sync time, sleep_time is 0)
SLEEP_TIME=$(( TARGET_TS - CURRENT_TS ))
if [ "$SLEEP_TIME" -gt 0 ]; then
echo "Next sync in ${SLEEP_TIME} seconds (Beijing time next sync: $(TZ=Asia/Dhaka date -d "@$TARGET_TS" '+%Y-%m-%d %H:%M:%S'))"
sleep "$SLEEP_TIME"
fi
# Output current Beijing time during sync
CURRENT_TIME=$(TZ=Asia/Dhaka date '+%Y-%m-%d %H:%M:%S')
echo "Current time $CURRENT_TIME"
# ---- Start sync process ----
# 1. Sync to GitHub
echo "Starting GitHub sync..."
cd ./data/github_data || { echo "Failed to change directory"; exit 1; }
git config user.name "AutoSync Bot"
git config user.email "autosync@bot.com"
# Ensure on main branch, try master branch if switch fails
git checkout main 2>/dev/null || git checkout master
# Copy latest database file to repository directory
if [ -f "../webui.db" ]; then
cp ../webui.db ./webui.db
else
echo "Database not initialized"
fi
# Check if there are changes
if [[ -n $(git status -s) ]]; then
git add webui.db
git commit -m "Auto sync webui.db $(TZ=Asia/Dhaka date '+%Y-%m-%d %H:%M:%S')"
git push --force-with-lease origin HEAD && {
echo "GitHub force push successful"
} || {
echo "Force push failed, waiting to retry..."
sleep 10
git push --force-with-lease origin HEAD || {
echo "Retry failed, giving up on GitHub force push."
}
}
else
echo "GitHub: No database changes detected"
fi
# Return to main directory
cd ../..
# 2. Sync to WebDAV (if environment variables configured)
if [ -z "$WEBDAV_URL" ] || [ -z "$WEBDAV_USERNAME" ] || [ -z "$WEBDAV_PASSWORD" ]; then
echo "WebDAV environment variables missing, skipping WebDAV sync."
else
echo "Starting WebDAV sync..."
FILENAME="webui_$(TZ=Asia/Dhaka date +'%m_%d').db"
if [ -f ./data/webui.db ]; then
curl -T ./data/webui.db --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$WEBDAV_URL/$FILENAME" && {
echo "WebDAV upload successful"
} || {
echo "WebDAV upload failed, waiting to retry..."
sleep 10
curl -T ./data/webui.db --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$WEBDAV_URL/$FILENAME" || {
echo "Retry failed, giving up on WebDAV upload."
}
}
else
echo "webui.db file not found, skipping WebDAV sync."
fi
fi
# ---- Sync process complete, next loop will automatically calculate wait time based on current Beijing time ----
done
}
# Start sync process in background
sync_data & |