source /a/bin/log-quiet/logq-function
path_add /a/exe
path_add --ifexists --end /a/opt/adt-bundle*/tools /a/opt/adt-bundle*/platform-tools
+export WCDHOME=/a
# based on readme.debian. dunno if this will break on other distros.
_x=/usr/share/wcd/wcd-include.sh
if [[ -e $_x ]]; then source $_x; fi
_khfix_common() {
local h=${1##*@}
+ local x
ssh-keygen -R $h -f $(readlink -f ~/.ssh/known_hosts)
- local x=$(timeout 0.1 ssh -v $1 |& sed -rn "s/debug1: Connecting to $h \[([^\]*)].*/\1/p");
+ if ! x=$(timeout 0.1 ssh -oBatchMode=yes -v $1 |& sed -rn "s/debug1: Connecting to $h \[([^\]*)].*/\1/p"); then
+ echo "khfix: ssh failed"
+ return 1
+ fi
ssh-keygen -R $x -f $(readlink -f ~/.ssh/known_hosts)
}
khfix() { # known hosts fix
c -
}
-bashrcpush () {
- local startdir="$PWD"
- cd ~
- for x in "$@"; do
- ssh $x mkdir -p bin/distro-functions/src
- tar cz bin/semi-private bin/distro-functions/src | ssh $x tar xz
- done
- cd $(mktemp -d)
- command cp /a/c/repos/bash/!(.git|..|.) ~/.gitconfig .
- for x in "$@"; do
- tar cz * | ssh $x tar xz
- done
- cd "$startdir"
-}
-
bkrun() {
# use -p from interactive shell
btrbk-run -p "$@"
btc() {
local f=/etc/bitcoin/bitcoin.conf
- bitcoin-cli -$(s grep rpcuser= $f) -$(s grep rpcpassword= $f) "$@"
+ # 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() {
local price
- price="$(curl -s https://blockchain.info/ticker | jq .USD.last)"
+ price="$(curl -s https://api.coinbase.com/v2/prices/BTC-USD/spot | jq -r .data.amount)"
+ printf "$%s\n" "$price"
+ if [[ $1 ]]; then
+ printf "$%.2f\n" "$(echo "scale=4; $price * $1"| bc -l)"
+ fi
+}
+usdbtc() {
+ local price
+ price="$(curl -s https://api.coinbase.com/v2/prices/BTC-USD/spot | jq -r .data.amount)"
printf "$%s\n" "$price"
if [[ $1 ]]; then
- printf "$%.2f\n" "$(echo "scale=2; $price * $1"| bc -l)"
+ # 100 mil satoshi / btc. 8 digits after the 1.
+ printf "%.8f btc\n" "$(echo "scale=10; $1 / $price "| bc -l)"
+ fi
+}
+satoshi() {
+ local price
+ price="$(curl -s https://api.coinbase.com/v2/prices/BTC-USD/spot | jq -r .data.amount)"
+ price=$(echo "scale=10; $price * 0.00000001"| bc -l)
+ printf "$%f\n" "$price"
+ if [[ $1 ]]; then
+ printf "$%.2f\n" "$(echo "scale=10; $price * $1"| bc -l)"
fi
}
+
# c. better cd
if [[ $RLC_INSIDE_EMACS ]]; then
c() { wcd -c -z 50 -o "$@"; }
caa() { git commit --amend --no-edit -a; }
+caf() {
+ find -L $1 -type f -not \( -name .svn -prune -o -name .git -prune \
+ -o -name .hg -prune -o -name .editor-backups -prune \
+ -o -name .undo-tree-history -prune \) \
+ -exec bash -lc 'hr; echo "$1"; hr; cat "$1"' _ {} \; 2>/dev/null
+
+}
+
calc() { echo "scale=3; $*" | bc -l; }
# no having to type quotes, but also no command history:
clc() {
c =
}
+chrome() {
+ CHROMIUM_FLAGS='--enable-remote-extensions' chromium &r
+}
+
d() { builtin bg; }
complete -A stopped -P '"%' -S '"' d
}
faf() { # find all files
- find $@ -type f
+ find -L $1 -type f -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
}
fastboot() { /a/opt/androidsdk/platform-tools/fastboot "$@"; }
}
hr() { # horizontal row. used to break up output
- printf "$(tput setaf 5)█$(tput sgr0)%.0s" $(seq $COLUMNS)
+ printf "$(tput setaf 5)█$(tput sgr0)%.0s" $(seq ${COLUMNS:-60})
echo
}
ifn() {
# insensitive find
find -L . -not \( -name .svn -prune -o -name .git -prune \
- -o -name .hg -prune \) -iname "*$**" 2>/dev/null
+ -o -name .hg -prune -o -name .editor-backups -prune \
+ -o -name .undo-tree-history -prune \) -iname "*$**" 2>/dev/null
}
lld() { ll -d "$@"; }
-low() { # make filenames all lowercase
- local x y
- for x in "$@"; do
- y=$(tr "[A-Z]" "[a-z]" <<<"$x")
- [[ $y != $x ]] && mv "$x" "$y"
+low() { # make filenames lowercase, remove bad chars
+ local f new
+ for f in "$@"; do
+ new="${f,,}" # downcase
+ new="${new//[^[:alnum:]._-]/_}" # sub bad chars
+ new="${new#"${new%%[[:alnum:]]*}"}" # remove leading/trailing non-alnum
+ new="${new%"${new##*[[:alnum:]]}"}"
+ # remove bad underscores, like __ and _._
+ new=$(echo $new | sed -r 's/__+/_/g;s/_+([.-])|([.-])_+/\1/g')
+ safe_rename "$f" "$new" || return 1
done
+ return 0
}
-
-
-
lower() { # make first letter of filenames lowercase.
local x
for x in "$@"; do
if [[ ${x::1} == [A-Z] ]]; then
y=$(tr "[A-Z]" "[a-z]" <<<"${x::1}")"${x:1}"
- safe_rename "$x" "$y"
+ safe_rename "$x" "$y" || return 1
fi
done
}
k() { # history search
- grep -P --binary-files=text "$@" ${HISTFILE:-~/.bash_history} | tail -n 40;
+ grep -P --binary-files=text "$@" ${HISTFILE:-~/.bash_history} | tail -n 80;
}
apg -m 12 -x 16 -t
}
+pwlong() {
+ # -M CLN = use Caps, Lowercase, Numbers
+ # -n 1 = 1 password
+ # -a 1 = use random instead of pronounceable algorithm
+ apg -m 50 -x 70 -n 1 -a 1 -M CLN
+}
+
q() { # start / launch a program in the backround and redir output to null
"$@" &> /dev/null &
}
rlu() { # [OPTS] HOST PATH
- # eg rlu -opts frodo /testpath
+ # eg. rlu -opts frodo /testpath
+ # relative paths will expanded with readlink -f.
# useful for selectively sending dirs which have been synced with unison,
# where the path is the same on both hosts.
opts=("${@:1:$#-2}") # 1 to last -2
path="${@:$#}" # last
host="${@:$#-1:1}" # last -1
- if [[ $path == .* ]]; then echo error: need absolut path; return 1; fi
+ if [[ $path == .* ]]; then
+ path=$(readlink -f $path)
+ fi
# rync here uses checksum instead of time so we don't mess with
# unison relying on time as much. g is for group, same reason
# to keep up with unison.
fi
}
-safe_rename() {
+safe_rename() { # warn and don't rename if file exists.
+ # mv -n exists, but it's silent
if [[ $# != 2 ]]; then
echo safe_rename error: $# args, need 2 >2
return 1
- elif [[ $1 != $2 ]]; then
- if [[ -e $2 ]]; then
- echo Cannot rename "$1" to "$2" as it already exists.
+ fi
+ if [[ $1 != $2 ]]; then # yes, we want to silently ignore this
+ if [[ -e $2 || -L $2 ]]; then
+ echo "Cannot rename $1 to $2 as it already exists."
else
- mv "$1" "$2"
+ mv -vi "$1" "$2"
fi
fi
}
testmail() {
declare -gi _seq; _seq+=1
- echo "test body" | m mail -s "test mail from $HOSTNAME, $_seq" "${1:-root@localhost}"
+ echo "test body" | m mail -s "test mail from $HOSTNAME, $_seq" "${@:-root@localhost}"
+ # for testing to send from an external address, you can do for example
+ # -aFrom:ian@iank.bid web-6fnbs@mail-tester.com
+ # note in exim, you can retry a deferred message
+ # s exim -M MSG_ID
+ # MSG_ID is in /var/log/exim4/mainlog, looks like 1ccdnD-0001nh-EN
+}
+
+# use -eW to actually modify mailbox
+testsievelist() {
+ sieve-filter ~/sieve/main.sieve "$@" >/a/tmp/slog 2> >(tail) && sed -rn '/^Performed actions:/{n;n;p}' /a/tmp/slog | sort -u
+}
+
+
+testsieve() {
+ sieve-filter ~/sieve/main.sieve "$@"
+}
+
+testexim() {
+ # testmail above calls sendmail, which is a link to exim/postfix.
+ # it's docs don't say a way of adding an argument
+ # to sendmail to turn on debug output. We could make a wrapper, but
+ # that is a pain. Exim debug args are documented here:
+ # http://www.exim.org/exim-html-current/doc/html/spec_html/ch-the_exim_command_line.html
+ #
+# http://www.exim.org/exim-html-current/doc/html/spec_html/ch-building_and_installing_exim.html
+# note, for exim daemon, you can turn on debug options by
+ # adding -d, etc to COMMONOPTIONS in
+ # /etc/default/exim4
+ # for testing external mail, you need the to address as final cmdline arg
+ exim -d+tls -t <<'EOF'
+From: root@frodo.lan
+To: ian@mail.iankelling.org
+Subject: Testing Exim
+
+This is a test message.
+EOF
}
tm() {
# timer in minutes
- (sleep $(calc "$@ * 60") && mpv --volume 50 /a/bin/data/alarm.mp3 --loop=no) > /dev/null 2>&1 &
+ # --no-config
+ (sleep $(calc "$@ * 60") && mpv --no-config --volume 50 /a/bin/data/alarm.mp3) > /dev/null 2>&1 &
}
m() { printf "%s\n" "$*"; "$@"; }
+
+vpncmd() {
+ m s nsenter -t $(pgrep -f "/usr/sbin/openvpn --suppress-timestamps --nobind --config /etc/openvpn/client/client.conf") -n -m "$@"
+}
+vpnf() {
+ vpncmd gksudo -u ian firefox &r
+}
vpnbash() {
- m s nsenter -t $(pgrep openvpn) -n -m bash
- # note, if we wanted to run a graphical program,
- # instead of bash, we could use
- # gksudo -u ${SUDO_USER:-$USER} "$@"
+ vpncmd bash
}