X-Git-Url: https://iankelling.org/git/?a=blobdiff_plain;f=brc2;h=e936badfba828a52dcbab2c003e8b1c05bd2c65a;hb=refs%2Fheads%2Fmaster;hp=05de0a3f1cf93cbc19db5213794c83b6a129807f;hpb=1f027ea146ea6c62002a8f67f831273a5c431b52;p=distro-setup diff --git a/brc2 b/brc2 index 05de0a3..d46028d 100644 --- 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 @@ -1504,7 +1530,6 @@ btrbk-host-debug() { # $ dig ns1.gnu.org @b0.org.afilias-nst.org. -# todo: make sm pull/push use systemd instead of the journal cat command bbk() { # btrbk wrapper local ret=0 c / @@ -1683,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 @@ -1752,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 @@ -1783,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() { @@ -1855,7 +1884,13 @@ dsign() { # set day start for use in other programs. # expected to do be in a format like 830, or 800 or 1300. ds() { + local regex + regex='[0-9]?[0-9]?[0-9][0-9]' if [[ $1 ]]; then + if [[ ! $1 =~ $regex ]]; then + echo "ds: error. expected \$1 to match $regex, got \$1: $1" + return 1 + fi echo $1 >/b/data/daystart else cat /b/data/daystart @@ -1901,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 @@ -1998,8 +1977,8 @@ apache-header() { # 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. +# programs. If a small program grows beyond 300 lines, I plan to change +# to a recommended GPL license. # Copyright 2024 Ian Kelling @@ -2033,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 @@ -2153,7 +2136,7 @@ fastboot() { kdecd() { /usr/lib/x86_64-linux-gnu/libexec/kdeconnectd; } -bat() { +batp() { cat /sys/class/power_supply/BAT0/capacity } @@ -2638,19 +2621,29 @@ wgkey() { host-info-all() { host-info-update + bindpushb8 + # for wireguard configs ssh iank@li.b8.nz conflink wrt-setup } -# if you change a host's ip, then run -# bindpushb8 -# wrt-setup + + + +## for updating host info like ip, location, update /p/c/host-info and +## host_info below. the host_info array should probably be in its own +## file that gets sourced so that it can be more easily updated. + +# todo: this is so long that it becomes confusing, +# try to split it up. +# +# To make some changes take effect, run host-info-all. host-info-update() { - local -A vpn_ips host_ips host_macs nonvpn_ips all_ips - local -a root_hosts nonroot_hosts host_usbs + local -A vpn_ips host_ips host_macs portfw_ips nonvpn_ips all_ips + local -a root_hosts nonroot_hosts # the hosts with no mac root_hosts=( bk je li b8.nz ) @@ -2678,6 +2671,7 @@ host-info-update() { all_ips[$host]=$ip if $vpn; then + portfw_ips[$host]=$ip vpn_ips[$host]=$ip else nonvpn_ips[$host]=$ip @@ -2687,6 +2681,8 @@ 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) fi @@ -2710,10 +2706,8 @@ EOF for host in ${!vpn_ips[@]}; do ipsuf=${vpn_ips[$host]} cat <$tmpf + cedit -e work-identity /p/c/subdir_files/.ssh/config-static <$tmpf + rm -f $tmpf + + ### begin focus on hosts file update ### + # + # This started as its own function, but it actually + # needed to alter the ssh config, so combined it. + # + # background: This is finally doing dynamic ip resolution via the hosts + # file. I considered detecting where each host was dynamically or + # something, but ultimately decided to mostly avoid that, other than + # detecting the status of the current machine I'm on. I want to be able + # to move it around without having to manually type much of anything. + local -a host_domain_suffix hosts + local -A ip_to_hosts + local suf ip i host at_home suf_from_here + + source /p/c/domain-info + + at_home=false + if ip n | grep -q "10.2.0.1 .* b4:75:0e:fd:06:4a"; then + at_home=true + fi + + for i in ${host_domain_suffix[@]}; do + if [[ $i == *.* ]]; then + suf=$i + continue + fi + hosts+=($i) + if [[ $i == "$HOSTNAME" ]]; then + unset "portfw_ips[$i]" + continue + fi + + suf_from_here=$suf + if ! $at_home && [[ $suf == .b8.nz || $suf == [wc].b8.nz ]]; then + suf_from_here=i.b8.nz + else + unset "portfw_ips[$i]" + fi + + # 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 + fi + 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 + echo "$ip${ip_to_hosts[$ip]}" + done | s cedit -e hosts-file-up /etc/hosts + for host in ${hosts[@]}; do + echo $host + done >/p/c/subdir_files/.dsh/group/btrbk + ### end focus on hosts file update ### + + + # note: note sure if this is a great way to check. + # todo: think about it + + if $at_home; then + # possible that in the future we want to create + # a dynamic file here, and then we can move the cat + # command above out of the conditional + rsync -a /p/c/subdir_files/.ssh/config-static ~/.ssh/config + else + for host in ${!portfw_ips[@]}; do + ipsuf=${portfw_ips[$host]} + cat < ~/.ssh/config-dynamic + cat /p/c/subdir_files/.ssh/config-static ~/.ssh/config-dynamic >~/.ssh/config + fi } # usage host ipsuf [extrahost] @@ -3278,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 @@ -3650,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 "$@" } @@ -4026,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 @@ -4071,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 @@ -4093,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: $/{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: $/{g;p;q}' + card=$(pacmd list-cards | sed -n "$sedcmd") m pacmd set-card-profile "$card" output:analog-stereo fi @@ -4263,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 } @@ -4284,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" @@ -4619,7 +4750,8 @@ ftoc() { units "tempF($1)" tempC } -# requires dns/firewall setup first +# note: requires dns setup of live.iankelling.org, & if i'm home, port +# forwarding in wrt-setup-local. todo: automate that. local-icecast() { web-conf -e ian@iankelling.org -f 8000 - apache2 live.iankelling.org <<'EOF' @@ -4666,6 +4798,110 @@ tclear() { done } +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