btrbk fixes
authorIan Kelling <iank@fsf.org>
Thu, 16 May 2019 11:49:47 +0000 (07:49 -0400)
committerIan Kelling <iank@fsf.org>
Thu, 16 May 2019 11:49:47 +0000 (07:49 -0400)
install missing dependency
better output on cron
in cron, dont fail right away when we cant ssh to one host out of multiple

btrbk-run
machine_specific/btrbk/filesystem/etc/systemd/system/btrbk.service
mount-latest-subvol

index 469b1b391afaa73a6b73235a17810b926851484b..8d6eb285f20eecdff391d99101482325d1712fc3 100644 (file)
--- a/btrbk-run
+++ b/btrbk-run
@@ -43,8 +43,8 @@ rsync-dirs() {
 }
 
 
-m() { if $verbose; then printf "$pre%s\n"  "$*"; fi;  "$@"; }
-die() { printf "$pre%s\n" "$*" >&2;  exit 1; }
+m() { if $verbose; then printf "$pre %s\n"  "$*"; fi;  "$@"; }
+die() { printf "$pre %s\n" "$*" >&2;  exit 1; }
 
 # latest $MAIL_HOST
 if [[ -e /b/bash_unpublished/source-semi-priv ]]; then
@@ -68,11 +68,13 @@ pull_reexec=false
 default_args_file=/etc/btrbk-run.conf
 if [[ -s $default_args_file ]]; then
   set -- $(< $default_args_file) "$@"
+  # i havent used this feature yet, so warn about it
   echo "$0: warning: default btrbk-run options set in $default_args_file (sleeping 5 seconds):"
   cat $default_args_file
   sleep 5
 fi
 
+pre="${0##*/}:"
 cron=false
 orig_args=("$@")
 temp=$(getopt -l cpull-reexec,help cl:m:npqs:t:vh "$@") || usage 1
@@ -81,7 +83,7 @@ while true; do
   case $1 in
     --cron)
       cron=true
-      pre="${0##*/}: "
+      pre=
       shift
       ;;
     # only creates the config file, does not run btrbk
@@ -114,13 +116,13 @@ if [[ -v targets && $source ]]; then
 fi
 
 if $verbose; then
-  printf "$0: 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 "$pre 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
 
 
 # set default targets
-if [[ ! -v targets && ! $source && $HOSTNAME == $MAIL_HOST ]]; then
+if [[ ! -v targets && ! $source && $HOSTNAME == "$MAIL_HOST" ]]; then
   case $HOSTNAME in
     kw|x2)
       if ping -q -c1 -w1 iank.vpn.office.fsf.org &>/dev/null; then
@@ -186,7 +188,7 @@ else
   esac
   for mp in ${prospective_mps[@]}; do # default mountpoints to sync
     if [[ -e /nocow/btrfs-stale/$mp ]]; then
-      echo "$0: warning: $mp stale, not adding to default mountpoints"
+      echo "$pre warning: $mp stale, not adding to default mountpoints"
       continue
     fi
     if awk '{print $2}' /etc/fstab | grep -xF $mp &>/dev/null; then
@@ -212,7 +214,7 @@ if ! $pull_reexec && [[ $source ]] && ! $pulla ; then
   tmpf=$(mktemp)
   scp $source:/a/bin/distro-setup/btrbk-run $tmpf
   if ! diff -q $tmpf $BASH_SOURCE; then
-    echo "$0: found newer version on host $source. reexecing"
+    echo "$pre 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
@@ -231,6 +233,43 @@ fi
 # it doesn't make sense to do a backup.
 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
+local_zone=$(date +%z)
+
+if [[ $source ]]; then
+  if ! zone=$(ssh root$source date +%z); then
+    die failed to ssh to root@$source
+  fi
+  if [[ $zone != $local_zone ]]; then
+    die "error: dont confuse yourself with multiple time zones. $h has different timezone than localhost"
+  fi
+
+else
+
+  sshable=()
+  sshfail=()
+  for h in ${targets[@]}; do
+    if zone=$(ssh root@$h "mkdir -p /mnt/root/btrbk && date +%z"); then
+      sshable+=($h)
+    else
+      sshfail+=($h)
+    fi
+    if [[ $zone != $local_zone ]]; then
+      die "error: dont confuse yourself with multiple time zones. $h has different timezone than localhost"
+    fi
+  done
+  if [[ ! $sshable ]] || { ! $cron && [[ $sshfail ]]; }; then
+    die "failed to ssh to hosts: ${sshfail[*]}"
+  else
+    if [[ $sshfail ]]; then
+      ret=1
+      echo "$pre error: failed to ssh to ${sshfail[*]} but continuing with other hosts"
+    fi
+    targets=(${sshable[@]})
+  fi
+fi
+
 
 cat >/etc/btrbk.conf <<EOF
 ssh_identity /root/.ssh/home
@@ -273,19 +312,6 @@ EOF
 
 
 
-# for an initial run, btrbk requires the dir to exist.
-mkdir -p /mnt/root/btrbk
-local_zone=$(date +%z)
-for h in ${targets[@]} $source; do
-  cmd="ssh root@$h mkdir -p /mnt/root/btrbk && date +%z"
-  if ! zone=$($cmd); then
-    die "error running: $cmd"
-  fi
-  if [[ $zone != $local_zone ]]; then
-    die "error: dont confuse yourself with multiple time zones. $h has different timezone than localhost"
-  fi
-done
-
 
 
 vol=/mnt/root
@@ -360,6 +386,8 @@ else
   m /a/exe/mount-latest-remote ${targets[@]}
 fi
 
+exit $ret
+
 # todo: move variable data we don't care about backing up
 # to /nocow and symlink it.
 
index 26698188b18e9b9cbc56a55289cd8b81969f03b5..d1c1657ff9c3476aa05b5f40b636bc482424b3d9 100644 (file)
@@ -4,4 +4,4 @@ After=multi-user.target
 
 [Service]
 Type=oneshot
-ExecStart=/a/bin/log-quiet/sysd-mail-once btrbk /usr/local/bin/btrbk-run -q
+ExecStart=/a/bin/log-quiet/sysd-mail-once btrbk /usr/local/bin/btrbk-run -q --cron
index aa35efa5720bbb9573b44939719a7baec8dd74a2..a277b55cbc9c9528542e222cc2ae4ce49aab5587 100644 (file)
@@ -315,6 +315,8 @@ for vol in q a o i; do
 
     ### begin check if leaf is different, delete it if not ###
     if [[ -e /a/opt/btrfs-snapshots-diff/btrfs-snapshots-diff.py ]]; then
+      source /a/bin/distro-functions/src/package-manager-abstractions
+      pi python-jmespath # dependency
       parentid=$(btrfs sub show $leaf | awk '$1 == "Parent" && $2 == "UUID:" {print $3}')
       bsubs=(/mnt/root/btrbk/$vol.*)
       bsub=