X-Git-Url: https://iankelling.org/git/?a=blobdiff_plain;f=brc2;h=1a6db0cc38d5d4978c389c9d0d1418d2a36d90db;hb=523b7ff889aaafdcd997d84b2a06744993018e89;hp=bad1194baf610135693989e4eb8da56efee403de;hpb=768363d8771edb9d9ed82425fa772d77b90139c0;p=distro-setup diff --git a/brc2 b/brc2 index bad1194..1a6db0c 100644 --- a/brc2 +++ b/brc2 @@ -71,6 +71,8 @@ source /a/bin/ds/beet-data # * functions + + multimic() { local i local -a sources @@ -126,6 +128,12 @@ zcheck() { ssh bow rm /tmp/oegu.jpg feh /t/oegu.jpg } +zmon() { + while true; do + ziva-screen + sleep 15 + done +} slemacs() { local arg rtime v @@ -674,6 +682,7 @@ beetag-nostatus() { fi if $erasable_line; then # https://stackoverflow.com/a/71286261 + # erase line / delete line in terminal printf '\033[1A\033[K' fi erasable_line=false @@ -1189,7 +1198,7 @@ beet2nav() { # pull in beets library locally beetpull() { - local sshfs_host + local sshfs_host sshfs_cmd sshfs_host=b8.nz if [[ $HOSTNAME == kd ]]; then return 0 @@ -1198,8 +1207,9 @@ beetpull() { s mkdir /i s chown iank:iank /i fi - if ! mountpoint /i &>/dev/null; then - m sshfs $sshfs_host:/i /i + sshfs_cmd="sshfs -o ServerAliveInterval=15,reconnect $sshfs_host:/i /i" + if ! pgrep -f "^$sshfs_cmd$" >/dev/null; then + m $sshfs_cmd fi } @@ -1642,7 +1652,7 @@ 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) + 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) a="-ahviSAXPH --specials --devices --delete --relative --exclude-from=/p/c/li-rsync-excludes" ret=0 for h in li je bk; do @@ -2141,7 +2151,7 @@ gpg() { } gse() { - local email=ian@iankelling.org + local email=iank@fsf.org git send-email --notes "--envelope-sender=<$email>" \ --suppress-cc=self "$@" } @@ -2165,7 +2175,9 @@ hstatus() { done } -# work log +## work log +# +# note: database location is specified in ~/.timetrap.yml, currently /p/.timetrap.db wlog() { local day i days_back days_back=${1:-16} @@ -2533,12 +2545,49 @@ mns() { # mount namespace m sudo -E /usr/bin/nsenter --mount=/root/mount_namespaces/$ns "$@" } +mnsd() { # mount namespace + systemd namespace + ns=$1 + unit=$2 + shift 2 + + s mkdir -p /root/mount_namespaces + if ! sudo mountpoint /root/mount_namespaces >/dev/null; then + m sudo mount --bind /root/mount_namespaces /root/mount_namespaces + fi + m sudo mount --make-private /root/mount_namespaces + if [[ ! -e /root/mount_namespaces/$ns ]]; then + m sudo touch /root/mount_namespaces/$ns + fi + if ! sudo mountpoint /root/mount_namespaces/$ns >/dev/null; then + m sudo unshare --propagation slave --mount=/root/mount_namespaces/$ns /bin/true + fi + + pid=$(servicepid $unit) + tmpf=$(mktemp --tmpdir $unit.XXXXXXXXXX) + export -p >$tmpf + printf "%s " "${@@Q}" >>$tmpf + echo >>$tmpf + + m sudo nsenter -t $pid -n --mount=/root/mount_namespaces/$ns sudo -u $USER -i bash -c ". $tmpf & sleep 1; rm $tmpf" +} + + mnsr() { # mns run local ns=$1 shift mns $ns sudo -u iank -E env "PATH=$PATH" "$@" } +mnsnonetr() { + ns=$1 + lomh + if ! s ip netns list | grep -Fx nonet &>/dev/null; then + s ip netns add nonet + fi + mns $ns --net=/var/run/netns/nonet /bin/bash + lomh +} + mnsnonet() { ns=$1 lomh @@ -2817,7 +2866,12 @@ myprof() { else i=0 fi - min_date=$(date -d 'monday 2 weeks ago' +%s) + # usually do this on monday, sometimes later + if [[ $(date +%A) == Monday ]]; then + min_date=$(date -d 'monday 2 weeks ago' +%s) + else + min_date=$(date -d 'monday 3 weeks ago' +%s) + fi for (( ; i < logcount; i++ )); do log=${logs[$i]} d=$(date -d "$(head -n1 $log|awk '{print $1}')" +%s) @@ -2831,12 +2885,24 @@ myprof() { popd } -# tail pms in the last day, for the case where we restart profanity and -# didn't check for pms beforehand. -profrecent() { +# Tail pms in the last day, for the case where we restart profanity and +# didn't check for pms beforehand. Assume the most recent logs are on kd. +# If that isn't the case, use prof-recent-local +prof-recent() { + case $HOSTNAME in + kd) + prof-recent-local + ;; + *) + ssh b8.nz prof-recent-local + ;; + esac +} + +prof-recent-local() { local d dates date files f # consider making the day count passed by parameter. note: this works: $(date -d '2 day ago' +%Y_%m_%d) - dates=("$(date -d +%Y_%m_%d)" "$(date -d '1 day ago' +%Y_%m_%d)" ) + dates=("$(date +%Y_%m_%d)" "$(date -d '1 day ago' +%Y_%m_%d)" ) for d in /d/p/profanity/chatlogs/iank_at_fsf.org/!(rooms); do files=() for date in ${dates[@]}; do @@ -3289,9 +3355,12 @@ testexim() { # # -t = get recipient from header exim -d -t <&2 return 1 @@ -3441,7 +3510,11 @@ sdncmd() { # systemd namespace cmd unit=$1 shift pid=$(servicepid $unit) - m sudo nsenter -t $pid -n -m sudo -u $USER -i "$@" + tmpf=$(mktemp --tmpdir $unit.XXXXXXXXXX) + export -p >$tmpf + printf "%s " "${@@Q}" >>$tmpf + echo >>$tmpf + m sudo nsenter -t $pid -n -m sudo -u $USER -i bash -c ". $tmpf & rm $tmpf" } @@ -3546,11 +3619,33 @@ fixu() { # unmute um() { + local sink card + sink=$(pactl get-default-sink) + if [[ $sink != auto_null ]]; then + return + fi + + # 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}') + m pacmd set-card-profile "$card" output:analog-stereo + pactl set-sink-mute @DEFAULT_SINK@ false rm -f /tmp/ianknap } + nap() { - pactl set-sink-mute @DEFAULT_SINK@ true + local sink card + sink=$(pactl get-default-sink) + card="${sink%.*}" + card="${card/output/card}" + m pacmd set-card-profile "$card" off + + # clicking on a link in a browser can cause unmute. + # I don't want that. So, use a stronger form of mute + # than this. + #pactl set-sink-mute @DEFAULT_SINK@ true touch /tmp/ianknap } @@ -3642,7 +3737,13 @@ vpnoffc() { # vpn off client ser stop openvpn-client-tr@client } vpnc() { - ser start openvpn-client-tr@client + local unit + unit=openvpn-client-tr@client + sudo -v + if [[ $(systemctl is-active $unit) != active ]]; then + s systemctl start $unit + sleep 1 + fi } @@ -3711,6 +3812,14 @@ 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 ||: +} +reml() { # with limit to 5 matches per file local paths paths="/p/c /b" find $paths -not \( -name .svn -prune -o -name .git -prune \ @@ -3719,6 +3828,13 @@ rem() { rgv -m 5 -- "$*" $paths /a/t.org /p/w.org /a/work.org ||: } + +# for use in /f/bind +fupzone() { + # shellcheck disable=SC2046 # i want word splitting + ./update-zone $(i s | sed -rn 's/.*db\.(.*)/\1/p') +} + # setup: # pip3 install linode-cli # linode-cli @@ -3887,7 +4003,8 @@ rgv() { # -i = case insensitive # -M = max columns # --no-messages because of annoying errors on broken symlinks - command rg -. -z --no-messages -i -M 900 -g '!.git' -g '!auto-save-list' -g '!.savehist' "$@" || ret=$? + # --no-ignore-parent because i have /a/.git which ignores almost everything under it. + command rg -. -z --no-messages -i -M 900 --no-ignore-parent -g '!.git' -g '!auto-save-list' -g '!.savehist' "$@" || ret=$? return $ret } @@ -3948,6 +4065,34 @@ path-add --end --ifexists $HOME/.rvm/bin # so its included in overall env +# ya, hacky hardcoded hostnames in 2023. we could do better +hssh-update() { + local -a failed_hosts hosts + case $HOSTNAME in + sy|kd) + hosts=( + kd x3.office.fsf.org syw + ) + ;; + x3) + hosts=( + b8.nz sywg.b8.nz + ) + ;; + esac + for host in ${hosts[@]}; do + e $host + if ! scp /b/fai/fai/config/files/usr/local/bin/hssh/IANK root@$host:/usr/local/bin/hssh; then + failed_hosts+=($host) + fi + done + if (( ${#failed_hosts[@]} >= 1 )); then + echo failed_hosts=${failed_hosts[*]} + return 1 + fi +} + + export BASEFILE_DIR=/a/bin/fai-basefiles #export ANDROID_HOME=/a/opt/android-home