allow arbitrary btrbk commands, eg archive
authorIan Kelling <iank@fsf.org>
Sat, 30 Mar 2019 18:55:12 +0000 (14:55 -0400)
committerIan Kelling <iank@fsf.org>
Sat, 30 Mar 2019 18:55:12 +0000 (14:55 -0400)
btrbk-run

index 0d680283b44135981748e0f5a49595a7c9db21bd..87f55811f6bf8af08fddfeba5306d8efff4e16ac 100755 (executable)
--- a/btrbk-run
+++ b/btrbk-run
@@ -14,7 +14,6 @@
 # limitations under the License.
 
 
-# todo: remove old leaf subvols, like keep up to 1 month or something.
 # 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.
 
 set -eE -o pipefail
@@ -40,7 +39,6 @@ rsync_mountpoint=/q
 
 conf_only=false
 dry_run=false # mostly for testing
-resume_arg=
 rate_limit=no
 verbose=false
 
@@ -49,20 +47,20 @@ if [[ -s $default_args_file ]]; then
   set -- $(< $default_args_file) "$@"
 fi
 
-temp=$(getopt -l help cl:m:nprt:vh "$@") || usage 1
+temp=$(getopt -l help cl:m:npt:vh "$@") || usage 1
 eval set -- "$temp"
 while true; do
   case $1 in
     # only creates the config file, does not run btrbk
     -c) conf_only=true; shift ;;
+    # bytes per second, suffix k m g
     -l) rate_limit=$2; shift 2 ;;
+    # 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 ;;
     -p) progress_arg="--progress"; shift ;;
-    # btrbk arg: Resume only. Skips snapshot creation.
-    -r) resume_arg=-r; shift ;;
-    # empty is valid for just doing local snapshot. we have default hosts
-    # we will populate
+    # 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 ;;
     -v) verbose=true; verbose_arg=-v; shift ;;
     -h|--help) usage ;;
@@ -71,13 +69,16 @@ while true; do
   esac
 done
 
+# usefull commands are resume and archive
+cmd_arg=${1:-run}
+
 if [[ -s $default_args_file ]]; then
   echo "$0: warning: default btrbk-run options set in $default_args_file (sleeping 5 seconds):"
   cat $default_args_file
   sleep 5
 fi
 
-echo -e "$0: options: conf_only=$conf_only\ndry_run=$dry_run\nresume_arg=$resume_arg\nrate_limit=$rate_limit\nverbose=$verbose"
+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
@@ -216,12 +217,11 @@ EOF
 
 for tg in ${targets[@]}; do
   # for an initial run, btrbk requires the dir to exist.
-  # also use this opportunity to kill emacs, because it doesn't
-  # notice that the file has changed out from underneath it
   ssh root@$tg mkdir -p /mnt/root/btrbk
 done
 
 
+
 for m in ${mountpoints[@]}; do
   # for /i, some special cases. there is just one static target and direction.
   if [[ $m == /i ]]; then
@@ -252,12 +252,18 @@ if $conf_only; then
   exit
 fi
 
+
+
 if $dry_run; then
-  m btrbk -v -n $resume_arg run
+  m btrbk -v -n $cmd_arg
+elif [[ $cmd_arg == archive ]]; then
+    for tg in ${targets[@]}; do
+      m btrbk $verbose_arg $progress_arg $cmd_arg $vol ssh://$tg$vol
+    done
 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.
-  m btrbk $verbose_arg $progress_arg $resume_arg run
+  m btrbk $verbose_arg $progress_arg $cmd_arg
 fi
 
 # if we have it, sync to systems which don't