rpi: ежемесячная выборочная перечитка файлов OneDrive с диска роутера (sha256) + алерты
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
629b11f03f
commit
d780c91bd5
@@ -4,6 +4,7 @@
|
||||
#
|
||||
# router-backup run — ежедневно (таймер 06:00)
|
||||
# router-backup verify — по воскресеньям после run: размеры + перечитать свежие архивы серверов по sha256
|
||||
# router-backup sample — ежемесячно: случайные файлы OneDrive (~2 ГБ) перечитать с роутера и сверить sha256
|
||||
#
|
||||
# Пишем прямо в remote, а не через FUSE /mnt/router: так надёжнее и есть коды ошибок.
|
||||
# Роутер не умеет хэши (shell_type=none) → сравнение по размеру+mtime, целостность — перечиткой.
|
||||
@@ -51,8 +52,30 @@ verify() {
|
||||
return $r
|
||||
}
|
||||
|
||||
sample() {
|
||||
# Роутер хэшей не считает, verify сверяет OneDrive только по размеру — тихую порчу внутри
|
||||
# файла того же размера ловит только перечитка. Берём файлы старше суток (точно должны
|
||||
# быть скопированы), до SAMPLE_BYTES суммарно и не больше SAMPLE_MAX штук.
|
||||
local budget=${SAMPLE_BYTES:-2147483648} max=${SAMPLE_MAX:-300} total=0 n=0 bad=0 miss=0 size rel want got
|
||||
while IFS=' ' read -r size rel; do
|
||||
[ $n -ge $max ] && break
|
||||
[ $total -gt 0 ] && [ $((total + size)) -gt $budget ] && continue
|
||||
want=$(sha256sum "$SRC/onedrive/$rel" | cut -d' ' -f1)
|
||||
if ! got=$(rclone --config "$C" cat "$R/onedrive/$rel" 2>>"$LOG" | sha256sum | cut -d' ' -f1) \
|
||||
|| [ "$got" = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" -a "$size" != 0 ]; then
|
||||
echo "MISSING $rel"; miss=$((miss + 1))
|
||||
elif [ "$want" != "$got" ]; then
|
||||
echo "BAD $rel"; bad=$((bad + 1))
|
||||
fi
|
||||
n=$((n + 1)); total=$((total + size))
|
||||
done < <(cd "$SRC/onedrive" && find current archive -type f ! -name '*.partial' -mmin +1440 -printf '%s %p\n' | shuf)
|
||||
echo "sample: проверено $n файлов, $((total / 1048576)) МиБ; повреждено $bad, нет на роутере $miss"
|
||||
[ $bad = 0 ] && { [ $miss = 0 ] || [ -n "${SAMPLE_ALLOW_MISSING:-}" ]; }
|
||||
}
|
||||
|
||||
case "${1:-run}" in
|
||||
run) run; r=$?; [ "$(date +%u)" = 7 ] && { verify || r=1; }; exit $r ;;
|
||||
verify) verify ;;
|
||||
*) echo "usage: router-backup run|verify" >&2; exit 2 ;;
|
||||
sample) sample ;;
|
||||
*) echo "usage: router-backup run|verify|sample" >&2; exit 2 ;;
|
||||
esac
|
||||
|
||||
Reference in New Issue
Block a user