X-Git-Url: https://iankelling.org/git/?a=blobdiff_plain;f=btrbk-run;h=8a310e61e931e495ef0700c64128e56dac1fab9e;hb=ad09c51104f62d1da1782387025b44327a081872;hp=1137a72b9c85bc434bf7168ea46c331cd8c7016f;hpb=95eb9558206f8287febab80dd3f51d168a3ca831;p=distro-setup diff --git a/btrbk-run b/btrbk-run index 1137a72..8a310e6 100644 --- a/btrbk-run +++ b/btrbk-run @@ -76,13 +76,18 @@ if [[ -s $default_args_file ]]; then sleep 5 fi -early=false # quit early, just btrbk, no extra remounting etc. +marchive=false +early=false cron=false orig_args=("$@") -temp=$(getopt -l cron,pull-reexec,help ceil:m:npqs:t:vh "$@") || usage 1 +temp=$(getopt -l cron,pull-reexec,help ceil:m:npqrs:t:vh "$@") || usage 1 eval set -- "$temp" while true; do case $1 in + # some behaviors specific to running under cron: + # - skip hosts where xprintidle haven't been idle recently + # - if we can't ssh to 1 or more hosts, still do the rest + # - if we aren't MAIL_HOST and no -m or -s, just exit --cron) cron=true pre= @@ -90,6 +95,7 @@ while true; do ;; # only creates the config file, does not run btrbk -c) conf_only=true; shift ;; + # quit early, just btrbk, no extra remounting etc. -e) early=true; shift ;; -i) incremental_strict=true; shift ;; # bytes per second, suffix k m g @@ -97,8 +103,11 @@ while true; do # Comma separated mountpoints to backup. This has defaults set below. -m) IFS=, mountpoints=($2); unset IFS; shift 2 ;; -n) dry_run=true; dry_run_arg=-n; shift ;; + # show progress -p) progress_arg="--progress"; shift ;; + # internal option for rerunning under newer SOURCE_HOST version. --pull-reexec) pull_reexec=true; shift ;; + # quiet -q) verbose=false; verbose_arg=; progress_arg=; shift ;; # source host to receive a backup from -s) @@ -112,6 +121,7 @@ while true; do # target hosts to send to. empty is valid for just doing local # snapshot. we have default hosts we will populate. -t) IFS=, targets=($2); unset IFS; shift 2 ;; + # verbose. -v) verbose=true; verbose_arg=-v; shift ;; -h|--help) usage ;; --) shift; break ;; @@ -122,8 +132,19 @@ done # only tested commands are resume and archive cmd_arg=${1:-run} + +std_preserve="18h 14d 8w 24m" +q_preserve="18h 14d" + case $cmd_arg in run|resume|archive) : ;; + marchive) + marchive=true + cmd=resume + std_preserve="999h 999d 999w 999m" + q_preserve="$std_preserve" + preserve_arg=-p + ;; *) die "untested command arg" ;; esac @@ -142,6 +163,8 @@ if $verbose; then fi ### end options parsing +declare -A vols + # remove path from earlier version of btrbk rm -f /usr/sbin/btrbk # note, this still works as intended if there is no /usr/bin/btrbk @@ -172,7 +195,7 @@ if [[ ! -v targets && ! $source ]]; then targets=(frodo.b8.nz) case $HOSTNAME in - kw) + x2|kw) at_work=true ;;& x2|x3|sy|bo) @@ -193,18 +216,18 @@ if [[ ! -v targets && ! $source ]]; then fi ;;& kw) - targets+=($home x3) + targets+=($home x2.office.fsf.org) ;; x2|x3|sy|bo) targets+=($home) if $at_work; then - targets+=(kw.office.fsf.org x2.b8.nz) + targets+=(x2.office.fsf.org x2.b8.nz) else - targets+=(kw.b8.nz) + targets+=(x2wg.b8.nz) fi ;; kd) - targets+=(x2.b8.nz kw.b8.nz) + targets+=(x2wg.b8.nz x3.b8.nz) if ping -q -c1 -w1 sy.b8.nz &>/dev/null; then targets+=(sy.b8.nz) else @@ -265,7 +288,7 @@ else fi # note: put q last just in case its specific retention options were to # affect other config sections. I havent tested if that is the case. - prospective_mps+=(/a /q) + prospective_mps+=(/a /ar /qr /q) ;; esac fi @@ -319,7 +342,7 @@ if ! $pull_reexec && [[ $source ]] && $pulla ; then fi -if ! which btrbk &>/dev/null; then +if ! command -v btrbk &>/dev/null; then die "error: no btrbk binary found" fi # if our mountpoints are from stale snapshots, @@ -327,7 +350,7 @@ fi check-subvol-stale ${mountpoints[@]} || die "found stale mountpoints in ${mountpoints[*]}" # for an initial run, btrbk requires the dir to exist. -mkdir -p /mnt/root/btrbk +mkdir -p /mnt/{root,o}/btrbk local_zone=$(date +%z) if [[ $source ]]; then @@ -344,7 +367,7 @@ else sshfail=() min_idle_ms=$((1000 * 60 * 15)) for h in ${targets[@]}; do - if remote_info=( $(timeout -s 9 6 ssh root@$h "mkdir -p /mnt/root/btrbk && date +%z && df --output=size,pcent / | tail -n1") ); then + if remote_info=( $(timeout -s 9 6 ssh root@$h "mkdir -p /mnt/root/btrbk /mnt/o/btrbk && date +%z && df --output=size,pcent / | tail -n1") ); then zone=${remote_info[0]} root_size=${remote_info[1]} percent_used=${remote_info[2]%%%} @@ -422,11 +445,11 @@ snapshot_create onchange # I could make this different from target_preserve, # if one disk had less space. # for now, keeping them equal. -snapshot_preserve 18h 14d 8w 24m +snapshot_preserve $std_preserve snapshot_preserve_min 2h snapshot_dir btrbk # so, total backups = ~58 -target_preserve 18h 14d 8w 24m +target_preserve $std_preserve target_preserve_min 2h # if something fails and it's not obvious, try doing @@ -441,8 +464,18 @@ incremental strict EOF fi -vol=/mnt/root for m in ${mountpoints[@]}; do + case $m in + /o) + vol=/mnt/o + vols[$vol]=t + ;; + *) + vol=/mnt/root + vols[$vol]=t + ;; + esac + sub=${m#/} if [[ $source ]]; then cat >>/etc/btrbk.conf <>/etc/btrbk.conf <