# 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 "$@"
}
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 domain path input err repo_dir dir url_dir url
repo_dir="$1"
domain="$2"
shift 2
fi
case $input in
http*)
- path="$repo_dir/${input##https://$domain/wiki/}"
+ path="$repo_dir/${input##http*://"$domain"/wiki/}"
if [[ $path == */ ]]; then
path=${path%/}.mdwn
fi
;;
*)
path=$(fp "$input")
- url="https://$domain/wiki/${path#$repo_dir/}"
+ url_dir=$(echo "$path" | sed -r "s,^$repo_dir/,,")
+ url="https://$domain/wiki/$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
# 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
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
# 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
scrolled=999 # more than any $LINES
### begin arg processing ###
random=false
+ repeat1=false
new_random=false
case $1 in
-r)
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 }"
echo volume=$volume
continue
;;
+ ']')
+ if $repeat1; then
+ repeat1=false
+ else
+ repeat1=true
+ fi
+ echo repeat1=$repeat1
+ continue
+ ;;
q)
kill-bg-quiet
return
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
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 -u btrbk-spread >/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
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
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=$?
feh() {
# F = fullscren, z = random, Z = auto zoom
- command feh -FzZ "$@"
+ command feh --auto-rotate -FzZ "$@"
}
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"
}
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() {
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
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 <<EOF
+[Unit]
+Description=OpenVPN tunnel for %I
+After=syslog.target network-online.target
+Wants=network-online.target
+Documentation=man:openvpn(8)
+Documentation=https://community.openvpn.net/openvpn/wiki/Openvpn24ManPage
+Documentation=https://community.openvpn.net/openvpn/wiki/HOWTO
+Requires=iptables.service
+
+[Service]
+Type=notify
+RuntimeDirectory=openvpn-client
+RuntimeDirectoryMode=0710
+WorkingDirectory=/etc/openvpn/client
+ExecStart=/usr/sbin/openvpn --suppress-timestamps --nobind --config /etc/openvpn/client/%i.conf
+# todo, try reenabling this from the default openvpn,
+# it was disabled so we could do bind mounts as a command,
+# but now systemd handles it
+#CapabilityBoundingSet=CAP_IPC_LOCK CAP_NET_ADMIN CAP_NET_RAW CAP_SETGID CAP_SETUID CAP_SYS_CHROOT CAP_DAC_OVERRIDE
+LimitNPROC=10
+# DeviceAllow=/dev/null rw
+# DeviceAllow=/dev/net/tun rw
+
+# we use .1 to make this be on a different network than kd, so that we can
+# talk to transmission on kd from remote host, and still use this
+# vpn.
+ExecStartPre=/usr/bin/flock -w 20 /tmp/newns.flock /a/bin/newns/newns -n 10.174.$ipsuf start %i
+ExecStartPre=/sbin/iptables-restore /a/bin/distro-setup/transmission-firewall/netns.rules
+# allow wireguard network to connect
+ExecStartPre=/usr/sbin/ip r add 10.8.0.0/24 via 10.174.$ipsuf.1 dev veth1-client
+ExecStopPost=/usr/bin/flock -w 20 /tmp/newns.flock /a/bin/newns/newns stop %i
+PrivateNetwork=true
+BindReadOnlyPaths=/etc/tr-resolv:/run/systemd/resolve:norbind /etc/basic-nsswitch:/etc/resolved-nsswitch:norbind
+
+[Install]
+WantedBy=multi-user.target
+EOF
+ done
+
+ {
+ for host in ${!vpn_ips[@]}; do
+ ipsuf=${vpn_ips[$host]}
+ cat <<EOF
+local-data-ptr: "10.2.0.$ipsuf $host.b8.nz"
+EOF
+ done
+ } | u /b/ds/ptr-data
+
+ {
+ for host in ${!vpn_ips[@]}; do
+ ipsuf=${vpn_ips[$host]}
+ cat <<EOF
+$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
+EOF
+ done
+ } | cedit vpn-ips-update /p/c/machine_specific/vps/bind-initial/db.b8.nz ||:
+
+
+ echo checking for stray files:
-# extrahost is a host/cidr that is allowed to go be routed through the vpn by this host.
+ initial_dir=$PWD
+ cd /a/bin/ds/machine_specific
+ ngset
+ files=( */filesystem/etc/systemd/system/openvpn-client-tr@.service )
+ ngreset
+ cd $initial_dir
+ for f in "${files[@]}"; do
+ host=${f%%/*}
+ if [[ ! ${vpn_ips[$host]} ]]; then
+ e /a/bin/ds/machine_specific/$host/filesystem/etc/systemd/system/openvpn-client-tr@.service
+ fi
+ done
+
+ cd /p/c/machine_specific
+ ngset
+ files=( */filesystem/etc/wireguard/wghole.conf )
+ ngreset
+ cd $initial_dir
+ for f in "${files[@]}"; do
+ host=${f%%/*}
+ if [[ ! ${vpn_ips[$host]} ]]; then
+ e /p/c/machine_specific/$host/filesystem/etc/wireguard/wghole.conf
+ e cedit -s $host /p/c/machine_specific/li/filesystem/etc/wireguard/wgmail.conf '<<<""'
+ fi
+ done
+}
+
+# usage host ipsuf [extrahost]
+#
+# If the keys already exist and you want new ones, remove them:
+# rm /p/c/machine_specific/$host/filesystem/etc/wireguard/hole-{priv,pub}.key
#
+# extrahost is a host/cidr that is allowed to go be routed through the
+# vpn by this host.
wghole() {
if (( $# < 2 || $# > 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 <<EOF
[Interface]
# contents hole-priv.key
Address = 10.8.0.$ipsuf/24
# https://dev.to/tangramvision/what-they-don-t-tell-you-about-setting-up-a-wireguard-vpn-1h2g
# ||: makes the systemd service not fail due to the failed command
-PostUp = ping -c1 10.8.0.1 ||:
+PostUp = ping -w10 -c1 10.8.0.1 ||:
[Peer]
# li. called wgmail on that server
PublicKey = CTFsje45qLAU44AbX71Vo+xFJ6rt7Cu6+vdMGyWjBjU=
-AllowedIPs = 10.8.0.0/24$extrahost
+AllowedIPs = 10.8.0.0/24$vpn_allowed$extrahost
Endpoint = 72.14.176.105:1194
PersistentKeepalive = 25
EOF
cedit -q $host /p/c/machine_specific/li/filesystem/etc/wireguard/wgmail.conf <<EOF || [[ $? == 1 ]]
[Peer]
PublicKey = $(cat hole-pub.key)
-AllowedIPs = 10.8.0.$ipsuf/32
+AllowedIPs = 10.8.0.$ipsuf/32,10.174.${vpn_ips[$host]}.2/32
EOF
)
}
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)
# 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 ||:
+}
+
+# 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 <<EOF
+apt-get -qq update
+apt-get -qq -y install ffmpeg rsync
+mkdir vp9
+EOF
+ m rsync $input $ip:
+ m ssh $ip ffmpeg -nostdin -hide_banner -loglevel error -i $input -g 192 -vcodec libvpx-vp9 -vf scale=-1:720 -max_muxing_queue_size 9999 -b:v 750K -pass 1 -an -f null /dev/null
+ m ssh $ip ffmpeg -nostdin -hide_banner -loglevel error -y -i $input -g 192 -vcodec libvpx-vp9 -tile-rows 2 -vf scale=-1:720 -max_muxing_queue_size 9999 -b:v 750K -pass 2 -c:a libvorbis -qscale:a 5 vp9/$input
+ rsync $ip:vp9/$input vp9
+ linode-cli linodes delete $id
}
reset-konsole() {
if type -P rg &>/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 ||:
alias rg=grr
fi
+# rg with respecting vcs ignore files
+rgv() {
+ ret=0
+ command rg -. -z --no-messages -L -i -M 900 -g '!auto-save-list' -g '!.savehist' "$@" || ret=$?
+ return $ret
+}
# taken from default changes to bashrc and bash_profile