various fixes
[distro-setup] / brc2
diff --git a/brc2 b/brc2
index e7d50e3f06b7d37d083a1e393e54bc22fa05bb5c..aa370ac58b5ce13a74a9172c5760a367e7e3e471 100644 (file)
--- a/brc2
+++ b/brc2
@@ -1,6 +1,25 @@
 #!/bin/bash
-# Copyright (C) 2019 Ian Kelling
-# SPDX-License-Identifier: AGPL-3.0-or-later
+# I, Ian Kelling, follow the GNU license recommendations at
+# https://www.gnu.org/licenses/license-recommendations.en.html. They
+# recommend that small programs, < 300 lines, be licensed under the
+# Apache License 2.0. This file contains or is part of one or more small
+# programs. If a small program grows beyond 300 lines, I plan to switch
+# its license to GPL.
+
+# Copyright 2024 Ian Kelling
+
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+
+#     http://www.apache.org/licenses/LICENSE-2.0
+
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
 # this gets sourced. shebang is just for file mode detection
 
 
@@ -197,6 +216,20 @@ rm-docker-iptables() {
 
 # usage mkschroot [-] distro codename packages
 # - means no piping in of sources.list
+#
+# note some useful post mkschroot i've used in the past
+# tu /nocow/schroot/flidas/etc/sudoers <<EOF
+# $USER  ALL=(ALL)  NOPASSWD: ALL
+# Defaults  env_keep += SUDOD
+# Defaults always_set_home
+# Defaults !umask
+# EOF
+# sd /nocow/schroot/flidas//etc/locale.gen <<'EOF'
+# en_US.UTF-8 UTF-8
+# EOF
+# s schroot -c flidas locale-gen
+# s schroot -c flidas update-locale LANG=en_US.UTF-8
+
 mkschroot() {
   local sources force repo n distro
   force=false
@@ -368,11 +401,6 @@ cp-blocked-domains-to-ansible() {
 }
 
 
-anki() {
-  # crashes on adding new cards in t9
-  schroot -c buster -- anki
-}
-
 daycat() {
   ngset
   hrcat /m/md/daylert/{cur,new}/*
@@ -454,7 +482,7 @@ glue() {
 
 # usage: see above
 _iki-convert() {
-  local url url_prefix path input err repo_dir dir url_dir url name
+  local url url_prefix path input repo_dir dir url_dir url name
   url_prefix="$1"
   name="${url_prefix%%.*}"
   repo_dir="/f/$name"
@@ -467,8 +495,16 @@ _iki-convert() {
   case $input in
     http*)
       path="$repo_dir/${input##http*://"$url_prefix"/}"
+      # for files like x.jpg, we dont need to convert the extension.
       if [[ $path == */ ]]; then
         path=${path%/}.mdwn
+        # brains adds trailing slash, but without trailing is still
+        # valid. We can't be totally sure whether to add mdwn, but we
+        # can guess based on the existence of the file. We can't be sure
+        # because it could be a file like x.jpg, that we just don't have
+        # in our local repo.
+      elif [[ ! -f $path && -e $path.mdwn ]]; then
+        path=${path}.mdwn
       fi
       j printf "%s\n" "$path"
       ;;
@@ -476,7 +512,9 @@ _iki-convert() {
       path=$(fp "$input")
       url_dir=$(echo "$path" | sed -r "s,^(/a)?$repo_dir/,,")
       url="https://$url_prefix/$url_dir"
-      url="${url%.mdwn}/"
+      if [[ $url == *.mdwn ]]; then
+        url="${url%.mdwn}/"
+      fi
       j echo "$url"
       ;;
   esac
@@ -739,6 +777,7 @@ mpvrpc-percent-pos() {
 # background, this relies on how ps converts newlines in arguments to spaces, and
 # assumes we won't be searching for a command with spaces in its arguments
 rinr() {
+  # shellcheck disable=SC2009 # pgrep has no fixed string option, plus see above.
   if ps h -o args -C "${1##*/}" | grep -Fxqv "$*" &>/dev/null || [[ $? == 141 ]]; then
     "$@"
   fi
@@ -771,7 +810,7 @@ mpvrpc-loadfile() {
     finalpath="$cachedir${path#/i/m}"
     rowir rsync --partial -a --inplace --mkpath "b8.nz:$path" "$finalpath"
     finalnextpath="$cachedir${nextpath#/i/m}"
-    count=$(pgrep -a -f "^rsync --partial -a --inplace --mkpath $cachdir" || [[ $? == 1 ]] )
+    count=$(pgrep -a -f "^rsync --partial -a --inplace --mkpath $cachedir" || [[ $? == 1 ]] )
     # allow us to start 2 rsyncs in the background
     if [[ $count == [01] ]]; then
       rinr rsync --partial -a --inplace --mkpath "b8.nz:$nextpath" "$finalnextpath" &
@@ -1752,7 +1791,8 @@ bindpush() {
   dsign iankelling.org expertpathologyreview.com zroe.org amnimal.ninja
   lipush
   for h in li bk; do
-    m sl $h.b8.nz <<'EOF'
+    e sshing $h
+    ssh $h.b8.nz <<'EOF'
 source ~/.bashrc
 m dnsup
 EOF
@@ -1761,7 +1801,8 @@ EOF
 bindpushb8() {
   lipush
   for h in li bk; do
-    m sl $h <<'EOF'
+    e sshing $h
+    ssh $h.b8.nz <<'EOF'
 source ~/.bashrc
 m dnsb8
 EOF
@@ -1953,6 +1994,70 @@ capache()
   fi
 }
 
+
+
+apache-header() {
+  # First paragraph is to avoid people being confused about why a
+  # file is apache licensed.
+  cat <<'EOF'
+# I, Ian Kelling, follow the GNU license recommendations at
+# https://www.gnu.org/licenses/license-recommendations.en.html. They
+# recommend that small programs, < 300 lines, be licensed under the
+# Apache License 2.0. This file contains or is part of one or more small
+# programs. If a small program grows beyond 300 lines, I plan to switch
+# its license to GPL.
+
+# Copyright 2024 Ian Kelling
+
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+
+#     http://www.apache.org/licenses/LICENSE-2.0
+
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+EOF
+
+}
+
+# apply apache to git tracked bash files + README, except files with A?GPL3 header.
+apache-apply-repo() {
+  for f in $(git ls-files); do
+    [[ -L $f || ! -f $f ]] && continue
+    if [[ $f != README ]]; then
+      if ! grep -n '^#!/bin/bash' $f | grep ^1: &>/dev/null; then continue; fi
+      if  head -n 10 $f | grep 'it under the terms of the GNU General Public License as published by' &>/dev/null; then continue; fi
+    fi
+    apache-apply $f
+  done
+}
+
+apache-apply() {
+  for file; do
+    if head -n1 "$file"| grep -E '^#!/bin/bash\b' &>/dev/null; then
+      {
+        head -n1 "$file"
+        apache-header
+        tail -n+2 "$file"
+      } | sponge "$file"
+    else
+      {
+        apache-header
+        cat "$file"
+      } | sponge "$file"
+    fi
+  done
+}
+# strip out the apache license from a file.
+apache-strip() {
+  for f in $(find . -type f -maxdepth 1); do if head -n1 "$f"| grep -E '^#!/bin/bash\b' &>/dev/null; then { head -n 20 $f | tac | sed '/^# limitations under the License.$/,/^# Copyright.*Ian Kelling$/d' | tac; tail -n+21 $f; } |sponge $f; fi ; done
+}
+
 chrome() {
   if type -p chromium &>/dev/null; then
     cmd=chromium
@@ -2457,7 +2562,10 @@ ilog-local() {
     cd $d$n/"$chan"
     hr
     for x in *; do
-      echo $x; sed "s/^./${x%log}/" $x; hr;
+      # *** are parts and joins and such, and they make reading hard.
+      # I probably will want to see them sometimes, just have to
+      # remove that part.
+      echo $x; sed "s/^./${x%log}/;/\*\*\*/d" $x; hr;
     done
   done
 }
@@ -2842,7 +2950,7 @@ mdenable() {
 
   two=false
   case $1 in
-    -2) two=true shift ;;
+    -2) two=true; shift ;;
   esac
 
   for md; do
@@ -2923,6 +3031,9 @@ mpvgpu() {
 mpvd() {
   mpv --profile=d "$@";
 }
+mpva() {
+  mpv --profile=a "$@";
+}
 # mpv all media files in . or $1
 mpvm() {
   local -a extensions arg
@@ -3402,8 +3513,6 @@ spd() {
 }
 
 spamf() { # spamtest on FILE
-  local spamcpre spamdpid
-
   if (( $# != 1 )); then
     e spamtest error: expected 1 arg, filename >&2
     return 1
@@ -4007,12 +4116,6 @@ vrun() {
   "$@"
 }
 
-f=/a/f/ansible-configs/files/common/etc/fsf-workstation-bashrc.sh
-if [[ -e $f ]]; then
-  # shellcheck disable=SC1090
-  source $f
-fi
-
 electrum() {
   # https://electrum.readthedocs.io/en/latest/tor.html
   # https://github.com/spesmilo/electrum-docs/issues/129
@@ -4030,22 +4133,33 @@ rgm() {
 }
 
 # re all my files more expansively
+
 rem() {
   local paths
   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 -- "$*" $paths /a/t.org /p/w.org /a/work.org ||:
+  rgv $local_rgv_args -g "!bash_unpublished" -- "$*" $paths /a/work.org ||:
 }
-reml() { # with limit to 5 matches per file
+reml() { # rem with limit to 5 matches per file
+  local_rgv_args="-m 5"
+  rem "$@"
+}
+
+rep() {
   local paths
-  paths="/p/c /b"
+  paths="/p/c"
   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 -m 5 -- "$*" $paths /a/t.org /p/w.org /a/work.org ||:
+  rgv $local_rgv_args -- "$*" $paths /a/t.org /p/w.org ||:
 }
+repl() { # rem with limit to 5 matches per file
+  local local_rgv_args="-m 5"
+  rem "$@"
+}
+
 
 # re on common fsf files
 ref() {
@@ -4055,7 +4169,7 @@ ref() {
        -o -name .hg -prune -o -name .editor-backups -prune \
        -o -name .undo-tree-history -prune \) 2>/dev/null | grep -iP --color=auto -- "$*" ||:
   rgv -- "$*" $paths /a/work.org ||:
-  }
+}
 
 
 # for use in /f/bind
@@ -4193,9 +4307,6 @@ mypyenvinit () {
 }
 
 
-export GOPATH=$HOME/go
-path-add $GOPATH/bin
-path-add /usr/local/go/bin
 
 # I have the git repo and a release. either one should work.
 # I have both because I was trying to solve an issue that
@@ -4349,6 +4460,62 @@ attach-txt() {
   done | ec
 }
 
+ctof() {
+  units "tempC($1)" tempF
+}
+
+ftoc() {
+  units "tempF($1)" tempC
+}
+
+# requires dns/firewall setup first
+local-icecast() {
+  web-conf -e ian@iankelling.org -f 8000 - apache2 live.iankelling.org  <<'EOF'
+<Location "/fsf.webm">
+AuthType Basic
+AuthName "basic_auth"
+# created with
+# htpasswd -c icecast-fsf-htpasswd USERNAME
+AuthUserFile "/etc/icecast-fsf-htpasswd"
+Require valid-user
+</Location>
+<Location "/fsf-tech.webm">
+AuthType Basic
+AuthName "basic_auth"
+AuthUserFile "/etc/icecast-fsf-tech-htpasswd"
+Require valid-user
+</Location>
+EOF
+}
+
+# obs screen switching of
+obof() {
+  ls -l /tmp/no-obs-auto-scene-switch
+  touch /tmp/no-obs-auto-scene-switch
+}
+# obs screen switching on
+obon() {
+  ls -l /tmp/no-obs-auto-scene-switch
+  if [[ -e /tmp/no-obs-auto-scene-switch ]]; then
+    rm -f /tmp/no-obs-auto-scene-switch
+  fi
+}
+
+obs-gen-profiles() {
+  local p=/p/c/basic/profiles
+  sed 's/fsf-sysops/fsf-tech/g' $p/fsfsysops/basic.ini >$p/fsftech/basic.ini
+  sed 's/fsf-sysops/fsf/g' $p/fsfsysops/basic.ini >$p/fsf/basic.ini
+}
+
+# terminal clear. like clear, but put the prompt at the bottom,
+# useful for obs streaming the bottom half of a terminal window.
+tclear() {
+  for ((i=0; i<COLUMNS; i++)); do
+    echo
+  done
+}
+
+
 export BASEFILE_DIR=/a/bin/fai-basefiles
 
 #export ANDROID_HOME=/a/opt/android-home