X-Git-Url: https://iankelling.org/git/?a=blobdiff_plain;f=brc2;h=891e0953b668e7e69d847f54e5f4ad24f768fff5;hb=165008e5b82c81ebff1061c8f8294c3bc6e9dced;hp=bff0eb755462d8ee91cd3f31cda1ac340e84db73;hpb=2f7b266e782347022b68c5c8e8fbe9292492c343;p=distro-setup diff --git a/brc2 b/brc2 index bff0eb7..891e095 100644 --- a/brc2 +++ b/brc2 @@ -29,7 +29,6 @@ export WCDHOME=/a source /a/bin/distro-functions/src/identify-distros source /a/bin/distro-functions/src/package-manager-abstractions source /a/bin/log-quiet/logq-function -source /a/bin/small-misc-bash/psg-function # for x in /a/bin/bash_unpublished/source-!(.#*); do echo source $x; done source /a/bin/bash_unpublished/source-semi-priv source /a/bin/bash_unpublished/source-state @@ -54,6 +53,21 @@ anki() { fi } +acat() { + shopt -s nullglob + hrcat /m/md/alerts/new/* /m/md/alerts/cur/* + shopt -u nullglob +} +aclear() { + shopt -s nullglob + files=(/m/md/alerts/new/* /m/md/alerts/cur/*) + if (( ${#files[@]} )); then + rm -f ${files[@]} + fi + shopt -u nullglob + system-status _ +} + ap() { # pushd in case current directory has an ansible.cfg file pushd /a/xans >/dev/null @@ -78,8 +92,24 @@ astudio() { /a/opt/android-studio/bin/studio.sh "$@" &r; } +bindpush() { + lipush || return 1 + for h in li l2; do + sl $h <<'EOF' || return 1 +set -e +conflink +f=/var/lib/bind/db.b8.nz +ser stop bind9 +sudo rm -fv $f.jnl +sudo install -m 644 -o bind -g bind /p/c/machine_specific/linode/bind-initial/db.b8.nz $f +ser restart bind9 +EOF + done +} bbk() { # btrbk wrapper + + local pid c / local active=true systemctl is-active btrbk.timer || active=false @@ -93,8 +123,15 @@ bbk() { # btrbk wrapper fi # run latest install-my-scripts - btrbk-run "$@" | pee cat "systemd-cat -t btrbk-run" - $active && ser enable btrbk.timer + jrun -p btrbk btrbk-run "$@" + if $active; then + if (( $ret )); then + echo bbk: WARNING: btrbk.timer not reenabled due to failure + else + ser enable btrbk.timer + fi + fi + return $ret } bfg() { java -jar /a/opt/bfg-1.12.14.jar "$@"; } @@ -103,30 +140,79 @@ bigclock() { xclock -digital -update 1 -face 'arial black-80:bold' } -bpull() { - [[ $1 ]] || return 1 - c / - # run latest - install-my-scripts - switch-mail-host $1 $HOSTNAME | pee cat "systemd-cat -t switch-mail-host" +_jrun() { # journal run. run args, log to journal, tail and grep the journal. + local pid pattern jr_pid sedscript cmd_name ended + ret=0 + case $1 in + -p) + pattern="$2\|" + shift 2 + ;; + esac + cmd_name=${1##*/} + systemd-cat -t "$cmd_name" "$@" 2>&1 & + pid=$! + sedscript="/$pattern$cmd_name/p;/^.{16}[^ ]+ $cmd_name\[$pid]: ([^ ]+ +)?exiting with status [0-9]+\$/q" + journalctl -S "4 seconds ago" -f |& sed -nr "$sedscript" 2>&1 & + jr_pid=$! + wait $pid 2>&1 || ret=$? + if (( $ret )); then + echo "$0: ERROR: $* returned $ret" + fi + jobs %'journalctl -S "4 seconds ago" -f' &>/dev/null + ended=false + # give it about 5 seconds to find the end of the log + for (( i=0; i<20; i++ )); do + if jobs %'journalctl -S "4 seconds ago" -f' &>/dev/null; then + sleep .3 2>&1 + else + ended=true + break + fi + done + if ! $ended; then + kill $jr_pid 2>&1 + fi } -bpush() { - [[ $1 ]] || return 1 +jrun() { + # ditching stderr avoids the jobs status change output. + _jrun "$@" 2>/dev/null +} + +sm() { + (( $# == 2 )) || return 1 + action=$1 + shift + host=$1 + shift + case $action in + pull|push) : ;; + *) return 1 ;; + esac c / # run latest install-my-scripts - switch-mail-host $HOSTNAME $1 | pee cat "systemd-cat -t switch-mail-host" + jrun -p btrbk switch-mail-host $action $host + return $ret } + lipush() { - rsync $@ --delete-excluded -ahviSAXPH --specials --devices --delete --relative \ - --exclude-from=/p/c/li-rsync-excludes /a/bin /a/exe /a/h /a/c /p/c/machine_specific/li /a/opt/{emacs,emacs-debianstable,mu} root@li:/ -} -lipushnoe() { - rsync $@ --delete-excluded -ahviSAXPH --specials --devices --delete --relative \ + # note, i had --delete-excluded, but that deletes all files in --exclude-from on + # the remote site, which doesn't make sense, so not sure why i had it. + local p a + p=(/a/bin /a/exe /a/h /a/c /p/c/machine_specific/linode{,.hosts} /a/opt/{emacs-debianstable,mu}) + a="-ahviSAXPH --specials --devices --delete --relative --exclude-from=/p/c/li-rsync-excludes" + ret=0 + m rsync "$@" $a ${p[@]} /p/c/machine_specific/l2 root@l2.b8.nz:/ || ret=$? + m rsync "$@" $a ${p[@]} /p/c/machine_specific/li root@li.b8.nz:/ || ret=$? + m rsync "$@" -ahviSAXPH root@iankelling.org:/a/h/proposed-comments/ /a/h/proposed-comments || ret=$? + return $ret +} +lipushnoe() { # noe = noemacs. for running faster. + rsync "$@" --delete-excluded -ahviSAXPH --specials --devices --delete --relative \ --exclude-from=/p/c/li-rsync-excludes /a/bin /a/exe /a/h /a/c /p/c/machine_specific/li root@li:/ } - #### begin bitcoin related things btc() { local f=/etc/bitcoin/bitcoin.conf @@ -196,14 +282,16 @@ chrome() { } -dat() { # do all tee, for more complex scripts - tee >(ssh frodo bash -l) >(bash -l) >(ssh x2 bash -l) >(ssh tp bash -l) +# do all tee. +# pipe to this, or just type like a shell +# todo: test this +dat() { + tee >(ssh frodo.b8.nz) >(ssh x2) >(ssh tp.b8.nz) >(ssh kw) >(ssh tp.b8.nz) } da() { # do all local host - "$@" - for host in x2 tp kd; do - ssh $host $(printf "") + for host in x2 kw tp.b8.nz x3.b8.nz frodo.b8.nz; do + ssh $host "$@" done } @@ -227,17 +315,26 @@ debian_pick_mirror () { sudo sed -ri "/http.us.debian.org/ s@( *[^ #]+ +)[^ ]+([^#]+).*@\1$url\2# http.us.debian.org@" /etc/apt/sources.list sudo apt-get update } +digme() { + digdiff @ns{1,2}.iankelling.org "$@" +} + dup() { local ran_d ran_d=false + system-status _ case $PS1 in - *DISTRO-BEGIN*) - /b/ds/distro-begin + *DISTRO-BEGIN!*|*DISTRO!*) + pushd / + /b/ds/distro-begin || return $? + popd ran_d=true ;;& - *DISTRO-END*) - /b/ds/distro-end + *DISTRO-END!*|*DISTRO!*) + pushd / + /b/ds/distro-end || return $? + popd ran_d=true ;;& *CONFLINK*) @@ -246,6 +343,7 @@ dup() { fi ;; esac + system-status _ } envload() { # load environment from a previous: export > file @@ -335,11 +433,15 @@ fdroid_pkgs=( fdup() { local -A installed updated local p - fdroidcl update + # tried putting this in go buildscript cronjob, + # but it failed with undefined: os.UserCacheDir. I expect its due to + # an environment variable missing, but its easier just to stick it here. + m go get -u mvdan.cc/fdroidcl || return 1 + m fdroidcl update if fdroidcl search -u | grep ^org.fdroid.fdroid; then fdroidcl install org.fdroid.fdroid sleep 5 - fdroidcl update + m fdroidcl update fi for p in $(fdroidcl search -i| grep -o "^\S\+"); do installed[$p]=true @@ -349,14 +451,14 @@ fdup() { done for p in ${fdroid_pkgs[@]}; do if ! ${installed[$p]:-false}; then - fdroidcl install $p + m fdroidcl install $p # sleeps are just me being paranoid since replicant has a history of crashing when certain apps are installed sleep 5 fi done for p in ${!installed[@]}; do if ! ${updated[$p]:-true}; then - fdroidcl install $p + m fdroidcl install $p sleep 5 fi done @@ -466,12 +568,10 @@ fw() { firefox -P default "$@" >/dev/null 2>&1 } - gitian() { git config user.email ian@iankelling.org } - # at least in flidas, things rely on gpg being gpg1 gpg() { command gpg2 "$@" @@ -486,7 +586,6 @@ gse() { --suppress-cc=self "$@" } - hstatus() { # do git status on published repos. c /a/bin/githtml @@ -502,11 +601,16 @@ hstatus() { done } - idea() { /a/opt/idea-IC-163.7743.44/bin/idea.sh "$@" &r } +ilog() { + chan=${1:-#fsfsys} + # use * instead of -r since that does sorted order + ssh root@iankelling.org "cd /var/lib/znc/moddata/log/iank/freenode/$chan && hr && for x in *; do echo \$x; cat \$x; hr; done" | less +G +} + o() { if type gvfs-open &> /dev/null ; then gvfs-open "$@" @@ -524,7 +628,7 @@ jtail() { journalctl -n 10000 -f "$@" | jfilter } jr() { journalctl "$@" | jfilter | less ; } -jrf() { journalctl -f "$@" | jfilter; } +jrf() { journalctl -n 200 -f "$@" | jfilter; } kff() { # keyboardio firmware flash @@ -590,32 +694,35 @@ mdt() { firefox /tmp/mdtest.html } - - mo() { xset dpms force off; } # monitor off +myirc() { + chan=${1:-fsf-office} + # use * instead of -r since that does sorted order + ssh root@iankelling.org "cd /var/lib/znc/moddata/log/iank/freenode/#$chan; grep '\= 3 )); then args+=("$1"); shift @@ -828,71 +968,86 @@ sl() { esac done remote="$1"; shift - old=false + if [[ ! $remote ]]; then + echo $0: error hostname required >&2 + return 1 + fi + dorsync=false + haveinfo=false tmpa=(/p/sshinfo/???????????"$remote") sshinfo=${tmpa[0]} if [[ -e $sshinfo ]]; then + haveinfo=true + fi + if $haveinfo; then tmp=${sshinfo[0]##*/} - info_date=${tmp::11} - type=${info_date: -1} - info_date=${info_date::10} - info_sec=$(date -d @$info_date +%s) - # debug - #e $(( $(stat -c%Y /b/ds/brc) - $(date -d @$info_date +%s) )) - if (( $(stat -c%Y /b/ds/brc) > info_sec || $(stat -c%Y /b/ds/.bashrc) > info_sec )); then - old=true + tmp2=${tmp::11} + type=${tmp2: -1} + if [[ $type == b ]]; then + info_sec=${tmp::10} + for f in /b/ds/sl/.iank/*; do + if (( $(stat -L -c%Y $f) > info_sec )); then + dorsync=true + rm -f $sshinfo + break + fi + done fi else # use this weird yes thing to ensure we know ssh succeeded - tmp=$(command ssh "${args[@]}" "$remote" "if test -e /p/sshinfo; then echo yes; fi") || return + if ! tmp=$(command ssh "${args[@]}" "$remote" "if test -e /a/bin/ds/.bashrc -a -L .bashrc; then echo yes; fi"); then + echo failed sl test. doing plain ssh -v + command ssh -v "${args[@]}" "$remote" + fi if [[ $tmp == yes ]]; then type=a else + dorsync=true type=b - old=true fi fi + if $dorsync; then + RSYNC_RSH="ssh ${args[*]}" rsync -rptL /b/ds/sl/.iank "$remote": + fi + if $dorsync || ! $haveinfo; then + sshinfo=/p/sshinfo/$now$type"$remote" + touch $sshinfo + chmod 666 $sshinfo + fi if [[ $type == b ]]; then - if $old; then - RSYNC_RSH="ssh ${args[*]}" rsync -rptL /b/ds/.iank "$remote": - rm -f $sshinfo - sshinfo=/p/sshinfo/$now$type"$remote" - touch $sshinfo - chmod 666 $sshinfo - fi if (( ${#@} )); then # Theres a couple ways to do this. im not sure whats best, # but relying on bash 4.4+ escape quoting seems most reliable. - - command ssh -t "${args[@]}" "$remote" "INPUTRC=.iank/.inputrc bash --rcfile .iank/.bashrc -c ${@@Q}" - # this way is bad - # command ssh -t "${args[@]}" "$remote" "printf \"%s; exit\" \"$*\" >.iank/brc2 - #INPUTRC=.iank/.inputrc bash --rcfile .iank/.bashrc" - + command ssh "${args[@]}" "$remote" \ + BRC=t bash -c '.\ .iank/.bashrc\;"\"\$@\""' bash ${@@Q} + elif [[ ! -t 0 ]]; then + # This case is when commands are being piped to ssh. + # Normally, no bashrc gets sourced. + # But, since we are doing all this, lets source it because we can. + cat <(echo . .iank/.bashrc) - | command ssh "${args[@]}" "$remote" BRC=t bash else - command ssh -t "${args[@]}" "$remote" "INPUTRC=.iank/.inputrc bash --rcfile .iank/.bashrc" + command ssh -t "${args[@]}" "$remote" BRC=t INPUTRC=.iank/.inputrc bash --rcfile .iank/.bashrc fi else - BASH_LOGIN_SHELL=true command ssh "$remote" "$@" + if [[ -t 0 ]]; then + BRC=t command ssh "${args[@]}" "$remote" ${@@Q} + else + command ssh "${args[@]}" "$remote" BRC=t bash + fi fi } sss() { # ssh solo - ssh -oControlMaster=no -oControlPath=/ "$@" + sl -oControlMaster=no -oControlPath=/ "$@" } # kill off old shared socket then ssh ssk() { - local -a opts=() - while [[ $1 == -* ]]; do - opts+=("$1") - shift - done - m pkill -f "^ssh: /tmp/ssh_mux_${USER}_${1#*@}_22_" - m ssh "${opts[@]}" "$@" + m ssh -O exit "$@" || [[ $? == 255 ]] + m sl "$@" } # plain limited ssh ssh() { - BASH_LOGIN_SHELL=true command ssh "$@" + BRC=t command ssh "$@" } @@ -1021,13 +1176,13 @@ vpn() { [[ $1 ]] || { echo need arg; return 1; } journalctl --unit=$vpn_service@$1 -f -n0 & - s systemctl start $vpn_service@$1 + sudo systemctl start $vpn_service@$1 # sometimes the ask-password agent does not work and needs a delay. sleep .5 # https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=779240 # noticed around 8-2017 after update from around stretch release # on debian testing, even though the bug is much older. - s systemd-tty-ask-password-agent + sudo systemd-tty-ask-password-agent } vpnoff() { @@ -1037,10 +1192,14 @@ vpnoff() { else local vpn_service=openvpn fi - s systemctl stop $vpn_service@$1 + sudo systemctl stop $vpn_service@$1 +} +vpnoffc() { # vpn off client + ser stop openvpn-nn@client +} +vpnc() { + ser start openvpn-nn@client } - - vspicy() { # usage: VIRSH_DOMAIN