# Copyright 2018 Mitchell Riedstra # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY # AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR # OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. # If you wish to prevent non KSH shells from running this # [ -z "$KSH_VERSION" ] && return # This will hopefully fix the bullshit with zsh if \ [ $SHELL = "/bin/zsh" ] || \ [ $SHELL = "/usr/bin/zsh" ] || \ [ $SHELL = "/usr/local/bin/zsh" ] ; then # Bash doesn't like an empty if statement apparently printf "" else precmd() { typeset e=$? (( e )) && print -n "$e|" } set_ps1() { PS1='$(set_my_title)$(precmd)${BG}${ACCENT_C}${ACCENT_P}${USER_C}${USER:=$(id -un)}@$(hostname)${ACCENT_C}${ACCENT_P} ${ACCENT_P}${PATH_C}${PWD:-?}${ACCENT_C}${ACCENT_P}${END_C} ${END_P} ' export PS1; } set_root_ps1() { PS1='$(set_my_title)$(precmd)${BG}${ACCENT_C}${ACCENT_P}${HOST_C}$(hostname)${ACCENT_C}${ACCENT_P} ${ACCENT_P}${PATH_C}${PWD:-?}${ACCENT_C}${ACCENT_P}${END_C} ${END_P} ' export PS1; } # RED: 31, GREEN: 32, YELLOW: 33, BLUE: 34, MAGENTA: 35, CYAN: 36, WHITE: 37, GREY 38. and No color which is 0. set_prompt() { if [ `id -u` -eq 0 ] ; then # Previously # Red for root, and no username # PS1="$(hostname) \$PWD echo $TERM | grep "256color$" > /dev/null 2>&1 if [ $? -eq 0 ] ; then BG="" ACCENT_C="" ACCENT_P="|" HOST_C="" PATH_C="" END_C="" set_root_ps1 END_P="#" else BG="" ACCENT_C="" ACCENT_P="|" HOST_C="" PATH_C="" END_P="#" fi set_root_ps1 else # Previously # PS1="${USER:=$(id -un)}@$(hostname) \$PWD echo $TERM | grep "256color$" > /dev/null 2>&1 if [ $? -eq 0 ] ; then BG="" ACCENT_C="" ACCENT_P="|" USER_C="" PATH_C="" END_C="" END_P="%" else BG="" ACCENT_C="" ACCENT_P="|" USER_C="" PATH_C="" END_C="" END_P="$" fi set_ps1 fi } set_basic_prompt() { PS1='$(set_my_title)$(precmd)'"${USER:=$(id -un)}@$(hostname) \$PWD $ " export PS1; } set_retro_prompt() { export PS1="$(set_my_title)\$ " if [ `id -u` -eq 0 ] ; then export PS1="$(set_my_title)# " fi } set_super_basic_prompt() { alias cd=do_cd } do_cd() { builtin cd $@ set_my_title pwd=${PWD##HOME} [ ${#pwd} -lt ${#PWD} ] && pwd="~$pwd" [ "$hostname" ] || hostname=$(hostname) PS1="$USER@$hostname:$pwd \$ " [ $(id -u) -eq 0 ] && PS1="$USER@$hostname:$pwd # " } # ZSH doesn't handle these functions all too well fi setaliases() { alias ls="ls -F"; alias l="ls -lhF"; alias ll="ls -lhF"; alias g="grep"; alias m="$PAGER"; alias j="jobs"; alias p="pwd"; alias gdb='gdb -q' alias bc='bc -q' alias eg='egrep' alias search='egrep -rniI' alias rot13="tr 'A-Za-z' 'N-ZA-Mn-za-m'" alias setxkbmap-list="man xkeyboard-config" } setcoloraliases() { if [ `uname` = "Linux" ] ; then alias ls="ls --color=auto -F"; alias lm='ls -lh --color=force | more'; elif [ `uname` = "FreeBSD" ] ; then alias ls="ls -FG"; alias lm='CLICOLOR_FORCE="1" ls -l | less -r'; fi grep --help | grep fucks - >/dev/null 2>&1 if [ $? -eq 0 ] ; then alias grep="grep --color=auto"; alias egrep='egrep --color=auto' alias search='egrep --color=auto -rnI'; fi alias diff="$(which diff colordiff 2>/dev/null | tail -n 1)"; alias t='tree -CdL' } setsudoaliases() { if which sudo > /dev/null 2>&1 && [ -x "$(which sudo)" ] ; then # Package managers # Isn't it amazing how many distros you end up using? alias apt-get='sudo apt-get' alias yum='sudo yum' alias dnf='sudo dnf' alias pacman='sudo pacman' alias xbps-install='sudo xbps-install' alias xbps-remove='sudo xbps-remove' alias pkg='sudo pkg' # Filesystem utilities alias zfs='sudo zfs' alias btrfs='sudo btrfs' alias mount='sudo mount' alias umount='sudo umount' fi } # Usage debugstarttls $ipaddr:$port debugstarttls() { openssl s_client -starttls smtp -crlf -connect $1 $2 } getpkgsrc() { cd $HOME pull -f pkg.txz -u "https://www.rygel.us/misc/pkg-$(uname).txz" tar -xJvf pkg.txz && rm pkg.txz if ! [ -e $HOME/.mkshrc.pre ] ; then printf "export PATH=\$HOME/pkg/bin:\$PATH\n" > $HOME/.mkshrc.pre fi cd - } installvis() { cd $HOME pull -u "https://www.rygel.us/misc/vis-$(uname)" -f vis-editor if [ $(id -u) -eq 0 ] ; then install -o root -m 555 vis-editor /usr/local/bin/vis-editor && \ rm vis-editor else if ! [ -d $HOME/bin ] ; then mkdir $HOME/bin fi install -m 555 vis-editor $HOME/bin/vis-editor && \ rm vis-editor fi } set_retro() { set_retro_prompt unalias vi unalias vim unalias nvim # nvim has some serious issues with konsole and cool-retro-term export EDITOR="$(which vi nvi vim 2>/dev/null | tail -n1)" export VISUAL="$EDITOR" alias vi="$EDITOR" alias nvim="$EDITOR" export TERM="$(echo $TERM | sed -e's/-256color$//')" } randmacgen() { # This seems to be needed on FreeBSD, I'll have to look into # exactly what is causing this and what the differences are LC_COLLATE=c tr -c -d '0123456789abcdef' < /dev/urandom \ | head -c 12 \ | sed 's!^M$!!;s!\-!!g;s!\.!!g;s!\(..\)!\1:!g;s!:$!!' } # Run Steam unfuck_steam() { LD_PRELOAD='/usr/$LIB/libstdc++.so.6 /usr/$LIB/libgcc_s.so.1 /usr/$LIB/libxcb.so.1 /usr/$LIB/libgpg-error.so' /usr/bin/steam } counter_figlet() { COUNTER="1"; while true ; do figlet "$COUNTER"; COUNTER="$(echo $COUNTER+1 |bc)"; sleep 1; clear; done } counter_single_line() { COUNTER="1"; while true ; do sleep 1; printf "\t$COUNTER\r"; COUNTER="$(echo $COUNTER+1 |bc )"; done } # First argument is the interface on which to scan ipv6_local_hosts() { if ! [ -z $1 ] ; then interface="$1" ping6 -c 3 ff02::2%$interface \ | grep 'bytes from' \ | awk '{print $4}' \ | sort \ | uniq \ | sed -e's/:$//' else echo "You need to specify an interface" fi } pulltermcolors() { file="$HOME/bin/terminal-colors" if ! [ -d $HOME/bin ] ; then mkdir $HOME/bin fi pull -u ${UPDATE_URL}/terminal-colors -f $file chmod +x $file } set_nocaps() { setxkbmap -option ctrl:nocaps setxkbmap -option shift:breaks_caps } pkg_switch_branch() { _f="/etc/pkg/FreeBSD.conf" cp $_f ${_f}.orig sed -e's/quarterly/latest/' < ${_f}.orig > ${_f} } find_most_recent_python() { _python="$(which python2 2>/dev/null)" $_python -c 'import os max_mtime = 0 for dirname,subdirs,files in os.walk("."): for fname in files: full_path = os.path.join(dirname, fname) mtime = os.stat(full_path).st_mtime if mtime > max_mtime: max_mtime = mtime max_dir = dirname max_file = fname print max_dir, max_file' } # System setup `chroot`, useful mainly on Linux syschroot() { CHDIR=$1 PROG=$2 CUR_PS1="$PS1" PS1="(CHROOT) # " mount -o bind /dev $CHDIR/dev mount -o bind /dev/pts $CHDIR/dev/pts mount -o bind /sys $CHDIR/sys mount -o bind /proc $CHDIR/proc if [ "$PROG" = "/bin/bash" ] ; then PS1="(CHROOT) [ \u@\h \w ] # " fi chroot $CHDIR $PROG umount $CHDIR/dev/pts $CHDIR/dev $CHDIR/sys $CHDIR/proc PS1="$CUR_PS1" } # Usage: dir_oct:file_oct path setperms() { dir_perms=$(echo $1 | awk -F: '{print $1}') file_perms=$(echo $1 | awk -F: '{print $2}') find "$2" -type f -print0 | xargs -0 chmod "$file_perms" find "$2" -type d -print0 | xargs -0 chmod "$dir_perms" } set_title() { printf $'\033]0;'"%s"$'\007' "$1" } set_my_title() { _load="Load Avg: $(_sys_load)" _free_mem="M Free: $(_sys_memory)" _uptime="Uptime: $(_sys_uptime)" set_title "$(id -un)[$(hostname)] -- $_load $_free_mem $_uptime" } _sys_memory() { [ -e $(which vmstat) ] && return if [ `uname` = "Linux" ] ; then vmstat | tail -n1 | awk '{print $4/1024}' | sed -e's/\..*$//g' elif [ `uname` = "FreeBSD" ] ; then vmstat | tail -n1 | awk '{print $5/1024}' | sed -e's/\..*$//g' elif [ `uname` = "OpenBSD" ] ; then vmstat | sed -n '$p' | awk '{print $4}' | sed 's/M$//' fi } _sys_load() { # Works on BSD too, neat. uptime | sed -re's/^.*load averages?: ([0-9]+\.[0-9]+).*$/\1/g' } _sys_uptime() { # Took awhile to figure out, but this works on BSD as well uptime | sed -re's/^.*up[ ]+//g' -e's/^([^,]*),.*/\1/g' -e's/^([^ ]+)[ ]*(.).*/\1\2/g' } timestamp() { date +%m.%d.%y_%H.%M.%S } pull() { url="" file="" while [ $# -gt 0 ] ; do case $1 in -f) file="$2" shift; shift; ;; -u) url="$2" shift; shift; ;; esac done CMD="$(which curl wget fetch 2>/dev/null | tail -n1)" case $CMD in *curl) "$CMD" "$url" > "$file" ;; *wget) "$CMD" "$url" -O "$file" ;; *fetch) "$CMD" "$url" -o "$file" ;; esac } pulldotfile() { file="$1" pull -u "${UPDATE_URL}${file}" -f "$HOME/.${file}" } pullkeys() { file="keys/$1" if ! [ -d $HOME/.ssh ] ; then mkdir $HOME/.ssh ; fi chmod 700 $HOME/.ssh chmod 600 $HOME/.ssh/authorized_keys mv "$HOME/.ssh/authorized_keys" "$HOME/.ssh/authorized_keys.$(timestamp)" || \ echo "Authorized Keys do not exist" pull -u "${UPDATE_URL}${file}" -f "$HOME/.ssh/authorized_keys" chmod 600 $HOME/.ssh/authorized_keys } pullsshconfig() { file="ssh/config" pull -u "${UPDATE_URL}${file}" -f "$HOME/.ssh/config" } updatetmuxconf() { pulldotfile "tmux.conf" pulldotfile "tmux_helper.sh" if ! [ -e $HOME/.tmux.conf.local ] && [ `id -u` -eq 0 ] ; then # If I ever change the color from green this will have to be updated I guess grep 'green' $HOME/.tmux.conf | sed -e's/green/red/g' > $HOME/.tmux.conf.local elif ! [ -e $HOME/.tmux.conf.local ] ; then touch $HOME/.tmux.conf.local fi } updategitconf() { file="gitconfig/$1" pull -u "${UPDATE_URL}${file}" -f "$HOME/.gitconfig" } updateshell() { pulldotfile "mkshrc" . $HOME/.mkshrc } updatevimrc() { OLDWD="$(pwd)" cd $HOME git clone $VIM_GIT_URL .vim if [ $? -gt 0 ] ; then cd $HOME/.vim git pull origin master else cd $HOME/.vim fi ./setup.sh && \ ./link-vimrc.sh cd $OLDWD } updatevimrc_basic() { pull -u "$VIM_BASIC_URL" -f ~/.vimrc } placebasicvimrc() { if [ -z "$1" ] ; then echo All arguments are passed to SSH, but you need at least one return fi _TMP="$(mktemp)" if [ -z "$_TMP" ] ; then echo Cannot continue, temp file cannot be zero length!; return fi pull -u "$VIM_BASIC_URL" -f "$_TMP" cat "$_TMP" | ssh "$@" "cat - > ~/.vimrc" rm "$_TMP" } setcolorterminal() { case $TERM in xterm-kitty) # Prevent xterm-kitty from being turned into xterm-256color return; ;; xterm*) export TERM=xterm-256color # printf $'\033]0;'"$(hostname)"$'\007'; ;; screen*) export TERM=screen-256color # printf $'\033k'"$(whoami)"$'\033\\'; ;; esac } setlscolors() { if [ "$(uname)" = "Linux" ] ; then export LS_COLORS='di=36;40:ln=1;31;40:so=32;40:pi=33;40:ex=1;32;40:bd=34;46:cd=34;43:su=0;41:sg=0;46:tw=0;42:ow=0;43:' elif [ "$(uname)" = "FreeBSD" ] ; then export LSCOLORS='gxBxcxdxCxegedabagacad' fi } colormanpages() { export LESS_TERMCAP_mb="" export LESS_TERMCAP_md="" export LESS_TERMCAP_me="" export LESS_TERMCAP_se="" export LESS_TERMCAP_so="" export LESS_TERMCAP_ue="" export LESS_TERMCAP_us="" ## Gentoo is nuts export GROFF_NO_SGR=1 } set_editor() { if [ -z "$EDITORS" ] ; then export EDITOR="vi" else export EDITOR="$(which $EDITORS 2>/dev/null | tail -n1)" fi export VISUAL="$EDITOR" # Set an alias for our editor of choice alias vi="$EDITOR" alias vim="$EDITOR" alias edit="$EDITOR" alias e="$EDITOR" } set_pager() { export PAGER="$(which cat more less 2>/dev/null | tail -n1)" } set_lang() { export CHARSET="$1"; export LANG="$1"; } #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% NEWLINE='$(printf "\n")' SHELL_CONFIG=".mkshrc" COLOR=0 MY_LANG="en_US.UTF-8" export EDITORS="ed vi vim " export PATH="$HOME/bin:$PATH" export GOPATH="$HOME/go" export PATH="$GOPATH/bin:$PATH" _gobin="/usr/local/go/bin" if [ -e "$_gobin" ] ; then export PATH="$_gobin:$PATH" fi UPDATE_URL="https://www.rygel.us/etc/" VIM_GIT_URL="https://git.riedstra.us/mitch/vim-cfg.git" VIM_BASIC_URL="https://git.riedstra.us/mitch/vim-cfg.git/plain/basic.vim" PRELOAD="$HOME/${SHELL_CONFIG}.pre" LOCAL="$HOME/${SHELL_CONFIG}.local" # Don't put any variables below this, as they can't be overridden before the # functions if you do that # Load pre config if [ -e $PRELOAD ] ; then . $PRELOAD fi set_pager set_editor set_lang $MY_LANG setaliases setsudoaliases # Nasty conditional for support of many different shells if [ $SHELL = "/bin/ksh" ] || [ $SHELL = "/bin/mksh" ] || [ $SHELL = "/usr/bin/mksh" ] || [ $SHELL = "/usr/local/bin/mksh" ] || ! [ -z "$KSH_VERSION" ] then export HISTFILE="$HOME/.ksh_history" set -o emacs bind ^L=clear-screen if [ $COLOR -eq 1 ] ; then set_prompt else set_basic_prompt fi elif [ $SHELL = "/bin/zsh" ] || [ $SHELL = "/usr/bin/zsh" ] || [ $SHELL = "/usr/local/bin/zsh" ] ; then set -o emacs elif [ $SHELL = "/bin/sh" ] && [ "$(uname)" = "FreeBSD" ] ; then set -o emacs export PS1="$(whoami)"'@\h:\w \$ ' else [ $SHELL = "/bin/sh" ] && set_super_basic_prompt fi if [ $COLOR -eq 1 ] ; then colormanpages setcolorterminal setcoloraliases setlscolors fi # Include local configuration options if [ -f $LOCAL ] ; then . $LOCAL fi