shopt -s extglob
# include .files when globbing, but ignore files name . and ..
# setting this also sets dotglob.
-# Note, this doesnt 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. dont anymore.
# still broken in wheezy
shopt -s globstar
-# inside emcas fixes
+# inside emacs fixes
if [[ $RLC_INSIDE_EMACS ]]; then
# EMACS is used by bash on startup, but we dont need it anymore.
# plus I hit a bug in a makefile which inherited it
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
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
# 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 "
+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 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
-# https://superuser.com/questions/366930/how-do-i-get-the-git-pager-to-clean-up-screen-output-after-exit
-# and reading the man
+# 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 [[ -e /a/bin/errhandle/err ]]; then
- source /a/bin/errhandle/err
- err-allow
+# 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-2.9.2
+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
# file cut copy and paste, like the text buffers :)
# I havnt tested these.
-_fbufferinit() { # internal use by
+_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
_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##+( )}"
else
pastline="$pastline $line"
fi
- done
+ done < <(grep -vE '^([ \t]*#|^[ \t]*$)' "$1")
echo "$pastline" >> "$2"
}
}
a() {
- local x=$(readlink -nf "$@")
+ 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
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
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 "$@"; }
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.
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 \) \
# 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"
cp /a/bin/data/COPYING .
fi
}
+
capache()
{
if (($#)); then
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
local host
"$@"
for host in x2 tp kd; do
- ssh $host "$@"
+ ssh $host $(printf "")
done
}
# 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
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; }
# 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 +
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
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
done
for p in ${!installed[@]}; do
if ! ${updated[$p]:-true}; then
- fdroidcl upgrade $p
+ fdroidcl install $p
sleep 5
fi
done
echo "$line" >> "$m"
msize=$((msize + 1))
fi
- done < <(find -type f )
+ done < <(find . -type f )
if $missing; then
echo "$m"
(( msize <= 100 )) && cat $m
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
if [[ -d $1 ]]; then
echo "$1"
else
- local dir="$(dirname "$1")"
+ local dir
+ dir="$(dirname "$1")"
if [[ -d $dir ]]; then
echo "$dir"
else
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
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}"
}
gh() {
# 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"
}
}
gse() {
- git send-email --notes '--envelope-sender=<ian@iankelling.org>' \
+ 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 "$@"
}
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
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
[[ $max_lines =~ ^[0-9]+$ ]] || { echo "error in hl: failed to get max line count"; return 1; }
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
# get latest hub and run it
# main command to use:
-# hub pull-request
-# on first use, you input username/pass and it gets an oath token so you dont have to repeat
+# 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
git commit -am "$*"
}
+
idea() {
/a/opt/idea-IC-163.7743.44/bin/idea.sh "$@" &r
}
}
-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
lcn() { locate -i "*$**"; }
+lg() { LC_COLLATE=C.UTF-8 ll --group-directories-first; }
+
lt() { ll -tr "$@"; }
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
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
}
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
}
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 ~
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
}
mkct() {
- mkc `mktemp -d`
+ mkc $(mktemp -d)
}
mkt() { # mkdir and touch file
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 </var/log/exim4/paniclog; sudo truncate -s0 /var/log/exim4/paniclog
}
find "${pathArray[@]}" -iname "*$1*"
}
+pkx() { # package extract
+ local pkg cached tmp f
+ c $(mktemp -d)
+ pkg=$1
+ # shellcheck disable=SC2012
+ cached=$(ls -t /var/cache/apt/archives/$pkg* | tail -n1)
+ if [[ $cached ]]; then
+ cp $cached .
+ else
+ aptitude download $pkg
+ fi
+ tmp=(*); f=${tmp[0]} # only 1 expected
+ ex $f
+ rm -f $f
+}
+
pk1() {
local pid
pid=($(pgrep -f "$*"))
case ${#pid[@]} in
1)
- ps -F $pid
- m kill $pid
+ # shellcheck disable=SC2128
+ {
+ ps -F $pid
+ m kill $pid
+ }
;;
0) echo "no pid found" ;;
*)
while name="$( echo | restore-trash | gr "$PWD/[^/]\+$" | gr "$1" )" \
&& [[ $name ]] && (( $(wc -l <<<"$name") >= 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
"$@" &> /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\) \
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
rspicy() { # usage: HOST DOMAIN
# connect to spice vm remote host. use vspicy for local host
- local port=$(ssh $1<<EOF
+ local port
+ # shellcheck disable=SC2087
+ port=$(ssh $1<<EOF
sudo virsh dumpxml $2|grep "<graphics.*type='spice'" | \
sed -rn "s/.*port='([0-9]+).*/\1/p"
EOF
echo safe_rename error: $# args, need 2 >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
}
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
}
-serstopnm() {
- ser stop NetworkManager
- ser stop dnsmasq
- s resolvconf -d NetworkManager
- ser start dnsmasq
+# 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
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
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)
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 "$@"
}
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=/ "$@"
}
args+=("$x")
fi
done
- [[ ! ${args[@]} ]] || trash-put "${args[@]}"
+ (( ! ${#args[@]} )) || trash-put "${args[@]}"
else
rm -rf "$@"
fi
tclock() {
+ local x
clear
date +%l:%_M
len=60
# 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 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
# adding -d, etc to COMMONOPTIONS in
# /etc/default/exim4
exim -d -t <<'EOF'
-From: root@gnu.org
-To: ian@iankelling.org
+From: ian@iankelling.org
+To: root@lists0p.fsf.org
Subject: Testing Exim
This is a test message.
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; }
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
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
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 "$@"
}
vm-set-listen(){
- local t=$(mktemp)
+ local t
+ t=$(mktemp)
local vm=$1
local ip=$2
s virsh dumpxml $vm | sed -r "s/(<listen.*address=')([^']+)/\1$ip/" | \
sed -r "s/.*port='([0-9]+).*/\1/")
}
+wian() {
+ cat-new-files /m/4e/INBOX/new
+}
wtr() { curl wttr.in/boston; }
-xl() {
- if pgrep gnome-screensav &>/dev/null; then
- # this command actually starts gnome-screensaver if it isn\'t running.
- # lololol, what crap
- gnome-screensaver-command --exit &>/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
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
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 didnt 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,
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
- # doesnt work if not in top level.
- if [[ -e /nocow/btrfs-stale ]] && ((`command 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 doesnt 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
else
local title_escape="\033]0;"
fi
- if [[ $* != prompt-command ]]; then
+ if [[ $0 != prompt-command ]]; then
echo -ne "$title_escape$USER@$HOSTNAME ${PWD/#$HOME/~} "
printf "%s" "$*"
echo -ne "\007"
}
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
# 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
if [[ "$SUDOD" ]]; then
cd "$SUDOD"
unset SUDOD
-elif [[ -d /a ]] && [[ $PWD == $HOME ]] && [[ $- == *i* ]]; then
+elif [[ -d /a ]] && [[ $PWD == "$HOME" ]] && [[ $- == *i* ]]; then
cd /a
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
#
-#if [[ $EUID != 0 && -e ~/.pyenv/bin ]]; then
-# export PATH="~/.pyenv/bin:$PATH"
-# eval "$(pyenv init -)"
-# eval "$(pyenv virtualenv-init -)"
-#fi
-
-# id 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 dont 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 didnt 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
+
+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 -)"
+}
+
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
+
# didnt get drush working, if I did, this seems like the
# only good thing to include for it.
# Include Drush completion.