mostly fixes, some improvements
[distro-setup] / brc
diff --git a/brc b/brc
index dc32a10de59354e13627c631abd2b4c6e11c51c4..4aacc47397e3e5502809c60229ad369035d4f41d 100644 (file)
--- a/brc
+++ b/brc
@@ -689,10 +689,10 @@ jdo() {
   fi
   # -q = quiet
   journalctl -qn2 -f -u "$cmd_name" &
+  jr_pid=$!
   # Trial and error of time needed to avoid missing initial lines.
   # .5 was not reliable. 1 was not reliable. 2 was not reliable
   sleep 4
-  jr_pid=$!
   systemd-run --unit "$cmd_name" --wait --collect "$cmd" "$@" || ret=$?
   # The sleep lets the journal output its last line
   # before the prompt comes up.
@@ -859,25 +859,40 @@ fpst() { # file paste
 }
 
 _khfix-common() {
-  local host ip port file key tmp
-  read -r host ip port < <(timeout -s 9 2 ssh -oBatchMode=yes -oControlMaster=no -oControlPath=/ -v $1 |& sed -rn "s/debug1: Connecting to ([^ ]+) \[([^\]*)] port ([0-9]+).*/\1 \2 \3/p" ||: )
+  local host ip port file key tmp ssh_host alias
+  ssh_host=$1
+  {
+    read -r host ip port
+    read -r alias;
+    # note ":graph:" is needed or else we get a trailing \r out of ssh,
+    # dunno why.  web search says terminals add \r, so I tried adding -T
+    # to turn off psuedo terminal, but it didnt help.
+  } < <(timeout -s 9 2 ssh -TN -oBatchMode=yes -oControlMaster=no -oControlPath=/ -v $ssh_host |&
+        sed -rn "s/debug1: Connecting to ([^ ]+) \[([^\]*)] port ([0-9]+).*/\1 \2 \3/p;
+s/^debug1: using hostkeyalias: ([[:graph:]]*).*/\1/p" ||: )
   file=$(readlink -f ~/.ssh/known_hosts)
   if [[ ! $ip ]]; then
     echo "khfix: ssh failed"
     return 1
   fi
+  ip_entry=$ip
+  host_entry=$host
+  if [[ $alias ]]; then
+    host_entry="$alias"
+  fi
   if [[ $port != 22 ]]; then
     ip_entry="[$ip]:$port"
-    host_entry="[$host]:$port"
-  else
-    ip_entry=$ip
-    host_entry=$host
+    if [[ ! $alias ]]; then
+      host_entry="[$host]:$port"
+    fi
   fi
-  if [[ $host != "$ip" ]]; then
+  if [[ $host_entry != "$ip_entry" ]]; then
     tmp=$(mktemp)
     ssh-keygen -F "$host_entry" -f $file >$tmp || [[ $? == 1 ]] # 1 when it doesnt exist in the file
     if [[ -s $tmp ]]; then
       key=$(sed -r 's/^.*([^ ]+ +[^ ]+) *$/\1/' $tmp)
+    else
+      echo "khfix WARNING: did not find host entry:$host_entry in known_hosts"
     fi
     rm $tmp
     if [[ $key ]]; then
@@ -889,12 +904,13 @@ _khfix-common() {
   ssh-keygen -F "$ip_entry" -f $file >$tmp || [[ $? == 1 ]]
   if [[ -s $tmp ]]; then
     key=$(sed -r 's/^.*([^ ]+ +[^ ]+) *$/\1/' $tmp)
+  else
+    echo "khfix WARNING: did not find ip entry:$ip_entry in known_hosts"
   fi
   rm $tmp
   if [[ $key ]]; then
     grep -Fv "$key" "$file" | sponge "$file"
   fi
-  ll ~/.ssh/known_hosts
 }
 khfix-r() { # known hosts fix without syncing to root user
   _khfix-common "$@" || return 1
@@ -1025,16 +1041,13 @@ cf() {
   done
 }
 caf() {
-
   local file
   find -L "$@" -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 \) -printf '%h\0%d\0%p\n' | sort -t '\0' -n \
     | awk -F '\0' '{print $3}' 2>/dev/null | while read -r file; do
-    hr
-    printf "%s\n" "$file"
-    hr
-    cat "$file"
+    hr "$file"
+    v "$file"
   done
 }
 ccomp cat cf caf
@@ -1419,7 +1432,12 @@ egrinid() {
   sed -rn '/testignore|jtuttle|eximbackup/!s/^[^ ]+ ([^ ]+) [^ ]+ [^ ]+ <= ([^ ]+).* id=([^ ]+) T="(.*)" from (<[^ ]+> .*$)/\1 \5\n \3\n \4/p' <${1:-/var/log/exim4/mainlog}
 }
 etailin() {
-  tail -F /var/log/exim4/mainlog | sed -rn '/testignore|jtuttle|eximbackup/!s/^[^ ]+ ([^ ]+) [^ ]+ [^ ]+ <= ([^ ]+).*T="(.*)" from (<[^ ]+> .*$)/\1 \4\n \3/p'
+  local -a tail_arg
+  tail_arg=(-n500)
+  if [[ $1 ]]; then
+    tail_arg=($@)
+  fi
+  tail "${tail_arg[@]}" -F /var/log/exim4/mainlog | sed -rn '/testignore|jtuttle|eximbackup/!s/^[^ ]+ ([^ ]+) [^ ]+ [^ ]+ <= ([^ ]+).*T="(.*)" from (<[^ ]+> .*$)/\1 \4\n \3/p'
 }
 
 
@@ -1712,10 +1730,21 @@ re() {
 
 # horizontal row. used to break up output
 hr() {
-  local blocks
-  # 180 is long enough.
-  blocks=██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████
-  printf "%s\n" "$(tput setaf 5 2>/dev/null ||:)${blocks:0:${COLUMNS:-180}}$(tput sgr0 2>/dev/null||:)"
+  local start end end_count arg
+  # 180 is long enough. 5 for start.
+  start=█████ end=█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████
+  end_count=$(( ${COLUMNS:-180} - 5 ))
+  arg="$*"
+  if [[ $arg ]]; then
+    end_count=$(( end_count - 2 - ${#arg} ))
+    start="$start $arg "
+  fi
+  if (( end_count >= 1 )); then
+    end=${end:0:$end_count}
+  else
+    end=
+  fi
+  printf "%s\n" "$(tput setaf 5 2>/dev/null ||:)$start$end$(tput sgr0 2>/dev/null||:)"
 }
 # highlight
 hl() {
@@ -2028,6 +2057,8 @@ ksu() { # history search unique
   grep -P --binary-files=text "$@" ${HISTFILE:-~/.bash_history}  | uniq || [[ $? == 1 ]];
 }
 
+# remove lines from history matching $1
+#
 # todo: id like to do maybe a daily or hourly cronjob to
 # check that my history file size is increasing. Ive had it
 # inexplicably truncated in the past.
@@ -2199,7 +2230,7 @@ grep ps and output in a nice format"
   fi
   x=$(ps -eF)
   # final grep is because some commands tend to have a lot of trailing spaces
-  y=$(echo "$x" | grep -iP "$@" | grep -o '.*[^ ]') ||:
+  y=$(echo "$x" | sed -r 's,//[^[:space:]:@/]+:[^[:space:]:@/]+@,//REDACTED_URL_USER@PASS/,g' | grep -iP "$@" | grep -o '.*[^ ]') ||:
   if [[ $y ]]; then
     echo "$x" | head -n 1 || [[ $? == 141 ]]
     echo "$y"
@@ -2429,6 +2460,19 @@ serstat() {
   systemctl -n 40 status "$@"
 }
 
+# assume last arg is a service and we want to tail its log.
+serj() {
+  local service jr_pid ret
+  ret=0
+  service="${*: -1}"
+  journalctl -qn2 -f -u "$service" &
+  sleep 3
+  s systemctl "$@" || ret=$?
+  sleep .5
+  kill %%
+  (( ret == 0 )) || return $ret
+}
+
 seru() { systemctl --user "$@"; }
 # like restart, but do nothing if its not already started
 srestart() {
@@ -2507,10 +2551,10 @@ skq() {
   shellcheck -W 999 -x -e $others "$@" || return $?
 }
 
-# sk on all modified files in current git repo
+# sk on all modified & new files in current git repo. must git add for new files.
 skmodified() {
   local f
-  for f in $(i s | awk '$1 == "modified:" {print $2}'); do
+  for f in $(i s | awk '$1 == "modified:" {print $2}; $1 == "new" {print $3}'); do
     if sk-p "$f"; then
       sk $f ||:
     fi
@@ -2775,8 +2819,15 @@ sl() {
 slr() {
   sl --rsync "$@"
 }
-sss() { # ssh solo
-  sl -oControlMaster=no -oControlPath=/ "$@"
+
+
+# ssh solo
+#
+# WARNING: If you are trying to use -i, remember that keys added to
+# agent previously will still be tried. Use ssh-add -D to remove all
+# keys from the agent.
+sss() {
+  ssh -oControlMaster=no -oControlPath=/ "$@"
 }
 # kill off old shared socket then ssh
 ssk() {
@@ -3098,7 +3149,7 @@ spark()
 
   for n in $numbers
   do
-    _spark_echo -n ${ticks[$(( (((n-min)<<8)/f) ))]}
+    _spark_echo -n ${ticks[$(( ((n-min)<<8)/f ))]}
   done
   _spark_echo
 }
@@ -3304,10 +3355,17 @@ if [[ $- == *i* ]]; then
 
     if [[ $HISTFILE ]]; then
       history -a # save history
+      if [[ -e $HOME/.iank-stream-on ]]; then
+        if [[ $HISTFILE == $HOME/.bh ]]; then
+          ps_char="HISTP "
+        fi
+      elif [[ $HISTFILE == /a/bin/data/stream_hist ]]; then
+        ps_char="HISTS "
+      fi
     fi
 
     ps_color="$term_purple"
-    ps_char='\$'
+    ps_char="$ps_char"'\$'
     if [[ ! -O . ]]; then # not owner
       if [[ -w . ]]; then # writable
        ps_color="$term_bold$term_red"
@@ -3330,7 +3388,7 @@ if [[ $- == *i* ]]; then
     fi
     jobs_char=
     if [[ $(jobs -p) ]]; then
-      jobs_char='j\j '
+      jobs_char="$(jobs -p)"'j\j '
     fi
 
 
@@ -3430,6 +3488,7 @@ lp22viewers() {
       room=${rooms[i]}
       while read -r n; do
         v=$((v+n))
+        # shellcheck disable=SC2004 # false positive
         roomv[$i]=$(( ${roomv[$i]} + n ))
       done < <(printf "%s\n" "$out"  | grep -Po "$room.*?current[^0-9]*[0-9]*" | grep -o '[0-9]*$' )
     done
@@ -3448,6 +3507,20 @@ arpflush() {
   m s ip n flush dev "$default_route_dev"
 }
 
+dsh() {
+  command dsh -c "$@"
+}
+
+# cat or bat with color if we have it
+v() {
+  if type -t batcat >/dev/null; then
+    # note: another useful useful style is "header"
+    batcat --color always --style plain --theme Coldark-Cold -P "$@"
+  else
+    cat "$@"
+  fi
+}
+
 # * stuff that makes sense to be at the end