usage() {
cat <<'EOF'
btrbk-run [OPTIONS]
-usually -t TARGET_HOST
+usually -t TARGET_HOST or -s SOURCE_HOST
+
+Note, at source location, intentionally not executable, run and read
+install-my-scripts.
+
EOF
echo "top of script file:"
sed -n '1,/^[# ]*end command line/{p;b};q' "$0"
exit $1
}
-script_dir=$(dirname $(readlink -f "$BASH_SOURCE"))
+# latest $MAIL_HOST
+if [[ -e /b/bash_unpublished/source-semi-priv ]]; then
+ source /b/bash_unpublished/source-semi-priv
+fi
# note q is owned by root:1000
-# note p/m is owned 1000:1000 and chmod 700
-
mountpoints=()
rate_limit=no
verbose=true; verbose_arg=-v
progress_arg="--progress"
+pull_reexec=false
default_args_file=/etc/btrbk-run.conf
if [[ -s $default_args_file ]]; then
set -- $(< $default_args_file) "$@"
+ echo "$0: warning: default btrbk-run options set in $default_args_file (sleeping 5 seconds):"
+ cat $default_args_file
+ sleep 5
fi
-temp=$(getopt -l help cl:m:npt:vh "$@") || usage 1
+orig_args=("$@")
+temp=$(getopt -l pull-reexec,help cl:m:nps:t:vh "$@") || usage 1
eval set -- "$temp"
while true; do
case $1 in
-m) IFS=, mountpoints=($2); unset IFS; shift 2 ;;
-n) dry_run=true; dry_run_arg=-n; shift ;;
-p) progress_arg="--progress"; shift ;;
+ --pull-reexec) pull_reexec=true; shift ;;
-q) verbose=false; verbose_arg=; progress_arg=; shift ;;
# source host to receive a backup from
-s) source=$2; shift 2 ;;
# 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
-
-if [[ -v targets && -v source ]]; then
+if [[ -v targets && $source ]]; then
echo "$0: error: -t and -s are mutually exclusive" >&2
exit 1
fi
+# pull_reexec stops us from getting into an infinite loop if there is some
+# kind of weird problem
+if ! $pull_reexec && [[ $source ]]; 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"
+ install -T $tmpf /usr/local/bin/btrbk-run
+ /usr/local/bin/btrbk-run --pull-reexec "${orig_args[@]}"
+ fi
+fi
+
+
echo -e "$0: options: conf_only=$conf_only\ndry_run=$dry_run\nrate_limit=$rate_limit\nverbose=$verbose\ncmd_arg=$cmd_arg"
+### end options parsing
+
# set default targets
-if [[ ! -v targets && ! -v source ]]; then
+if [[ ! -v targets && ! $source ]]; then
case $HOSTNAME in
x2|kw)
if [[ $HOSTNAME == "$MAIL_HOST" ]]; then
echo "targets: ${targets[*]}"
fi
-if [[ -v source ]]; then
+if [[ $source ]]; then
echo "source: $source"
fi
-
-# set default mountpoints
-case $HOSTNAME in
- # 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
- prospective_mps+=(/o)
+if [[ $mountpoints ]]; then
+ for mp in ${mountpoints[@]}; do # default mountpoints to sync
+ if [[ -e /nocow/btrfs-stale/$mp ]]; then
+ echo "$0: error: $mp is stale, mount-latest-subvol first"
+ exit 1
fi
- ;;
-esac
-case ${targets[0]} in
- kw|kww)
- prospective_mps=(/a)
- ;;
-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"
- continue
- fi
- if awk '{print $2}' /etc/fstab | grep -xF $mp &>/dev/null; then
- mountpoints+=($mp)
- fi
-done
+ done
+else
+ # set default mountpoints
+ case $HOSTNAME in
+ # 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
+ prospective_mps+=(/o)
+ fi
+ ;;
+ 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"
+ continue
+ fi
+ if awk '{print $2}' /etc/fstab | grep -xF $mp &>/dev/null; then
+ mountpoints+=($mp)
+ fi
+ done
+fi
echo "mountpoints: ${mountpoints[*]}"
# transaction info.
transaction_syslog local7
-# 20%ish speedup[]
-stream_buffer 512m
+# note, i had this because man said 20% speedup, but ran into
+# this issue, https://github.com/digint/btrbk/issues/275
+#stream_buffer 512m
# so we only run one at a time
lockfile /var/lock/btrbk.lock
-for tg in ${targets[@]:-localhost}; do
- # for an initial run, btrbk requires the dir to exist.
- ssh root@$tg mkdir -p /mnt/root/btrbk
+# 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
+ zone=$(ssh root@$h "mkdir -p /mnt/root/btrbk; date +%z")
+ if [[ $zone != $local_zone ]]; then
+ echo "error: error. dont confuse yourself with multiple time zones. $h has different timezone than localhost" >&2
+ exit 1
+ fi
done
vol=/mnt/root
for m in ${mountpoints[@]}; do
sub=${m##*/}
- if [[ -v source ]]; then
+ if [[ $source ]]; then
cat >>/etc/btrbk.conf <<EOF
-volume ssh://$source$vol/btrbk
+volume ssh://$source$vol
subvolume $sub
target send-receive $vol/btrbk
EOF
if $dry_run; then
m btrbk -v -n $cmd_arg
+ exit 0
elif [[ $cmd_arg == archive ]]; then
- if [[ -v source ]]; then
+ if [[ $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.
- m btrbk $verbose_arg $progress_arg $cmd_arg
+ exit 0
fi
+# -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 $cmd_arg
# if we have it, sync to systems which don't
if mountpoint $rsync_mountpoint >/dev/null; then
done
fi
-if ! $dry_run; then
- # note, targets will be empty if source is set.
- m $script_dir/mount-latest-remote ${targets[@]}
+/a/bin/distro-setup/install-my-scripts
+if [[ $source ]]; then
+ m mount-latest-subvol
+else
+ m /a/exe/mount-latest-remote ${targets[@]}
fi
-
# todo: move variable data we don't care about backing up
# to /nocow and symlink it.