X-Git-Url: https://iankelling.org/git/?a=blobdiff_plain;f=brc2;h=bad1194baf610135693989e4eb8da56efee403de;hb=768363d8771edb9d9ed82425fa772d77b90139c0;hp=6497accdce4f78007036d34acf10c63dc29873de;hpb=ac3e00755e07d2e298769000f7ea50bc0854b510;p=distro-setup diff --git a/brc2 b/brc2 index 6497acc..bad1194 100644 --- a/brc2 +++ b/brc2 @@ -289,14 +289,41 @@ tback() { # sshfs example: # 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 +} +edelayon() { + echo >/etc/exim4/no-delay-eximids +} + eqgo() { - local -a array tmpstr + local -a array tmpstr delayon + delayon=true + if grep -qFx all /etc/exim4/no-delay-eximids; then + delayon=false + fi + if $delayon; then + echo all >/etc/exim4/no-delay-eximids + fi tmpstr=$(exiqgrep -i -r.\*) mapfile -t array <<<"$tmpstr" enn -M "${array[@]}" + if $delayon; then + echo >/etc/exim4/no-delay-eximids + fi } eqgo1() { - enn -M "$(exipick -i -r.\*|h1)" + local eid + eid="$(exipick -i -r.\*|h1)" + sed -n "/^all$/p;\$a $eid" /etc/exim4/no-delay-eximids + enn -M "$eid" +} +ennm() { + local eid + for eid; do + printf "%s\n" "$eid" >>/etc/exim4/no-delay-eximids + done + enn -M "$@" } @@ -393,18 +420,17 @@ astudio() { # Convert brains file path to url and vice versa # usage: brains [URL_OR_PATH] brains() { - _iki-convert /f/brains brains.fsf.org "$@" + _iki-convert '(/a)?/f/brains' brains.fsf.org/wiki "$@" } glue() { - _iki-convert /f/gluestick gluestick.office.fsf.org "$@" + _iki-convert '(/a)?/f/gluestick' gluestick.office.fsf.org "$@" } # usage: $0 REPO_PATH [URL_OR_PATH] _iki-convert() { - local url path input err repo_dir domain filename dir path - local initial_oldpwd initial_pwd + local url prefix path input err repo_dir dir url_dir url repo_dir="$1" - domain="$2" + prefix="$2" shift 2 err=false if $err; then @@ -417,7 +443,7 @@ _iki-convert() { fi case $input in http*) - path="$repo_dir/${input##https://$domain/wiki/}" + path="$repo_dir/${input##http*://"$prefix"/}" if [[ $path == */ ]]; then path=${path%/}.mdwn fi @@ -425,52 +451,14 @@ _iki-convert() { ;; *) path=$(fp "$input") - url="https://$domain/wiki/${path#$repo_dir/}" + url_dir=$(echo "$path" | sed -r "s,^$repo_dir/,,") + url="https://$prefix/$url_dir" url="${url%.mdwn}/" j echo "$url" ;; esac } -# Convert brains file path to url and vice versa. It copies the result to clipboard -# usage: brains [URL_OR_PATH] -brains() { - local url path input repo_dir err path - repo_dir=/a/f/brains - err=false - if ! type -p xclip &>/dev/null; then - echo "missing dependency for brains, please do: sudo apt install xclip" >&2 - err=true - fi - if ! type -p pee &>/dev/null; then - echo "missing dependency for brains, please do: sudo apt install moreutils" >&2 - err=true - fi - if $err; then - return 1 - fi - if [[ $1 ]]; then - input="$*" - else - read -r -p "enter path or url"$'\n' input - fi - case $input in - http*) - path="$repo_dir/${input##https://brains.fsf.org/wiki/}" - if [[ $path == */ ]]; then - path=${path%/}.mdwn - fi - printf "%s\n" "$path" |& pee "xclip -r -selection clipboard" cat - ;; - *) - path=$(realpath -s "$input") - url="https://brains.fsf.org/wiki/${path#$repo_dir/}" - url="${url%.mdwn}/" - echo "$url" |& pee "xclip -r -selection clipboard" cat - ;; - esac -} - # Generate beet smartplaylists for navidrome. # for going in the reverse direction, run @@ -593,6 +581,15 @@ EOF # beet playlist. use beetag with a playlist name bpl() { local playlist playlist_regex + case $1 in + -h|--help) + for playlist in "${!bpla[@]}"; do + printf "%s\n" "$playlist" + done + return 0 + ;; + esac + playlist="${*: -1}" playlist_regex='[a-z0-9_]' if [[ ! $playlist =~ $playlist_regex ]]; then @@ -662,7 +659,7 @@ beetag-help() { cat <<'EOF' -y other genres z fg player ' = toggle play 1-5 rate +y other genres z fg player ' = toggle play 1-5 rate ] repeat1 ; previous _ = delete up/down skip mpv vol,pause,seek EOF hr @@ -726,12 +723,13 @@ mpvrpc-percent-pos() { # 1-5 rate # q quit # ret next +# beetag() { local last_genre_i fstring tag id char new_item char_i genre tag remove doplay i j random path local do_rare_genres read_wait help line lsout tmp ls_line skip_lookback local escape_char escaped_input expected_input skip_input_regex right_pad erasable_line seek_sec local pl_state_path pl_state_dir pl_state_file tmpstr - local new_random pl_seed_path seed_num seed_file fmt first_play + local new_random pl_seed_path seed_num seed_file fmt first_play repeat1 local -a buttons button_map ids tags tmp_tags initial_ls ls_lines paths local -A button_i local -i i j volume scrolled id_count line_int skip_start pre_j_count head_count skip_lookback @@ -743,6 +741,7 @@ beetag() { scrolled=999 # more than any $LINES ### begin arg processing ### random=false + repeat1=false new_random=false case $1 in -r) @@ -807,10 +806,15 @@ beetag() { fi # PijokVipiotOzeph is just a random string for a delimiter + # shellcheck disable=SC2016 # false positive fmt='%ifdef{rating,$rating }'"$fstring"'$genre | $title - $artist - $album $length $id PijokVipiotOzeph $path' # shellcheck disable=SC2016 # obvious reason tmpstr=$(beet ls -f "$fmt" "$@" | { if $random; then sort -R --random-source=$pl_seed_path; else cat; fi; } ) mapfile -t initial_ls <<<"$tmpstr" + if [[ ! ${initial_ls[0]} ]]; then + echo "beetag: error: no result from beet ls $*" + return 1 + fi id_count=${#initial_ls[@]} for line in "${initial_ls[@]}"; do path="${line#*PijokVipiotOzeph }" @@ -965,6 +969,15 @@ beetag() { echo volume=$volume continue ;; + ']') + if $repeat1; then + repeat1=false + else + repeat1=true + fi + echo repeat1=$repeat1 + continue + ;; q) kill-bg-quiet return @@ -1131,10 +1144,12 @@ beetag() { fi fi done - if (( j < id_count - 1 )); then - j+=1 - else - j=0 + if ! $repeat1; then + if (( j < id_count - 1 )); then + j+=1 + else + j=0 + fi fi if [[ $playlist ]]; then echo $j >$pl_state_path @@ -1295,7 +1310,7 @@ btrbk-date-sed() { done } jrbtrbk() { - jr -u btrbk-run -u btrbk -u switch-mail-host -u btrbk-spread "$@" + jr -u btrbk-run -u btrbk -u switch-mail-host "$@" } # internal function @@ -1333,13 +1348,15 @@ btrbk-host-debug() { mkdir -p /tmp/b/s for host in $remote $alt; do - # this takes a while, we only want to do it on 1st run - if [[ -s /tmp/b/$host.log ]]; then continue; fi - ssh $host journalctl -u btrbk-run -u btrbk -u switch-mail-host -u btrbk-spread >/tmp/b/$host.log + h=$(ssh $host hostname) + rsync -a /var/log/btrbk $host:/var/log/btrbk /var/log/btrbk/$h + grr '\bsnapshot success' /var/log/btrbk/$h >/tmp/b/$h.log + + ## this takes a while, we only want to do it on 1st run + # if [[ -s /tmp/b/$host.log ]]; then continue; fi + # ssh $host journalctl -u btrbk-run -u btrbk -u switch-mail-host >/tmp/b/$host.log done - if [[ ! -s /tmp/b/local.log ]]; then - jrbtrbk >/tmp/b/local.log - fi + gr '\bsnapshot success' /var/log/btrbk/*.log >/tmp/b/local.log cd /tmp/b for f in *.log; do gr '\bsnapshot success' $f >s/$f @@ -1395,8 +1412,6 @@ bbk() { # btrbk wrapper return 1 ;; esac - # run latest - install-my-scripts # todo: consider changing this to srun and having the args come # from a file like /etc/default/btrbk, like is done in exim s jdo btrbk-run "$@" @@ -1603,7 +1618,6 @@ sm() { # switch mail host if [[ ! $tmp ]]; then s ssh-add /root/.ssh/home fi - install-my-scripts s jdo switch-mail-host "$@" return $ret } @@ -1628,7 +1642,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}) + 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="-ahviSAXPH --specials --devices --delete --relative --exclude-from=/p/c/li-rsync-excludes" ret=0 for h in li je bk; do @@ -1641,14 +1655,14 @@ lipush() { return $ret } bkpush() { # no emacs. for running faster. - p=(/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="-ahviSAXPH --specials --devices --delete --relative --exclude-from=/p/c/li-rsync-excludes" ret=0 m rsync "$@" $a ${p[@]} /p/c/machine_specific/bk root@bk.b8.nz:/ || ret=$? return $ret } jepush() { # no emacs. for running faster. - p=(/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="-ahviSAXPH --specials --devices --delete --relative --exclude-from=/p/c/li-rsync-excludes" ret=0 m rsync "$@" $a ${p[@]} /p/c/machine_specific/je root@je.b8.nz:/ || ret=$? @@ -1659,7 +1673,7 @@ bindpush() { dsign iankelling.org expertpathologyreview.com zroe.org amnimal.ninja lipush for h in li bk; do - m sl $h <<'EOF' + m sl $h.b8.nz <<'EOF' source ~/.bashrc m dnsup EOF @@ -2104,7 +2118,7 @@ rename-test() { feh() { # F = fullscren, z = random, Z = auto zoom - command feh -FzZ "$@" + command feh --auto-rotate -FzZ "$@" } @@ -2155,7 +2169,7 @@ hstatus() { wlog() { local day i days_back days_back=${1:-16} - for (( i=0; i=0; i-- )); do day=$( date +%F -d @$((EPOCHSECONDS - 86400*i )) ) date "+%a %b %d" -d @$((EPOCHSECONDS - 86400*i )) | tr '\n' ' ' /a/opt/timetrap/bin/t d -ftotal -s $day -e $day all -m '^w|lunch$' @@ -2217,7 +2231,7 @@ arb5() { arbtt-dump -l 30 -t json | jq -r '.[] | [ ( .inactive / 1000 | floor ) , ( .windows[] | select (.active == true) |.title) ] | @tsv' \ | tac | while read -r sec l; do if (( i % 6 == 0 && i >= 2 )); then - echo == $(( i / 6 + 1 )) == + echo "## $(( i / 6 + 1 )) ##" fi if (( sec > 10 )); then printf "%3d %s\n" $sec "$l" @@ -2238,19 +2252,22 @@ idea() { } ilogs-local() { - cd /var/lib/znc/moddata/log/iank/freenode/ - hr - for x in "#$1/"*; do - base=${x##*/} - files=() - for f in $@; do - tmp=\#$f/$base - if [[ -e $tmp ]]; then - files+=(\#$f/$base) - fi - done - sed \"s/^./${base%log}/\" ${files[@]}|sort -n + d=/var/lib/znc/moddata/log/iank/ + for n in freenode libera; do + cd $d/$n hr + for x in "#$1/"*; do + base=${x##*/} + files=() + for f in $@; do + tmp=\#$f/$base + if [[ -e $tmp ]]; then + files+=(\#$f/$base) + fi + done + sed \"s/^./${base%log}/\" ${files[@]}|sort -n + hr + done done } ilogs() { @@ -2263,7 +2280,11 @@ ilog-local() { chan="$1" d=/var/lib/znc/moddata/log/iank/ for n in freenode libera; do - cd $d$n/"$chan" && hr + if [[ ! -d $d$n/"$chan" ]]; then + continue + fi + cd $d$n/"$chan" + hr for x in *; do echo $x; sed "s/^./${x%log}/" $x; hr; done @@ -2298,11 +2319,6 @@ ccomp xdg-open o # jr() { journalctl "$@" | jfilter | less ; } # jrf() { journalctl -n 200 -f "$@" | jfilter; } -jr() { journalctl "$@" ; } -jrf() { journalctl -n 200 -f "$@" ; } - - -ccomp journalctl jtail jr jrf ## old version for model01. i need to get that firmware working again. # kff() { # keyboardio firmware flash. you must hold down the tilde key @@ -2333,26 +2349,144 @@ wgkey() { umask $umask_orig } +declare -A vpn_ips +vpn_ips[kd]=2 +# note: 1, 4, 5 are occupied by mail wireguard +vpn_ips[x3]=8 +vpn_ips[sy]=12 +vpn_ips[x2]=13 +vpn_ips[kw]=27 +vpn_ips[bo]=28 +vpn_ips[frodo]=34 + +vpn-ips-update() { + local host ipsuf f files + for host in ${!vpn_ips[@]}; do + ipsuf=${vpn_ips[$host]} + wghole $host $ipsuf + u /a/bin/ds/machine_specific/$host/filesystem/etc/systemd/system/openvpn-client-tr@.service < 3 )); then e expected 2-3 arg of hostname, ip suffix, and extrahost >&2 return 1 fi - local host ipsuf umask_orig + local host ipsuf umask_orig vpn_allowed host=$1 ipsuf=$2 if [[ $3 ]]; then extrahost=,$3 fi + for vpn_host in ${!vpn_ips[@]}; do + if [[ $vpn_host == "$host" ]]; then + continue + fi + vpn_allowed+=",10.174.${vpn_ips[$vpn_host]}.2/32" + done mkdir -p /p/c/machine_specific/$host/filesystem/etc/wireguard ( cd /p/c/machine_specific/$host/filesystem/etc/wireguard umask_orig=$(umask) umask 0077 - wg genkey | tee hole-priv.key | wg pubkey > hole-pub.key + if [[ ! -s hole-priv.key || ! -s hole-pub.key ]]; then + wg genkey | tee hole-priv.key | wg pubkey > hole-pub.key + fi cat >wghole.conf </dev/null; then + sudo -v + fi if [[ $1 == /* ]]; then base=${1##*/} fs_file=$1 @@ -2640,6 +2778,22 @@ myirc() { # use * instead of -r since that does sorted order ssh root@iankelling.org "for f in ${d[*]}; do cd \$f/#$1; grep '\ 15 )); then + i=$(( logcount - 15 )) + else + i=0 + fi + min_date=$(date -d 'monday 2 weeks ago' +%s) + for (( ; i < logcount; i++ )); do + log=${logs[$i]} + d=$(date -d "$(head -n1 $log|awk '{print $1}')" +%s) + if (( d < min_date )); then + continue + fi + if awk '$3 == "iank:"' $log | sed -r 's/^(.{10}).(.{8})[^ ]+(.*)/\1_\2\3/' | grep .; then + hr + fi + done + popd +} + +# tail pms in the last day, for the case where we restart profanity and +# didn't check for pms beforehand. +profrecent() { + 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)" ) + for d in /d/p/profanity/chatlogs/iank_at_fsf.org/!(rooms); do + files=() + for date in ${dates[@]}; do + f=$d/$date.log + if [[ -e $f ]]; then + files+=($f) + fi + done + if (( ${#files[@]} >= 1 )); then + cat ${files[@]} | tail + hr + fi + done } + # usage: debvm DEBIAN_VERSION RAM_MB debvm() { local ver ram fname src @@ -3181,7 +3377,7 @@ enn() { s $ecmd "$@" return fi - pid=$(pgrep -f "/usr/sbin/exim4 -bd -q30m -C /etc/exim4/my.conf"|h1) + pid=$(pgrep -f "/usr/sbin/exim4 -bd -q10m -C /etc/exim4/my.conf"|h1) m s nsenter -t $pid -n -m $ecmd "$@" } @@ -3260,7 +3456,7 @@ mailnnbash() { eximbash() { local pid - pid=$(pgrep -f "/usr/sbin/exim4 -bd -q30m -C /etc/exim4/my.conf"|h1) + pid=$(pgrep -f "/usr/sbin/exim4 -bd -q10m -C /etc/exim4/my.conf"|h1) if [[ ! $pid ]]; then echo "eximbash: failed to find exim pid. systemctl -n 30 status exim4:" systemctl status exim4 @@ -3473,6 +3669,7 @@ calvis() { # calendar visualize install -m 600 /dev/null /tmp/calendar-bytes while read -r l; do for char in $l; do + # shellcheck disable=SC2059 # intentional for the hex formatting printf "\x$(printf "%x" $char)" >>/tmp/calendar-bytes done done < <(grep -v '[#-]' /p/calendar-data) @@ -3509,7 +3706,61 @@ monero() { # rg my main files rgm() { - rg "$@" /p/pd.org /p/w.org /a/t.org /a/work.org /b + rg "$@" /p/w.org /a/t.org /a/work.org /b +} + +# 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 -m 5 -- "$*" $paths /a/t.org /p/w.org /a/work.org ||: +} + +# setup: +# pip3 install linode-cli +# linode-cli +livp9() { + local input ip id tmp + input=$1 + if [[ $2 ]]; then + id=$2 + ip=$3 + else + tmp=$(mktemp) + echo $tmp + linode-cli --json --pretty linodes create --root_pass loxHuceygomGisun | tee $tmp + read -r ip id <<<"$(tail -n+2 $tmp | jq -r '.[0].ipv4[0] , .[0].id')" + for string in $ip $id; do + case $string in + [0-9]*) : ;; + *) + echo "livp9: bad value ip=$ip id=$id input=$input" + return 1 + ;; + esac + done + rm $tmp + + while true; do + if timeout 4 ssh $ip :; then + break + fi + sleep 3 + done + fi + ssh $ip </dev/null; then # --no-messages because of annoying errors on broken symlinks # -z = search .gz etc files - # -. = search dotfilesq + # -. = search dotfiles rg() { command rg -. -z --no-messages -L -i -M 900 --no-ignore-parent --no-ignore-vcs -g '!.git' -g '!auto-save-list' -g '!.savehist' "$@" || return $?; } #fails if not exist. ignore complete -r rg 2>/dev/null ||: @@ -3628,7 +3879,68 @@ else alias rg=grr fi +# rg with respecting vcs ignore files +rgv() { + ret=0 + # -. = search dotfiles + # -z = search zipped files + # -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=$? + return $ret +} + +amall() { + echo "$(tput setaf 5 2>/dev/null ||:)█ coresite █$(tput sgr0 2>/dev/null||:)" + amfsf "$@" + echo "$(tput setaf 5 2>/dev/null ||:)█ office █$(tput sgr0 2>/dev/null||:)" + amoffice "$@" +} +amallq() { # amall quiet + amfsf "$@" + amoffice "$@" +} +amfsf() { + sedi -r '/alertmanager.url/s/@prom.office/@prom/' ~/.config/amtool/config.yml + amtool "$@" +} +amoffice() { + sedi -r '/alertmanager.url/s/@prom.fsf/@prom.office.fsf/' ~/.config/amtool/config.yml + amtool "$@" +} +amls() { + amall silence query "$@" +} +# amtool silence add +amsa() { + amall silence add "$@" +} +# amtool silence force +amsf() { + amall silence add x!="1" +} +amrmall() { + # note: not sure if quoting of this arg is correct + amfsf silence expire "$(amfsf silence query -q)" + amoffice silence expire "$(amoffice silence query -q)" +} + +youtube-dl-update() { + sudo wget https://yt-dl.org/downloads/latest/youtube-dl -O /usr/local/bin/youtube-dl + sudo chmod a+rx /usr/local/bin/youtube-dl +} + +# https://github.com/yt-dlp/yt-dlp/wiki/Installation +yt-dlp-update() { + sudo curl -L https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp -o /usr/local/bin/yt-dlp + sudo chmod a+rx /usr/local/bin/yt-dlp # Make executable +} + +mpvyt() { + mpv --ytdl ytdl_path=/usr/local/bin/yt-dlp "$@" +} # taken from default changes to bashrc and bash_profile path-add --end --ifexists $HOME/.rvm/bin