robustness and satisfy shellcheck
authorIan Kelling <ian@iankelling.org>
Fri, 2 Aug 2019 05:22:56 +0000 (01:22 -0400)
committerIan Kelling <ian@iankelling.org>
Fri, 2 Aug 2019 05:22:56 +0000 (01:22 -0400)
btrbk-run
check-subvol-stale
install-my-scripts
mount-latest-subvol
primary-setup
switch-mail-host

index 030107d71834d40589a2951576695f32fec8f6f8..7dad03a5c270284b455397c1c76726d2786ce3ed 100644 (file)
--- a/btrbk-run
+++ b/btrbk-run
 
 # 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.
 
-err-bash-trace() {
-  local -i argc_index=0 frame i start=${1:-0} max_indent=8 indent
-  local source
-  local extdebug=false
-  if [[ $(shopt -p extdebug) == *-s* ]]; then
-    extdebug=true
-  fi
-  for ((frame=0; frame < ${#FUNCNAME[@]}-1; frame++)); do
-    argc=${BASH_ARGC[frame]}
-    argc_index+=$argc
-    ((frame < start)) && continue
-    if (( ${#BASH_SOURCE[@]} > 1 )); then
-      source="${BASH_SOURCE[frame+1]}:${BASH_LINENO[frame]}:"
-    fi
-    indent=$((frame-start + 1))
-    indent=$((indent < max_indent ? indent : max_indent))
-    printf "%${indent}s↳%sin \`%s" '' "$source" "${FUNCNAME[frame]}"
-    if $extdebug; then
-      for ((i=argc_index-1; i >= argc_index-argc; i--)); do
-        printf " %s" "${BASH_ARGV[i]}"
-      done
-    fi
-    echo \'
-  done
-  return 0
-}
-err-catch() {
-  set -E; shopt -s extdebug
-  _err-trap() {
-    err=$?
-    exec >&2
-    set +x
-    echo "${BASH_SOURCE[1]}:${BASH_LINENO[0]}: \`$BASH_COMMAND' returned $err"
-    err-bash-trace 2
-    set -e # err trap does not work within an error trap
-    "${_errcatch_cleanup[@]:-:}" # note :-: is to be compatible with set -u
-    echo "$0: exiting with code $err"
-    exit $err
-  }
-  trap _err-trap ERR
-  set -o pipefail
-}
-err-catch
-
 
 [[ $EUID == 0 ]] || exec sudo -E "$BASH_SOURCE" "$@"
 
+source /usr/local/lib/err
 
 usage() {
   cat <<'EOF'
@@ -347,10 +304,10 @@ else
       sshfail+=($h)
     fi
   done
-  if [[ ! $sshable ]] || { ! $cron && [[ $sshfail ]]; }; then
+  if [[ ! ${sshable[@]} ]] || { ! $cron && [[ ${sshfail[@]} ]]; }; then
     die "failed to ssh to hosts: ${sshfail[*]}"
   else
-    if [[ $sshfail ]]; then
+    if [[ ${sshfail[@]} ]]; then
       ret=1
       e "error: failed to ssh to ${sshfail[*]} but continuing with other hosts"
     fi
index 0870f0a1982afa7b466d2a95da257423d5ae1625..8d9ac786c6b71644df4708f58b2f88f112caf692 100644 (file)
@@ -88,7 +88,7 @@ for d; do
   d subvol_dir=$subvol_dir
   # note, we need $dev because $d might not be mounted, and we do this loop
   # because the device in fstab for the rootfs can be different.
-  for devx in $(btrfs fi show $dev| sed -rn 's#.*path (/\S+)$#\1#p'); do
+  for devx in $(btrfs fil show $dev| sed -rn 's#.*path (/\S+)$#\1#p'); do
     d devx=$devx
     root_dir=$(sed -rn "s,^\s*$devx\s+(\S+).*\bsubvolid=[05]\b.*,\1,p" /etc/mtab /etc/fstab|head -n1)
     if [[ $root_dir ]]; then
@@ -104,7 +104,7 @@ for d; do
   d "svp=$svp # subvolume path"
 
   snaps=($root_dir/btrbk/$subvol_dir.20*) # Assumes we are in the 21st century.
-  if [[ ! $snaps ]]; then
+  if [[ ! ${snaps[@]} ]]; then
     # no snapshots yet
     echo "$0: warning: no snapshots found at $root_dir/btrbk/$subvol_dir.20*. this is expected for a brand new volume"
     continue
index f5347208d709726f7913f3a5e2e80e3b54e05ddb..fc6123970693d388161980e2354dc44f5287d28f 100755 (executable)
@@ -29,5 +29,6 @@ x="$(readlink -f "$BASH_SOURCE")"; cd ${x%/*}
 
 
 # scripts that would interfere with unmounting /a, put them elsewhere
-echo install /a/bin/log-quiet/log-once switch-mail-host btrbk-run mount-latest-subvol check-subvol-stale /usr/local/bin
-install /a/bin/log-quiet/log-once switch-mail-host btrbk-run mount-latest-subvol check-subvol-stale /usr/local/bin
+install /a/bin/log-quiet/log-once switch-mail-host btrbk-run mount-latest-subvol \
+        check-subvol-stale /usr/local/bin
+install /a/bin/errhandle/err /usr/local/lib
index 5cb226c5676b9539ea96ebab8241b5ccc6ebbec4..f9bc2def096c8710e53e812fac815216d2592ce5 100644 (file)
@@ -17,6 +17,7 @@ script=$(readlink -f -- "$BASH_SOURCE")
 cd /
 [[ $EUID == 0 ]] || exec sudo -E "$script" "$@"
 
+source /usr/local/lib/err
 
 usage() {
   cat <<EOF
@@ -35,50 +36,6 @@ EOF
 }
 
 
-err-bash-trace() {
-  local -i argc_index=0 frame i start=${1:-0} max_indent=8 indent
-  local source
-  local extdebug=false
-  if [[ $(shopt -p extdebug) == *-s* ]]; then
-    extdebug=true
-  fi
-  for ((frame=0; frame < ${#FUNCNAME[@]}-1; frame++)); do
-    argc=${BASH_ARGC[frame]}
-    argc_index+=$argc
-    ((frame < start)) && continue
-    if (( ${#BASH_SOURCE[@]} > 1 )); then
-      source="${BASH_SOURCE[frame+1]}:${BASH_LINENO[frame]}:"
-    fi
-    indent=$((frame-start + 1))
-    indent=$((indent < max_indent ? indent : max_indent))
-    printf "%${indent}s↳%sin \`%s" '' "$source" "${FUNCNAME[frame]}"
-    if $extdebug; then
-      for ((i=argc_index-1; i >= argc_index-argc; i--)); do
-        printf " %s" "${BASH_ARGV[i]}"
-      done
-    fi
-    echo \'
-  done
-  return 0
-}
-err-catch() {
-  set -E; shopt -s extdebug
-  _err-trap() {
-    err=$?
-    exec >&2
-    set +x
-    echo "${BASH_SOURCE[1]}:${BASH_LINENO[0]}: \`$BASH_COMMAND' returned $err"
-    err-bash-trace 2
-    set -e # err trap does not work within an error trap
-    "${_errcatch_cleanup[@]:-:}" # note :-: is to be compatible with set -u
-    echo "$0: exiting with code $err"
-    exit $err
-  }
-  trap _err-trap ERR
-  set -o pipefail
-}
-err-catch
-
 tu() {
   while read -r line; do
     file="$1"
index 1a6ce0e05158124c1078040fdf24b1ab7f6cf068..30c4222a7bc9c3cdfb6885546a147c4b8225438f 100755 (executable)
@@ -1,11 +1,16 @@
 #!/bin/bash
 
 # usage $0 [MAIL_HOST]
+# setup things which involve being the primary host or not
 
 set -eE -o pipefail
 trap 'echo "$0:$LINENO:error: \"$BASH_COMMAND\" returned $?" >&2' ERR
 
-# setup things which involve being the primary host or not
+
+if [[ ! $SUDO_USER || $EUID == 0 ]]; then
+  echo "$0: error: requires running as nonroot or sudo"
+  exit 1
+fi
 
 if [[ $1 ]]; then
   new_host=$1
index e52abdb45326c9617697e591e7f5d9b3e62d1a9e..10fcd9f12d82c580e1ee3536c2ac51ed08e9c969 100644 (file)
@@ -1,50 +1,6 @@
 #!/bin/bash
 
-err-bash-trace() {
-  local -i argc_index=0 frame i start=${1:-0} max_indent=8 indent
-  local source
-  local extdebug=false
-  if [[ $(shopt -p extdebug) == *-s* ]]; then
-    extdebug=true
-  fi
-  for ((frame=0; frame < ${#FUNCNAME[@]}-1; frame++)); do
-    argc=${BASH_ARGC[frame]}
-    argc_index+=$argc
-    ((frame < start)) && continue
-    if (( ${#BASH_SOURCE[@]} > 1 )); then
-      source="${BASH_SOURCE[frame+1]}:${BASH_LINENO[frame]}:"
-    fi
-    indent=$((frame-start + 1))
-    indent=$((indent < max_indent ? indent : max_indent))
-    printf "%${indent}s↳%sin \`%s" '' "$source" "${FUNCNAME[frame]}"
-    if $extdebug; then
-      for ((i=argc_index-1; i >= argc_index-argc; i--)); do
-        printf " %s" "${BASH_ARGV[i]}"
-      done
-    fi
-    echo \'
-  done
-  return 0
-}
-
-
-err-catch() {
-  set -E; shopt -s extdebug
-  _err-trap() {
-    err=$?
-    exec >&2
-    set +x
-    echo "${BASH_SOURCE[1]}:${BASH_LINENO[0]}: \`$BASH_COMMAND' returned $err"
-    err-bash-trace 2
-    set -e # err trap does not work within an error trap
-    "${_errcatch_cleanup[@]:-:}" # note :-: is to be compatible with set -u
-    echo "$0: exiting with code $err"
-    exit $err
-  }
-  trap _err-trap ERR
-  set -o pipefail
-}
-err-catch
+source /usr/local/lib/err
 
 usage() {
   cat <<EOF
@@ -76,7 +32,7 @@ cleanup() {
     $old_shell sudo systemctl start btrbk.timer
   fi
 }
-_errcatch_cleanup=cleanup
+_errcatch_cleanup=cleanup # used by sourced err
 
 pre="${0##*/}:"
 m() { printf "$pre %s\n"  "$*"; "$@"; }