summaryrefslogtreecommitdiff
path: root/fast-repair.in
diff options
context:
space:
mode:
Diffstat (limited to 'fast-repair.in')
-rw-r--r--fast-repair.in88
1 files changed, 88 insertions, 0 deletions
diff --git a/fast-repair.in b/fast-repair.in
new file mode 100644
index 0000000..9d5224a
--- /dev/null
+++ b/fast-repair.in
@@ -0,0 +1,88 @@
+#!/bin/bash
+
+# fast-repair version #VERSION#
+
+[ -r "/etc/backup.conf" ] && \
+ . "/etc/backup.conf"
+
+dummy=false
+if [ $# -eq 1 ] \
+ && [ "$1" == "-d" ]
+then
+ shift
+ dummy=true
+fi
+
+if [ $# -ne 0 ]
+then
+ >&2 echo "too many arguments: '$@'"
+ exit 1
+fi
+
+for backupID in "${!backups[@]}"
+do
+ backupDir="${backups["${backupID}"]%% *}"
+ lastDate="$(
+ ls -1 "${backupDir}" | \
+ sort -r | \
+ grep -m1 '^[0-9]\{4\}\(_[0-9]\{2\}\)\{2\}$'
+ )"
+
+ dateList=$(
+ ls -1 "${backupDir}" | \
+ sort -r | \
+ grep '^[0-9]\{4\}\(_[0-9]\{2\}\)\{2\}$' | \
+ grep -v "^${lastDate}"
+ )
+
+ [ -z "${dateList}" ] \
+ && continue
+
+ set -e
+
+ echo -n "${backupID}: "
+
+ find "${backupDir}${lastDate}" -type f -links 1 | \
+ wc -l
+
+ find "${backupDir}${lastDate}" -type f -links 1 | \
+ sed "s|^${backupDir}${lastDate}/||" | \
+ while read -r datei
+ do
+ for date in ${dateList}
+ do
+ [ -f "${backupDir}${date}/${datei}" ] \
+ || break
+ diff -q "${backupDir}${lastDate}/${datei}" "${backupDir}${date}/${datei}" > /dev/null \
+ || break
+ nlinks=$(
+ stat -c'%h' "${backupDir}${date}/${datei}"
+ )
+ [ ${nlinks} -eq 65000 ] \
+ && continue
+ rights=$(stat -c'%a' "${backupDir}${lastDate}/${datei}")
+ uid=$(stat -c'%u' "${backupDir}${lastDate}/${datei}")
+ gid=$(stat -c'%g' "${backupDir}${lastDate}/${datei}")
+ timeModification=$(stat -c'%y' "${backupDir}${lastDate}/${datei}")
+
+ echo rm \"${backupDir}${lastDate}/${datei}\"
+ echo ln \"${backupDir}${date}/${datei}\" \"${backupDir}${lastDate}/${datei}\"
+ echo chown ${uid}:${gid} \"${backupDir}${lastDate}/${datei}\"
+ echo chmod ${rights} \"${backupDir}${lastDate}/${datei}\"
+ echo touch -m -d \"${timeModification}\" \"${backupDir}${lastDate}/${datei}\"
+
+ if ! ${dummy}
+ then
+ rm "${backupDir}${lastDate}/${datei}"
+ ln "${backupDir}${date}/${datei}" "${backupDir}${lastDate}/${datei}"
+ chown ${uid}:${gid} "${backupDir}${lastDate}/${datei}"
+ chmod ${rights} "${backupDir}${lastDate}/${datei}"
+ touch -m -d "${timeModification}" "${backupDir}${lastDate}/${datei}"
+ fi
+ break
+ done
+ done
+
+ set +e
+
+done