diff options
Diffstat (limited to 'backomp')
| -rwxr-xr-x | backomp | 49 |
1 files changed, 37 insertions, 12 deletions
@@ -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}" |
