minor fixes
[distro-setup] / brc
diff --git a/brc b/brc
index ad1a0781c291eb0652cd1b3a04ff50d067b34598..74cda5b1be142b813c25bae225d682bb271bcc99 100644 (file)
--- a/brc
+++ b/brc
@@ -3,11 +3,31 @@
 # SPDX-License-Identifier: AGPL-3.0-or-later
 # this gets sourced. shebang is just for file mode detection
 
-# note, to catch errors in functions but not outside, do:
-# set -E -o pipefail
-# trap return ERR
-# trap 'trap ERR' RETURN
+# Use source ~/.bashrc instead of doing bash -l when running a script
+# so this can set extdebug and avoid the bash debugger.
+if [[ -s /a/bin/errhandle/err ]]; then
+  source /a/bin/errhandle/err
+elif [[ -s ~/.iank/err ]]; then
+  # shellcheck source=/a/bin/errhandle/err
+  source ~/.iank/err
+fi
+
+# In t8, it runs clear_console for login shells by default. I don't want
+# my console cleared. And linux ttys get cleared without this.
+if shopt login_shell >/dev/null && [[ -e ~/.bash_logout ]]; then
+  rm ~/.bash_logout
+fi
 
+# for testing error catching:
+# t2() {
+#   echo t2
+#   grep sdf sdfd
+#   echo wtf
+# }
+# t1() {
+#   echo t1
+#   t2 a b c
+# }
 
 # * settings
 
@@ -62,7 +82,7 @@ if [[ $RLC_INSIDE_EMACS ]]; then
   export PAGER=cat
   export MANPAGER=cat
   # scp completion does not work, but this doesnt fix it. todo, figure this out
-  complete -r scp &> /dev/null
+  #complete -r scp &> /dev/null
   # todo, remote file completion fails, figure out how to turn it off
   export NODE_DISABLE_COLORS=1
   # This gets rid of ugly terminal escape chars in node repl
@@ -198,11 +218,14 @@ if [[ -s /usr/share/wcd/wcd-include.sh ]]; then
   source /usr/share/wcd/wcd-include.sh
 fi
 
-if [[ -s ~/.iank/ll-function ]]; then
-  # shellcheck source=.iank/ll-function
+if [[ -s /a/bin/small-misc-bash/ll-function ]]; then
+  source /a/bin/small-misc-bash/ll-function
+elif [[ -s ~/.iank/ll-function ]]; then
+  # shellcheck source=/a/bin/small-misc-bash/ll-function
   source ~/.iank/ll-function
 fi
 
+
 # * functions
 
 
@@ -297,7 +320,7 @@ caf() {
   find -L $1 -type f -not \( -name .svn -prune -o -name .git -prune \
        -o -name .hg -prune -o -name .editor-backups -prune \
        -o -name .undo-tree-history -prune \) \
-       -exec bash -lc 'hr; echo "$1"; hr; cat "$1"' _ {} \; 2>/dev/null
+       -exec bash -c '. ~/.bashrc; hr; echo "$1"; hr; cat "$1"' _ {} \; 2>/dev/null
 
 }
 
@@ -410,6 +433,39 @@ despace() {
   done
 }
 
+dig() {
+  command dig +nostats +nocmd "$@"
+}
+# Output with sections sorted, and removal of query id, so 2 dig outputs can be diffed.
+digsort() {
+  local sec
+  sec=
+  dig +nordflag "$@" | sed -r 's/^(;; ->>HEADER<<-.*), id: .*/\1/' | while read -r l; do
+    if [[ $l == [^\;]* ]]; then
+      sec+="$l"$'\n'
+    else
+      if [[ $sec ]]; then
+        printf "%s" "$sec" | sort
+        sec=
+      fi
+      printf "%s\n" "$l"
+    fi
+  done
+}
+# compare digs to the 2 servers
+# usage: digdiff @server1 @server2 DIG_ARGS
+# note: only the soa master nameserver will respond with
+# ra "recursive answer" flag. That difference is meaningless afaik.
+digdiff() {
+  local s1 s2
+  s1=$1
+  shift
+  s2=$1
+  shift
+  digsort $s1 "$@" | tee /tmp/digdiff
+  diff -u /tmp/digdiff <(digsort $s2 "$@")
+}
+
 dt() {
   date "+%A, %B %d, %r" "$@"
 }
@@ -422,10 +478,25 @@ dus() { # du, sorted, default arg of
 
 e() { echo "$@"; }
 
-# echo var. print var including escapes, etc
+# echo args
+ea() {
+  if (( ! $# )); then
+    echo no args
+  fi
+  for arg; do
+    printf "%qEOL\n" "${arg}"
+    printf "%s" "${arg}" |& hexdump -C
+  done
+}
+# echo vars. print var including escapes, etc
 ev() {
-  printf "%qEOL\n" "${!1}"
-  printf "%s" "${!1}" |& hexdump -C
+  if (( ! $# )); then
+    echo no args
+  fi
+  for arg; do
+    printf "%qEOL\n" "${!arg}"
+    printf "%s" "${!arg}" |& hexdump -C
+  done
 }
 
 
@@ -441,6 +512,12 @@ etail() {
 eless() {
   less /var/log/exim4/mainlog
 }
+eqcat() {
+  exiqgrep -i | while read -r i; do
+    exim -Mvh $i; hr; exim -Mvb $i; hr;
+    exigrep $i /var/log/exim4/mainlog; hr
+  done
+}
 
 
 # shellcheck disable=SC2032
@@ -467,12 +544,12 @@ faf() { # find all files. use -L to follow symlinks
 # mail related
 frozen() {
   rm -rf /tmp/frozen
-  s mailq |gr frozen|awk '{print $3}' | while read -r id; do
-    s exim -Mvl $id
+  sudo mailq |gr frozen|awk '{print $3}' | while read -r id; do
+    sudo exim -Mvl $id
     echo
-    s exim -Mvh $id
+    sudo exim -Mvh $id
     echo
-    s exim -Mvb $id
+    sudo exim -Mvb $id
     echo -e '\n\n##############################\n'
   done | tee -a /tmp/frozen
 }
@@ -484,7 +561,7 @@ frozenrm() {
   done < <(s mailq)
   echo "sleeping for 2 in case you change your mind"
   sleep 2
-  s exim -Mrm "${ids[@]}"
+  sudo exim -Mrm "${ids[@]}"
 }
 
 funce() {
@@ -572,10 +649,12 @@ gr() {
 }
 
 grr() { # grep recursive
+  # Don't return 1 on nonmatch because this is meant to be
+  # interactive, not in a conditional.
   if [[ ${#@} == 1 ]]; then
-    grep --exclude-dir='*.emacs.d' --exclude-dir='*.git' -RiIP --color=auto "$@" .
+    grep --exclude-dir='*.emacs.d' --exclude-dir='*.git' -RiIP --color=auto "$@" . || [[ $? == 1 ]]
   else
-    grep --exclude-dir='*.emacs.d' --exclude-dir='*.git' -RiIP --color=auto "$@"
+    grep --exclude-dir='*.emacs.d' --exclude-dir='*.git' -RiIP --color=auto "$@" || [[ $? == 1 ]]
   fi
 }
 rg() {
@@ -583,7 +662,8 @@ rg() {
 }
 
 hr() { # horizontal row. used to break up output
-  printf "$(tput setaf 5)█$(tput sgr0)%.0s" $(seq ${COLUMNS:-60})
+
+  printf "$(tput setaf 5)█$(tput sgr0)%.0s" $(eval echo "{1..${COLUMNS:-60}}")
   echo
 }
 
@@ -607,7 +687,7 @@ hub() {
     wget -P /a/opt $up
     tar -C /a/opt -zxf /a/opt/$uptar
     rm -f /a/opt/$uptar
-    s /a/opt/$updir/install
+    sudo /a/opt/$updir/install
   fi
 
   # save token across computers
@@ -652,7 +732,7 @@ ifn() {
 }
 
 ipdrop() {
-  s iptables -A INPUT -s $1 -j DROP
+  sudo iptables -A INPUT -s $1 -j DROP
 }
 
 
@@ -746,6 +826,7 @@ nopanic() {
 }
 
 p8() { ping 8.8.8.8; }
+p6() { ping6 2001:4860:4860::8888; }
 
 pkx() { # package extract
   local pkg cached tmp f
@@ -782,6 +863,23 @@ pk1() {
   esac
 }
 
+psg () {
+  local x y help
+  help="Usage: psg [--help] GREP_ARGS
+grep ps and output in a nice format"
+  if [[ $1 == --help ]]; then
+    echo "$help"
+    return
+  fi
+  x=$(sudo ps -eF)
+  # final grep is because some commands tend to have a lot of trailing spaces
+  y=$(echo "$x" | grep -iP "$@" | grep -o '.*[^ ]') ||:
+  if [[ $y ]]; then
+    echo "$x" | head -n 1
+    echo "$y"
+  fi
+}
+
 pubip() { curl -4s https://icanhazip.com; }
 pubip6() { curl -6s https://icanhazip.com; }
 whatismyip() { pubip; }
@@ -812,6 +910,7 @@ q() { # start / launch a program in the backround and redir output to null
 # shellcheck disable=SC2120
 r() {
   history -a # save history
+  trap ERR # this avoids a segfault
   exit ${1:0}
   # i had this redir, not sure why
   #  exit "$@" 2>/dev/null
@@ -848,7 +947,7 @@ rlu() { # [OPTS] HOST PATH
   # rync here uses checksum instead of time so we dont mess with
   # unison relying on time as much. g is for group, same reason
   # to keep up with unison.
-  s rsync -rlpchviog --relative "${opts[@]}" "$path" "root@$host:/";
+  sudo rsync -rlpchviog --relative "${opts[@]}" "$path" "root@$host:/";
 }
 
 rmstrips() {
@@ -865,7 +964,8 @@ s() {
   # with root owned files.
   #
   if [[ $EUID != 0 || $1 == -* ]]; then
-    SUDOD="$PWD" sudo -i "$@"
+    # shellcheck disable=SC2034
+    SUDOD="$PWD" command sudo -i "$@"
   else
     "$@"
   fi
@@ -897,7 +997,7 @@ complete -F _root_command s sb
 
 
 ser() {
-  local s; [[ $EUID != 0 ]] && s=s
+  local s; [[ $EUID != 0 ]] && s=sudo
   if type -p systemctl &>/dev/null; then
     $s systemctl $1 $2
   else
@@ -954,7 +1054,7 @@ sk() {
   # 2119: Functions with optional args get bad warnings when none are passed.
   # 2033: too many false positives for thing that will never work, passing shell function to find.
   # i had -x as an arg, but debian testing(stretch) doesn\'t support it
-  shellcheck -x -e 2086,2046,2068,2119,2033 "$@"
+  shellcheck -x -e 2086,2046,2068,2119,2033 "$@" || return $?
   # had this before. not sure what it is 2119
 }
 
@@ -1088,7 +1188,7 @@ psnetns() {
   local x netns
   netns=$1
   ps -w | head -n 1
-  s find -L /proc/[1-9]*/task/*/ns/net -samefile /run/netns/$netns | cut -d/ -f5 | \
+  sudo find -L /proc/[1-9]*/task/*/ns/net -samefile /run/netns/$netns | cut -d/ -f5 | \
     while read -r l; do
       x=$(ps -w --no-headers -p $l);
       if [[ $x ]]; then echo "$x"; else echo $l; fi;
@@ -1107,10 +1207,10 @@ vm-set-listen(){
   t=$(mktemp)
   local vm=$1
   local ip=$2
-  s virsh dumpxml $vm | sed -r "s/(<listen.*address=')([^']+)/\1$ip/" | \
+  sudo virsh dumpxml $vm | sed -r "s/(<listen.*address=')([^']+)/\1$ip/" | \
     sed -r "s/listen='[^']+/listen='$ip/"> $t
-  s virsh undefine $vm
-  s virsh define $t
+  sudo virsh undefine $vm
+  sudo virsh define $t
 }
 
 
@@ -1188,6 +1288,7 @@ if [[ $- == *i* ]]; then
     local return=$? # this MUST COME FIRST
     local ps_char ps_color
     unset IFS
+
     history -a # save history
 
     case $return in