# * functions
+
+
multimic() {
local i
local -a sources
# 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 "$@"
}
# Convert brains file path to url and vice versa
# usage: brains [URL_OR_PATH]
brains() {
- _iki-convert '(/a)?/f/brains' brains.fsf.org "$@"
+ _iki-convert '(/a)?/f/brains' brains.fsf.org/wiki "$@"
}
glue() {
_iki-convert '(/a)?/f/gluestick' gluestick.office.fsf.org "$@"
# usage: $0 REPO_PATH [URL_OR_PATH]
_iki-convert() {
- local url domain path input err repo_dir dir url_dir url
+ 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
fi
case $input in
http*)
- path="$repo_dir/${input##http*://"$domain"/wiki/}"
+ path="$repo_dir/${input##http*://"$prefix"/}"
if [[ $path == */ ]]; then
path=${path%/}.mdwn
fi
*)
path=$(fp "$input")
url_dir=$(echo "$path" | sed -r "s,^$repo_dir/,,")
- url="https://$domain/wiki/$url_dir"
+ url="https://$prefix/$url_dir"
url="${url%.mdwn}/"
j echo "$url"
;;
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
# pull in beets library locally
beetpull() {
- local sshfs_host
+ local sshfs_host sshfs_cmd
sshfs_host=b8.nz
if [[ $HOSTNAME == kd ]]; then
return 0
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
}
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
## 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
+ # ssh $host journalctl -u btrbk-run -u btrbk -u switch-mail-host >/tmp/b/$host.log
done
gr '\bsnapshot success' /var/log/btrbk/*.log >/tmp/b/local.log
cd /tmp/b
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 "$@"
if [[ ! $tmp ]]; then
s ssh-add /root/.ssh/home
fi
- install-my-scripts
s jdo switch-mail-host "$@"
return $ret
}
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
}
gse() {
- local email=ian@iankelling.org
+ local email=iank@fsf.org
git send-email --notes "--envelope-sender=<$email>" \
--suppress-cc=self "$@"
}
wlog() {
local day i days_back
days_back=${1:-16}
- for (( i=0; i<days_back; i++ )); do
+ for (( i=days_back; 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$'
# 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
# use * instead of -r since that does sorted order
ssh root@iankelling.org "for f in ${d[*]}; do cd \$f/#$1; grep '\<iank.*' *; done" | cut --complement -c12-16
}
+
+
+allmyirc() {
+ local d
+ d=/var/lib/znc/moddata/log/iank/freenode
+ ssh root@iankelling.org "cd $d; find . -mtime -60 -type f -exec grep '\<iank.*' {} +" | sed -r 's,^..([^/]*)/(.{11})(.{5})(.{8}).,\2\4 \1,' | sort
+}
+
+# The way pidgin logs with xmpp (maybe related to running cheogram too)
+# is that there are sometimes duplicates, and sometimes the a log file
+# is for a specific day yet logs messages for subsequent days, and the
+# only way to realize that is to notice that the timestamps rolled over
+# into a new day, you can't see it in isolation. So, basically, pidgin
+# logs are really annoying to read a grep of my messages to find the
+# date and time I said when I started and stopped working, so I'm trying
+# out a new client: profanity.
mypidgin() {
c /p/c/.purple/logs/jabber/iank@fsf.org/office@conference.fsf.org.chat
for x in *.html; do html2text -o ${x%.html}.txt $x; done;
s/^[^ ]*\.txt:\((.{2}).(.{2}).(.{4}) (.{8}) (.{2})\)?/\3-\1-\2_\4_\5/' \
| sed -n 'x;1d;0~2{G;s/\n/ /;p};${x;p}'
}
-allmyirc() {
- local d
- d=/var/lib/znc/moddata/log/iank/freenode
- ssh root@iankelling.org "cd $d; find . -mtime -60 -type f -exec grep '\<iank.*' {} +" | sed -r 's,^..([^/]*)/(.{11})(.{5})(.{8}).,\2\4 \1,' | sort
+
+# my profanity
+#
+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 ))
+ else
+ i=0
+ fi
+ # 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)
+ 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. 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 +%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
#
# -t = get recipient from header
exim -d -t <<EOF
-From: root@$(hostname -f)
-To: root@$(hostname -f)
-Subject: test2
+From: ian@iankelling.org
+To: submit@b.b8.nz
+Subject: testbug1
+
+Package: test
+Version:1
This is a test message.
EOF
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 "$@"
}
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
# 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 \
-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 ||:
+ -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:
}
amall() {
- printf "$(tput setaf 5 2>/dev/null ||:)█ coresite █$(tput sgr0 2>/dev/null||:)"
+ echo "$(tput setaf 5 2>/dev/null ||:)█ coresite █$(tput sgr0 2>/dev/null||:)"
amfsf "$@"
- printf "$(tput setaf 5 2>/dev/null ||:)█ office █$(tput sgr0 2>/dev/null||:)"
+ echo "$(tput setaf 5 2>/dev/null ||:)█ office █$(tput sgr0 2>/dev/null||:)"
amoffice "$@"
}
amallq() { # amall quiet
amoffice "$@"
}
amfsf() {
- sedi -r '/alertmanager.url/s/@office//' ~/.config/amtool/config.yml
+ sedi -r '/alertmanager.url/s/@prom.office/@prom/' ~/.config/amtool/config.yml
amtool "$@"
}
amoffice() {
- sedi -r '/alertmanager.url/s/@fsf/@office.fsf/' ~/.config/amtool/config.yml
+ 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() {
- amfsf silence expire $(amfsf silence query -q)
- amoffice silence expire $(amoffice silence query -q)
+ # 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
# 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