lots of fixes, automation for bitfolk
[distro-setup] / brc
diff --git a/brc b/brc
index 1f3aeeaab6660836781125fad776d9a74e947f9a..00a486219e79bfded2f5a0de6983d5aae09966e5 100644 (file)
--- a/brc
+++ b/brc
@@ -141,6 +141,7 @@ if ! type -p stty >/dev/null; then
 fi
 
 
+use_color=false
 if [[ $- == *i* ]]; then
   # for readline-complete.el
   if [[ $LC_INSIDE_EMACS ]]; then
@@ -151,6 +152,11 @@ if [[ $- == *i* ]]; then
     bind '"\C-i": self-insert'
   else
 
+
+    if [[ $TERM != dumb ]] && test -t 1; then
+      use_color=true
+    fi
+
     if [[ $KONSOLE_PROFILE_NAME ]]; then
       TERM=xterm-256color
     fi
@@ -161,20 +167,31 @@ if [[ $- == *i* ]]; then
       TERM=xterm-256color
     fi
 
+    # copying from the alacritty example above,
+    if [[ $TERM == xterm-kitty ]]; then
+      if [[ ! -e /usr/share/terminfo/x/xterm-kitty ]]; then
+        TERM=xterm-256color
+      else
+        if [[ -e /a/opt/kitty/shell-integration/bash/kitty.bash ]]; then
+          KITTY_SHELL_INTEGRATION=t
+          source /a/opt/kitty/shell-integration/bash/kitty.bash
+        fi
+      fi
+    fi
 
     # todo: not sure this works in sakura
     #stty werase undef
     #bind "\C-w": kill-region
     # sakura == xterm-256color
     # konsole == xterm
-    if [[ $TERM == xterm* ]]; then
+    if [[ $TERM != xterm-kitty && $TERM == xterm* ]]; then
       # control + arrow keys. for other terminals, see http://unix.stackexchange.com/questions/10806/how-to-change-previous-next-word-shortcut-in-bash
       bind '"\e[1;5C": shell-forward-word' 2>/dev/null
       bind '"\e[1;5D": shell-backward-word' 2>/dev/null
     else
       # make ctrl-backspace work. for konsole, i fixed it through
       # /home/iank/.local/share/konsole/default.keytab
-      stty werase '^h'
+      stty werase ^h
       bind '"\eOc": shell-forward-word'
       bind '"\eOd": shell-backward-word'
     fi
@@ -187,6 +204,15 @@ if [[ $- == *i* ]]; then
 
 fi
 
+case $TERM in
+  # fixup broken backspace in chroots
+  xterm-kitty|alacritty)
+    chroot() {
+      TERM=xterm-256color command chroot "$@"
+    }
+    ;;
+esac
+
 export BC_LINE_LENGTH=0
 
 # ansible option
@@ -216,6 +242,7 @@ if [[ -s $bashrc_dir/path-add-function ]]; then
     if grep -qF /home/iank/.iank/e/e /etc/auto.iank /etc/exports &>/dev/null; then
       export EMACSDIR=/home/iank/.iank/e/e
     fi
+    path-add $bashrc_dir
   fi
 fi
 
@@ -238,15 +265,23 @@ if [[ -s /usr/share/wcd/wcd-include.sh ]]; then
   source /usr/share/wcd/wcd-include.sh
 fi
 
-if [[ -s /a/bin/small-misc-bash/ll-function ]]; then
-  source /a/bin/small-misc-bash/ll-function
-elif [[ -s $bashrc_dir/ll-function ]]; then
-  # shellcheck source=/a/bin/small-misc-bash/ll-function
-  source $bashrc_dir/ll-function
-fi
 
+mysrc() {
+  local path dir file
+  path=$1
+  dir=${path%/*}
+  file=${path##*/}
+  if [[ -s $path ]]; then
+    source $path
+  elif [[ -s $bashrc_dir/$file ]]; then
+    source $bashrc_dir/$file
+  fi
+}
 
 
+mysrc /a/bin/small-misc-bash/ll-function
+mysrc /a/bin/distro-functions/src/package-manager-abstractions
+
 
 # * functions
 ccomp() { # copy completion
@@ -302,8 +337,9 @@ fpst() { # file paste
 }
 
 _khfix_common() {
-  local host ip port
+  local host ip port file key
   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" ||: )
+  file=$(readlink -f ~/.ssh/known_hosts)
   if [[ ! $ip ]]; then
     echo "khfix: ssh failed"
     return 1
@@ -315,11 +351,17 @@ _khfix_common() {
     ip_entry=$ip
     host_entry=$host
   fi
+  tmpfile=$(mktemp)
   if [[ $host != $ip ]]; then
-    m ssh-keygen -R "$host_entry" -f $(readlink -f ~/.ssh/known_hosts)
-    ll ~/.ssh/known_hosts
+    key=$(ssh-keygen -F "$host_entry" -f $file | sed -r 's/^.*([^ ]+ +[^ ]+) *$/\1/')
+    if [[ $key ]]; then
+      grep -Fv "$key" "$file" | sponge "$file"
+    fi
+  fi
+  key=$(ssh-keygen -F "$ip_entry" -f $file | sed -r 's/^.*([^ ]+ +[^ ]+) *$/\1/')
+  if [[ $key ]]; then
+    grep -Fv "$key" "$file" | sponge "$file"
   fi
-  m ssh-keygen -R "$ip_entry" -f $(readlink -f ~/.ssh/known_hosts)
   ll ~/.ssh/known_hosts
   rootsshsync
 }
@@ -355,6 +397,24 @@ b() {
   c -
 }
 
+vp9() {
+  in=$PWD/$1
+
+  if [[ $2 ]]; then
+    out=$PWD/$2
+  else
+    out=$PWD/vp9/$1
+  fi
+  cd $(mktemp -d)
+  pwd
+  ffmpeg -threads 0 -i $in -g 192 -vcodec libvpx-vp9 -vf scale=-1:720 -max_muxing_queue_size 9999  -b:v 750K -pass 1 -an -f null /dev/null && \
+    ffmpeg -y -threads 0 -i $in -g 192 -vcodec libvpx-vp9 -vf scale=-1:720 -max_muxing_queue_size 9999 -b:v 750K -pass 2 -c:a libvorbis -qscale:a 5 $out
+  cd -
+}
+
+utcl() { # utc 24 hour time to local hour 24 hour time
+  echo "print( ($1  $(date +%z | sed -r 's/..$//;s/^(-?)0*/\1/')) % 24)"|python3
+}
 
 # c. better cd
 if type -p wcd &>/dev/null; then
@@ -574,8 +634,12 @@ ev() {
     echo no args
   fi
   for arg; do
-    printf "%qEOL\n" "${!arg}"
-    printf "%s" "${!arg}" |& hexdump -C
+    if [[ -v $arg ]]; then
+      printf "%qEOL\n" "${!arg}"
+      printf "%s" "${!arg}" |& hexdump -C
+    else
+      echo arg $arg is unset
+    fi
   done
 }
 
@@ -693,6 +757,19 @@ faf() { # find all files. use -L to follow symlinks
        -o -name .undo-tree-history -prune \) -type f 2>/dev/null
 }
 
+# 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.
+histrm() {
+  history -n
+  history | awk -v IGNORECASE=1 '{ a=$1; sub(/^( *[^ ]+){4} */, "") }; /'"$*"'/'
+  read -p "press anything but contrl-c to delete"
+  for entry in $(history | awk -v IGNORECASE=1 '{ a=$1; sub(/^( *[^ ]+){4} */, "") }; /'"$*"'/ { print a }' | tac); do
+    history -d $entry
+  done
+  history -w
+}
+
 # mail related
 frozen() {
   rm -rf /tmp/frozen
@@ -1312,7 +1389,6 @@ safe_rename() { # warn and dont rename if file exists.
 }
 
 
-
 sd() {
   sudo dd status=none of="$1"
 }
@@ -1328,6 +1404,10 @@ ser() {
     s service $2 $1
   fi
 }
+serstat() {
+  systemctl -n 40 status "$@"
+}
+
 seru() { systemctl --user "$@"; }
 # like restart, but do nothing if its not already started
 srestart() {
@@ -1382,16 +1462,25 @@ sgu() {
 
 
 sk() {
-  # 2029: "unescaped, this expands on the client side." yes, I know how ssh works
-  # 2164: "Use 'cd ... || exit' or 'cd ... || return' in case cd fails." i have automatic error handling
-  # 2086: unquoted $var
+
+
+  # note, if you do something like this
+  # x=( prefix* )
+  # then disable the warning with:
+  # shellcheck disable=SC2206 # globbing is intended
+
+  # 2029: "unescaped, this expands on the client side.": yes, I know how ssh works
+  # 2164: "Use 'cd ... || exit' or 'cd ... || return' in case cd fails.": i have automatic error handling
+  # 2086: unquoted $var: Quoting every var I set is way too much quotes.
+  # 2068: Double quote array expansions to avoid re-splitting elements: same as above.
+  # 2033: command arg is a function name: too many false positives.
+
+
+  # these ones I had disabled, but without a good written explanation, so enabling them temporarily
   # 2046: unquoted $(cmd)
-  # 2068: Double quote array expansions to avoid re-splitting elements.
   # 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 2029,2164,2086,2046,2068,2119,2033 "$@" || return $?
-  # had this before. not sure what it is 2119
+
+  shellcheck -W 999 -x -e 2029,2164,2086,2068,2033 "$@" || return $?
 }
 
 
@@ -1638,7 +1727,7 @@ ssk() {
 ccomp ssh sl slr sss ssk
 # plain ssh
 ssh() {
-  if [[ $TERM == alacritty ]]; then
+  if [[ $TERM == alacritty || $TERM == xterm-kitty ]]; then
     TERM=xterm-256color LC_USEBASHRC=t command ssh "$@"
   else
     LC_USEBASHRC=t command ssh "$@"
@@ -1831,24 +1920,7 @@ s/^\Wcapability: (.*)/\1/;Ta;h;b
 # * misc stuff
 
 
-# temporary variables to test colorization
-# some copied from gentoo /etc/bash/bashrc,
-use_color=false
-# dircolors --print-database uses its own built-in database
-# instead of using /etc/DIR_COLORS.  Try to use the external file
-# first to take advantage of user additions.
-safe_term=${TERM//[^[:alnum:]]/?}   # sanitize TERM
-match_lhs=""
-[[ -f ~/.dir_colors   ]] && match_lhs="${match_lhs}$(<~/.dir_colors)"
-[[ -f /etc/DIR_COLORS ]] && match_lhs="${match_lhs}$(</etc/DIR_COLORS)"
-[[ -z ${match_lhs}    ]] \
-  && type -P dircolors >/dev/null \
-  && match_lhs=$(dircolors --print-database)
-# test if our $TERM is in the TERM values in dircolor
-[[ $'\n'${match_lhs} == *$'\n'"TERM "${safe_term}* ]] && use_color=true
-
-
-if ${use_color} && [[ $- == *i* ]]; then
+if $use_color; then
 
   term_bold="$(tput bold)"
   term_red="$(tput setaf 1)"
@@ -1871,6 +1943,16 @@ unset safe_term match_lhs use_color
 
 if [[ $- == *i* ]]; then
 
+
+  case $HOSTNAME in
+    bk|je|li)
+      if [[ $EUID == 1000 ]]; then
+        system-status _ ||:
+      fi
+      ;;
+  esac
+
+
   # this needs to come before next ps1 stuff
   # this stuff needs bash 4, feb 2009,
   # old enough to no longer condition on $BASH_VERSION anymore
@@ -1912,10 +1994,7 @@ if [[ $- == *i* ]]; then
       0) ps_color="$term_purple"
          ps_char='\$'
          ;;
-      1) ps_color="$term_green"
-         ps_char="$return \\$"
-         ;;
-      *) ps_color="$term_yellow"
+      *) ps_color="$term_green"
          ps_char="$return \\$"
          ;;
     esac
@@ -1938,9 +2017,12 @@ if [[ $- == *i* ]]; then
     # but then we get an email and log of lots of failed sudo commands.
     # We could turn those off, but seems better not to.
     if [[ $EUID != 0 ]] && [[ $DID_SUDO ]]; then
-      ps_char="SUDO $ps_char"
+      psudo="\[$term_bold$term_red\]s\[$term_nocolor\] "
+    fi
+    if [[ ! $HISTFILE ]]; then
+      ps_char="NOHIST $ps_char"
     fi
-    PS1="${PS1%"${PS1#*[wW]}"} \[$ps_color\]$ps_char\[$term_nocolor\] "
+    PS1="${PS1%"${PS1#*[wW]}"} $psudo\[$ps_color\]$ps_char\[$term_nocolor\] "
 
     # set titlebar. instead, using more advanced
     # titelbar below