summaryrefslogtreecommitdiff
path: root/backomp
diff options
context:
space:
mode:
Diffstat (limited to 'backomp')
-rwxr-xr-xbackomp49
1 files changed, 37 insertions, 12 deletions
diff --git a/backomp b/backomp
index c56396e..51e749a 100755
--- a/backomp
+++ b/backomp
@@ -24,7 +24,7 @@ function mstart(t) {
}
BEGIN {
- n = split("h d w m", arr)
+ n = split("h d w M", arr)
for (i = 1; i <= n; ++i) {
b = arr[i]
@@ -57,16 +57,16 @@ NR == 1 {
bt["h"] = flr(t, 60*60)
bt["d"] = flr(t, 24*60*60)
bt["w"] = flr(t + wshift, 7*24*60*60) - wshift
- bt["m"] = mstart(t)
+ bt["M"] = mstart(t)
for (i = 1; i <= n_buckets; ++i) {
b = buckets[i]
- if (b == "m" && "w" in ret) {
+ if (b == "M" && "w" in ret) {
if (newest_in["w"]) {
- if (mstart(bt["w"] + 6*24*60*60) > bt["m"])
+ if (mstart(bt["w"] + 6*24*60*60) > bt["M"])
next
- } else if (bt["w"] < bt["m"]) {
+ } else if (bt["w"] < bt["M"]) {
next
}
}
@@ -98,17 +98,40 @@ run() {
"${@}"
}
+current() {
+ local str="${1}" interval="${2}"
+ local s=0 val d
+
+ while [[ "${interval}" =~ ([0-9]+)(.?) ]]; do
+ val="${BASH_REMATCH[1]}"
+ case "${BASH_REMATCH[2]}" in
+ d) ((s += val * 24*60*60)) ;;
+ h) ((s += val * 60*60)) ;;
+ m) ((s += val * 60)) ;;
+ *) ((s += val)) ;;
+ esac
+
+ interval="${interval#*${BASH_REMATCH[0]}}"
+ done
+ ((s < 1)) && return 1
+
+ d="${str:0:10} ${str:11:2}:${str:13:2}:${str:15:2}"
+ (($(date -u +%s) / s == $(date -ud "${d}" +%s) / s))
+}
+
backup() {
- dest_dir="${1}"
- src_path="${2}"
- retain="${3}"
- week_start="${4}"
+ local dest_dir="${1}" src_path="${2}"
+ local retain="${3}" interval="${4}" week_start="${5}"
+ local dest_path snaps keep i ki
- [[ "$((dcount++))" -ne 0 ]] && echo
- echo "[${dcount}] [${retain}] ${src_path} => ${dest_dir}"
mapfile -td $'\0' snaps < <(shopt -s nullglob;
printf '%s\0' "${dest_dir}/"* | awk -v 'RS=\0' -v 'ORS=\0' \
-- "${AWK_PREFILTER}")
+ [[ -n "${snaps}" ]] && current "${snaps[0]##*/}" "${interval}" && \
+ return
+
+ ((dcount++ > 0)) && echo
+ echo "[${dcount}] [${retain}] ${src_path} => ${dest_dir}"
dest_path="${dest_dir}/$(date -u '+%Y-%m-%d-%H%M%S')"
run rsync -ac --mkpath ${snaps[0]:+"--link-dest=${snaps[0]}"} \
@@ -140,7 +163,8 @@ backup() {
}
declare -A def_opts=(
- ['retain']='*h*d*w*m'
+ ['retain']='*h' # e.g. 24h7d4w12M or 24^h10d*M
+ ['interval']='0'
['week_start']='mon'
)
declare -A opts
@@ -158,6 +182,7 @@ while IFS='=' read -r f1 f2; do
else
backup "${base_path}/${f1}" "${f2}" \
"${opts['retain']}" \
+ "${opts['interval']}" \
"${opts['week_start']}"
fi
done < "${1}"