X-Git-Url: https://iankelling.org/git/?a=blobdiff_plain;f=brc2;h=0211a643258562b3dbd5f52284826a0a5c676cb1;hb=dc34d23c63cd83a7cc7a79525445aad3293c7241;hp=676c5973a760a2c7936cd24c901336a8f09b2727;hpb=b186607514fbcf10bd5664ccb759a6e873f048c7;p=distro-setup diff --git a/brc2 b/brc2 index 676c597..0211a64 100644 --- a/brc2 +++ b/brc2 @@ -390,24 +390,49 @@ astudio() { /a/opt/android-studio/bin/studio.sh "$@" & r } -# convert brains path to url -# /f/brains/sysadmin/interns/2022/nick_shrader/intro_blog_post.mdwn -# becomes -# https://brains.fsf.org/wiki/sysadmin/interns/2022/nick_shrader/intro_blog_post -iki() { - local url path +# Convert brains file path to url and vice versa +# usage: brains [URL_OR_PATH] +brains() { + _iki-convert /f/brains brains.fsf.org "$@" +} +glue() { + _iki-convert /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 + repo_dir="$1" + domain="$2" + shift 2 + err=false + if $err; then + return 1 + fi if [[ $1 ]]; then - path="$*" + input="$*" else - read -r -p "enter path" path + read -r -p "enter path or url"$'\n' input fi - url=$(readlink -f "$path") - url="https://brains.fsf.org/wiki/${url#*brains/}" - url="${url%.mdwn}" - echo "$url" - + case $input in + http*) + path="$repo_dir/${input##http*://$domain/wiki/}" + if [[ $path == */ ]]; then + path=${path%/}.mdwn + fi + j printf "%s\n" "$path" + ;; + *) + path=$(fp "$input") + url="http*://$domain/wiki/${path#$repo_dir/}" + url="${url%.mdwn}/" + j echo "$url" + ;; + esac } + # Generate beet smartplaylists for navidrome. # for going in the reverse direction, run # /b/ds/navidrome-playlist-export @@ -668,7 +693,7 @@ beetag() { 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 -a pl_tags buttons button_map ids tags tmp_tags initial_ls ls_lines paths + 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 local -i overflow_lines overflow @@ -729,9 +754,9 @@ beetag() { fi pl_state_dir=/i/info/pl-state if [[ $playlist ]]; then - pl_state_dir=$pl_state_dir/nopl - else pl_state_dir=$pl_state_dir/$playlist + else + pl_state_dir=$pl_state_dir/nopl fi pl_state_path=$pl_state_dir/$pl_state_file pl_seed_path=$pl_state_dir/$seed_file @@ -742,8 +767,6 @@ beetag() { { base64 < /dev/urandom | head -c 200 ||:; echo; } > $pl_seed_path fi - - # PijokVipiotOzeph is just a random string for a delimiter fmt='%ifdef{rating,$rating }'"$fstring"'$genre | $title - $artist - $album $length $id PijokVipiotOzeph $path' # shellcheck disable=SC2016 # obvious reason @@ -1112,6 +1135,8 @@ beet2nav() { # pull in beets library locally beetpull() { + local sshfs_host + sshfs_host=b8.nz if [[ $HOSTNAME == kd ]]; then return 0 fi @@ -1120,7 +1145,7 @@ beetpull() { s chown iank:iank /i fi if ! mountpoint /i &>/dev/null; then - m sshfs b8.nz:/i /i + m sshfs $sshfs_host:/i /i fi } @@ -1200,6 +1225,109 @@ beegenre() { rm $tmpf } +# prettify the date +btrbk-date() { + local indate + indate="$1" + shift + date +%F_%T%:::z -d "$(sed -r 's/(.{4})(..)(.{5})(..)(.*)/\1-\2-\3:\4:\5/' <<<"$indate")" "$@" +} +btrbk-undate() { + # fudCaHougfirp is a random string + { if [[ $1 ]]; then + echo "$1" + else + cat + fi + } | sed -r 's/-0([45])( |$)/fudCaHougfirp0\100/;s/_/T/;s/[:-]//g;s/fudCaHougfirp/-/' + +} +btrbk-date-sed() { + local line + while read -r line; do + if [[ $line == *20[0-9][0-9][0-9][0-9][0-9][0-9]T[0-9][0-9][0-9][0-9][0-9][0-9]-0[45]00* ]]; then + pre="${line%%20[0-9][0-9][0-9][0-9][0-9][0-9]T[0-9][0-9][0-9][0-9][0-9][0-9]-0[45]00*}" + post="${line##*20[0-9][0-9][0-9][0-9][0-9][0-9]T[0-9][0-9][0-9][0-9][0-9][0-9]-0[45]00}" + mid="${line:${#pre}:22}" + echo "$pre$(btrbk-date "$mid")$post" + else + echo "$line" + fi + done +} +jrbtrbk() { + jr -u btrbk-run -u btrbk -u switch-mail-host -u btrbk-spread "$@" +} + +# internal function +btrbk-host-debug-show-host() { + for f; do + snaphost= + for host in $remote $alt local; do + if line=$(grep -P "\S*$f" /tmp/b/s/$host.log); then + if [[ $snaphost ]]; then + e error: snaphost=$snaphost, host=$host line="$line" + fi + if [[ $line == ssh* ]]; then + tmp="${line#ssh://}" + snaphost="${tmp%%/*}" + else + snaphost=$host + fi + fi + done + echo $snaphost $f | btrbk-date-sed + done +} + +# If we get a btrfs receive error like this: +# ERROR: ... clone: did not find source subvol +# running this command will help track down the problem. +# Alter remote= and alt=. When I used it, remote is +# the host having the error when I push a snapshot. +# Alt is just the other host that takes snapshots +# besides the local host. +btrbk-host-debug() { + + remote=b8.nz + alt=sywg.b8.nz + + mkdir -p /tmp/b/s + for host in $remote $alt; do + 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 + 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 + done + cd /mnt/root/btrbk + localq=(q.*) + declare -A localq_a + for f in "${localq[@]}"; do + localq_a[$f]=t + done + + remoteq=() + for f in $(ssh $remote "cd /mnt/root/btrbk; echo q.*"); do + if [[ ! ${localq_a[$f]} ]]; then + remoteq+=($f) + fi + done + btrbk-host-debug-show-host "${localq[@]}" + if (( ${#remoteq[@]} >= 1 )); then + echo "=== $remote only ====" + btrbk-host-debug-show-host ${remoteq[@]} + fi + +} + # note, to check for glue records # First, find some the .org nameservers: # dig +trace iankelling.org @@ -1434,7 +1562,7 @@ sm() { # switch mail host c / # run latest keyhash=$(s ssh-keygen -lf /root/.ssh/home | awk '{print $2}') - tmp=$(s ssh-add -l | awk '$2 == "'$keyhash'"') + tmp=$(s ssh-add -l | awk '$2 == "'$keyhash'"' ||:) if [[ ! $tmp ]]; then s ssh-add /root/.ssh/home fi @@ -1562,7 +1690,11 @@ dsign() { # set day start for use in other programs. # expected to do be in a format like 830, or 800 or 1300. ds() { - echo $1 >/b/data/daystart + if [[ $1 ]]; then + echo $1 >/b/data/daystart + else + cat /b/data/daystart + fi } #### begin bitcoin related things @@ -2163,14 +2295,21 @@ wgkey() { wg genkey | tee $name-priv.key | wg pubkey > $name-pub.key umask $umask_orig } + + +# extrahost is a host/cidr that is allowed to go be routed through the vpn by this host. +# wghole() { - if (( $# != 2 )); then - e expected 2 arg of hostname, ip suffix >&2 + if (( $# < 2 || $# > 3 )); then + e expected 2-3 arg of hostname, ip suffix, and extrahost >&2 return 1 fi local host ipsuf umask_orig host=$1 ipsuf=$2 + if [[ $3 ]]; then + extrahost=,$3 + fi mkdir -p /p/c/machine_specific/$host/filesystem/etc/wireguard ( cd /p/c/machine_specific/$host/filesystem/etc/wireguard @@ -2190,7 +2329,7 @@ PostUp = ping -c1 10.8.0.1 ||: [Peer] # li. called wgmail on that server PublicKey = CTFsje45qLAU44AbX71Vo+xFJ6rt7Cu6+vdMGyWjBjU= -AllowedIPs = 10.8.0.0/24 +AllowedIPs = 10.8.0.0/24$extrahost Endpoint = 72.14.176.105:1194 PersistentKeepalive = 25 EOF @@ -2457,7 +2596,7 @@ mpvs() { myirc() { if [[ ! $1 ]]; then - set -- fsf-office + set -- fsfsys fi local -a d d=( /var/lib/znc/moddata/log/iank/{freenode,libera} ) @@ -2573,9 +2712,17 @@ otp() { oathtool --totp -b "$*" | xclip -selection clipboard } j() { - "$@" |& pee "xclip -r -selection clipboard" + "$@" |& pee "xclip -r -selection clipboard" cat } +# x copy +xc() { + xclip -r -selection clipboard +} +# echo copy +ec() { + pee "xclip -r -selection clipboard" cat +} pakaraoke() { # from http://askubuntu.com/questions/456021/remove-vocals-from-mp3-and-get-only-instrumentals @@ -2954,7 +3101,12 @@ tm() { (sleep "$(calc "$* * 60")" && mpv --no-config --volume 50 /a/bin/data/alarm.mp3) > /dev/null 2>&1 & } +## usage: to connect to my main transmission daemon from a different host, run this +trans-remote-route() { + : +} trg() { transmission-remote-gtk & r; } +# TODO: this wont work transmission.lan doesnt exist trc() { # example, set global upload limit to 100 kilobytes: # trc -u 100 @@ -3159,6 +3311,17 @@ fixu() { fi } +# unmute +um() { + pactl set-sink-mute @DEFAULT_SINK@ false + rm -f /tmp/ianknap +} +nap() { + pactl set-sink-mute @DEFAULT_SINK@ true + touch /tmp/ianknap +} + + # systemctl is-enabled / status / cat says nothing, instead theres # some obscure symlink. paths copied from man systemd.unit. # possibly also usefull, but incomplete, doesnt show units not loaded in memory: @@ -3271,7 +3434,7 @@ wakehours() { calvis() { # calendar visualize install -m 600 /dev/null /tmp/calendar-bytes - while read l; do + while read -r l; do for char in $l; do printf "\x$(printf "%x" $char)" >>/tmp/calendar-bytes done @@ -3309,7 +3472,7 @@ 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 } reset-konsole() {