X-Git-Url: https://iankelling.org/git/?a=blobdiff_plain;f=brc;h=5df2c27211dd13c6c8acb7239a2d71ea8fdef1e7;hb=b1c29177fe76f8f2a557f7f36c987df3ef2a6cb4;hp=046edbed75a35594cde84f4cc3101bf8e9e5e7bd;hpb=b857462732e15f455e41f26e3048a390d7b399c0;p=distro-setup diff --git a/brc b/brc index 046edbe..5df2c27 100644 --- a/brc +++ b/brc @@ -18,7 +18,7 @@ set -o pipefail unalias -a # remove gnome keyring warning messages -# there is probably a more proper way, but I didn't find any easily on google +# there is probably a more proper way, but I didnt find any easily on google # now using xfce+xmonad instead of vanilla xmonad, so disabling this #unset GNOME_KEYRING_CONTROL @@ -26,11 +26,9 @@ unalias -a shopt -s extglob # include .files when globbing, but ignore files name . and .. # setting this also sets dotglob. -# Note, this doesn't work in bash 4.4 anymore, for paths with -# more than 1 directory, like a/b/.foo, since * is fixed to not match / -export GLOBIGNORE=*/.:*/.. +export GLOBIGNORE="*/.:*/.." -# broken with bash_completion package. Saw a bug for this once. Don't anymore. +# broken with bash_completion package. Saw a bug for this once. dont anymore. # still broken in wheezy # still buggered in latest stable from the web, version 2.1 # perhaps its fixed in newer git version, which fails to make for me @@ -43,7 +41,7 @@ shopt -s no_empty_cmd_completion # advanced completion # http://bash-completion.alioth.debian.org/ -# might be sourced by the system already, but I've noticed it not being sourced before +# might be sourced by the system already, but ive noticed it not being sourced before if ! type _init_completion &> /dev/null && [[ -r "/usr/share/bash-completion/bash_completion" ]]; then . /usr/share/bash-completion/bash_completion fi @@ -61,20 +59,20 @@ shopt -s cmdhist shopt -s globstar -# inside emcas fixes +# inside emacs fixes if [[ $RLC_INSIDE_EMACS ]]; then - # EMACS is used by bash on startup, but we don't need it anymore. + # EMACS is used by bash on startup, but we dont need it anymore. # plus I hit a bug in a makefile which inherited it unset EMACS export RLC_INSIDE_EMACS export PAGER=cat export MANPAGER=cat - # scp completion does not work, but this doesn't fix it. todo, figure this out + # scp completion does not work, but this doesnt fix it. todo, figure this out complete -r scp &> /dev/null # todo, remote file completion fails, figure out how to turn it off export NODE_DISABLE_COLORS=1 - # This get's rid of ugly terminal escape chars in node repl - # sometime, I'd like to have completion working in emacs shell for node + # This gets rid of ugly terminal escape chars in node repl + # sometime, Id like to have completion working in emacs shell for node # the offending chars can be found in lib/readline.js, # things that do like: # stream.write('\x1b[' + (x + 1) + 'G'); @@ -90,12 +88,25 @@ if [[ $RLC_INSIDE_EMACS ]]; then # no prompt, or else readline complete seems to be confused, based # on our column being different? node probably needs to send # different kind of escape sequence that is not ugly. Anyways, - # completion doesn't work yet even with the ugly prompt, so whatever + # completion doesnt work yet even with the ugly prompt, so whatever # export NODE_NO_READLINE=1 fi +# emacs has a different default search path than the info command. This +# adds the info defaults to emacs, but not the reverse, because I dun +# care much about the cli. The search path is only on the cli if you run +# "info xxx", or in emacs if you run '(info xxx)', so not that +# important, but might as well fix it. + +# info info says this path is what was compiled, and its not documented +# anywhere. Through source grepping, i found it in filesys.h of the info +# source in trisquel flidas. +# +# Traling : means for emacs to add its own stuff on to the end. + +export INFOPATH=$PATH:/usr/local/info:/usr/info:/usr/local/lib/info:/usr/lib/info:/usr/local/gnu/info:/usr/local/gnu/lib/info:/usr/gnu/info:/usr/gnu/lib/info:/opt/gnu/info:/usr/share/info:/usr/share/lib/info:/usr/local/share/info:/usr/local/share/lib/info:/usr/gnu/lib/emacs/info:/usr/local/gnu/lib/emacs/info:/usr/local/lib/emacs/info:/usr/local/emacs/info:.: if [[ $- == *i* ]]; then # for readline-complete.el @@ -107,12 +118,16 @@ if [[ $- == *i* ]]; then bind '"\C-i": self-insert' else + if [[ $KONSOLE_PROFILE_NAME ]]; then + TERM=xterm-256color + fi + # todo: not sure this works in sakura #stty werase undef #bind "\C-w": kill-region # sakura == xterm-256color # konsole == xterm - if [[ $TERM == "xterm" ]]; then + if [[ $TERM == xterm* ]]; then # control + arrow keys. for other terminals, see http://unix.stackexchange.com/questions/10806/how-to-change-previous-next-word-shortcut-in-bash bind '"\e[1;5C": shell-forward-word' 2>/dev/null bind '"\e[1;5D": shell-backward-word' 2>/dev/null @@ -123,7 +138,7 @@ if [[ $- == *i* ]]; then bind '"\eOc": shell-forward-word' bind '"\eOd": shell-backward-word' fi - # i can't remember why i did this, probably to free up some keys to bind + # i cant remember why i did this, probably to free up some keys to bind # to other things in bash. # other than C-c and C-z, the rest defined by stty -a are, at least in # gnome-terminal, overridden by bash, or disabled by the system @@ -147,38 +162,73 @@ HISTFILE=$HOME/.bh # the time format display when doing the history command # also, setting this makes the history file record time # of each command as seconds from the epoch -HISTTIMEFORMAT="%I:%M %p %m/%d " -# consecutive duplicate lines don't go in history +HISTTIMEFORMAT="%Y-%m-%d %I:%M %p " +# consecutive duplicate lines dont go in history HISTCONTROL=ignoredups # works in addition to HISTCONTROL to do more flexible things # it could also do the same things as HISTCONTROL and thus replace it, # but meh. dunno why, but just " *" does glob expansion, so use [ ] to avoid it. -HISTIGNORE='pass *:k *:[ ]*:lom ' +HISTIGNORE='pass *:[ ]*:otp *:oathtool *' export BC_LINE_LENGTH=0 +export PROFILE_TASKS_TASK_OUTPUT_LIMIT=100 -# note, if I use a machine I don't want files readable by all users, set +# note, if I use a machine I dont want files readable by all users, set # umask 077 # If fewer than 4 digits are entered, leading zeros are assumed -C_DEFAULT_DIR=/a - +# i for insensitive. the rest from +# X means dont remove the current screenworth of output upon exit +# R means to show colors n things +export LESS=RXi +export SYSTEMD_LESS=$LESS # * include files -for _x in /a/bin/distro-functions/src/* /a/bin/!(githtml)/*-function?(s); do - source "$_x" -done -unset _x -# so I can share my bashrc -for x in /a/bin/bash_unpublished/source-!(.#*); do source $x; done + +# generated instead of dynamic for the benefit of shellcheck +#for x in /a/bin/distro-functions/src/* /a/bin/!(githtml)/*-function?(s); do echo source $x ; done +source /a/bin/distro-functions/src/identify-distros +source /a/bin/distro-functions/src/package-manager-abstractions +source /a/bin/distro-setup/path_add-function +source /a/bin/ds/path_add-function +source /a/bin/log-quiet/logq-function +source /a/bin/small-misc-bash/ll-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 + +# shellcheck source=./path_add-function source $(dirname $(readlink -f $BASH_SOURCE))/path_add-function source /a/bin/log-quiet/logq-function +# if someone exported $SOE (stop on error), catch errors. +# +# Note, on debian this results in the following warning when in ssh, +# hich I haven't figured out how to fix. It doesn't happen if we source +# after the shell has started +# +# bash: /usr/share/bashdb/bashdb-main.inc: No such file or directory +# bash: warning: cannot start debugger; debugging mode disabled +if [[ $SOE ]]; then + if [[ -e /a/bin/errhandle/err ]]; then + source /a/bin/errhandle/err + fi +fi + path_add /a/exe +# add this with absolute paths as needed for better security +#path_add --end /path/to/node_modules/.bin + +# pip3 --user things go here: +path_add --end ~/.local/bin +path_add --ifexists --end /a/work/libremanage path_add --ifexists --end /a/opt/adt-bundle*/tools /a/opt/adt-bundle*/platform-tools +path_add --ifexists --end /a/opt/scancode-toolkit-3.0.2 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 +if [[ -s /usr/share/wcd/wcd-include.sh ]]; then + source /usr/share/wcd/wcd-include.sh +fi # * aliases @@ -218,10 +268,10 @@ unalias ls ll grep &>/dev/null ||: # file cut copy and paste, like the text buffers :) -# I havn't tested these. -_fbufferinit() { # internal use by +# I havnt tested these. +_fbufferinit() { # internal use ! [[ $my_f_tempdir ]] && my_f_tempdir=$(mktemp -d) - rm -rf "$my_f_tempdir"/* + rm -rf "${my_f_tempdir:?}"/* } fcp() { # file cp _fbufferinit @@ -245,7 +295,7 @@ complete -F _longopt la lower low rlt rld rl lld ts ll dircp ex fcp fct fpst gr _cdiff-prep() { # join options which are continued to multiples lines onto one line local first=true - grep -vE '^([ \t]*#|^[ \t]*$)' "$1" | while IFS= read -r line; do + while IFS= read -r line; do # remove leading spaces/tabs. assumes extglob if [[ $line == "[ ]*" ]]; then line="${line##+( )}" @@ -259,21 +309,28 @@ _cdiff-prep() { else pastline="$pastline $line" fi - done + done < <(grep -vE '^([ \t]*#|^[ \t]*$)' "$1") echo "$pastline" >> "$2" } _khfix_common() { - local h=${1##*@} - local x - ssh-keygen -R $h -f $(readlink -f ~/.ssh/known_hosts) - x=$(timeout 1 ssh -oBatchMode=yes -oControlMaster=no -oControlPath=/ -v $1 |& sed -rn "s/debug1: Connecting to $h \[([^\]*)].*/\1/p") - if [[ ! $x ]]; then + local host=${1##*@} + local ip port + read -r ip port < <(timeout 1 ssh -oBatchMode=yes -oControlMaster=no -oControlPath=/ -v $1 |& sed -rn "s/debug1: Connecting to $host \[([^\]*)] port ([0-9]+).*/\1 \2/p") + if [[ ! $ip ]]; then echo "khfix: ssh failed" return 1 fi - echo "khfix: removing key for $x" - ssh-keygen -R $x -f $(readlink -f ~/.ssh/known_hosts) + if [[ $port != 22 ]]; then + ip_entry="[$ip]:$port" + host_entry="[$host]:$port" + else + ip_entry=$ip + host_entry=$host + fi + ssh-keygen -R "$host_entry" -f $(readlink -f ~/.ssh/known_hosts) + echo "khfix: removing key for $ip_entry" + ssh-keygen -R "$ip_entry" -f $(readlink -f ~/.ssh/known_hosts) } khfix() { # known hosts fix _khfix_common "$@" || return 1 @@ -285,7 +342,11 @@ khcopy() { } a() { - beet "${@}" + local x + x=$(readlink -nf "${1:-$PWD}") + # yes, its kinda dumb that xclip/xsel cant do this in one invocation + echo -n "$x" | xclip -selection clipboard + echo -n "$x" | xclip } ack() { ack-grep "$@"; } @@ -298,6 +359,23 @@ anki() { fi } +ap() { + # pushd in case current directory has an ansible.cfg file + pushd /a/xans >/dev/null + ansible-playbook -v -l ${1:- $(hostname -f)} site.yml + popd >/dev/null +} +aw() { + pushd /a/work/ansible-configs >/dev/null + time ansible-playbook -v -i inventory adhoc.yml "$@" + popd >/dev/null +} +ad() { + pushd /a/bin/distro-setup/a >/dev/null + ansible-playbook site.yml + popd >/dev/null +} + astudio() { # googling android emulator libGL error: failed to load driver: r600 # lead to http://stackoverflow.com/a/36625175/14456 @@ -310,9 +388,22 @@ b() { c - } -bkrun() { - # use -p from interactive shell - btrbk-run -p "$@" +bbk() { + c / + local active=true + systemctl is-active btrbk.timer || active=false + if $active; then + ser disable btrbk.timer + fi + if systemctl is-active btrbk.service; then + $active && ser enable btrbk.timer + echo "cron btrbk is already running" + return 1 + fi + # run latest + install-my-scripts + btrbk-run "$@" + $active && ser enable btrbk.timer } bfg() { java -jar /a/opt/bfg-1.12.14.jar "$@"; } @@ -321,6 +412,22 @@ 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 +} +bpush() { + [[ $1 ]] || return 1 + c / + # run latest + install-my-scripts + switch-mail-host $HOSTNAME $1 +} + + btc() { local f=/etc/bitcoin/bitcoin.conf # importprivkey will timeout if using the default of 15 mins. @@ -367,6 +474,7 @@ fi caa() { git commit --amend --no-edit -a; } caf() { + # shellcheck disable=SC2033 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 \) \ @@ -386,6 +494,8 @@ cam() { git commit -am "$*" } +cbfstool () { /a/opt/coreboot/build/cbfstool "$@"; } + ccat () { # config cat. see a config without extra lines. grep '^\s*[^;[:space:]#]' "$@" } @@ -395,15 +505,15 @@ cdiff() { # setup for format of postfix, eg: # option = stuff[,] # [more stuff] - local pastline - local unified="$(mktemp)" - local f1="$(mktemp)" - local f2="$(mktemp)" + local pastline unified f1 f2 + unified="$(mktemp)" + f1="$(mktemp)" + f2="$(mktemp)" _cdiff-prep "$1" "$f1" _cdiff-prep "$2" "$f2" cat "$f1" "$f2" | grep -Po '^[^=]+=' | sort | uniq > "$unified" while IFS= read -r line; do - # the default bright red / blue doesn't work in emacs shell + # the default bright red / blue doesnt work in emacs shell dwdiff -cblue,red -A best -d " ," <(grep "^$line" "$f1" || echo ) <(grep "^$line" "$f2" || echo ) | colordiff done < "$unified" } @@ -416,6 +526,7 @@ cgpl() cp /a/bin/data/COPYING . fi } + capache() { if (($#)); then @@ -424,6 +535,22 @@ capache() cp /a/bin/data/LICENSE . fi } + +cat-new-files() { + local start=$SECONDS + local dir="$1" + inotifywait -m "$dir" -e create -e moved_to | + # shellcheck disable=SC2030 + while read -r filedir _ file; do + cat "$filedir$file" + hr + calc $((SECONDS - start)) / 60 + sleep 5 + done + +} + +# shellcheck disable=SC2032 chown() { # makes it so chown -R symlink affects the symlink and its target. if [[ $1 == -R ]]; then @@ -463,8 +590,8 @@ dat() { # do all tee, for more complex scripts da() { # do all local host "$@" - for host in x2 tp treetowl; do - ssh $host "$@" + for host in x2 tp kd; do + ssh $host $(printf "") done } @@ -475,7 +602,7 @@ dc() { debian_pick_mirror () { # netselect-apt finds a fast mirror. # but we need to replace the mirrors ourselves, - # because it doesn't do that. best it can do is + # because it doesnt do that. best it can do is # output a basic sources file # here we get the server it found, get the main server we use # then substitute all instances of one for the other in the sources file @@ -483,7 +610,8 @@ debian_pick_mirror () { # this is idempotent. the only way to identify debian sources is to # note the original server, so we put it in a comment so we can # identify it later. - local file=$(mktemp -d)/f # safe way to get file name without creating one + local file + file=$(mktemp -d)/f # safe way to get file name without creating one sudo netselect-apt -o "$file" || return 1 url=$(grep ^\\w $file | head -n1 | awk '{print $2}') sudo cp -f /etc/apt/sources.list /etc/apt/sources.list-original @@ -511,6 +639,12 @@ dus() { # du, sorted, default arg of e() { echo "$@"; } +# echo var. print var including escapes, etc +ev() { + printf "%qEOL\n" "${!1}" + printf "%s" "${!1}" |& hexdump -C +} + ediff() { [[ ${#@} == 2 ]] || { echo "error: ediff requires 2 arguments"; return 1; } @@ -529,9 +663,13 @@ envload() { # load environment from a previous: export > file # mail related etail() { - sudo tail -f /var/log/exim4/mainlog + tail -F /var/log/exim4/mainlog -n 200 +} +eless() { + less /var/log/exim4/mainlog } +# shellcheck disable=SC2032 f() { # cd forward c + @@ -549,7 +687,7 @@ fa() { faf() { # find all files find -L $1 -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 + -o -name .undo-tree-history -prune \) -type f 2>/dev/null } # one that comes with distros is too old for newer devices @@ -565,10 +703,6 @@ kdecd() { /usr/lib/x86_64-linux-gnu/libexec/kdeconnectd; } # fdroidcl search -i, then manually removing # automatically installed/preinstalled apps -# firefox updater. commented out, firefox depends on nonfree opengl. -# de.marmaro.krt.ffupdater -# # causes replicant to die on install and go into a boot loop -# me.ccrama.redditslide # # # my attempt at recovering from boot loop: # # in that case, boot to recovery (volume up, home button, power, let go of power after samsun logo) @@ -584,35 +718,47 @@ kdecd() { /usr/lib/x86_64-linux-gnu/libexec/kdeconnectd; } # org.quantumbadger.redreader # org.kde.kdeconnect_tp -# not broke, but won't work without gps +# not broke, but wont work without gps #com.zoffcc.applications.zanavi # not broke, but not using atm #com.nutomic.syncthingandroid -#org.fedorahosted.freeotp # # doesn\'t work on replicant #net.sourceforge.opencamera # fdroid_pkgs=( + de.marmaro.krt.ffupdater + me.ccrama.redditslide + org.fedorahosted.freeotp at.bitfire.davdroid com.alaskalinuxuser.justnotes com.artifex.mupdf.viewer.app + com.danielkim.soundrecorder com.fsck.k9 com.ghostsq.commander com.ichi2.anki com.jmstudios.redmoon com.jmstudios.chibe + org.kde.kdeconnect_tp com.notecryptpro com.termux cz.martykan.forecastie de.danoeh.antennapod + de.blinkt.openvpn + de.marmaro.krt.ffupdater + eu.siacs.conversations + free.rm.skytube.oss im.vector.alpha # riot info.papdt.blackblub me.tripsit.tripmobile net.gaast.giggity + net.minetest.minetest net.osmand.plus org.isoron.uhabits + org.linphone + org.gnu.icecat org.smssecure.smssecure org.yaaic + sh.ftp.rocketninelabs.meditationassistant.opensource ) # https://forum.xda-developers.com/android/software-hacking/wip-selinux-capable-superuser-t3216394 # for maru, @@ -623,7 +769,7 @@ fdup() { local p fdroidcl update if fdroidcl search -u | grep ^org.fdroid.fdroid; then - fdroidcl upgrade org.fdroid.fdroid + fdroidcl install org.fdroid.fdroid sleep 5 fdroidcl update fi @@ -642,7 +788,7 @@ fdup() { done for p in ${!installed[@]}; do if ! ${updated[$p]:-true}; then - fdroidcl upgrade $p + fdroidcl install $p sleep 5 fi done @@ -695,7 +841,7 @@ fsdiff () { echo "$line" >> "$m" msize=$((msize + 1)) fi - done < <(find -type f ) + done < <(find . -type f ) if $missing; then echo "$m" (( msize <= 100 )) && cat $m @@ -711,7 +857,8 @@ fsdiff-test() { echo nok > b mkdir c echo ok > c/d - local x=$(mktemp -d) + local x + x=$(mktemp -d) mkdir $x/c echo different > $x/c/d echo ok > $x/a @@ -797,7 +944,8 @@ Output the directory of PATH, or just PATH if it is a directory." if [[ -d $1 ]]; then echo "$1" else - local dir="$(dirname "$1")" + local dir + dir="$(dirname "$1")" if [[ -d $dir ]]; then echo "$dir" else @@ -809,14 +957,15 @@ Output the directory of PATH, or just PATH if it is a directory." git_empty_branch() { # start an empty git branch. carefull, it deletes untracked files. [[ $# == 1 ]] || { echo 'need a branch name!'; return 1;} - local gitroot - gitroot || return 1 # function to set gitroot - builtin cd "$gitroot" + local root + root=$(gitroot) || return 1 # function to set gitroot + builtin cd "$root" git symbolic-ref HEAD refs/heads/$1 rm .git/index git clean -fdx } +# shellcheck disable=SC2120 gitroot() { local help="Usage: gitroot [--help] Print the full path to the root of the current git repo @@ -827,7 +976,8 @@ and works in older versions of git which did not have that." echo "$help" return fi - local p=$(git rev-parse --git-dir) || { echo "error: not in a git repo" ; return 1; } + local p + p=$(git rev-parse --git-dir) || { echo "error: not in a git repo" ; return 1; } [[ $p != /* ]] && p=$PWD echo "${p%%/.git}" } @@ -837,9 +987,9 @@ gitian() { } gh() { - # i got an error, gh not found when doing a pull request, it seems like it wants itself in it's path. + # i got an error, gh not found when doing a pull request, it seems like it wants itself in it\'s path. local _oldpath="$PATH" - PATH="$PATH:~/node_modules/.bin" + PATH="$PATH:$HOME/node_modules/.bin" command gh "$@" PATH="$_oldpath" } @@ -860,7 +1010,11 @@ gpg() { } gse() { - git send-email --notes '--envelope-sender=' \ + local email=ian@iankelling.org + if readlink ~/.mu | grep fsf &>/dev/null; then + email=iank@fsf.org + fi + git send-email --notes "--envelope-sender=<$email>" \ --suppress-cc=self "$@" } @@ -868,20 +1022,22 @@ gr() { grep -iIP --color=auto "$@" } -grr() { +grr() { # grep recursive if [[ ${#@} == 1 ]]; then - grep --exclude-dir='*.emacs.d' --exclude-dir='*.git' -riIP --color=auto "$@" . + grep --exclude-dir='*.emacs.d' --exclude-dir='*.git' -RiIP --color=auto "$@" . else - grep --exclude-dir='*.emacs.d' --exclude-dir='*.git' -riIP --color=auto "$@" + grep --exclude-dir='*.emacs.d' --exclude-dir='*.git' -RiIP --color=auto "$@" fi } +rg() { + command rg -i -M 200 "$@" +} hstatus() { # do git status on published repos cd /a/bin/githtml - do_hr=false for x in *; do - cd `readlink -f $x`/.. + cd $(readlink -f $x)/.. status=$(i status -s) || pwd if [[ $status ]]; then hr @@ -894,11 +1050,11 @@ hstatus() { hl() { # history limit. Write extra history to archive file. # todo: this is not working or not used currently - local max_lines linecount tempfile prune_lines x + local max_lines linecount prune_lines x local harchive="${HISTFILE}_archive" for x in "$HISTFILE" "$harchive"; do [[ -e $x ]] || { touch "$x" && echo "notice from hl(): creating $x"; } - if [[ ! $x || ! -e $x || ! -w $x || $(stat -c "%u" "$x") != $EUID ]]; then + if [[ ! $x || ! -e $x || ! -w $x || $(stat -c "%u" "$x") != "$EUID" ]]; then echo "error in hl: history file \$x:$x no good" return 1 fi @@ -906,10 +1062,10 @@ hl() { # history limit. Write extra history to archive file. history -a # save history max_lines=$HISTFILELINES [[ $max_lines =~ ^[0-9]+$ ]] || { echo "error in hl: failed to get max line count"; return 1; } - linecount=$(wc -l < $HISTFILE) # pipe so it doesn't output a filename + linecount=$(wc -l < $HISTFILE) # pipe so it doesnt output a filename [[ $linecount =~ ^[0-9]+$ ]] || { echo "error in hl: wc failed"; return 1; } - if (($linecount > $max_lines)); then - prune_lines=$(($linecount - $max_lines)) + if ((linecount > max_lines)); then + prune_lines=$((linecount - max_lines)) head -n $prune_lines "$HISTFILE" >> "$harchive" \ && sed --follow-symlinks -ie "1,${prune_lines}d" $HISTFILE fi @@ -922,7 +1078,38 @@ hr() { # horizontal row. used to break up output hrcat() { local f; for f; do [[ -f $f ]] || continue; hr; echo "$f"; cat "$f"; done } -hub() { /nocow/t/hub-linux-amd64-2.3.0-pre10/bin/hub "$@"; } +# get latest hub and run it +# main command to use: +# hub pull-request --no-edit +# --no-edit means to use the first commit\'s message as the pull request message. +# Also, you need to use a feature branch, not master in your fork. +# On first use, you input username/pass and it gets an oath token so you dont have to repeat +# it\'s at ~/.config/hub +hub() { + local up uptar updir p + p=/github/hub/releases/ + up=https://github.com/$(curl -s https://github.com$p| grep -o $p'download/[^/]*/hub-linux-amd64[^"]*' | head -n1) + uptar=${up##*/} + updir=${uptar%.tgz} + if [[ ! -e /a/opt/$updir ]]; then + rm -rf /a/opt/hub-linux-amd64* + wget -P /a/opt $up + tar -C /a/opt -zxf /a/opt/$uptar + rm -f /a/opt/$uptar + s /a/opt/$updir/install + fi + + # save token across computers + if [[ ! -L ~/.config/hub ]]; then + if [[ -e ~/.config/hub ]]; then + mv ~/.config/hub /p/c/subdir_files/.config/ + fi + if [[ -e /p/c/subdir_files/.config/hub ]]; then + conflink + fi + fi + command hub "$@" +} i() { git "$@"; } # modified from ~/local/bin/git-completion.bash @@ -942,6 +1129,7 @@ ic() { git commit -am "$*" } + idea() { /a/opt/idea-IC-163.7743.44/bin/idea.sh "$@" &r } @@ -954,52 +1142,33 @@ ifn() { } -if [[ $OS == Windows_NT ]]; then - # cygstart wrapper - cs() { - cygstart "$@" & - } - xp() { - explorer.exe . - } - # launch - o() { - local x=(*$1*) - (( ${#x[#]} > 1 )) && { echo "warning ${#x[#]} matches found"; sleep 1; } - cygstart *$1* & - } -else - o() { - if type gvfs-open &> /dev/null ; then - gvfs-open "$@" - else - xdg-open "$@" - fi - # another alternative is run-mailcap - } -fi +o() { + if type gvfs-open &> /dev/null ; then + gvfs-open "$@" + else + xdg-open "$@" + fi + # another alternative is run-mailcap +} ipdrop() { s iptables -A INPUT -s $1 -j DROP } -net-dev-info() { - e "lspci -nnk|gr -iA2 net" - lspci -nnk|gr -iA2 net - hr - e "s lshw -C network" - hr - s lshw -C network - -} istext() { grep -Il "" "$@" &>/dev/null } +jfilter() { + grep -Evi -e "^(\S+\s+){4}(sudo|sshd|cron)\[\S*:" \ + -e "^(\S+\s+){4}systemd\[\S*: (starting|started) (btrfsmaintstop|dynamicipupdate|spamd dns bug fix cronjob|rss2email)\.*$" +} jtail() { - journalctl -n 10000 -f "$@" | grep -Evi "^(\S+\s+){4}(sudo|sshd|cron)" + journalctl -n 10000 -f "$@" | jfilter } +jr() { journalctl "$@" | jfilter | less ; } +jrf() { journalctl -f "$@" | jfilter; } kff() { # keyboardio firmware flash pushd /a/bin/distro-setup/Arduino/Model01-Firmware @@ -1018,6 +1187,8 @@ l() { lcn() { locate -i "*$**"; } +lg() { LC_COLLATE=C.UTF-8 ll --group-directories-first; } + lt() { ll -tr "$@"; } lld() { ll -d "$@"; } @@ -1025,13 +1196,16 @@ lld() { ll -d "$@"; } lom() { local l base if [[ $1 == /* ]]; then + base=${1##*/} + if mountpoint /mnt/$base; then + return 0 + fi l=$(sudo losetup -f) sudo losetup $l $1 - base=${1##*/} if ! sudo cryptsetup luksOpen $l $base; then sudo losetup -d $l return 1 - fi + fi sudo mkdir -p /mnt/$base sudo mount /dev/mapper/$base /mnt/$base sudo chown $USER:$USER /mnt/$base @@ -1039,7 +1213,7 @@ lom() { base=$1 sudo umount /mnt/$base l=$(sudo cryptsetup status /dev/mapper/$base|sed -rn 's/^\s*device:\s*(.*)/\1/p') - sudo cryptsetup luksClose /dev/mapper/$base + sudo cryptsetup luksClose /dev/mapper/$base || return 1 sudo losetup -d $l fi } @@ -1062,7 +1236,7 @@ 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}" + y=$(tr '[:upper:]' '[:lower:]' <<<"${x::1}")"${x:1}" safe_rename "$x" "$y" || return 1 fi done @@ -1084,10 +1258,11 @@ make-targets() { } mbenable() { - mb=$1 - dst=/m/4e/$1 - src=/m/md/$1 + local mb=$1 + dst=/m/4e/$mb + src=/m/md/$mb set -x + [[ -e $src ]] || { set +x; return 1; } mv -T $src $dst || { set +x; return 1; } ln -s -T $dst $src /a/exe/lnf /p/.mu ~ @@ -1095,10 +1270,11 @@ mbenable() { set +x } mbdisable() { - mb=$1 - dst=/m/md/$1 - src=/m/4e/$1 + local mb=$1 + dst=/m/md/$mb + src=/m/4e/$mb set -x + [[ -e $src ]] || { set +x; return 1; } if [[ -L $dst ]]; then rm $dst; fi mv -T $src $dst set +x @@ -1116,18 +1292,47 @@ mkc() { c "$1" } +mkct() { + mkc $(mktemp -d) +} + mkt() { # mkdir and touch file local path="$1" mkdir -p "$(dirname "$path")" touch "$path" } +# shellcheck disable=SC2032 mkdir() { command mkdir -p "$@"; } mo() { xset dpms force off; } # monitor off +net-dev-info() { + e "lspci -nnk|gr -iA2 net" + lspci -nnk|gr -iA2 net + hr + e "s lshw -C network" + hr + s lshw -C network + +} + +nk() { + ser stop NetworkManager + ser stop dnsmasq + s resolvconf -d NetworkManager + ser start dnsmasq + s ifup br0 +} +ngo() { + s ifdown br0 + ser start NetworkManager + sleep 4 + s nmtui-connect +} nopanic() { + # shellcheck disable=SC2024 sudo tee -a /var/log/exim4/paniclog-archive = nth )); do name="$(echo "$name" | head -n $nth | tail -n 1 )" - read -p "$name [Y/n] " ask + read -r -p "$name [Y/n] " ask if [[ ! $ask || $ask == [Yy] ]]; then x=$( echo "$name" | gr -o "^\s*[0-9]*" ) echo $x | restore-trash > /dev/null @@ -1195,6 +1419,7 @@ pub() { } pubip() { curl -4s https://icanhazip.com; } +pubip6() { curl -6s https://icanhazip.com; } whatismyip() { pubip; } pumpa() { @@ -1202,14 +1427,14 @@ pumpa() { # packages catches up on some changes in future (this is written in # 4/2017) # - # geekosaur: so you'll want to upgrade to xmonad 0.13 or else use a - # locally modified XMonad.Hooks.ManageDocks that doesn't set the - # work area; turns out it's impossible to set correctly if you are + # geekosaur: so youll want to upgrade to xmonad 0.13 or else use a + # locally modified XMonad.Hooks.ManageDocks that doesnt set the + # work area; turns out it\'s impossible to set correctly if you are # not a fully EWMH compliant desktop environment # # geekosaur: chrome shows one failure mode, qt/kde another, other # gtk apps a third, ... I came up with a setting that works for me - # locally but apparently doesn't work for others, so we joined the + # locally but apparently doesnt work for others, so we joined the # other tiling window managers in giving up on setting it at all # xprop -root -remove _NET_WORKAREA @@ -1222,6 +1447,10 @@ pwgen() { # -x = max length # -t = print pronunciation apg -m 14 -x 17 -t + for (( i=0; i<10; i++ )); do + shuf -n3 /usr/share/hunspell/en_US.dic | sed 's,/.*,,' | paste -sd . - + + done } pwlong() { @@ -1236,13 +1465,33 @@ q() { # start / launch a program in the backround and redir output to null "$@" &> /dev/null & } +# shellcheck disable=SC2120 r() { - exit "$@" 2>/dev/null + history -a # save history + exit ${1:0} + # i had this redir, not sure why + # exit "$@" 2>/dev/null } rbpipe() { rbt post -o --diff-filename=- "$@"; } rbp() { rbt post -o "$@"; } +rebr() { + s ifdown br0 + s ifup br0 +} + +resolvcat() { + local f + f=/etc/resolv.conf + echo $f:; ccat $f + hr; echo dnsmasq is $(systemctl is-active dnsmasq) + f=/var/run/dnsmasq/resolv.conf + hr; echo $f:; ccat $f + f=/etc/dnsmasq-servers.conf + hr; echo $f:; ccat $f +} + rl() { # rsync, root is required to keep permissions right. # rsync --archive --human-readable --verbose --itemize-changes --checksum \(-ahvic\) \ @@ -1251,7 +1500,7 @@ rl() { rsync -ahvic --delete "$@" } rld() { - # like rlu, but don't delete files on the target end which + # like rlu, but dont delete files on the target end which # do not exist on the original end. rsync -ahvic "$@" } @@ -1265,15 +1514,13 @@ rlt() { rlu() { # [OPTS] HOST PATH # 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 + path="${*:$#}" # last + host="${*:$#-1:1}" # last -1 if [[ $path == .* ]]; then path=$(readlink -f $path) fi - # rync here uses checksum instead of time so we don't mess with + # rync here uses checksum instead of time so we dont mess with # unison relying on time as much. g is for group, same reason # to keep up with unison. s rsync -rlpchviog --relative "${opts[@]}" "$path" "root@$host:/"; @@ -1284,7 +1531,7 @@ r2eadd() { # usage: name url # initial setup of rss2email: # r2e new r2e@iankelling.org # that initializes files, and sets default email. - # symlink to the config doesn't work, so I copied it to /p/c + # symlink to the config doesnt work, so I copied it to /p/c # and then use cli option to specify explicit path. # Only option changed from default config is to set # force-from = True @@ -1294,14 +1541,16 @@ r2eadd() { # usage: name url # address, which makes me be a spammer. r2e add $1 "$2" $1@r2e.iankelling.org - # get up to date and don't send old entries now: + # get up to date and dont send old entries now: r2e run --no-send $1 } r2e() { command r2e -d /p/c/rss2email.json -c /p/c/rss2email.cfg "$@"; } rspicy() { # usage: HOST DOMAIN # connect to spice vm remote host. use vspicy for local host - local port=$(ssh $1<2 return 1 fi - if [[ $1 != $2 ]]; then # yes, we want to silently ignore this + 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 @@ -1366,13 +1615,20 @@ scssl() { } ser() { - local s; [[ $EUID != 0 ]] && s=sudo + local s; [[ $EUID != 0 ]] && s=s if type -p systemctl &>/dev/null; then $s systemctl $1 $2 else $s service $2 $1 fi } +# like restart, but do nothing if its not already started +srestart() { + local service=$1 + if [[ $(s systemctl --no-pager show -p ActiveState $service ) == ActiveState=active ]]; then + systemctl restart $service + fi +} setini() { # set a value in a .ini style file key="$1" value="$2" section="$3" file="$4" @@ -1404,17 +1660,23 @@ sgo() { # service go fi } +sgu() { + systemctl list-unit-files | rg "$@" +} -shellck() { - # 2086 = unquoted $var - # 2046 = unquoted $(cmd) +sk() { + # 2086: unquoted $var + # 2046: unquoted $(cmd) + # 2068: Double quote array expansions to avoid re-splitting elements. + # 2119: Functions with optional args get bad warnings when none are passed. + # 2033: too many false positives for thing that will never work, passing shell function to find. # i had -x as an arg, but debian testing(stretch) doesn\'t support it - shellcheck -e 2086,2046,2068,2006,2119 "$@" + shellcheck -x -e 2086,2046,2068,2119,2033 "$@" + # had this before. not sure what it is 2119 } skaraoke() { local tmp out - in="$1" out=${2:-${1%.*}.sh} tmp=$(mktemp -d) script -t -c "mpv --no-config --no-resume-playback --no-terminal --no-audio-display '$1'" $tmp/typescript 2>$tmp/timing @@ -1462,7 +1724,7 @@ slog() { t ) do_stamp=true ;; esac done - shift $(($OPTIND - 1)) + shift $((OPTIND - 1)) arg_base+=$1 [[ -e $logdir ]] || mkdir -p $logdir $do_stamp && arg_base+=$(date +%F.%T%z) @@ -1474,6 +1736,10 @@ splay() { # script replay scriptreplay "$1.t" "$1.s" } +smeld() { # ssh meld usage host1 host2 file + meld <(ssh $1 cat $3) <(ssh $2 cat $3) +} + spd() { PATH=/usr/local/spdhackfix:$PATH command spd "$@" } @@ -1498,9 +1764,12 @@ srm () { srun() { scp $2 $1:/tmp - ssh $1 /tmp/${2##*/} "${@:2}" + ssh $1 /tmp/${2##*/} $(printf "%q\n" "${@:2}") } +ssh() { + BASH_LOGIN_SHELL=true command ssh "$@" +} sss() { # ssh solo ssh -oControlMaster=no -oControlPath=/ "$@" } @@ -1526,13 +1795,13 @@ t() { local x local -a args if type -t trash-put >/dev/null; then - # skip args that don't exist, or else trash-put will have an error + # skip args that dont exist, or else trash-put will have an error for x in "$@"; do if [[ -e $x || -L $x ]]; then args+=("$x") fi done - [[ ! ${args[@]} ]] || trash-put "${args[@]}" + (( ! ${#args[@]} )) || trash-put "${args[@]}" else rm -rf "$@" fi @@ -1540,6 +1809,7 @@ t() { tclock() { + local x clear date +%l:%_M len=60 @@ -1594,31 +1864,32 @@ testmail() { # MSG_ID is in /var/log/exim4/mainlog, looks like 1ccdnD-0001nh-EN } -# to test sieve, use below command. for fsf mail, see fsf-get-mail script. +# to test sieve, use below command. for fsf mail, see offlineimap-sync script # make modifications, then copy to live file, use -eW to actually modify mailbox -# cp /p/c/subdir_files/sieve/personal{test,}.sieve; testsievelist -eW INBOX # # Another option is to use sieve-test SCRIPT MAIL_FILE. note, -# sieve-test doesn't know about envelopes, I'm not sure if sieve-filter does. +# sieve-test doesnt know about envelopes, Im not sure if sieve-filter does. # sieve with output filter. arg is mailbox, like INBOX. # This depends on dovecot conf, notably mail_location in /etc/dovecot/conf.d/10-mail.conf -testsievelist() { - sieve-filter ~/sieve/maintest.sieve "$@" >/tmp/testsieve.log 2> >(tail) && sed -rn '/^Performed actions:/{n;n;p}' /tmp/testsieve.log | sort -u +_dosieve() { + sieve-filter "$@" 2> >(head; tail) >/tmp/testsieve.log && sed -rn '/^Performed actions:/,/^[^ ]/{/^ /p}' /tmp/testsieve.log | sort | uniq -c } - -# mail related -# plain sieve +# always run this first, edit the test files, then run the following testsieve() { - sieve-filter ~/sieve/main.sieve "$@" + _dosieve ~/sieve/maintest.sieve ${1:-INBOX} delete +} +runsieve() { + c ~/sieve; cp personal{test,}.sieve; cp lists{test,}.sieve; cp personalend{test,}.sieve + _dosieve ~/sieve/main.sieve -eW ${1:-INBOX} delete } # mail related testexim() { # testmail above calls sendmail, which is a link to exim/postfix. - # it's docs don't say a way of adding an argument + # its docs dont 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 @@ -1627,28 +1898,36 @@ testexim() { # 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 + exim -d -t <<'EOF' +From: ian@iankelling.org +To: root@lists0p.fsf.org Subject: Testing Exim This is a test message. EOF } +# toggle keyboard +tk() { + # based on + # https://askubuntu.com/questions/160945/is-there-a-way-to-disable-a-laptops-internal-keyboard + id=$(xinput --list --id-only 'AT Translated Set 2 keyboard') + if xinput list | grep -F '∼ AT Translated Set 2 keyboard' &>/dev/null; then + echo enabling keyboard + # find the first slave keyboard number, they are all the same in my output. + # if they werent, worst case we would need to save the slave number somewhere + # when it got disabled. + slave=$(xinput list | sed -n 's/.*slave \+keyboard (\([0-9]*\)).*/\1/p' | head -n1) + xinput reattach $id $slave + else + xinput float $id + fi +} + tm() { # timer in minutes # --no-config - (sleep $(calc "$@ * 60") && mpv --no-config --volume 50 /a/bin/data/alarm.mp3) > /dev/null 2>&1 & -} - -tpx2() { - case $HOSTNAME in - tp) target=x2 ;; - x2) target=tp ;; - esac - btrbk-run -t $target -pv && switch-mail-host $HOSTNAME $target + (sleep $(calc "$* * 60") && mpv --no-config --volume 50 /a/bin/data/alarm.mp3) > /dev/null 2>&1 & } trg() { transmission-remote-gtk&r; } @@ -1660,19 +1939,30 @@ trc() { tu() { - local s; - local dir="$(dirname "$1")" + local s dir + dir="$(dirname "$1")" if [[ -e $1 && ! -w $1 || ! -w $(dirname "$1") ]]; then s=s; fi $s teeu "$@" } -tx() { # toggle set -x, and the prompt so it doesn't spam +tx() { # toggle set -x, and the prompt so it doesnt spam if [[ $- == *x* ]]; then set +x PROMPT_COMMAND=prompt-command + # disabled due to issue on stretch, running ll we get error. something + # about the DEBUG trap is broken + # if [[ $TERM == *(screen*|xterm*|rxvt*) ]]; then + # trap 'settitle "$BASH_COMMAND"' DEBUG + # fi else + # normally, i would just execute these commands in the function. + # however, DEBUG is not inherited, so we need to run it outside a function. + # And we want to run set -x afterwards to avoid spam, so we cram everything + # in here, and then it will run after this function is done. + #PROMPT_COMMAND='trap DEBUG; unset PROMPT_COMMAND; PS1="\w \$ "; set -x' + unset PROMPT_COMMAND PS1="\w \$ " set -x @@ -1686,7 +1976,7 @@ psnetns() { netns=$1 ps -w | head -n 1 s find -L /proc/[1-9]*/task/*/ns/net -samefile /run/netns/$netns | cut -d/ -f5 | \ - while read l; do + while read -r l; do x=$(ps -w --no-headers -p $l); if [[ $x ]]; then echo "$x"; else echo $l; fi; done @@ -1694,7 +1984,6 @@ psnetns() { m() { printf "%s\n" "$*"; "$@"; } - vpncmd() { #m s nsenter -t $(pgrep -f "/usr/sbin/openvpn .* --config /etc/openvpn/.*pia.conf") -n -m "$@" m s nsenter -t $(pgrep -f "/usr/sbin/openvpn .* --config /etc/openvpn/.*client.conf") -n -m "$@" @@ -1716,7 +2005,8 @@ virshrm() { } vm-set-listen(){ - local t=$(mktemp) + local t + t=$(mktemp) local vm=$1 local ip=$2 s virsh dumpxml $vm | sed -r "s/(/dev/null - fi - mate-screensaver-command --exit &>/dev/null - if ! pidof xscreensaver; then - pushd / - xscreensaver & - popd - # 1 was not long enough - sleep 3 - fi - xscreensaver-command -activate -} +xevkb() { xev -event keyboard; } # * misc stuff @@ -1845,44 +2123,18 @@ match_lhs="" if ${use_color} && [[ $- == *i* ]]; then - if [[ $XTERM_VERSION == Cygwin* ]]; then - get_term_color() { - for x in "$@"; do - case $x in - underl) echo -n $'\E[4m' ;; - bold) echo -n $'\E[1m' ;; - red) echo -n $'\E[31m' ;; - green) echo -n $'\E[32m' ;; - blue) echo -n $'\E[34m' ;; - cyan) echo -n $'\E[36m' ;; - yellow) echo -n $'\E[33m' ;; - purple) echo -n $'\E[35m' ;; - nocolor) echo -n $'\E(B\E[m' ;; - esac - done - } + term_bold="$(tput bold)" + term_red="$(tput setaf 1)" + term_green="$(tput setaf 2)" + term_yellow="$(tput setaf 3)" + term_purple="$(tput setaf 5)" + term_nocolor="$(tput sgr0)" # no font attributes + + # unused so far. commented for shellcheck + # term_underl="$(tput smul)" + # term_blue="$(tput setaf 4)" + # term_cyan="$(tput setaf 6)" - else - get_term_color() { - for x in "$@"; do - case $x in - underl) echo -n $(tput smul) ;; - bold) echo -n $(tput bold) ;; - red) echo -n $(tput setaf 1) ;; - green) echo -n $(tput setaf 2) ;; - blue) echo -n $(tput setaf 4) ;; - cyan) echo -n $(tput setaf 6) ;; - yellow) echo -n $(tput setaf 3) ;; - purple) echo -n $(tput setaf 5) ;; - nocolor) echo -n $(tput sgr0) ;; # no font attributes - esac - done - } - fi -else - get_term_color() { - : - } fi # Try to keep environment pollution down, EPA loves us. unset safe_term match_lhs use_color @@ -1893,21 +2145,6 @@ unset safe_term match_lhs use_color if [[ $- == *i* ]]; then - # git branch/status prompt function - if [[ $OS != Windows_NT ]]; then - GIT_PS1_SHOWDIRTYSTATE=true - fi - # arch source lopip show -fcation - [[ -r /usr/share/git/git-prompt.sh ]] && source /usr/share/git/git-prompt.sh - # fedora/debian source - [[ -r /usr/share/git-core/contrib/completion/git-prompt.sh ]] && source /usr/share/git-core/contrib/completion/git-prompt.sh - - # in case we didn't source git-prompt.sh - if ! declare -f __git_ps1 > /dev/null; then - __git_ps1() { - : - } - fi # this needs to come before next ps1 stuff # this stuff needs bash 4, feb 2009, @@ -1921,47 +2158,43 @@ if [[ $- == *i* ]]; then bind -m vi-command W:shell-forward-word fi - if [[ $SSH_CLIENT ]]; then + if [[ $SSH_CLIENT || $SUDO_USER ]]; then PS1="\h $PS1" fi - - - + # emacs terminal has problems if this runs slowly, + # so I've thrown a bunch of things at the wall to speed it up. prompt-command() { local return=$? # this MUST COME FIRST - local psc pst ps_char ps_color stale_subvol + local ps_char ps_color unset IFS history -a # save history - - case $return in - 0) ps_color="$(get_term_color blue)" + 0) ps_color="$term_purple" ps_char='\$' ;; - 1) ps_color="$(get_term_color green)" + 1) ps_color="$term_green" ps_char="$return \\$" ;; - *) ps_color="$(get_term_color yellow)" + *) ps_color="$term_yellow" ps_char="$return \\$" ;; esac if [[ ! -O . ]]; then # not owner if [[ -w . ]]; then # writable - ps_color="$(get_term_color bold red)" + ps_color="$term_bold$term_red" else - ps_color="$(get_term_color bold green)" + ps_color="$term_bold$term_green" fi fi - # I would set nullglob, but bash has had bugs where that - # doesn't work if not in top level. - if [[ -e /nocow/btrfs-stale ]] && ((`ls -AUq /nocow/btrfs-stale|wc -l`)); then - ps_char="! $ps_char" + + # faster than sourceing the file im guessing + eval $(< /dev/shm/iank-status) + if [[ ! $SSH_CLIENT && $MAIL_HOST != "$HOSTNAME" ]]; then + ps_char="@ $ps_char" fi - PS1="${PS1%"${PS1#*[wW]}"} \[$ps_color\]$ps_char\[$(get_term_color nocolor)\] " - # emacs completion doesn't like the git prompt atm, so disabling it. - #PS1="${PS1%"${PS1#*[wW]}"}$(__git_ps1 ' (%s)') \[$ps_color\]$ps_char\[$(get_term_color nocolor)\] " + PS1="${PS1%"${PS1#*[wW]}"} \[$ps_color\]$ps_char\[$term_nocolor\] " } PROMPT_COMMAND=prompt-command @@ -1971,18 +2204,22 @@ if [[ $- == *i* ]]; then else local title_escape="\033]0;" fi - if [[ $* != prompt-command ]]; then - echo -ne "$title_escape$USER@$HOSTNAME ${PWD/#$HOME/~}"; printf "%s" "$*"; echo -ne "\007" + if [[ $0 != prompt-command ]]; then + echo -ne "$title_escape$USER@$HOSTNAME ${PWD/#$HOME/~} " + printf "%s" "$*" + echo -ne "\007" fi } - # for titlebar - # condition from the screen man page i think - if [[ $TERM == *(screen*|xterm*|rxvt*) ]]; then - trap 'settitle "$BASH_COMMAND"' DEBUG - else - trap DEBUG - fi + # for titlebar. + # condition from the screen man page i think. + # note: duplicated in tx() + # disabled. see note in tx + # if [[ $TERM == *(screen*|xterm*|rxvt*) ]]; then + # trap 'settitle "$BASH_COMMAND"' DEBUG + # else + # trap DEBUG + # fi fi @@ -1996,7 +2233,8 @@ reset-konsole() { } reset-sakura() { - while read k v; do + while -r read k v; do + # shellcheck disable=SC2154 setini $k $v sakura /a/c/subdir_files/.config/sakura/sakura.conf done <<'EOF' colorset1_back rgb(33,37,39 @@ -2014,12 +2252,14 @@ reset-xscreensaver() { # xscreensaver-command -demo # then finding the corresponding option in .xscreensaver # spash, i happened to notice in .xscreensaver + # + # dpmsOff, monitor doesnt come back on using old free software supported nvidia card cat > /home/iank/.xscreensaver <<'EOF' mode: blank dpmsEnabled: True dpmsStandby: 0:02:00 -dpmsSuspend: 0:02:00 -dpmsOff: 0:03:00 +dpmsSuspend: 0:03:00 +dpmsOff: 0:00:00 timeout: 0:02:00 lock: True lockTimeout: 0:03:00 @@ -2033,7 +2273,7 @@ EOF if [[ "$SUDOD" ]]; then cd "$SUDOD" unset SUDOD -elif [[ -d /a ]] && [[ $PWD == $HOME ]] && [[ $- == *i* ]]; then +elif [[ -d /a ]] && [[ $PWD == "$HOME" ]] && [[ $- == *i* ]]; then cd /a fi @@ -2042,42 +2282,49 @@ fi unset IFS -# if someone exported $SOE, catch errors -if [[ $SOE ]]; then - errcatch -fi +# for mitmproxy to get a newer python. +# commented until i want to use it because it +# noticably slows bash startup +# + +mypyenvinit () { + if [[ $EUID == 0 || ! -e ~/.pyenv/bin ]]; then + echo "error: dont be root. make sure pyenv is installed" + return 1 + fi + export PATH="$HOME/.pyenv/bin:$PATH" + eval "$(pyenv init -)" + eval "$(pyenv virtualenv-init -)" +} -# I'd prefer to have system-wide, plus user ruby, due to bug in it -# https://github.com/rubygems/rubygems/pull/1002 -# further problems: installing multi-user ruby and user ruby, -# you don't get multi-user ruby when you sudo to root, unless its sudo -i. -# There a third hybrid form, which passenger error suggested I use, -# but it didn't actually work. - -# in cased I never need this -# rvm for non-interactive shell: modified from https://rvm.io/rvm/basics -#if [[ $(type -t rvm) == file && ! $(type -t ruby) ]]; then -# source $(rvm 1.9.3 do rvm env --path) -#fi - -# based on warning from rvmsudo -export rvmsudo_secure_path=1 - -if [[ -s "/usr/local/rvm/scripts/rvm" ]]; then - source "/usr/local/rvm/scripts/rvm" -elif [[ -s $HOME/.rvm/scripts/rvm ]]; then - source $HOME/.rvm/scripts/rvm -fi export GOPATH=$HOME/go path_add $GOPATH/bin +path_add /usr/local/go/bin -export ARDUINO_PATH=/a/opt/Arduino/build/linux/work +# I have the git repo and a release. either one should work. +# I have both because I was trying to solve an issue that +# turned out to be unrelated. +# ARDUINO_PATH=/a/opt/Arduino/build/linux/work +export ARDUINO_PATH=/a/opt/arduino-1.8.9 +# They want to be added to the start, but i think +# that should be avoided unless we really need it. path_add --end ~/.npm-global +path_add --end $HOME/.cargo/bin + +# taken from default changes to bashrc and bash_profile +path_add --end $HOME/.rvm/bin + +# shellcheck disable=SC1090 +[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm" # Load RVM into a shell session *as a function* + +export BASEFILE_DIR=/a/bin/fai-basefiles + +export ANDROID_HOME=/opt/android -# didn't get drush working, if I did, this seems like the +# didnt get drush working, if I did, this seems like the # only good thing to include for it. # Include Drush completion. # if [ -f "/home/ian/.drush/drush.complete.sh" ] ; then