315 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
			
		
		
	
	
			315 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
| #!/bin/bash
 | |
| 
 | |
| # If not running interactively, don't do anything
 | |
| case $- in
 | |
|     *i*) ;;
 | |
|       *) return;;
 | |
| esac
 | |
| 
 | |
| __SCRIPT=$BASH_SOURCE
 | |
| RBASH_HOME="$HOME/.rbash"
 | |
| RBASH_SOURCES="$RBASH_HOME/sources"
 | |
| RBASH_CONFIG="$RBASH_HOME/config"
 | |
| RBASH_ENV="$RBASH_HOME/env"
 | |
| RBASH_REMOTE="https://git.k8s.astropenguin.net"
 | |
| RBASH_REPO="penguin/utils"
 | |
| RBASH_PATH="bash"
 | |
| RBASH_MERGED="$RBASH_SOURCES/merged"
 | |
| RBASH_BIN="$RBASH_HOME/bin"
 | |
| 
 | |
| RHOSTNAME="<HOSTNAME>"
 | |
| RDOMAIN="<DOMAIN>"
 | |
| RCOLOR="<RCOLOR>"
 | |
| 
 | |
| if [ "$RHOSTNAME" == "<HOSTNAME"">" ]; then
 | |
| 	RHOSTNAME="\u"
 | |
| 	RDOMAIN="@"$( hostname -s )
 | |
| 	RCOLOR=$(( $RANDOM * 6 / 32767 + 1 ))
 | |
| fi
 | |
| 
 | |
| # Source global definitions
 | |
| if [ -f /etc/bashrc ]; then
 | |
|     . /etc/bashrc
 | |
| fi
 | |
| 
 | |
| # don't put duplicate lines or lines starting with space in the history.
 | |
| # See bash(1) for more options
 | |
| HISTCONTROL=ignoreboth
 | |
| 
 | |
| # append to the history file, don't overwrite it
 | |
| shopt -s histappend
 | |
| 
 | |
| # for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
 | |
| HISTSIZE=1000
 | |
| HISTFILESIZE=2000
 | |
| 
 | |
| # check the window size after each command and, if necessary,
 | |
| # update the values of LINES and COLUMNS.
 | |
| shopt -s checkwinsize
 | |
| 
 | |
| # If set, the pattern "**" used in a pathname expansion context will
 | |
| # match all files and zero or more directories and subdirectories.
 | |
| #shopt -s globstar
 | |
| 
 | |
| # make less more friendly for non-text input files, see lesspipe(1)
 | |
| #[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)"
 | |
| 
 | |
| # set variable identifying the chroot you work in (used in the prompt below)
 | |
| if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then
 | |
|     debian_chroot=$(cat /etc/debian_chroot)
 | |
| fi
 | |
| 
 | |
| # set a fancy prompt (non-color, unless we know we "want" color)
 | |
| case "$TERM" in
 | |
|     xterm-color) color_prompt=yes;;
 | |
| esac
 | |
| 
 | |
| # Alias definitions.
 | |
| # You may want to put all your additions into a separate file like
 | |
| # ~/.bash_aliases, instead of adding them here directly.
 | |
| # See /usr/share/doc/bash-doc/examples in the bash-doc package.
 | |
| 
 | |
| if [ -f ~/.bash_aliases ]; then
 | |
|     . ~/.bash_aliases
 | |
| fi
 | |
| 
 | |
| # enable programmable completion features (you don't need to enable
 | |
| # this, if it's already enabled in /etc/bash.bashrc and /etc/profile
 | |
| # sources /etc/bash.bashrc).
 | |
| if ! shopt -oq posix; then
 | |
|   if [ -f /usr/share/bash-completion/bash_completion ]; then
 | |
|     . /usr/share/bash-completion/bash_completion
 | |
|   elif [ -f /etc/bash_completion ]; then
 | |
|     . /etc/bash_completion
 | |
|   fi
 | |
| fi
 | |
| 
 | |
| function __func_head() { echo "Usage:" ${FUNCNAME[1]} $1; }
 | |
| function __func_help() { echo "       ${FUNCNAME[1]} $1"; }
 | |
| 
 | |
| function __download {
 | |
|     which curl 2>&1 > /dev/null
 | |
|     if [ $? -eq 0 ]; then
 | |
|         curl -s "$1"
 | |
|         return $?
 | |
|     fi
 | |
| 
 | |
|     which wget 2>&1 > /dev/null
 | |
|     if [ $? -eq 0 ]; then
 | |
|         wget -qO- "$1"
 | |
|         return $?
 | |
|     fi
 | |
| }
 | |
| 
 | |
| function rbash_cache {
 | |
|     local CACHE_FILE
 | |
|     MLINK=$( echo "$1" | md5sum | cut -d' ' -f1 )
 | |
| 
 | |
|     CACHE_FILE="$RBASH_SOURCES/$MLINK"
 | |
| 
 | |
|     if [ ! -f "$CACHE_FILE" ]; then
 | |
|         __download "$1" > "$CACHE_FILE"
 | |
|     fi
 | |
| 
 | |
|     chmod 700 "$CACHE_FILE"
 | |
|     echo -n "$CACHE_FILE"
 | |
| }
 | |
| 
 | |
| _RBASH_LOADED=
 | |
| mkdir -p "$RBASH_SOURCES" "$RBASH_BIN"
 | |
| 
 | |
| if [ ! -f "$RBASH_SOURCES/merged" ]; then
 | |
| 	_RBASH_MERGE_START=1
 | |
| fi
 | |
| 
 | |
| function rbash_load {
 | |
|     local f path
 | |
| 
 | |
| 	if [ -z "$_RBASH_MERGE_START" ]; then
 | |
| 		if [ -n "$_RBASH_LOADED" ]; then
 | |
| 			return 0
 | |
| 		fi
 | |
| 
 | |
| 		if [ -f "$RBASH_MERGED" ]; then
 | |
| 			source $RBASH_MERGED
 | |
| 			if [ $? -eq 0 ]; then
 | |
| 				_RBASH_LOADED=1
 | |
| 				return 0
 | |
| 			fi
 | |
| 			rm "$RBASH_MERGED"
 | |
| 		fi
 | |
| 	fi
 | |
| 
 | |
|     echo "Load: $1"
 | |
|     f=`rbash_cache "$RBASH_REMOTE/$RBASH_REPO/raw/branch/master/$RBASH_PATH/$1"`
 | |
|     source "$f"
 | |
| 	if [ $? -eq 0 ]; then
 | |
| 		echo "echo \"Load: $1\"" >> "$RBASH_MERGED"
 | |
| 		cat "$f" >> "$RBASH_SOURCES/merged"
 | |
| 	else
 | |
| 		echo "    ..failed"
 | |
| 		echo "echo \"Skipped: $1\". Use rbash-reload to try load this again." >> "$RBASH_MERGED"
 | |
| 	fi
 | |
| 
 | |
| 	chmod 700 "$RBASH_MERGED"
 | |
| }
 | |
| 
 | |
| function rbash-reload {
 | |
| 	_RBASH_LOADED=
 | |
| 	_RBASH_MERGE_START=1
 | |
| 	rm -f "$RBASH_SOURCES/merged"
 | |
| 	source "$RBASH_CONFIG"
 | |
| 	_RBASH_MERGE_START=
 | |
| }
 | |
| 
 | |
| function rbash-upgrade {
 | |
|     echo "Updating $__SCRIPT"
 | |
| 
 | |
|     local TMPFILE _P_HOSTNAME _P_DOMAIN _P_COLOR
 | |
| 
 | |
|     TMPFILE=$( mktemp )
 | |
|     __download "$RBASH_REMOTE/$RBASH_REPO/raw/branch/master/$RBASH_PATH/rbashrc" > $TMPFILE
 | |
| 
 | |
|     if [ -n "$1" ]; then
 | |
|         RHOSTNAME=$1
 | |
|         RDOMAIN=$2
 | |
|     fi
 | |
| 
 | |
|     _P_HOSTNAME="<HOSTNAME"">"
 | |
|     _P_DOMAIN="<DOMAIN"">"
 | |
|     _P_COLOR_CODE="<RCOLOR"">"
 | |
| 
 | |
|     sed -i \
 | |
|         -e "s/$_P_HOSTNAME/$RHOSTNAME/g" \
 | |
|         -e "s/$_P_DOMAIN/$RDOMAIN/g" \
 | |
|         -e "s/$_P_COLOR_CODE/$RCOLOR/g" \
 | |
|          $TMPFILE
 | |
| 
 | |
|     mv $TMPFILE $__SCRIPT
 | |
| 
 | |
|     # Clean up the old dir
 | |
|     if [ $? -eq 0 ] && [ -d "$RBASH_SOURCES" ]; then
 | |
|         rm -r "$RBASH_SOURCES"
 | |
|     fi
 | |
| 
 | |
|     source $__SCRIPT
 | |
| }
 | |
| 
 | |
| function rbash-run {
 | |
|     local f
 | |
|     echo "Getting: $1"
 | |
| 
 | |
|     f=`rbash_cache "$RBASH_REMOTE/$RBASH_REPO/raw/branch/master/$1"`
 | |
|     shift
 | |
| 
 | |
|     "$f" "$@"
 | |
| }
 | |
| 
 | |
| function _require_jq {
 | |
|     which jq 2>&1 > /dev/null
 | |
|     if [ $? -ne 0 ]; then
 | |
|         echo This command requires jq.
 | |
|         return 1
 | |
|     fi
 | |
| }
 | |
| 
 | |
| declare -A _RBASH_DICT
 | |
| function rbash-list {
 | |
|     _require_jq || return 1
 | |
| 
 | |
|     echo "Available sources:"
 | |
| 	local _k
 | |
|     for i in `__download "$RBASH_REMOTE/api/v1/repos/$RBASH_REPO/contents/$RBASH_PATH/sources/" | jq -r '.[].name'`; do
 | |
| 		_k=`echo -n $i | grep -o "^[0-9]\+"`
 | |
| 		_RBASH_DICT["s$_k"]=$i
 | |
|         grep -q -e "^rbash_load \"sources/$i\"\$" "$RBASH_CONFIG"
 | |
|         if [ $? -eq 0 ]; then
 | |
|             echo "  * $i"
 | |
|         else
 | |
|             echo "    $i"
 | |
|         fi
 | |
|     done
 | |
| }
 | |
| 
 | |
| function r2ensource {
 | |
| 	rbash-list || return 1
 | |
| 
 | |
| 	local _id _sel _tmp _en
 | |
| 	_en=()
 | |
| 	read -p "Enter the script id XX, delimited by space: " _ids
 | |
| 	for _id in $_ids; do
 | |
| 		_sel=${_RBASH_DICT["s$_id"]}
 | |
| 		if [ -z "$_sel" ]; then
 | |
| 			echo "No such id $_id"
 | |
| 			return 1
 | |
| 		fi
 | |
| 
 | |
| 		grep -q -e "^rbash_load \"sources/$_sel\"\$" "$RBASH_CONFIG"
 | |
| 		if [ $? -eq 0 ]; then
 | |
| 			echo "\"$_sel\" is already enabled."
 | |
| 			continue
 | |
| 		fi
 | |
| 
 | |
| 		_en+=("$_sel")
 | |
| 	done
 | |
| 
 | |
| 	_tmp=$( mktemp )
 | |
| 	cp "$RBASH_CONFIG" "$_tmp"
 | |
| 	for _id in "${_en[@]}"; do
 | |
| 		echo "rbash_load \"sources/$_id\"" >> $_tmp
 | |
| 		echo "Enabling $_id"
 | |
| 	done
 | |
| 	sort $_tmp > "$RBASH_CONFIG"
 | |
| 	rm -r "$_tmp" "$RBASH_SOURCES"
 | |
| }
 | |
| 
 | |
| function r2dissource {
 | |
| 	echo "Currently enabled sources:"
 | |
| 	grep -e "^rbash_load \"sources/" "$RBASH_CONFIG" | cut -c 21- | tr -d '"' | sed "s/^/    $1/g"
 | |
| 
 | |
| 	local _id _dis _opts
 | |
| 	_dis=()
 | |
| 	read -p "Enter the script id XX, delimited by space: " _ids
 | |
| 	for _id in $_ids; do
 | |
| 		_dis+=("$( grep -e "^rbash_load \"sources/${_id}_" "$RBASH_CONFIG" )")
 | |
| 		if [ $? -ne 0 ]; then
 | |
| 			echo "No such id: $_id"
 | |
| 			return 1
 | |
| 		fi
 | |
| 	done
 | |
| 
 | |
| 	_opts=""
 | |
| 	for _id in "${_dis[@]}"; do
 | |
| 		_opts="-e \"^$( echo -n $_id | sed 's/"/\\"/g' )$\" $_opts"
 | |
| 		echo "Disabling "$( echo -n $_id | sed 's/rbash_load \"sources\/\([^"]\+\)"/\1/g' )
 | |
| 	done
 | |
| 
 | |
| 	_dis=$( mktemp )
 | |
| 	sh -c "grep -v $_opts \"$RBASH_CONFIG\"" > $_dis
 | |
| 	sort $_dis > $RBASH_CONFIG
 | |
| 	rm -r "$_dis" "$RBASH_SOURCES"
 | |
| }
 | |
| 
 | |
| export PS1="This is ${RHOSTNAME}\e[1;3${RCOLOR}m${RDOMAIN}\e[0m: \w\n\$ "
 | |
| export EDITOR=vim
 | |
| export PATH="$RBASH_BIN:$PATH"
 | |
| 
 | |
| # Source for custom bash env, allows overriding
 | |
| if [ -f "$RBASH_ENV" ]; then
 | |
|     source "$RBASH_ENV"
 | |
| fi
 | |
| 
 | |
| # Create default source config
 | |
| if [ ! -f "$RBASH_CONFIG" ]; then
 | |
|     cat <<___DEFAULT___ > "$RBASH_CONFIG"
 | |
| rbash_load "sources/10_aliases"
 | |
| rbash_load "sources/12_shortcuts"
 | |
| rbash_load "sources/20_fast-greps"
 | |
| rbash_load "sources/40_go-command"
 | |
| rbash_load "sources/41_pivot-command"
 | |
| ___DEFAULT___
 | |
|     chmod 600 "$RBASH_CONFIG"
 | |
| fi
 | |
| 
 | |
| source "$RBASH_CONFIG"
 |