add pull support, untested
authorIan Kelling <iank@fsf.org>
Sun, 31 Mar 2019 18:56:20 +0000 (14:56 -0400)
committerIan Kelling <iank@fsf.org>
Sun, 31 Mar 2019 18:56:20 +0000 (14:56 -0400)
btrbk-run

index 0c8dd8b40600052da4a88b696dd0b484740a1e23..4762b2fd553319a0bfaca886f893ea29d85ac2c0 100755 (executable)
--- a/btrbk-run
+++ b/btrbk-run
@@ -45,10 +45,8 @@ rsync_mountpoint=/q
 conf_only=false
 dry_run=false # mostly for testing
 rate_limit=no
-verbose=true
-if [[ $- == *i* ]]; then
-  progress_arg="--progress"
-fi
+verbose=true; verbose_arg=-v
+progress_arg="--progress"
 
 default_args_file=/etc/btrbk-run.conf
 if [[ -s $default_args_file ]]; then
@@ -68,6 +66,8 @@ while true; do
     -n) dry_run=true; dry_run_arg=-n; shift ;;
     -p) progress_arg="--progress"; shift ;;
     -q) verbose=false; verbose_arg=; progress_arg=; shift ;;
+    # source host to receive a backup from
+    -s) source=$2; shift 2 ;;
     # 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 ;;
@@ -87,10 +87,15 @@ if [[ -s $default_args_file ]]; then
   sleep 5
 fi
 
+if [[ -v targets && -v source ]]; then
+  echo "$0: error: -t and -s are mutually exclusive" >&2
+  exit 1
+fi
+
 echo -e "$0: options: conf_only=$conf_only\ndry_run=$dry_run\nrate_limit=$rate_limit\nverbose=$verbose\ncmd_arg=$cmd_arg"
 
 # set default targets
-if [[ ! -v targets ]]; then
+if [[ ! -v targets && ! -v source ]]; then
   case $HOSTNAME in
     x2|kw)
       if [[ $HOSTNAME == "$MAIL_HOST" ]]; then
@@ -115,15 +120,22 @@ if [[ ! -v targets ]]; then
   esac
 fi
 
-echo "targets: ${targets[*]}"
+if [[ -v targets ]]; then
+  echo "targets: ${targets[*]}"
+fi
+
+if [[ -v source ]]; then
+  echo "source: $source"
+fi
 
 
 
 # set default mountpoints
 case $HOSTNAME in
-  frodo)
-    prospective_mps=(/i)
-    ;;
+  # no remote backups atm. note, if we do enable this, configuration below will need some changes.
+  #  frodo)
+  #    prospective_mps=(/i)
+  #    ;;
   *)
     prospective_mps=(/a /q)
     if [[ $HOSTNAME == "$MAIL_HOST" ]]; then
@@ -157,21 +169,7 @@ rsync-dirs() {
   m rsync $dry_run_arg -ahi --relative --delete "$path" "root@$host:/"
 }
 
-vol-conf() {
-  cat >>/etc/btrbk.conf <<EOF
-volume $vol
-EOF
-}
-sub-conf() {
-  cat >>/etc/btrbk.conf <<EOF
-subvolume $sub
-EOF
-}
-tg-conf() {
-  cat >>/etc/btrbk.conf <<EOF
-target send-receive ssh://$tg$vol/btrbk
-EOF
-}
+
 m() { printf "%s: %s\n" "${0##*/}" "$*";  "$@"; }
 
 
@@ -224,30 +222,31 @@ EOF
 
 
 
-for tg in ${targets[@]}; do
+for tg in ${targets[@]:-localhost}; do
   # for an initial run, btrbk requires the dir to exist.
   ssh root@$tg mkdir -p /mnt/root/btrbk
 done
 
 
 
+vol=/mnt/root
 for m in ${mountpoints[@]}; do
-  # for /i, some special cases. there is just one static target and direction.
-  if [[ $m == /i ]]; then
-    vol=/mnt/iroot
-    vol-conf
-    sub=i
-    sub-conf
-    tg=frodo
-    vol=/mnt/root
-    tg-conf
+  sub=${m##*/}
+  if [[ -v source ]]; then
+    cat >>/etc/btrbk.conf <<EOF
+volume ssh://$source$vol/btrbk
+subvolume $sub
+target send-receive $vol/btrbk
+EOF
   else
-    vol=/mnt/root
-    vol-conf
-    sub=${m##*/}
-    sub-conf
+    cat >>/etc/btrbk.conf <<EOF
+volume $vol
+subvolume $sub
+EOF
     for tg in ${targets[@]}; do
-      tg-conf
+      cat >>/etc/btrbk.conf <<EOF
+target send-receive ssh://$tg$vol/btrbk
+EOF
     done
   fi
 done
@@ -266,9 +265,13 @@ fi
 if $dry_run; then
   m btrbk -v -n $cmd_arg
 elif [[ $cmd_arg == archive ]]; then
+  if [[ -v source ]]; then
+    m btrbk $verbose_arg $progress_arg $cmd_arg ssh://$source$vol $vol
+  else
     for tg in ${targets[@]}; do
       m btrbk $verbose_arg $progress_arg $cmd_arg $vol ssh://$tg$vol
     done
+  fi
 else
   # -q and just using the syslog option seemed nice,
   # but it doesn't show when a send has a parent and when it doesn't.
@@ -279,7 +282,7 @@ fi
 if mountpoint $rsync_mountpoint >/dev/null; then
   for tg in ${targets[@]}; do
     case $tg in
-      tp|li|lk)
+      li|lk)
         for x in /p/c/machine_specific/*.hosts; do
           if grep -qxF $tg $x; then
             dir=${x%.hosts}
@@ -292,6 +295,7 @@ if mountpoint $rsync_mountpoint >/dev/null; then
 fi
 
 if ! $dry_run; then
+  # note, targets will be empty if source is set.
   m $script_dir/mount-latest-remote ${targets[@]}
 fi