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
/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
+s rm -fv $f.jnl
+s 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
c /
switch-mail-host $HOSTNAME $1 | pee cat "systemd-cat -t switch-mail-host"
}
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() {
+ # 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,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
# importprivkey will timeout if using the default of 15 mins.
# upped it to 1 hour.
bitcoin-cli -rpcclienttimeout=60000 -$(s grep rpcuser= $f) -$(s grep rpcpassword= $f) "$@"
}
-
btcusd() { # $1 btc in usd
local price
price="$(curl -s https://api.coinbase.com/v2/prices/BTC-USD/spot | jq -r .data.amount)"
printf "$%.2f\n" "$(echo "scale=10; $price * $1"| bc -l)"
fi
}
+#### end bitcoin related things
}
-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
+dat() {
+ tee >(ssh frodo.b8.nz bash -l) >(ssh x2 bash -l) >(ssh tp.b8.nz bash -l) >(ssh kw bash -l) >(ssh tp.b8.nz bash -l)
}
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
}
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
+ case $PS1 in
+ *DISTRO-BEGIN!*|*DISTRO!*)
+ /b/ds/distro-begin || return $?
+ ran_d=true
+ ;;&
+ *DISTRO-END!*|*DISTRO!*)
+ /b/ds/distro-end || return $?
+ ran_d=true
+ ;;&
+ *CONFLINK*)
+ if ! $ran_d; then
+ conflink
+ fi
+ ;;
+ esac
+ system-status _
+}
envload() { # load environment from a previous: export > file
local file=${1:-$HOME/.${USER}_env}
}
# ssh, copy my universal config over if needed.
+
+# By default .bashrc is sourced for ALL ssh commands. This is wonky.
+# Normally, this file is not sourced when a script is run, but we can
+# override that by having #!/bin/bash -l. I want the same thing for ssh
+# commands. when a local script runs an ssh command, bashrc should not be
+# sourced, unless we use a modified command.
+#
+# So, in my bashrc, test for conditions of noninteractive ssh and return
+# if so. And we don't keep the rest of the code in .bashrc, because
+# even though we return, we parse the whole file which can cause errors
+# as we develop it.
+#
+# To test for an overriding condition: bash builtin vars and env show no
+# difference in ssh vs local, except shell level which is not
+# reliable. one option is to use an environment variable. env variables
+# sent across ssh are strictly limited. We could override an obscure
+# unused LC_var, like telephone, but I don't want to run into some edge
+# case where that messes things up. I choose to set SendEnv and
+# AcceptEnv ssh config vars to allow the environment variable BRC to
+# propagate across ssh, and for hosts I don't control, I start an inner
+# shell with it set, which doubles up as a way to have a nondefault
+# bashrc.
sl() {
# inspired from https://github.com/Russell91/sshrc
- local args info_date info_t type now tmp old sshinfo
+ local args info_date info_t type now tmp tmp2 old sshinfo cmd haveinfo dorsync info_sec
declare -a args tmpa
now=$(date +%s)
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}
- # debug
- #e $(( $(stat -c%Y /b/ds/brc) - $(date -d @$info_date +%s) ))
- if (( $(stat -c%Y /b/ds/brc) > $(date -d @$info_date +%s) )); then
- old=true
+ tmp2=${tmp::11}
+ type=${tmp2: -1}
+ if [[ $type == b ]]; then
+ info_sec=${tmp::10}
+ if (( $(stat -c%Y /b/ds/brc) > info_sec || $(stat -c%Y /b/ds/.bashrc) > info_sec )); then
+ dorsync=true
+ rm -f $sshinfo
+ fi
fi
else
- tmp=$(command ssh -t "${args[@]}" "$remote" "if test -e /p/sshinfo; then echo yes; fi") || return
+ dorsync=true
+ # use this weird yes thing to ensure we know ssh succeeded
+ tmp=$(command ssh "${args[@]}" "$remote" "if test -e /a/bin/ds/.bashrc -a -L .bashrc; then echo yes; fi") || return
if [[ $tmp == yes ]]; then
type=a
else
type=b
- old=true
fi
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
+ if $dorsync; then
+ RSYNC_RSH="ssh ${args[*]}" rsync -rptL /b/ds/sl/.iank "$remote":
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 -l
+ fi
fi
}
sss() { # ssh solo
}
# plain limited ssh
ssh() {
- BASH_LOGIN_SHELL=true command ssh "$@"
+ BRC=t command ssh "$@"
}
# note, for exim daemon, you can turn on debug options by
# adding -d, etc to COMMONOPTIONS in
# /etc/default/exim4
- # exim -d -t <<'EOF'
- exim -i 'test@zroe.org, t2@zroe.org' <<'EOF'
-From: ian@iankelling.org
-To: test@zroe.org, t2@zroe.org
-Subject: Testing Exim
+ #
+ # to specify recipients other than those in to, cc, bcc, you can use the cli args, eg:
+ # exim -i 'test@zroe.org, t2@zroe.org' <<'EOF'
+ #
+ #
+ exim -d -t <<'EOF'
+From: i@dmarctest.b8.nz
+To: mailman@dev.fsf.org
+Subject: test2
+Reply-to: rtest@iankelling.org
This is a test message.
EOF