icecast improvements
[distro-setup] / brc2
diff --git a/brc2 b/brc2
index 5fde3685ef65a65997aa6542cce52a87ae69f3cb..104907e67c76f2d4df1f737ff986a3300d9db381 100644 (file)
--- a/brc2
+++ b/brc2
@@ -29,9 +29,29 @@ if [[ $LESSHISTFILE == - ]]; then
   HISTFILE=
   c() { cd "$@"; }
 elif [[ $HISTFILE ]]; then
-  HISTFILE=$HOME/.bh
+  # use an alternate history file when we are streaming.
+  if [[ -e $HOME/.iank-stream-on ]]; then
+    HISTFILE=/a/bin/data/stream_hist
+  else
+    HISTFILE=$HOME/.bh
+  fi
 fi
 
+# history personal
+hip() {
+  history -c
+  HISTFILE=$HOME/.bh
+  history -r
+}
+
+# history for streaming
+his() {
+  history -c
+  HISTFILE=/a/bin/data/stream_hist
+  history -r
+}
+
+
 source /a/bin/distro-setup/path-add-function
 path-add /a/exe
 # add this with absolute paths as needed for better security
@@ -329,10 +349,16 @@ tback() {
 # s sshfs bu@$host:/bu/home/md /bu/mnt -o reconnect,ServerAliveInterval=20,ServerAliveCountMax=30 -o allow_other
 
 edelayoff() {
-  echo all >/etc/exim4/no-delay-eximids
+  echo all >/var/spool/exim4/gw/.no-delay-eximids
+  if [[ $EUID == 0 ]]; then
+    chown iank:iank /var/spool/exim4/gw/.no-delay-eximids
+  fi
 }
 edelayon() {
-  echo >/etc/exim4/no-delay-eximids
+  echo >/var/spool/exim4/gw/.no-delay-eximids
+  if [[ $EUID == 0 ]]; then
+    chown iank:iank /var/spool/exim4/gw/.no-delay-eximids
+  fi
 }
 
 eqgo() {
@@ -441,7 +467,7 @@ ralerts() { # remote alerts
 ap() {
   # pushd in case current directory has an ansible.cfg file
   pushd /a/xans >/dev/null
-  ansible-playbook -v -l ${1:- $(hostname -f)} site.yml
+  ansible-playbook -v -i ${1:- $(hostname -f)}, site.yml
   popd >/dev/null
 }
 aw() {
@@ -899,7 +925,7 @@ beetag()  {
   else
     pl_state_file=sorted
   fi
-  pl_state_dir=/i/info/pl-state
+  pl_state_dir=/b/data/pl-state
   if [[ $playlist ]]; then
     pl_state_dir=$pl_state_dir/$playlist
   else
@@ -1682,11 +1708,9 @@ jdo() {
   if [[ $cmd != /* ]]; then
     cmd=$(type -P "$cmd")
   fi
+  #note date format for since is date '+%F %T'
   # -q = quiet
-  journalctl -qn2 -f -u "$cmd_name" &
-  # 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
+  journalctl --since=now -qn2 -f -u "$cmd_name" &
   jr_pid=$!
   # note, we could have a version that does system --user, but if for example
   # it does sudo ssh, that will leave a process around that we can't kill
@@ -1751,7 +1775,13 @@ lipush() {
   local p a
   # excluding emacs for now
   #p=(/a/opt/{emacs-debian11{,-nox},mu,emacs} /a/bin /a/exe /a/h /a/c /p/c/machine_specific/vps{,.hosts})
-  p=(/a/bin /a/exe /a/h /a/c /p/c/machine_specific/vps{,.hosts} /c/roles/prom_export/files/simple/usr/local/bin/fsf-install-node-exporter /a/opt/fpaste)
+  p=(
+    /a/bin /a/exe /a/h /a/c /p/c/machine_specific/vps{,.hosts}
+    /c/roles/prom_export/files/simple/usr/local/bin/fsf-install-node-exporter
+    /a/opt/fpaste
+    /p/c/user-specific/www-data/icecast-fsf{,-tech}-htpasswd
+    /p/c/icecast.xml
+  )
   a="-ahviSAXPH --specials --devices --delete --relative --exclude-from=/p/c/li-rsync-excludes"
   ret=0
   for h in li je bk; do
@@ -1782,7 +1812,7 @@ bindpush() {
   dsign iankelling.org expertpathologyreview.com zroe.org amnimal.ninja
   lipush
   for h in li bk; do
-    m ssh $h.b8.nz dnsup
+    m ssh iank@$h.b8.nz dnsup
   done
 }
 bindpushb8() {
@@ -1906,68 +1936,12 @@ satoshi() { # $1 satoshi in usd
 # 2023). However, in 2024-02, I ran a backup where a receiving machine
 # had the wallet enabled and there was no error, so I don't know if this
 # is still an issue or likely it is an inconsistent behavior.
+# Note: a pruned node won't allow for a wallet to be added, super lame
+# so i'm just not running a bitcoin node for now.
+# Error: Prune: last wallet synchronisation goes beyond pruned data. You
+# need to -reindex (download the whole blockchain again in case of
+# pruned node)
 #
-# As a workaround, this function is for enabling the wallet when I want
-# to use it and leave it disabled otherwise.
-walleton() {
-  local active
-  active=false
-  no_on=true
-  if [[ ! $(readlink -f /var/lib/bitcoind/wallets) == /q/wallets ]]; then
-    if systemctl --quiet is-active bitcoind; then
-      if [[ -e /tmp/no-bitcoinon ]]; then
-        no_on=true
-      else
-        if [[ $EUID == 0 ]]; then
-          m install -T -o iank -g iank /dev/null /tmp/no-bitcoinon
-        else
-          m touch /tmp/no-bitcoinon
-        fi
-      fi
-      active=true
-      m ser stop bitcoind
-    fi
-    m s ln -s /q/wallets /var/lib/bitcoind
-    sudo chown -h bitcoin:bitcoin /var/lib/bitcoind/wallets
-    if $active; then
-      m ser start bitcoind
-      if ! $no_on; then
-        m rm /tmp/no-bitcoinon
-      fi
-    fi
-  fi
-}
-walletoff() {
-  local active
-  active=false
-  no_on=true
-  if [[ $(readlink -f /var/lib/bitcoind/wallets) == /q/wallets ]]; then
-    if systemctl --quiet is-active bitcoind; then
-      if [[ -e /tmp/no-bitcoinon ]]; then
-        no_on=true
-      else
-        if [[ $EUID == 0 ]]; then
-          m install -T -o iank -g iank /dev/null /tmp/no-bitcoinon
-        else
-          m touch /tmp/no-bitcoinon
-        fi
-      fi
-      active=true
-      m ser stop bitcoind
-    else
-      echo note: bitcoind not active
-    fi
-    m rm /var/lib/bitcoind/wallets
-    if $active; then
-      # note, starting bitcoin always fails, but it actually
-      # succeeds. But this is strangely not consistent.
-      m ser start bitcoind
-      if ! $no_on; then
-        m rm /tmp/no-bitcoinon
-      fi
-    fi
-  fi
-}
 #### end bitcoin related things
 
 
@@ -2038,7 +2012,11 @@ apache-apply-repo() {
 
 apache-apply() {
   for file; do
-    if head -n1 "$file"| grep -E '^#!/bin/bash\b' &>/dev/null; then
+    if [[ ! -e $file ]]; then
+      echo '#!/bin/bash' >$file
+      chmod +x $file
+    fi
+    if head -n1 "$file"| grep -E '^#!/' &>/dev/null; then
       {
         head -n1 "$file"
         apache-header
@@ -2158,7 +2136,7 @@ fastboot() {
 
 kdecd() { /usr/lib/x86_64-linux-gnu/libexec/kdeconnectd; }
 
-bat() {
+batp() {
   cat /sys/class/power_supply/BAT0/capacity
 }
 
@@ -2703,6 +2681,7 @@ host-info-update() {
       # hosts is that it is for the User part, the IdentityFile part is
       # redundant to *.b8.nz. Also note ${host}i, we only setup those for vpn hosts, but there is no harm in overspecifying here.
       root_hosts+=($host ${host}i $host.b8.nz ${host}i.b8.nz)
+      # shellcheck disable=SC2004 # false positive
       root_hosts_a[$host]=t  # a for associative array
     else
       nonroot_hosts+=($host ${host}i)
@@ -2843,12 +2822,17 @@ EOF
 
 
   b8_ip=$(dig +short b8.nz @iankelling.org | tail -1)
+  # if our dynamic ip updates broke, set manually, eg:
+  #b8_ip=72.74.193.xxx
   if [[ ! $b8_ip ]]; then
     echo "$0: error: got empty b8.nz ip. returning 1"
     return 1
   fi
   {
-    echo "@    A       $b8_ip"
+    cat <<EOF
+@      A       $b8_ip
+i      A       $b8_ip
+EOF
     for host in ${!nonvpn_ips[@]}; do
       ipsuf=${nonvpn_ips[$host]}
       echo "$host      A       10.2.0.$ipsuf"
@@ -2860,7 +2844,7 @@ $host     A       10.2.0.$ipsuf
 ${host}wg      A       10.8.0.$ipsuf
 ${host}vp      A       10.5.5.$ipsuf
 ${host}tr      A       10.174.$ipsuf.2
-${host}i       A       $b8_ip
+${host}i       CNAME   i.b8.nz.
 EOF
     done
   } | cedit -e vpn-ips-update /p/c/machine_specific/vps/bind-initial/db.b8.nz
@@ -2898,8 +2882,8 @@ EOF
   tmpf=$(mktemp)
   {
     printf "%s" "Host * "
-    sed -n '/^Host /h;/^IdentityFile .*\/home/{g;s/^Host//;s/ / !/gp}' /p/c/subdir_files/.ssh/config-static | tr '\n' ' '
-    echo
+    sed -n '/^Host /h;/^IdentityFile .*\/home/{g;s/^Host//;s/ / !/gp}' /p/c/subdir_files/.ssh/config-static | tr '\n' ' ' \
+      | sed -r 's/ *$/\n/'
     echo "IdentityFile ~/.ssh/work"
   } >$tmpf
   cedit -e work-identity /p/c/subdir_files/.ssh/config-static <$tmpf
@@ -2944,18 +2928,19 @@ EOF
       unset "portfw_ips[$i]"
     fi
 
-    ip=$(getent ahostsv4 "$i$suf_from_here" | awk '{ print $1 }' | head -n1) ||:
+    # note this might be outdated until we do a dns push
+    ip=$(dig +short "$i$suf_from_here" @iankelling.org | tail -n1) ||:
     if [[ ! $ip ]]; then
       if [[ $suf == .office.fsf.org ]]; then
         suf_from_here=wg.b8.nz
         ip=$(getent ahostsv4 "$i$suf_from_here" | awk '{ print $1 }' | head -n1) ||:
       fi
-      if [[ ! $ip ]]; then
-        echo error: failed to get ip of "$i$suf_from_here"
-        return 1
-      fi
     fi
-    ip_to_hosts[$ip]+=" $i"
+    if [[ $ip ]]; then
+      ip_to_hosts[$ip]+=" $i"
+    else
+      echo error: failed to get ip of "$i$suf_from_here"
+    fi
   done
 
   for ip in "${!ip_to_hosts[@]}"; do
@@ -2963,7 +2948,7 @@ EOF
   done | s cedit -e hosts-file-up /etc/hosts
   for host in ${hosts[@]}; do
     echo $host
-  done | cedit -e /a/bin/ds/subdir_files/.dsh/group/btrbk
+  done >/p/c/subdir_files/.dsh/group/btrbk
   ### end focus on hosts file update ###
 
 
@@ -3384,8 +3369,8 @@ myprof() {
   pushd /home/iank/.local/share/profanity/chatlogs/iank_at_fsf.org/rooms/office_at_conference.fsf.org
   logs=(*)
   logcount=${#logs[@]}
-  if (( logcount > 15 )); then
-    i=$(( logcount - 15 ))
+  if (( logcount > 16 )); then
+    i=$(( logcount - 16 ))
   else
     i=0
   fi
@@ -3756,10 +3741,21 @@ EOFOUTER
   chmod +x $out
 }
 
-smeld() { # ssh meld usage host1 host2 file
+# ssh meld. usage: host1 host2 file
+smeld() {
   meld <(ssh $1 cat $3) <(ssh $2 cat $3)
 }
 
+# remote file meld
+# usage: host file1 file2
+rmeld() {
+  local tmpdir
+  tmpdir=$(mktemp -d)
+  scp "$1:$2" "$1:$3" $tmpdir
+  meld "$tmpdir/${2##*/}" "$tmpdir/${3##*/}"
+}
+
+
 spd() {
   PATH=/usr/local/spdhackfix:$PATH command spd "$@"
 }
@@ -4132,10 +4128,17 @@ nmtc() {
   s nmtui-connect "$@"
 }
 
+# check exim and others network namespace
 mailnncheck() {
-  local unit pid ns mailnn
+  local unit pid ns mailnn spamd_ser
+
+  spamd_ser=spamd
+  if systemctl cat spamassassin &>/dev/null; then
+    spamd_ser=spamassassin
+  fi
+
   # mailvpn would belong on the list if using openvpn
-  for unit in mailnn unbound dovecot spamassassin exim4 radicale; do
+  for unit in mailnn unbound dovecot $spamd_ser exim4 radicale; do
     pid=$(servicepid $unit)
     echo debug: unit=$unit pid=$pid
     if [[ ! $pid ]]; then
@@ -4177,10 +4180,7 @@ vpn() {
   fi
 
   [[ $1 ]] || { echo need arg; return 1; }
-  journalctl --unit=$vpn_service@$1 -f -n0 &
-  # sometimes the journal doesnt open until after the vpn output
-  # has happened. hoping this fixes that.
-  sleep 1
+  journalctl --since=now --unit=$vpn_service@$1 -f -n0 &
   sudo systemctl start $vpn_service@$1
   # sometimes the ask-password agent does not work and needs a delay.
   sleep .5
@@ -4199,15 +4199,17 @@ fixu() {
   fi
 }
 
-# unmute
+# unmute desktop output
 um() {
-  local sink card
+  local sink card sedcmd
   sink=$(pactl get-default-sink)
   if [[ $sink == auto_null ]]; then
     # guessing there is just one with an off profile. otherwise we will
     # need some other solution, like storing the card identifier that we
-    # muted with nap.
-    card=$(pacmd list-cards | sed -n '/^[[:space:]]*index:/{s/^[[:space:]]*index://;h};/^[[:space:]]*active profile: <off>$/{g;p;q}')
+    # muted with nap. Or, we could so some hakery with
+    # pactl -f json.
+    sedcmd='/^[[:space:]]*index:/{s/^[[:space:]]*index://;h};/^[[:space:]]*active profile: <off>$/{g;p;q}'
+    card=$(pacmd list-cards | sed -n "$sedcmd")
     m pacmd set-card-profile "$card" output:analog-stereo
   fi
 
@@ -4369,11 +4371,24 @@ vrun() {
 }
 
 electrum() {
+  # Running the appimage said fuse was not available, but try
+  # running the appimage with --appimage-extract, which worked.
+  # It seems there is no need to backup the wallet, it can be restored
+  # via the seed onto any computer that needs it.
+  /a/opt/electrum/squashfs-root/AppRun "$@"
+
+
+  # This was an old way I ran electrum over tor, and seems like I
+  # imported a bitcoin core wallet.
+  #
   # https://electrum.readthedocs.io/en/latest/tor.html
   # https://github.com/spesmilo/electrum-docs/issues/129
-  s rsync -ptog --chown bitcoin:bitcoin ~/.Xauthority /var/lib/bitcoind/.Xauthority
-  sudo -u bitcoin DISPLAY=$DISPLAY XAUTHORITY=/var/lib/bitcoind/.Xauthority /a/opt/electrum-4.2.1-x86_64.AppImage -p socks5:localhost:9050
+  # s rsync -ptog --chown bitcoin:bitcoin ~/.Xauthority /var/lib/bitcoind/.Xauthority
+  # sudo -u bitcoin DISPLAY=$DISPLAY XAUTHORITY=/var/lib/bitcoind/.Xauthority /a/opt/electrum-4.2.1-x86_64.AppImage -p socks5:localhost:9050
+
 }
+
+
 monero() {
   sudo -u bitcoin DISPLAY=$DISPLAY XAUTHORITY=/var/lib/bitcoind/.Xauthority /a/opt/monero-gui-v0.17.3.2/monero-wallet-gui
 }
@@ -4390,14 +4405,24 @@ rgm() {
   rg "$@" /p/w.org /a/t.org /a/work.org /b
 }
 
-# re all my files more expansively
+# re all my files more expansively.
+# usage [-OPT...] regex space combined
 rem() {
   local paths
+  local -a opts
+  for arg; do
+    if [[ $arg == -* ]]; then
+      opts+=("$1")
+      shift
+    else
+      break
+    fi
+  done
   paths="/p/c /b/"
   find $paths -not \( -name .svn -prune -o -name .git -prune \
        -o -name .hg -prune -o -name .editor-backups -prune \
        -o -name .undo-tree-history -prune \) 2>/dev/null | grep -iP --color=auto -- "$*" ||:
-  rgv $local_rgv_args -g "!bash_unpublished" -- "$*" $paths /a/work.org ||:
+  rgv $local_rgv_args -g "!bash_unpublished" "${opts[@]}" -- "$*" $paths /a/work.org ||:
 }
 reml() { # rem with limit to 5 matches per file
   local_rgv_args="-m 5"
@@ -4725,8 +4750,24 @@ ftoc() {
   units "tempF($1)" tempC
 }
 
-# requires dns/firewall setup first
-local-icecast() {
+# local icecast
+localic() {
+  local mod=false
+  cedit live /p/c/machine_specific/vps/filesystem/var/lib/bind/db.iankelling.org <<'EOF' || mod=true
+live   CNAME   b8.nz.
+EOF
+  if $mod; then
+    ip=$(ip r show default | sed -r 's/.*src ([^ ]*).*/\1/' | head -n1)
+    if [[ ! $ip ]] && timeout 1 ping -c 1 $ip; then
+      echo "error: failed to get ip: $ip" >&2
+      exit 1
+    fi
+    cat >/p/c/cmc-firewall-data-http <<EOF
+http_ip=$ip
+EOF
+    bindpush
+    wrt-setup
+  fi
   web-conf -e ian@iankelling.org -f 8000 - apache2 live.iankelling.org  <<'EOF'
 <Location "/fsf.webm">
 AuthType Basic
@@ -4742,8 +4783,23 @@ AuthName "basic_auth"
 AuthUserFile "/etc/icecast-fsf-tech-htpasswd"
 Require valid-user
 </Location>
+EOF
+  s cat /etc/letsencrypt/live/live.iankelling.org/{fullchain,privkey}.pem | s dd of=/etc/icecast2/fullchainpluskey.pem
+  ser start icecast2
+}
+# li icecast
+liic() {
+  cedit live /p/c/machine_specific/vps/filesystem/var/lib/bind/db.iankelling.org <<'EOF' || bindpush
+live   A       72.14.176.105
+       AAAA    2600:3c00::f03c:91ff:fe6d:baf8
 EOF
 }
+# icecast rm -r
+icrmr() {
+  find /var/icecast -type f -delete
+  ssh li.b8.nz find /var/icecast -type f -delete
+}
+
 
 # obs screen switching of
 obof() {
@@ -4776,6 +4832,107 @@ opensslcertinfo() {
   openssl x509 -txt -in "$@"
 }
 
+# dsh on btrbk hosts
+dsb() {
+  :
+}
+
+# dsh a file and run it
+dsa() {
+  local ret file
+  if ! parallel -j 10 scp x {}:/tmp <~/.dsh/group/btrbk; then
+    echo parallel scp failed. dsa returning $ret
+  fi
+  dsh -g btrbk
+}
+
+# temporary
+zmqsend() {
+  /nocow/t/ffmpeg-release/ffmpeg-7.0.1/tools/zmqsend "$@"
+}
+
+ffg() { /nocow/t/ffmpeg-release/ffmpeg-7.0.1/tools/graph2dot -o /tmp/g.tmp && dot -Tpng /tmp/g.tmp -o /tmp/g.png && feh /tmp/g.png; }
+
+firefox-hide-tabs() {
+
+  # without this, make tabs smaller by setting browser.uidensity 1 in about:config
+
+  profiledir=$1
+  [[ $1 ]] || return 1
+  # Related: the sidebery extension is useful.
+
+  # This is from
+  # https://raw.githubusercontent.com/MrOtherGuy/firefox-csshacks/master/chrome/hide_tabs_toolbar.css
+
+  ainsl $profiledir/chrome/userChrome.css '#TabsToolbar{ visibility: collapse !important }'
+
+}
+
+# kill lease on cmc
+klease() {
+  local tmpdir ret out
+  ret=0
+  out=$(ssh cmc dnsmasq-end-lease "$1" 2>&1) || ret=1
+  printf "%s\n" "$out"
+  if [[ $out == *"try diffing"* ]]; then
+    tmpdir=$(mktemp -d)
+    m scp cmc:/tmp/dhcp.leases cmc:/tmp/dhcp.leases.iank $tmpdir
+    m diff $tmpdir/dhcp.leases $tmpdir/dhcp.leases.iank ||:
+    rm -rf $tmpdir
+  fi
+  return $ret
+}
+
+# ffs and switch the bash history on this terminal.
+# disabled because I don't really need this and
+# the history switching is annoying for debugging.
+#
+# ffs() {
+#   local last
+#   last="${*: -1}"
+#   if [[ $last && $last != -* && $last != sysops ]]; then
+#     his
+#   fi
+#   command ffs "$@"
+# }
+
+i3gen() {
+  /b/ds/i3-sway/gen
+}
+
+
+# insensitive find plus edit
+ife() {
+  local tmps found_count i char file
+  local -a found_files
+  local -A button_file
+  tmps=$(ifn "$@")
+  mapfile -t found_files <<<"$tmps"
+  found_count=${#found_files[@]}
+  if (( ${#found_files[@]} == 1 )); then
+    m g ${found_files[0]}
+  else
+    i=0
+    for button in {a..z}; do
+      button_file[$button]="${found_files[$i]}"
+      echo $button: ${found_files[$i]}
+      i=$(( i + 1 ))
+      if (( i >= found_count )); then
+        break
+      fi
+    done
+    read -rsN1 -t 5 char ||:
+    file="${button_file[$char]}"
+
+    if [[ $file ]]; then
+      g "$file"
+    else
+      echo "no selection"
+    fi
+  fi
+}
+
+
 export BASEFILE_DIR=/a/bin/fai-basefiles
 
 #export ANDROID_HOME=/a/opt/android-home