X-Git-Url: https://iankelling.org/git/?p=distro-setup;a=blobdiff_plain;f=btrbk-run;h=68363821af2b1f695655805c83fe683d7f8102cc;hp=7dad03a5c270284b455397c1c76726d2786ce3ed;hb=77917a8fbf2032a8b2634a1b3de0879ec45cf213;hpb=1059b8ac11f567b9a8eec1e34a7ab6e791721dca diff --git a/btrbk-run b/btrbk-run index 7dad03a..6836382 100644 --- a/btrbk-run +++ b/btrbk-run @@ -17,7 +17,7 @@ # todo: if we cancel in the middle of a btrfs send, then run again immediately, the received subvolume doesn't get a Received UUID: field, and we won't mount it. Need to figure out a solution that will fix this. -[[ $EUID == 0 ]] || exec sudo -E "$BASH_SOURCE" "$@" +[[ $EUID == 0 ]] || exec sudo -E "${BASH_SOURCE[0]}" "$@" source /usr/local/lib/err @@ -44,8 +44,9 @@ rsync-dirs() { pre="${0##*/}: " m() { if $verbose; then printf "$pre%s\n" "$*"; fi; "$@"; } -e() { printf "$pre%s\n" "$*"; "$@"; } -die() { printf "$pre%s\n" "$*" >&2; exit 1; } +e() { printf "$pre%s\n" "$*"; } +die() { printf "$pre%s\n" "$*" >&2; echo "exiting with status 1" >&2; exit 1; } +mexit() { echo "$pre: exiting with status $1"; exit $1; } # latest $MAIL_HOST if [[ -e /b/bash_unpublished/source-state ]]; then @@ -58,12 +59,14 @@ mountpoints=() rsync_mountpoint=/q +ret=0 # default options conf_only=false dry_run=false # mostly for testing rate_limit=no verbose=true; verbose_arg=-v progress_arg="--progress" +incremental_strict=true pull_reexec=false default_args_file=/etc/btrbk-run.conf @@ -77,7 +80,7 @@ fi cron=false orig_args=("$@") -temp=$(getopt -l cron,pull-reexec,help cl:m:npqs:t:vh "$@") || usage 1 +temp=$(getopt -l cron,pull-reexec,help cil:m:npqs:t:vh "$@") || usage 1 eval set -- "$temp" while true; do case $1 in @@ -88,6 +91,7 @@ while true; do ;; # only creates the config file, does not run btrbk -c) conf_only=true; shift ;; + -i) incremental_strict=false; shift ;; # bytes per second, suffix k m g -l) rate_limit=$2; shift 2 ;; # Comma separated mountpoints to backup. This has defaults set below. @@ -125,10 +129,15 @@ if [[ -v targets && $source ]]; then fi if $verbose; then - e "options: conf_only=%s\ndry_run=%s\nrate_limit=%s\nverbose=%s\ncmd_arg=%s" "$conf_only" "$dry_run" "$rate_limit" "$verbose" "$cmd_arg" + printf "options: conf_only=%s\ndry_run=%s\nrate_limit=%s\nverbose=%s\ncmd_arg=%s" "$conf_only" "$dry_run" "$rate_limit" "$verbose" "$cmd_arg" fi ### end options parsing +if ! btrbk --version |& grep 0.29.0 >/dev/null; then + cd /a/opt/btrbk + m sudo make install +fi + # TODO: i wonder if there should be an option to send to the default # targets, plus any given on the command line. @@ -136,35 +145,48 @@ fi if [[ ! -v targets && ! $source ]]; then if [[ $HOSTNAME != "$MAIL_HOST" ]] && $cron ; then echo "MAIL_HOST=$MAIL_HOST, nothing to do" - exit 0 + mexit 0 fi + + at_work=false + case $HOSTNAME in - kw|x2) - if ping -q -c1 -w1 iank.vpn.office.fsf.org &>/dev/null; then + kw) + at_work=true + ;;& + x2|x3) + if ping -q -c1 -w1 hal.office.fsf.org \ + && ip n show 192.168.0.26 | grep . &>/dev/null; then + at_work=true + fi + ;;& + kw|x2|x3) + if $at_work && ping -q -c1 -w1 iank.vpn.office.fsf.org &>/dev/null; then home=iank.vpn.office.fsf.org else home=b8.nz fi ;;& kw) - targets=($home x2) + targets=($home x3) ;; - x2) + x2|x3) targets=($home kw) ;; tp) # kd disabled temporarily while its hot and i plan to work on it. #targets=(frodo kd) - targets=(frodo x3.b8.nz) + #targets=(frodo x2.b8.nz) + targets=(frodo) # might not be connected to the vpn - if timeout -s 9 10 ssh kw :; then + if timeout -s 9 6 ssh kw :; then targets+=(kw) fi ;; kd) targets=(frodo tp) # might not be connected to the vpn - if timeout -s 9 10 ssh kw :; then + if timeout -s 9 6 ssh kw :; then targets+=(kw) fi ;; @@ -230,7 +252,7 @@ echo "mountpoints: ${mountpoints[*]}" if [[ $source ]]; then if [[ $(ssh $source systemctl is-active btrbk.service) != inactive ]]; then echo "$0: error: cron btrbk is running on source. exiting out of caution" - exit 1 + mexit 1 fi fi @@ -250,14 +272,13 @@ if ! $pull_reexec && [[ $source ]] && $pulla ; then e "found newer version on host $source. reexecing" install -T $tmpf /usr/local/bin/btrbk-run m /usr/local/bin/btrbk-run --pull-reexec "${orig_args[@]}" - exit + mexit 0 fi fi - if ! which btrbk &>/dev/null; then die "error: no btrbk binary found" fi @@ -285,7 +306,7 @@ else for h in ${targets[@]}; do if zone=$(ssh root@$h "mkdir -p /mnt/root/btrbk && date +%z"); then # This is a separate ssh because xprintidle can fail and thats ok. - if $cron && idle_ms=$(ssh $h DISPLAY=:0 xprintidle); then + if $cron && idle_ms=$(timeout -s 9 6 ssh $h DISPLAY=:0 xprintidle); then if (( idle_ms < min_idle_ms )); then # Ignore this host. i sometimes use a non-main machine for @@ -355,9 +376,11 @@ target_preserve_min 4h rate_limit $rate_limit EOF - - - +if $incremental_strict; then + cat >>/etc/btrbk.conf </dev/null; then fi if [[ $source ]]; then - m mount-latest-subvol $verbose_arg + m mount-latest-subvol else m /a/exe/mount-latest-remote ${targets[@]} fi -exit $ret +mexit $ret # todo: move variable data we don't care about backing up # to /nocow and symlink it.