iankelling.org
/
git
/
distro-setup
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
ordering
[distro-setup]
/
btrbk-run
diff --git
a/btrbk-run
b/btrbk-run
index 87f55811f6bf8af08fddfeba5306d8efff4e16ac..602422987946e1c87b4dbf3e86094108056706c2 100755
(executable)
--- a/
btrbk-run
+++ b/
btrbk-run
@@
-22,6
+22,10
@@
trap 'echo "$0:$LINENO:error: \"$BASH_COMMAND\" returned $?" >&2' ERR
[[ $EUID == 0 ]] || exec sudo -E "$BASH_SOURCE" "$@"
usage() {
[[ $EUID == 0 ]] || exec sudo -E "$BASH_SOURCE" "$@"
usage() {
+ cat <<'EOF'
+btrbk-run [OPTIONS]
+usually -t TARGET_HOST
+EOF
echo "top of script file:"
sed -n '1,/^[# ]*end command line/{p;b};q' "$0"
exit $1
echo "top of script file:"
sed -n '1,/^[# ]*end command line/{p;b};q' "$0"
exit $1
@@
-37,17
+41,19
@@
mountpoints=()
rsync_mountpoint=/q
rsync_mountpoint=/q
+# default options
conf_only=false
dry_run=false # mostly for testing
rate_limit=no
conf_only=false
dry_run=false # mostly for testing
rate_limit=no
-verbose=false
+verbose=true; verbose_arg=-v
+progress_arg="--progress"
default_args_file=/etc/btrbk-run.conf
if [[ -s $default_args_file ]]; then
set -- $(< $default_args_file) "$@"
fi
default_args_file=/etc/btrbk-run.conf
if [[ -s $default_args_file ]]; then
set -- $(< $default_args_file) "$@"
fi
-temp=$(getopt -l help cl:m:npt:vh "$@") || usage 1
+temp=$(getopt -l help cl:m:np
s:
t:vh "$@") || usage 1
eval set -- "$temp"
while true; do
case $1 in
eval set -- "$temp"
while true; do
case $1 in
@@
-59,6
+65,9
@@
while true; do
-m) IFS=, mountpoints=($2); unset IFS; shift 2 ;;
-n) dry_run=true; dry_run_arg=-n; shift ;;
-p) progress_arg="--progress"; shift ;;
-m) IFS=, mountpoints=($2); unset IFS; shift 2 ;;
-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 ;;
# 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 ;;
@@
-78,10
+87,15
@@
if [[ -s $default_args_file ]]; then
sleep 5
fi
sleep 5
fi
+if [[ -v targets && $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
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
&& ! $source
]]; then
case $HOSTNAME in
x2|kw)
if [[ $HOSTNAME == "$MAIL_HOST" ]]; then
case $HOSTNAME in
x2|kw)
if [[ $HOSTNAME == "$MAIL_HOST" ]]; then
@@
-106,15
+120,22
@@
if [[ ! -v targets ]]; then
esac
fi
esac
fi
-echo "targets: ${targets[*]}"
+if [[ -v targets ]]; then
+ echo "targets: ${targets[*]}"
+fi
+
+if [[ $source ]]; then
+ echo "source: $source"
+fi
# set default mountpoints
case $HOSTNAME in
# 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
*)
prospective_mps=(/a /q)
if [[ $HOSTNAME == "$MAIL_HOST" ]]; then
@@
-148,21
+169,7
@@
rsync-dirs() {
m rsync $dry_run_arg -ahi --relative --delete "$path" "root@$host:/"
}
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##*/}" "$*"; "$@"; }
m() { printf "%s: %s\n" "${0##*/}" "$*"; "$@"; }
@@
-215,30
+222,31
@@
EOF
-for tg in ${targets[@]}; do
+for tg in ${targets[@]
:-$HOSTNAME
}; do
# for an initial run, btrbk requires the dir to exist.
ssh root@$tg mkdir -p /mnt/root/btrbk
done
# 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 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 [[ $source ]]; then
+ cat >>/etc/btrbk.conf <<EOF
+volume ssh://$source$vol
+subvolume $sub
+target send-receive $vol/btrbk
+EOF
else
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
for tg in ${targets[@]}; do
- tg-conf
+ cat >>/etc/btrbk.conf <<EOF
+target send-receive ssh://$tg$vol/btrbk
+EOF
done
fi
done
done
fi
done
@@
-257,20
+265,24
@@
fi
if $dry_run; then
m btrbk -v -n $cmd_arg
elif [[ $cmd_arg == archive ]]; then
if $dry_run; then
m btrbk -v -n $cmd_arg
elif [[ $cmd_arg == archive ]]; 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
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 $cmd_arg
+ fi
+ exit 0
fi
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
for tg in ${targets[@]}; do
case $tg in
# 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)
+ li|lk)
for x in /p/c/machine_specific/*.hosts; do
if grep -qxF $tg $x; then
dir=${x%.hosts}
for x in /p/c/machine_specific/*.hosts; do
if grep -qxF $tg $x; then
dir=${x%.hosts}
@@
-282,11
+294,13
@@
if mountpoint $rsync_mountpoint >/dev/null; then
done
fi
done
fi
-if ! $dry_run; then
- m $script_dir/mount-latest-remote ${targets[@]}
+PATH=$script_dir:$PATH
+if [[ $source ]]; then
+ m mount-latest-subvol
+else
+ m mount-latest-remote ${targets[@]}
fi
fi
-
# todo: move variable data we don't care about backing up
# to /nocow and symlink it.
# todo: move variable data we don't care about backing up
# to /nocow and symlink it.