script_dir=$(dirname $(readlink -f "$BASH_SOURCE"))
-# todo: finish figuring out fai / distro-setup
-# initial fstab / subvol setup.
+# note q is owned by root:1000
+# note p/m is owned 1000:1000 and chmod 700
+mountpoints=(/a)
+private_mountpoints=(/q)
+rsync_mountpoint=/q
conf_only=false
dry_run=false # mostly for testing
resume_arg=
+do_i=true
+if [[ $HOSTNAME == $MAIL_HOST ]]; then
+ do_o=true
+else
+ do_o=false
+fi
+
+default_args_file=/etc/btrbk-run.conf
+if [[ -r $default_args_file ]]; then
+ set -- $(< $default_args_file) "$@"
+fi
-temp=$(getopt -l help hcnrt: "$@") || usage 1
+temp=$(getopt -l help hcinoprt: "$@") || usage 1
eval set -- "$temp"
while true; do
case $1 in
-c) conf_only=true; shift ;;
+ -i) do_i=false; shift ;;
-n) dry_run=true; dry_run_arg=-n; shift ;;
+ -o) do_o=false; shift ;;
+ -p) progress_arg="--progress"; shift ;;
+ # btrbk arg: Resume only. Skips snapshot creation.
-r) resume_arg=-r; shift ;;
- -t) IFS=, targets=($2); shift 2 ;;
+ -t) IFS=, targets=($2); unset IFS; shift 2 ;;
-h|--help) usage ;;
--) shift; break ;;
*) echo "$0: Internal error!" ; exit 1 ;;
esac
done
-read primary <<<"$@"
+
+if $do_o; then
+ private_mountpoints+=(/o)
+fi
+read primary <<<"$@" # not yet used
##### end command line parsing ########
rsync-dirs() {
local host=$1
local path=$2
- rsync $dry_run_arg -ahi --relative --delete "$path" "root@$host:/"
+ m rsync $dry_run_arg -ahi --relative --delete "$path" "root@$host:/"
}
vol-conf() {
target send-receive ssh://$tg$vol/btrbk
EOF
}
-
+m() { printf "%s: %s\n" "${0##*/}" "$*"; "$@"; }
if ! which btrbk &>/dev/null; then
cat >/etc/btrbk.conf <<'EOF'
ssh_identity /root/.ssh/id_rsa
+# Just a guess that local7 is a good facility to pick.
+# It's a bit odd that the transaction log has to be logged to
+# a file or syslog, while other output is sent to std out.
+# The man does not mention a way for them to be together, but
+# I dunno if setting a log level like warn might also output
+# transaction info.
+transaction_syslog local7
# so we only run one at a time
lockfile /var/lock/btrbk.lock
# only make a snapshot if things have changed
snapshot_create onchange
-# much less snapshots because I have less space on the
-# local filesystem.
-#snapshot_preserve 2h 2d
-# for now, keeping them equal for simplicity sake
-snapshot_preserve 48h 14d 8w 24m
-snapshot_preserve_min 6h
+# I could make this different from target_preserve,
+# if one disk had less space.
+# for now, keeping them equal.
+snapshot_preserve 36h 14d 8w 24m
+snapshot_preserve_min 4h
snapshot_dir btrbk
# so, total backups = ~89
-target_preserve 48h 14d 8w 24m
-target_preserve_min 6h
+target_preserve 36h 14d 8w 24m
+target_preserve_min 4h
# if something fails and it's not obvious, try doing
# btrbk -l debug -v dryrun
EOF
-# note q is owned by root:1000
-# note p is owned 1000:1000 and chmod 700
-mountpoints=(/q)
-if awk '{print $2}' /etc/fstab | grep -xF /p &>/dev/null; then
- mountpoints+=(/p)
-fi
+for mp in ${private_mountpoints[@]}; do # private mountpoints
+ if awk '{print $2}' /etc/fstab | grep -xF $mp &>/dev/null; then
+ mountpoints+=($mp)
+ fi
+done
# if our mountpoints are from stale snapshots,
# it doesn't make sense to do a backup.
targets=($HOME_DOMAIN)
fi
;;
+ treetowl)
+ targets=(frodo)
+ if timeout -s 9 10 ssh x2 :; then
+ targets+=(x2)
+ fi
+ ;;
+ *)
+ targets=(frodo)
+ ;;
esac
- targets=(frodo)
fi
+echo "targets: ${targets[*]}"
+
+
# for i, we just do a 1 way sync from master to backup,
# and manually manage any changes to that.
-do_i=false
+i_possible=false
for tg in ${targets[@]}; do
# for an initial run, btrbk requires the dir to exist
ssh root@$tg mkdir -p /mnt/root/btrbk
if [[ $tg == frodo && $HOSTNAME == treetowl ]]; then
- do_i=true
+ i_possible=true
fi
done
+if ! $i_possible; then
+ do_i=false
+fi
vol=/mnt/root
fi
if $dry_run; then
- btrbk -n $resume_arg run
+ m btrbk -n $resume_arg run
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.
- btrbk $resume_arg run
+ m btrbk $progress_arg $resume_arg run
fi
-# if we have /p, rsync to targets without /p
-if mountpoint /p >/dev/null; then
+# if we have it, sync to systems which don't
+if mountpoint $rsync_mountpoint >/dev/null; then
for tg in ${targets[@]}; do
case $tg in
tp|li|lk)
fi
if ! $dry_run; then
- $script_dir/mount-latest-remote ${targets[@]}
+ m $script_dir/mount-latest-remote ${targets[@]}
fi